/* /Components/Layout/MainLayout.razor.rz.scp.css */
.app[b-i18pzlogrz]{
    display:grid;
    grid-template-columns:300px 1fr;
    min-height:100vh;
    background:var(--bg);
    transition:grid-template-columns .16s ease;
}
/* COLLAPSED NAVIGATION — an app-wide state, set on <html> by js/nav.js.
   68px is the icon rail: an 18px glyph inside the sidebar's own 1.12 zoom, centred, with enough
   padding either side to stay a comfortable click target. Everything the rail hides is still in
   the DOM and still reachable — see NavMenu.razor.css. */
html.nav-collapsed .app[b-i18pzlogrz]{grid-template-columns:68px 1fr;}
@media(prefers-reduced-motion:reduce){.app[b-i18pzlogrz]{transition:none;}}
.side[b-i18pzlogrz]{
    background:var(--surface);
    border-right:1px solid var(--line);
    position:sticky;
    top:0;
    height:100vh;
    overflow:auto;
}
.main[b-i18pzlogrz]{min-width:0;}
.content[b-i18pzlogrz]{
    max-width:1240px;
    margin:0 auto;
    padding:30px 26px 70px;
    zoom:1.15;              /* guaranteed uniform enlargement of ALL page content (Leon: bigger) */
}
@media(max-width:820px){
    /* The phone layout stacks the nav above the content, so there is no side column to reclaim —
       the collapsed state is switched off entirely rather than producing a 68px stripe. */
    .app[b-i18pzlogrz],html.nav-collapsed .app[b-i18pzlogrz]{grid-template-columns:1fr;}
    .side[b-i18pzlogrz]{position:static;height:auto;border-right:0;border-bottom:1px solid var(--line);}
}

#blazor-error-ui[b-i18pzlogrz]{
    display:none;
    position:fixed;bottom:0;left:0;right:0;
    background:var(--red-bg);color:var(--red);
    border-top:1px solid var(--red);
    padding:10px 16px;font-size:13px;font-weight:600;z-index:60;
}
#blazor-error-ui .reload[b-i18pzlogrz]{color:var(--red);font-weight:800;margin-left:8px;}
#blazor-error-ui .dismiss[b-i18pzlogrz]{cursor:pointer;float:right;}

/* ══ SCORECARD FOCUS WORKSPACE ═════════════════════════════════════════════════════════════════
   An APPLICATION-level takeover, not the browser Fullscreen API: the address bar, tabs and back
   button all stay. Two things change, and between them they are the whole feature —

     1. the navigation column goes, and
     2. the content's reading-width cap goes.

   (2) is the one that actually matters. 1240px is the right measure for prose; on a management grid
   it was throwing away ~170px at 1920 and every one of those pixels is a week column. Set on <html>
   by js/scorecardfit.js so the meeting room can later launch the same workspace over its own
   navigation without either page owning an overlay. */
/* ⚠ ONE COLUMN, NOT "0 1fr". With the sidebar display:none'd there is only ONE grid item left, so
   a two-column template puts .main in the ZERO-width first column and the grid pane measures 0 —
   which made the fit calculation fall back to a single week and stacked every frozen summary column
   on top of the others. Collapsing the template to a single track is the fix. */
html.sc-focus .app[b-i18pzlogrz] { grid-template-columns: 1fr; }
html.sc-focus .side[b-i18pzlogrz] { display: none; }
html.sc-focus .content[b-i18pzlogrz] { max-width: none; padding: 12px 16px 40px; }
/* /Components/Layout/NavMenu.razor.rz.scp.css */
.brand[b-rr2rwh9xoq]{
    display:flex;align-items:center;gap:11px;
    padding:20px 18px 18px;border-bottom:1px solid var(--line);
}
.brand .mark-img[b-rr2rwh9xoq]{
    width:34px;height:34px;border-radius:9px;flex:none;display:block;
}
.brand .name[b-rr2rwh9xoq]{font-weight:800;font-size:20px;letter-spacing:-.01em;color:var(--ink);}
.brand .pag[b-rr2rwh9xoq]{display:block;height:22px;width:auto;max-width:100%;margin-top:5px;object-fit:contain;}
/* Text stand-in when a tenant has no LogoUrl (the normal state for a new tenant). Occupies the
   same slot as the logo so the sidebar does not reflow. */
.brand .pag-name[b-rr2rwh9xoq]{display:block;margin-top:5px;font-size:13px;font-weight:700;line-height:22px;
  color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;}

.brand[b-rr2rwh9xoq],.nav[b-rr2rwh9xoq],.foot[b-rr2rwh9xoq]{zoom:1.12;}   /* match the content enlargement (Leon: bigger) */
.nav[b-rr2rwh9xoq]{display:flex;flex-direction:column;padding:12px 10px;gap:2px;}
[b-rr2rwh9xoq] .link{
    display:flex;align-items:center;gap:11px;
    padding:10px 12px;border-radius:9px;
    color:var(--muted);font-weight:600;font-size:18px;text-decoration:none;
}
[b-rr2rwh9xoq] .link:hover{background:var(--surface2);color:var(--ink);}
[b-rr2rwh9xoq] .link.active{background:var(--accent-soft);color:var(--accent);}
[b-rr2rwh9xoq] .link .ic{width:18px;text-align:center;font-size:15.5px;}

.foot[b-rr2rwh9xoq]{margin-top:auto;padding:16px 18px;border-top:1px solid var(--line);}
.foot .q[b-rr2rwh9xoq]{font-size:13px;color:var(--muted);font-style:italic;line-height:1.5;}

/* ══ THE COLLAPSE TOGGLE ═══════════════════════════════════════════════════════════════════════
   Sits above the brand and stays in the same place in both states, so the control that changes the
   sidebar does not itself move when it is used. */
.navtoggle[b-rr2rwh9xoq]{
    position:absolute;top:10px;right:8px;z-index:2;
    width:26px;height:26px;padding:0;
    display:flex;align-items:center;justify-content:center;
    background:var(--surface);border:1px solid var(--line);border-radius:8px;
    color:var(--muted);cursor:pointer;line-height:1;
}
.navtoggle:hover[b-rr2rwh9xoq],.navtoggle:focus-visible[b-rr2rwh9xoq]{color:var(--accent);border-color:var(--accent);}
.navtoggle-ic[b-rr2rwh9xoq]{font-size:12px;display:block;transition:transform .16s ease;}
html.nav-collapsed .navtoggle[b-rr2rwh9xoq]{right:auto;left:50%;transform:translateX(-50%);}
html.nav-collapsed .navtoggle-ic[b-rr2rwh9xoq]{transform:rotate(180deg);}
@media(prefers-reduced-motion:reduce){.navtoggle-ic[b-rr2rwh9xoq]{transition:none;}}

/* ══ THE COLLAPSED RAIL ════════════════════════════════════════════════════════════════════════
   ⚠ CLIPPED, NOT REMOVED. Every label keeps its box in the accessibility tree — display:none would
   take the seven link names away from a screen reader as well as from the eye, and the point of the
   rail is to save WIDTH, not to publish less navigation. */
html.nav-collapsed .lbl[b-rr2rwh9xoq],
html.nav-collapsed .brandtext[b-rr2rwh9xoq],
html.nav-collapsed .whoami[b-rr2rwh9xoq],
html.nav-collapsed .foot .q[b-rr2rwh9xoq]{
    position:absolute;width:1px;height:1px;margin:-1px;padding:0;
    overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0;
}
html.nav-collapsed .brand[b-rr2rwh9xoq]{
    padding:44px 0 14px;justify-content:center;gap:0;
}
html.nav-collapsed .nav[b-rr2rwh9xoq]{padding:12px 8px;}
html.nav-collapsed .nav[b-rr2rwh9xoq]  .link{justify-content:center;gap:0;padding:10px 0;}
html.nav-collapsed .nav[b-rr2rwh9xoq]  .link .ic{width:auto;font-size:17px;}
html.nav-collapsed .foot[b-rr2rwh9xoq]{padding:12px 8px;}
html.nav-collapsed .foot[b-rr2rwh9xoq]  .signout{text-align:center !important;justify-content:center;}

/* The phone layout stacks the nav above the content — there is no side column to reclaim, so the
   control that reclaims it does not belong on screen. */
@media(max-width:820px){.navtoggle[b-rr2rwh9xoq]{display:none;}}
/* /Components/Layout/ReconnectModal.razor.rz.scp.css */
.components-reconnect-first-attempt-visible[b-tu62m4w34a],
.components-reconnect-repeated-attempt-visible[b-tu62m4w34a],
.components-reconnect-failed-visible[b-tu62m4w34a],
.components-pause-visible[b-tu62m4w34a],
.components-resume-failed-visible[b-tu62m4w34a],
.components-rejoining-animation[b-tu62m4w34a] {
    display: none;
}

#components-reconnect-modal.components-reconnect-show .components-reconnect-first-attempt-visible[b-tu62m4w34a],
#components-reconnect-modal.components-reconnect-show .components-rejoining-animation[b-tu62m4w34a],
#components-reconnect-modal.components-reconnect-paused .components-pause-visible[b-tu62m4w34a],
#components-reconnect-modal.components-reconnect-resume-failed .components-resume-failed-visible[b-tu62m4w34a],
#components-reconnect-modal.components-reconnect-retrying[b-tu62m4w34a],
#components-reconnect-modal.components-reconnect-retrying .components-reconnect-repeated-attempt-visible[b-tu62m4w34a],
#components-reconnect-modal.components-reconnect-retrying .components-rejoining-animation[b-tu62m4w34a],
#components-reconnect-modal.components-reconnect-failed[b-tu62m4w34a],
#components-reconnect-modal.components-reconnect-failed .components-reconnect-failed-visible[b-tu62m4w34a] {
    display: block;
}


#components-reconnect-modal[b-tu62m4w34a] {
    background-color: white;
    width: 20rem;
    margin: 20vh auto;
    padding: 2rem;
    border: 0;
    border-radius: 0.5rem;
    box-shadow: 0 3px 6px 2px rgba(0, 0, 0, 0.3);
    opacity: 0;
    transition: display 0.5s allow-discrete, overlay 0.5s allow-discrete;
    animation: components-reconnect-modal-fadeOutOpacity-b-tu62m4w34a 0.5s both;
    &[open]

{
    animation: components-reconnect-modal-slideUp-b-tu62m4w34a 1.5s cubic-bezier(.05, .89, .25, 1.02) 0.3s, components-reconnect-modal-fadeInOpacity-b-tu62m4w34a 0.5s ease-in-out 0.3s;
    animation-fill-mode: both;
}

}

#components-reconnect-modal[b-tu62m4w34a]::backdrop {
    background-color: rgba(0, 0, 0, 0.4);
    animation: components-reconnect-modal-fadeInOpacity-b-tu62m4w34a 0.5s ease-in-out;
    opacity: 1;
}

@keyframes components-reconnect-modal-slideUp-b-tu62m4w34a {
    0% {
        transform: translateY(30px) scale(0.95);
    }

    100% {
        transform: translateY(0);
    }
}

@keyframes components-reconnect-modal-fadeInOpacity-b-tu62m4w34a {
    0% {
        opacity: 0;
    }

    100% {
        opacity: 1;
    }
}

@keyframes components-reconnect-modal-fadeOutOpacity-b-tu62m4w34a {
    0% {
        opacity: 1;
    }

    100% {
        opacity: 0;
    }
}

.components-reconnect-container[b-tu62m4w34a] {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 1rem;
}

#components-reconnect-modal p[b-tu62m4w34a] {
    margin: 0;
    text-align: center;
}

#components-reconnect-modal button[b-tu62m4w34a] {
    border: 0;
    background-color: #6b9ed2;
    color: white;
    padding: 4px 24px;
    border-radius: 4px;
}

    #components-reconnect-modal button:hover[b-tu62m4w34a] {
        background-color: #3b6ea2;
    }

    #components-reconnect-modal button:active[b-tu62m4w34a] {
        background-color: #6b9ed2;
    }

.components-rejoining-animation[b-tu62m4w34a] {
    position: relative;
    width: 80px;
    height: 80px;
}

    .components-rejoining-animation div[b-tu62m4w34a] {
        position: absolute;
        border: 3px solid #0087ff;
        opacity: 1;
        border-radius: 50%;
        animation: components-rejoining-animation-b-tu62m4w34a 1.5s cubic-bezier(0, 0.2, 0.8, 1) infinite;
    }

        .components-rejoining-animation div:nth-child(2)[b-tu62m4w34a] {
            animation-delay: -0.5s;
        }

@keyframes components-rejoining-animation-b-tu62m4w34a {
    0% {
        top: 40px;
        left: 40px;
        width: 0;
        height: 0;
        opacity: 0;
    }

    4.9% {
        top: 40px;
        left: 40px;
        width: 0;
        height: 0;
        opacity: 0;
    }

    5% {
        top: 40px;
        left: 40px;
        width: 0;
        height: 0;
        opacity: 1;
    }

    100% {
        top: 0px;
        left: 0px;
        width: 80px;
        height: 80px;
        opacity: 0;
    }
}
/* /Components/Pages/L10Room.razor.rz.scp.css */
/* L10 meeting room — ported from the mockup, scoped, at the 18px readability scale. */
.app[b-99zp0kbjkb]{display:grid;grid-template-columns:320px 1fr;min-height:100vh;background:var(--bg);color:var(--ink);zoom:1.12;}
.rail[b-99zp0kbjkb]{background:var(--surface);border-right:1px solid var(--line);padding:20px 16px;position:sticky;top:0;align-self:start;height:100vh;overflow:auto;}
.mt[b-99zp0kbjkb]{font-size:15px;color:var(--muted);font-weight:700;line-height:1.4;}
.mt b[b-99zp0kbjkb]{color:var(--ink);font-size:17px;display:block;letter-spacing:-.01em;}
.exit[b-99zp0kbjkb]{display:inline-block;margin-bottom:12px;color:var(--muted);text-decoration:none;font-size:15px;font-weight:700;}
.exit:hover[b-99zp0kbjkb]{color:var(--accent);}

.timer[b-99zp0kbjkb]{margin:14px 0;padding:14px;border:1px solid var(--line);border-radius:12px;background:var(--surface2);text-align:center;}
.timer .now[b-99zp0kbjkb]{font-size:15px;text-transform:uppercase;letter-spacing:.1em;color:var(--muted);font-weight:800;}
.timer .clock[b-99zp0kbjkb]{font-family:var(--mono);font-size:34px;font-weight:800;letter-spacing:-.02em;margin:4px 0 2px;font-variant-numeric:tabular-nums;}
.timer .clock.danger[b-99zp0kbjkb]{color:var(--red);}
.timer .budget[b-99zp0kbjkb]{font-size:15px;color:var(--muted);}
.timer .bar[b-99zp0kbjkb]{height:6px;border-radius:99px;background:var(--line);overflow:hidden;margin-top:9px;}
.timer .fill[b-99zp0kbjkb]{height:100%;background:var(--accent);border-radius:99px;transition:width .5s linear;}
.timer .fill.over[b-99zp0kbjkb]{background:var(--red);}

