/*! FocalShift Ai · Mission Control shell partials · MC-SHELL-DELIVERY-2 (ruling 454 phase 2, 11 Sep 2026).
    Generated by build/externalise.py from the partial's own inline block(s) — byte-for-byte the same
    rules/code, moved out of the document so the browser can cache them. The filename carries the
    content hash; a changed file is a new name, never an overwrite. */
/* ── from private_html/_fs_modal.php: <style id=fs-modal-assets> ── */
/* ===================== FocalShift canonical modal (.fsm-*) ===================== */
.fsm-scrim{
  --pnl:#fff;--pnl2:#f4f4fb;--sft:#f7f7fc;--ln:#ececf4;--ln2:#e0e1ef;
  --tx:#23233a;--mut:#6b7194;--fnt:#9b9cb4;--brt:#1c1c30;
  --acc:#615dfa;--acc2:#5551e8;--grn:#16c43b;--gld:#d6307a;--amb:#d98a12;
  position:fixed;inset:0;background:rgba(14,16,30,.58);backdrop-filter:blur(5px);-webkit-backdrop-filter:blur(5px);
  z-index:1200;display:none;align-items:flex-start;justify-content:center;padding:34px 18px;overflow:auto;
  font-family:Inter,-apple-system,"Segoe UI",sans-serif}
