/* widgets/shell — the shell's chrome (biz-switcher, firm/client rails, header row,
   .page-title) predates the widget tree and lives in the shared skeleton stylesheet
   (styles.css §"Business switcher (sidebar)" and §nav) inside its responsive wrapper
   context — moving it out of that wrapper would change scoping, so it stays put. */

/* U8 TENANT-PROFILE GATE (7/22 — the white-label mechanism). body.tenant-customer is
   set by the shell from firm.json tenant.profile (or the deploy-baked window.__TENANT
   hint). The render.js gates already skip the compute; these rules are the belt that
   collapses the internal-only containers so no empty holes remain. Absent the class
   (every MOTM render) this block is inert — byte-identical output. */
/* DEMO HEARTBEAT (7/23 spec): a customer tenant in DEMO mode (body.demo-on — every
   white-label demo deploy pins it) keeps the living layer VISIBLE, fed by the synthetic
   heartbeat payload. Only a customer tenant with demo OFF (a future live-data customer
   instance) stays collapsed. */
/* #mission-feed LEFT THIS LIST 2026-08-14 (v0.2.6, defect #12's CSS twin). The "future
   live-data customer instance" the note above anticipated is now the shipping product,
   and the feed is the buyer's OWN work in flight — not our fleet's ops. It was gated
   here for the same reason it was gated in JS: on the day this was written the only
   thing the feed could render was our lanes. The JS gate is gone (mission-feed/render.js)
   and this rule is why removing it changed nothing on a live tenant — display:none wins
   over any amount of correctly-computed markup, silently, with no error anywhere. A gate
   with a twin in another language is one gate you can lift and one you cannot see.
   #sidebar-fleet and #fleet-strip STAY: those are our fleet rails, and a buyer has no
   fleet. */
/* ── AND THAT PREMISE EXPIRED 2026-08-17 (Craig 2:29p, STANDING LAW, verbatim: "Why wouldn't
   they have all of this?" — buyer-glass parity by default: HIDING A SURFACE NEEDS A REASON,
   SHOWING IT DOESN'T). The reason above is a claim about the buyer's DATA — "a buyer has no
   fleet" — not about the surface, and a firm whose own fold carries fleet.running/queued/lanes
   has falsified it. So the rule goes conditional on the data rather than gaining a new profile
   tier: widgets/shell/render.js sets body.has-own-fleet from THIS tenant's payload, and this
   hide stands down under it. A fleet-LESS customer fold still matches, so the original
   rationale keeps protecting an empty firm — which is the whole reason the gate is keyed on
   the fold instead of simply deleted, the way #mission-feed's was.
   ITS JS TWIN WENT WITH IT (fleet-strip/render.js, both renderers). The 8/14 lesson above is
   the whole reason this note says so out loud: display:none wins over correctly-computed
   markup, silently, and a gate with a twin in another language is one gate you can lift and
   one you cannot see. Lifting only this half would have shown a buyer an empty rail; lifting
   only that half would have shown nothing at all, with no error anywhere. */
body.tenant-customer:not(.demo-on):not(.has-own-fleet) #sidebar-fleet,
body.tenant-customer:not(.demo-on):not(.has-own-fleet) #fleet-strip { display: none !important; }
/* with fleet/content/vault/biz gated, the landing's right rail holds only an empty
   'The Business' header + OUR North Star roadmap tile — collapse it and let the
   close spine own the full width */
body.tenant-customer:not(.demo-on) #ops-pane-today .ft-vrail { display: none !important; }
body.tenant-customer:not(.demo-on) #ops-pane-today .ft-zones { grid-template-columns: 1fr !important; }