.agenda[b-99zp0kbjkb]{display:flex;flex-direction:column;gap:4px;margin-top:6px;}
.ag[b-99zp0kbjkb]{display:flex;align-items:center;gap:9px;padding:10px 10px;border-radius:10px;cursor:pointer;border:1px solid transparent;text-align:left;background:transparent;color:inherit;font-family:inherit;width:100%;}
.ag:hover[b-99zp0kbjkb]{background:var(--surface2);}
.ag.on[b-99zp0kbjkb]{background:var(--accent-soft);border-color:color-mix(in srgb,var(--accent) 35%,transparent);}
.ag .num[b-99zp0kbjkb]{width:22px;height:22px;border-radius:50%;background:var(--surface2);color:var(--muted);font-size:15px;font-weight:800;display:flex;align-items:center;justify-content:center;flex:none;font-family:var(--mono);}
.ag.on .num[b-99zp0kbjkb]{background:var(--accent);color:#fff;}
.ag.done .num[b-99zp0kbjkb]{background:var(--green);color:#fff;}
.ag .lab[b-99zp0kbjkb]{flex:1;font-size:16.5px;font-weight:700;line-height:1.2;}
.ag .min[b-99zp0kbjkb]{font-size:15px;color:var(--muted);font-family:var(--mono);}
.rtag[b-99zp0kbjkb]{font-size:15px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;padding:2px 5px;border-radius:5px;margin-left:6px;display:inline-block;}
.r-review[b-99zp0kbjkb]{background:var(--accent-soft);color:var(--accent);} .r-measure[b-99zp0kbjkb]{background:var(--amber-bg);color:var(--amber);} .r-decide[b-99zp0kbjkb]{background:var(--green-bg);color:var(--green);}
.prev[b-99zp0kbjkb]{margin-top:18px;padding:13px;border:1px dashed var(--line);border-radius:12px;font-size:15px;color:var(--muted);}
.prev b[b-99zp0kbjkb]{color:var(--ink);}
.live[b-99zp0kbjkb]{display:flex;align-items:center;gap:7px;margin-top:14px;font-size:15px;color:var(--muted);font-weight:700;}
.live .pip[b-99zp0kbjkb]{width:9px;height:9px;border-radius:50%;background:var(--green);box-shadow:0 0 0 3px var(--green-bg);}

.main[b-99zp0kbjkb]{padding:26px 32px 100px;max-width:1320px;}
.sec-head[b-99zp0kbjkb]{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:4px;}
.sec-head h1[b-99zp0kbjkb]{font-size:31px;font-weight:800;letter-spacing:-.02em;margin:0;}
.sec-head .min[b-99zp0kbjkb]{font-family:var(--mono);color:var(--muted);font-size:17.5px;}
.sec-sub[b-99zp0kbjkb]{color:var(--muted);font-size:17.5px;margin:0 0 20px;}
.navbtns[b-99zp0kbjkb]{display:flex;justify-content:space-between;margin-top:30px;gap:12px;}

.btn[b-99zp0kbjkb]{border:1px solid var(--line);background:var(--surface);color:var(--ink);font-weight:700;font-size:16.5px;padding:10px 16px;border-radius:10px;cursor:pointer;font-family:inherit;}
.btn:hover[b-99zp0kbjkb]{background:var(--surface2);}
.btn.primary[b-99zp0kbjkb]{background:var(--accent);color:#fff;border-color:var(--accent);}
.btn.primary:hover[b-99zp0kbjkb]{filter:brightness(1.06);}
.btn.sm[b-99zp0kbjkb]{padding:6px 11px;font-size:15px;}
.btn:disabled[b-99zp0kbjkb]{opacity:.4;cursor:default;}
.mini[b-99zp0kbjkb]{border:1px solid var(--red);border-radius:9px;padding:3px 10px;font-size:15px;font-weight:800;cursor:pointer;background:transparent;font-family:inherit;color:var(--red);}
.mini:hover[b-99zp0kbjkb]{background:var(--red-bg);}
.mini.resolve[b-99zp0kbjkb]{color:var(--accent);border-color:var(--accent);}
.mini.resolve:hover[b-99zp0kbjkb]{background:var(--accent-soft);}

.grid[b-99zp0kbjkb]{display:grid;gap:14px;}
.cols3[b-99zp0kbjkb]{grid-template-columns:repeat(3,1fr);} .cols2[b-99zp0kbjkb]{grid-template-columns:repeat(2,1fr);}
@media(max-width:900px){.cols3[b-99zp0kbjkb],.cols2[b-99zp0kbjkb]{grid-template-columns:1fr;}}
[b-99zp0kbjkb] .card{background:var(--surface);border:1px solid var(--line);border-radius:13px;padding:16px;box-shadow:var(--shadow);}
[b-99zp0kbjkb] .card + .card{margin-top:14px;}
.who[b-99zp0kbjkb]{font-size:15px;color:var(--muted);font-family:var(--mono);text-transform:uppercase;letter-spacing:.05em;}
[b-99zp0kbjkb] .card p{margin:8px 0 0;font-size:16.5px;color:var(--muted);line-height:1.5;}
[b-99zp0kbjkb] .card p b{color:var(--ink);font-weight:600;}
[b-99zp0kbjkb] .grpname{font-size:15px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;color:var(--accent);margin:16px 0 6px;}
[b-99zp0kbjkb] .grpname:first-child{margin-top:0;}
.deptsub[b-99zp0kbjkb]{font-size:13.5px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;color:var(--accent);margin:18px 0 4px;padding:6px 12px;background:var(--surface2);border-radius:7px;}
.deptsub2[b-99zp0kbjkb]{display:inline-block;font-size:12px;font-weight:800;text-transform:uppercase;letter-spacing:.05em;color:var(--muted);margin:10px 0 2px;padding:3px 10px;background:color-mix(in srgb,var(--surface2) 55%,transparent);border:1px solid var(--line);border-radius:6px;}
/* Q2 Financial Rocks: editable numbers, auto-summed totals. Actuals color red (below goal) / green (at/above). */
/* Company-as-a-whole summary line - colored roll-up; department detail sits plain below it */
.finhead[b-99zp0kbjkb]{display:flex;flex-wrap:wrap;align-items:center;gap:7px;font-weight:800;font-size:14.5px;margin:6px 0 6px;background:var(--green-bg);border-radius:10px;padding:9px 12px;}
.fintot[b-99zp0kbjkb]{font-weight:600;font-size:13px;color:var(--muted);display:inline-flex;flex-wrap:wrap;align-items:center;gap:5px;}
.finkind[b-99zp0kbjkb]{font-weight:800;font-size:13px;color:var(--ink);}
.finrow[b-99zp0kbjkb]{display:flex;gap:10px;padding:7px 0;border-top:1px solid var(--line);align-items:center;flex-wrap:wrap;}
.fincat[b-99zp0kbjkb]{font-weight:800;min-width:64px;color:var(--accent);}
.finline[b-99zp0kbjkb]{flex:1;min-width:0;display:flex;align-items:center;gap:7px;flex-wrap:wrap;}
.finlbl[b-99zp0kbjkb]{font-size:11px;text-transform:uppercase;letter-spacing:.04em;color:var(--muted);font-weight:800;}
[b-99zp0kbjkb] .finslash{color:var(--muted);opacity:.6;}
[b-99zp0kbjkb] .finin{width:94px;padding:4px 7px;border:1px solid var(--line);border-radius:6px;font-family:var(--mono);font-size:13px;background:var(--surface);color:var(--ink);font-weight:700;}
[b-99zp0kbjkb] .finin.neg{color:var(--red);border-color:color-mix(in srgb,var(--red) 40%,var(--line));}
[b-99zp0kbjkb] .finin.pos{color:var(--green);border-color:color-mix(in srgb,var(--green) 40%,var(--line));}
.finpct[b-99zp0kbjkb]{margin-left:auto;font-weight:800;font-family:var(--mono);font-size:13px;white-space:nowrap;color:var(--muted);}
.finmargin[b-99zp0kbjkb]{flex-basis:100%;font-family:var(--mono);font-size:12px;font-weight:700;color:var(--accent);opacity:.9;white-space:nowrap;margin:2px 0 0 74px;}
[b-99zp0kbjkb] .finpend{font-style:italic;color:var(--amber);font-weight:700;font-family:inherit;}
/* Rate-the-quarter optional comment: present but deliberately understated (dashed, muted, empty) */
.raterow .ratecmt[b-99zp0kbjkb]{flex:1;min-width:80px;font-size:13px;line-height:1.4;padding:5px 8px;border:1px dashed var(--line);opacity:.6;height:auto;min-height:32px;background:transparent;resize:none;field-sizing:content;overflow-y:hidden;}
.raterow .ratecmt:focus[b-99zp0kbjkb]{opacity:1;border-color:var(--accent);}
.rocknote[b-99zp0kbjkb]{font-size:12px;color:var(--muted);font-style:italic;font-weight:500;background:transparent;border-left:2px solid var(--line);border-radius:0;padding:1px 0 1px 8px;margin-top:3px;}
/* V/TO: let the numbers that matter stand out; live annual-progress callout */
.vtotext[b-99zp0kbjkb]{color:var(--ink);font-size:16px;line-height:1.65;}
.vtonum[b-99zp0kbjkb]{color:var(--accent);font-weight:800;font-variant-numeric:tabular-nums;}
.vtoprogress[b-99zp0kbjkb]{margin-top:10px;padding:12px 16px;background:var(--green-bg);border-radius:10px;max-width:420px;}
.vtoproglabel[b-99zp0kbjkb]{font-size:10.5px;text-transform:uppercase;letter-spacing:.05em;color:var(--green);font-weight:800;margin-bottom:8px;}
.vtoproghead[b-99zp0kbjkb]{display:grid;grid-template-columns:1fr 80px 80px;gap:8px;margin-bottom:2px;}
.vtoproghead span[b-99zp0kbjkb]{font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.05em;color:var(--muted);text-align:right;}
.vtoprogrow[b-99zp0kbjkb]{display:grid;grid-template-columns:1fr 80px 80px;gap:8px;align-items:baseline;padding:3px 0;}
.vtoprogname[b-99zp0kbjkb]{font-weight:800;color:var(--ink);font-size:14.5px;}
.vtoprogpct[b-99zp0kbjkb]{font-size:15px;font-weight:800;color:var(--green);font-family:var(--mono);font-variant-numeric:tabular-nums;text-align:right;}
.vtoprogtot[b-99zp0kbjkb]{border-top:1px solid color-mix(in srgb,var(--green) 28%,transparent);margin-top:4px;padding-top:6px;}
.vtoprogtot .vtoprogname[b-99zp0kbjkb]{color:var(--green);}
/* Marketing strategy: bold headers with indented sub-items */
.vtomkt[b-99zp0kbjkb]{font-size:15px;line-height:1.5;color:var(--ink);}
.vtomkthead[b-99zp0kbjkb]{font-weight:800;font-size:15.5px;color:var(--ink);margin:2px 0;}
.vtomktsub[b-99zp0kbjkb]{font-weight:600;color:var(--muted);font-size:13.5px;}
.vtomktitem[b-99zp0kbjkb]{padding-left:20px;margin:1px 0;}
.vtomktgap[b-99zp0kbjkb]{height:10px;}
/* 1-Year plan: annual goals synced from the pacing tool */
.vtoyr[b-99zp0kbjkb]{font-size:15px;line-height:1.4;}
.vtoyrline[b-99zp0kbjkb]{margin-top:4px;color:var(--ink);}
.vtoyrlabel[b-99zp0kbjkb]{font-weight:800;color:var(--muted);font-size:11px;text-transform:uppercase;letter-spacing:.05em;margin-right:6px;}
.vtoyrbreak[b-99zp0kbjkb]{padding-left:8px;margin:2px 0;display:flex;flex-wrap:wrap;gap:3px 18px;}
.vtoyrdept[b-99zp0kbjkb]{color:var(--muted);font-size:14px;}
.vtosrc[b-99zp0kbjkb]{font-size:11.5px;color:var(--muted);font-style:italic;margin-top:8px;}
/* Q2 financial review - one clean, full-width row per line: COMPANY summary + each department */
[b-99zp0kbjkb] .finsection{margin-top:6px;}
[b-99zp0kbjkb] .finsec-head{font-size:13.5px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;color:var(--accent);margin:16px 0 4px;padding:6px 12px;background:var(--surface2);border-radius:7px;}
/* SIX COLUMNS NOW — the trailing one is GAP (sales / GM still to make). Added by narrowing the two
   goal/actual columns rather than widening the table: the card must not get materially wider or the
   room scrolls sideways. The gap column is the narrowest because it carries two short figures. */
[b-99zp0kbjkb] .fintable{--fincols:minmax(92px,.78fr) minmax(136px,1.3fr) minmax(136px,1.3fr) minmax(84px,.85fr) minmax(78px,.78fr) minmax(96px,.95fr);}
[b-99zp0kbjkb] .finhdr2{display:grid;grid-template-columns:var(--fincols);gap:14px;padding:2px 12px 5px;}
[b-99zp0kbjkb] .finhdr2 span{font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.05em;color:var(--muted);}
[b-99zp0kbjkb] .finhdr2 span:nth-child(n+4){text-align:right;}
[b-99zp0kbjkb] .finrow2{display:grid;grid-template-columns:var(--fincols);gap:14px;align-items:center;padding:8px 12px;border-top:1px solid var(--line);}
[b-99zp0kbjkb] .finrow2.fincompany{background:var(--green-bg);border-radius:10px;border-top:0;margin-bottom:3px;}
[b-99zp0kbjkb] .fincat2{font-size:18px;font-weight:800;color:var(--ink);display:flex;flex-direction:column;line-height:1.15;}
[b-99zp0kbjkb] .fincompany .fincat2{color:var(--green);}
[b-99zp0kbjkb] .fincapt{font-size:10px;font-weight:700;color:var(--muted);text-transform:none;letter-spacing:0;margin-top:1px;}
[b-99zp0kbjkb] .fincell{display:flex;align-items:center;gap:6px;min-width:0;}
[b-99zp0kbjkb] .fincell .finin{flex:1;min-width:0;width:auto;}
[b-99zp0kbjkb] .fincellro{font-family:var(--mono);font-weight:800;font-size:14px;}
[b-99zp0kbjkb] .fingm2{font-family:var(--mono);font-size:12.5px;font-weight:800;color:var(--accent);white-space:nowrap;text-align:right;}
[b-99zp0kbjkb] .finach2{font-family:var(--mono);font-size:12.5px;font-weight:800;color:var(--muted);white-space:nowrap;text-align:right;}
@media(max-width:820px){[b-99zp0kbjkb] .fintable{overflow-x:auto;}[b-99zp0kbjkb] .finhdr2,[b-99zp0kbjkb] .finrow2{min-width:700px;}}
[b-99zp0kbjkb] .fin-under{color:var(--red);font-weight:800;font-family:var(--mono);}
[b-99zp0kbjkb] .fin-over{color:var(--green);font-weight:800;font-family:var(--mono);}
.rockmeta[b-99zp0kbjkb]{display:flex;align-items:center;flex-wrap:wrap;gap:7px;margin-top:3px;}
.rockmeta .m[b-99zp0kbjkb]{margin:0;}
.row.subrock[b-99zp0kbjkb]{padding:3px 0;}
.row.subrock .t[b-99zp0kbjkb]{font-weight:500;font-size:16px;color:var(--ink);}
/* Rock-review partial %: the "½" becomes an editable percentage that drives the score */
.pctwrap[b-99zp0kbjkb]{display:inline-flex;align-items:center;gap:2px;font-weight:800;color:var(--accent);font-size:15px;}
.pctin[b-99zp0kbjkb]{width:48px;padding:5px 4px;border:1.5px solid var(--accent);border-radius:8px;font-size:15px;font-weight:800;text-align:center;font-family:inherit;color:var(--accent);background:var(--surface);appearance:textfield;-moz-appearance:textfield;}
.pctin[b-99zp0kbjkb]::-webkit-outer-spin-button,.pctin[b-99zp0kbjkb]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0;}
/* Rock-review status on the LEFT (matches the to-do checkbox cadence): Done checkbox, Not done, Partial */
.row.rockrow[b-99zp0kbjkb]{align-items:flex-start;}
.rockstat[b-99zp0kbjkb]{display:flex;align-items:center;gap:7px;flex:0 0 auto;margin-top:2px;}
.rockstat .chk[b-99zp0kbjkb]{width:22px;height:22px;font-size:16px;}
.ministate[b-99zp0kbjkb]{font-size:13px;font-weight:700;padding:5px 10px;border:1px solid var(--line);border-radius:9px;background:var(--surface);color:var(--muted);cursor:pointer;font-family:inherit;white-space:nowrap;}
.ministate:hover[b-99zp0kbjkb]{border-color:var(--accent);color:var(--accent);}
.ministate.on[b-99zp0kbjkb]{background:var(--surface2);color:var(--ink);border-color:var(--muted);font-weight:800;}
[b-99zp0kbjkb] .hint{color:var(--accent);cursor:help;font-size:14px;font-weight:700;opacity:.75;}
[b-99zp0kbjkb] .hint:hover{opacity:1;}
/* Financial rock pacing tool (Set Rocks) - one clean table per section */
.pacesectionhead[b-99zp0kbjkb]{font-size:13.5px;font-weight:800;letter-spacing:.05em;text-transform:uppercase;color:var(--accent);margin:18px 0 6px;padding-bottom:5px;border-bottom:1px solid var(--line);display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;}
.paceset-btn[b-99zp0kbjkb]{text-transform:none;letter-spacing:0;font-weight:700;flex:none;}
.pacesection:first-of-type .pacesectionhead[b-99zp0kbjkb]{margin-top:6px;}
.pacescroll[b-99zp0kbjkb]{overflow-x:auto;}
table.pace2[b-99zp0kbjkb]{width:100%;border-collapse:collapse;min-width:600px;}
table.pace2 th[b-99zp0kbjkb]{font-size:10px;font-weight:800;letter-spacing:.05em;text-transform:uppercase;color:var(--muted);text-align:right;padding:0 8px 7px;white-space:nowrap;}
table.pace2 th:first-child[b-99zp0kbjkb]{text-align:left;}
table.pace2 td[b-99zp0kbjkb]{padding:4px 8px;text-align:right;font-size:13.5px;vertical-align:middle;}
td.pacemetric[b-99zp0kbjkb]{text-align:left;font-weight:700;color:var(--muted);font-size:12.5px;padding-left:18px;}
tr.pacegrp td[b-99zp0kbjkb]{background:var(--surface2);font-size:11px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;color:var(--accent);padding:5px 10px;text-align:left;}
/* Company total = summary roll-up: green background */
tr.pacegrp.pacetot td[b-99zp0kbjkb]{background:var(--green-bg);color:var(--green);}
tr.pacetotrow td[b-99zp0kbjkb]{font-weight:800;color:var(--ink);font-family:var(--mono);font-variant-numeric:tabular-nums;background:var(--green-bg);}
tr.pacetotrow td.pacemetric[b-99zp0kbjkb]{font-family:inherit;color:var(--green);}
.pacegoal[b-99zp0kbjkb],.paceact[b-99zp0kbjkb],.paceset[b-99zp0kbjkb]{text-align:right;border-radius:7px;font-family:var(--mono);font-variant-numeric:tabular-nums;font-weight:700;font-size:13px;background:var(--surface);padding:4px 6px;}
.pacegoal[b-99zp0kbjkb]{width:98px;border:1px solid var(--line);color:var(--ink);}
.paceact[b-99zp0kbjkb]{width:96px;border:1px solid var(--line);color:var(--green);}
.paceset[b-99zp0kbjkb]{width:96px;border:1.5px solid var(--accent);color:var(--accent);font-weight:800;}
.pacegap[b-99zp0kbjkb]{font-family:var(--mono);font-variant-numeric:tabular-nums;font-weight:800;}
.gap-ok[b-99zp0kbjkb]{color:var(--green);} .gap-short[b-99zp0kbjkb]{color:var(--amber);} .gap-over[b-99zp0kbjkb]{color:var(--green);}
/* GM cell: dollar with its linked, editable margin % tucked to the lower-right */
.gmcell[b-99zp0kbjkb]{display:inline-flex;flex-direction:row;align-items:flex-end;justify-content:flex-end;gap:5px;}
.pacepct[b-99zp0kbjkb]{width:46px;text-align:right;border:1px dashed color-mix(in srgb,var(--accent) 45%,var(--line));border-radius:6px;padding:2px 4px;font-family:var(--mono);font-variant-numeric:tabular-nums;font-size:11px;font-weight:700;color:var(--muted);background:transparent;align-self:flex-end;}
.pacepcttot[b-99zp0kbjkb]{font-size:11px;font-weight:800;color:var(--green);opacity:.9;font-family:var(--mono);font-variant-numeric:tabular-nums;align-self:flex-end;}
/* single margin % lever per dept, sits in the group-header row */
td.pacegrpmargin[b-99zp0kbjkb]{text-align:right;white-space:nowrap;font-size:11px;font-weight:700;text-transform:none;letter-spacing:0;}
.pacemarginlbl[b-99zp0kbjkb]{color:var(--muted);font-weight:700;font-size:10px;text-transform:uppercase;letter-spacing:.05em;margin-right:5px;}
.pacemargin[b-99zp0kbjkb]{width:54px;text-align:right;border:1.5px dashed color-mix(in srgb,var(--accent) 55%,var(--line));border-radius:7px;padding:2px 6px;font-family:var(--mono);font-variant-numeric:tabular-nums;font-size:12px;font-weight:800;color:var(--accent);background:var(--surface);}
.pacemargin:focus[b-99zp0kbjkb]{outline:none;border-style:solid;}
/* derived GM (Sales × margin%) - read-only, visually softer than the editable cells */
td.gmproj[b-99zp0kbjkb]{color:var(--muted);font-style:italic;}
/* actual GM % achieved in a booked quarter, shown under the GM $ (goal margin lives on the dept header) */
.gmwrap[b-99zp0kbjkb]{display:flex;flex-direction:column;align-items:flex-end;gap:1px;}
.pacemarginact[b-99zp0kbjkb]{font-size:10.5px;font-weight:700;color:var(--muted);font-family:var(--mono);font-variant-numeric:tabular-nums;}
/* Written Contract: margin/GM not knowable until finalization */
.pacemarginna[b-99zp0kbjkb]{font-size:10.5px;font-weight:700;font-style:italic;color:var(--muted);text-transform:none;letter-spacing:0;}
td.pacenanote[b-99zp0kbjkb]{text-align:left;font-size:12px;font-style:italic;color:var(--muted);padding-left:18px;}

.row[b-99zp0kbjkb]{display:flex;align-items:center;gap:12px;padding:11px 0;border-top:1px solid var(--line);flex-wrap:wrap;}
.row:first-child[b-99zp0kbjkb]{border-top:0;}
.grow[b-99zp0kbjkb]{flex:1;min-width:0;}
.grow .t[b-99zp0kbjkb]{font-weight:600;font-size:17.5px;}
.grow .t.done[b-99zp0kbjkb]{text-decoration:line-through;color:var(--muted);}
.grow .m[b-99zp0kbjkb]{font-size:15px;color:var(--muted);font-family:var(--mono);}
/* Internal reference codes (TD-/IDS-/QR-…): tiny, muted, tucked under the title. Not for the casual reader. */
/* internal identifiers (IDS-000221, QR-2026-…, DEC-…) are meaningless to the room - hidden everywhere */
.idcode[b-99zp0kbjkb]{display:none;}
.linkhint[b-99zp0kbjkb]{font-size:12px;line-height:1;color:var(--accent);opacity:.75;font-weight:700;}
.pill[b-99zp0kbjkb]{display:inline-block;padding:3px 10px;border-radius:999px;font-size:15px;font-weight:800;white-space:nowrap;}
.p-green[b-99zp0kbjkb]{background:var(--green-bg);color:var(--green);} .p-amber[b-99zp0kbjkb]{background:var(--amber-bg);color:var(--amber);}
.p-red[b-99zp0kbjkb]{background:var(--red-bg);color:var(--red);} .p-accent[b-99zp0kbjkb]{background:var(--accent-soft);color:var(--accent);} .p-muted[b-99zp0kbjkb]{background:var(--surface2);color:var(--muted);}
.lbl[b-99zp0kbjkb]{font-size:15px;text-transform:uppercase;letter-spacing:.06em;color:var(--muted);font-weight:800;margin-right:5px;}
/* Scorecard weekly actual: mono so columns of numbers line up; the prior week sits under it as
   muted reference only - it is deliberately not editable, you edit that week in that week's L10. */
.scval[b-99zp0kbjkb]{width:126px;font-family:var(--mono);font-weight:700;text-align:right;}
/* Period-to-date strip under a metric. "—" is a real answer here: it means we have no rule for
   aggregating this metric, not that the number is zero. */
.scqtd[b-99zp0kbjkb]{display:flex;flex-wrap:wrap;gap:4px 20px;margin:2px 0 10px;padding-left:2px;font-size:13px;color:var(--muted);}
.scqtd b[b-99zp0kbjkb]{font-family:var(--mono);font-weight:800;color:var(--ink);margin-left:4px;}
.scnote[b-99zp0kbjkb]{font-style:italic;opacity:.75;margin-left:4px;}
.scprev[b-99zp0kbjkb]{display:block;font-size:12.5px;color:var(--muted);font-family:var(--mono);margin-top:3px;white-space:nowrap;}
/* THE GOAL IS THE NUMBER THAT MAKES THE ACTUAL MEAN ANYTHING. It used to render inside .m -
   15px, muted, mono - i.e. indistinguishable from a reference code, sitting under a 17.5px
   semibold metric name and losing every time. It now reads as a peer of the name: same size,
   heavier, in ink, with a small uppercase GOAL tag so it is still obvious WHICH number it is
   without a full sentence. Deliberately NOT accent-coloured - a goal is not a status. */
.scgoal[b-99zp0kbjkb]{display:flex;align-items:baseline;gap:7px;margin-top:3px;}
.scgoal .scgoalv[b-99zp0kbjkb]{font-size:17.5px;font-weight:800;color:var(--ink);font-family:var(--mono);letter-spacing:-.01em;}
.scgoal .scgoallbl[b-99zp0kbjkb]{font-size:11.5px;font-weight:800;text-transform:uppercase;letter-spacing:.08em;color:var(--muted);}
/* No goal set is a QUIET state. "goal -" must not shout the absence of a target; it stays exactly
   as it rendered before, in .m, so the eye skips it and lands on the metrics that do have one. */

.chk[b-99zp0kbjkb]{width:20px;height:20px;border:2px solid var(--line);border-radius:6px;cursor:pointer;flex:none;display:flex;align-items:center;justify-content:center;font-size:15px;color:#fff;background:transparent;}
.chk.on[b-99zp0kbjkb]{background:var(--green);border-color:var(--green);}
.field[b-99zp0kbjkb]{width:100%;border:1px solid var(--line);border-radius:9px;padding:9px 11px;font-family:inherit;font-size:16.5px;background:var(--bg);color:var(--ink);}
textarea.field[b-99zp0kbjkb]{min-height:62px;resize:none;field-sizing:content;}
.sel[b-99zp0kbjkb]{max-width:150px;}
.addrow[b-99zp0kbjkb]{display:flex;gap:8px;align-items:center;margin-top:10px;flex-wrap:wrap;padding-top:11px;border-top:1px dashed var(--line);}
.addrow .field[b-99zp0kbjkb]{flex:1;min-width:130px;}

/* To-do priority indicator — a small cycling button beside the to-do, NOT a row colour.
   Colouring the whole row was rejected: a row already carries meaning here (done, linked,
   confidential) and a second full-row treatment would fight the first. This is a 22px control that
   sits in the row's flex line and cannot be mistaken for the row's own state.

   ACCESSIBILITY. Colour is the LAST cue, never the only one. The glyph differs per state (○ / ! / ‼)
   so the control survives greyscale and colour-blindness; title/aria-label carry the same sentence
   in words; and it is a real <button>, so it takes keyboard focus and Enter/Space. The palette
   reuses --red/--amber (and their -bg pairs), which are already defined for light, dark, and both
   explicit data-theme overrides — so the dot follows the theme with no new variables.

   flex:0 0 auto keeps it from being squeezed by the to-do text, which is the flex:1 sibling. */
.pridot[b-99zp0kbjkb]{flex:0 0 auto;width:22px;height:22px;border-radius:50%;border:1px solid var(--line);
        background:var(--surface);color:var(--muted);cursor:pointer;padding:0;
        font-size:13px;font-weight:800;line-height:1;
        display:inline-flex;align-items:center;justify-content:center;}
.pridot:hover[b-99zp0kbjkb]{border-color:var(--accent);}
.pridot:focus-visible[b-99zp0kbjkb]{outline:2px solid var(--accent);outline-offset:2px;}

/* Normal is deliberately quiet — it is the default state of most to-dos and must not add noise. */
.pridot.pri-normal[b-99zp0kbjkb]{color:var(--muted);}
.pridot.pri-important[b-99zp0kbjkb]{color:var(--amber);border-color:var(--amber);background:var(--amber-bg);}
.pridot.pri-priority[b-99zp0kbjkb]{color:var(--red);border-color:var(--red);background:var(--red-bg);}
.due[b-99zp0kbjkb]{font-family:var(--mono);font-size:15px;color:var(--muted);border:1px solid var(--line);border-radius:7px;padding:5px 8px;background:var(--bg);}
/* height:auto + min-height (NOT height:40px) is load-bearing: an explicit height beats
   field-sizing:content, which pinned every answer to one scrolling line. Now the box keeps
   its 40px resting size and grows to fit as someone types a second/third line. */
.edit[b-99zp0kbjkb]{border:1px solid var(--line);border-radius:8px;padding:8px 10px;font-size:16.5px;font-family:inherit;line-height:1.4;background:var(--surface);color:var(--ink);width:100%;height:auto;min-height:40px;resize:none;field-sizing:content;}
.edit:focus[b-99zp0kbjkb]{outline:2px solid var(--accent);outline-offset:1px;}
/* No scrollbar flash while the box grows. Browsers without field-sizing (Firefox) fall back to
   the rows="2" default height and still scroll - no worse than before, just not auto-growing. */
textarea.edit[b-99zp0kbjkb]{overflow-y:hidden;}
/* equal-height person cards in the segue/headline grids. min-width:0 is load-bearing: grid items
   default to min-width:auto, so a long answer would widen the card and shove the next person's
   column off screen instead of wrapping. */
.grid.cols3 > .card[b-99zp0kbjkb],.grid.cols2 > .card[b-99zp0kbjkb]{align-self:stretch;display:flex;flex-direction:column;min-width:0;}
/* field-sizing:content grows a textarea's HEIGHT (wanted) but an input's WIDTH (not wanted -
   an input can't wrap, so it just stretches the card). Keep inputs at their box width. */
input.edit[b-99zp0kbjkb]{field-sizing:fixed;}

.bdgs[b-99zp0kbjkb]{display:inline-flex;gap:5px;align-items:center;flex-wrap:wrap;margin-left:8px;}
.bdg[b-99zp0kbjkb]{font-size:15px;font-weight:800;padding:2px 7px;border-radius:6px;background:var(--surface2);color:var(--muted);border:1px solid var(--line);white-space:nowrap;}
.bdg.ids[b-99zp0kbjkb]{color:var(--amber);border-color:color-mix(in srgb,var(--amber) 40%,var(--line));background:var(--amber-bg);}
.rockchip[b-99zp0kbjkb]{font-size:15px;font-weight:800;padding:2px 8px;border-radius:6px;background:var(--accent-soft);color:var(--accent);border:1px solid color-mix(in srgb,var(--accent) 35%,transparent);font-family:var(--mono);white-space:nowrap;}

.note-panel[b-99zp0kbjkb]{flex-basis:100%;margin-top:8px;background:var(--surface2);border:1px solid var(--line);border-radius:10px;padding:10px 12px;}
.note-entry[b-99zp0kbjkb]{padding:7px 0;border-top:1px solid var(--line);}
.note-entry:first-child[b-99zp0kbjkb]{border-top:0;padding-top:0;}
.note-meta[b-99zp0kbjkb]{font-size:15px;color:var(--muted);}
.note-meta b[b-99zp0kbjkb]{color:var(--ink);font-weight:700;}
.note-text[b-99zp0kbjkb]{font-size:15px;color:var(--ink);margin-top:2px;line-height:1.45;}
.note-add[b-99zp0kbjkb]{display:flex;gap:7px;align-items:center;margin-top:9px;padding-top:9px;border-top:1px dashed var(--line);flex-wrap:wrap;}
.note-add .field[b-99zp0kbjkb]{flex:1;min-width:120px;}
/* Reassign pickers on to-do / IDS rows: small and quiet until you go looking for them. */
.ownersel[b-99zp0kbjkb]{max-width:140px;flex:none;font-size:13px;padding:3px 6px;}
/* The issue title is a textarea (editable + wraps), but it must still READ as the row's heading. */
.idstitle[b-99zp0kbjkb]{font-weight:700;font-size:16.5px;border-color:transparent;background:transparent;padding:2px 6px;}
.idstitle:hover[b-99zp0kbjkb]{border-color:var(--line);background:var(--surface);}
.idstitle.done[b-99zp0kbjkb]{text-decoration:line-through;opacity:.55;}
/* The draft box is a textarea so a long note wraps instead of scrolling sideways, but it sits in a
   compact row next to a select and a button - override the 64px min-height textarea.field carries
   so it rests at one line and grows only as the note gets longer. */
.note-add textarea.field[b-99zp0kbjkb]{min-height:36px;resize:none;overflow-y:hidden;line-height:1.4;}
.notetoggle[b-99zp0kbjkb]{border:1px solid var(--line);background:var(--surface2);color:var(--muted);border-radius:7px;font-size:15px;font-weight:800;padding:3px 10px;cursor:pointer;font-family:inherit;flex-basis:100%;text-align:left;margin-top:8px;}
.notetoggle.on[b-99zp0kbjkb]{color:var(--accent);border-color:color-mix(in srgb,var(--accent) 40%,var(--line));background:var(--accent-soft);}
/* IDS: disposition menu, folds, and history trail */
/* BOUNDED ISSUE ROW. The card gives the section its edge; the row needs its own, or twelve
   issues read as one wall of dropdowns. Background bounds it, the left bar RANKS it by priority
   (High red, Medium amber, Low neutral) - a bar rather than a tinted fill so twelve rows do not
   turn into twelve competing colours. .row's shared top border is dropped here: the gap between
   rows is now the separator. */
.row.idsrow[b-99zp0kbjkb]{align-items:flex-start;background:var(--surface2);border-top:none;border-radius:9px;
            border-left:4px solid var(--line);padding:10px 12px;margin:7px 0;}
.row.idsrow.ip-high[b-99zp0kbjkb]{border-left-color:var(--red);}
.row.idsrow.ip-med[b-99zp0kbjkb]{border-left-color:var(--amber);}
.row.idsrow.ip-low[b-99zp0kbjkb]{border-left-color:var(--line);}
.row.idsrow.dragging[b-99zp0kbjkb]{opacity:.5;}
/* Title, then owner/priority/status, then the actions - one continuous line under the title
   instead of controls far left and actions far right with dead space between. */
.idsmeta[b-99zp0kbjkb]{row-gap:6px;}
.idsacts[b-99zp0kbjkb]{display:inline-flex;align-items:center;gap:7px;flex:none;margin-left:4px;}
/* The two IDS cards read as siblings with a clear break, not one list with subheadings. */
.idsblock + .idsblock[b-99zp0kbjkb]{margin-top:16px;}
.idssub[b-99zp0kbjkb]{color:var(--muted);font-size:14.5px;margin:-2px 0 10px;}
.idsfold[b-99zp0kbjkb]{background:none;border:none;color:var(--accent);font-weight:800;font-size:13px;cursor:pointer;padding:12px 0 4px;font-family:inherit;letter-spacing:.02em;}
.idshistlink[b-99zp0kbjkb]{background:none;border:none;color:var(--muted);font-size:12px;cursor:pointer;text-decoration:underline;padding:0;font-family:inherit;font-weight:600;}
.dispmenu[b-99zp0kbjkb]{flex-basis:100%;display:flex;flex-wrap:wrap;align-items:center;gap:8px;padding:11px 13px;margin:2px 0 8px;background:var(--accent-soft);border-radius:10px;}
.dispbtn[b-99zp0kbjkb]{background:var(--surface);border:1px solid var(--line);border-radius:8px;padding:7px 12px;font-size:13.5px;font-weight:700;color:var(--ink);cursor:pointer;font-family:inherit;white-space:nowrap;}
.dispbtn:hover[b-99zp0kbjkb]{border-color:var(--accent);color:var(--accent);}
.dispghost[b-99zp0kbjkb]{color:var(--muted);margin-left:auto;}
.dispgroup[b-99zp0kbjkb]{display:inline-flex;align-items:center;gap:6px;}
.displbl[b-99zp0kbjkb]{font-size:12px;font-weight:800;color:var(--accent);}
.ideventrow[b-99zp0kbjkb]{display:flex;gap:9px;align-items:baseline;padding:2px 0;font-size:13px;}
.idsevt[b-99zp0kbjkb]{font-weight:800;color:var(--accent);font-size:11.5px;white-space:nowrap;text-transform:uppercase;letter-spacing:.03em;flex:none;min-width:120px;}
.idsevt.done[b-99zp0kbjkb]{color:var(--green);}
.idsnotes[b-99zp0kbjkb]{flex-basis:100%;margin:4px 0 4px 2px;display:flex;flex-direction:column;gap:3px;}
.idsnote[b-99zp0kbjkb]{font-size:13.5px;color:var(--ink);line-height:1.4;padding-left:9px;border-left:2px solid color-mix(in srgb,var(--accent) 30%,var(--line));display:flex;align-items:center;gap:6px;}
.idsnote b[b-99zp0kbjkb]{color:var(--accent);font-weight:700;flex:none;}
/* These are textareas, not inputs: a note is prose and routinely runs past one line. line-height
   + field-sizing keep them looking like a single dashed line until there's a reason to be taller. */
.idsnoteedit[b-99zp0kbjkb]{flex:1;min-width:0;font-family:inherit;font-size:13.5px;line-height:1.4;color:var(--ink);background:transparent;border:1px solid transparent;border-radius:6px;padding:2px 6px;resize:none;field-sizing:content;overflow-y:hidden;}
.idsnoteedit:hover[b-99zp0kbjkb]{border-color:var(--line);background:#fff;}
.idsnoteedit:focus[b-99zp0kbjkb]{outline:none;border-color:var(--accent);background:#fff;}
.idsnotedel[b-99zp0kbjkb]{flex:none;border:none;background:transparent;color:var(--muted);cursor:pointer;font-size:13px;line-height:1;padding:2px 4px;border-radius:5px;}
.idsnotedel:hover[b-99zp0kbjkb]{color:var(--red);background:var(--red-bg);}
.idsnoteadd[b-99zp0kbjkb]{flex-basis:100%;display:flex;gap:7px;align-items:center;margin:3px 0 8px;flex-wrap:wrap;}
.idsnoteadd .field[b-99zp0kbjkb]{flex:1;min-width:150px;}
/* Potential-rock inline note */
.potnote[b-99zp0kbjkb]{flex-basis:100%;font-size:13px;padding:5px 8px;border:1px dashed var(--line);border-radius:7px;margin-top:4px;color:var(--muted);background:transparent;min-height:32px;}
.potnote:focus[b-99zp0kbjkb]{border-color:var(--accent);color:var(--ink);}

.raterow[b-99zp0kbjkb]{display:flex;align-items:center;gap:12px;padding:9px 0;border-top:1px solid var(--line);flex-wrap:wrap;}
.raterow:first-of-type[b-99zp0kbjkb]{border-top:0;}
.ratename[b-99zp0kbjkb]{width:80px;font-weight:700;font-size:16.5px;flex:none;}
.rate[b-99zp0kbjkb]{display:flex;gap:5px;flex-wrap:wrap;}
.rate button[b-99zp0kbjkb]{width:34px;height:34px;border:1px solid var(--line);border-radius:8px;background:var(--surface);font-weight:800;cursor:pointer;font-family:inherit;color:var(--ink);font-size:15px;}
.rate button.on[b-99zp0kbjkb]{background:var(--accent);color:#fff;border-color:var(--accent);}
.ratesummary[b-99zp0kbjkb]{margin-top:11px;font-size:15px;color:var(--muted);}
.ratesummary b[b-99zp0kbjkb]{color:var(--ink);}

/* scoped per-block capture "+" (matches the Quarterly) — NO global floating FAB */
[b-99zp0kbjkb] .blockhead{display:flex;align-items:center;justify-content:space-between;gap:10px;}
/* "+" drawn with two CSS bars = mathematically dead-center, no font-metric drift */
[b-99zp0kbjkb] .capmini{width:30px;height:30px;border-radius:50%;border:0;background:var(--accent);cursor:pointer;box-shadow:var(--shadow);flex:none;
    position:relative;font-size:0;padding:0;line-height:0;}
[b-99zp0kbjkb] .capmini::before,[b-99zp0kbjkb] .capmini::after{content:"";position:absolute;top:50%;left:50%;background:#fff;border-radius:1px;transform:translate(-50%,-50%);}
[b-99zp0kbjkb] .capmini::before{width:13px;height:2.5px;}
[b-99zp0kbjkb] .capmini::after{width:2.5px;height:13px;}
[b-99zp0kbjkb] .capmini:hover{filter:brightness(1.08);}

.statuspick.st-g[b-99zp0kbjkb]{color:var(--green);border-color:color-mix(in srgb,var(--green) 45%,var(--line));}
.statuspick.st-r[b-99zp0kbjkb]{color:var(--red);border-color:color-mix(in srgb,var(--red) 45%,var(--line));}
.statuspick.st-a[b-99zp0kbjkb]{color:var(--amber);border-color:color-mix(in srgb,var(--amber) 45%,var(--line));}
.statuspick.st-m[b-99zp0kbjkb]{color:var(--muted);}

.seglabel[b-99zp0kbjkb]{display:block;font-size:15px;font-weight:800;text-transform:uppercase;letter-spacing:.04em;color:var(--muted);margin:11px 0 4px;}
.edit + .seglabel[b-99zp0kbjkb]{margin-top:12px;}

/* attendees + roles (matches the Quarterly check-in exactly) */
.att[b-99zp0kbjkb]{display:flex;align-items:center;gap:10px;padding:10px 0;border-top:1px solid var(--line);}
.att:first-of-type[b-99zp0kbjkb]{border-top:0;}
/* ABSENT MUST BE AS LEGIBLE AS PRESENT. Opacity alone made an absent row read as "faded", which is
   indistinguishable from "not filled in yet"; the muted rail on the left says it is a state someone
   chose. Opacity is kept but lifted — .5 was dim enough to make the name hard to read. */
.att.absent[b-99zp0kbjkb]{opacity:.62;border-left:3px solid var(--muted);padding-left:9px;margin-left:-12px;}
.att.dragging[b-99zp0kbjkb]{opacity:.4;}
.dh[b-99zp0kbjkb]{cursor:grab;color:var(--muted);font-size:18px;flex:none;user-select:none;line-height:1;}
.att-nm[b-99zp0kbjkb]{min-width:130px;font-size:17.5px;}
.roles[b-99zp0kbjkb]{display:flex;gap:6px;flex-wrap:wrap;align-items:center;flex:1;}
.rolechip[b-99zp0kbjkb]{display:inline-flex;align-items:center;gap:2px;background:var(--accent-soft);color:var(--accent);border:1px solid color-mix(in srgb,var(--accent) 30%,var(--line));border-radius:999px;font-size:15px;font-weight:700;padding:2px 4px 2px 10px;}
.rolechip.standing[b-99zp0kbjkb]{background:transparent;color:var(--muted);border-style:dashed;
                   border-color:var(--line);font-weight:600;padding:2px 10px;}
.rolechip .rx[b-99zp0kbjkb]{border:0;background:transparent;color:var(--accent);cursor:pointer;font-weight:800;font-size:17.5px;line-height:1;padding:0 3px;}
.rolesel[b-99zp0kbjkb]{border:1px dashed var(--line);border-radius:999px;font-size:15px;font-weight:700;color:var(--muted);background:transparent;padding:5px 10px;cursor:pointer;font-family:inherit;}
/* PRESENT / ABSENT pill. Fixed width so the column reads straight down a list whose .roles cell
   grows and wraps — a header rule over this position would drift, this does not. Green fill for
   present matches the tick it replaces; outline+muted for absent so the two states are equally
   legible rather than one being the other's absence. */
.att-state[b-99zp0kbjkb]{flex:none;width:104px;text-align:center;border-radius:999px;font-family:inherit;
           font-size:14px;font-weight:800;letter-spacing:.01em;padding:5px 0;cursor:pointer;
           border:1.5px solid var(--line);background:transparent;color:var(--muted);white-space:nowrap;}
.att-state.on[b-99zp0kbjkb]{background:var(--green);border-color:var(--green);color:#fff;}
.att-state:hover[b-99zp0kbjkb]{border-color:var(--accent);}
.att-state.on:hover[b-99zp0kbjkb]{filter:brightness(.95);}
/* Pushed-down provenance and the pusher's own "sent" tag. Muted and small: they are facts about
   where a thing came from or went, not calls to action. */
.pushfrom[b-99zp0kbjkb]{font-size:13px;font-weight:600;color:var(--muted);margin-top:2px;}
.pushfrom b[b-99zp0kbjkb]{color:var(--ink);}
.pushtag[b-99zp0kbjkb]{font-size:12.5px;font-weight:700;color:var(--muted);border:1px dashed var(--line);
         border-radius:999px;padding:1px 9px;white-space:nowrap;}
/* A refusal must not read like another inbox item. Red rail, not a red card: the work is still
   real, it is the plan that was rejected. */
.declinedback[b-99zp0kbjkb]{border-left:4px solid var(--red);}
.declinedback .grpname[b-99zp0kbjkb]{color:var(--red);}
/* The lineage above a rock — reference, never a control. Muted, dashed left rule, one line. */
.ancestry[b-99zp0kbjkb]{font-size:13px;color:var(--muted);border-left:2px dashed var(--line);
          padding:2px 0 2px 10px;margin:0 0 4px 2px;line-height:1.5;}
.ancestry b[b-99zp0kbjkb]{color:var(--ink);font-weight:700;}
[b-99zp0kbjkb] .src{font-size:15px;font-weight:800;text-transform:uppercase;letter-spacing:.04em;padding:2px 7px;border-radius:6px;background:var(--surface2);color:var(--muted);border:1px solid var(--line);}
.who.name[b-99zp0kbjkb]{color:var(--ink);font-size:16.5px;font-weight:800;}
.role-sub[b-99zp0kbjkb]{font-size:15px;font-weight:700;color:var(--accent);text-transform:uppercase;letter-spacing:.04em;margin:2px 0 6px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
/* uniform segue cards regardless of role-title length */
.grid.cols3 > .card[b-99zp0kbjkb]{min-height:196px;}
/* grid cards must NOT inherit the stacked-card top margin — gap handles spacing.
   (This is what made the upper-left segue card look taller than the rest.) */
.grid > .card[b-99zp0kbjkb]{margin-top:0 !important;}
.overlay[b-99zp0kbjkb]{position:fixed;inset:0;background:rgba(14,24,34,.32);z-index:25;}
.drawer[b-99zp0kbjkb]{position:fixed;top:0;right:0;height:100vh;width:410px;max-width:92vw;background:var(--surface);border-left:1px solid var(--line);box-shadow:var(--shadow);z-index:26;padding:22px;overflow:auto;}
.drawer h2[b-99zp0kbjkb]{margin:0 0 4px;font-size:22px;}
.drawer .sub[b-99zp0kbjkb]{color:var(--muted);font-size:15px;margin:0 0 16px;}
.types[b-99zp0kbjkb]{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:16px;}
.type[b-99zp0kbjkb]{border:1px solid var(--line);background:var(--surface);border-radius:9px;padding:7px 11px;font-size:15px;font-weight:700;cursor:pointer;color:var(--ink);}
.type.on[b-99zp0kbjkb]{background:var(--accent);color:#fff;border-color:var(--accent);}
.flabel[b-99zp0kbjkb]{display:block;font-size:15px;font-weight:700;color:var(--muted);text-transform:uppercase;letter-spacing:.04em;margin:12px 0 5px;}
.create[b-99zp0kbjkb]{margin-top:18px;width:100%;border:0;border-radius:10px;padding:13px;background:var(--accent);color:#fff;font-weight:800;font-size:17.5px;cursor:pointer;}
.toast[b-99zp0kbjkb]{position:fixed;left:50%;bottom:30px;transform:translateX(-50%);background:var(--ink);color:var(--bg);padding:13px 18px;border-radius:12px;font-size:16.5px;font-weight:600;box-shadow:var(--shadow);z-index:40;max-width:90vw;text-align:center;}

@media(max-width:820px){.app[b-99zp0kbjkb]{grid-template-columns:1fr;}.rail[b-99zp0kbjkb]{position:static;height:auto;}}

/* Rock Review row. Still wraps on narrow widths rather than overflowing; no effect when there
   is room. The per-row STATUS/CONFIDENCE labels are gone (see the markup), so the row is one
   line: title · owner · due, then the two controls, then +. */
/* ── THE ROCK CARD: CONTENT FIRST, CONTROLS SECOND ──────────────────────────────────────────────
   ⚠ THE TITLE USED TO LOSE THE FIGHT FOR WIDTH. The row was one flex line — title in .grow next to
   an owner picker, status, confidence, a date box and three buttons — so on a real screen the
   controls took their fixed widths first and the rock's name was squeezed into whatever was left.
   PAG's production room rendered "Training for / Delivery Crews to / Build Skills / / Knowledge —
   1x a / month" as five stacked lines beside a comfortable row of dropdowns. The most important
   thing on the screen was the narrowest thing on the screen, and it made every card enormous.

   flex-basis:100% gives the title its own line and pushes the controls to the next one. That is the
   whole change: one property, no markup restructure, and the controls keep their column widths. */
.rockrev[b-99zp0kbjkb]{flex-wrap:wrap;row-gap:6px;padding:9px 0;}
.rockrev .grow[b-99zp0kbjkb]{display:flex;align-items:baseline;flex-wrap:wrap;gap:0 8px;min-width:0;}
/* ⚠ THE WORKING ROW ONLY. Scoped to .rkwork — the room's own editable rock — rather than to every
   .grow inside .rockrev, which also restyled the routed COMPANY rows at the top of the board and
   made them taller for nothing. Those are read at a glance, not worked, and their compact single
   line was already right. */
.rockrev.rkwork .grow[b-99zp0kbjkb]{flex:1 0 100%;}
.rockrev .grow .t[b-99zp0kbjkb]{font-size:16.5px;line-height:1.3;}
/* The meta is prose here, not a code - mono was for the PublicId, which is display:none. */
.rockrev .grow .m[b-99zp0kbjkb]{font-family:inherit;}
/* Fixed widths so the two controls form COLUMNS down the list. That column position is what
   replaces the labels - it only works if every row agrees on the width. */
.rockrev .rkstatus[b-99zp0kbjkb]{width:152px;flex:none;}
.rockrev .rkconf[b-99zp0kbjkb]{width:120px;flex:none;}
/* ⚠ A NAME MUST BE READABLE. .sel caps every select at 150px, which rendered PAG's owner picker as
   "Ethonne Moro" — a truncated person is worse than a wide control. Wide enough for a real full
   name, capped so one long name cannot stretch the row, and the title attribute already carries the
   full value for the rare case that still clips.

   ⚠ WORKING ROWS ONLY, MEASURED. Widening the delegated picker on a routed CONTEXT row too cost the
   title 56px of width, which pushed it from two lines to three and put those rows back up from 92px
   to 116px — the exact regression this polish pass exists to undo. A context row is read at a
   glance and its picker keeps the global 150px; its name truncation is pre-existing behaviour and
   is left exactly as it was rather than paid for in height. */
.rockrev.rkwork .rkowner[b-99zp0kbjkb]{width:auto;min-width:200px;max-width:280px;flex:none;}

/* ── ACTIONS, SET APART FROM REPORTING FIELDS ───────────────────────────────────────────────────
   Owner / status / confidence / due say what the room REPORTS about this rock; +, Send to and
   Remove CHANGE where it lives. Read as one strip they are indistinguishable. A gap separates them
   without adding labels, which would put the row's height straight back. margin-left:auto pushes
   the group to the trailing edge on a wide row and collapses harmlessly when the line wraps. */
.rockrev.rkwork .rkactions[b-99zp0kbjkb]{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-left:auto;}

/* ⚠ AN ACTION, NOT ANOTHER DATA FIELD. Semantically still a native select — keyboard, screen reader
   and the existing handler are untouched — but it sits beside + and Remove rather than beside the
   owner and status pickers, so it should not wear their chrome. Accent text on a quiet ground reads
   as a menu; "Send to… ▾" says it opens something. */
.rockrev .rksend[b-99zp0kbjkb]{max-width:none;width:auto;border:1px solid var(--line);background:var(--surface2);
                 color:var(--accent);font-weight:700;font-size:13px;border-radius:8px;padding:5px 9px;cursor:pointer;}
.rockrev .rksend:hover[b-99zp0kbjkb]{border-color:var(--accent);}

/* MEDIUM — the controls wrap among themselves; the title keeps its own full-width line. */
@media (max-width:900px){
    .rockrev .rkowner[b-99zp0kbjkb]{min-width:170px;}
    .rockrev .rkstatus[b-99zp0kbjkb]{width:130px;}
    .rockrev .rkconf[b-99zp0kbjkb]{width:104px;}
}
/* NARROW — everything stacks. min-width:0 on the selects is what stops a long option string
   forcing the row wider than the viewport and scrolling the whole page sideways. */
@media (max-width:620px){
    .rockrev .rkowner[b-99zp0kbjkb],.rockrev .rkstatus[b-99zp0kbjkb],.rockrev .rkconf[b-99zp0kbjkb],.rockrev .rkdue[b-99zp0kbjkb],.rockrev .rksend[b-99zp0kbjkb]{
        width:100%;max-width:none;min-width:0;flex:1 0 100%;
    }
    /* The action group takes the full width too, so + / Send to / Remove sit on their own line
       rather than being squeezed against the trailing edge. */
    .rockrev.rkwork .rkactions[b-99zp0kbjkb]{margin-left:0;flex:1 0 100%;}
}

/* WorkCards (WWView) embed. Icon matches LevelTen's 🏔️ affordance; the panel is a large
   centred sheet rather than a full-screen takeover, so the room stays visible behind it. */
.wwview-btn[b-99zp0kbjkb]{background:none;border:1px solid var(--line);border-radius:8px;padding:2px 7px;cursor:pointer;
            font-size:15px;line-height:1.5;flex:none;}
.wwview-btn:hover[b-99zp0kbjkb]{border-color:var(--accent);background:var(--accent-soft);}
.wwview-panel[b-99zp0kbjkb]{position:fixed;inset:3vh 3vw;background:var(--surface);border:1px solid var(--line);
              border-radius:14px;box-shadow:var(--shadow);z-index:60;display:flex;flex-direction:column;overflow:hidden;}
.wwview-head[b-99zp0kbjkb]{display:flex;align-items:center;justify-content:space-between;gap:12px;
             padding:12px 16px;border-bottom:1px solid var(--line);flex:none;}
.wwview-title[b-99zp0kbjkb]{font-weight:800;font-size:17px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.wwview-frame[b-99zp0kbjkb]{flex:1;width:100%;border:0;background:var(--bg);}

/* Company logo at the top of the meeting rail. max-width so a wide wordmark cannot push the
   rail out; object-fit:contain so any aspect ratio sits correctly in the box rather than
   stretching. Sized generously - this is the one piece of branding in a screen-shared room. */
.roomlogo[b-99zp0kbjkb]{display:block;max-width:100%;max-height:46px;width:auto;object-fit:contain;margin:0 0 14px;}
.roomlogo-name[b-99zp0kbjkb]{font-weight:800;font-size:16px;color:var(--ink);margin:0 0 14px;}

/* OWNER OF A FINANCIAL RESPONSIBILITY, in the Financials card's row label.

   Quiet on purpose: the row is a scoreboard and the name is context for it, not a heading. It says
   WHO ANSWERS for this line — the same person whose rock carries the On Track / Off Track that the
   room will ask about. It is not a status and must not read like one, so no colour. */
[b-99zp0kbjkb] .finowner {
    display: block;
    font-size: 11px;
    font-weight: 600;
    letter-spacing: .01em;
    color: var(--muted, #6b7580);
    margin-top: 1px;
}

/* OWNER-DECLARED STATUS, inside the Financials row label.

   ⚠ THIS IS THE ONLY PLACE THESE EIGHT ROCKS CAN BE DECLARED. They render once — here — rather than
   also as ordinary rock rows, so the control has to live in the card or their owners have nowhere to
   answer at all.

   Stacked under the owner instead of becoming a sixth grid column: the financial table's five
   columns are already dense, and a new column would push the numbers off the edge on a laptop. It
   also keeps the reading order the meeting actually uses — who owns this, what do they say, then
   what do the numbers say.

   Tinted by value so a row's declaration is scannable down the card, using the same status
   vocabulary the rock rows use. The tint says what the OWNER chose; it is never derived from the
   goal/actual figures on the same row. */
[b-99zp0kbjkb] .finstatus {
    margin-top: 3px;
    font-size: 12px;
    font-weight: 700;
    padding: 1px 6px;
    border-radius: 6px;
    border: 1px solid var(--line);
    background: var(--surface);
    color: var(--ink);
    max-width: 116px;
}
[b-99zp0kbjkb] .finstatus.fs-on   { border-color: var(--green); color: var(--green); }
[b-99zp0kbjkb] .finstatus.fs-risk { border-color: var(--amber, #b8860b); color: var(--amber, #b8860b); }
[b-99zp0kbjkb] .finstatus.fs-off  { border-color: var(--red); color: var(--red); }
[b-99zp0kbjkb] .finstatus.fs-done { border-color: var(--muted); color: var(--muted); }

/* ── FINANCIALS: COMPANY, THEN CHANNELS ─────────────────────────────────────────────────────────
   The card was two Written/Finished tables with the same four categories in each, so a reader
   chasing one channel found it twice, far apart. It is now the company's own commitment followed by
   each channel with both halves together. These rules add the channel grouping only; the five-column
   grid, its figures and its inputs are untouched. */
[b-99zp0kbjkb] .finchan { padding: 2px 0 4px; }
[b-99zp0kbjkb] .finchan + .finchan { border-top: 1px solid var(--line); margin-top: 2px; }

[b-99zp0kbjkb] .finchanhead {
    display: flex;
    align-items: baseline;
    gap: 9px;
    padding: 5px 12px 1px;
}
[b-99zp0kbjkb] .finchanname {
    font-size: 11px;
    font-weight: 800;
    letter-spacing: .08em;
    text-transform: uppercase;
    color: var(--ink);
}
/* The channel owner sits on the header line, not stacked under it — one line for "who answers for
   this channel" keeps the block short. Only drawn when both stages share an owner; when they differ
   (PAG's Contract) each row names its own instead, and this is absent rather than wrong. */
[b-99zp0kbjkb] .finchanowner { display: inline; margin-top: 0; }

/* A stage row indents under its channel and drops to normal weight: the channel is the heading, the
   stage is the row. Without this the two read as equals and the grouping is invisible. */
[b-99zp0kbjkb] .fincat2stage { font-size: 14px; font-weight: 600; padding-left: 12px; }

/* ── PERSON SECTION RHYTHM ──────────────────────────────────────────────────────────────────────
   A person can now hold two financial rocks back to back, each followed by four evidence cards, and
   the run reads as one undifferentiated stripe unless the boundaries are drawn. Restraint on
   purpose: a little space and one hairline, no new containers, no colour, no smaller type.

   The rock row stays the landmark — it carries the owner's declaration, and the evidence beneath it
   must never compete with that. */
[b-99zp0kbjkb] .row.rockrev { margin-top: 10px; }

/* The gap BEFORE a rock that follows a summary is the one that matters: it separates "the previous
   rock and its evidence" from "the next rock". Adjacent-sibling so a rock following another rock
   directly (a completion rock after a completion rock) keeps its ordinary tighter rhythm. */
[b-99zp0kbjkb] .rmc + .row.rockrev {
    margin-top: 16px;
    padding-top: 14px;
    border-top: 1px solid var(--line);
}


/* GAP CELL — what is still to make. Same mono/12.5px/right-aligned treatment as the GM % and
   ACHIEVED columns beside it, so the four numeric columns read as one family rather than the new one
   shouting. Ink rather than accent or muted: it is the section's most actionable figure, but it is a
   fact to read, not an alarm. nowrap keeps "sales / GM" on one line — the abbreviated K/M formatting
   exists so it fits. An em dash where no goal exists (PAG's Contract Written GM), never a zero:
   "nothing to report" and "nothing left to do" are different statements. */
[b-99zp0kbjkb] .fingap2{font-family:var(--mono);font-size:12.5px;font-weight:800;color:var(--ink);white-space:nowrap;text-align:right;}

/* PERIOD CONTEXT IN THE SECTION BAR. Pushed right on the same line as the section name, so it costs
   no height at all. Wraps under the name on a narrow card rather than forcing the bar wider. */
[b-99zp0kbjkb] .finsec-head { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; }
[b-99zp0kbjkb] .finperiod {
    margin-left: auto;
    font-size: 11px;
    font-weight: 600;
    letter-spacing: 0;
    text-transform: none;
    color: var(--muted);
    font-variant-numeric: tabular-nums;
}

/* ── PERSON HEADER BAND ─────────────────────────────────────────────────────────────────────────
   A CHAPTER DIVIDER, not a label between rows. Rock Review reads top to bottom as one long list, and
   a person carrying two financial rocks plus their summaries runs most of a screen — so without a
   real break Michael bleeds into Jai bleeds into Scot and the reader loses track of whose review
   they are in.

   Four things do the work, in order of how much they contribute:

     1. WHITESPACE. The 40px above is the single biggest signal and the cheapest — it is what makes
        the break unmistakable before any colour is read.
     2. The band belongs DOWNWARD. 40px above, 6px below: the header and the rocks under it read as
        one unit, rather than the header looking attached to the rock above it.
     3. A teal left accent, repeated down the page, so the eye can find the next person by shape.
     4. A teal-tinted ground, one step stronger than the old --surface2.

   ⚠ NO BOX AROUND THE PERSON. The band is the divider; the rocks below keep their own width, ground
   and spacing. Boxing each person, tinting their rows, or alternating backgrounds would turn a
   meeting agenda into a dashboard and bury the rocks the room is there to discuss.

   ⚠ AND NO STATUS COLOUR. --accent-soft is the teal-family surface token, not green/amber/red:
   status belongs to the rock rows, and a coloured band would read as a judgement on the person. */
[b-99zp0kbjkb] .personband {
    display: flex;
    align-items: baseline;
    gap: 10px;
    /* The chapter break. Asymmetric on purpose — see note 2 above. */
    margin: 40px 0 6px;
    padding: 9px 14px;
    background: var(--accent-soft);
    border-left: 4px solid var(--accent);
    border-radius: 4px 8px 8px 4px;
}

/* Deliberately NO bottom rule: a line here would separate the header from the rocks it introduces,
   which is the opposite of the relationship we want. The tinted ground already ends the band. */

[b-99zp0kbjkb] .personband .pbname {
    font-size: 14px;
    font-weight: 800;
    letter-spacing: .07em;
    text-transform: uppercase;
    color: var(--accent);
}

/* The count sits at the far right so a long name cannot push it out of alignment, and stays muted:
   stronger than before, but subordinate to the name — it answers "how much of this is there", not
   "who is this". Singular/plural comes from the markup. */
[b-99zp0kbjkb] .personband .pbcount {
    margin-left: auto;
    font-size: 11.5px;
    font-weight: 800;
    letter-spacing: .05em;
    text-transform: uppercase;
    color: var(--muted);
}

/* ⚠ NO SPECIAL CASE FOR THE FIRST PERSON, deliberately. An earlier :first-of-type rule to tighten it
   was DEAD — bands are interleaved with .row siblings, so :first-of-type matched a rock row, not the
   first band — and removing it is the right fix rather than reaching for :first-child, because every
   person genuinely should read the same. One grammar, seven identical chapter openings. */

/* ══ SUB-ROCKS ═════════════════════════════════════════════════════════════════════════════════
   A rock's independently owned commitments. The chip lives in the action strip; the panel expands
   BENEATH the row, never inside it.

   ⚠ THE COLLAPSED ROW MUST NOT GET TALLER. This is the constraint 274aea0 bought and this feature
     does not get to spend. .subchip is a .btn.sm in the .rkactions strip that already exists — it
     inherits that strip's height and its 8px gap, adds no line box of its own, and the panel is a
     SIBLING of the row rather than a child, so an unopened panel contributes exactly nothing. The
     measured row height is unchanged with the chip present; see the density comparison in the
     report. */
.rockrev .subchip[b-99zp0kbjkb]{font-weight:700;white-space:nowrap;}
/* Attention is a BORDER, not a fill: a filled chip competes with the status control beside it, and
   the status control is the thing the room is actually reading. */
.rockrev .subchip.attn[b-99zp0kbjkb]{border-color:var(--red);color:var(--red);}

/* ── THE PANEL ───────────────────────────────────────────────────────────────────────────────
   Indented under the parent on the same dashed rail .rocksteps and .ancestry use, so the room reads
   it as "belonging to the row above" without a box drawing a second card around it. */
.subpanel[b-99zp0kbjkb]{margin:2px 0 10px 30px;border-left:2px solid var(--line);padding:6px 0 6px 12px;}
.subhead[b-99zp0kbjkb]{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;margin-bottom:6px;}
.subttl[b-99zp0kbjkb]{font-size:11px;font-weight:800;letter-spacing:.08em;color:var(--muted);}
.subsum[b-99zp0kbjkb]{font-size:13px;color:var(--muted);}
.subsum.attn[b-99zp0kbjkb]{color:var(--red);font-weight:600;}

/* ⚠ CONTEXT, NOT CONTROLS. Four read-only columns. The authoritative row under the child's owner
   carries the status control, the owner picker and the notes; repeating them here would give one
   commitment two places to be edited and two places to disagree. */
.subkids[b-99zp0kbjkb]{display:flex;flex-direction:column;gap:2px;}
.subkid[b-99zp0kbjkb]{display:grid;grid-template-columns:minmax(0,1fr) 150px 76px 92px;align-items:baseline;
        gap:10px;padding:3px 0;font-size:13px;}
.subkid .skname[b-99zp0kbjkb]{min-width:0;font-weight:600;}
.subkid .skowner[b-99zp0kbjkb],.subkid .skdue[b-99zp0kbjkb],.subkid .skstatus[b-99zp0kbjkb]{color:var(--muted);}
.subkid .skdue.over[b-99zp0kbjkb]{color:var(--red);font-weight:700;}
.subkid.off .skstatus[b-99zp0kbjkb]{color:var(--red);font-weight:700;}
.subkid.done .skname[b-99zp0kbjkb]{text-decoration:line-through;opacity:.55;}
.subnote[b-99zp0kbjkb]{font-size:12px;color:var(--muted);margin:6px 0 8px;}

/* ── THE MULTI-ROW CREATION WORKSPACE ────────────────────────────────────────────────────────
   A grid, because the room is comparing four commitments against each other while it types them —
   four stacked forms would lose that. Columns line up with the read-only list above. */
.subcreate[b-99zp0kbjkb]{margin-top:8px;}
.scrow[b-99zp0kbjkb]{display:grid;grid-template-columns:minmax(0,1fr) 150px 150px 32px;gap:8px;align-items:center;
       margin-bottom:6px;}
.scrow .field[b-99zp0kbjkb]{min-width:0;max-width:none;width:100%;}
.schead[b-99zp0kbjkb]{font-size:10.5px;font-weight:800;letter-spacing:.08em;color:var(--muted);margin-bottom:2px;}
/* A refused date is outlined, not hidden: the room needs to see WHICH row it must fix. */
.scrow .field.bad[b-99zp0kbjkb]{border-color:var(--red);}
.scmsg[b-99zp0kbjkb]{font-size:12.5px;margin:2px 0 8px;line-height:1.4;}
/* Advisory amber, refusal red — the difference between "consider this" and "this will not save". */
.scmsg.warn[b-99zp0kbjkb]{color:var(--amber,#b45309);}
.scmsg.bad[b-99zp0kbjkb]{color:var(--red);font-weight:600;}
.scadd[b-99zp0kbjkb]{margin:2px 0 10px;}
.scfoot[b-99zp0kbjkb]{display:flex;gap:8px;align-items:center;}

/* MEDIUM — the owner and date columns give ground first; the title keeps as much width as it can. */
@media (max-width:900px){
    .subkid[b-99zp0kbjkb]{grid-template-columns:minmax(0,1fr) 120px 68px 84px;}
    .scrow[b-99zp0kbjkb]{grid-template-columns:minmax(0,1fr) 128px 132px 32px;}
}
/* NARROW — everything stacks, matching what .rockrev already does at this width. min-width:0 is
   what stops a long option string forcing the panel wider than the viewport and scrolling the whole
   page sideways, which is the failure mode this room already had to fix once. */
@media (max-width:620px){
    .subpanel[b-99zp0kbjkb]{margin-left:12px;padding-left:8px;}
    .subkid[b-99zp0kbjkb]{grid-template-columns:1fr;gap:0;padding:6px 0;border-bottom:1px solid var(--line);}
    .subkid .skowner[b-99zp0kbjkb],.subkid .skdue[b-99zp0kbjkb],.subkid .skstatus[b-99zp0kbjkb]{font-size:12.5px;}
    .scrow[b-99zp0kbjkb]{grid-template-columns:1fr;gap:6px;}
    .scrow .field[b-99zp0kbjkb]{width:100%;}
    .scfoot[b-99zp0kbjkb]{flex-wrap:wrap;}
    .scfoot .create[b-99zp0kbjkb]{flex:1 0 100%;}
}

/* ⚠ THE CHIP SHRINKS BEFORE THE ROW WRAPS. Measured: the chip replaced "⛰ break down" one-for-one,
   but its label is longer once it carries counts and a warning ("Sub-Rocks 0/4 · ⚠ 1 ▾"), and on the
   narrower ROUTED row that extra width was enough to tip the strip onto a second line — 93px → 117px
   at 1440. Letting it shrink and ellipsis keeps the row on one line; the full label stays available
   in the title attribute, which already carries the whole summary. flex-shrink alone is not enough:
   min-width:0 is what lets a flex item go below its content width at all. */
.rockrev .subchip[b-99zp0kbjkb]{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}

/* ── THE COMPACT EVIDENCE BADGE ─────────────────────────────────────────────────────────────────
   The same roll-up as the chip, on rows that have no action strip to put a chip in.

   ⚠ IT LIVES INSIDE .m, NOT ON THE ROW'S FLEX AXIS. That is the whole reason it costs nothing: .m
     is the metadata line inside .grow, and on a borrowed row it carries only "Owner · due Sep 30"
     because .idcode is display:none. Adding a span there cannot wrap the status/confidence strip,
     and the title above keeps its own line at full width. Measured delta: 0px.

   ⚠ IT IS NOT STYLED AS A BUTTON. The row is read-only; a button-looking control would promise an
     action the room does not have here. It reads as metadata — same muted colour and size as the
     owner and due date beside it — and only the underline-on-hover says it opens something.

   The Rock's own wording stays the priority: the badge is flex:none but sits AFTER the owner and
   date in a line with a thousand pixels spare, so it never competes with the title for width. */
.rockrev .grow .m .subbadge-sep[b-99zp0kbjkb]{color:var(--muted);}
.rockrev .grow .m .subbadge[b-99zp0kbjkb]{
    display:inline;padding:0;border:0;background:none;font:inherit;color:var(--muted);
    cursor:pointer;white-space:nowrap;
}
.rockrev .grow .m .subbadge:hover[b-99zp0kbjkb]{color:var(--accent);text-decoration:underline;}
/* Attention is carried by colour and weight only — no border, no fill, nothing that would add a
   box and therefore a line-height of its own. */
.rockrev .grow .m .subbadge.attn[b-99zp0kbjkb]{color:var(--red);font-weight:700;}

/* ── ADOPTED DEPARTMENT ROCK ────────────────────────────────────────────────────────────────────
   A Rock in THIS team's quarterly plan that this team does not own. The visual job is one
   distinction and only one: "this is in our plan, and somebody upstairs still answers for it."

   ⚠ NO OWNER COLUMN, DELIBERATELY. Every other Rock Review row has an owner control in the same
     horizontal position. Leaving that space empty here is the point — there is no receiving-team
     owner, and drawing a control that implied one is exactly the defect the first production
     walkthrough produced (a same-title duplicate owned by an arbitrary person). */
.rockrev.deptplan[b-99zp0kbjkb]{align-items:flex-start;}
.rockrev.deptplan .deptfrom[b-99zp0kbjkb]{color:var(--muted);}
.rockrev.deptplan .deptfrom b[b-99zp0kbjkb]{color:var(--fg);font-weight:600;}
/* The status/confidence the OWNING room reports, shown read-only in the same columns the editable
   controls occupy elsewhere, so the row still scans as a Rock Review row. */
.rockrev.deptplan .rkro[b-99zp0kbjkb]{color:var(--muted);}

/* The action strip sits on its own line rather than competing with the title for the row's flex
   axis. "+ Create Sub-Rocks" carries a word, not just an icon: it is a first-class action the room
   has never seen before, and a bare + would be a guess. The chip beside it is view/manage ONLY —
   one creation control per Rock, never two. */
.rockrev.deptplanacts[b-99zp0kbjkb]{padding-top:0;border-top:0;gap:8px;flex-wrap:wrap;}
.rockrev.deptplanacts .grow[b-99zp0kbjkb]{display:flex;align-items:center;gap:8px;flex-wrap:wrap;min-width:0;}
.subcreatebtn[b-99zp0kbjkb]{white-space:nowrap;flex:0 0 auto;}
/* Same shrink rule the chip already carries on an ordinary row: the label grows when it gains
   counts and a warning, and it must give way before the row wraps. */
.rockrev.deptplanacts .subchip[b-99zp0kbjkb]{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.rockrev.deptplan .ancestry[b-99zp0kbjkb]{margin-top:2px;}

/* ⚠ THE TITLE STOPS COMPETING WITH THE STATUS COLUMNS BEFORE IT BECOMES UNREADABLE.
   Measured at 900px: .rkstatus and .rkconf hold fixed widths, the sidebar holds its own, and what
   was left for .grow squeezed "Training for Delivery Crews to Build Skills / Knowledge — 1x a
   month" down to ONE WORD PER LINE — a 598px row saying almost nothing. This row carries more text
   than any other in Rock Review (title + "From <team> · <owner> · due" + ancestry), so the generic
   row rules are not enough for it.
   Below 1100 the judgement columns move UNDER the title and read as a labelled pair instead. The
   row gets taller by one short line and every word stays legible, which is the right trade. */
@media (max-width:1100px){
  .rockrev.deptplan[b-99zp0kbjkb]{flex-wrap:wrap;}
  .rockrev.deptplan .grow[b-99zp0kbjkb]{flex:1 1 100%;min-width:0;}
  .rockrev.deptplan .rkro[b-99zp0kbjkb]{width:auto;flex:0 0 auto;margin-top:4px;font-size:13px;}
  .rockrev.deptplan .rkstatus[b-99zp0kbjkb]::before{content:"status:\00a0";color:var(--muted);}
  .rockrev.deptplan .rkconf[b-99zp0kbjkb]::before{content:"confidence:\00a0";color:var(--muted);margin-left:10px;}
}

@media (max-width:900px){
  .rockrev.deptplanacts .grow[b-99zp0kbjkb]{gap:6px;}
  .subcreatebtn[b-99zp0kbjkb]{font-size:13px;}
}
@media (max-width:620px){
  /* The action strip stacks before the title does. Losing a line here is cheaper than a title that
     wraps mid-word on a phone. */
  .rockrev.deptplanacts .grow[b-99zp0kbjkb]{align-items:stretch;}
}
/* /Components/Shared/FinancialRocksCard.razor.rz.scp.css */

/* Override layer: an overridden actual is visually distinct; the note shows the sheet value + revert. */
.finin.finov[b-u6qqmj8vno]{background:color-mix(in srgb,var(--accent) 14%,transparent);border-color:var(--accent);font-weight:700;}
.finin.finro[b-u6qqmj8vno]{display:inline-block;min-width:70px;text-align:right;}
.finovnote[b-u6qqmj8vno]{grid-column:1 / -1;font-size:11px;color:var(--muted);margin:1px 0 3px 8px;display:flex;gap:10px;flex-wrap:wrap;align-items:center;}
/* --ink, not --text: --text is defined nowhere, so this declaration was invalid at
   computed-value time and `color` (inherited) fell back to inherit — i.e. .finovnote's own
   --muted. The bold that marks the overridden sheet value has never been darker than the
   note around it. */
.finovnote b[b-u6qqmj8vno]{color:var(--ink);}
.finrevert[b-u6qqmj8vno]{font-size:10.5px;font-weight:700;color:var(--accent);background:none;border:1px solid var(--accent);border-radius:6px;padding:0 6px;cursor:pointer;}
/* /Components/Shared/RockMetricCards.razor.rz.scp.css */
/* The Financial Rock Summary: a thin quarter strip, then four cards.

   Deliberately quiet — this is evidence for a conversation about the rock, not the headline of the
   page, and it must stay visually subordinate to the rock row above it, which carries the owner's
   declaration. */
.rmc[b-i0ddrsh9wu] {
    margin: 6px 0 10px 14px;
}

/* ── THE QUARTER STRIP ──────────────────────────────────────────────────────────────────────────
   One line, full width of the summary. It was a card, which spent a quarter of the width restating
   the same contextual number under every financial rock in the room — 76.9% is a fact about the
   calendar, not about this rock. As a strip it still leads (every "% of goal" below is only readable
   against it) and it returns a whole column to the rock's own figures. */
.rmcq[b-i0ddrsh9wu] {
    display: flex;
    align-items: baseline;
    flex-wrap: wrap;
    gap: 0 7px;
    padding: 1px 2px 5px;
    font-size: 11.5px;
    color: var(--muted);
    font-variant-numeric: tabular-nums;
}

/* Prominent enough to scan down a page of rocks, but smaller than any card's headline figure: it is
   context for them, not competition with them. */
.rmcqpct[b-i0ddrsh9wu] { font-size: 15px; font-weight: 800; color: var(--ink); }
.rmcqlab[b-i0ddrsh9wu] { font-weight: 600; }
.rmcqsep[b-i0ddrsh9wu] { opacity: .5; }
.rmcqfact[b-i0ddrsh9wu] { white-space: nowrap; }

/* The bar takes the rest of the line rather than a fixed width, so it reads as a track across the
   summary. min-width keeps it honest when the facts wrap on a narrow screen. */
.rmcbar[b-i0ddrsh9wu] {
    flex: 1 1 90px;
    min-width: 90px;
    height: 4px;
    border-radius: 2px;
    background: var(--line);
    overflow: hidden;
    align-self: center;
}
/* Muted fill: this is context, and a red/green bar here would read as a verdict on the rock. */
.rmcbarfill[b-i0ddrsh9wu] { display: block; height: 100%; background: var(--muted); border-radius: 2px; }

/* ── THE FOUR CARDS ─────────────────────────────────────────────────────────────────────────────
   auto-fit rather than a hard repeat(4, 1fr): a rock linked only to a sales metric renders fewer
   cards, and they should share the width rather than leave columns empty. With all four present —
   the normal case — this is four equal columns. */
.rmc-cards[b-i0ddrsh9wu] {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(168px, 1fr));
    align-items: stretch;
    gap: 8px;
}

.rmcard[b-i0ddrsh9wu] {
    background: var(--surface2);
    border: 1px solid var(--line);
    border-radius: 10px;
    padding: 9px 11px;
}

/* Both gap cards are the ask, so both carry the accent edge — they are one question asked about two
   different currencies, and giving only one of them the marker would rank them. */
.rmcgap[b-i0ddrsh9wu], .rmcgapgm[b-i0ddrsh9wu] { border-left: 3px solid var(--accent); }

.rmch[b-i0ddrsh9wu] {
    font-size: 9.5px; text-transform: uppercase; letter-spacing: .07em;
    font-weight: 800; color: var(--muted); margin-bottom: 3px;
}
.rmcbig[b-i0ddrsh9wu] {
    font-size: 19px; font-weight: 800; color: var(--ink);
    font-variant-numeric: tabular-nums; line-height: 1.15;
}
.rmcline[b-i0ddrsh9wu] { font-size: 11.5px; color: var(--muted); margin-top: 2px; font-variant-numeric: tabular-nums; }
.rmcline b[b-i0ddrsh9wu] { color: var(--ink); }
.rmc-good[b-i0ddrsh9wu] { color: var(--green); }
.rmc-bad[b-i0ddrsh9wu] { color: var(--red); }
.rmc-mute[b-i0ddrsh9wu] { color: var(--muted); }

/* Narrow screens: the cards stack and the strip keeps its full-width role above them. */
@media (max-width: 620px) {
    .rmc-cards[b-i0ddrsh9wu] { grid-template-columns: 1fr; }
    .rmcqpct[b-i0ddrsh9wu] { font-size: 14px; }
}
/* /Components/Shared/ScorecardGrid.razor.rz.scp.css */
/* The weekly scorecard grid. Sticky on BOTH axes so the metric name and the week heading stay put
   while the sheet is read — the single biggest thing that makes a 13-column grid usable. */

.scgwrap[b-knqmkocq4m] {
    /* THE GRID SCROLLS INSIDE THIS BOX, and that is the whole mechanism. The page body must never
       scroll sideways; this element owns the overflow so the toolbar, nav and everything around it
       stay still while the sheet moves under them. */
    overflow: auto;
    max-height: calc(100vh - 230px);
    border: 1px solid var(--line);
    border-radius: 13px;
    background: var(--surface);
    /* Momentum scrolling on trackpads/touch, and a visible scrollbar so the affordance is obvious —
       a grid that scrolls but looks like it does not is how W13 went unnoticed. */
    scrollbar-color: var(--muted) var(--surface2);
}
.scg-week .scgwrap[b-knqmkocq4m] { max-height: none; }

.scg[b-knqmkocq4m] {
    border-collapse: separate;   /* separate, not collapse: a collapsed border does not paint
                                    reliably on a sticky cell — the line vanishes while scrolling */
    border-spacing: 0;
    font-size: 12.5px;
    font-variant-numeric: tabular-nums;
    /* ⚠ ALWAYS A DEFINITE WIDTH, IN BOTH MODES.
       Recent mode fills its container (100%); All-13 states its total in pixels through an inline
       style the component computes from ScorecardGridMetrics. Both are definite, which is what
       table-layout:fixed requires — see the note beside .scg-all below for what happened when
       All-13 used max-content instead. */
    width: 100%;
    /* ⚠ FIXED, NOT AUTO. Under auto layout a column width is a SUGGESTION the browser may exceed:
       the 260px metric column rendered at 299px because the longest metric name asked for more,
       and those stolen pixels pushed W13 out from behind the sticky column at 1440. Fixed layout
       makes every declared width authoritative, which is what a 21-column grid needs — and the
       metric column already wraps, so nothing is truncated by holding it to its stated width. */
    table-layout: fixed;
}

/* ── FALLBACK GEOMETRY ────────────────────────────────────────────────────────────────────────
   The real numbers arrive as custom properties on .scgwrap, emitted from ScorecardGridMetrics.
   These defaults exist only so the grid is not shapeless if it is ever rendered without them (a
   static snapshot, a test harness); they are deliberately the same values, and CSS never does
   arithmetic on them beyond reading the offsets C# already computed. */
.scgwrap[b-knqmkocq4m] {
    --scg-metric-w: 190px;
    --scg-week-w: 66px;
    --scg-hist-w: 54px;
    --scg-sum-total-w: 540px;
    --scg-s1-w: 86px; --scg-s1-right: 454px;
    --scg-s2-w: 76px; --scg-s2-right: 378px;
    --scg-s3-w: 64px; --scg-s3-right: 314px;
    --scg-s4-w: 76px; --scg-s4-right: 238px;
    --scg-s5-w: 76px; --scg-s5-right: 162px;
    --scg-s6-w: 80px; --scg-s6-right:  82px;
    --scg-s7-w: 82px; --scg-s7-right:   0px;
}

.scg th[b-knqmkocq4m], .scg td[b-knqmkocq4m] {
    padding: 4px 8px;
    border-bottom: 1px solid var(--line);
    white-space: nowrap;
    background: var(--surface);
}

/* ── The two sticky axes ─────────────────────────────────────────────────────────────────────
   Each needs its OWN z-index, and the corner must sit above both. An explicit background on every
   sticky cell is not decoration: a transparent one lets rows scroll visibly underneath. */
.scg thead th[b-knqmkocq4m] { position: sticky; top: 0; z-index: 2; }
.scg .scg-name[b-knqmkocq4m] {
    position: sticky; left: 0; z-index: 1;
    text-align: left; font-weight: 600; color: var(--ink);
    /* Fixed, not min/max: a sticky column whose width depends on content shifts as you scroll.
       260px is chosen against the narrow end of the target range: at 1440 the metric column plus
       the seven summary columns come to 862px inside a ~938px pane, which leaves room for W13 to
       sit beside QTD when scrolled fully right. Widening this pushes W13 back off-screen. */
    /* width ONLY. A min-width here defeats table-layout:fixed — it stops the column
       compressing, so the table overflows its pane instead of fitting it, which is the whole
       thing this design is trying to avoid. */
    width: var(--scg-metric-w);
    white-space: normal;                 /* a metric name may wrap; a week heading may not */
    border-right: 2px solid var(--line);
}
.scg thead .scg-corner[b-knqmkocq4m] { z-index: 3; }

.scg thead th[b-knqmkocq4m] {
    font-size: 10px; text-transform: uppercase; letter-spacing: .04em;
    color: var(--muted); font-weight: 700; text-align: right;
    border-bottom: 2px solid var(--line);
    vertical-align: bottom;
}
/* Summary headings WRAP rather than widen their column. "Pace Goal" on one line would steal
   ~40px from the week zone for no gain; on two short lines it costs nothing. */
.scg thead .scg-num[b-knqmkocq4m] { white-space: normal; line-height: 1.15; }
.scg thead .scg-name[b-knqmkocq4m] { text-align: left; }

/* WEEK COLUMNS GET A REAL MINIMUM. This is the rule that guarantees all thirteen exist at a
   readable size and that the sheet scrolls instead of compressing. */
.scg-wk[b-knqmkocq4m] { width: var(--scg-week-w); }
.scg-wknum[b-knqmkocq4m] { display: block; font-size: 11px; color: var(--ink); font-weight: 800; }
.scg-wkspan[b-knqmkocq4m] { display: block; font-size: 9px; font-weight: 500; }

/* A week that has not finished is dimmed rather than hidden: it still accepts a number, it just is
   not part of "completed weeks" yet. */
.scg-future[b-knqmkocq4m] { color: var(--muted); background: var(--surface2); }

.scg-num[b-knqmkocq4m], .scg-cell[b-knqmkocq4m] { text-align: right; }
.scg-cell[b-knqmkocq4m] { width: var(--scg-week-w); }
/* SIZED TO THE WIDEST STRING THE COLUMN ACTUALLY RENDERS — see ScorecardGridMetrics for the
   measurements. The left padding is trimmed to 2px because every figure here is right-aligned:
   that buys back 6px of content per column, which is a whole extra week visible at 1920. */
/* No width here: each frozen summary column states its own below.
   ⚠ QUALIFIED WITH th/td ON PURPOSE. `.scg th, .scg td { padding: 4px 8px }` above is (0,2,1) once
   the scope attribute is added, so a bare `.scg-num` loses the cascade and the trim silently does
   nothing — which is exactly what happened: the columns were SIZED for 10px of padding and rendered
   with 16px, leaving "REMAINING", "NEEDED/WK", a bold "($12.35M)" and "-123.4%" each spilling a few
   pixels into their neighbour. The left padding is the one to trim because every figure in these
   columns is right-aligned, so those 6px are dead space in front of the number. */
.scg th.scg-num[b-knqmkocq4m], .scg td.scg-num[b-knqmkocq4m] { padding-left: 2px; }
.scg-sep[b-knqmkocq4m] { border-left: 2px solid var(--line); }
.scg-total[b-knqmkocq4m] { font-weight: 800; color: var(--ink); }
.scg-goal[b-knqmkocq4m] { color: var(--muted); }
.scg-muted[b-knqmkocq4m] { color: var(--muted); }
.scg-under[b-knqmkocq4m] { color: var(--red); }
.scg-over[b-knqmkocq4m] { color: var(--green); }

/* ── Entry affordance ──────────────────────────────────────────────────────────────────────────
   An editable cell must LOOK editable without turning 55 rows × 13 weeks into a wall of boxes.
   A faint dotted floor reads as "you can type here" at a glance and disappears into the grid at
   arm's length; hover and focus then commit to a real field. */
.scg-in[b-knqmkocq4m] {
    width: 100%; text-align: right;
    font: inherit; font-variant-numeric: tabular-nums;
    background: transparent; color: var(--ink);
    border: 1px solid transparent;
    border-bottom: 1px dashed color-mix(in srgb, var(--accent) 34%, transparent);
    border-radius: 5px; padding: 2px 4px;
    transition: background-color .12s, border-color .12s;
}
.scg-in[b-knqmkocq4m]::placeholder { color: color-mix(in srgb, var(--muted) 55%, transparent); }
.scg-in:hover[b-knqmkocq4m] { border-color: var(--line); border-bottom-color: var(--accent); background: var(--surface2); }
.scg-in:focus[b-knqmkocq4m] {
    border: 1px solid var(--accent); outline: none;
    background: var(--surface);
    box-shadow: 0 0 0 2px var(--accent-soft);
}
/* A cell nobody can type into is visibly a RESULT, not an empty input: no floor, muted ink, and a
   help cursor because its tooltip explains where the number came from. */
.scg-ro[b-knqmkocq4m] { color: var(--muted); }
.scg-ro span[b-knqmkocq4m] { cursor: help; }

/* ── Rows ──────────────────────────────────────────────────────────────────────────────────── */
.scg-row:hover th[b-knqmkocq4m], .scg-row:hover td[b-knqmkocq4m] { background: var(--surface2); }

/* A borrowed metric reads as reference, not as this scorecard's own work. */
.scg-inc .scg-mname[b-knqmkocq4m] { font-weight: 500; }
.scg-from[b-knqmkocq4m] {
    display: inline-block; margin-left: 6px; padding: 1px 6px; border-radius: 999px;
    font-size: 9.5px; font-weight: 800; letter-spacing: .04em; text-transform: uppercase;
    background: var(--surface2); color: var(--muted);
}

/* The "?" beside a calculated metric. Deliberately small and quiet — it explains on demand and
   never occupies a line of its own. */
.scg-info[b-knqmkocq4m] {
    margin-left: 5px; width: 16px; height: 16px; line-height: 14px; padding: 0;
    border-radius: 50%; border: 1px solid var(--line); background: var(--surface2);
    color: var(--muted); font-size: 10px; font-weight: 800; cursor: pointer;
}
.scg-info:hover[b-knqmkocq4m], .scg-info:focus-visible[b-knqmkocq4m] { color: var(--accent); border-color: var(--accent); }
.scg-infopop[b-knqmkocq4m] {
    display: block; margin-top: 3px; font-size: 11px; font-weight: 500;
    color: var(--muted); white-space: normal;
}

/* ── Section bands ─────────────────────────────────────────────────────────────────────────────
   A manager scanning 55 rows needs to find "Written Sales" without reading. The band is a tinted
   full-width strip with a coloured left edge and a rule above it — structure, not decoration. The
   table itself stays monochrome so the NUMBERS are what carry colour (red/green pace), which is the
   only place colour means something here. */
.scg-sec th[b-knqmkocq4m], .scg-sec td[b-knqmkocq4m] {
    border-top: 2px solid var(--line);
    border-bottom: 1px solid var(--line);
    padding-top: 7px; padding-bottom: 6px;
    background: var(--surface2);
}
.scg-sec .scg-name[b-knqmkocq4m] { z-index: 1; }          /* stays above the scrolling body like any name cell */
.scg-secname[b-knqmkocq4m] {
    font-size: 10.5px; text-transform: uppercase; letter-spacing: .07em; font-weight: 800;
    border-left: 4px solid var(--line);      /* overridden per section below */
    padding-left: 10px !important;
}

/* Colour by TOKEN, so every band is correct in light and dark without a second rule. Delivery /
   Install carries its own key precisely so it does not band with PPP or Third Party Finance. */
.sc-c-accent .scg-secname[b-knqmkocq4m] { color: var(--accent); border-left-color: var(--accent); }
.sc-c-green  .scg-secname[b-knqmkocq4m] { color: var(--green);  border-left-color: var(--green); }
.sc-c-amber  .scg-secname[b-knqmkocq4m] { color: var(--amber);  border-left-color: var(--amber); }
.sc-c-red    .scg-secname[b-knqmkocq4m] { color: var(--red);    border-left-color: var(--red); }
.sc-c-muted  .scg-secname[b-knqmkocq4m] { color: var(--muted);  border-left-color: var(--muted); }

/* The faintest possible wash across the band, keyed to the section's own colour. At 7% it reads as
   grouping and never as highlighting — the row underneath still looks like an ordinary row. */
.sc-c-accent.scg-sec th[b-knqmkocq4m], .sc-c-accent.scg-sec td[b-knqmkocq4m] { background: color-mix(in srgb, var(--accent) 7%, var(--surface2)); }
.sc-c-green.scg-sec  th[b-knqmkocq4m], .sc-c-green.scg-sec  td[b-knqmkocq4m] { background: color-mix(in srgb, var(--green) 7%, var(--surface2)); }
.sc-c-amber.scg-sec  th[b-knqmkocq4m], .sc-c-amber.scg-sec  td[b-knqmkocq4m] { background: color-mix(in srgb, var(--amber) 7%, var(--surface2)); }
.sc-c-red.scg-sec    th[b-knqmkocq4m], .sc-c-red.scg-sec    td[b-knqmkocq4m] { background: color-mix(in srgb, var(--red) 7%, var(--surface2)); }

.scg-act[b-knqmkocq4m] { width: 68px; text-align: center; }

/* A rollup that is missing somebody. A DOTTED UNDERLINE, not a colour: the figure is real and
   correct for whoever has reported, so it must not read as an error — it reads as "ask about this",
   with the tooltip naming how many are in. */
.scg-partial[b-knqmkocq4m] { border-bottom: 1px dotted var(--amber); cursor: help; }

/* The MEETING view is a single week and genuinely fits, so it may fill its container. Its four
   summary columns carry no .scg-sN class — they are not frozen, there is nothing to scroll — so
   they take the ordinary currency width rather than becoming auto columns that share the slack. */
.scg-week .scg[b-knqmkocq4m] { width: 100%; }
.scg-week .scg-num[b-knqmkocq4m] { width: var(--scg-s2-w); }
.scg-week .scg .scg-name[b-knqmkocq4m] { width: auto; min-width: 240px; max-width: 340px; }

/* On a phone the metric column gives ground first — but it does so by moving the VARIABLE, not by
   declaring a second width, so the fit measurement and the frozen offsets follow it. */
@media (max-width: 820px) {
    .scgwrap[b-knqmkocq4m] { --scg-metric-w: 160px; }
    .scg[b-knqmkocq4m] { font-size: 11.5px; }
}


/* ══ THREE ZONES ═══════════════════════════════════════════════════════════════════════════════
   LEFT frozen metric · CENTRE adaptive weeks · RIGHT management summary.
   In Recent mode the table fits its container, so the right zone needs no stickiness to stay on
   screen — it is simply always there. All-13 mode opts back into a content-width table. */
.scg-all .scg[b-knqmkocq4m] { width: max-content; min-width: 100%; }

/* The view control above the grid. */
.scgbar[b-knqmkocq4m] { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin: 0 0 8px; }
.scgseg[b-knqmkocq4m] { display: inline-flex; border: 1px solid var(--line); border-radius: 999px; overflow: hidden; }
.scgsegbtn[b-knqmkocq4m] {
    padding: 5px 13px; font-size: 12.5px; font-weight: 700; min-height: 30px;
    background: var(--surface); color: var(--muted); border: none; cursor: pointer;
}
.scgsegbtn:hover[b-knqmkocq4m] { color: var(--ink); background: var(--surface2); }
.scgsegbtn.on[b-knqmkocq4m] { background: var(--accent); color: #fff; }
.scgbarnote[b-knqmkocq4m] { font-size: 12px; color: var(--muted); }

/* ── Collapsed history ────────────────────────────────────────────────────────────────────────
   A CONTROL, not a label: it pages the week window. Narrow on purpose — every pixel it takes is a
   pixel the weeks or the summary lose. */
/* th/td-qualified for the same cascade reason as .scg-num: unqualified, the generic 4px 8px won
   and the chip's button rendered 38px wide inside a 54px column, cutting "‹ W1-W12" off mid-label. */
.scg th.scg-hist[b-knqmkocq4m], .scg td.scg-hist[b-knqmkocq4m] { width: var(--scg-hist-w); text-align: center; padding: 0; }
.scghistbtn[b-knqmkocq4m] {
    position: relative;                  /* the gap marker hangs off this — see .scggap */
    width: 100%; padding: 4px 1px; min-height: 34px;
    background: var(--surface2); border: none; border-right: 1px solid var(--line);
    color: var(--muted); font: inherit; font-size: 10.5px; font-weight: 800; cursor: pointer;
    white-space: nowrap;
}
.scghistbtn:hover[b-knqmkocq4m], .scghistbtn:focus-visible[b-knqmkocq4m] { color: var(--accent); background: var(--accent-soft); }
/* A collapsed ELAPSED week with nothing entered is a reporting gap, and hiding it silently is the
   one thing this whole window must not do. Amber, not red: it is a prompt, not a failure.
   ⚠ OUT OF THE FLOW, and that is the point. Inline it was 16px of a 50px chip, which pushed
   "‹ W1-W12" past the edge and cut off BOTH the week number and the marker itself — the window was
   hiding exactly the signal it exists to raise. In the corner it costs no width, so the longest
   label fits and the marker is always visible. The button's aria-label already says a week has no
   value entered, so nothing here is the only carrier of that fact. */
.scggap[b-knqmkocq4m] {
    position: absolute; top: 2px; right: 2px;
    margin: 0; width: 11px; height: 11px; line-height: 11px;
    border-radius: 50%; background: var(--amber); color: var(--surface);
    font-size: 8px; font-weight: 900;
}
.scg-histcell[b-knqmkocq4m] { color: var(--muted); text-align: center; font-size: 11px; }


/* The slack absorber — see the note in the markup. No width declared ON PURPOSE: under
   table-layout:fixed exactly one such column soaks up the remainder, which is what keeps every
   other column at the width it asked for. */
.scg-flex[b-knqmkocq4m] { padding: 0; border-bottom: 1px solid var(--line); background: var(--surface); }
.scg-sec .scg-flex[b-knqmkocq4m] { background: inherit; }


/* ══ THE RIGHT ZONE IS FROZEN TOO ══════════════════════════════════════════════════════════════
   THIS is the guarantee, and it is structural rather than arithmetic. The adaptive week window
   trims columns so that scrolling is usually unnecessary; this makes the management summary visible
   EVEN WHEN IT IS NOT — a mis-measured fit, a very narrow laptop, or All-13 mode can no longer push
   QTD…Needed/wk off the screen.

   ⚠ EACH OFFSET IS THE TOTAL WIDTH OF THE COLUMNS TO ITS RIGHT, AND IS NOT WRITTEN DOWN HERE.
   ScorecardGridMetrics.StickyRight(i) sums Width(j) for every j to the right of i and the component
   hands the answer over as --scg-sN-right. This file used to carry a hardcoded 72px step beside
   72px columns; All-13 mode then sized "REMAINING" and "NEEDED/WK" to their text (84px, 87px) under
   automatic layout and those two frozen columns overlapped their neighbours by 12px and 15px,
   covering figures. A width and its offset can no longer be changed independently.

   z-index above the body rows, below the header row, and each carries an opaque background — a
   transparent sticky cell shows the weeks sliding underneath it. */
.scg-s1[b-knqmkocq4m], .scg-s2[b-knqmkocq4m], .scg-s3[b-knqmkocq4m], .scg-s4[b-knqmkocq4m], .scg-s5[b-knqmkocq4m], .scg-s6[b-knqmkocq4m], .scg-s7[b-knqmkocq4m] {
    position: sticky; z-index: 1; background: var(--surface);
}
/* WIDTH AND OFFSET COME IN PAIRS, from the same array in ScorecardGridMetrics. The columns are
   deliberately unequal — "% Goal" holds "-123.4%" and has no business being as wide as a currency
   column — and the offsets are sums over those widths, so unequal costs nothing here. */
.scg-s1[b-knqmkocq4m] { width: var(--scg-s1-w); right: var(--scg-s1-right); }
.scg-s2[b-knqmkocq4m] { width: var(--scg-s2-w); right: var(--scg-s2-right); }
.scg-s3[b-knqmkocq4m] { width: var(--scg-s3-w); right: var(--scg-s3-right); }
.scg-s4[b-knqmkocq4m] { width: var(--scg-s4-w); right: var(--scg-s4-right); }
.scg-s5[b-knqmkocq4m] { width: var(--scg-s5-w); right: var(--scg-s5-right); }
.scg-s6[b-knqmkocq4m] { width: var(--scg-s6-w); right: var(--scg-s6-right); }
.scg-s7[b-knqmkocq4m] { width: var(--scg-s7-w); right: var(--scg-s7-right); }

/* The header cells of the same columns sit above BOTH axes. */
.scg thead .scg-s1[b-knqmkocq4m], .scg thead .scg-s2[b-knqmkocq4m], .scg thead .scg-s3[b-knqmkocq4m], .scg thead .scg-s4[b-knqmkocq4m],
.scg thead .scg-s5[b-knqmkocq4m], .scg thead .scg-s6[b-knqmkocq4m], .scg thead .scg-s7[b-knqmkocq4m] { z-index: 3; }

/* Section bands keep their tint under the frozen summary rather than showing white gaps. */
.scg-sec .scg-s1[b-knqmkocq4m], .scg-sec .scg-s2[b-knqmkocq4m], .scg-sec .scg-s3[b-knqmkocq4m], .scg-sec .scg-s4[b-knqmkocq4m],
.scg-sec .scg-s5[b-knqmkocq4m], .scg-sec .scg-s6[b-knqmkocq4m], .scg-sec .scg-s7[b-knqmkocq4m] { background: inherit; }
/* Hover likewise, so a row highlights across all three zones. */
.scg-row:hover .scg-s1[b-knqmkocq4m], .scg-row:hover .scg-s2[b-knqmkocq4m], .scg-row:hover .scg-s3[b-knqmkocq4m], .scg-row:hover .scg-s4[b-knqmkocq4m],
.scg-row:hover .scg-s5[b-knqmkocq4m], .scg-row:hover .scg-s6[b-knqmkocq4m], .scg-row:hover .scg-s7[b-knqmkocq4m] { background: var(--surface2); }

/* ⚠ table-layout:fixed NEEDS A DEFINITE WIDTH — AND ALL-13 NOW HAS ONE.
   With width:max-content Chrome silently falls back to AUTO layout and sizes every column from its
   content. That is the defect this file used to carry: in All-13 the last two summary columns grew
   to fit "REMAINING" and "NEEDED/WK" while their sticky offsets still assumed the declared 72px, so
   they sat on top of the columns beside them at every scroll position but the far right.

   Both modes are definite now. Recent uses width:100%; All-13 takes an inline pixel width the
   component computes as metric + weeks×week + summary, from the same constants as the columns
   themselves — so the table is exactly as wide as its columns, fixed layout stays in force, and
   every column renders at the width its offset was calculated from. min-width:100% only matters on
   a pane wider than the whole quarter, where the .scg-flex spacer absorbs the difference and the
   summary columns keep their declared widths. */
.scg[b-knqmkocq4m] { width: 100%; table-layout: fixed; }
.scg-all .scg[b-knqmkocq4m] { min-width: 100%; table-layout: fixed; }   /* width: inline, from the component */

/* ── THE WEEK BEING REPORTED ON ───────────────────────────────────────────────────────────────
   Every unfinished week is dimmed, so the current one needs something of its own or it reads as
   just another week that has not started. An accent rule under the heading and a tinted column —
   quiet enough not to compete with the red/green pace figures, which are the only other colour in
   the grid. */
.scg thead .scg-now[b-knqmkocq4m] { box-shadow: inset 0 -3px 0 var(--accent); }
.scg thead .scg-now .scg-wknum[b-knqmkocq4m] { color: var(--accent); }
.scg-cell.scg-now[b-knqmkocq4m] { background: color-mix(in srgb, var(--accent) 5%, var(--surface)); }
.scg-row:hover .scg-cell.scg-now[b-knqmkocq4m] { background: color-mix(in srgb, var(--accent) 9%, var(--surface2)); }

/* ══ SECTION-ORIENTED REVIEW ═══════════════════════════════════════════════════════════════════
   A section is a full-width row styled as a card. It is a ROW and not a <div> on purpose: the
   frozen metric column, the frozen summary, the adaptive week window and the editing behaviour are
   all properties of this one table's geometry, and lifting sections out of it would mean
   re-implementing every one of them per section. See the note in the markup. */
.scsec-head > th[b-knqmkocq4m] {
    padding: 0;
    background: var(--surface2);
    border-top: 2px solid var(--line);
    border-bottom: 1px solid var(--line);
}
.scsecbtn[b-knqmkocq4m] {
    /* Sticks to the left edge so the section is still named when the sheet is scrolled right —
       the row spans every column, so without this the heading slides away behind the frozen
       metric column. */
    position: sticky; left: 0;
    display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap;
    width: max-content; max-width: 100%;
    padding: 11px 14px;
    background: none; border: none; cursor: pointer; text-align: left;
    font: inherit; color: var(--ink);
}
.scsecbtn:hover .scsecname[b-knqmkocq4m], .scsecbtn:focus-visible .scsecname[b-knqmkocq4m] { color: var(--accent); }
.scsecbtn:focus-visible[b-knqmkocq4m] { outline: 2px solid var(--accent); outline-offset: -2px; }
.scsecname[b-knqmkocq4m] {
    font-size: 14px; font-weight: 800; letter-spacing: .04em; text-transform: uppercase;
}
.scsecmeta[b-knqmkocq4m] { font-size: 12px; color: var(--muted); font-weight: 600; }
.scsecdot[b-knqmkocq4m] { opacity: .5; margin: 0 2px; }
/* Pace reads as a verdict, so it carries the same red/green the figures do — and nothing else in
   the header does, which keeps the verdict the only coloured thing in the overview. */
.scsecpace.behind[b-knqmkocq4m] { color: var(--red); font-weight: 800; }
.scsecpace.onpace[b-knqmkocq4m] { color: var(--green); font-weight: 800; }
/* ⚠ NOT GREEN, AND NOT RED. "Not reported" is the absence of a verdict, so it must not borrow the
   colour of either one — an empty scorecard glowing green is the single most misleading thing this
   header could do. */
.scsecpace.unreported[b-knqmkocq4m] { color: var(--muted); font-weight: 700; font-style: italic; }
.scsecgap[b-knqmkocq4m] { color: var(--amber); font-weight: 800; }
.scsecopen[b-knqmkocq4m] {
    font-size: 12px; font-weight: 800; color: var(--accent);
    letter-spacing: .03em; margin-left: auto; white-space: nowrap;
}
.scsecchev[b-knqmkocq4m] { display: inline-block; margin-left: 3px; }

/* The open section keeps a coloured left edge down its header so the eye can find where it began. */
.scsec-head.on > th[b-knqmkocq4m] { background: var(--surface); border-bottom: 2px solid var(--accent); }
.scsec-head.on .scsecname[b-knqmkocq4m] { color: var(--accent); }

/* ── DONE WITH THIS SECTION ───────────────────────────────────────────────────────────────────
   Closes from the BOTTOM, where the reading ended. */
.scsec-foot > td[b-knqmkocq4m] {
    padding: 0; background: var(--surface2);
    border-top: 2px solid var(--line); border-bottom: 2px solid var(--line);
}
.scsecdone[b-knqmkocq4m] {
    position: sticky; left: 0;
    display: inline-flex; align-items: center; gap: 7px;
    margin: 9px 14px; padding: 7px 15px;
    font: inherit; font-size: 12.5px; font-weight: 700;
    color: var(--accent); background: var(--surface);
    border: 1px solid var(--accent); border-radius: 999px; cursor: pointer;
}
.scsecdone:hover[b-knqmkocq4m], .scsecdone:focus-visible[b-knqmkocq4m] { background: var(--accent-soft); }
.scsecdone:focus-visible[b-knqmkocq4m] { outline: 2px solid var(--accent); outline-offset: 2px; }
.scsectick[b-knqmkocq4m] { font-weight: 900; }

/* ── SUB-GROUP BANDS (Retail / Apartment / Contract / TOTAL) ──────────────────────────────────
   Quieter than a section by design: this is chunking WITHIN a section, so it must read as a rule
   with a word on it, never as a second level of section heading. The label comes from
   ScorecardMetric.GroupLabel — the component never parses a display name. */
.scg-band > th[b-knqmkocq4m] {
    /* text-align:left explicitly: a bare <th> centres, which put the band label out over the week
       columns instead of above the metric names it heads. */
    padding: 0; text-align: left; background: var(--surface);
    border-top: 1px solid var(--line); border-bottom: none;
}
.scg-bandname[b-knqmkocq4m] {
    position: sticky; left: 0;
    display: inline-block; padding: 7px 0 3px 14px;
    font-size: 10px; font-weight: 800; letter-spacing: .1em; text-transform: uppercase;
    color: var(--muted);
}

/* ── RESULT AND CONTRIBUTOR ROWS ──────────────────────────────────────────────────────────────
   Derived from the calculation graph (ScorecardSectionView), never from the name. A TOTAL must read
   as the RESULT of the rows above it rather than as one more unrelated line, so it gets weight and
   a rule; hovering it lights up the very metrics it is computed from. */
.scg-result > .scg-name[b-knqmkocq4m] { font-weight: 800; }
.scg-result > th[b-knqmkocq4m], .scg-result > td[b-knqmkocq4m] { border-top: 1px solid var(--line); }
.scg-rollup[b-knqmkocq4m] {
    display: inline-block; margin-right: 5px;
    color: var(--accent); font-weight: 900; cursor: help;
    transform: rotate(180deg) translateY(-2px);
}
.scg-contrib > .scg-name .scg-mname[b-knqmkocq4m] { padding-left: 11px; }

/* ── THE SECTION OVERVIEW ─────────────────────────────────────────────────────────────────────
   With every section closed there is not one data cell on screen, so a row of week and summary
   headings above a stack of cards labels nothing. Hidden only in that state.

   ⚠ SAFE ONLY BECAUSE NOTHING NEEDS ALIGNING HERE. table-layout:fixed takes its column widths from
   the first row, so display:none on the header would normally collapse the geometry — but every row
   in the overview is a full-width colspan card, and the header returns the moment a section opens. */
.scg-overview thead[b-knqmkocq4m] { display: none; }
.scg-overview .scg[b-knqmkocq4m] { border-top: none; }

/* ── NOT APPLICABLE ───────────────────────────────────────────────────────────────────────────
   ⚠ THREE STATES THAT MUST NOT LOOK ALIKE:
       0     a reported zero — real data, rendered normally
       —     applicable but not reported — a gap somebody owes
       N/A   not part of this seat — nobody owes it, and nothing is outstanding
   So N/A gets its own quiet treatment rather than the em dash: the row recedes, the cells carry a
   faint dot instead of an entry box, and a single badge on the NAME says why once, rather than
   thirteen times across the week columns. */
.scg-na > .scg-name .scg-mname[b-knqmkocq4m] { color: var(--muted); font-weight: 500; }
.scg-na > td[b-knqmkocq4m] { background: color-mix(in srgb, var(--muted) 4%, var(--surface)); }
.scg-row.scg-na:hover > td[b-knqmkocq4m] { background: color-mix(in srgb, var(--muted) 7%, var(--surface2)); }
.scg-nabadge[b-knqmkocq4m] {
    display: inline-block; margin-left: 6px; padding: 1px 6px; border-radius: 999px;
    font-size: 9.5px; font-weight: 800; letter-spacing: .04em;
    background: var(--surface2); color: var(--muted); cursor: help;
}
.scg-namark[b-knqmkocq4m] { color: var(--muted); opacity: .45; cursor: help; }
.scsecna[b-knqmkocq4m] { color: var(--muted); font-weight: 700; }
.scg-band-na > th[b-knqmkocq4m] { background: color-mix(in srgb, var(--muted) 4%, var(--surface)); }
.scg-bandna[b-knqmkocq4m] { margin-left: 8px; font-size: 10px; font-weight: 700; letter-spacing: .04em;
              text-transform: uppercase; color: var(--muted); }
.scg-bandshow[b-knqmkocq4m] { margin-left: 8px; background: none; border: none; padding: 0; cursor: pointer;
                font: inherit; font-size: 10px; font-weight: 800; letter-spacing: .04em;
                text-transform: uppercase; color: var(--accent); }
.scg-bandshow:hover[b-knqmkocq4m] { text-decoration: underline; }