html.fs-dark .fsm-scrim,.fs-dark .fsm-scrim{
  --pnl:#1d1e2b;--pnl2:#23243a;--sft:#20213a;--ln:#2e2f44;--ln2:#33344c;
  --tx:#e9e9f3;--mut:#a0a4c0;--fnt:#8f91ac;--brt:#f4f6ff;--acc2:#8d8aff;--gld:#ff6b9d;--amb:#e6a53a}
.fsm-scrim.on{display:flex}
.fsm-scrim *{box-sizing:border-box}
.fsm{width:100%;max-width:940px;background:var(--pnl);border:1px solid var(--ln2);border-radius:14px;overflow:hidden;
  box-shadow:0 40px 100px -24px rgba(16,16,45,.6);display:flex;flex-direction:column;max-height:calc(100vh - 68px);
  transform:translateY(14px) scale(.985);opacity:0;transition:transform .26s cubic-bezier(.2,.9,.28,1),opacity .2s ease}
.fsm-scrim.on .fsm{transform:none;opacity:1}
.fsm--sm{max-width:480px}.fsm--md{max-width:640px}.fsm--lg{max-width:940px}.fsm--xl{max-width:1040px}
/* ══ `sheet` — the full-height off-canvas side sheet (WO-ADDPROD, 8/9) ═══════════
   A FIRST-CLASS canon size, not bespoke geometry on one page: any surface that is a
   WORKBENCH rather than a confirmation asks for size => 'sheet' and inherits all of
   this, so the next side sheet does not reinvent it.
   Flush right, zero outer margin on three sides — "too much empty space on the left
   and right" disappears by construction, because the sheet HAS no left and right
   space. 880px, not 760: the width has to do WORK. A 296px preview rail still leaves
   the form column ~584px, which carries 2-up and 3-up rows; at 760 the same rail left
   ~440px and the fields collapsed back toward a single stack.
   Under 1000px the sheet takes the whole width and the preview slides beneath the
   form — same markup, same code path, because it is a sheet and has somewhere to go. */
.fsm-scrim--sheet{padding:0;align-items:stretch;justify-content:flex-end;overflow:hidden}
.fsm--sheet{max-width:880px;height:100%;max-height:100%;border-radius:0;
  border-width:0 0 0 1px;box-shadow:-30px 0 70px -30px rgba(16,16,45,.45);
  transform:translateX(30px)}
html.fs-dark .fsm--sheet,.fs-dark .fsm--sheet{box-shadow:-30px 0 70px -30px rgba(0,0,0,.75)}
.fsm-scrim--sheet.on .fsm--sheet{transform:none}
.fsm--sheet .fsm-body.two{grid-template-columns:1fr 296px}
/* a strip between the body and the footer — a session tray, a running total, a
   progress line. Emitted by fs_modal_footer(['before'=>…]); absent when unused. */
.fsm-strip{padding:11px 24px;border-top:1px solid var(--ln);background:var(--pnl2);
  display:flex;align-items:center;gap:9px;flex-wrap:wrap}
/* extra header controls, right of the title and left of the close (fs_modal_begin
   ['headExtra'=>…]) — the two or three things that only exist on an EXISTING record. */
.fsm-headx{display:flex;align-items:center;gap:7px;flex:none}
.fsm-hb{border:1px solid var(--ln2);background:var(--pnl2);color:var(--fsc-muted,#6a6a8b);border-radius:10px;
  font:700 11.5px/1 Inter,-apple-system,"Segoe UI",Roboto,sans-serif;padding:9px 12px;cursor:pointer;
  display:inline-flex;align-items:center;gap:6px;white-space:nowrap}
.fsm-hb:hover{color:var(--tx);border-color:var(--acc)}
.fsm-hb i,.fsm-hb svg{width:13px;height:13px}
.fsm-hb.danger:hover{border-color:var(--gld);color:var(--gld)}
@media(max-width:1000px){
  .fsm--sheet{max-width:100%}
  .fsm--sheet .fsm-body.two{grid-template-columns:1fr}
  .fsm--sheet .fsm-preview{border-left:0;border-top:1px solid var(--ln)}
}
/* header */
.fsm-head{display:flex;align-items:flex-start;gap:14px;padding:20px 24px;border-bottom:1px solid var(--ln)}
/* ══ WO-TILESWEEP (8/7) · Hans's platform-wide law ═══════════════════════════════
   "Remove the square behind it, increase the size of the icon, and make the icon
   itself a gradient." This is THE specimen tile — the header mark of every popup on
   the platform — so the law lands on the canonical rule and ships to all 148 files
   that call fs_modal_assets()/fs_modal_begin() at once.
   PROPORTION: the treatment Hans already approved on the pen icon (WO-DZ6,
   public_html/_dz_start_modal.php) — 46px plate / 23px glyph becomes NO plate, a
   36px box and a 36px glyph, so the icon fills the space the plate used to occupy.
   GRADIENT: the platform family, stops lifted verbatim from #fscnGrad/#fscnGradD in
   the Create-New menu (_mc_shellA.php). userSpaceOnUse over Lucide's 24x24 user space
   is LOAD-BEARING — with the default objectBoundingBox an axis-aligned glyph gets a
   zero-area box and the spec says do not paint it, so the icon would vanish.
   A solid colour follows the url() as the SVG paint fallback, so the glyph can never
   disappear on a page that failed to emit the defs.
   !important on background/box-shadow is REQUIRED: several callers (and the danger
   variant below, before this wave) set the plate as an INLINE style attribute, which
   would otherwise beat this rule. Light and dark both shipped. */
.fsm-hicon{width:36px;height:36px;flex:0 0 36px;border-radius:0;display:flex;align-items:center;justify-content:center;
  background:none!important;background-image:none!important;box-shadow:none!important;border:0!important;
  color:var(--fsc-violet-2,#5450ee)}
.fsm-hicon i,.fsm-hicon svg{width:36px;height:36px}
.fsm-hicon svg{stroke:url(#fsmGrad) #5b57ef;stroke-width:1.5;overflow:visible}
html.fs-dark .fsm-hicon,.fs-dark .fsm-hicon{color:#8b87ff}
html.fs-dark .fsm-hicon svg,.fs-dark .fsm-hicon svg{stroke:url(#fsmGradD) #8b87ff}
/* the danger confirm keeps its red SIGNAL now that the red plate is gone — same two
   stops the inline plate used (#d6307a -> #ff6b9d), moved onto the glyph itself. */
.fsm-hicon--danger svg{stroke:url(#fsmGradR) #d6307a}
html.fs-dark .fsm-hicon--danger svg,.fs-dark .fsm-hicon--danger svg{stroke:url(#fsmGradR) #ff6b9d}
.fsm-htx{flex:1;min-width:0}
.fsm-htx h2{margin:0;font:800 18px/1.25 Sora,Inter,system-ui,sans-serif;color:var(--brt)}
.fsm-htx p{margin:3px 0 0;font:400 12.5px/1.5 Inter;color:var(--fsc-muted,#6a6a8b)}
.fsm-x{background:none;border:0;color:var(--fnt);cursor:pointer;font-size:22px;line-height:1;padding:0;border-radius:8px;width:30px;height:30px;display:inline-flex;align-items:center;justify-content:center;flex:none}
.fsm-x:hover{color:var(--tx);background:var(--pnl2)}
/* body */
.fsm-body{display:grid;grid-template-columns:1fr;min-height:0;flex:1;overflow:hidden}
.fsm-body.two{grid-template-columns:1fr 344px}
.fsm-form{padding:22px 24px 26px;overflow-y:auto;min-height:0}
.fsm-preview{background:var(--sft);border-left:1px solid var(--ln);padding:22px 22px 26px;overflow-y:auto;min-height:0}
/* sections + fields */
.fsm-sec{margin-bottom:20px}
.fsm-sec:last-child{margin-bottom:0}
.fsm-lbl{display:block;font:800 10px/1 Inter;letter-spacing:.09em;text-transform:uppercase;color:var(--fnt);margin:0 0 9px}
.fsm-lbl .req{color:var(--gld);margin-left:2px}
.fsm-in{width:100%;border:1.5px solid var(--ln2);border-radius:11px;padding:12px 13px;font:500 14px/1.4 Inter;color:var(--tx);background:var(--pnl);outline:none;transition:border-color .12s}
.fsm-in.big{font:700 17px/1.3 Inter;padding:13px 14px}
textarea.fsm-in{resize:vertical;min-height:84px;line-height:1.5}
.fsm-in::placeholder{color:var(--fnt);font-weight:500}
.fsm-in:focus{border-color:var(--acc);box-shadow:0 0 0 3px rgba(97,93,250,.14)}
.fsm-in.bad{border-color:var(--gld);box-shadow:0 0 0 3px rgba(214,48,122,.12)}
.fsm-hint{margin:7px 1px 0;font:500 11.5px/1.5 Inter;color:var(--fnt);display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.fsm-hint b{color:var(--fsc-muted,#6a6a8b);font-weight:700}
.fsm-hint code{font:700 11px/1 ui-monospace,monospace;color:var(--acc2);background:rgba(97,93,250,.1);padding:3px 6px;border-radius:6px}
.fsm-cc{margin:7px 1px 0;font:600 11px/1 ui-monospace,monospace;color:var(--fnt);text-align:right}
.fsm-err{display:none;margin:8px 1px 0;font:700 11.5px/1.4 Inter;color:var(--gld);align-items:center;gap:6px}
.fsm-err.show{display:flex}
.fsm-err i,.fsm-err svg{width:13px;height:13px}
/* chips */
.fsm-chips{display:flex;flex-wrap:wrap;gap:8px}
.fsm-chip{display:inline-flex;align-items:center;gap:6px;padding:8px 13px;border:1.5px solid var(--ln2);border-radius:99px;
  font:600 12.5px/1 Inter;color:var(--fsc-muted,#6a6a8b);background:var(--pnl);cursor:pointer;transition:all .12s;user-select:none}
.fsm-chip:hover{border-color:var(--acc);color:var(--tx)}
.fsm-chip.on{background:var(--acc);border-color:var(--acc);color:#fff}
.fsm-chip.on:hover{color:#fff}
.fsm-chipwrap{max-height:132px;overflow-y:auto;padding:2px}
/* glyph grid */
.fsm-glyphs{display:grid;grid-template-columns:repeat(8,1fr);gap:8px}
.fsm-glyph{aspect-ratio:1;display:flex;align-items:center;justify-content:center;border:1.5px solid var(--ln2);border-radius:11px;
  color:var(--fsc-muted,#6a6a8b);background:var(--pnl);cursor:pointer;transition:all .12s}
.fsm-glyph i,.fsm-glyph svg{width:19px;height:19px}
.fsm-glyph:hover{border-color:var(--acc);color:var(--tx)}
.fsm-glyph.on{background:rgba(97,93,250,.12);border-color:var(--acc);color:var(--acc2)}
/* radio cards */
.fsm-radios{display:flex;flex-direction:column;gap:9px}
.fsm-radio{display:flex;align-items:flex-start;gap:11px;padding:12px 13px;border:1.5px solid var(--ln2);border-radius:12px;background:var(--pnl);cursor:pointer;transition:all .12s}
.fsm-radio:hover{border-color:var(--acc)}
.fsm-radio.on{border-color:var(--acc);background:rgba(97,93,250,.06)}
.fsm-radio .dot{width:17px;height:17px;flex:0 0 17px;margin-top:1px;border-radius:50%;border:2px solid var(--ln2);position:relative;transition:border-color .12s}
.fsm-radio.on .dot{border-color:var(--acc)}
.fsm-radio.on .dot::after{content:"";position:absolute;inset:3px;border-radius:50%;background:var(--acc)}
.fsm-radio .rt{font:700 13px/1.25 Inter;color:var(--tx)}
.fsm-radio .rd{margin-top:2px;font:500 11.5px/1.45 Inter;color:var(--fsc-muted,#6a6a8b)}
/* info / visibility note */
.fsm-vis{margin-top:11px;padding:10px 12px;border:1px solid var(--ln);background:var(--pnl2);border-radius:10px;font:500 12px/1.5 Inter;color:var(--fsc-muted,#6a6a8b);display:flex;gap:8px;align-items:flex-start}
.fsm-vis i,.fsm-vis svg{width:15px;height:15px;flex:0 0 15px;margin-top:1px;color:var(--acc2)}
/* collapsible */
.fsm-collapse{border:1px solid var(--ln);border-radius:13px;background:var(--pnl2);overflow:hidden}
.fsm-ctog{display:flex;align-items:center;gap:11px;width:100%;padding:13px 14px;border:0;background:none;cursor:pointer;text-align:left}
.fsm-ctog .ci{width:34px;height:34px;flex:0 0 34px;border-radius:10px;background:rgba(97,93,250,.12);color:var(--acc2);display:flex;align-items:center;justify-content:center}
.fsm-ctog .ci i,.fsm-ctog .ci svg{width:17px;height:17px}
.fsm-ctog .ct{flex:1;min-width:0}
.fsm-ctog .ct b{display:block;font:700 13px/1.2 Inter;color:var(--tx)}
.fsm-ctog .ct span{display:block;margin-top:2px;font:500 11.5px/1.4 Inter;color:var(--fsc-muted,#6a6a8b)}
.fsm-ctog .cx{width:16px;height:16px;color:var(--fnt);transition:transform .18s}
.fsm-collapse.open .fsm-ctog .cx{transform:rotate(180deg)}
.fsm-cbody{display:none;padding:0 14px 14px}
.fsm-collapse.open .fsm-cbody{display:block}
/* preview column label */
.fsm-pvlbl{font:800 9.5px/1 Inter;letter-spacing:.11em;text-transform:uppercase;color:var(--fnt);margin:0 0 12px;display:flex;align-items:center;gap:6px}
.fsm-pvlbl .lv{width:6px;height:6px;border-radius:50%;background:var(--grn);box-shadow:0 0 0 3px rgba(22,196,59,.2)}
/* top error banner */
.fsm-topbanner{margin:16px 24px 0;padding:11px 14px;border:1px solid rgba(214,48,122,.35);background:rgba(214,48,122,.08);border-radius:11px;font:600 12.5px/1.4 Inter;color:var(--gld);display:flex;align-items:center;gap:8px}
.fsm-topbanner i,.fsm-topbanner svg{width:15px;height:15px;flex:0 0 15px}
/* footer */
.fsm-foot{display:flex;align-items:center;gap:12px;padding:16px 24px;border-top:1px solid var(--ln);background:var(--pnl)}
.fsm-sum{flex:1;min-width:0;font:500 12px/1.45 Inter;color:var(--fsc-muted,#6a6a8b);display:flex;align-items:center;gap:8px}
.fsm-sum i,.fsm-sum svg{width:15px;height:15px;flex:0 0 15px;color:var(--acc2)}
.fsm-ghost{border:1px solid var(--ln2);background:var(--pnl2);color:var(--fsc-muted,#6a6a8b);border-radius:11px;font:700 13px/1 Inter;padding:0 18px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;height:42px;box-sizing:border-box}
.fsm-ghost:hover{color:var(--tx)}
.fsm-go{display:inline-flex;align-items:center;gap:8px;border:0;background:var(--acc);color:#fff;border-radius:11px;font:800 14px/1 Inter;padding:13px 24px;cursor:pointer;box-shadow:0 8px 20px -8px rgba(97,93,250,.7)}
.fsm-go i,.fsm-go svg{width:16px;height:16px}
.fsm-go:hover{filter:brightness(1.05)}
.fsm-go.danger{background:var(--gld);box-shadow:0 8px 20px -8px rgba(214,48,122,.7)}
.fsm-go[disabled]{opacity:.55;cursor:not-allowed;box-shadow:none}
/* responsive */
@media(max-width:720px){
  .fsm-body.two{grid-template-columns:1fr}
  .fsm-preview{border-left:0;border-top:1px solid var(--ln)}
  .fsm-glyphs{grid-template-columns:repeat(6,1fr)}
  .fsm-foot{flex-wrap:wrap}
}
/* WO-MCFIX-0823 BEGIN SCRIM-top
   fsConfirm/fsAlert/fsPrompt build their scrim at runtime with a generated id
   (buildScrim(): 'fsm-dyn-'+N), so the per-id z-index overrides that lift the
   declared modals above a drawer never matched them. They stayed at the .fsm-scrim
   base of 1200 and opened UNDERNEATH the Client Work manage drawer (z=1201) and the
   PULSE Customers profile drawer (z=4000) — clipped, with Cancel/Delete off-screen.
   A runtime confirm is by definition the topmost dialog, so it rides above every
   drawer; toasts move up in step so they still clear it. Declared modals are
   untouched: their own ids and their 1310 overrides keep working as before. */
.fsm-scrim[id^="fsm-dyn-"]{z-index:4300}
/* WO-MCFIX-0823 END SCRIM-top */
/* ===================== toast ===================== */
.fsm-toasts{position:fixed;top:18px;right:18px;z-index:4400;display:flex;flex-direction:column;gap:10px;
  font-family:Inter,-apple-system,"Segoe UI",sans-serif;max-width:min(92vw,380px);pointer-events:none}
.fsm-toast{--tc:#615dfa;pointer-events:auto;display:flex;align-items:flex-start;gap:11px;padding:13px 14px;border-radius:13px;
  background:#fff;border:1px solid #e0e1ef;box-shadow:0 18px 44px -18px rgba(16,16,45,.5);position:relative;overflow:hidden;
  transform:translateX(18px);opacity:0;transition:transform .28s cubic-bezier(.2,.9,.28,1),opacity .22s ease}
html.fs-dark .fsm-toast,.fs-dark .fsm-toast{background:#23243a;border-color:#33344c}
.fsm-toast.in{transform:none;opacity:1}
.fsm-toast::before{content:"";position:absolute;left:0;top:0;bottom:0;width:4px;background:var(--tc)}
.fsm-toast .ti{width:20px;height:20px;flex:0 0 20px;margin-top:1px;color:var(--tc);display:flex;align-items:center;justify-content:center}
.fsm-toast .ti i,.fsm-toast .ti svg{width:18px;height:18px}
.fsm-toast .tb{flex:1;min-width:0}
.fsm-toast .tt{font:800 12.5px/1.35 Inter;color:#1c1c30}
html.fs-dark .fsm-toast .tt,.fs-dark .fsm-toast .tt{color:#f4f6ff}
.fsm-toast .tm{font:500 12.5px/1.45 Inter;color:#6b7194;margin-top:2px;word-break:break-word}
html.fs-dark .fsm-toast .tm,.fs-dark .fsm-toast .tm{color:#a0a4c0}
.fsm-toast .tx{background:none;border:0;color:var(--fsc-muted,#6a6a8b);cursor:pointer;font-size:16px;line-height:1;padding:0 2px;margin-top:-1px}
.fsm-toast .tx:hover{color:#6b7194}
.fsm-toast .ta{margin-top:8px}
.fsm-toast .ta button{background:none;border:0;color:var(--tc);font:800 12px/1 Inter;cursor:pointer;padding:0}
.fsm-toast .ta button:hover{text-decoration:underline}
.fsm-toast.success{--tc:#16c43b}.fsm-toast.error{--tc:#d6307a}.fsm-toast.info{--tc:#615dfa}.fsm-toast.warn{--tc:#d98a12}
html.fs-dark .fsm-toast.error,.fs-dark .fsm-toast.error{--tc:#ff6b9d}
