
  :root{
    --bg:#EAEEE1; --surface:#FAFAF4; --ink:#1C2620; --ink-dim:#57614E; --ink-faint:#8B917E;
    --line:#D2D6C1; --moss:#2E4A34; --moss-soft:#436B4C; --gold:#C97F1E; --gold-soft:#E3A94C;
    /* Tracking Sheet status tones (Step 168) */
    --ts-green:#2F8150; --ts-amber:#D4930F; --ts-purple:#7A5AA8; --ts-red:#BF3A2B;
    --clay:#A94A30; --clay-soft:#C97A5E; --chip-bg:#F0EFE2;
    /* Total Revenue chart (2026-09-17) -- Hadley: colors "more like
       this screenshot" (a blue Budget, green Actual/Expected) for
       that chart specifically, to read as a different chart from the
       maroon/gold Landscaping one above it. Reuses --moss/--moss-soft
       for Actual/Expected rather than adding a second green token;
       --budget-blue is new, sampled to sit in the same muted/desaturated
       register as the rest of this palette rather than a bright,
       clashing blue. */
    --budget-blue:#2E5C8A; --budget-blue-soft:#6C93B8;
    /* LP Install entry outline colors (Step 141) -- yellow/orange dashed
       outlines Hadley can put on any schedule entry. Tuned darker than a
       pure yellow so a 1px dashed line still reads on the light bg. */
    --hl-yellow:#C9A000; --hl-orange:#E0650B;
    /* Gray darkened (Step 143 -- Hadley: "the gray needs to be quite a
       bit darker to show up well"): was #7E8573, too close to the line
       color to read as a deliberate outline on the tan tiles. Dark mode
       goes the other way (lighter) for the same reason. */
    --hl-gray:#4A5043;
    /* Step 180: Revenue Tracker line colors (validated categorical slots 1-4) */
    --rt-s1:#2a78d6; --rt-s2:#eb6834; --rt-s3:#1baf7a; --rt-s4:#eda100;
    --shadow: 0 1px 2px rgba(28,38,32,0.06), 0 8px 24px -12px rgba(28,38,32,0.18);
    /* Sampled directly from the logo mark's own outline/shovel shade
       (#183405) -- legible on the light bg above, but that same dark
       green nearly disappears against the near-black dark-mode bg
       below, so dark mode swaps in the logo's brightest frond green
       (#62c706) instead -- still "a shade of the logo," just the one
       that actually has contrast there. */
    --title-green:#183405;
  }
  @media (prefers-color-scheme: dark){
    :root{
      --bg:#131A15; --surface:#1B241C; --ink:#EDEFE5; --ink-dim:#AAB39C; --ink-faint:#727A67;
      --line:#31402F; --moss:#7CA986; --moss-soft:#5C8B69; --gold:#E3A94C; --gold-soft:#C9862F;
      --ts-green:#6DBE8C; --ts-amber:#E8B74E; --ts-purple:#B59BDD; --ts-red:#E07A6C;
      --clay:#D9846A; --clay-soft:#B25B41; --chip-bg:#212C22;
      --shadow: 0 1px 2px rgba(0,0,0,0.3), 0 10px 28px -14px rgba(0,0,0,0.6);
      --title-green:#62C706;
      --budget-blue:#6FA3D8; --budget-blue-soft:#4A7CA8;
      --hl-yellow:#E6C84A; --hl-orange:#F08A3C; --hl-gray:#C3CAB8;
      --rt-s1:#3987e5; --rt-s2:#d95926; --rt-s3:#199e70; --rt-s4:#c98500;
    }
  }
  *{box-sizing:border-box;}
  /* Backstop for narrow screens: if anything still refuses to shrink
     (a long unbreakable value, a fixed-width chart) this keeps that
     one element's overflow from widening the whole page and carrying
     everything else off the right edge with it -- worst case that one
     spot clips instead. The two known-tight spots (the goal/signed and
     leads bar charts, and the gross-margin service-category rows) get
     their own explicit overflow-x:auto/flex-wrap handling above so
     nothing should actually hit this, but it's here as a floor.
     ONE of these, not both (2026-09-21, Step 108): html's overflow-x:
     hidden alone is already enough of a backstop -- body used to
     ALSO set overflow-x:hidden, redundantly, and that combination
     (both html and body having a non-'visible' overflow at the same
     time) turned out to silently break position:sticky for EVERY
     sticky element on the page, not just the new Cash Flow header this
     step adds: whichever of the two the browser doesn't treat as the
     real viewport scroller becomes body's own separate, non-scrolling
     "scroll container" (it never actually needs to scroll internally,
     since its height already fits its content) -- and CSS sticky
     positioning computes relative to the NEAREST such container, so a
     sticky descendant of a container that itself never scrolls just
     tracks that container 1:1 and never visibly detaches. Confirmed via
     a series of minimal Playwright repros varying which of html/body
     carried the rule: either ALONE works fine (sticky correctly clamps
     at top:0 and stays there); BOTH together breaks it completely (a
     sticky element just moves in exact lockstep with scroll, forever).
     Dropping the duplicate from body (keeping it on html) removes the
     one that was actually redundant, and fixes sticky positioning
     page-wide with no loss of the narrow-screen backstop itself. */
  html{ overflow-x:hidden; }
  body{ margin:0; background:var(--bg); color:var(--ink); font-family:'Source Sans 3', system-ui, sans-serif; padding:0 20px 64px; max-width:100vw; }
  /* 2026-09-17, Step 78 (Hadley: "the live dashboard design across the
     board of filling the width of the screen is better... fill the
     screen better") -- this 1180px cap centered the ENTIRE page (every
     tab, not just one) in a fixed-width column, wasting the rest of
     any screen wider than about 1220px. The live dashboard's own
     #homePage/#sectionPage carry no width cap at all, just fixed side
     padding (Index.html) -- content there genuinely fills the window.
     Matching that here: no cap, just body's own existing 20px side
     padding. Every EXISTING responsive breakpoint below (.split-shell
     at 760px, .grid/.kpis at 860px/460px, etc.) triggers off actual
     viewport width via its own @media query, not off .wrap's old
     max-width, so narrow-window compression is unaffected by this --
     it was never what those breakpoints depended on. */
  .wrap{ margin:0 auto; }
  /* 2026-09-17, Step 79 (Hadley: "change all the bold display font to
     be something less bold and narrow and tall") -- 'Big Shoulders
     Display' is a condensed, elongated display cut by design (that's
     the whole "Display" in its name); swapped for 'Plus Jakarta Sans',
     a normal-width, normal-proportioned sans that isn't a condensed
     display face at all, and dropped the weight from 700 to 600 and
     removed the positive letter-spacing that was there to open up
     Big Shoulders' tight condensed letterforms (unneeded on a normal-
     width font, so it would have just looked loose instead). Governs
     every card header/section title/name heading in the dashboard
     (Labor, Customers, Garden Center detail panels -- Sales/Sales
     Goals/Operations use their own separate inline "eyebrow" header
     style already, not h1/h2, so they were never affected either way)
     -- the masthead's own <h1> keeps its separate Cormorant Garamond
     override, untouched, same as before. */
  h1,h2{ font-family:'Plus Jakarta Sans', system-ui, sans-serif; font-weight:600; margin:0; color:var(--ink); }
  .masthead{ padding:36px 0 20px; border-bottom:1px solid var(--line); margin-bottom:18px; }
  /* Title lockup: logo + divider + label, matching the live
     dashboard's own "Schönheit Gardens" header treatment (same font/
     color/logo, pulled directly from that page -- see database-plan.md
     Steps 59-60). The "Live"/fetched-time status line that used to sit
     above this as its own row now sits below it instead, smaller, no
     badge -- see .title-meta. */
  .title-lockup{ display:flex; align-items:center; gap:14px; }
  .title-logo{ width:48px; height:48px; object-fit:contain; border-radius:50%; flex-shrink:0; }
  .title-divider{ width:1px; height:32px; background:var(--line); flex-shrink:0; }
  .masthead h1{ font-family:'Cormorant Garamond', serif; font-size:clamp(28px,4vw,38px); font-weight:400; letter-spacing:0.2px; color:var(--title-green); }
  .title-meta{ font-size:12px; color:var(--ink-faint); font-family:'IBM Plex Mono', monospace; margin-top:8px; }
  .masthead p{ max-width:640px; color:var(--ink-dim); font-size:15px; line-height:1.55; margin-top:10px; }

  .tabnav{ display:flex; gap:6px; flex-wrap:wrap; margin-bottom:22px; }
  .tabbtn{ font-family:'IBM Plex Mono', monospace; font-size:12.5px; font-weight:600; letter-spacing:0.03em;
    color:var(--ink-dim); background:var(--surface); border:1px solid var(--line); border-radius:20px;
    padding:8px 16px; cursor:pointer; transition:background 0.12s,color 0.12s,border-color 0.12s; }
  .tabbtn:hover{ border-color:var(--moss-soft); color:var(--ink); }
  .tabbtn.active{ background:var(--moss); border-color:var(--moss); color:#F5F7EE; }
  @media (prefers-color-scheme: dark){ .tabbtn.active{ color:#131A15; } }

  .subtabnav{ display:flex; gap:6px; margin-bottom:16px; }
  .subtabbtn{ font-family:'IBM Plex Mono', monospace; font-size:11.5px; font-weight:600; letter-spacing:0.03em;
    color:var(--ink-dim); background:var(--surface); border:1px solid var(--line); border-radius:16px;
    padding:6px 14px; cursor:pointer; transition:background 0.12s,color 0.12s,border-color 0.12s; }
  .subtabbtn:hover{ border-color:var(--moss-soft); color:var(--ink); }
  .subtabbtn.active{ background:var(--moss); border-color:var(--moss); color:#F5F7EE; }
  @media (prefers-color-scheme: dark){ .subtabbtn.active{ color:#131A15; } }

  .subtabnav{ display:flex; gap:6px; flex-wrap:wrap; margin:10px 0 14px; }
  .subtabbtn{ font-family:'IBM Plex Mono', monospace; font-size:11.5px; font-weight:600; letter-spacing:0.03em;
    color:var(--ink-dim); background:var(--chip-bg); border:1px solid var(--line); border-radius:16px;
    padding:5px 12px; cursor:pointer; transition:background 0.12s,color 0.12s,border-color 0.12s; }
  .subtabbtn:hover{ border-color:var(--moss-soft); color:var(--ink); }
  .subtabbtn.active{ background:var(--moss); border-color:var(--moss); color:#F5F7EE; }
  @media (prefers-color-scheme: dark){ .subtabbtn.active{ color:#131A15; } }

  .kpis{ display:grid; grid-template-columns:repeat(4,1fr); gap:14px; margin-bottom:22px; }
  .kpis.kpis-2{ grid-template-columns:repeat(2,1fr); max-width:480px; }
  .kpi{ background:var(--surface); border:1px solid var(--line); border-radius:10px; padding:18px 20px; box-shadow:var(--shadow); }
  /* 2026-09-17, Step 77 (Hadley: "the font in the boxes of the garden
     center and customers tab is wrong. It should look like the boxes
     in the operations tab") -- .kpi-label/.kpi-value are the shared
     classes behind every KPI tile that ISN'T hand-styled inline
     (Labor, Customers, Garden Center); Sales, Sales Goals, and
     Operations were restyled to a plain-body-font, 22px/700 inline
     convention back on 2026-09-15 (see renderOperationsTab's own
     history comment) but these shared classes were never brought in
     line with that -- they'd kept 'Big Shoulders Display' at 30px, the
     one styling inconsistency left in the whole KPI-tile system.
     Values now match that convention exactly (no font-family override
     -- inherits body's Source Sans 3, same as every other tab's KPI
     numbers; 22px, not 30px); label sizing/weight/letter-spacing
     brought in line too for a precise match, not just an
     approximation. */
  .kpi-label{ font-size:11px; color:var(--ink-faint); text-transform:uppercase; letter-spacing:0.5px; font-weight:700; }
  .kpi-value{ font-size:22px; font-weight:700; margin-top:6px; font-variant-numeric:tabular-nums; }
  .kpi-sub{ font-size:12px; color:var(--ink-dim); margin-top:4px; font-family:'IBM Plex Mono',monospace; min-height:1.2em; }
  .kpi-sub.up{ color:var(--moss-soft); } .kpi-sub.down{ color:var(--clay); }
  .grid{ display:grid; grid-template-columns:1.4fr 1fr; gap:14px; margin-bottom:14px; }
  .grid-even{ display:grid; grid-template-columns:1fr 1fr; gap:14px; margin-bottom:14px; }
  .card{ background:var(--surface); border:1px solid var(--line); border-radius:10px; padding:20px 22px 22px; box-shadow:var(--shadow); }
  .card h2{ font-size:18px; margin-bottom:2px; }
  .card .card-sub{ font-size:12px; color:var(--ink-faint); margin-bottom:14px; font-family:'IBM Plex Mono',monospace; }
  /* LP Install (Step 128, 2026-09-23) -- .lp-shell is a flex row, NOT a
     position:fixed overlay: Hadley's own spec is that opening the left
     menu "shouldn't compress the main weekly schedule so you can see
     both side by side" -- .lp-main-col's min-width guarantees the week
     grid never shrinks to make room for a side panel; if both panels
     are open on a narrow window there isn't room for everyone at full
     size, so .lp-shell scrolls horizontally instead (same "own explicit
     overflow-x:auto" pattern as the tight spots noted near the top of
     this stylesheet), rather than ever compressing the schedule. */
  /* Independent scrolling (2026-09-23, Step 134 -- Hadley: "make the
     left and right menus scroll independently of the central scheduling
     block... you can't see the main scheduling block when you're viewing
     many of the tickets in the left menu"). The shell is one viewport-
     tall box and each of its three columns is its own vertical scroller,
     so scrolling a long Unassigned Tickets list never moves the schedule
     (and vice versa). Deliberately NOT done with position:sticky side
     panels: .lp-shell needs overflow-x:auto (see above -- never compress
     the schedule, scroll sideways instead), and that makes it a scroll
     container, which silently breaks sticky for anything inside it --
     the same trap Step 108 documents for the Cash Flow header. Per-
     column scrollers sidestep that entirely and keep the horizontal
     scroll. lpRenderShell_ saves and restores every column's scroll
     position around each re-render, since innerHTML replacement would
     otherwise snap all three back to the top on every click. The 100vh
     height below is only a fallback -- lpFitShellHeight_ sets the real
     height so the shell runs exactly from where it starts (under the
     masthead and tabs) to the bottom of the window: nothing is cut off
     below the fold, and there's no second, page-level scroll needed to
     reach the bottom of any column. Re-fit on resize and whenever the
     tab is shown (it can't be measured while hidden). */
  body.shell-tab{ padding-bottom:12px; }
  /* Step 330: Resources tab */
  .res-form{ display:flex; flex-wrap:wrap; gap:8px 10px; align-items:flex-end; }
  .res-form label{ display:flex; flex-direction:column; gap:3px; font-size:10.5px; font-weight:700; letter-spacing:0.5px; text-transform:uppercase; color:var(--ink-faint); }
  .res-form input, .res-form textarea{ font:inherit; font-size:13px; font-weight:400; letter-spacing:0; text-transform:none; padding:6px 8px; border:1px solid var(--line); border-radius:6px; background:var(--surface); color:var(--ink); max-width:100%; }
  .res-cat{ font-size:11px; font-weight:700; letter-spacing:0.6px; text-transform:uppercase; color:var(--ink-faint); margin:18px 0 8px; }
  .res-grid{ display:grid; grid-template-columns:repeat(auto-fill, minmax(280px, 1fr)); gap:12px; }
  .res-card{ display:flex; flex-direction:column; gap:6px; padding:14px 16px; border:1px solid var(--line); border-radius:10px; background:var(--surface); box-shadow:var(--shadow); min-width:0; }
  .res-title{ font-weight:700; font-size:14px; color:var(--ink); text-decoration:none; overflow-wrap:anywhere; }
  a.res-title:hover, a.res-title:focus-visible{ color:var(--moss); text-decoration:underline; }
  .res-kind{ align-self:flex-start; font-size:10.5px; font-weight:700; padding:1px 8px; border-radius:999px; border:1px solid var(--line); color:var(--ink-dim); }
  .res-desc{ font-size:12.5px; color:var(--ink-dim); line-height:1.45; overflow-wrap:anywhere; }
  .res-acts{ display:flex; gap:6px; margin-top:auto; padding-top:4px; }
  /* Step 301: the Estimator frame (height set by lpFitShellHeight_) */
  .est-shell{ height:80vh; }   /* Step 303: no frame border -- the page uses the dashboard look */
  .est-frame{ display:block; width:100%; height:100%; border:0; }  /* Step 166 -- see lpFitShellHeight_ */
  .lp-shell{ display:flex; align-items:flex-start; gap:16px; overflow-x:auto; overflow-y:hidden; height:calc(100vh - 32px); min-height:420px; padding-bottom:4px; }
  .lp-side-panel{ flex:0 0 320px; width:320px; max-height:100%; overflow-y:auto; background:var(--surface); border:1px solid var(--line); border-radius:10px; padding:16px; box-shadow:var(--shadow); }
  .lp-main-col{ flex:1 1 auto; min-width:700px; height:100%; overflow-y:auto; padding:0 6px 2px 2px; }
  /* Side-panel form controls must be able to shrink (2026-09-23, Step
     139 -- Hadley: the left menu's Assign button and the right menu's
     Field Manager / Ticket Status / Notes fields were overflowing their
     cards). Inputs and selects have an intrinsic minimum width (an
     <input> defaults to ~20 characters wide; a <select> to its longest
     option -- which Step 136's "Earlier weeks (May 4-Sep 11)..." option
     made longer), and flex/grid items won't shrink below that unless
     told to. Step 134 also made each panel its own scroller, so its
     vertical scrollbar now takes ~15px of the 320px panel. Together that
     pushed things past the edge. Letting every control shrink to its
     container, panel-wide, fixes the whole class of problem rather than
     one field at a time. */
  .lp-side-panel input, .lp-side-panel select, .lp-side-panel textarea, .lp-side-panel button{ min-width:0; max-width:100%; }
  .lp-week-card{ background:var(--surface); border:1px solid var(--line); border-radius:10px; margin-bottom:10px; overflow:hidden; box-shadow:var(--shadow); }
  .lp-week-header:hover{ background:var(--chip-bg); }
  /* Click-to-edit values in a week header (Available, Employees Out) --
     a faint dashed underline says "editable" at rest; hover makes it a
     clear target. See lpStartInlineEdit_. */
  .lp-inline-edit{ cursor:text; border-bottom:1px dashed var(--line); border-radius:3px; padding:0 3px; margin:0 -3px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .lp-inline-edit:hover{ background:var(--surface); border-bottom-color:var(--ink-faint); }
  .lp-week-body.drag-over{ background:rgba(46,74,52,0.08); outline:2px dashed var(--moss-soft); outline-offset:-4px; }
  .lp-ticket-card.dragging{ opacity:0.35; }
  /* Step 153: where a dragged ticket will land -- zero-height, so nothing shifts; line centered in the 5px gap between tiles */
  .lp-drop-indicator{ position:relative; height:0; pointer-events:none; }
  .lp-drop-indicator::before{ content:''; position:absolute; left:-4px; right:-4px; top:-4px; border-top:3px dashed var(--moss-soft); }
  /* A run of consecutive collapsed weeks collapses further into ONE
     thin bar ("Hidden Jan 5-May 29") instead of N individual collapsed
     headers -- Hadley: still a lot of scrolling to get to the current
     week even with each week collapsed. Click the bar to reveal a
     From/To picker (defaulting to the whole run) and unhide just that
     span. */
  .lp-hidden-range-bar{ margin-bottom:6px; }
  .lp-hidden-range-header{ border:1px dashed var(--line); border-radius:8px; }
  .lp-hidden-range-header:hover{ background:var(--chip-bg); }
  .barlist{ display:flex; flex-direction:column; gap:10px; min-height:24px; }
  .barrow{ display:grid; grid-template-columns:148px 1fr 92px; align-items:center; gap:10px; }
  .barrow .rlabel{ font-size:12.5px; color:var(--ink-dim); font-weight:600; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .bartrack{ height:14px; background:var(--chip-bg); border-radius:3px; overflow:hidden; }
  .barfill{ height:100%; border-radius:3px; background:linear-gradient(90deg,var(--moss-soft),var(--moss)); }
  .barfill.gold{ background:linear-gradient(90deg,var(--gold-soft),var(--gold)); }
  .barfill.clay{ background:linear-gradient(90deg,var(--clay-soft),var(--clay)); }
  .barrow .rval{ font-size:12.5px; text-align:right; font-family:'IBM Plex Mono',monospace; }
  .barrow .rval .dim{ color:var(--ink-faint); font-size:11px; display:block; }
  svg text{ font-family:'IBM Plex Mono', monospace; fill:var(--ink-faint); }
  svg .axis-line{ stroke:var(--line); stroke-width:1; }
  .chart-legend{ display:flex; gap:16px; margin-top:10px; font-size:12px; color:var(--ink-dim); }
  .chart-legend span{ display:inline-flex; align-items:center; gap:6px; }
  .swatch{ width:10px; height:10px; border-radius:2px; display:inline-block; }
  .tablewrap{ overflow-x:auto; }
  table{ width:100%; border-collapse:collapse; font-size:13px; }
  /* 2026-09-21, Step 108 -- Hadley: "can the header row with the week
     date float down in the window so that you know what week you're
     editing?" This is NOT a plain `thead th{position:sticky;top:0}`
     inside .tablewrap -- a first attempt at exactly that measured (via
     Playwright, comparing the header's boundingClientRect to the
     table's own on real page scroll) that it never actually floats: it
     stays glued to the top of its own table forever. The cause is a
     well-known CSS interaction -- .tablewrap's `overflow-x:auto` forces
     its computed `overflow-y` to `auto` too (confirmed via
     getComputedStyle), which makes .tablewrap itself a "scroll
     container." position:sticky computes its stuck position relative to
     the NEAREST such ancestor, and since .tablewrap has no constrained
     height (it never scrolls internally -- its scrollHeight always
     equals its clientHeight, nothing to scroll), there's no room for a
     sticky child to ever detach from its normal flow position within
     it. The fix: the header lives in a SEPARATE small table, OUTSIDE
     .tablewrap entirely (a plain sibling div with no overflow set), so
     its nearest actual scroll container becomes <body> -- which, despite
     the same overflow-x:hidden-forces-overflow-y:auto quirk, IS the
     real page scrollport, so sticky relative to it is exactly "float in
     the window." That header table still needs to track its body
     table's horizontal scroll position (so columns stay aligned) without
     a user-draggable scrollbar of its own -- .cf-sticky-head-scroll uses
     overflow:hidden (not auto) and a JS-driven scrollLeft instead,
     mirrored by the same listeners Step 107 already added to keep the
     three tables' horizontal scroll position in sync with each other
     (see the end of renderAcctCashFlowSub). */
  .cf-sticky-head-outer{ position:sticky; top:var(--cf-freeze-h, 0px); z-index:2; background:var(--surface); }
  /* Step 323 (Hadley: more visual separation on the Cash Flow tab).
     Last week's column faded, this week's column stands out, the four
     Cash Flow Projections rows each get a faded color, and Cash on Hand
     stays frozen at the top of the window once its own row scrolls away
     (.cf-freeze, positioned by cfFreezeUpdate_; while it shows, every
     table's sticky date header sits just under it via --cf-freeze-h). */
  #cf-root .cf-col-prev{ opacity:0.5; }
  #cf-root .cf-col-cur{ font-weight:600; box-shadow:inset 2px 0 0 color-mix(in srgb, var(--moss-soft) 65%, transparent), inset -2px 0 0 color-mix(in srgb, var(--moss-soft) 65%, transparent); }
  #cf-root th.cf-col-cur{ background:color-mix(in srgb, var(--moss) 16%, var(--surface)) !important; color:var(--ink); }
  .cf-week-tag{ font-size:9px; font-weight:700; letter-spacing:0.5px; text-transform:uppercase; color:var(--ink-faint); }
  #cf-root th.cf-col-cur .cf-week-tag{ color:var(--moss); }
  .cf-sum-starting_balance{ --cf-row:var(--ts-green); }
  .cf-sum-payments{ --cf-row:var(--ts-red); }
  .cf-sum-ar_cash{ --cf-row:var(--budget-blue); }
  .cf-sum-cash_on_hand{ --cf-row:var(--ts-green); }
  .cf-sum-row td{ background-color:color-mix(in srgb, var(--cf-row) 9%, transparent); }
  .cf-sum-row td:first-child{ box-shadow:inset 3px 0 0 var(--cf-row); }
  /* Step 325 (Hadley: the row names "a little darker so it's more
     visible"): every row name on the Cash Flow tab that was the faintest
     gray is one step darker. Bold names (Cash on Hand, Total) are already
     full strength; a name still goes full strength on hover. */
  #cf-root td:first-child[style*="color:var(--ink-faint)"]{ color:var(--ink-dim) !important; }
  /* Step 327 (Hadley: "when it scrolls over to the right ... freezes the
     first column ... so we can see the labels always"). Every Cash Flow
     table's first column (and the frozen Cash on Hand bar's) stays put
     while the weeks scroll sideways under it. It needs a solid
     background so the weeks don't show through, a thin line on its right
     edge, and the same tints as before, made solid. */
  #cf-root td:first-child, #cf-root th:first-child{ position:sticky; left:0; z-index:1; background-color:var(--surface); box-shadow:inset -1px 0 0 var(--line); }
  #cf-root .cf-sum-row td:first-child{ background-color:color-mix(in srgb, var(--cf-row) 9%, var(--surface)); box-shadow:inset 3px 0 0 var(--cf-row), inset -1px 0 0 var(--line); }
  #cf-root tr.cf-sec-head td:first-child[style*="rgba(199,146,58"]{ background:color-mix(in srgb, #c7923a 14%, var(--surface)) !important; }
  #cf-root tr.cf-sec-head:hover td:first-child, #cf-root tr.cf-sec-head:focus-visible td:first-child,
  #cf-root td.cf-payment-row-label:hover{ color:var(--ink) !important; }
  .cf-freeze{ position:fixed; top:0; z-index:5; display:none; box-sizing:border-box; padding:0 29px; background:var(--surface); border-bottom:1px solid var(--line); box-shadow:var(--shadow); }
  .cf-freeze.on{ display:block; }
  .cf-freeze table{ margin:0; }
  .cf-freeze tr td{ border-bottom:none; }
  .cf-sticky-head-scroll{ overflow:hidden; }
  /* Step 177 (2026-09-24, Hadley): Labor's Hourly Employees title,
     filters and column headers stay at the top of the window while the
     list scrolls. Same technique as Step 108 above: the column headers
     are a separate table OUTSIDE .tablewrap (whose overflow-x would
     otherwise trap sticky), given the body table's measured column
     widths and kept in step with its horizontal scroll. */
  .labor-sticky{ position:sticky; top:0; z-index:3; background:var(--surface); padding-top:12px; }
  /* Step 245: Labor tab performance charts (renderLaborPerf_). Chart
     colors validated with the data-viz palette checks against this
     surface, light and dark: over/under estimate is a blue / orange
     pair (reads apart for color-blind readers too, and the side of the
     100% line says the same thing) -- Step 246: revenue per hour uses the
     same pair, above / below the company average; payroll stacks worked (green),
     PERS / HOL (blue) and overtime (amber) in that order. */
  :root{ --lpf-under:#3F74B0; --lpf-over:#C4602F; --lpf-rev:#3F74B0;
         --lpf-worked:#3A8A55; --lpf-leave:#3F74B0; --lpf-ot:#C4860A; }
  @media (prefers-color-scheme: dark){
    :root{ --lpf-under:#5A8ED0; --lpf-over:#D0694C; --lpf-rev:#5A8ED0;
           --lpf-worked:#3C9660; --lpf-leave:#5A8ED0; --lpf-ot:#C4851A; }
  }
  .lpf-card .labor-titlebar{ align-items:flex-start; }
  .lpf-btn{ font-family:inherit; font-size:12px; font-weight:600; padding:5px 11px; border-radius:6px; border:1px solid var(--line); background:var(--surface); color:var(--ink-dim); cursor:pointer; }
  .lpf-btn:hover{ background:var(--chip-bg); }
  .lpf-kpis{ display:grid; grid-template-columns:repeat(auto-fit, minmax(170px, 1fr)); gap:10px; margin:6px 0 18px; }
  .lpf-kpi{ border:1px solid var(--line); border-radius:8px; padding:10px 13px; }
  .lpf-kpi-l{ font-size:10.5px; font-weight:700; letter-spacing:0.5px; text-transform:uppercase; color:var(--ink-faint); }
  .lpf-kpi-v{ font-size:22px; font-weight:700; margin-top:3px; color:var(--ink); }
  .lpf-kpi.hero .lpf-kpi-v{ font-size:30px; }
  .lpf-kpi-s{ font-size:11.5px; color:var(--ink-dim); margin-top:2px; }
  .lpf-layout{ display:grid; grid-template-columns:minmax(0, 1fr) minmax(250px, 330px); gap:18px 30px; align-items:start; }
  @media (max-width:980px){ .lpf-layout{ grid-template-columns:1fr; } }
  .lpf-legend{ display:flex; flex-wrap:wrap; gap:6px 18px; font-size:12px; color:var(--ink-dim); margin-bottom:6px; align-items:center; }
  .lpf-sw{ display:inline-block; width:12px; height:12px; border-radius:3px; margin-right:6px; vertical-align:-1px; }
  .lpf-line{ display:inline-block; width:14px; height:0; border-top:2px solid var(--ink); margin-right:6px; vertical-align:3px; }
  .lpf-muted{ color:var(--ink-faint); font-size:12px; }
  .lpf-cls{ display:flex; justify-content:space-between; font-size:10.5px; font-weight:700; letter-spacing:0.6px; text-transform:uppercase; color:var(--ink-faint);
            margin:12px 0 2px; padding-bottom:3px; border-bottom:1px solid var(--line); }
  .lpf-cls span:last-child{ font-family:'IBM Plex Mono',monospace; letter-spacing:0; }
  .lpf-row{ display:grid; grid-template-columns:minmax(118px, 220px) minmax(0, 1fr) 58px; gap:2px 12px; align-items:center; padding:4px 2px; border-radius:5px; outline:none; }
  .lpf-row:not(.lpf-axis):hover, .lpf-row:focus-visible{ background:var(--chip-bg); }
  .lpf-name{ font-size:12.5px; font-weight:600; color:var(--ink-dim); line-height:1.25; min-width:0; overflow-wrap:anywhere; }
  .lpf-name small{ display:block; font-weight:400; font-size:11px; color:var(--ink-faint); font-family:'IBM Plex Mono',monospace; }
  .lpf-val{ font-family:'IBM Plex Mono',monospace; font-size:12.5px; text-align:right; color:var(--ink); }
  .lpf-track{ position:relative; height:24px; }
  .lpf-grid{ position:absolute; top:-5px; bottom:-5px; width:1px; background:var(--line); }
  .lpf-grid.base{ background:var(--ink-faint); }
  .lpf-avg{ position:absolute; top:-6px; bottom:-6px; width:0; border-left:2px solid var(--ink); z-index:2; }
  .lpf-dbar{ position:absolute; z-index:1; }
  .lpf-dbar.under{ background:var(--lpf-under); border-radius:0 4px 4px 0; }
  .lpf-dbar.over{ background:var(--lpf-over); border-radius:4px 0 0 4px; }
  .lpf-dbar.rev{ background:var(--lpf-rev); }
  .lpf-dbar.clip-r::after{ content:'›'; position:absolute; right:-10px; top:50%; transform:translateY(-55%); font-weight:700; color:var(--ink-dim); }
  .lpf-dbar.clip-l::after{ content:'‹'; position:absolute; left:-10px; top:50%; transform:translateY(-55%); font-weight:700; color:var(--ink-dim); }
  .lpf-thick{ display:inline-flex; align-items:center; gap:4px; margin-right:6px; vertical-align:middle; }
  .lpf-thick i{ display:inline-block; width:12px; background:var(--ink-faint); border-radius:0 2px 2px 0; }
  .lpf-axis{ padding-top:8px; }
  .lpf-axis-track{ height:12px; }
  .lpf-axis-track span{ position:absolute; transform:translateX(-50%); font-size:10.5px; color:var(--ink-faint); font-family:'IBM Plex Mono',monospace; white-space:nowrap; }
  .lpf-idle{ margin-top:12px; font-size:12px; color:var(--ink-faint); line-height:1.45; }
  .lpf-idle strong{ color:var(--ink-dim); font-weight:600; }
  .lpf-side{ border-left:1px solid var(--line); padding-left:22px; }
  @media (max-width:980px){ .lpf-side{ border-left:0; padding-left:0; border-top:1px solid var(--line); padding-top:14px; } }
  .lpf-side-t{ font-size:12px; font-weight:700; color:var(--ink); margin-bottom:8px; }
  .lpf-list{ margin-bottom:16px; }
  .lpf-list-t{ font-size:10.5px; font-weight:700; letter-spacing:0.6px; text-transform:uppercase; color:var(--ink-faint); margin-bottom:6px; }
  .lpf-item{ padding:5px 6px; border-radius:6px; outline:none; cursor:pointer; }
  .lpf-item[hidden]{ display:none; }
  .lpf-list-open{ display:block; width:100%; text-align:left; background:none; border:0; padding:0; cursor:pointer; font-family:inherit; }
  .lpf-list-open:hover .lpf-list-count, .lpf-list-open:focus-visible .lpf-list-count{ color:var(--ink); text-decoration:underline; }
  .lpf-list-count{ text-transform:none; letter-spacing:0; font-weight:600; color:var(--ink-dim); }
  .cf-modal.lpf-modal{ width:940px; }
  .lpf-modal-head{ display:flex; justify-content:space-between; align-items:flex-start; gap:12px; }
  .lpf-mtable td, .lpf-mtable th{ font-size:12.5px; padding:5px 7px; white-space:nowrap; }
  .lpf-mtable td:nth-child(2), .lpf-mtable td:nth-child(3){ white-space:normal; }
  .lpf-mtable{ width:100%; }
  .lpf-m-v{ display:flex; align-items:center; justify-content:flex-end; gap:8px; }
  .lpf-m-track{ display:inline-block; width:56px; height:6px; background:var(--chip-bg); border-radius:3px; }
  .lpf-m-track i{ display:block; height:6px; border-radius:3px; }
  @media (max-width:600px){
    .lpf-mtable th:nth-child(4), .lpf-mtable td:nth-child(4), .lpf-mtable th:nth-child(5), .lpf-mtable td:nth-child(5),
    .lpf-mtable th:nth-child(6), .lpf-mtable td:nth-child(6), .lpf-mtable th:nth-child(7), .lpf-mtable td:nth-child(7), .lpf-m-track{ display:none; }
    .lpf-mtable td, .lpf-mtable th{ padding:5px 4px; }
  }
  .lpf-item:hover, .lpf-item:focus-visible{ background:var(--chip-bg); }
  .lpf-item-top{ display:flex; justify-content:space-between; gap:10px; font-size:12.5px; }
  .lpf-item-name{ font-weight:600; color:var(--ink); min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .lpf-item-v{ font-family:'IBM Plex Mono',monospace; color:var(--ink); flex-shrink:0; }
  .lpf-item-svc{ font-size:11px; color:var(--ink-faint); margin:1px 0 4px; }
  .lpf-item-track{ height:6px; background:var(--chip-bg); border-radius:3px; }
  .lpf-item-bar{ height:6px; border-radius:3px; }
  .lpf-table tfoot td{ font-weight:700; border-top:1px solid var(--line); }
  .lpf-table tr.lpf-cur td{ background:var(--chip-bg); }
  .lpf-colwrap{ overflow-x:auto; padding-bottom:4px; }
  .lpf-colchart{ position:relative; display:grid; grid-template-columns:48px minmax(0, 1fr); min-width:640px; height:262px; padding-top:12px; }
  .lpf-yaxis{ position:relative; height:200px; }
  .lpf-ytick{ position:absolute; left:0; right:-100vw; height:0; border-top:1px solid var(--line); }
  .lpf-colchart{ overflow:hidden; }
  .lpf-ytick span{ position:absolute; left:0; top:-8px; font-size:10.5px; color:var(--ink-faint); font-family:'IBM Plex Mono',monospace; background:var(--surface); padding-right:4px; }
  .lpf-cols{ position:relative; display:flex; gap:2px; height:250px; z-index:1; }
  .lpf-col{ flex:1 1 0; min-width:0; display:flex; flex-direction:column; align-items:stretch; outline:none; border-radius:4px; }
  .lpf-col:hover .lpf-col-stack, .lpf-col:focus-visible .lpf-col-stack{ filter:brightness(1.12); }
  .lpf-col:focus-visible{ box-shadow:0 0 0 2px var(--ink-faint); }
  .lpf-col-stack{ height:200px; display:flex; flex-direction:column-reverse; gap:2px; padding:0 3px; }
  .lpf-col-stack .lpf-seg{ width:100%; max-width:24px; margin:0 auto; flex-shrink:0; }
  .lpf-col-stack .lpf-seg:last-child{ border-radius:4px 4px 0 0; }
  .lpf-col-x{ font-size:10.5px; color:var(--ink-faint); text-align:center; font-family:'IBM Plex Mono',monospace; margin-top:5px; }
  .lpf-col-days{ font-size:10.5px; color:var(--ink-dim); text-align:center; font-weight:700; min-height:14px; }
  .lpf-col.cur{ background:var(--chip-bg); }
  .lpf-col.cur .lpf-col-x{ color:var(--ink); font-weight:700; }
  .lpf-col.future .lpf-col-x{ opacity:0.7; }
  .lpf-tip{ position:fixed; z-index:9999; display:none; pointer-events:none; background:var(--surface); color:var(--ink); border:1px solid var(--line);
            border-radius:8px; padding:8px 10px; box-shadow:var(--shadow); font-size:12px; max-width:300px; }
  .lpf-tip-head{ font-weight:700; margin-bottom:4px; color:var(--ink); }
  .lpf-tip-row{ color:var(--ink-dim); white-space:nowrap; line-height:1.55; }
  .lpf-tip-row strong{ color:var(--ink); font-family:'IBM Plex Mono',monospace; font-weight:600; }
  .lpf-tip-key{ display:inline-block; width:10px; height:0; border-top:2px solid var(--ink-faint); margin-right:6px; vertical-align:3px; }
  @media (max-width:600px){
    .lpf-row{ grid-template-columns:minmax(100px, 38%) minmax(0, 1fr) 50px; gap:2px 8px; }
    .lpf-kpi.hero .lpf-kpi-v{ font-size:26px; }
    .lpf-kpis{ grid-template-columns:repeat(2, minmax(0, 1fr)); }
    .lpf-kpi-v{ font-size:19px; }
  }
  .labor-titlebar{ display:flex; flex-wrap:wrap; align-items:flex-end; justify-content:space-between; gap:10px 24px; padding-bottom:10px; }
  .labor-titlebar .card-sub{ margin-bottom:0; }
  .labor-filters{ display:flex; flex-wrap:wrap; gap:12px; align-items:flex-end; justify-content:flex-end; margin-left:auto; }
  .labor-head-scroll{ overflow:hidden; }
  .labor-head-scroll table{ margin:0; }
  @media (max-width:640px){ .labor-filters{ justify-content:flex-start; margin-left:0; gap:8px 10px; } }
  /* Step 198: Labor -- Hours Available To Schedule for External Tickets */
  .la-table td{ vertical-align:middle; }
  .la-table tr.la-crew-head td{ padding-top:14px; font-weight:700; color:var(--ink); border-bottom:1.5px solid var(--line); }
  .la-table tr.la-sub td{ font-weight:700; color:var(--ink); border-top:1.5px solid var(--line); }
  .la-table tr.la-fixed td{ color:var(--ink-faint); font-size:12.5px; font-style:italic; }
  .la-table tfoot td{ border-top:2px solid var(--line); font-weight:700; color:var(--ink); font-size:14px; }
  .la-table td.la-avail{ font-weight:700; color:var(--ink); }
  .la-neg{ color:var(--ts-red); }
  .la-faint{ color:var(--ink-faint); }
  .la-end{ display:inline-flex; align-items:center; gap:8px; white-space:nowrap; }
  .la-editor{ display:inline-flex; align-items:center; gap:5px; white-space:nowrap; }
  .la-date{ font-family:inherit; font-size:12.5px; padding:3px 5px; border:1px solid var(--line); border-radius:5px; background:var(--surface); color:var(--ink); }
  .la-btn{ font-family:inherit; font-size:11.5px; font-weight:600; padding:2px 8px; border-radius:5px; border:1px solid var(--line); background:var(--surface); color:var(--ink-dim); cursor:pointer; }
  .la-btn:hover:not(:disabled), .la-btn:focus-visible{ border-color:var(--moss-soft); color:var(--ink); }
  .la-btn:disabled{ opacity:0.45; cursor:default; }
  .la-btn.la-save{ background:var(--moss); border-color:var(--moss); color:var(--surface); }
  .la-saving{ color:var(--ink-faint); font-style:italic; white-space:nowrap; }
  .la-err{ color:var(--ts-red); font-size:12px; margin-top:4px; white-space:normal; max-width:280px; }
  .la-off{ margin-top:14px; font-size:13px; }
  .la-off summary{ cursor:pointer; color:var(--ink-dim); font-weight:600; }
  .la-note{ margin-top:12px; font-size:12px; color:var(--ink-faint); line-height:1.5; }
  .la-note.la-warn{ color:var(--ink-dim); border-left:3px solid var(--gold); padding:6px 10px; background:color-mix(in srgb, var(--gold) 8%, var(--surface)); }
  .la-note.la-warn summary{ cursor:pointer; }
  .la-unc-list{ margin:6px 0; padding-left:18px; columns:2 300px; column-gap:24px; }
  .la-unc-list li{ break-inside:avoid; }
  /* Payments-grid per-cell popup (2026-09-21, Step 109 -- Hadley: "I
     want the manual entry to happen directly in the cell ... each cell
     could be clickable and bring up a little window that shows
     auto-retrieved amount for that cell as well as manual amount").
     A centered, fixed overlay rather than a popover anchored to the
     clicked cell -- the Payments grid scrolls both horizontally (Step
     107's cf-scroll-sync) and sits under a sticky header (Step 108), so
     a cell-anchored popover would need constant repositioning against
     both; a centered modal sidesteps that entirely and never clips at
     the edge of the card. */
  /* Step 315: Sales Goals rep details */
  .sg-rep-click{ cursor:pointer; border-radius:8px; margin:-6px -8px; padding:6px 8px; }
  .sg-rep-click:hover{ background:var(--chip-bg); }
  .sg-rep-click:focus-visible{ outline:2px solid var(--moss-soft); outline-offset:2px; }
  .sg-rep-more{ font-size:11px; font-weight:600; color:var(--moss-soft); margin-left:6px; }
  .cf-modal.sgd-modal{ width:860px; }
  .sgd-sec{ font-size:11px; font-weight:700; letter-spacing:0.5px; text-transform:uppercase; color:var(--ink-faint); margin:18px 0 8px; }
  .sgd-big{ font-size:26px; font-weight:700; color:var(--ink); }
  .sgd-big-sub{ font-size:12.5px; color:var(--ink-dim); margin-top:2px; }
  .sgd-modal p{ font-size:12.5px; color:var(--ink-dim); line-height:1.5; margin:8px 0; }
  .sgd-tiles{ display:grid; grid-template-columns:repeat(4, minmax(0,1fr)); gap:8px; margin:8px 0 10px; }
  .sgd-tiles-2{ grid-template-columns:repeat(2, minmax(0,1fr)); }
  .sgd-tiles > div{ border:1px solid var(--line); border-radius:8px; padding:8px 10px; min-width:0; }
  .sgd-tiles span{ display:block; font-size:10.5px; color:var(--ink-faint); text-transform:uppercase; letter-spacing:0.4px; }
  .sgd-tiles b{ display:block; font-size:16px; color:var(--ink); margin-top:2px; }
  .sgd-up{ color:#16734a !important; } .sgd-down{ color:#dc2626 !important; }
  @media (prefers-color-scheme: dark){ .sgd-up{ color:#6DBE8C !important; } .sgd-down{ color:#E07A6C !important; } }
  .sgd-table{ font-size:12.5px; width:100%; }
  .sgd-table th, .sgd-table td{ white-space:nowrap; }
  .sgd-table tfoot td{ font-weight:700; border-top:1px solid var(--line); }
  .sgd-future td{ color:var(--ink-faint); }
  .sgd-current td{ font-weight:600; }
  .sgd-tag{ font-size:10px; font-weight:600; color:var(--ink-faint); }
  .sgd-barcell{ width:90px; min-width:70px; }
  .sgd-bar{ position:relative; height:8px; background:var(--line); border-radius:4px; }
  .sgd-bar i{ position:absolute; left:0; top:0; bottom:0; background:#16734a; border-radius:4px; }
  .sgd-bar b{ position:absolute; top:-3px; bottom:-3px; width:2px; background:var(--ink); transform:translateX(-1px); }
  .sgd-key{ font-size:10px; font-weight:500; color:var(--ink-faint); display:inline-flex; align-items:center; gap:4px; }
  .sgd-key i{ display:inline-block; width:12px; height:6px; background:#16734a; border-radius:3px; }
  .sgd-key b{ display:inline-block; width:2px; height:10px; background:var(--ink); }
  .sgd-note{ font-size:11.5px !important; color:var(--ink-faint) !important; }
  @media (max-width: 640px){ .sgd-tiles{ grid-template-columns:repeat(2, minmax(0,1fr)); } .sgd-cum{ display:none; } .sgd-big{ font-size:22px; } }
  @media (max-width: 480px){ .sgd-barcell{ display:none; } .sgd-table{ font-size:12px; } .sgd-table th, .sgd-table td{ padding-left:5px; padding-right:5px; } .sgd-tag{ display:none; } }
  .cf-modal-backdrop{ position:fixed; inset:0; background:rgba(0,0,0,0.35); z-index:50; display:flex; align-items:center; justify-content:center; padding:20px; }
  .cf-modal{ background:var(--surface); border:1px solid var(--line); border-radius:12px; box-shadow:var(--shadow); width:420px; max-width:100%; max-height:85vh; overflow-y:auto; padding:22px 24px; }
  .cf-modal-title{ font-size:15px; font-weight:700; color:var(--ink); margin-bottom:2px; }
  .cf-modal-sub{ font-size:12px; color:var(--ink-faint); margin-bottom:16px; }
  .cf-modal-row{ display:flex; justify-content:space-between; align-items:center; padding:8px 0; border-bottom:1px solid var(--line); font-size:13px; }
  .cf-modal-row-label{ color:var(--ink-dim); }
  .cf-modal-row-amt{ font-family:'IBM Plex Mono',monospace; color:var(--ink); }
  .cf-modal-entry{ display:flex; justify-content:space-between; align-items:center; gap:8px; padding:8px 0; border-bottom:1px solid var(--line); font-size:12.5px; }
  .cf-modal-entry-desc{ color:var(--ink-dim); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; flex:1; }
  .cf-modal-entry-amt{ font-family:'IBM Plex Mono',monospace; color:var(--ink); flex-shrink:0; }
  .cf-modal-entry-actions{ display:flex; gap:4px; flex-shrink:0; }
  .cf-modal-icon-btn{ font-size:11px; padding:2px 7px; border-radius:5px; border:1px solid var(--line); background:transparent; color:var(--ink-faint); cursor:pointer; }
  .cf-modal-icon-btn:hover{ color:var(--ink); border-color:var(--ink-faint); }
  .cf-modal-add-row{ display:flex; gap:6px; margin-top:12px; align-items:flex-end; }
  .cf-modal-add-row input{ font-size:12.5px; padding:6px 8px; border:1px solid var(--line); border-radius:6px; background:var(--chip-bg); color:var(--ink); }
  .cf-modal-add-row input[data-cf-modal-desc]{ flex:1; min-width:0; }
  .cf-modal-add-row input[data-cf-modal-amt]{ width:90px; }
  .cf-modal-btn{ font-size:13px; padding:7px 14px; border-radius:6px; border:none; background:var(--moss); color:#fff; font-weight:600; cursor:pointer; }
  .cf-modal-btn:disabled{ opacity:0.6; cursor:default; }
  /* Step 221: what-makes-up-this-number popup */
  .cf-ar-items-cell{ cursor:pointer; }
  .cf-ar-items-cell:hover, .cf-ar-items-cell:focus-visible{ text-decoration:underline; text-decoration-style:dotted; color:var(--ink); outline:none; }
  .cf-items-modal{ width:620px; }
  .cf-items-list{ max-height:60vh; overflow-y:auto; margin-top:4px; }
  .cf-item{ padding:8px 0; border-bottom:1px solid var(--line); }
  .cf-item-top{ display:flex; justify-content:space-between; gap:12px; align-items:baseline; font-size:13px; }
  .cf-item-label{ color:var(--ink); min-width:0; overflow-wrap:anywhere; }
  .cf-item-note{ font-size:11.5px; color:var(--ink-faint); margin-top:3px; line-height:1.4; }
  .cf-modal-close-row{ display:flex; justify-content:flex-end; margin-top:18px; }
  .cf-modal-close-btn{ font-size:13px; padding:7px 14px; border-radius:6px; border:1px solid var(--line); background:transparent; color:var(--ink-dim); cursor:pointer; }
  /* Step 124, 2026-09-22: Payments-grid row label -- click opens the
     Section/Grouped-name categorize popup (openCategorizeModal_). */
  /* Step 164: collapsible Payments-grid sections */
  tr.cf-sec-head{ cursor:pointer; }
  tr.cf-sec-head:hover td:first-child, tr.cf-sec-head:focus-visible td:first-child{ color:var(--ink) !important; }
  tr.cf-sec-head:focus-visible{ outline:2px solid var(--moss-soft); outline-offset:-2px; }
  /* Step 324 (Hadley: the lines "break apart with each section"): an open
     section hides its totals' text and tint, not the cells themselves
     (visibility:hidden also hid this week's column lines), so the column
     lines run unbroken through every section header. */
  tr.cf-sec-head:not(.is-collapsed) .cf-sec-sum{ color:transparent !important; background:none !important; }
  /* Step 324: a bold line across the whole row under each section name */
  tr.cf-sec-head td{ border-bottom:2px solid var(--ink-faint); }
  tr.cf-sec-head .cf-sec-count{ font-weight:500; opacity:0.8; }
  tr.cf-sec-head.is-collapsed .cf-sec-hint{ display:none; }
  .cf-sec-chev{ display:inline-block; width:10px; font-size:10px; }
  .cf-pay-collapse-all{ margin-left:10px; font-size:11px; font-weight:600; text-transform:none; letter-spacing:0; padding:3px 9px; border-radius:6px; border:1px solid var(--line); background:var(--surface); color:var(--ink-dim); cursor:pointer; vertical-align:middle; }
  .cf-pay-collapse-all:hover{ border-color:var(--moss-soft); color:var(--ink); }
  /* Step 293: move the manual payments left in a week to the next week */
  .cf-move-next{ font:inherit; font-size:11px; font-weight:600; padding:2px 8px; border-radius:6px; border:1px solid var(--line); background:var(--surface); color:var(--ink-dim); cursor:pointer; white-space:nowrap; }
  .cf-move-next:hover{ border-color:var(--moss-soft); color:var(--ink); }
  .cf-move-next:focus-visible{ outline:2px solid var(--moss-soft); outline-offset:1px; }
  tr.cf-move-row td{ padding-top:4px; padding-bottom:6px; border-bottom:1px dashed var(--line); }
  /* Step 309: Undo after moving manual payments to the next week */
  .cf-undo-toast{ position:fixed; left:50%; bottom:22px; transform:translateX(-50%); z-index:60; display:flex; align-items:center; gap:8px 12px;
    width:max-content; max-width:calc(100vw - 32px); box-sizing:border-box; padding:10px 12px 10px 16px; border-radius:8px; box-shadow:var(--shadow);
    background:var(--ink); color:var(--bg); font-size:13px; line-height:1.4; }
  .cf-undo-msg{ flex:1 1 auto; min-width:0; }
  .cf-undo-btn, .cf-undo-x{ flex:none; }
  .cf-undo-btn{ font:inherit; font-size:12.5px; font-weight:700; padding:5px 14px; border-radius:6px; border:none; background:var(--bg); color:var(--ink); cursor:pointer; white-space:nowrap; }
  .cf-undo-btn[aria-disabled="true"]{ opacity:0.6; cursor:progress; }
  .cf-undo-btn:focus-visible, .cf-undo-x:focus-visible{ outline:2px solid var(--gold-soft); outline-offset:2px; }
  .cf-undo-x{ font:inherit; font-size:18px; line-height:1; padding:2px 6px; border:none; background:none; color:var(--bg); opacity:0.75; cursor:pointer; }
  .cf-undo-x:hover{ opacity:1; }
  .cf-hidden-list{ margin-top:12px; font-size:12.5px; }
  .cf-hidden-list summary{ cursor:pointer; color:var(--ink-dim); font-weight:600; }
  .cf-hidden-item{ display:flex; align-items:center; justify-content:space-between; gap:10px; padding:5px 0; border-top:1px solid var(--line); color:var(--ink-dim); }
  .cf-hidden-item span{ overflow-wrap:anywhere; }
  .cf-hide-block{ padding:12px 0 2px; border-top:1px solid var(--line); margin-top:6px; }
  .cf-modal-icon-btn[disabled]{ opacity:0.55; cursor:not-allowed; }
  .cf-payment-row-label:hover{ color:var(--ink) !important; text-decoration:underline; text-decoration-style:dotted; }
  /* Step 262: vendor payment timing */
  .cf-timing-note{ display:block; font-size:10.5px; color:var(--ink-faint); font-style:italic; }
  /* Step 321: Payments grid -- actual paid bills (forest green tint), open
     bills moved to a later week (gray-purple text), and the move buttons */
  :root{ --cf-paid:#2D6A35; --cf-moved:#7D6E99; }
  @media (prefers-color-scheme: dark){ :root{ --cf-paid:#4E9A5C; --cf-moved:#A89CC4; } }
  .cf-bill-acts{ display:flex; flex-wrap:wrap; gap:6px; justify-content:flex-end; padding:0 0 6px 10px; }
  /* Step 294: recurring manual payments in the categorize popup */
  .cf-rec{ margin-top:10px; padding-top:8px; border-top:1px dashed var(--line); }
  .cf-rec-title{ font-size:10.5px; font-weight:700; letter-spacing:0.5px; text-transform:uppercase; color:var(--ink-faint); margin-bottom:4px; }
  .cf-rec-rule{ display:flex; flex-wrap:wrap; align-items:center; gap:4px 10px; font-size:12.5px; padding:4px 0; }
  .cf-rec-rule.is-paused .cf-rec-amt, .cf-rec-rule.is-paused .cf-rec-what{ opacity:0.55; }
  .cf-rec-amt{ font-weight:700; color:var(--ink); font-variant-numeric:tabular-nums; }
  .cf-rec-what{ color:var(--ink-dim); flex:1; min-width:160px; }
  .cf-rec-paused{ font-size:10.5px; font-weight:700; text-transform:uppercase; color:var(--ink-faint); }
  .cf-rec-confirm{ font-size:12px; color:var(--ink); display:flex; flex-wrap:wrap; align-items:center; gap:6px; }
  .cf-rec-form{ display:flex; flex-direction:column; gap:6px; font-size:12.5px; color:var(--ink-dim); }
  .cf-rec-form input[type=number], .cf-rec-form input[type=text], .cf-rec-form input[type=date]{ font-size:12.5px; padding:5px 6px; border:1px solid var(--line); border-radius:6px; background:var(--chip-bg); color:var(--ink); margin:0 4px; }
  .cf-rec-form input[data-cf-rec-amount]{ width:110px; }
  .cf-rec-form input[data-cf-rec-desc]{ width:200px; max-width:100%; }
  .cf-rec-form input[data-cf-rec-day], .cf-rec-form input[data-cf-rec-every]{ width:56px; }
  .cf-rec-opt{ display:flex; flex-wrap:wrap; align-items:center; gap:2px; }
  .cf-timing-edit{ display:flex; flex-wrap:wrap; align-items:center; gap:6px 8px; font-size:12px; color:var(--ink-dim); margin-top:2px; }
  .cf-timing-edit input{ width:58px; font-size:12.5px; padding:5px 6px; border:1px solid var(--line); border-radius:6px; background:var(--chip-bg); color:var(--ink); margin:0 4px; }
  .cf-bill-line{ display:flex; justify-content:space-between; gap:10px; font-size:11.5px; color:var(--ink-faint); padding:2px 0 2px 10px; }
  th{ text-align:left; font-size:11px; text-transform:uppercase; letter-spacing:0.05em; color:var(--ink-faint); font-weight:600; padding:0 10px 8px; border-bottom:1px solid var(--line); }
  th.num, td.num{ text-align:right; font-family:'IBM Plex Mono',monospace; }
  /* Step 151: month header row directly under an in-table revenue chart (makeRevenueChartTableRow_) */
  tr.rev-chart-head th{ padding-top:6px; }
  /* Step 181: Accounting -> Past Due */
  .pd-table td{ vertical-align:middle; }
  .pd-table tr.pd-row{ cursor:pointer; }
  .pd-table tr.pd-row:hover td{ background:color-mix(in srgb, var(--moss) 5%, var(--surface)); }
  .pd-table tr.pd-open td{ background:color-mix(in srgb, var(--moss) 7%, var(--surface)); border-bottom-color:transparent; }
  .pd-table tr.pd-detail > td{ background:color-mix(in srgb, var(--moss) 7%, var(--surface)); padding:4px 12px 16px; }
  .pd-toggle-cell{ width:28px; padding-right:0 !important; }
  .pd-toggle{ border:none; background:none; color:var(--ink-dim); font-size:13px; cursor:pointer; padding:2px 4px; }
  .pd-name{ font-weight:600; white-space:nowrap; } .pd-contact{ white-space:nowrap; color:var(--ink-dim); }
  .pd-terms{ display:inline-block; font-size:11px; font-weight:700; padding:1px 7px; border-radius:4px; background:var(--chip-bg); color:var(--ink-dim); font-family:inherit; } .pd-prop{ min-width:140px; } .pd-nowrap{ white-space:nowrap; }
  .pd-note{ max-width:220px; color:var(--ink-dim); font-size:12.5px; }
  .pd-props-n{ display:block; font-weight:600; }
  .pd-props-item{ display:block; font-size:12px; color:var(--ink-dim); }
  .pd-inv-prop{ min-width:110px; }
  .pd-total{ font-weight:700; }
  .pd-faint{ color:var(--ink-faint); }
  .pd-table a{ color:var(--budget-blue); text-decoration:none; } .pd-table a:hover{ text-decoration:underline; }
  .pd-table tfoot td{ border-top:1.5px solid var(--line); font-weight:700; color:var(--ink); }
  .pd-search{ font-family:inherit; font-size:12.5px; padding:6px 9px; border:1px solid var(--line); border-radius:6px; background:var(--surface); color:var(--ink); min-width:240px; max-width:100%; }
  .pd-tag{ display:inline-block; font-size:10.5px; font-weight:700; padding:1px 7px; border-radius:999px; border:1px solid currentColor; line-height:1.5; }
  .pd-tag.pd-reached{ color:var(--moss-soft); } .pd-tag.pd-emailed{ color:var(--budget-blue); }
  .pd-tag.pd-voicemail{ color:var(--gold); } .pd-tag.pd-missed-call{ color:var(--clay); }
  /* Step 231: credits / payments not applied in QuickBooks */
  .pd-tag.pd-credit{ color:var(--clay); background:color-mix(in srgb, var(--clay) 10%, var(--surface)); display:block; width:max-content; margin-top:3px; font-weight:700; cursor:help; }
  .pd-credit-sum .pd-tag.pd-credit{ display:inline-block; margin-top:0; cursor:default; }
  .pd-credit-sum{ font-size:12.5px; color:var(--ink-dim); margin-top:4px; }
  /* Step 238: paid online in Boss, not in QuickBooks yet */
  .pd-tag.pd-pending{ color:var(--moss); background:color-mix(in srgb, var(--moss) 12%, var(--surface)); display:block; width:max-content; margin-top:3px; font-weight:700; cursor:help; }
  .pd-credit-sum .pd-tag.pd-pending{ display:inline-block; margin-top:0; cursor:default; }
  .pd-pending-note{ margin:4px 0 10px; padding:8px 12px; border:1px solid color-mix(in srgb, var(--moss) 45%, var(--line)); border-radius:8px;
    background:color-mix(in srgb, var(--moss) 7%, var(--surface)); font-size:13px; color:var(--ink); }
  .pd-inv-pending{ display:block; font-size:11px; color:var(--moss); font-weight:600; white-space:nowrap; }
  .pd-credit-note{ margin:4px 0 10px; padding:8px 12px; border:1px solid color-mix(in srgb, var(--clay) 45%, var(--line)); border-radius:8px;
    background:color-mix(in srgb, var(--clay) 8%, var(--surface)); color:var(--ink); font-size:12.5px;
    position:sticky; left:12px; width:calc(var(--pd-wrapw, 100%) - 24px); box-sizing:border-box; }
  .pd-detail-grid{ display:grid; grid-template-columns:minmax(220px,1fr) minmax(300px,1.4fr) minmax(220px,1fr); gap:14px;
    /* stays in view when the wide table is scrolled sideways (phone) */
    position:sticky; left:12px; width:calc(var(--pd-wrapw, 100%) - 24px); box-sizing:border-box; }
  @media (max-width:900px){ .pd-detail-grid{ grid-template-columns:1fr; } }
  .pd-panel{ background:var(--surface); border:1px solid var(--line); border-radius:8px; padding:10px 12px; min-width:0; }
  .pd-panel-title{ font-size:11px; font-weight:700; text-transform:uppercase; letter-spacing:0.5px; color:var(--ink-faint); margin-bottom:8px; }
  .pd-mini{ font-size:12px; } .pd-mini th, .pd-mini td{ padding:4px 6px; }
  .pd-log-form{ display:flex; flex-wrap:wrap; gap:6px; align-items:center; }
  .pd-date, .pd-lognote, .pd-notes{ font-family:inherit; font-size:12.5px; padding:5px 7px; border:1px solid var(--line); border-radius:5px; background:var(--surface); color:var(--ink); }
  .pd-lognote{ flex:1 1 140px; min-width:120px; }
  .pd-notes{ width:100%; resize:vertical; margin-bottom:6px; }
  .pd-methods{ display:flex; flex-wrap:wrap; gap:4px; }
  .pd-method{ font-family:inherit; font-size:12px; padding:4px 9px; border:1px solid var(--line); border-radius:999px; background:var(--surface); color:var(--ink-dim); cursor:pointer; }
  .pd-method.on{ background:var(--moss); border-color:var(--moss); color:#F5F7EE; }
  @media (prefers-color-scheme: dark){ .pd-method.on{ color:#131A15; } }
  .pd-btn{ font-family:inherit; font-size:12.5px; font-weight:600; padding:5px 12px; border-radius:6px; border:1px solid var(--moss); background:var(--moss); color:#F5F7EE; cursor:pointer; }
  @media (prefers-color-scheme: dark){ .pd-btn{ color:#131A15; } }
  .pd-btn:disabled{ opacity:0.45; cursor:default; }
  .pd-log{ list-style:none; margin:10px 0 0; padding:0; max-height:220px; overflow:auto; }
  .pd-log-item{ display:flex; flex-wrap:wrap; align-items:center; gap:6px; padding:5px 0; border-top:1px solid var(--line); font-size:12.5px; }
  .pd-log-date{ color:var(--ink); font-variant-numeric:tabular-nums; } .pd-log-note{ color:var(--ink-dim); flex:1 1 120px; } .pd-log-by{ font-size:11px; }
  .pd-linkbtn{ border:none; background:none; color:var(--clay); font-size:11.5px; cursor:pointer; padding:0 2px; margin-left:auto; }
  .pd-err{ margin-top:10px; }
  /* Step 180: Revenue Tracker */
  .rt-up{ color:var(--moss-soft); } .rt-down{ color:var(--clay); } .rt-zero{ color:var(--ink-faint); }
  .rt-same{ color:var(--ink-dim); } .rt-arrow{ color:var(--ink-faint); margin:0 2px; }
  .rt-nowrap{ white-space:nowrap; } .rt-wrap{ min-width:120px; }
  .rt-table tr.rt-total td, .rt-table tfoot td{ border-top:1.5px solid var(--line); font-weight:700; color:var(--ink); }
  .rt-table tr.rt-other td{ color:var(--ink-dim); font-style:italic; }
  .rt-matrix td:first-child{ white-space:nowrap; }
  /* Step 187: the Other tile opens what's behind it */
  .rt-kpi-btn{ display:block; width:100%; text-align:left; font:inherit; color:inherit; cursor:pointer; }
  .rt-kpi-btn > span{ display:block; }
  .rt-kpi-btn:hover{ border-color:var(--ink-faint); }
  .rt-kpi-btn:focus-visible{ outline:2px solid var(--moss-soft); outline-offset:2px; }
  .rt-kpi-btn[aria-expanded="true"]{ border-color:var(--moss-soft); box-shadow:0 0 0 1px var(--moss-soft) inset, var(--shadow); }
  .rt-kpi-more{ display:block; color:var(--moss-soft); white-space:nowrap; margin-top:2px; }
  .rt-otable td:first-child{ min-width:220px; }
  .rt-otable tr.rt-ogroup td{ border-top:1px solid var(--line); font-weight:600; color:var(--ink); padding-top:10px; }
  .rt-otable tr.rt-ogroup:first-child td{ border-top:none; }
  .rt-ocap{ display:block; font-weight:400; font-size:11.5px; color:var(--ink-faint); margin-top:2px; max-width:560px; white-space:normal; }
  .rt-otable tr.rt-ochild td{ font-size:12.5px; color:var(--ink-dim); }
  .rt-otable tr.rt-ochild td:first-child{ padding-left:22px; }
  .rt-otable tr.rt-onote td{ font-size:12px; color:var(--ink-faint); font-style:italic; padding-left:22px; }
  /* phones: keep the label and the effect; Before/After drop off */
  @media (max-width:600px){
    .rt-otable th:nth-child(2), .rt-otable th:nth-child(3),
    .rt-otable tr:not(.rt-onote) td:nth-child(2), .rt-otable tr:not(.rt-onote) td:nth-child(3){ display:none; }
    .rt-otable td:first-child{ min-width:0; }
  }
  /* Step 194: what makes up a month's Expected */
  .rev-exp-click{ cursor:pointer; }
  .rev-exp-click:hover > div:first-child{ opacity:0.45 !important; }
  .rev-exp-click:focus-visible{ outline:2px solid var(--moss-soft); outline-offset:2px; }
  /* Step 299: Total Revenue chart -- click a month for its departments */
  td.trev-cell{ cursor:pointer; }
  td.trev-cell [data-trev-part]{ transition:filter .12s; }
  td.trev-cell [data-trev-part]:hover{ filter:brightness(1.18) saturate(1.1); }
  /* Step 306: the light Expected part darkens on hover (a more solid fill),
     the same as the Landscaping chart Expected part, instead of brightening */
  td.trev-cell [data-trev-part="expected"]:hover{ filter:none; opacity:0.45 !important; }
  .trev-click:focus-visible{ outline:2px solid var(--moss-soft); outline-offset:2px; }
  .trev-modal{ width:640px; }
  .trev-table{ width:100%; font-size:13px; }
  .trev-table th.num, .trev-table td.num{ text-align:right; white-space:nowrap; }
  .trev-table td:first-child{ white-space:nowrap; font-weight:600; color:var(--ink); }
  .trev-table tr.trev-total td{ border-top:1.5px solid var(--line); font-weight:700; }
  .trev-table tr.trev-hl td:first-child{ box-shadow:inset 3px 0 0 var(--gold); }   /* Step 300: the chart it came from */
  .trev-table .trev-on{ background:color-mix(in srgb, var(--moss) 9%, transparent); }
  .trev-basis{ font:inherit; font-size:11px; font-weight:700; text-transform:uppercase; letter-spacing:.5px; color:var(--ink-faint); background:none; border:none; padding:0; cursor:pointer; }
  .trev-basis[aria-pressed="true"]{ color:var(--ink); text-decoration:underline; text-underline-offset:3px; }
  .trev-share{ display:flex; align-items:center; justify-content:flex-end; gap:6px; }
  .trev-bar{ width:64px; height:8px; border-radius:4px; background:var(--line); overflow:hidden; flex-shrink:0; }
  .trev-bar i{ display:block; height:100%; }
  .trev-foot{ margin-top:12px; font-size:12px; color:var(--ink-dim); display:flex; flex-wrap:wrap; gap:8px 16px; align-items:center; }
  .trev-seg{ display:none; gap:4px; margin:0 0 10px; }
  .trev-seg button{ font:inherit; font-size:12px; font-weight:600; padding:4px 10px; border-radius:999px; border:1px solid var(--line); background:var(--surface); color:var(--ink-dim); cursor:pointer; }
  .trev-seg button[aria-pressed="true"]{ background:var(--moss); border-color:var(--moss); color:#fff; }
  @media (max-width:600px){
    .trev-seg{ display:flex; flex-wrap:wrap; }
    .trev-table{ font-size:12px; }
    .trev-table .trev-c:not(.trev-on){ display:none; }   /* phones: just the picked column */
    .trev-table .trev-on{ background:none; }
    .trev-bar{ display:none; }
    .trev-long{ display:none; }
  }
  .rev-sched-link{ font:inherit; color:var(--ink); background:none; border:none; padding:0; cursor:pointer; text-decoration:underline dotted var(--ink-faint); text-underline-offset:3px; }
  .rev-sched-link:hover{ color:var(--moss-soft); }
  .exp-modal{ width:900px; max-height:88vh; }
  .exp-head{ display:flex; align-items:flex-start; justify-content:space-between; gap:12px; }
  .exp-x{ font-size:18px; line-height:1; padding:2px 9px; }
  .exp-loading{ padding:26px 0; color:var(--ink-faint); }
  .exp-tools{ margin:0 0 12px; }
  .exp-tools input{ width:100%; max-width:340px; box-sizing:border-box; padding:6px 10px; border:1px solid var(--line); border-radius:6px; background:var(--surface); color:var(--ink); font:inherit; font-size:13px; }
  .exp-group{ margin-bottom:16px; }
  .exp-group-head{ display:flex; flex-wrap:wrap; align-items:baseline; gap:4px 10px; padding:6px 0; border-bottom:1.5px solid var(--line); }
  .exp-group-name{ font-weight:700; color:var(--ink); font-size:13.5px; }
  .exp-group-note{ color:var(--ink-faint); font-size:12px; }
  .exp-group-sum{ margin-left:auto; font-family:'IBM Plex Mono',monospace; font-size:12.5px; color:var(--ink); }
  .exp-table{ font-size:12.5px; }
  .exp-table td{ vertical-align:top; }
  .exp-wrap{ min-width:130px; overflow-wrap:anywhere; }
  .exp-nowrap{ white-space:nowrap; }
  .exp-sub{ display:block; font-size:11px; color:var(--ink-faint); }
  .exp-lp{ color:var(--moss-soft); white-space:normal; }
  /* Step 207: customer detail loading / error */
  .cust-detail-msg{ padding:14px 4px; font-size:13px; color:var(--ink-faint); }
  .cust-detail-msg[role=alert]{ color:var(--ts-red); }
  .cust-retry{ margin-left:8px; font-family:inherit; font-size:12px; font-weight:600; padding:3px 10px; border-radius:6px; border:1px solid var(--line); background:var(--surface); color:var(--ink-dim); cursor:pointer; }
  .cust-retry:hover{ border-color:var(--moss-soft); color:var(--ink); }
  .exp-none{ padding:8px 0; color:var(--ink-faint); font-size:12.5px; }
  .exp-total{ display:flex; justify-content:space-between; gap:12px; padding:10px 0 0; border-top:1.5px solid var(--line); font-weight:700; color:var(--ink); }
  .exp-total span:last-child{ font-family:'IBM Plex Mono',monospace; }
  .exp-drift{ margin-top:8px; font-size:12px; color:var(--clay); }
  .exp-phone-only{ display:none; }
  /* Step 227: the tickets behind a month of hours */
  .hrs-note{ min-width:200px; font-size:11.5px; color:var(--ink-dim); }
  /* Step 307: hours by crew leader type, above the ticket list */
  .hrs-crew{ margin-bottom:18px; }
  .hrs-crew-table td:first-child{ font-weight:600; color:var(--ink); white-space:nowrap; }
  .hrs-crew-table td.num, .hrs-crew-table th.num{ text-align:right; white-space:nowrap; }
  .hrs-crew-table tr.hrs-crew-total td{ border-top:1.5px solid var(--line); font-weight:700; color:var(--ink); }
  .hrs-crew-bar{ display:inline-block; width:56px; height:7px; margin-right:6px; vertical-align:middle; border-radius:4px; background:var(--line); overflow:hidden; }
  .hrs-crew-bar i{ display:block; height:100%; background:var(--moss-soft); }
  .hrs-crew-note{ margin-top:6px; font-size:11.5px; color:var(--ink-faint); line-height:1.45; }
  .exp-flag{ display:flex; justify-content:flex-end; align-items:center; gap:5px; margin-top:3px; font-family:'Source Sans 3',sans-serif; font-size:11.5px; color:var(--ink-dim); cursor:pointer; white-space:nowrap; }
  .exp-saving{ color:var(--ink-faint); font-style:italic; }
  .exp-partial-note{ margin:-4px 0 12px; font-size:12px; color:var(--ink-dim); }
  @media (max-width:600px){
    .exp-modal{ padding:18px 14px; }
    .exp-tickets th:nth-child(3), .exp-tickets td:nth-child(3){ display:none; }   /* Service moves under the property */
    .exp-phone-only{ display:block; }
    .exp-table th, .exp-table td{ padding-left:5px; padding-right:5px; }
    .exp-table th{ letter-spacing:0; }
    .exp-nowrap{ white-space:normal; }
    .exp-wrap{ min-width:0; }
    .hrs-crew-table .hrs-crew-x, .hrs-crew-bar{ display:none; }   /* Step 307: phones keep hours, share % and efficiency */
    .hrs-table th:nth-child(4), .hrs-table td:nth-child(4),
    .hrs-table th:nth-child(6), .hrs-table td:nth-child(6){ display:none; }   /* Status and the note move under the property */
  }
  /* Step 211: Services tab */
  .sv-controls{ padding:14px 18px; margin-bottom:14px; }
  .sv-ctl-row{ display:flex; flex-wrap:wrap; align-items:flex-end; gap:12px 22px; }
  .sv-save-row{ margin-top:12px; padding-top:10px; border-top:1px solid var(--line); align-items:center; gap:8px 10px; }
  .sv-save-row .cust-retry{ margin-left:0; }
  .sv-ctl{ display:flex; flex-direction:column; gap:5px; }
  .sv-ctl-label{ font-size:11px; font-weight:700; text-transform:uppercase; letter-spacing:0.5px; color:var(--ink-faint); }
  .sv-ctl input[type=search]{ font-family:inherit; font-size:13px; padding:5px 8px; border:1px solid var(--line); border-radius:6px; background:var(--surface); color:var(--ink); width:220px; max-width:100%; }
  .sv-checks{ gap:4px; }
  .sv-src{ font-size:12.5px; color:var(--ink-dim); margin-right:4px; }
  .sv-msg{ font-size:12.5px; } .sv-msg.ok{ color:var(--ts-green); } .sv-msg.bad{ color:var(--ts-red); }
  /* Step 259: Admin month-end billing card */
  .adm-bc-actions{ display:flex; flex-wrap:wrap; align-items:center; gap:8px 10px; }
  .adm-bc-q{ font-size:13px; font-weight:600; color:var(--ink); }
  .adm-bc .cust-retry.adm-bc-go{ background:var(--moss); color:#fff; border-color:var(--moss); }
  .adm-bc .cust-retry:disabled{ opacity:0.6; cursor:default; }
  .adm-bc-list{ margin-top:12px; max-height:460px; overflow:auto; }
  .adm-bc-list td{ vertical-align:top; }
  .adm-bc-sub{ display:block; font-size:11px; color:var(--ink-faint); }
  .adm-bc-check{ display:inline-flex; align-items:center; gap:6px; cursor:pointer; white-space:nowrap; font-weight:600; color:var(--ink-dim); }
  .adm-bc-moved .adm-bc-check{ color:var(--moss); }
  .adm-bc-saving{ font-weight:400; color:var(--ink-faint); font-size:11.5px; }
  .sv-swatch{ display:inline-block; width:10px; height:10px; border-radius:2px; background:var(--svc); margin-right:6px; vertical-align:-1px; }
  .sv-yearchip:not(.on) .sv-swatch{ opacity:0.45; }
  .sv-picker-wrap{ position:relative; }
  .sv-picker{ position:absolute; z-index:30; top:100%; left:0; margin-top:6px; width:min(420px, 86vw); background:var(--surface); border:1px solid var(--line); border-radius:8px; box-shadow:var(--shadow); padding:10px; }
  .sv-picker-top{ display:flex; flex-wrap:wrap; gap:6px; align-items:center; margin-bottom:8px; }
  .sv-picker-top input{ flex:1 1 150px; font-family:inherit; font-size:13px; padding:5px 8px; border:1px solid var(--line); border-radius:6px; background:var(--surface); color:var(--ink); }
  .sv-picker-top .cust-retry{ margin-left:0; }
  .sv-picker-list{ max-height:340px; overflow:auto; display:flex; flex-direction:column; }
  .sv-pick{ display:flex; align-items:center; gap:8px; padding:4px 4px; font-size:13px; cursor:pointer; border-radius:4px; }
  .sv-pick:hover{ background:var(--chip-bg); }
  .sv-pick span:nth-of-type(1){ flex:1; }
  .sv-pick-tot{ font-family:'IBM Plex Mono',monospace; font-size:11.5px; color:var(--ink-faint); }
  .sv-card{ padding:16px 0 0; overflow:hidden; }
  .sv-cardhead{ display:flex; flex-wrap:wrap; justify-content:space-between; align-items:flex-end; gap:8px 20px; padding:0 20px 12px; }
  .sv-legend{ display:flex; flex-wrap:wrap; align-items:center; gap:4px 14px; font-size:12px; color:var(--ink-dim); }
  .sv-scroll{ overflow:auto; max-height:72vh; border-top:1px solid var(--line); }
  .sv-table{ border-collapse:separate; border-spacing:0; width:max-content; min-width:100%; font-size:13px; }
  .sv-table th, .sv-table td{ padding:6px 10px; border-bottom:1px solid var(--line); background:var(--surface); }
  .sv-table thead th{ position:sticky; z-index:2; text-transform:none; letter-spacing:0; }
  .sv-table thead tr:first-child th{ top:0; height:40px; }
  .sv-table thead tr:nth-child(2) th{ top:40px; }
  .sv-table .sv-prop{ position:sticky; left:0; z-index:1; text-align:left; min-width:190px; max-width:260px; border-right:1px solid var(--line); }
  .sv-table thead .sv-prop{ z-index:4; vertical-align:bottom; }
  .sv-group{ text-align:center; font-size:12.5px; font-weight:700; color:var(--ink); border-left:2px solid var(--ink-faint); white-space:nowrap; max-width:260px; overflow:hidden; text-overflow:ellipsis; }
  .sv-yearh{ text-align:right; border-top:3px solid var(--svc); background:color-mix(in srgb, var(--svc) 20%, var(--surface)) !important; min-width:96px; vertical-align:top; }
  .sv-gstart{ border-left:2px solid var(--ink-faint); }
  .sv-sort{ font:inherit; font-weight:700; font-size:12.5px; color:var(--ink); background:none; border:none; padding:0; cursor:pointer; }
  .sv-sort:focus-visible{ outline:2px solid var(--moss-soft); outline-offset:2px; }
  .sv-only{ display:flex; align-items:center; justify-content:flex-end; gap:4px; font-size:10.5px; font-weight:500; color:var(--ink-dim); margin-top:3px; white-space:nowrap; cursor:pointer; }
  .sv-only-txt{ line-height:1.05; text-align:left; }   /* Step 230: two short lines keep the column narrow */
  .sv-cell{ background:color-mix(in srgb, var(--svc) 9%, var(--surface)) !important; white-space:nowrap; font-variant-numeric:tabular-nums; }
  /* Step 257: a signed cell opens its tickets */
  .sv-cell.sv-click{ cursor:pointer; }
  .sv-cell.sv-click:hover, .sv-cell.sv-click:focus-visible{ background:color-mix(in srgb, var(--svc) 22%, var(--surface)) !important; outline:none; text-decoration:underline; }
  .svt-modal{ width:1180px; max-height:90vh; }
  .svt-head{ display:flex; justify-content:space-between; gap:12px; align-items:flex-start; }
  .svt-sec{ margin-top:14px; }
  .svt-sec-h{ display:flex; justify-content:space-between; gap:10px; font-size:11px; font-weight:700; letter-spacing:0.5px; text-transform:uppercase; color:var(--ink-faint); padding-bottom:4px; border-bottom:1px solid var(--line); margin-bottom:2px; }
  .svt-table{ width:100%; border-collapse:collapse; font-size:12.5px; }
  .svt-table th{ font-size:10.5px; font-weight:700; letter-spacing:0.4px; text-transform:uppercase; color:var(--ink-faint); text-align:left; padding:6px 7px; white-space:nowrap; }
  .svt-table td{ padding:6px 7px; border-top:1px solid var(--line); vertical-align:top; color:var(--ink); }
  .svt-table .num{ text-align:right; font-family:'IBM Plex Mono',monospace; white-space:nowrap; }
  .svt-sub{ display:block; font-size:11px; color:var(--ink-faint); }
  .svt-table tr.svt-emp td{ border-top:0; padding-top:0; color:var(--ink-dim); font-size:11.5px; }
  .svt-emp-list{ display:flex; flex-wrap:wrap; gap:2px 16px; padding-left:2px; }
  .svt-emp-list b{ font-weight:600; color:var(--ink); }
  .svt-table td.svt-good{ color:var(--lpf-under, #3F74B0); }
  .svt-table td.svt-bad{ color:var(--lpf-over, #C4602F); }
  .svt-total{ display:flex; justify-content:space-between; font-weight:700; padding:10px 7px 0; border-top:2px solid var(--line); margin-top:10px; }
  .svt-drift{ margin-top:6px; font-size:12px; color:var(--ink-dim); }
  @media (max-width:700px){ .svt-modal{ padding:16px 12px; } }
  .sv-table tbody th, .sv-table tfoot th{ text-transform:none; letter-spacing:0; color:var(--ink); font-size:13px; font-family:inherit; }
  .sv-pname{ font-weight:600; font-size:13px; white-space:normal; }
  .sv-cust{ font-size:11.5px; color:var(--ink-faint); font-weight:400; }
  .sv-drop, .sv-leg-drop{ color:var(--clay); font-size:11px; font-weight:600; font-family:inherit; }
  .sv-notyet{ color:var(--ink-faint); font-weight:500; font-style:italic; }
  .sv-dropcell{ background:color-mix(in srgb, var(--clay) 12%, var(--surface)) !important; }
  .sv-new{ display:inline-block; font-size:10px; font-weight:700; color:var(--surface); background:var(--moss-soft); border-radius:3px; padding:0 4px; margin-right:3px; vertical-align:1px; font-family:inherit; }
  .sv-total th, .sv-total td{ font-weight:700; border-top:2px solid var(--line); position:sticky; bottom:0; z-index:1; }
  .sv-total .sv-prop{ z-index:3; }
  .sv-cnt{ font-size:10.5px; font-weight:500; color:var(--ink-faint); }
  .sv-table tbody tr:hover th, .sv-table tbody tr:hover td{ box-shadow:inset 0 1px 0 var(--moss-soft), inset 0 -1px 0 var(--moss-soft); }
  @media (max-width: 600px){ .sv-table .sv-prop{ min-width:130px; max-width:150px; } .sv-ctl input[type=search]{ width:170px; } }
  /* Step 209: Clover charts, Admin tab, Garden Center > Daily Sales */
  .cs-chart{ position:relative; }
  .cs-chart-scroll{ overflow-x:auto; }
  .cs-grid{ stroke:var(--line); stroke-width:1; opacity:0.7; }
  .cs-base{ stroke:var(--ink-faint); stroke-width:1; }
  .cs-axis{ fill:var(--ink-faint); font-size:10.5px; font-family:'IBM Plex Mono',monospace; }
  .cs-fill{ fill:var(--moss); }
  .cs-hit{ fill:transparent; }
  .cs-bar{ cursor:default; outline:none; }
  .cs-bar.on .cs-fill, .cs-bar:focus .cs-fill{ fill:var(--moss-soft); }
  .cs-bar:focus-visible .cs-hit{ stroke:var(--ink-dim); stroke-width:1; }
  .cs-tip{ position:absolute; top:0; z-index:5; background:var(--surface); color:var(--ink); border:1px solid var(--line); border-radius:6px;
           padding:6px 9px; font-size:12px; line-height:1.4; box-shadow:var(--shadow); pointer-events:none; white-space:nowrap; }
  .adm-grid{ display:grid; grid-template-columns:minmax(320px, 450px) minmax(0, 1fr); gap:14px; align-items:start; }
  .adm-day td{ white-space:nowrap; }
  @media (max-width: 980px){ .adm-grid{ grid-template-columns:minmax(0, 1fr); } }
  .adm-days{ padding:16px 12px 12px; min-width:0; }
  .adm-days h2{ padding:0 8px; margin-bottom:8px; }
  .adm-table td{ padding:6px 10px; border-bottom:1px solid var(--line); vertical-align:top; }
  .adm-table th{ padding:0 10px 6px; }
  .adm-day{ cursor:pointer; }
  .adm-day:hover td{ background:var(--chip-bg); }
  .adm-day.on td{ background:var(--chip-bg); font-weight:600; }
  .adm-day:focus-visible{ outline:2px solid var(--moss-soft); outline-offset:-2px; }
  .adm-posted{ color:var(--ts-green); font-weight:600; }
  .adm-combined{ color:var(--ink-dim); font-style:italic; }
  .adm-todo{ color:var(--gold); font-weight:600; }
  .adm-none{ color:var(--ink-faint); }
  .adm-pill{ display:inline-block; min-width:20px; padding:0 6px; border-radius:999px; background:var(--clay); color:var(--surface); font-weight:700; font-size:11.5px; text-align:center; line-height:18px; }
  .adm-days .adm-table td, .adm-days .adm-table th{ padding-left:7px; padding-right:7px; }
  .adm-warn{ color:var(--clay); font-weight:600; font-size:12px; }
  .adm-bad{ color:var(--ts-red); font-weight:600; }
  .adm-small{ font-size:11.5px; }
  .adm-wrap{ white-space:normal; min-width:140px; }
  .adm-detail{ display:flex; flex-direction:column; gap:14px; min-width:0; }
  .adm-dayhead{ display:flex; align-items:baseline; gap:12px; }
  .adm-dayhead h2{ font-size:20px; }
  .adm-card .card-sub{ margin-bottom:8px; }
  .adm-grp td{ border-top:1px solid var(--ink-faint); }
  .adm-total td{ font-weight:700; border-bottom:none; }
  .adm-posted-line{ font-size:13px; margin-bottom:10px; display:flex; flex-wrap:wrap; align-items:center; gap:6px 10px; }
  .adm-posted-line code, .card-sub code{ font-family:'IBM Plex Mono',monospace; font-size:12px; background:var(--chip-bg); padding:1px 6px; border-radius:4px; overflow-wrap:anywhere; }
  .adm-manual, .adm-override{ font-size:12.5px; color:var(--ink-dim); }
  .adm-manual summary, .adm-override summary{ cursor:pointer; }
  .adm-override{ margin-top:12px; }
  .adm-ovform{ display:flex; flex-wrap:wrap; gap:8px 14px; align-items:flex-end; margin:8px 0 4px; }
  .adm-ovform label, .adm-manual label{ display:inline-flex; flex-direction:column; gap:3px; font-size:12px; }
  .adm-in{ font-family:inherit; font-size:13px; padding:4px 6px; border:1px solid var(--line); border-radius:5px; background:var(--surface); color:var(--ink); max-width:100%; }
  .adm-cost{ width:84px; text-align:right; }
  .adm-catrule{ font-size:11.5px; color:var(--ink-dim); margin-top:4px; display:flex; flex-wrap:wrap; align-items:center; gap:4px; }
  .adm-catrule .cust-retry{ margin-left:0; padding:1px 7px; font-size:11px; }
  .adm-sub{ font-weight:600; font-size:13px; margin:10px 0 6px; }
  .adm-note{ font-size:12px; color:var(--ink-dim); margin:4px 0 6px; }
  .adm-list{ margin:0 0 6px 18px; font-size:13px; }
  .adm-msg{ font-size:13px; padding:8px 12px; border-radius:6px; border:1px solid var(--line); }
  .adm-msg.ok{ color:var(--ts-green); } .adm-msg.bad{ color:var(--ts-red); }
  .adm-needs{ border-left:3px solid var(--clay); }
  /* Step 312: Operations, when the clock is past the last Boss load */
  .data-day-note{ font-size:12px; color:var(--ink-dim); margin:-6px 0 12px; }
  .adm-checks{ font-size:13px; padding:8px 12px; margin:8px 0; border-radius:6px; border:1px solid var(--line); border-left:3px solid var(--ts-green); }
  .gcs-controls{ display:flex; flex-wrap:wrap; justify-content:space-between; align-items:center; gap:10px 20px; padding:14px 18px; margin-bottom:14px; }
  .gcs-dates{ display:flex; flex-wrap:wrap; align-items:flex-end; gap:8px; font-size:12px; color:var(--ink-dim); }
  .gcs-dates label, .gcs-filters label{ display:inline-flex; flex-direction:column; gap:3px; font-size:12px; color:var(--ink-dim); }
  .gcs-dates input, .gcs-filters select, .gcs-filters input{ font-family:inherit; font-size:13px; padding:4px 6px; border:1px solid var(--line); border-radius:5px; background:var(--surface); color:var(--ink); max-width:100%; }
  .gcs-card{ margin-bottom:14px; min-width:0; }
  .gcs-ctl-inline{ display:flex; flex-wrap:wrap; justify-content:space-between; align-items:flex-end; gap:10px 20px; margin:0 0 12px; }
  .gcs-two{ display:grid; grid-template-columns:minmax(0, 1fr) minmax(0, 1fr); gap:14px; }
  @media (max-width: 900px){ .gcs-two{ grid-template-columns:minmax(0, 1fr); } }
  .gcs-shares{ display:flex; flex-wrap:wrap; gap:4px 14px; font-size:12px; color:var(--ink-dim); margin-top:8px; font-family:'IBM Plex Mono',monospace; }
  .gcs-shares b{ color:var(--ink); font-weight:600; }
  .gcs-filters{ display:flex; flex-wrap:wrap; gap:10px 14px; margin:4px 0 12px; }
  .gcs-search input{ width:200px; }
  .gcs-more{ display:flex; align-items:center; gap:10px; margin-top:10px; font-size:12.5px; }
  .gcs-daytable{ margin-top:12px; max-height:360px; overflow:auto; }
  .gcs-items td{ white-space:nowrap; }
  .gcs-item-btn{ font:inherit; color:inherit; background:none; border:none; padding:0; text-align:left; cursor:pointer; white-space:normal; }
  .gcs-item-btn:hover{ text-decoration:underline; color:var(--moss); }
  .gcs-item-btn:focus-visible{ outline:2px solid var(--moss-soft); outline-offset:2px; border-radius:2px; }
  .gcsi-modal .svt-table td{ white-space:nowrap; }
  @media (max-width: 600px){ .gcs-search input{ width:150px; } }
  /* Step 264: Purchasing tab */
  .pur-controls{ display:flex; flex-wrap:wrap; align-items:center; gap:8px 18px; margin:2px 0 12px; }
  .pur-controls .rt-ranges{ display:flex; flex-wrap:wrap; gap:6px; }
  .pur-note{ font-size:12px; color:var(--ink-dim); margin:6px 0 0; line-height:1.5; }
  .pur-note b{ color:var(--ink); font-weight:600; }
  .pur-warn{ font-size:12.5px; color:var(--clay); margin:4px 0 10px; line-height:1.5; }
  .pur-grid{ font-size:12.5px; }
  .pur-grid th, .pur-grid td{ padding:6px 6px; border-bottom:1px solid var(--line); vertical-align:top; white-space:nowrap; }
  .pur-grid thead th{ font-size:11px; color:var(--ink-faint); text-transform:uppercase; letter-spacing:0.4px; font-weight:700; text-align:right; }
  .pur-grid thead th:first-child{ text-align:left; }
  .pur-grid th[scope=row]{ text-align:left; font-weight:600; color:var(--ink); font-size:12.5px; text-transform:none; letter-spacing:0; position:sticky; left:0; background:var(--surface); z-index:1; min-width:165px; max-width:210px; white-space:normal; }
  .pur-grid tr.pur-child th[scope=row]{ padding-left:24px; font-weight:400; color:var(--ink-dim); }
  .pur-grid tr.pur-total th, .pur-grid tr.pur-total td{ border-top:2px solid var(--ink-faint); border-bottom:none; font-weight:700; }
  .pur-grid td.pur-sep, .pur-grid th.pur-sep{ border-left:1px solid var(--line); }
  .pur-c .pur-a{ font-variant-numeric:tabular-nums; font-weight:600; color:var(--ink); }
  .pur-c .pur-b{ font-size:11px; color:var(--ink-faint); font-variant-numeric:tabular-nums; }
  .pur-c .pur-d{ font-size:11px; font-variant-numeric:tabular-nums; color:var(--ink-dim); }
  .pur-over{ color:var(--clay) !important; }
  .pur-under{ color:var(--ts-green) !important; }
  .pur-future .pur-b{ font-style:italic; }
  .pur-acct{ font:inherit; color:inherit; background:none; border:none; padding:0; text-align:left; cursor:pointer; }
  .pur-acct:hover{ text-decoration:underline; }
  .pur-acct.on{ color:var(--moss); text-decoration:underline; }
  .pur-budtick{ stroke:var(--budget-blue); stroke-width:2.5; stroke-linecap:round; }
  .pur-fill-over{ fill:var(--clay-soft); }
  .pur-legend{ display:flex; flex-wrap:wrap; gap:6px 16px; font-size:12px; color:var(--ink-dim); margin:6px 0 2px; }
  .pur-legend span{ display:inline-flex; align-items:center; gap:6px; }
  .pur-legend i{ display:inline-block; width:12px; height:10px; border-radius:2px; }
  .pur-legend i.tick{ height:3px; border-radius:2px; background:var(--budget-blue); }
  /* vendor summary beside the bills list only when there is room for the whole bills table */
  .pur-two{ display:grid; grid-template-columns:minmax(0, 1fr); gap:0 14px; align-items:start; }
  @media (min-width: 1750px){ .pur-two{ grid-template-columns:minmax(0, 5fr) minmax(0, 8fr); } }
  .pur-vtable td{ white-space:nowrap; }
  .pur-vtable td.adm-wrap{ white-space:normal; }
  .pur-vrow td{ cursor:pointer; }
  .pur-vrow:hover td{ background:var(--chip-bg); }
  .pur-vrow.on td{ background:var(--chip-bg); font-weight:600; }
  .pur-vbtn{ font:inherit; color:inherit; background:none; border:none; padding:0; text-align:left; cursor:pointer; white-space:normal; }
  .pur-st{ display:inline-block; font-size:11px; font-weight:700; padding:1px 7px; border-radius:999px; border:1px solid currentColor; white-space:nowrap; }
  .pur-st.paid{ color:var(--ts-green); }
  .pur-st.partial{ color:var(--ts-amber); }
  .pur-st.open{ color:var(--ink-dim); }
  .pur-st.pastdue{ color:var(--ts-red); }
  .pur-bills-table td{ white-space:nowrap; }
  @media (max-width: 700px){ .pur-grid th[scope=row]{ min-width:140px; } }
  .rt-cardhead{ display:flex; flex-wrap:wrap; align-items:flex-end; justify-content:space-between; gap:10px 20px; margin-bottom:12px; }
  .rt-check{ display:inline-flex; align-items:center; gap:6px; font-size:12.5px; color:var(--ink-dim); cursor:pointer; }
  /* Step 208: "Compare with" -- any day with a save in the last 7 */
  .rt-compare{ display:inline-flex; align-items:center; gap:8px; font-size:12.5px; font-weight:600; color:var(--ink-dim); white-space:nowrap; max-width:100%; }
  .rt-compare select{ font-family:inherit; font-size:13px; font-weight:400; padding:5px 8px; border:1px solid var(--line); border-radius:6px; background:var(--surface); color:var(--ink); cursor:pointer; max-width:100%; }
  .rt-compare select:hover{ border-color:var(--moss-soft); }
  .rt-months, .rt-ranges{ display:flex; flex-wrap:wrap; gap:6px; }
  .rt-months{ margin-bottom:12px; }
  .rt-chip{ font-family:inherit; font-size:12px; padding:4px 10px; border:1px solid var(--line); border-radius:999px; background:var(--surface); color:var(--ink-dim); cursor:pointer; display:inline-flex; align-items:center; gap:6px; }
  .rt-chip:hover:not(:disabled){ border-color:var(--moss-soft); color:var(--ink); }
  .rt-chip.on{ border-color:var(--ink-dim); color:var(--ink); font-weight:600; }
  .rt-chip:disabled{ opacity:0.45; cursor:not-allowed; }
  .rt-key{ width:14px; height:3px; border-radius:2px; display:inline-block; }
  .rt-chart{ position:relative; width:100%; min-height:40px; }
  .rt-chart svg{ display:block; overflow:visible; }
  .rt-grid{ stroke:var(--line); stroke-width:1; opacity:0.7; }
  .rt-axis{ fill:var(--ink-faint); font-size:10.5px; font-family:'IBM Plex Mono',monospace; }
  .rt-endlabel{ fill:var(--ink-dim); font-size:11.5px; font-weight:600; }
  .rt-cross{ stroke:var(--ink-faint); stroke-width:1; stroke-dasharray:3 3; }
  .rt-tip{ position:absolute; z-index:4; background:var(--surface); border:1px solid var(--line); border-radius:8px; box-shadow:var(--shadow); padding:8px 10px; font-size:12px; pointer-events:none; min-width:150px; }
  .rt-tip-date{ color:var(--ink-faint); font-size:11px; margin-bottom:4px; }
  .rt-tip-row{ display:flex; flex-wrap:wrap; align-items:center; column-gap:6px; line-height:1.6; color:var(--ink); }
  .rt-tip-row > *{ white-space:nowrap; }
  .rt-tip-key{ width:12px; height:3px; border-radius:2px; display:inline-block; }
  .rt-tip-lab{ color:var(--ink-dim); } .rt-tip-ch{ font-size:11px; }
  .rt-note{ font-size:12px; color:var(--ink-faint); margin-top:8px; }
  .rt-h3{ font-size:13px; font-weight:700; margin:18px 0 6px; color:var(--ink); }
  .rt-small{ font-size:11px; white-space:nowrap; }
  /* Step 310: By Service & Month values open the tickets behind them */
  .rt-cell-btn{ font:inherit; background:none; border:none; padding:0; cursor:pointer; text-decoration:underline dotted var(--ink-faint); text-underline-offset:3px; }
  .rt-cell-btn:hover{ text-decoration-color:currentColor; }
  .rt-cell-btn:focus-visible{ outline:2px solid var(--moss-soft); outline-offset:2px; border-radius:2px; }
  .rt-svc-modal{ width:1060px; }
  .rt-svc-table td{ vertical-align:top; }
  .rt-svc-also{ white-space:nowrap; }
  .rt-svc-table{ width:100%; }
  .rt-svc-chg{ white-space:nowrap; }
  .rt-svc-phone{ display:none; }
  .rt-svc-other .rt-cardhead h2{ display:none; }
  .rt-svc-other .card-sub{ font-size:12px; color:var(--ink-faint); margin-bottom:10px; }
  @media (max-width:700px){
    .rt-svc-table .rt-svc-x, .rt-svc-table .rt-svc-s{ display:none; }
    .rt-svc-phone{ display:block; }
    .rt-svc-chg{ white-space:normal; min-width:110px; }
    .rt-svc-modal{ padding:18px 14px; }
  }
  .rt-grid.rt-zero-line{ stroke:var(--ink-faint); opacity:0.9; }
  /* Step 155: Tracking Sheet */
  .ts-table td{ vertical-align:middle; }
  /* Step 288 (2026-10-09, Hadley: "make the column headers in the tracking
     sheet freeze view when scrolling"). A plain sticky <th> can't float
     inside .tablewrap (its overflow-x makes it the scroll container -- see
     Step 108 above), so on a rep sub-tab the table scrolls in its own box
     instead: #ts-main is a column (toolbar, card), the card shrinks to the
     height left, and its .tablewrap scrolls both ways with the header row
     stuck to its top. The horizontal scrollbar stays in view too. A short
     table keeps its natural height. */
  #ts-main{ display:flex; flex-direction:column; }
  #ts-main > *{ flex:none; }
  #ts-main > .ts-main-card{ flex:0 1 auto; min-height:0; display:flex; flex-direction:column; }
  #ts-main > .ts-main-card > *{ flex:none; }
  #ts-main > .ts-main-card > .tablewrap{ flex:0 1 auto; min-height:0; overflow:auto; }
  #ts-main .ts-table thead th{ position:sticky; top:0; z-index:3; background:var(--surface); box-shadow:inset 0 -1px 0 var(--line); padding-top:6px; }
  /* sortable headers -- Tracking Sheet and (Step 173) Labor's Hourly Employees */
  th.ts-sortable{ cursor:pointer; user-select:none; white-space:normal; }
  th.ts-sortable:hover, th.ts-sortable:focus-visible{ color:var(--ink); outline:none; }
  th .ts-sort-arrow{ margin-left:4px; font-size:9px; opacity:0.35; }
  th.ts-sorted{ color:var(--ink); }
  th.ts-sorted .ts-sort-arrow{ opacity:1; color:var(--moss-soft); }
  .ts-table tr.ts-manual-row td{ background:color-mix(in srgb, var(--budget-blue) 9%, var(--surface)); }
  .ts-table tr.ts-manual-row{ outline:1.5px dashed var(--budget-blue); outline-offset:-2px; }
  .ts-table tr.ts-total-row td{ border-top:1.5px solid var(--line); font-weight:700; color:var(--ink); }
  .ts-field{ font:inherit; font-size:12.5px; padding:4px 6px; border:1px dashed transparent; border-bottom-color:var(--line); border-radius:4px; background:transparent; color:var(--ink); }
  .ts-field:hover{ border-color:var(--line); background:var(--surface); }
  .ts-field:focus{ outline:none; border:1px solid var(--moss-soft); background:var(--surface); }
  .ts-field::placeholder{ color:var(--ink-faint); font-style:italic; }
  .ts-btn{ font-size:11.5px; padding:5px 10px; border-radius:6px; border:1px solid var(--line); background:var(--surface); color:var(--ink-dim); cursor:pointer; white-space:nowrap; margin-left:4px; }
  .ts-btn:hover{ border-color:var(--moss-soft); color:var(--ink); }
  .ts-btn:disabled{ opacity:0.5; cursor:default; }
  .ts-btn-primary{ background:var(--moss); border-color:var(--moss); color:#F5F7EE; font-weight:600; margin-left:0; }
  .ts-btn-primary:hover{ color:#fff; }
  .ts-btn-quiet{ background:transparent; }
  @media (prefers-color-scheme: dark){ .ts-btn-primary, .ts-btn-primary:hover{ color:#131A15; } }
  .ts-right-btns .lp-side-toggle{ text-align:right; }
  /* Step 168: subtle status tones -- a faint tint plus a thin accent bar on the left edge */
  .ts-tone-green{ --ts-tone: var(--ts-green); }
  .ts-tone-amber{ --ts-tone: var(--ts-amber); }
  .ts-tone-purple{ --ts-tone: var(--ts-purple); }
  .ts-tone-red{ --ts-tone: var(--ts-red); }
  .ts-table tr.ts-tone td{ background:color-mix(in srgb, var(--ts-tone) 7%, var(--surface)); }
  .ts-table tr.ts-tone td:first-child{ box-shadow:inset 3px 0 0 var(--ts-tone); }
  .ts-table tr.ts-tone td:first-child > span:first-child{ color:color-mix(in srgb, var(--ts-tone) 75%, var(--ink)); }
  .ts-side-card.ts-tone{ background:color-mix(in srgb, var(--ts-tone) 8%, var(--chip-bg)); border-left:3px solid var(--ts-tone); }
  .ts-legend{ display:flex; flex-wrap:wrap; gap:14px; margin-top:12px; font-size:11px; color:var(--ink-faint); }
  .ts-legend span{ display:inline-flex; align-items:center; gap:5px; }
  .ts-legend i{ width:9px; height:9px; border-radius:2px; display:inline-block; }
  .ts-cwo-tag{ font-size:10.5px; font-weight:600; color:var(--gold); margin-top:2px; }
  /* Step 281: Tracking Sheet bid view toggle, kind tag, notes popups */
  .ts-seg{ display:inline-flex; border:1px solid var(--line); border-radius:8px; overflow:hidden; background:var(--surface); }
  .ts-seg-btn{ font:inherit; font-size:12.5px; font-weight:600; padding:6px 12px; border:none; border-right:1px solid var(--line); background:transparent; color:var(--ink-dim); cursor:pointer; white-space:nowrap; }
  .ts-seg-btn:last-child{ border-right:none; }
  .ts-seg-btn:hover:not(:disabled){ color:var(--ink); background:var(--chip-bg); }
  .ts-seg-btn.on{ background:var(--moss); color:#F5F7EE; }
  .ts-seg-btn:disabled{ opacity:0.45; cursor:not-allowed; }
  .ts-seg-btn:focus-visible{ outline:2px solid var(--moss-soft); outline-offset:-2px; }
  @media (prefers-color-scheme: dark){ .ts-seg-btn.on{ color:#131A15; } }
  @media (max-width: 760px){ .ts-seg-btn{ padding:6px 8px; font-size:11.5px; } }
  @media (max-width: 480px){ .ts-seg{ display:flex; width:100%; } .ts-seg-btn{ flex:1 1 0; white-space:normal; line-height:1.25; padding:6px 4px; } }   /* Step 284: fits a phone */
  .ts-seg-n{ font-weight:500; opacity:0.75; }
  .ts-kind-tag{ display:inline-block; margin-left:6px; font-size:10px; font-weight:700; letter-spacing:0.03em; padding:1px 6px; border-radius:8px; border:1px solid var(--line); color:var(--ink-dim); vertical-align:1px; white-space:nowrap; }
  .tsn-modal{ width:560px; }
  /* Step 313: Notes tab Tracking Sheet card */
  .nts-card{ padding:18px 22px; margin-bottom:14px; }
  .nts-card h2{ margin-bottom:6px; }
  .nts-h{ font-size:11px; font-weight:700; letter-spacing:0.5px; text-transform:uppercase; color:var(--ink-faint); margin:14px 0 6px; }
  .nts-row{ display:flex; flex-wrap:wrap; gap:8px 14px; align-items:center; justify-content:space-between; padding:9px 0; border-top:1px solid var(--line); }
  .nts-main{ flex:1 1 260px; min-width:0; }
  .nts-prop{ font-weight:700; font-size:13.5px; color:var(--ink); overflow-wrap:anywhere; }
  .nts-sub{ font-weight:400; font-size:12px; color:var(--ink-faint); }
  .nts-why{ font-size:12.5px; color:var(--ink-dim); margin-top:2px; }
  .nts-act{ display:flex; flex-wrap:wrap; gap:6px; align-items:center; }
  .nts-btn{ font:inherit; font-size:12.5px; font-weight:600; padding:5px 11px; border-radius:6px; border:1px solid var(--line); background:var(--surface); color:var(--ink); cursor:pointer; white-space:nowrap; }
  .nts-btn.nts-primary{ background:var(--moss); border-color:var(--moss); color:#F5F7EE; }
  .nts-btn.nts-quiet{ color:var(--ink-dim); }
  .nts-btn:disabled{ opacity:0.6; cursor:progress; }
  .nts-btn:focus-visible, .nts-rep:focus-visible{ outline:2px solid var(--moss-soft); outline-offset:2px; }
  @media (prefers-color-scheme: dark){ .nts-btn.nts-primary{ color:#131A15; } }
  .nts-rep, .nts-form input{ font:inherit; font-size:12.5px; padding:5px 6px; border:1px solid var(--line); border-radius:6px; background:var(--surface); color:var(--ink); max-width:100%; }
  .nts-form{ display:flex; flex-wrap:wrap; gap:6px; align-items:center; margin-top:10px; }
  .nts-form input{ flex:1 1 240px; min-width:0; }
  .nts-note{ font-size:12px; color:var(--ink-faint); margin-top:6px; }
  .nts-more{ margin-top:14px; }
  .nts-more summary{ cursor:pointer; font-size:13px; font-weight:600; color:var(--ink-dim); }
  .nts-row-quiet .nts-prop{ font-weight:600; }
  .nts-none{ font-size:13px; color:var(--ink-dim); }
  .nts-msg{ font-size:12.5px; padding:6px 10px; border-radius:6px; border:1px solid var(--line); margin:6px 0; }
  .nts-msg.ok{ color:var(--ts-green); } .nts-msg.bad{ color:var(--ts-red); }
  /* Step 313: Tracking Sheet rows moved to a rep by hand */
  .ts-moved-tag{ font-size:10.5px; font-weight:600; color:var(--budget-blue); margin-top:2px; }
  /* Step 285: Notes tab Update dashboard bar */
  .notes-upd-btn{ font:inherit; font-size:13px; font-weight:600; padding:7px 14px; border-radius:6px; border:1px solid var(--line); background:var(--surface); color:var(--ink); cursor:pointer; white-space:nowrap; }
  .notes-upd.pending .notes-upd-btn{ background:var(--moss); border-color:var(--moss); color:#F5F7EE; }
  .notes-upd.pending{ border-color:var(--moss-soft); }
  .notes-upd-btn[aria-disabled=true]{ opacity:0.6; cursor:progress; }
  .notes-upd-btn:focus-visible{ outline:2px solid var(--moss-soft); outline-offset:2px; }
  @media (prefers-color-scheme: dark){ .notes-upd.pending .notes-upd-btn{ color:#131A15; } }
  .tsn-label{ font-size:11px; font-weight:700; letter-spacing:0.5px; text-transform:uppercase; color:var(--ink-faint); margin:14px 0 6px; }
  .tsn-opts{ display:flex; flex-direction:column; gap:4px; max-height:240px; overflow:auto; padding:2px; }
  .tsn-opt{ display:flex; align-items:center; gap:8px; font-size:13px; color:var(--ink); cursor:pointer; }
  .tsn-other-row input[type=text]{ flex:1; min-width:120px; font:inherit; font-size:13px; padding:4px 6px; border:1px solid var(--line); border-radius:5px; background:var(--surface); color:var(--ink); }
  #tsn-text{ width:100%; box-sizing:border-box; font:inherit; font-size:13px; padding:8px; border:1px solid var(--line); border-radius:6px; background:var(--surface); color:var(--ink); resize:vertical; }
  .tsn-err{ color:var(--clay); font-size:12px; min-height:16px; margin-top:4px; }
  .tsn-muted{ font-size:12px; color:var(--ink-faint); }
  .tsn-list{ display:flex; flex-direction:column; gap:10px; margin-top:12px; }
  .tsn-note{ border:1px solid var(--line); border-radius:8px; padding:10px 12px; }
  .tsn-note-head{ display:flex; align-items:center; gap:10px; flex-wrap:wrap; }
  .tsn-note-head .tsn-acts{ margin-left:auto; display:inline-flex; gap:6px; }   /* Step 286: Edit + Delete */
  .tsn-editing{ border-color:var(--moss-soft); }
  #tsn-e-text{ width:100%; box-sizing:border-box; font:inherit; font-size:13px; padding:8px; border:1px solid var(--line); border-radius:6px; background:var(--surface); color:var(--ink); resize:vertical; }
  .tsn-tag{ font-size:11px; font-weight:700; padding:2px 8px; border-radius:10px; background:color-mix(in srgb, var(--moss) 14%, var(--surface)); color:var(--moss); }
  .tsn-tag.general{ background:var(--chip-bg); color:var(--ink-dim); }
  .tsn-note-text{ margin-top:6px; font-size:13px; color:var(--ink); white-space:pre-wrap; overflow-wrap:anywhere; }
  /* Step 279: Tracking Sheet Combined sub-tab */
  .tsc-table th, .tsc-table td{ white-space:nowrap; }
  .tsc-n{ font-size:10.5px; color:var(--ink-faint); font-weight:400; }
  .tsc-dot{ display:inline-block; width:8px; height:8px; border-radius:2px; margin-right:5px; vertical-align:0; }
  .tsc-bar{ display:flex; height:6px; border-radius:3px; overflow:hidden; margin-top:6px; max-width:220px; background:var(--chip-bg); }
  .tsc-bar span{ display:block; height:100%; }
  .tsc-rep{ font:inherit; font-weight:700; color:var(--ink); background:none; border:none; padding:0; cursor:pointer; }
  .tsc-rep:hover{ text-decoration:underline; color:var(--moss); }
  .ts-you{ font-size:9.5px; font-weight:700; text-transform:uppercase; letter-spacing:0.05em; padding:1px 5px; border-radius:8px; background:var(--gold); color:#fff; margin-left:2px; }
  .ts-side-card{ background:var(--chip-bg); border:1px solid var(--line); border-radius:8px; padding:10px 12px; margin-bottom:8px; }
  .ts-side-card .ts-btn{ margin-left:0; }
  /* Step 152: LP Install side-menu toggles show "Click to expand/collapse" */
  .lp-side-toggle .lp-toggle-hint{ font-weight:500; font-size:11.5px; color:var(--ink-faint); margin:0 8px; }
  .lp-side-toggle .lp-toggle-chev{ font-size:11px; }
  .lp-side-toggle.is-open{ border-color:var(--gold) !important; background:var(--chip-bg) !important; }
  .lp-side-toggle:hover .lp-toggle-hint{ color:var(--ink-dim); }
  /* keyed to the toolbar's OWN width (it narrows when the side panels are open), not the window's */
  .lp-toolbar{ container-type:inline-size; }
  @container (max-width:900px){ .lp-side-toggle .lp-toggle-word{ display:none; } .lp-side-toggle .lp-toggle-hint{ margin:0 4px; } }
  td{ padding:8px 10px; border-bottom:1px solid var(--line); color:var(--ink-dim); }
  tr:last-child td{ border-bottom:none; }
  td.svc{ color:var(--ink); font-weight:600; }
  .margin-pill{ display:inline-block; padding:2px 7px; border-radius:20px; font-size:11px; font-weight:600; font-family:'IBM Plex Mono',monospace; }
  .margin-pill.hi{ background:rgba(46,74,52,0.12); color:var(--moss-soft); }
  .margin-pill.mid{ background:rgba(201,127,30,0.14); color:var(--gold); }
  .margin-pill.lo{ background:rgba(178,84,54,0.14); color:var(--clay); }
  .svc-pill{ display:inline-block; padding:2px 9px; border-radius:20px; font-size:11px; font-weight:600; white-space:nowrap; }
  .status-pill{ display:inline-block; padding:2px 9px; border-radius:20px; font-size:11px; font-weight:600; background:rgba(46,74,52,0.12); color:var(--moss-soft); white-space:nowrap; }
  .status-pill.run{ background:rgba(201,127,30,0.14); color:var(--gold); }
  .job-box{ background:var(--chip-bg); border:1px solid var(--line); border-radius:10px; padding:16px 18px; margin-bottom:14px; }
  .job-box:last-child{ margin-bottom:0; }
  .job-box-title{ font-size:11px; font-weight:700; text-transform:uppercase; letter-spacing:0.6px; color:var(--ink-faint); }
  .job-box-sub{ font-size:11.5px; color:var(--ink-faint); margin-top:2px; margin-bottom:12px; font-family:'IBM Plex Mono',monospace; }
  .footnote{ background:var(--surface); border:1px solid var(--line); border-left:3px solid var(--moss-soft); border-radius:8px;
    padding:14px 18px; font-size:12.5px; color:var(--ink-dim); line-height:1.6; margin-top:22px; }
  .footnote code{ font-family:'IBM Plex Mono',monospace; font-size:11.5px; background:var(--chip-bg); padding:1px 5px; border-radius:3px; }
  .load-error{ background:var(--surface); border:1px solid var(--clay-soft); border-left:3px solid var(--clay); border-radius:8px;
    padding:14px 18px; font-size:13px; color:var(--ink-dim); line-height:1.6; margin-bottom:14px; }
  .load-error strong{ color:var(--clay); }
  .tab-panel[hidden]{ display:none; }
  /* Background tab loading (2026-09-17, Step 74) -- shown in a tab's
     panel from the moment the page loads until that tab's own
     google.script.run call to getTabData() comes back, since every
     tab but the first now loads after the page is already up rather
     than before it. */
  .tab-loading{ display:flex; align-items:center; gap:10px; padding:40px 18px;
    font-family:'IBM Plex Mono',monospace; font-size:12.5px; color:var(--ink-faint); letter-spacing:0.02em; }
  .tab-loading::before{ content:''; width:14px; height:14px; border-radius:50%; flex-shrink:0;
    border:2px solid var(--line); border-top-color:var(--moss-soft); animation:tabLoadingSpin 0.8s linear infinite; }
  @keyframes tabLoadingSpin{ to{ transform:rotate(360deg); } }
  /* Customers / Garden Center (2026-09-17, Step 71) -- split list+detail
     layout, matching the live team dashboard's own Customers tab feel
     (a left-hand client list, click to open a detail panel) per
     Hadley's request, rebuilt against this dashboard's own design
     system rather than copied wholesale. */
  .split-shell{ display:grid; grid-template-columns:300px 1fr; gap:14px; align-items:start; }
  .split-list{ background:var(--surface); border:1px solid var(--line); border-radius:10px; box-shadow:var(--shadow); display:flex; flex-direction:column; height:720px; overflow:hidden; }
  .split-list-search{ padding:12px 14px; border-bottom:1px solid var(--line); flex-shrink:0; }
  .split-list-search input{ width:100%; padding:8px 10px; border:1px solid var(--line); border-radius:8px; font-size:13px; font-family:inherit; background:var(--chip-bg); color:var(--ink); outline:none; }
  .split-list-meta{ padding:6px 14px; font-size:11px; color:var(--ink-faint); border-bottom:1px solid var(--line); display:flex; align-items:center; justify-content:space-between; flex-shrink:0; }
  .split-list-meta select{ font-size:11px; font-family:inherit; border:1px solid var(--line); border-radius:5px; padding:2px 6px; background:var(--surface); color:var(--ink); }
  .split-list-items{ overflow-y:auto; flex:1; }
  .split-list-row{ padding:10px 14px; border-bottom:1px solid var(--line); cursor:pointer; display:flex; justify-content:space-between; align-items:center; gap:8px; transition:background 0.1s; }
  .split-list-row:hover{ background:var(--chip-bg); }
  .split-list-row.active{ background:var(--chip-bg); }
  .split-list-name{ font-size:13px; font-weight:600; color:var(--ink); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; display:flex; align-items:center; gap:5px; max-width:170px; }
  .split-list-sub{ font-size:11px; color:var(--ink-faint); margin-top:2px; }
  .split-list-val{ font-size:12px; font-weight:700; font-family:'IBM Plex Mono',monospace; color:var(--moss-soft); white-space:nowrap; }
  .split-detail{ background:var(--surface); border:1px solid var(--line); border-radius:10px; box-shadow:var(--shadow); padding:26px 28px; height:720px; overflow-y:auto; }
  .split-detail-empty{ display:flex; align-items:center; justify-content:center; height:100%; color:var(--ink-faint); font-size:13px; text-align:center; }
  .shared-badge{ display:inline-flex; align-items:center; gap:7px; background:var(--chip-bg); border:1px solid var(--moss-soft); color:var(--moss-soft); padding:7px 14px; border-radius:20px; font-size:12.5px; font-weight:600; cursor:pointer; font-family:inherit; margin-bottom:16px; }
  .shared-panel{ background:var(--chip-bg); border:1px solid var(--line); border-radius:10px; padding:16px 18px; margin-bottom:18px; }
  @media (max-width:760px){ .split-shell{ grid-template-columns:1fr; } .split-list{ height:360px; } }
  /* Revenue Map (2026-09-17, Step 71) -- reuses the live team
     dashboard's own proven approach (Leaflet.js + Leaflet.draw, free
     Esri tiles, point-in-polygon selection + CSV export) rather than
     inventing a new one -- see database-plan.md Step 71. */
  .map-shell{ position:relative; height:640px; border:1px solid var(--line); border-radius:10px; overflow:hidden; box-shadow:var(--shadow); background:var(--surface); }
  /* z-index 1000+ and the top:80px offset on .map-year-filter are deliberate:
     Leaflet's own default zoom control sits top-left at z-index 1000, and
     Leaflet.draw's toolbar sits top-right -- without this our panels would
     visually collide with (and sit under, hence be unclickable behind)
     those controls. Caught during Playwright verification, Step 71. */
  .map-year-filter{ position:absolute; background:var(--surface); border:1px solid var(--line); border-radius:8px; padding:12px 14px; box-shadow:var(--shadow); font-size:12px; z-index:1000; color:var(--ink-dim); }
  .map-year-filter{ top:80px; left:12px; }
  .map-year-all{ display:flex; align-items:center; gap:5px; margin-bottom:8px; color:var(--ink-faint); white-space:nowrap; }
  .map-year-all button{ font-family:inherit; font-size:11px; font-weight:600; padding:0; border:0; background:none; color:var(--moss); cursor:pointer; }
  .map-year-all button:hover{ text-decoration:underline; }
  .map-year-all button:disabled{ color:var(--ink-faint); cursor:default; text-decoration:none; }
  .map-selection-panel{ position:absolute; bottom:12px; right:12px; max-height:70%; width:260px; background:var(--surface); border:1px solid var(--line); border-radius:10px; box-shadow:var(--shadow); z-index:1000; overflow:hidden; }
  .map-bubble-tooltip{ font-family:'Source Sans 3', system-ui, sans-serif !important; }
  /* Value labels above each bar in makeGoalSignedChart() (Sales Goal vs
     Signed, Leads, and the per-rep expand chart all share this). Base
     rule matches the old inline style exactly; the media query below
     is the fix for narrow screens -- see the max-width:700px block. */
  .chart-bar-label{ font-size:11px; font-weight:700; line-height:1; text-align:center; white-space:nowrap; }
  /* Step 179: Actual-so-far label on a month that also shows Expected --
     above the solid part, or inside its top when there's no room. */
  .chart-actual-label{ position:absolute; left:0; right:0; bottom:calc(var(--a) + 2px); color:var(--c); }
  .chart-actual-label.tight-wide{ bottom:auto; top:calc(100% - var(--a) + 3px); color:var(--surface); }
  @media (max-width:860px){ .grid, .grid-even{ grid-template-columns:1fr; } .kpis{ grid-template-columns:1fr 1fr; } .barrow{ grid-template-columns:96px 1fr 76px; } }
  @media (max-width:460px){ .kpis{ grid-template-columns:1fr; } .kpis.kpis-2{ grid-template-columns:1fr; } }
  /* Once the Sales/Leads charts stack to one column (<860px above),
     each chart still has to fit 12 months x 2 bars in whatever width
     is left. A value label like "516k" is one unbreakable token, and
     flex items refuse to shrink narrower than their content by
     default (min-width:auto) -- so at common phone/narrow-window
     widths the chart's true minimum width (~776px for 12 months of
     6-figure dollar labels) blows way past what's actually available
     (~389px), and the whole chart overflows off the right edge rather
     than compressing, which is what was happening. Shrinking the font
     alone can't close a gap that size, so below 700px the labels flip
     to vertical instead -- each one then only needs about one
     character's width, not four to six, which comfortably fits. */
  @media (max-width:700px){
    .chart-bar-label{ font-size:8px; writing-mode:vertical-rl; text-orientation:upright; letter-spacing:-3px; }
    .chart-actual-label.tight-wide{ top:auto; bottom:calc(var(--a) + 2px); color:var(--c); }
    .chart-actual-label.tight-narrow{ bottom:auto; top:calc(100% - var(--a) + 3px); color:var(--surface); }
    .chart-actual-label{ display:flex; justify-content:center; }
  }
  /* makeGoalSignedChart()'s plot area used a flat height:220px
     regardless of width -- fine at desktop width (a wide, short-ish
     chart) but on a narrow phone screen, shrinking only the width and
     not the height turns each bar into a tall, skinny column (Hadley:
     "comically skinny"). --chart-h-cap caps that height at narrower
     widths; makeGoalSignedChart uses height:min(<passed-in-height>,
     var(--chart-h-cap)) so it's still the caller's height above the
     cap, and the cap below it. Bar heights inside are percentages of
     this same container (not fixed px), so they rescale automatically
     with it -- no JS involved in the resize itself.
     Originally capped much shorter here (160/130px) to avoid a tall
     chart on a narrow screen -- but that was before the chart also got
     horizontal scrolling (see makeGoalSignedChart's overflow-x:auto
     wrapper). Width is no longer the constraint it was, so per Hadley
     there's no more reason to squash the height this hard too -- keep
     it close to the desktop height instead. */
  :root{ --chart-h-cap: 9999px; }
  @media (max-width:700px){ :root{ --chart-h-cap: 240px; } }
  @media (max-width:460px){ :root{ --chart-h-cap: 220px; } }
  /* How much of the chart's height each bar's value label reserves for
     itself, so the bar below it can be sized against the space that's
     actually left rather than the full column (see the long comment on
     that calc() in makeGoalSignedChart -- this is the other half of
     that fix). Horizontal labels are one short line; rotated
     (vertical-rl, below 700px -- see .chart-bar-label above) labels
     need much more room since they stack character-by-character. */
  :root{ --bar-label-reserve: 14px; }
  @media (max-width:700px){ :root{ --bar-label-reserve: 40px; } }
