:root{
  --ink:#101820; --ink-2:#3d4b58; --ink-3:#7b8794;
  --paper:#fff; --shell:#eef1f4; --line:#d6dde4;
  --navy:#25408F; --navy-soft:#e8ecf7;
  --amber:#b4700d; --amber-soft:#fdf3e0;
  --green:#1d6b4a; --red:#a32626;
  --r:4px; --mono:'JetBrains Mono',ui-monospace,Menlo,monospace;
  --fs:13px; --pad:4px 8px; --rowh:1.35;
}
/* Projector mode: same board, scaled up. One screen, both jobs. */
body.proj{--fs:19px;--pad:9px 10px;--rowh:1.5}
*{box-sizing:border-box}
#app{font-family:'Archivo',system-ui,sans-serif;color:var(--ink);background:var(--shell);
  font-size:var(--fs);line-height:var(--rowh);margin:0 auto;max-width:1180px}
body.proj #app{max-width:none}
h1,h2{margin:0;font-family:'Archivo Narrow','Archivo',sans-serif;letter-spacing:-.01em}
button{font:inherit;cursor:pointer;border:1px solid var(--line);background:var(--paper);
  border-radius:var(--r);padding:5px 10px;color:var(--ink-2)}
button:hover{border-color:var(--navy);color:var(--navy)}
button:focus-visible,[contenteditable]:focus-visible{outline:2px solid var(--navy);outline-offset:1px}

.top{background:var(--navy);color:#fff;padding:12px 18px;display:flex;gap:14px;align-items:center;flex-wrap:wrap}
.top h1{font-size:19px;text-transform:uppercase;letter-spacing:.06em}
body.proj .top h1{font-size:28px}
.top .meta{font-family:var(--mono);font-size:11px;color:#b3bfe4;letter-spacing:.04em}
.top .sp{flex:1}
.top button{background:transparent;color:#cddcea;border-color:#4a63ad}
.top button:hover{background:#1b3070;color:#fff;border-color:#8f9fd6}
.top button.on{background:#fff;color:var(--navy);border-color:#fff}

/* save indicator — a failed save must be loud, never a silent revert */
.saver{font-family:var(--mono);font-size:11px;padding:3px 9px;border-radius:11px;
  background:#1b3070;color:#7fa5c9}
.saver.ok{color:#8fe0b4}.saver.err{background:var(--red);color:#fff;font-weight:700}

.tally{display:flex;gap:1px;background:var(--line);border-bottom:1px solid var(--line);overflow-x:auto}
.tally div{background:var(--paper);padding:7px 14px;min-width:112px;flex:1}
.tally .k{font-size:9.5px;letter-spacing:.13em;text-transform:uppercase;color:var(--ink-3)}
.tally .v{font-family:var(--mono);font-size:17px;font-weight:700}
body.proj .tally .v{font-size:24px}
main{padding:14px 18px 60px}
.tabs{display:flex;gap:2px;margin-bottom:12px;border-bottom:1px solid var(--line)}
.tabs button{border:none;border-bottom:2px solid transparent;background:none;border-radius:0;
  padding:7px 12px;font-weight:600;color:var(--ink-3)}
.tabs button.on{color:var(--navy);border-bottom-color:var(--navy)}

.stage{background:var(--paper);border:1px solid var(--line);border-radius:var(--r);margin-bottom:11px}
/* the stage being worked through — visible from the back of the room */
.stage.current{border-color:var(--navy);box-shadow:0 0 0 3px var(--navy-soft)}
.stage>header{display:flex;align-items:center;gap:10px;padding:6px 10px;border-bottom:1px solid var(--line);
  background:linear-gradient(var(--paper),var(--shell));cursor:pointer}
.stage h2{font-size:12.5px;text-transform:uppercase;letter-spacing:.09em}
body.proj .stage h2{font-size:20px}
.pill{font-family:var(--mono);font-size:10px;background:var(--navy-soft);color:var(--navy);padding:2px 6px;border-radius:10px}
.stage .tot{margin-left:auto;font-family:var(--mono);font-weight:700}
table{width:100%;border-collapse:collapse}
th{font-size:9.5px;letter-spacing:.11em;text-transform:uppercase;color:var(--ink-3);
  text-align:left;font-weight:600;padding:5px 8px;border-bottom:1px solid var(--line)}
body.proj th{font-size:12px}
td{padding:var(--pad);border-bottom:1px solid #eef1f4;vertical-align:top}
tr.row:hover{background:#f7f9fb}
tr.dragging{opacity:.35}
tr.over td{box-shadow:inset 0 2px 0 var(--navy)}
/* an edit must be obvious at projector distance */
@keyframes flash{0%{background:#fff6d9}100%{background:transparent}}
tr.saved td{animation:flash 1.5s ease-out}
tr.editing td{background:#fff6d9}
.stage.drop-target{border-color:var(--navy);box-shadow:0 0 0 3px var(--navy-soft)}
.grip{cursor:grab;color:#c3cdd7;user-select:none;width:16px;text-align:center}
[contenteditable]{min-height:1em;border-radius:2px}
[contenteditable]:hover{background:#eef3f8;box-shadow:0 0 0 2px #eef3f8}
[contenteditable]:empty:before{content:attr(data-ph);color:#bcc6d0}
td.num,th.num{text-align:right;font-family:var(--mono)}
td.addr{font-weight:600}
td.brk{font-family:var(--mono);color:var(--navy)}
.x{border:none;background:none;color:#c3cdd7;padding:2px 5px}
.x:hover{color:var(--red);background:#fdeeee}
.tag{font-size:.82em;font-family:var(--mono);padding:1px 5px;border-radius:3px;border:1px solid var(--line);color:var(--ink-3)}
.tag.live{background:#e9f4ee;color:var(--green);border-color:#bfe0cd}
.tag.pending{background:var(--amber-soft);color:var(--amber);border-color:#f0dcb4}
.addrow{width:100%;border:none;border-radius:0 0 var(--r) var(--r);color:var(--ink-3);padding:6px;text-align:left}
.addrow:hover{background:var(--navy-soft)}
/* Fines / apologies / minutes now sit in a row above the board, so the
   stages get the full page width. */
.meetingbar{display:grid;grid-template-columns:minmax(280px,1.1fr) 1fr 1.3fr;
  gap:12px;align-items:start;margin-bottom:12px}
.meetingbar .card{margin-bottom:0}
.meetingbar .note{min-height:56px}
/* On the projector the room wants the fines visible, but not the EA's
   working notes — apologies and minutes are hers to type, not theirs
   to read at distance. */
body.proj .meetingbar{display:block;margin-bottom:14px}
body.proj .meetingbar .card{display:none}
body.proj .meetingbar .card.finescard{display:block}
body.proj .meetingbar .fine{font-size:15px;padding:3px 6px 3px 11px}
body.proj .meetingbar .fine-add{display:none}
body.proj .meetingbar .ytd table{font-size:14px}
body.proj .meetingbar .ytd .hd b{font-size:17px}
body.proj .meetingbar .ytd button.settle{display:none}
body.proj .meetingbar h3{font-size:14px}
@media (max-width:1000px){.meetingbar{grid-template-columns:1fr}}
.card{background:var(--paper);border:1px solid var(--line);border-radius:var(--r);padding:10px 12px;margin-bottom:11px}
.card h3{font-size:11px;text-transform:uppercase;letter-spacing:.1em;color:var(--ink-3);margin:0 0 8px}
.fines{display:flex;flex-wrap:wrap;gap:5px}
.fine{display:flex;align-items:center;gap:4px;border:1px solid var(--line);border-radius:12px;
  padding:2px 4px 2px 8px;font-family:var(--mono);font-size:11px}
.fine b{color:var(--navy)}.fine.hot{background:var(--amber-soft);border-color:#f0dcb4}
.fine button{border:none;background:none;padding:0 3px;color:var(--ink-3)}
.note{width:100%;border:1px solid var(--line);border-radius:var(--r);padding:7px;font:inherit;min-height:70px;resize:vertical}
input.search{border:1px solid var(--line);border-radius:var(--r);padding:6px 9px;font:inherit;min-width:210px}
.chip{font-size:11px;padding:3px 9px;border-radius:12px;font-family:var(--mono)}
.chip.on{background:var(--navy);color:#fff;border-color:var(--navy)}
select.mini{font:inherit;font-size:.86em;border:1px solid transparent;background:none;color:var(--ink-2);border-radius:3px}
select.mini:hover{border-color:var(--line);background:#fff}
.toast{position:fixed;bottom:16px;left:50%;transform:translateX(-50%);background:var(--ink);color:#fff;
  padding:8px 16px;border-radius:20px;font-size:12px;z-index:200;opacity:0;transition:.25s;pointer-events:none}
.toast.on{opacity:1}

/* ---- A3 landscape print: the sheet that goes round the room ---- */
@media print{
  @page{size:A3 landscape;margin:8mm}
  body.proj{--fs:13px;--pad:4px 8px}
  .saver,.toast,.stage .caret{display:none!important}
  #app{background:#fff;max-width:none;font-size:9.5pt}
  .top{background:#fff!important;color:#000!important;border-bottom:2px solid #000;padding:0 0 6px}
  .top h1{font-size:15pt}.top .meta{color:#444}
  .tally{border:none;gap:0}
  .tally div{border:none;padding:4px 12px 4px 0}
  .tally .v{font-size:11pt}
  main{padding:8px 0}
  #stages{column-count:1}
  .stage{border-color:#999;margin-bottom:6px}
  .fine{border-color:#999}
  tr.row:hover{background:none}
}
@media (max-width:820px){.grid2{grid-template-columns:1fr}}

/* sign-in gate, matching dealsheet.html */
.gate{position:fixed;inset:0;background:var(--shell);display:flex;
  align-items:center;justify-content:center;z-index:500}
.gate .inner{font-family:'Archivo',system-ui,sans-serif;color:var(--ink-2);font-size:14px}

/* add-a-fine row */
.fine-add{display:flex;gap:4px;align-items:center;margin-top:9px}
.fine-add select{flex:1;min-width:0;font:inherit;font-size:12px;padding:4px 5px;
  border:1px solid var(--line);border-radius:var(--r);background:var(--paper);color:var(--ink)}
.fine-add .dollar{color:var(--ink-3);font-family:var(--mono);font-size:12px}
.fine-add input{width:52px;font:inherit;font-family:var(--mono);font-size:12px;
  padding:4px 5px;border:1px solid var(--line);border-radius:var(--r);
  background:var(--paper);color:var(--ink)}
.fine-add button{padding:4px 11px}
.btn-primary{background:var(--navy);color:#fff;border-color:var(--navy)}
.btn-primary:hover{background:#1b3070;color:#fff;border-color:#1b3070}
/* running total flashes when it goes up */
@keyframes bump{0%{background:#fff6d9}100%{background:transparent}}
.fine.bumped{animation:bump 1.2s ease-out}

/* season-to-date fines, under the week's */
.ytd{margin-top:10px;padding-top:9px;border-top:1px solid var(--line)}
.ytd .hd{display:flex;align-items:baseline;gap:6px;font-size:10px;
  letter-spacing:.1em;text-transform:uppercase;color:var(--ink-3);margin-bottom:6px}
.ytd .hd b{margin-left:auto;font-family:var(--mono);font-size:13px;
  color:var(--ink);letter-spacing:0}
.ytd table{width:100%;font-size:11.5px}
.ytd td{padding:2px 0;border:none}
.ytd td.n{text-align:right;font-family:var(--mono)}
.ytd td.c{font-family:var(--mono);color:var(--navy);width:34px}
.ytd .none{font-size:11.5px;color:var(--ink-3)}

/* settle button on a YTD row */
.ytd tr:hover td{background:#f7f9fb}
.ytd td.act{width:52px;text-align:right}
.ytd button.settle{border:none;background:none;color:var(--navy);
  font-size:10.5px;padding:1px 3px;text-decoration:underline;cursor:pointer}
.ytd button.settle:hover{color:var(--green)}

/* rankings panel, rendered under the Targets stage */
.ranks{background:var(--paper);border:1px solid var(--line);border-radius:var(--r);
  margin-bottom:11px}
.ranks>header{display:flex;align-items:center;gap:10px;padding:6px 10px;
  border-bottom:1px solid var(--line);background:linear-gradient(var(--paper),var(--shell))}
.ranks h2{font-size:12.5px;text-transform:uppercase;letter-spacing:.09em;margin:0;
  font-family:'Archivo Narrow','Archivo',sans-serif}
body.proj .ranks h2{font-size:20px}
.ranks .as-at{margin-left:auto;font-family:var(--mono);font-size:10px;color:var(--ink-3)}
.ranks table{width:100%}
.ranks .bar{height:7px;background:var(--line);border-radius:2px;overflow:hidden;min-width:60px}
.ranks .bar i{display:block;height:100%;background:var(--navy)}
/* Being behind budget isn't flagged with a colour change any more —
   the bar stays the same blue whether a broker is on track or short,
   so nobody's progress bar singles them out in the room. */
.ranks .bar i.short{background:var(--navy)}
.ranks td.pc{font-family:var(--mono);text-align:right;width:46px;color:var(--ink-2)}

/* note-list sections — free text the EA types in and ticks off */
.notes{background:var(--paper);border:1px solid var(--line);
  border-radius:var(--r);margin-bottom:11px}
.notes>header{display:flex;align-items:center;gap:10px;padding:6px 10px;
  border-bottom:1px solid var(--line);background:linear-gradient(var(--paper),var(--shell))}
.notes h2{font-size:12.5px;text-transform:uppercase;letter-spacing:.09em;margin:0;
  font-family:'Archivo Narrow','Archivo',sans-serif}
body.proj .notes h2{font-size:20px}
.notes .pill{margin-left:auto}
.notes .tot{margin-left:auto;font-family:var(--mono);font-weight:700}
.notes table{width:100%;border-collapse:collapse}
.notes td.empty{color:var(--ink-3);font-size:.9em;text-align:left}
.notes .addrow{width:100%;border:none;border-radius:0 0 var(--r) var(--r);
  color:var(--ink-3);padding:6px;text-align:left;background:none}
.notes .addrow:hover{background:var(--navy-soft)}
/* open the source workbook */
.ranks .src{font-family:var(--mono);font-size:10px;color:var(--navy);
  text-decoration:none;border:1px solid var(--line);border-radius:var(--r);padding:2px 7px}
.ranks .src:hover{border-color:var(--navy);background:var(--navy-soft)}
@media print{.notes .addrow{display:none}.ranks .src{display:none}}

/* clear link on the Apologies / Minutes cards */
.card h3 .clear{float:right;border:none;background:none;padding:0;
  font-family:'Archivo',system-ui,sans-serif;font-size:10px;letter-spacing:.06em;
  text-transform:uppercase;color:var(--ink-3);text-decoration:underline;cursor:pointer}
.card h3 .clear:hover{color:var(--red)}
@media print{.card h3 .clear{display:none}}

/* masthead logo — public/img/colliers-logo.png
   Hidden automatically if the file is absent. */
.top .logo{height:45px;width:auto;display:block}
body.proj .top .logo{height:66px}

/* date-range filter */
.filterbar{display:flex;gap:10px;align-items:center;flex-wrap:wrap;
  margin-bottom:12px;font-size:12px;color:var(--ink-2)}
.filterbar label{display:flex;gap:5px;align-items:center}
.filterbar input[type=date]{font:inherit;font-size:12px;padding:4px 6px;
  border:1px solid var(--line);border-radius:var(--r);background:var(--paper);color:var(--ink)}
.filterbar .filtered{font-family:var(--mono);font-size:11px;color:var(--amber)}
.filterbar button{padding:4px 10px;font-size:12px}

/* stage picker on each row */
td.stagesel{width:120px}
select.stagepick{font:inherit;font-size:.86em;width:100%;
  border:1px solid transparent;background:none;color:var(--ink-2);
  border-radius:3px;padding:1px 2px;cursor:pointer}
select.stagepick:hover{border-color:var(--line);background:var(--paper)}
body.proj select.stagepick{font-size:.9em}

/* timing as a date */
input.dateinput{font:inherit;font-size:.92em;width:100%;border:1px solid transparent;
  background:none;color:var(--ink);border-radius:3px;padding:1px 2px}
input.dateinput:hover{border-color:var(--line);background:var(--paper)}
.legacy{display:block;font-size:.78em;color:var(--ink-3);margin-top:1px}
/* print rules for these live in the single print block at the foot */

/* status picker */
select.statuspick{font:inherit;font-size:.86em;width:100%;border:1px solid transparent;
  background:none;color:var(--ink-2);border-radius:3px;padding:1px 2px;cursor:pointer}
select.statuspick:hover{border-color:var(--line);background:var(--paper)}
select.statuspick.live{color:var(--green);font-weight:600}
select.statuspick.pending{color:var(--amber);font-weight:600}
body.proj select.statuspick{font-size:.9em}

/* AML and Invoiced ticks — same look, side by side on Unconditional
   rows (Retail only for Invoiced; see showInvoiced() in deal-board.js) */
td.amlcell,td.invcell{text-align:center}
input.amlbox,input.invbox{width:15px;height:15px;cursor:pointer;accent-color:var(--navy);margin:2px 0 0}
body.proj input.amlbox,body.proj input.invbox{width:19px;height:19px}
input.amlbox:indeterminate{opacity:.55}

/* AML and the controls are dropped on paper — see the print block below */

/* empty stage / section */
td.empty{color:var(--ink-3);font-size:.9em;text-align:left;padding:7px 10px}

/* outcome picker — now shown alongside the ×, not instead of it, so a
   deal added twice by mistake can always just be removed rather than
   having to be routed through an outcome first. */
select.outcome{font:inherit;font-size:.8em;border:1px solid var(--line);
  background:var(--paper);color:var(--ink-3);border-radius:var(--r);
  padding:1px 3px;cursor:pointer;max-width:96px}
select.outcome:hover{border-color:var(--navy);color:var(--navy)}
select.outcome+.x{margin-left:3px}
td.actcell{width:96px;text-align:right;white-space:nowrap}

/* pipeline settings */
.hint{font-size:11.5px;color:var(--ink-3);margin:0 0 10px;line-height:1.45}
.wrow{display:flex;align-items:center;gap:9px;margin-bottom:8px}
.wrow label{flex:1;font-size:12.5px}
.wrow input{width:64px;font:inherit;font-family:var(--mono);font-size:12px;
  padding:4px 6px;border:1px solid var(--line);border-radius:var(--r);
  text-align:right;background:var(--paper);color:var(--ink)}
.wrow .pcsign{color:var(--ink-3);font-family:var(--mono);font-size:12px}

/* rankings totals row */
.ranks tfoot td{border-top:2px solid var(--line);font-weight:700;
  font-family:var(--mono);padding-top:5px}
.ranks tfoot td.lbl{font-family:'Archivo',system-ui,sans-serif;
  text-transform:uppercase;font-size:10px;letter-spacing:.08em;color:var(--ink-3)}

/* business unit switcher in the masthead */
#unitPick{font:inherit;font-size:13px;padding:5px 9px;border-radius:var(--r);
  border:1px solid #4a63ad;background:transparent;color:#cddcea;cursor:pointer}
#unitPick:hover{border-color:#8f9fd6;color:#fff}
#unitPick option{background:var(--paper);color:var(--ink)}
body.proj #unitPick{font-size:16px}
@media print{#unitPick{display:none}}

/* Management rollup */
.mgmt-units{background:var(--paper);border:1px solid var(--line);
  border-radius:var(--r);margin-bottom:12px}
.mgmt-units>header{padding:6px 10px;border-bottom:1px solid var(--line);
  background:linear-gradient(var(--paper),var(--shell))}
.mgmt-units h2{font-size:12.5px;text-transform:uppercase;letter-spacing:.09em;
  margin:0;font-family:'Archivo Narrow','Archivo',sans-serif}
body.proj .mgmt-units h2{font-size:20px}
.mgmt-units table{width:100%;border-collapse:collapse}
.mgmt-units tfoot td{border-top:2px solid var(--line);font-weight:700;padding-top:6px}
.mgmt-units tfoot td.lbl{text-transform:uppercase;font-size:10px;
  letter-spacing:.08em;color:var(--ink-3);font-weight:600}
.mgmt-units td.unit{font-weight:600}
.mgmt-units td.wl{font-family:var(--mono);text-align:right;width:52px}
.mgmt-units .share{height:5px;background:var(--line);border-radius:2px;overflow:hidden;min-width:50px}
.mgmt-units .share i{display:block;height:100%;background:var(--navy)}

/* ranking position */
.ranks th.rank{text-align:center;padding-right:6px}
.ranks td.rank{font-family:var(--mono);color:var(--ink-3);
  text-align:center;padding:4px 6px;font-size:.9em}

/* Top three sit in a filled navy badge with white numerals, so the
   podium reads instantly from across a room. Ties share a position, so
   this is keyed on rank rather than row order — a tie at 3rd badges
   both brokers. */
.ranks td.rank.top{color:var(--ink-3)}
.ranks td.rank.top span{display:inline-block;min-width:22px;padding:2px 5px;
  background:var(--navy);color:#fff;font-weight:700;border-radius:3px;
  line-height:1.15;text-align:center}
body.proj .ranks td.rank.top span{min-width:28px;padding:3px 7px}
@media print{
  .ranks td.rank.top span{background:none;color:#000;border:1px solid #000;
    padding:1px 4px}
}

/* ---- column sizing: give the address room to sit on one line ---- */
.stage table,.notes table{table-layout:fixed}

/* Address is the only flexible column, so it absorbs the space freed
   from Timing, Broker and the action cell. */
td.addr{overflow-wrap:anywhere}
td.addr [contenteditable]{white-space:normal}

/* Trim the fixed columns to what their controls actually need. */
input.dateinput{font-size:.86em;padding:1px 0}
td.brk{font-size:.9em}
td.brk [contenteditable]{overflow-wrap:anywhere}
select.stagepick{font-size:.82em}
select.statuspick{font-size:.82em}
/* Narrower now that the × sits next to it in the same cell. */
select.outcome{max-width:62px;font-size:.78em}
td.actcell{width:118px}

/* On a narrow window let the table scroll rather than crush the address */
.stage>table,.notes>table{min-width:840px}
.stage,.notes{overflow-x:auto}
body.proj .stage>table,body.proj .notes>table{min-width:0}

/* Selects need room for their own arrow — without the padding the text
   runs underneath it. */
select.stagepick,select.statuspick,select.outcome{
  padding-right:17px;text-overflow:ellipsis}
select.stagepick{font-size:.86em}

/* leasing: probability column */
td.prob [contenteditable]{font-family:var(--mono)}
td.prob [contenteditable]:not(:empty):after{content:'%';color:var(--ink-3);font-size:.85em}

/* sole agency expiry */
.expbadge{display:inline-block;margin-left:5px;font-family:var(--mono);
  font-size:.72em;padding:1px 5px;border-radius:3px;white-space:nowrap;vertical-align:middle}
.expbadge.soon{background:var(--amber-soft);color:var(--amber);border:1px solid #f0dcb4}
.expbadge.expired{background:#fdeeee;color:var(--red);border:1px solid #eec5c5}
button.expbtn{font-size:10.5px;padding:2px 8px;border-radius:11px;
  background:var(--amber-soft);color:var(--amber);border-color:#f0dcb4}
button.expbtn:hover{border-color:var(--amber);color:var(--amber)}
button.expbtn.on{background:var(--navy);color:#fff;border-color:var(--navy)}
body.proj .expbadge{font-size:.78em}
@media print{button.expbtn{display:none}}

/* Tenant and Address carry equal weight on the leasing-style board —
   both are the name of the thing, and squeezing either makes the row
   harder to scan. */
td.addr{width:auto}

/* refresh button in the rankings header */
button.src{font-family:var(--mono);font-size:10px;color:var(--navy);
  border:1px solid var(--line);border-radius:var(--r);padding:2px 8px;
  background:var(--paper);margin-left:8px}
button.src:hover:not(:disabled){border-color:var(--navy);background:var(--navy-soft)}
button.src:disabled{opacity:.55;cursor:default}
@media print{button.src{display:none}}

/* ---- projector mode: widen the data columns on the right of the row
   so the bigger projector font (--fs above) doesn't wrap or truncate
   values mid-meeting. Uses !important on the th because table-layout:
   fixed takes a column's width from its header cell, and these header
   cells already carry an inline width style from renderBoard() in
   deal-board.js — only !important is guaranteed to win over that. ---- */
body.proj th.th-stage{width:230px!important}
body.proj th.th-timing{width:190px!important}
body.proj th.th-fee{width:145px!important}
body.proj th.th-prob{width:85px!important}
body.proj th.th-status{width:175px!important}
body.proj th.th-broker{width:115px!important}
body.proj th.th-inv{width:95px!important}
body.proj th.th-aml{width:62px!important}
body.proj th.th-act{width:165px!important}
body.proj td.actcell{width:165px!important}

/* ===================== print =====================
   The screen shows form controls; paper needs their values. Each
   control has a hidden text twin (.printonly) that swaps in here. */
.printonly{display:none}

@media print{
  @page{size:A3 landscape;margin:8mm}

  .noprint,.filterbar,.tabs,.addrow,.expbtn,button.src,
  .fine-add,.ytd button.settle,#unitPick,.top button{display:none!important}

  /* Controls out, their text twins in. */
  .stagesel select,.statuscell select,.dateinput,
  td.stagesel .legacy{display:none!important}
  .printonly{display:inline;font-size:8.5pt;color:#000}
  td.timingcell .printonly{white-space:nowrap}

  /* The drag handle must keep its cell — display:none on a td removes
     it from the row and shifts every following cell out of line with
     the header. Collapse it instead. */
  td.grip,th:first-child{width:0!important;padding:0!important;
    overflow:hidden;font-size:0;border:none}

  .stage table,.notes table{table-layout:fixed;width:100%}
  td,th{padding:3px 6px;font-size:8.5pt;vertical-align:top;
    overflow:hidden;text-overflow:ellipsis}

  /* Stage, Tenant and Address share the flexible space; the rest are
     sized to their content. Column 1 is the collapsed grip. */
  .stage th:nth-child(2),.stage td:nth-child(2){width:15%}
  .stage th:nth-child(3),.stage td:nth-child(3){width:21%}
  .stage th:nth-child(4),.stage td:nth-child(4){width:21%}
  .stage th:nth-child(5),.stage td:nth-child(5){width:78px}
  .stage th:nth-child(6),.stage td:nth-child(6){width:70px}
  .stage th:nth-child(7),.stage td:nth-child(7){width:42px}
  .stage th:nth-child(8),.stage td:nth-child(8){width:72px}
  .stage th:nth-child(9),.stage td:nth-child(9){width:58px}

  /* Wrapping is fine in the name columns, nowhere else. */
  td.addr,td.addr [contenteditable]{white-space:normal;overflow-wrap:break-word}
  td.stagesel .printonly{white-space:normal;color:#555}

  .stage,.notes{overflow:visible;break-inside:auto}
  .stage>table,.notes>table{min-width:0}
  tr{break-inside:avoid}
  .stage>header,.notes>header{background:#eee!important;
    -webkit-print-color-adjust:exact;print-color-adjust:exact}
  .meetingbar{display:grid!important;grid-template-columns:1fr 1fr 1fr;gap:6mm}
  .expbadge{border:1px solid #999;background:none!important;color:#000!important}
}

/* broker pipeline */
.brokerbar{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-bottom:12px}
.brokerbar label{font-size:12px;color:var(--ink-3);text-transform:uppercase;letter-spacing:.08em}
.brokerbar select{font:inherit;font-size:13px;padding:5px 9px;border:1px solid var(--line);
  border-radius:var(--r);background:var(--paper);color:var(--ink);min-width:210px}
.brokerbar .hint{margin:0;font-size:11.5px}
#brokerTally{margin-bottom:12px;border:1px solid var(--line);border-radius:var(--r)}
#brokerTally:empty{display:none}
/* a deal shared with someone else — the other initials shown quietly */
.shared{color:var(--ink-3);font-size:.9em}

/* broker's share of a shared fee */
td.sharecell{font-family:var(--mono);text-align:right}
td.sharecell .fullfee{display:block;font-size:.78em;color:var(--ink-3);
  font-family:var(--mono);white-space:nowrap}
.brokerbar .hint b{color:var(--amber)}

/* sale / lease listing type */
select.ltpick{font:inherit;font-size:.82em;width:100%;border:1px solid transparent;
  background:none;color:var(--ink-2);border-radius:3px;padding:1px 17px 1px 2px;
  cursor:pointer;text-overflow:ellipsis}
select.ltpick:hover{border-color:var(--line);background:var(--paper)}
body.proj select.ltpick{font-size:.88em}
@media print{
  .ltcell select{display:none!important}
  /* one more flexible column when Sale/Lease is present */
  .stage th:nth-child(5),.stage td:nth-child(5){width:auto}
}

/* ── rankings paste-in ─────────────────────────────────────────────
   The master finance report is rights-protected, so it is copied out
   of desktop Excel and pasted here. Paired with rankingsPastePanel()
   in deal-board.js. */
.pasteov{position:fixed;inset:0;background:rgba(16,24,32,.55);z-index:300;
  display:flex;align-items:center;justify-content:center;padding:24px}
.pastecard{background:var(--paper);border-radius:var(--r);padding:20px 22px;
  width:min(680px,100%);max-height:88vh;overflow:auto;
  box-shadow:0 18px 48px rgba(16,24,32,.3)}
.pastecard h2{font-size:16px;margin-bottom:10px}
.pastesteps{margin:0 0 14px;padding-left:20px;color:var(--ink-2);line-height:1.7}
.pastesteps b{color:var(--ink)}
.pastebox{width:100%;height:150px;font-family:var(--mono);font-size:11.5px;line-height:1.4;
  border:1px solid var(--line);border-radius:var(--r);padding:8px;
  resize:vertical;white-space:pre;overflow:auto;color:var(--ink)}
.pastebox:focus{outline:none;border-color:var(--navy);box-shadow:0 0 0 3px var(--navy-soft)}
.pasteout{margin-top:12px}
.pasteout:empty{display:none}
.pastelist{margin:0;padding-left:18px;line-height:1.8}
.pastelist b{font-family:var(--mono)}
.pasteout .warn{color:var(--amber)}
.pasteout .bad{color:var(--red)}
.pasteout .muted{color:var(--ink-3);font-size:11.5px;margin:8px 0 0}
.pastebtns{display:flex;gap:6px;justify-content:flex-end;margin-top:16px}
.pastebtns .go{background:var(--navy);border-color:var(--navy);color:#fff}
.pastebtns .go:hover{background:#1b3070;color:#fff}
.pastebtns button[disabled]{opacity:.45;cursor:default}
.pastebtns button[disabled]:hover{border-color:var(--line);color:var(--ink-2)}
.pastebtns .go[disabled]:hover{background:var(--navy);border-color:var(--navy);color:#fff}

@media print{.pasteov{display:none !important}}
