:root{
  /* ---------- WhipCount (2.131.0) ----------
     The palette of the design canvas (WhipCount User Management) and the brand kit: navy
     ground for the furniture, white cards on a light gray page, Inter throughout, mint for
     the one thing on a screen somebody is meant to press. */
  --navy:#0F2D4A; --navy-2:#16395C; --navy-soft:#EAF0F6; --mint:#4ADE80; --mint-ink:#15803D;
  --ground:#F3F4F6; --surface:#FFFFFF; --surface-2:#F8FAFC;
  --ink:#0F2D4A; --ink-2:#334155; --ink-3:#5B6B7D;
  --rule:#CBD2DA; --rule-2:#E5E7EB;
  --civic:#2563EB; --civic-ink:#1D4ED8; --civic-soft:#EAF1FE;
  /* The header bar and the phone menu: navy, with white on it. */
  --boyd:#0F2D4A; --boyd-ink:#FFFFFF;
  /* The whip count. Firm yes is mint and a lean is mint at 45%; persuadable is violet; opposed
     is red and a lean against is red at 45% (red for opposed was asked for on 2026-10-08, the
     brand kit had slate). Persuadable was gray until the same day, when a color that stands
     out and still reads as the middle was asked for: violet, because a swing district is
     purple, and because nothing else in the app is violet -- amber is attention, blue is a
     link or a mention. These are FILLS --
     mint on white is unreadable as type, so a word in a position's color takes its -ink. */
  --sup:#4ADE80; --lsup:#AEF0C6; --pers:#A78BFA; --lopp:#EF9D9D; --opp:#DC2626;
  --unk:#64748B; --nomeet:#CBD2DA;
  --sup-ink:#15803D; --opp-ink:#B42318; --pers-ink:#6D28D9;
  /* Attention, in amber: a follow-up owed, a requirement gained, a forecast. Its own ink, never
     --pers-ink: the two shared a value while persuadable was amber, and seven places that meant
     attention were written with the persuadable name, so they would have turned violet. */
  --warn:#B45309; --warn-ink:#92400E; --warn-bg:#FFFBEB; --warn-rule:#F3D9A4;
  --ok:#15803D; --bad:#B42318; --danger:#B42318;
  --wash:#F8FAFC; --muted:#475569;
  --rail:264px; --band:68px;
  --shadow:0 1px 2px rgba(15,45,74,.06), 0 10px 28px -14px rgba(15,45,74,.22);
}
*{box-sizing:border-box}
html,body{margin:0;padding:0}
body{
  background:var(--ground); color:var(--ink);
  font-family:Inter,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;
  font-size:14px; line-height:1.5; -webkit-font-smoothing:antialiased;
}
h1,h2,h3,h4{font-family:inherit;font-weight:800;letter-spacing:-.015em;margin:0}
button,input,select,textarea{font-family:inherit;font-size:inherit;color:inherit}
a{color:var(--civic)}
:focus-visible{outline:2px solid var(--civic);outline-offset:2px;border-radius:3px}
.tnum{font-variant-numeric:tabular-nums}

/* ---------- shell ---------- */
.shell{display:flex;min-height:100vh}
.rail{
  width:var(--rail);flex:0 0 var(--rail);background:var(--ink);color:#DCE5EA;
  display:flex;flex-direction:column;position:sticky;top:0;height:100vh;overflow-y:auto;
}
.rail-top{padding:20px 20px 16px;border-bottom:1px solid rgba(255,255,255,.1)}
/* ---------- the corporate mark ----------
   Clear space the width of the letter B, which the brand sheet gives as the
   rule: the B is about a fifth of the mark's width, so a fifth of its height
   all round keeps it honest at any size. The mark is never stretched — the
   height is set and the width follows. */
/* The photograph a state has chosen, shown beside the way to change it so
   nobody has to guess which picture is in use. */
.artnow{display:flex;align-items:center;gap:10px;margin:4px 0 8px}
.artthumb{display:block;width:72px;height:44px;border-radius:5px;flex:none;
  background-size:cover;background-position:center;border:1px solid var(--rule-2)}
.artpick{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.artpick .hint{flex:1;min-width:220px}

/* The mark is a way home, so it is a button -- but it must look exactly like
   the image it wraps and nothing like a control. The margin moves onto the
   button so the mark sits where it always did. */
.brandhome{display:block;padding:0;border:0;background:none;cursor:pointer;
  margin:0 0 10px;border-radius:3px;-webkit-tap-highlight-color:transparent}
.brandhome:hover{opacity:.82}
.brandhome:focus-visible{outline:2px solid rgba(255,255,255,.65);outline-offset:3px}
.brandhome .boyd{margin:0}
.boyd{display:block;height:20px;width:auto;margin:0 0 10px}
.boyd-light{display:none}
.drawer-h .boyd{height:18px;margin-bottom:8px}

.rail-mark{font-family:inherit;font-size:26px;line-height:1;font-weight:700;color:#fff}
.rail-sub{font-size:11.5px;color:#8CA2AE;margin-top:5px;line-height:1.4}
.rail-conf{margin-top:10px;display:inline-block;font-size:10px;font-weight:700;letter-spacing:.06em;
  color:#F0C36A;border:1px solid rgba(240,195,106,.4);padding:2px 6px;border-radius:3px}
.rail-nav{padding:10px 10px;flex:1}
.navitem{display:flex;align-items:center;gap:10px;width:100%;text-align:left;background:none;border:0;
  color:#B7C6CE;padding:9px 11px;border-radius:6px;cursor:pointer;font-size:13.5px;font-weight:500}
.navitem:hover{background:rgba(255,255,255,.07);color:#fff}
.navitem[aria-current="page"]{background:var(--civic);color:#fff}
.navitem .ct{margin-left:auto;font-size:11px;color:#8CA2AE;font-variant-numeric:tabular-nums}
.navitem[aria-current="page"] .ct{color:#CBDCF0}
.navitem .nl{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.navicon{width:16px;height:16px;flex:0 0 16px;opacity:.9}
.rail-foot{padding:12px 14px 18px;border-top:1px solid rgba(255,255,255,.1);font-size:11.5px;color:#8CA2AE}
.live{display:flex;align-items:center;gap:8px;margin-bottom:9px;color:#B7C6CE}
.dot{width:8px;height:8px;border-radius:50%;background:#3FBF9E;flex:0 0 8px}
.dot.on{animation:pulse 2.4s ease-in-out infinite}
.dot.off{background:#6D818C;animation:none}
@keyframes pulse{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.35;transform:scale(.8)}}
.rail-foot select{background:#22333E;border:1px solid rgba(255,255,255,.16);color:#DCE5EA;border-radius:5px;
  padding:4px 6px;font-size:11.5px;width:100%;margin-top:2px}

.main{flex:1;min-width:0;display:flex;flex-direction:column}
.topbar{background:var(--surface);border-bottom:1px solid var(--rule);padding:14px 26px;
  display:flex;align-items:center;gap:16px;flex-wrap:wrap;position:sticky;top:0;z-index:20}
/* The title gives, so the bar does not. It used to hold its full width — a
   page name and a crumb as long as "Live whip count - Boyd Gaming - Government
   Affairs" — and the search box and the page's own buttons were pushed to a
   second row beneath it. Now the title takes what is left and ends in an
   ellipsis, which is the right thing to lose: the page name is also the
   biggest thing on the page behind it. */
/* Shrink, but never grow. Growing was worse than holding: the title took all
   the free space and pushed the search and the buttons to a second row by
   itself. */
.topbar-title{flex:0 1 auto;min-width:0}
.topbar h1{font-size:25px;line-height:1.1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.topbar .crumb{font-size:12px;color:var(--ink-3);margin-bottom:1px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.topbar-actions{margin-left:auto;display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.page{padding:22px 26px 60px;max-width:1500px;width:100%;zoom:var(--zoom)}

/* ---------- controls ---------- */
.btn{background:var(--surface);border:1px solid var(--rule);color:var(--ink);padding:7px 13px;border-radius:6px;
  cursor:pointer;font-weight:500;font-size:13px;white-space:nowrap}
.btn:hover{border-color:#B9C4CB;background:var(--surface-2)}
.btn.primary{background:var(--civic);border-color:var(--civic);color:#fff}
.btn.primary:hover{background:#16406F}
.btn.danger{color:var(--bad);border-color:#E3C4C0}
.btn.danger:hover{background:#FBF2F1}
.btn.sm{padding:4px 9px;font-size:12px}
.btn:disabled{opacity:.45;cursor:not-allowed}
.field{display:flex;flex-direction:column;gap:4px;min-width:0}
.field > label{font-size:11.5px;color:var(--ink-2);font-weight:600}
input[type=text],input[type=date],input[type=time],input[type=number],input[type=email],input[type=tel],
input[type=search],input[type=password],select,textarea{
  background:var(--surface);border:1px solid var(--rule);border-radius:6px;padding:7px 9px;
  width:100%;min-width:0;max-width:100%;box-sizing:border-box}
/* Safari and Chrome give date and time controls a wide intrinsic size that
   ignores the box they are in. */
input[type=date],input[type=time]{-webkit-appearance:none;appearance:none;min-width:0}
input[type=date]::-webkit-date-and-time-value{text-align:left;min-width:0}
input[type=date]::-webkit-calendar-picker-indicator{margin-left:0;padding-left:2px}
.field{max-width:100%}
.phase-card{min-width:0}
.phase-card input,.phase-card select,.phase-card textarea{max-width:100%}
textarea{resize:vertical;min-height:64px;line-height:1.5}
input:disabled,select:disabled,textarea:disabled{background:var(--surface-2);color:var(--ink-3)}
.switch{display:inline-flex;align-items:center;gap:8px;cursor:pointer;user-select:none}
.switch input{position:absolute;opacity:0;width:0;height:0}
.track{width:38px;height:21px;border-radius:11px;background:#C3CDD4;position:relative;transition:background .15s;flex:0 0 38px}
.track::after{content:"";position:absolute;top:2px;left:2px;width:17px;height:17px;border-radius:50%;
  background:#fff;transition:transform .15s;box-shadow:0 1px 2px rgba(0,0,0,.25)}
.switch input:checked + .track{background:var(--sup)}
.switch input:checked + .track::after{transform:translateX(17px)}
/* Small variant. Track, knob and travel are set together; overriding only the
   track width leaves the knob sliding out past its end and onto the label. */
.switch.sm .track{width:30px;height:17px;flex:0 0 30px;border-radius:9px}
.switch.sm .track::after{width:13px;height:13px}
.switch.sm input:checked + .track::after{transform:translateX(13px)}
.switch.sm > span:last-child{font-size:12.5px}
.switch input:focus-visible + .track{outline:2px solid var(--civic);outline-offset:2px}

/* ---------- cards ---------- */
.card{background:var(--surface);border:1px solid var(--rule);border-radius:8px}
.card-h{padding:13px 16px;border-bottom:1px solid var(--rule-2);display:flex;align-items:center;gap:12px;flex-wrap:wrap}
.card-h h2{font-size:17px}
/* **A row that pairs prose with controls must be able to wrap, because only the prose can
   shrink** -- the rule 2.193.5 settled for `.att-row`, arriving on the card header. The
   header already wraps; what did not was the group of buttons on its right, so its
   min-content was the sum of every button in it (317 points on the backups card) and the
   whole header could not go narrower than that. Found at Larger on a 390 point phone, where
   the page lays out in 300 (2.199.0) -- and it is older than that setting, since any screen
   narrow enough reaches it. The prose takes a basis rather than a width query, the
   `.att-row` answer: the question is how much room this row has, not which tier it is in. */
.card-h .note{font-size:12px;color:var(--ink-3);font-weight:400;flex:1 1 180px;min-width:0}
.card-h .right{margin-left:auto;display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.card-b{padding:16px}
.grid{display:grid;gap:16px}
.sect{margin-bottom:18px}

/* ---------- hero: chamber floor ---------- */
.floor{display:grid;grid-template-columns:1fr 1fr;gap:16px}
@media(max-width:1050px){.floor{grid-template-columns:1fr}}
.chamber-head{display:flex;align-items:baseline;gap:10px;margin-bottom:2px;flex-wrap:wrap}
.chamber-head h3{font-size:19px}
.chamber-head .of{font-size:12px;color:var(--ink-3)}
.tally{font-family:inherit;font-size:58px;line-height:.9;font-weight:700;
  font-variant-numeric:tabular-nums;letter-spacing:-.01em}
.tally small{font-size:20px;font-weight:500;color:var(--ink-3);margin-left:5px}
.goalbar{position:relative;height:26px;background:var(--surface-2);border:1px solid var(--rule);
  border-radius:4px;overflow:hidden;margin-top:12px}
.goalbar .seg{position:absolute;top:0;bottom:0;left:0}
.goalmark{position:absolute;top:-5px;bottom:-5px;width:2px;background:var(--ink);z-index:3}
.goalmark span{position:absolute;top:-16px;left:50%;transform:translateX(-50%);font-size:10.5px;
  font-weight:700;color:var(--ink);white-space:nowrap;background:var(--surface);padding:0 4px}
.goallegend{display:flex;gap:14px;flex-wrap:wrap;margin-top:9px;font-size:11.5px;color:var(--ink-2)}
.goallegend b{font-weight:600}
.seats{display:flex;flex-wrap:wrap;gap:4px;margin-top:16px}
.seat{width:19px;height:19px;border-radius:3px;border:1px solid rgba(0,0,0,.09);cursor:pointer;padding:0}
.seat:hover{transform:scale(1.22);z-index:2;position:relative}
/* The square whose name is up. On a touch screen the hover scale is off and this
   is what says which of the three squares under the bubble it is about. At top
   level rather than in the hover:none block, because tests/cascade.js cannot read
   a hover query and the class is only ever put on by a tap. */
.seat.armed{transform:scale(1.22);z-index:2;position:relative;
  box-shadow:0 0 0 2px var(--ink)}
.seat.inactive{opacity:.32}
.seatkey{display:flex;flex-wrap:wrap;gap:6px 14px;margin-top:14px;font-size:11.5px;color:var(--ink-2)}
.seatkey span{display:inline-flex;align-items:center;gap:5px}
.swatch{width:11px;height:11px;border-radius:2px;display:inline-block;border:1px solid rgba(0,0,0,.1)}

/* ---------- stat tiles ---------- */
.tiles{display:grid;grid-template-columns:repeat(auto-fill,minmax(215px,1fr));gap:12px}
.tile{background:var(--surface);border:1px solid var(--rule);border-radius:8px;padding:13px 15px;position:relative}
.tile .lab{font-size:11.5px;color:var(--ink-2);font-weight:600;line-height:1.35;min-height:31px}
.tile .val{font-family:inherit;font-size:36px;font-weight:700;line-height:1;
  font-variant-numeric:tabular-nums;margin:4px 0 3px}
.tile .sub{font-size:11.5px;color:var(--ink-3)}
.tile .kill{position:absolute;top:7px;right:7px;border:0;background:none;color:var(--ink-3);cursor:pointer;
  font-size:15px;line-height:1;padding:2px 5px;border-radius:4px;opacity:0}
.tile:hover .kill{opacity:1}
.tile .kill:hover{background:#FBF2F1;color:var(--bad)}
.tile.add{border-style:dashed;display:flex;align-items:center;justify-content:center;cursor:pointer;
  color:var(--ink-3);font-weight:600;min-height:104px;background:transparent}
.tile.add:hover{border-color:var(--civic);color:var(--civic);background:var(--civic-soft)}

/* ---------- tables ---------- */
.tw{overflow:auto;max-width:100%}
table{border-collapse:collapse;width:100%;font-size:13px}
th{text-align:left;font-weight:600;color:var(--ink-2);font-size:11.5px;padding:8px 11px;
  border-bottom:1px solid var(--rule);white-space:nowrap;background:var(--surface);position:sticky;top:0;z-index:1}
th.sortable{cursor:pointer;user-select:none}
th.sortable:hover{color:var(--civic)}
td{padding:8px 11px;border-bottom:1px solid var(--rule-2);vertical-align:top}
tbody tr:hover{background:var(--surface-2)}
tr.inactive td{color:var(--ink-3)}
tr.inactive td .lname{text-decoration:line-through;text-decoration-thickness:1px}
.lname{font-weight:600;color:var(--ink);background:none;border:0;padding:0;cursor:pointer;text-align:left;font-size:13px}
.lname:hover{color:var(--civic);text-decoration:underline}
/* A word inside a sentence that goes somewhere. A button, because it moves
   within the app rather than following an address, and it has to read as part
   of the line it sits in rather than as a control beside it. */
.linkbtn{background:none;border:0;padding:0;font:inherit;color:var(--civic);
  text-decoration:underline;text-underline-offset:2px;cursor:pointer}
.linkbtn:hover{color:var(--civic-ink,var(--civic));text-decoration-thickness:2px}
td.num,th.num{text-align:right;font-variant-numeric:tabular-nums}
.empty{padding:34px 16px;text-align:center;color:var(--ink-3)}
.empty b{display:block;color:var(--ink);font-size:15px;margin-bottom:4px;font-family:inherit;}

/* ---------- pills ---------- */
.pill{display:inline-block;padding:2px 8px;border-radius:11px;font-size:11.5px;font-weight:600;
  border:1px solid transparent;white-space:nowrap}
.pill.sm{font-size:10.5px;padding:1px 6px}
.chip{display:inline-block;background:var(--surface-2);border:1px solid var(--rule);border-radius:4px;
  padding:1px 6px;font-size:11px;font-weight:600;color:var(--ink-2);margin-right:3px}
.tier1{background:#FBEAE7;color:#8E3125;border-color:#EFCCC6}
.tier2{background:#FBF2E0;color:#8A5D0B;border-color:#EDDCB6}
.tier3{background:var(--surface-2);color:var(--ink-3);border-color:var(--rule)}
.bar{height:7px;background:var(--rule-2);border-radius:4px;overflow:hidden;min-width:56px}
.bar > i{display:block;height:100%;border-radius:4px}

/* ---------- filter bar ---------- */
.filters{display:flex;gap:9px;flex-wrap:wrap;align-items:flex-end}
.filters .field{min-width:130px}
.filters input[type=text]{min-width:190px}
.count-note{font-size:12px;color:var(--ink-3);margin-left:auto;align-self:center}

/* ---------- timeline track ---------- */
.track-wrap{overflow-x:auto;padding-bottom:6px}
.mtrack{display:flex;gap:3px;min-width:640px}
.mseg{flex:1;min-width:56px}
.mseg .cap{height:9px;border-radius:2px;background:var(--nomeet)}
.mseg .n{font-family:inherit;font-weight:700;font-size:13px;margin-top:7px}
.mseg .nm{font-size:11px;line-height:1.35;color:var(--ink-2);margin-top:1px}
.mseg .dt{font-size:10.5px;color:var(--ink-3);margin-top:3px;font-variant-numeric:tabular-nums}
.phasebar{display:flex;gap:3px;min-width:640px;margin-bottom:7px}
.phasebar div{font-size:10.5px;font-weight:700;color:var(--ink-2);border-left:2px solid var(--rule);padding-left:5px}

/* ---------- detail / contact page ---------- */
.detail-head{display:flex;gap:18px;align-items:flex-start;flex-wrap:wrap}
.avatar{width:56px;height:56px;border-radius:8px;background:var(--ink);color:#fff;display:flex;
  align-items:center;justify-content:center;font-family:inherit;font-size:23px;font-weight:700;flex:0 0 56px}
/* minmax(0,1fr) rather than 1fr: a plain 1fr refuses to go below the content's
   own minimum, and a date input's intrinsic width then pushes it past the edge. */
.cols2{display:grid;grid-template-columns:repeat(2, minmax(0, 1fr));gap:14px}
.cols3{display:grid;grid-template-columns:repeat(3, minmax(0, 1fr));gap:14px}
@media(max-width:900px){.cols2,.cols3{grid-template-columns:1fr}}
.kv{display:grid;grid-template-columns:150px 1fr;gap:7px 12px;font-size:13px}
.kv dt{color:var(--ink-2);font-weight:600;font-size:12px}
.kv dd{margin:0}
.notebox{background:var(--surface-2);border:1px solid var(--rule-2);border-left:3px solid var(--nomeet);
  border-radius:0 6px 6px 0;padding:10px 12px;font-size:13px;white-space:pre-wrap;line-height:1.55}
.phase-card{border:1px solid var(--rule);border-radius:7px;padding:12px}
.phase-card h4{font-size:14px;margin-bottom:9px;display:flex;align-items:center;gap:7px}

/* ---------- modal ---------- */
/* Above the sign-in screen, which covers the page at 200. A dialog opened
   from there — resetting a forgotten password — was rendering correctly and
   sitting behind it, so the button looked like it did nothing. */
.scrim{position:fixed;inset:0;background:rgba(23,38,47,.5);z-index:260;display:flex;align-items:flex-start;
  justify-content:center;padding:36px 16px;overflow-y:auto}
.modal{background:var(--surface);border-radius:10px;box-shadow:var(--shadow);
  width:100%;max-width:620px;overflow:hidden;zoom:var(--zoom);
  /* Taller than the screen, the body scrolls and the footer stays put, so what
     a dialog offers is always reachable however long it is. */
  display:flex;flex-direction:column;max-height:calc(92vh / var(--zoom))}
.modal-b{overflow-y:auto;flex:1 1 auto}
.modal-f{flex:0 0 auto}
.modal.wide{max-width:900px}
.modal-h{padding:15px 18px;border-bottom:1px solid var(--rule);display:flex;align-items:center;gap:12px}
.modal-h h2{font-size:19px}
.modal-h .x{margin-left:auto;background:none;border:0;font-size:21px;cursor:pointer;color:var(--ink-3);
  line-height:1;padding:2px 7px;border-radius:5px}
.modal-h .x:hover{background:var(--surface-2);color:var(--ink)}
.modal-b{padding:18px;display:grid;gap:13px;max-height:calc(66vh / var(--zoom));overflow-y:auto}
/* The footer wraps. A dialog with five things to do — delete, send a reset,
   hand over the work, cancel, save — laid them in one row that was wider than
   the dialog, and the first of them went off the edge with no way to reach it.

   What can be undone sits right; what cannot sits left, away from Save. */
.modal-f{padding:13px 18px;border-top:1px solid var(--rule);display:flex;gap:9px;
  justify-content:flex-end;flex-wrap:wrap;align-items:center;
  background:var(--surface-2)}
.modal-f .btn.danger{margin-right:auto}
@media (max-width:560px){
  /* On a phone they stack rather than shuffling into an order nobody meant. */
  .modal-f{flex-direction:column-reverse;align-items:stretch}
  .modal-f .btn{width:100%}
  .modal-f .btn.danger{margin-right:0}
}
.hint{font-size:11.5px;color:var(--ink-3);line-height:1.45}
/* The roster and the bill tracker on a phone: a card per row. */
.lm-card[data-inactive]{opacity:.72}
.lm-card .who{justify-content:space-between}
.lm-card .mm-owner{margin-left:8px}
/* What the number above the roster is counting, said plainly. */
.lm-note{margin:2px 4px 10px;font-size:12.5px;line-height:1.45}
.lm-sort{margin-left:auto;display:inline-flex;align-items:center}
.lm-sort select{font:inherit;font-size:14px;height:44px;padding:0 12px;border-radius:22px;
  border:1px solid var(--rule);background:var(--surface);color:var(--ink)}
/* The member page on a phone opens with a briefing. */
.brief .brief-sec + .brief-sec{margin-top:14px;padding-top:12px;border-top:1px solid var(--rule-2)}
.brief-q{margin:0 0 6px;font-size:11.5px;text-transform:uppercase;letter-spacing:.04em;color:var(--ink-3);font-weight:700}
.brief-row{padding:3px 0}
.brief-take{white-space:pre-line;margin-top:4px}
.brief-take.clamp{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.brief-fu{display:flex;justify-content:space-between;align-items:center;gap:10px;padding:8px 0}
.brief-fu + .brief-fu{border-top:1px solid var(--rule-2)}
.brief-fu.late b{color:#B42318}
/* What can be done from the briefing (2.189.0): two across, a full thumb high, the call first
   and filled because it is the one most often meant. An odd last one takes the row. */
.brief-acts{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin:0 0 14px}
.brief-act{display:flex;align-items:center;justify-content:center;min-height:44px;padding:10px 12px;
  border:1px solid var(--rule);border-radius:10px;background:var(--surface);color:var(--civic);
  font:inherit;font-size:15px;font-weight:700;text-decoration:none;cursor:pointer}
.brief-act:first-child{background:var(--navy);border-color:var(--navy);color:#fff}
.brief-acts .brief-act:last-child:nth-child(odd){grid-column:1 / -1}
.brief-act:focus-visible{outline:2px solid var(--civic);outline-offset:2px}
#brief-log{margin-top:16px;width:100%}
/* Choosing a bill on a phone: a search and a short list of taps. */
.mm-billsearch{margin-top:10px}
.mm-billpick{display:flex;flex-direction:column;gap:6px;margin-top:8px}
.mm-billopt{display:flex;gap:8px;align-items:baseline;text-align:left;padding:11px 12px;border-radius:10px;
  border:1px solid var(--rule);background:var(--surface,#fff);color:var(--ink);font:inherit;cursor:pointer}
.mm-billopt span{flex:1;color:var(--ink-2);font-size:13px}
.mm-billopt small{color:var(--ink-3);font-size:11px}
/* A meeting that did not save, and one kept from before a reload. Both stay
   on screen until they are dealt with. */
.mm-unsaved{margin:14px 0 0;padding:12px 14px;border-radius:12px;background:#FDECEA;
  color:#7A1C12;display:flex;gap:10px;align-items:center;justify-content:space-between;font-weight:600}
.mm-unsaved .mm-go{flex:0 0 auto;width:auto;padding:9px 16px}
/* Not saved, and staying said. Above the bar along the bottom on a phone,
   out of the corner on a desk. */
.unsaved{position:fixed;left:12px;right:12px;bottom:calc(var(--mm-rail, 0px) + 12px);z-index:70;
  display:flex;align-items:center;justify-content:center;gap:8px;
  padding:13px 14px;border:0;border-radius:12px;cursor:pointer;
  background:var(--bad);color:#fff;font-size:14px;font-weight:600;font-family:inherit;
  box-shadow:0 8px 22px rgba(168,58,46,.35)}
.unsaved:disabled{opacity:.8;cursor:default}
.unsaved[hidden]{display:none}
@media(min-width:701px){.unsaved{left:auto;right:18px;bottom:18px;min-width:300px}}

/* The deploy notice (2.188.0). Its own prefixed names -- a stylesheet shares one
   namespace (2.153.2, 2.183.0) and a bare `.newbar` or `.ver` is how the next collision
   happens. Sits where `.unsaved` sits and never at the same time as it, so the two
   cannot stack: the one state where this would overlap is the one where it is hidden. */
.newver{position:fixed;left:12px;right:12px;bottom:calc(var(--mm-rail, 0px) + 12px);
  z-index:69;display:flex;align-items:center;gap:10px;
  padding:11px 12px;border-radius:12px;border:1px solid var(--rule-2);
  background:var(--surface-1);color:var(--ink-1);font-size:13.5px;
  box-shadow:0 8px 22px rgba(23,38,47,.18)}
.newver[hidden]{display:none}
.newver #newver-say{flex:1;min-width:0}
.newver .newver-x{border:0;background:none;color:var(--ink-3);font-family:inherit;
  font-size:12.5px;cursor:pointer;padding:6px 2px;text-decoration:underline}
@media(min-width:701px){.newver{left:auto;right:18px;bottom:18px;min-width:320px}}

/* A page that is easier at a desk says so, once, at the top. */
.desk-note{margin:0 0 12px;padding:10px 12px;border-radius:10px;background:var(--surface-2);
  color:var(--ink-2);font-size:12.5px;border:1px solid var(--rule-2)}

.mm-resume{margin:0 0 14px;padding:12px 14px;border-radius:12px;background:var(--civic-soft);color:var(--ink)}
.mm-resume p{margin:0 0 10px;font-weight:600}
.mm-resume .mm-go{width:auto;padding:9px 16px}
/* The state's own mailbox: room between the groups of fields. */
.pm-grid{margin-top:12px}
.pm-grid > * + *{margin-top:12px}
/* A position changed on the bill page and not yet applied. */
tr.bp-changed td{background:rgba(11,74,136,.12)}
tr.bp-changed td:first-child{box-shadow:inset 3px 0 0 var(--civic)}

/* ---------- query page ---------- */
.sqlbox{width:100%;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12.5px;min-height:112px;
  background:#12212A;color:#D8E4EA;border-color:#2C3D48;line-height:1.6;tab-size:2}
.schema{font-size:12px;line-height:1.7}
.schema b{font-family:inherit;font-size:14px}
.schema code{background:var(--surface-2);border:1px solid var(--rule-2);border-radius:3px;padding:0 4px;font-size:11.5px}
.rulebar{display:grid;grid-template-columns:1fr 150px 1fr 34px;gap:8px;align-items:center;margin-bottom:8px}
@media(max-width:760px){.rulebar{grid-template-columns:1fr}}
.err{background:#FBF2F1;border:1px solid #EFCCC6;color:#8E3125;padding:10px 12px;border-radius:6px;font-size:12.5px;
  font-family:ui-monospace,Menlo,monospace;white-space:pre-wrap}
.ok-msg{background:#EAF5F2;border:1px solid #C2DFD8;color:#0B5B50;padding:10px 12px;border-radius:6px;font-size:12.5px}

/* ---------- toast ---------- */
/* Above everything, including the sign-in screen. A message shown while
   somebody is resetting a password was appearing behind it. */
#toasts{position:fixed;bottom:20px;right:20px;z-index:300;display:flex;flex-direction:column;gap:8px}
.toast{background:var(--ink);color:#fff;padding:10px 15px;border-radius:7px;font-size:13px;box-shadow:var(--shadow);
  max-width:340px}
.toast.bad{background:var(--bad)}

tr.justadded{animation:flashrow 5s ease-out}
tr.justadded td:first-child{box-shadow:inset 3px 0 0 var(--sup)}
@keyframes flashrow{0%{background:#DFF1EC}60%{background:#DFF1EC}100%{background:transparent}}

#modal-error:empty{display:none}
#modal-error{margin-bottom:2px}

/* ---------- session countdown strip ---------- */
.datestrip{display:flex;gap:10px;overflow-x:auto;padding-bottom:4px;scrollbar-width:thin}
.datestrip::-webkit-scrollbar{height:6px}
.datestrip::-webkit-scrollbar-thumb{background:var(--rule);border-radius:3px}
.datecard{flex:0 0 auto;min-width:150px;text-align:left;background:var(--surface);
  border:1px solid var(--rule);border-radius:8px;padding:10px 13px;font:inherit;color:inherit;
  cursor:pointer}
.datecard:hover{border-color:#B9C4CB}
.datecard.next{border-color:var(--civic);background:var(--civic-soft);box-shadow:inset 0 -3px 0 var(--civic)}
.datecard.past{opacity:.5}
.datecard.summary{cursor:default;border-left:3px solid var(--ink);margin-left:4px}
.datecard.summary:hover{border-color:var(--rule);border-left-color:var(--ink)}
.dc-lab{font-size:11.5px;color:var(--ink-2);font-weight:600;white-space:nowrap}
.dc-date{font-family:inherit;font-size:22px;font-weight:700;line-height:1.15}
.dc-days{font-size:11.5px;color:var(--ink-3);font-variant-numeric:tabular-nums}

/* ---------- pinned bill cards: both chambers, gate by gate ---------- */
.billcard-whip .card-h h2{font-size:19px}
/* The bill's number inside the heading is the way to its page (2.176.0). `.lname` is
   sized for a table cell, so it is overridden here rather than a second class being
   invented: what carries over is the hover and the underline, which is what says it can
   be pressed. A stylesheet shares one namespace (2.153.2), so this is scoped to the
   card. */
.billcard-whip .card-h h2 .bc-open{font:inherit;color:inherit;letter-spacing:inherit}
.billcard-whip .card-h h2 .bc-open:hover{color:var(--civic);text-decoration:underline}

/* What we counted, beside the vote that happened (2.176.0). Smaller than the vote's own
   figures, as asked, and it wraps rather than pushing them off a narrow screen. */
.votewhip{display:flex;flex-wrap:wrap;gap:4px 14px;align-items:baseline;margin:7px 0 0;
  font-size:11.5px;color:var(--ink-2);font-variant-numeric:tabular-nums}
.votewhip .vw-lab{font-weight:700;text-transform:uppercase;letter-spacing:.04em;
  font-size:10px;color:var(--ink-3,var(--ink-2))}
.votewhip .vw-pair b{font-size:12.5px}
.votewhip .vw-v{opacity:.6;padding:0 1px}
/* The vote that happened, on the gate it happened at (2.191.0). `.gv-` prefixes
   everything this introduces: a stylesheet shares one namespace (2.153.2, 2.183.0),
   and `.gatevote` is scoped under the card rather than defined loose. */
.chamber .gatevote{display:flex;flex-wrap:wrap;gap:3px 10px;align-items:baseline;
  margin:6px 0 0;font-size:11.5px;color:var(--ink-2);font-variant-numeric:tabular-nums}
.chamber .gatevote.sm{margin:4px 0 0;font-size:11px}
.chamber .gatevote .gv-what{font-weight:700;text-transform:uppercase;
  letter-spacing:.04em;font-size:10px;color:var(--ink-3,var(--ink-2))}
.chamber .gatevote .gv-res{font-size:12.5px}
.chamber .gatevote .gv-vs{opacity:.85}
.billcard-whip .card-h .note{flex:1 1 220px;min-width:0}
.goal{font-family:inherit;font-size:15px;font-weight:700;letter-spacing:.06em;
  padding:2px 10px;border-radius:4px}
.goal.pass{background:#E7F7EC;color:var(--sup-ink);border:1px solid #B4E8C6}
.goal.block{background:#FEF3F2;color:var(--opp-ink);border:1px solid #F1C4BF}
.pill.here{background:var(--civic);color:#fff;border-color:var(--civic);letter-spacing:.04em}
/* The forecast switch, in the card header beside the goal. */
.fc{display:inline-flex;align-items:center;gap:5px;font-size:11.5px;color:var(--ink-2);
  white-space:nowrap;cursor:pointer;user-select:none}
.fc input{margin:0;cursor:pointer}
/* How the bill ended. A win, a loss, or still live somewhere. */
.pill.outcome.won{background:#E7F7EC;color:var(--sup-ink);border-color:#B4E8C6}
.pill.outcome.lost{background:#FEF3F2;color:var(--opp-ink);border-color:#F1C4BF}
.pill.outcome.open,.pill.outcome.untracked{background:var(--surface-2);color:var(--ink-3);
  border-color:var(--rule)}
/* A bill that is finished is a record rather than a target. It is not dimmed —
   the counts are exactly as real as they ever were — but the goal badge stops
   shouting, since there is nothing left to go and get. */
.billcard-whip.settled .goal{opacity:.6}
/* What the legislature did, where nobody here has recorded an outcome (2.190.0).
   Deliberately not one of the .outcome colors: those say whether the firm won, and
   this says only what happened. Prefixed and scoped under the card — a stylesheet
   shares one namespace (2.153.2, 2.183.0). */
.billcard-whip .pill.bc-ended{background:var(--surface-2);color:var(--ink-2);
  border-color:var(--rule)}

.chambers{display:grid;grid-template-columns:1fr 1fr}
.chamber{padding:2px 18px;min-width:0}
.chamber + .chamber{border-left:1px solid var(--rule-2)}
/* A chamber the bill has not reached, and a committee it has not been referred
   to, are dimmed rather than hidden: the count is real and worth seeing early. */
.chamber.away{opacity:.45}
.ch-h{display:flex;align-items:center;gap:8px;margin-bottom:9px;flex-wrap:wrap}
.ch-h h3{font-size:15px}
.ch-note{font-size:11px;color:var(--ink-3);margin-left:auto}

.lead{display:flex;align-items:flex-end;gap:11px;margin-bottom:7px}
.lead .big{font-family:inherit;font-size:38px;line-height:.92;font-weight:700;
  font-variant-numeric:tabular-nums}
.lead .of{font-size:12px;color:var(--ink-2);padding-bottom:4px}
.lead .of b{font-variant-numeric:tabular-nums}

.segbar{display:flex;height:10px;border-radius:5px;overflow:hidden;background:var(--rule-2);
  gap:1px;position:relative}
.segbar > span{display:block;height:100%}
.segbar.sm{height:7px;border-radius:4px}
.seg-sup{background:var(--sup)} .seg-per{background:var(--pers)}
.seg-opp{background:var(--opp)} .seg-unk{background:var(--nomeet)}
/* Named apart from .goalmark, which is the vote-goal marker on the chamber
   floor, and from .dot, which is the who-is-here light in the sidebar. Both
   were being restyled from here, which turned a round pulsing light square and
   faded the floor's marker. */
.gatemark{position:absolute;top:-3px;bottom:-3px;width:2px;background:var(--ink);opacity:.55;
  border-radius:1px}
.segnums{display:flex;gap:10px;margin-top:6px;flex-wrap:wrap}
/* A figure under a bill's bar that opens the members it counted. */
.seglink{display:inline-flex;align-items:center;gap:4px;background:none;border:0;padding:0;margin:0;
  font:inherit;font-size:11px;color:var(--ink-2);font-variant-numeric:tabular-nums;cursor:pointer;text-decoration:underline;text-decoration-color:rgba(23,38,47,.3);
  text-underline-offset:3px}
.seglink:hover{color:var(--civic);text-decoration-color:currentColor}
.comm-h .n .seglink{font-size:inherit;color:inherit}
.seglink:focus-visible{outline:2px solid var(--civic);outline-offset:2px;border-radius:3px}
.segnums span{font-size:11px;color:var(--ink-2);font-variant-numeric:tabular-nums;
  display:flex;align-items:center;gap:4px}
.segdot{width:8px;height:8px;border-radius:2px;display:inline-block;flex:0 0 auto}

.comms{margin-top:14px;border-top:1px solid var(--rule-2);padding-top:11px}
.comms-lab{font-size:11px;font-weight:600;letter-spacing:.05em;text-transform:uppercase;
  color:var(--ink-3);margin-bottom:9px}
.comm{margin-bottom:11px}
.comm.notyet{opacity:.45}
.comm-h{display:flex;align-items:baseline;gap:8px;margin-bottom:4px}
.comm-h b{font-size:12.5px;font-weight:600;min-width:0}
.comm-h .n{margin-left:auto;font-size:11px;color:var(--ink-3);font-variant-numeric:tabular-nums;
  white-space:nowrap}
/* Where a committee's whole membership was read off its own roll calls (2.187.0). Scoped
   under .comm-h and prefixed, because a stylesheet shares one namespace (2.153.2) and a
   bare .from or .src would be the third instance of that fault. */
.comm-h .cmte-from{font-size:10px;color:var(--ink-3);white-space:nowrap;
  border:1px solid var(--rule-2);border-radius:999px;padding:0 6px;line-height:15px}

.legend{display:flex;gap:14px;flex-wrap:wrap;align-items:center;padding:11px 16px;
  border-top:1px solid var(--rule-2);background:var(--surface-2)}
.legend span{font-size:11px;color:var(--ink-2);display:flex;align-items:center;gap:5px}
.legend .right-note{margin-left:auto}

/* ---------- meetings, on a phone ----------
   Touch targets are 44 px at least, the one action that matters on a screen
   sits at the bottom where a thumb reaches, and position colors are the ones
   the whip cards use. */
.sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
.mm{max-width:560px;margin:0 auto}
.mm-search{position:relative;margin-bottom:10px}
.mm-search svg{position:absolute;left:13px;top:13px;color:var(--ink-2);pointer-events:none}
.mm-search input,.mm-input{width:100%;height:44px;box-sizing:border-box;border:1px solid var(--rule);
  border-radius:12px;padding:0 14px;font:inherit;font-size:15px;background:var(--surface-2);color:var(--ink)}
textarea.mm-input{height:84px;padding:12px 14px;line-height:1.45;resize:vertical;display:block}
select.mm-input{appearance:auto}
.mm-chips{display:flex;gap:8px;overflow-x:auto;padding-bottom:2px;scrollbar-width:none;-webkit-overflow-scrolling:touch}
.mm-chips::-webkit-scrollbar{display:none}
.mm-chip{height:44px;padding:0 15px;border-radius:22px;border:1px solid var(--rule);background:var(--surface);
  font:inherit;font-size:14px;font-weight:500;color:var(--ink);display:inline-flex;align-items:center;gap:7px;
  white-space:nowrap;flex:0 0 auto;cursor:pointer;box-sizing:border-box}
.mm-chip.on{background:var(--civic);border-color:var(--civic);color:#fff;font-weight:600}
.mm-wrap{display:flex;gap:8px;flex-wrap:wrap}
.mm-datechip{position:relative}
.mm-datechip input{position:absolute;inset:0;opacity:0;width:100%;height:100%;cursor:pointer}
.mm-sum{display:flex;gap:8px;align-items:baseline;margin:14px 4px 4px;font-size:14px;font-weight:600}
.mm-sum .due{color:#8A5A08}
.mm-dim{color:var(--ink-3)}
.mm-grp{font-size:12px;font-weight:700;letter-spacing:.07em;text-transform:uppercase;color:var(--ink-2);margin:16px 4px 8px}
.mm-card{display:flex;flex-direction:column;gap:8px;width:100%;text-align:left;background:var(--surface);
  border:1px solid var(--rule);border-radius:14px;padding:14px;margin-bottom:10px;font:inherit;color:var(--ink);cursor:pointer}
.mm-card .who{display:flex;align-items:baseline;gap:8px}
.mm-card .who b{font-size:16.5px}
.mm-owner{margin-left:auto;font-size:12.5px;color:var(--ink-2)}
.mm-card .meta{font-size:13px;color:var(--ink-2);margin-top:-4px}
.mm-pills{display:flex;gap:6px;flex-wrap:wrap}
.mm-pill{display:inline-flex;align-items:center;height:24px;padding:0 9px;border-radius:12px;font-size:12px;
  font-weight:600;white-space:nowrap;background:var(--civic-soft);color:var(--civic)}
.mm-pill.plain{background:var(--surface);color:var(--ink-2);border:1px solid var(--rule)}
.mm-bill{display:inline-flex;align-items:center;gap:7px;height:30px;padding:0 10px;border-radius:8px;
  background:var(--surface-2);border:1px solid var(--rule-2);font-size:13px;font-weight:600;white-space:nowrap}
.mm-sw{width:10px;height:10px;border-radius:3px;flex:0 0 auto;display:inline-block}
.mm-fu{display:flex;align-items:center;gap:8px;padding:9px 10px;border-radius:9px;font-size:13px}
.mm-fu.due{background:#FBF3E3;color:#6B4506}
.mm-fu.late{background:#F8E9E7;color:#7A271F}
.mm-fab{position:sticky;bottom:var(--mm-rail,0px);
  padding:14px 0 calc(16px + var(--mm-safe,env(safe-area-inset-bottom,0px)));
  background:linear-gradient(to bottom,rgba(0,0,0,0),var(--ground) 45%);margin-top:6px}
.mm-go{height:56px;border-radius:16px;background:var(--civic);color:#fff;border:0;width:100%;font:inherit;
  font-size:17px;font-weight:600;display:flex;align-items:center;justify-content:center;gap:10px;cursor:pointer}
.mm-go[disabled]{background:var(--rule);color:var(--ink-2);cursor:default}
.mm-go.ghost{background:transparent;color:var(--civic);height:44px;font-size:15px;margin-top:4px}
.mm-top{display:flex;align-items:center;gap:6px;margin-bottom:8px}
.mm-h{flex:1;margin:0;font-size:22px;font-weight:700}
.mm-h.small{font-size:15px;font-weight:600}
.mm-step{font-size:13px;color:var(--ink-2);padding-right:6px}
.mm-icon{width:44px;height:44px;border:0;background:transparent;border-radius:10px;display:flex;
  align-items:center;justify-content:center;color:var(--ink);cursor:pointer;flex:0 0 auto}
.mm-link{height:44px;padding:0 12px;border:0;background:transparent;font:inherit;font-size:15px;
  font-weight:600;color:var(--civic);cursor:pointer}
.mm-link.inline{height:auto;padding:0;font-size:inherit}
.mm-prog{height:4px;background:var(--rule-2);border-radius:2px;margin-bottom:18px}
.mm-prog i{display:block;height:4px;background:var(--civic);border-radius:2px}
.mm-sec{margin-bottom:22px}
.mm-q{display:block;font-size:17px;font-weight:700;margin:0 0 10px}
.mm-lab{display:block;font-size:12px;font-weight:700;letter-spacing:.07em;text-transform:uppercase;
  color:var(--ink-2);margin-bottom:8px}
.mm-cap{display:block;font-size:13px;color:var(--ink-2);margin:2px 0 8px}
.mm-seg{display:flex;gap:4px;padding:4px;background:var(--ground);border-radius:12px}
.mm-seg button{height:44px;flex:1 1 0;border:0;background:transparent;border-radius:9px;font:inherit;
  font-size:14px;color:var(--ink);cursor:pointer}
.mm-seg button.on{background:var(--surface);font-weight:700;box-shadow:0 1px 3px rgba(23,38,47,.18)}
.mm-since{display:flex;align-items:center;gap:10px;margin-top:10px;font-size:14px;color:var(--ink-2)}
.mm-since input{height:44px;border:1px solid var(--rule);border-radius:10px;padding:0 10px;font:inherit;
  background:var(--surface);color:var(--ink)}
.mm-toggle{display:flex;align-items:center;gap:14px;padding:12px 14px;border:1px solid var(--rule);
  border-radius:12px;margin-bottom:22px;cursor:pointer;position:relative}
.mm-toggle.on{border-color:#E7C98B;background:#FBF3E3}
.mm-toggle span{flex:1;display:flex;flex-direction:column}
.mm-toggle small{font-size:13px;color:var(--ink-2)}
.mm-toggle input{position:absolute;opacity:0;width:1px;height:1px}
.mm-toggle i{width:50px;height:30px;border-radius:15px;background:var(--rule);position:relative;flex:0 0 auto}
.mm-toggle i::after{content:'';position:absolute;top:3px;left:3px;width:24px;height:24px;border-radius:12px;
  background:#fff;transition:left .15s}
.mm-toggle.on i{background:var(--civic)}
.mm-toggle.on i::after{left:23px}
.mm-toggle input:focus-visible + i{outline:2px solid var(--civic);outline-offset:2px}
.mm-person{display:flex;align-items:center;gap:12px;min-height:56px;padding:6px 12px;border:1px solid var(--rule-2);
  border-radius:12px;background:var(--surface);width:100%;font:inherit;color:inherit;text-align:left;
  margin-bottom:8px;cursor:pointer;box-sizing:border-box}
.mm-person.on{border:2px solid var(--civic);background:var(--civic-soft);padding:5px 11px}
.mm-pn{flex:1;display:flex;flex-direction:column}
.mm-pn b{font-size:15px}
.mm-pn small{font-size:13px;color:var(--ink-2)}
.mm-check{color:var(--civic)}
.mm-av{width:38px;height:38px;border-radius:19px;background:var(--civic-soft);color:var(--civic);display:flex;
  align-items:center;justify-content:center;font-weight:700;font-size:13px;flex:0 0 auto}
.mm-context{display:flex;align-items:center;gap:10px;padding:10px 12px;border-radius:12px;
  background:var(--civic-soft);margin-bottom:20px}
.mm-context span:last-child{display:flex;flex-direction:column}
.mm-context small{font-size:13px;color:var(--ink-2)}
.mm-billbox{border:1px solid var(--rule);border-radius:14px;padding:4px 4px 12px 12px;margin-bottom:10px}
.mm-billhead{display:flex;align-items:center;gap:8px}
.mm-billhead span{flex:1;font-size:13px;color:var(--ink-2);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mm-scale{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:5px;margin:6px 8px 0 0}
.mm-scale button{height:48px;border-radius:9px;border:2px solid transparent;cursor:pointer;display:flex;
  align-items:center;justify-content:center;padding:0}
.mm-scale-key{display:flex;align-items:baseline;margin:8px 8px 0 0;font-size:12px;color:var(--ink-2)}
.mm-scale-key b{flex:1;text-align:center;font-size:15px}
.mm-addbill{display:block}
.mm-addbill select{width:100%;height:48px;border:1.5px dashed var(--rule);border-radius:12px;
  background:var(--surface);font:inherit;font-size:15px;font-weight:600;color:var(--civic);padding:0 14px;cursor:pointer}
.mm-fuhead{display:flex;align-items:center;gap:8px;margin-bottom:10px}
.mm-fuhead .mm-q{flex:1;margin:0}
.mm-owner-pick select{height:44px;border:1px solid var(--rule);border-radius:22px;padding:0 12px;
  font:inherit;font-size:14px;background:var(--surface);color:var(--ink);max-width:160px}
/* Above the app's bottom bar where there is one. The home indicator's padding
   only where there is no bar, since the bar already has it. */
.mm-foot{position:sticky;bottom:var(--mm-rail,0px);background:var(--surface);
  border-top:1px solid var(--rule-2);margin:8px -16px 0;
  padding:12px 16px calc(12px + var(--mm-safe,env(safe-area-inset-bottom,0px)))}
.mm-name{font-family:inherit;font-size:32px;line-height:1.02;
  font-weight:700;margin:4px 0 6px}
.mm-meta{font-size:14px;color:var(--ink-2);margin:0 0 10px}
.mm-tags{margin:-4px 0 12px}
.mm-panel{background:var(--surface);border:1px solid var(--rule);border-radius:14px;padding:14px;margin-bottom:12px}
.mm-stand{display:flex;align-items:center;gap:12px;padding:6px 0}
.mm-stand > i{width:6px;align-self:stretch;border-radius:3px;flex:0 0 auto}
.mm-stand > span:nth-child(2){flex:1;display:flex;flex-direction:column}
.mm-stand small{font-size:14px;color:var(--ink-2)}
.mm-moved{font-size:12px;font-weight:600;padding:4px 10px;border-radius:12px;white-space:nowrap}
.mm-moved.away{background:#F8E9E7;color:#7A271F}
.mm-moved.closer{background:#E2F1ED;color:#0B5C51}
.mm-said{margin:0 0 8px;font-size:15.5px;line-height:1.55;white-space:pre-wrap}
.mm-fubox{background:#FBF3E3;border:1px solid #E7C98B;border-radius:14px;padding:14px;margin-bottom:12px}
.mm-fubox.late{background:#F8E9E7;border-color:#E3B4AE}
.mm-fubox.done{background:var(--surface);border-color:var(--rule)}
.mm-fuline{display:flex;align-items:center;gap:8px}
.mm-fuline .mm-lab{flex:1;margin:0}
.mm-duepick{position:relative;display:flex;align-items:center;gap:6px;min-height:44px;padding:0 8px;
  margin:-10px -8px -10px 0;font-size:13px;font-weight:600;color:#6B4506;cursor:pointer}
.mm-duepick input{position:absolute;inset:0;opacity:0;width:100%;cursor:pointer}
.mm-futext{margin:10px 0 12px;font-size:15.5px;font-weight:600}
.mm-fuact{display:flex;gap:8px}
.mm-fuact .mm-go{height:48px;font-size:15px;flex:1}
.mm-handoff{position:relative;display:flex;align-items:center;height:48px;padding:0 16px;border:1px solid #D9B870;
  border-radius:12px;background:var(--surface);font-weight:600;font-size:15px;color:#6B4506;cursor:pointer}
.mm-handoff select{position:absolute;inset:0;opacity:0;width:100%;cursor:pointer}

/* ---------- conference, on the card ----------
   A band under both chambers, for the bills that went. */
.conf{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:14px;padding:11px 14px;
  border-radius:10px;border:1px solid var(--rule);background:var(--surface-2)}
.conf-lab{font-size:11.5px;font-weight:700;letter-spacing:.07em;text-transform:uppercase;color:var(--ink-2)}
.conf-state{flex:1 1 260px;font-size:13.5px;color:var(--ink)}
.conf-in{border-color:#9DB8D9;background:var(--civic-soft)}
.conf-agreed{border-color:#A8D2C7;background:#E2F1ED}
.conf-died{border-color:#E3B4AE;background:#F8E9E7}
.conf-sug .card-b{display:flex;align-items:center;gap:12px;flex-wrap:wrap}
.conf-sug-q{flex:1 1 320px;font-size:14px}
.conf-sug-acts{display:flex;gap:8px}

/* ---------- tags ----------
   Team tags solid, personal tags dashed with a person, so which list a tag
   lives in can be read at a glance and never has to be remembered. */
.tg{display:inline-flex;align-items:center;gap:6px;height:28px;padding:0 10px;border-radius:14px;
  font-size:12.5px;font-weight:600;white-space:nowrap;box-sizing:border-box;vertical-align:middle}
.tg.team{background:var(--civic-soft);color:var(--civic);border:1px solid #C9D8EA}
.tg.mine{background:var(--surface);color:var(--ink-2);border:1px dashed #8A9AA5}
.tg:has(.tg-x){padding-right:3px}
.tg-x{width:24px;height:24px;border:0;background:transparent;border-radius:12px;display:flex;
  align-items:center;justify-content:center;color:inherit;padding:0;cursor:pointer}
.tg-x:hover{background:rgba(23,38,47,.08)}
.tg-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:14px;padding-top:12px;
  border-top:1px solid var(--rule-2)}
.tg-lab{font-size:11.5px;font-weight:700;letter-spacing:.07em;text-transform:uppercase;
  color:var(--ink-2);margin-right:4px}
.tg-none{font-size:13px;color:var(--ink-2);font-style:italic}
.tg-anchor{position:relative;display:inline-flex}
.tg-add.on{border-color:var(--civic);color:var(--civic)}
.tg-inline{display:flex;gap:5px;flex-wrap:wrap;margin-top:5px}
.tg-inline .tg{height:22px;font-size:11.5px;padding:0 8px}
.tg-menu{position:absolute;top:calc(100% + 6px);left:0;z-index:40;width:340px;max-width:calc(100vw - 32px);
  background:var(--surface);border:1px solid var(--rule);border-radius:12px;padding:8px;
  box-shadow:0 12px 32px -10px rgba(23,38,47,.35);text-align:left}
.tg-search{display:flex;gap:6px;margin-bottom:6px}
.tg-search input{flex:1;height:38px;box-sizing:border-box;border:1px solid var(--rule);border-radius:8px;
  padding:0 12px;font:inherit;font-size:14px;background:var(--surface);color:var(--ink)}
.tg-close{width:38px;height:38px;border:0;background:transparent;border-radius:8px;display:flex;
  align-items:center;justify-content:center;color:var(--ink-2);cursor:pointer;flex:0 0 auto}
.tg-sec{font-size:11px;font-weight:700;letter-spacing:.07em;text-transform:uppercase;color:var(--ink-2);
  padding:8px 10px 4px}
.tg-opt{display:flex;align-items:center;gap:8px;width:100%;min-height:38px;padding:0 10px;border:0;
  background:transparent;border-radius:7px;font:inherit;font-size:14px;color:var(--ink);text-align:left;cursor:pointer}
.tg-opt:hover:not([disabled]),.tg-opt:focus-visible{background:var(--civic-soft)}
.tg-opt[disabled]{color:var(--ink-3);cursor:default}
/* The mark beside a chosen tag in the picker. Named apart from `.tg-check`, which is
   the checkbox label further down: two components, two names -- and named `chosen`
   rather than a near-copy of `check`, since two classes a letter apart invite the
   collision back. */
.tg-chosen{width:16px;flex:0 0 auto;color:var(--civic);display:flex}
.tg-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.tg-n{font-size:12px;color:var(--ink-2);white-space:nowrap}
.tg-empty{margin:4px 10px 8px;font-size:13px;color:var(--ink-2)}
.tg-create{margin:8px 2px 2px;border:1px solid #C9D8EA;background:var(--civic-soft);border-radius:10px;
  padding:12px;display:flex;flex-direction:column;gap:10px;font-size:14px}
.tg-check{display:flex;align-items:flex-start;gap:10px;cursor:pointer}
.tg-check input{width:18px;height:18px;margin:1px 0 0;accent-color:var(--civic);flex:0 0 auto}
.tg-check span{display:flex;flex-direction:column;gap:2px}
.tg-check small{font-size:12.5px;color:var(--ink-2);font-weight:400}
.tg-check.inline{align-items:center}
.tg-createbtns{display:flex;justify-content:flex-end;gap:8px}
.tg-foot{border-top:1px solid var(--rule-2);margin-top:8px;padding:8px 10px 2px}
.tg-link{border:0;background:transparent;padding:4px 0;font:inherit;font-size:13px;font-weight:600;
  color:var(--civic);cursor:pointer}
.tg-new{display:flex;gap:10px;align-items:center;flex-wrap:wrap}
.tg-new input[type=text],.tg-new #tg-newname{height:38px;min-width:220px;flex:1;box-sizing:border-box;
  border:1px solid var(--rule);border-radius:8px;padding:0 12px;font:inherit;font-size:14px;
  background:var(--surface);color:var(--ink)}
.tg-table td{vertical-align:top;padding-top:11px;padding-bottom:11px}
.tg-table tr.tg-theirs{background:var(--surface-2)}
.tg-seg{display:inline-flex;gap:2px;padding:3px;background:var(--ground);border-radius:8px}
.tg-seg button{height:28px;padding:0 10px;border:0;background:transparent;border-radius:6px;font:inherit;
  font-size:12.5px;color:var(--ink);cursor:pointer}
.tg-seg button.on{background:var(--surface);font-weight:700;box-shadow:0 1px 2px rgba(23,38,47,.2)}
.tg-seg button[disabled]{color:var(--ink-3);cursor:default}
.tg-seg button.on[disabled]{color:var(--ink)}
.tg-note{font-size:12px;color:var(--ink-2);margin-top:5px;max-width:320px}
.tg-acts{text-align:right;white-space:nowrap}
.tg-rename{display:flex;gap:6px;align-items:center;flex-wrap:wrap}
.tg-rename input{height:32px;width:190px;box-sizing:border-box;border:1px solid var(--civic);border-radius:7px;
  padding:0 10px;font:inherit;font-size:13.5px;background:var(--surface);color:var(--ink)}
@media (max-width:700px){
  .tg-menu{position:fixed;left:12px;right:12px;top:auto;bottom:calc(84px + env(safe-area-inset-bottom,0px));
    width:auto;max-width:none;max-height:calc(70vh / var(--zoom));overflow:auto}
  .tg-opt{min-height:44px}
  .tg-x{width:32px;height:32px}
}

/* ---------- progress bar with its figure ---------- */
.pctbar{display:flex;align-items:center;gap:8px}
.pctbar .bar{flex:1;min-width:44px}
.pctnum{font-variant-numeric:tabular-nums;font-size:12px;font-weight:600;
  min-width:34px;text-align:right;flex:0 0 34px}

/* ---------- idle warning ---------- */
#idlewarn{position:fixed;left:0;right:0;bottom:0;z-index:70;display:flex;justify-content:center;
  padding:14px;pointer-events:none}
.idle-card{pointer-events:auto;background:var(--ink);color:#fff;border-radius:10px;
  padding:13px 16px;display:flex;gap:14px;align-items:center;flex-wrap:wrap;
  box-shadow:0 10px 30px rgba(0,0,0,.28);max-width:520px;font-size:13px}
.idle-card b{font-size:14px}
.idle-card > div{flex:1;min-width:200px;color:#D7E0E5}
.idle-card #idleleft{font-variant-numeric:tabular-nums;font-weight:700;color:#fff}
@media (hover:none){#idlewarn{bottom:64px}}

/* ---------- field chips in the bulk picker ---------- */
.chipbox{display:inline-flex;align-items:center;gap:4px;border:1px solid var(--rule);
  border-radius:5px;padding:2px 7px;font-size:11.5px;background:var(--surface);cursor:pointer;
  font-family:ui-monospace,Menlo,monospace}
.chipbox input{margin:0;width:12px;height:12px}
.chipbox:hover{border-color:var(--civic)}

/* ---------- help ---------- */
.helpbtn{flex:0 0 30px;width:30px;height:30px;border-radius:50%;border:1px solid var(--rule);
  background:var(--surface);color:var(--ink-2);font-weight:700;font-size:15px;cursor:pointer;
  line-height:1;font-family:inherit;}
.helpbtn:hover{border-color:var(--civic);color:var(--civic);background:var(--civic-soft)}
.help-topic{border:1px solid var(--rule);border-radius:7px;margin-bottom:6px;overflow:hidden}
.help-head{display:flex;align-items:center;gap:9px;width:100%;background:var(--surface-2);border:0;
  padding:9px 12px;cursor:pointer;font:inherit;color:inherit;text-align:left}
.help-head:hover{background:#EEF2F4}
.help-title{font-weight:600;font-size:13.5px;flex:1;min-width:0}
.help-body{padding:2px 14px 10px;font-size:13px;line-height:1.6}
.help-body p{margin:8px 0 0}
.help-topic.shut .help-body{display:none}
.help-topic.shut .chev{transform:rotate(-45deg);margin-top:1px}

/* ---------- who is signed in ---------- */
#whoson:empty{display:none}
.whoson-line{display:flex;align-items:center;gap:8px;width:100%;background:none;border:0;
  padding:0 0 9px;color:#B7C6CE;font:inherit;font-size:11.5px;cursor:pointer;text-align:left}
.whoson-line:hover{color:#fff}

/* ---------- release notes ---------- */
.rellist{display:flex;flex-direction:column;gap:6px}
.rel{border:1px solid var(--rule);border-radius:7px;overflow:hidden}
.rel-head{display:flex;align-items:center;gap:9px;width:100%;background:var(--surface-2);
  border:0;padding:9px 12px;cursor:pointer;font:inherit;color:inherit;text-align:left}
.rel-head:hover{background:#EEF2F4}
.rel-v{font-family:inherit;font-weight:700;font-size:16px;
  min-width:52px;font-variant-numeric:tabular-nums}
.rel-t{font-weight:600;font-size:13px;flex:1;min-width:0}
.rel-d{font-size:11.5px;color:var(--ink-3);white-space:nowrap}
.rel-body{margin:0;padding:10px 14px 12px;list-style:none;display:flex;flex-direction:column;gap:7px}
.rel-body li{display:flex;gap:8px;align-items:flex-start;font-size:13px;line-height:1.5}
.rel-body li .pill{flex:0 0 auto;margin-top:1px}
.rel.shut .rel-body{display:none}
.rel.shut .chev{transform:rotate(-45deg);margin-top:1px}
.dotmark{display:inline-block;width:7px;height:7px;border-radius:50%;background:#fff;
  margin-left:5px;vertical-align:middle}
@media(max-width:560px){.rel-d{display:none}}

/* ---------- foldable sections ---------- */
.foldbtn{display:flex;align-items:center;gap:8px;background:none;border:0;padding:0;margin:0;
  cursor:pointer;font:inherit;color:inherit;text-align:left}
.foldbtn h2{margin:0}
.foldbtn:hover h2{color:var(--civic)}
.chev{width:9px;height:9px;border-right:2px solid var(--ink-3);border-bottom:2px solid var(--ink-3);
  transform:rotate(45deg);transition:transform .15s;flex:0 0 9px;margin-top:-3px}
.fold.shut .chev{transform:rotate(-45deg);margin-top:1px}
.fold.shut .foldbody{display:none}
.fold.shut .card-h{border-bottom:0}
.fold.shut .card-h .right{opacity:.45;pointer-events:none}

/* ---------- clickable counts ---------- */
.drill{background:none;border:0;padding:0;font:inherit;color:var(--civic);cursor:pointer;
  font-variant-numeric:tabular-nums;font-weight:600;border-bottom:1px dotted currentColor}
.drill:hover{color:#16406F;border-bottom-style:solid}
.drill .pill{cursor:pointer}
.keybtn{display:inline-flex;align-items:center;gap:5px;background:none;border:1px solid transparent;
  border-radius:5px;padding:2px 6px;margin:-2px -2px;font:inherit;font-size:11.5px;color:var(--ink-2);
  cursor:pointer}
.keybtn:hover:not(:disabled){background:var(--surface-2);border-color:var(--rule);color:var(--ink)}
.keybtn:disabled{cursor:default;opacity:.55}
.keybtn b{font-variant-numeric:tabular-nums}

/* ---------- tracked bills strip ---------- */
.billstrip{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:12px;padding:16px}
.billcard{text-align:left;background:var(--surface);border:1px solid var(--rule);border-radius:8px;
  padding:12px 13px;cursor:pointer;display:flex;flex-direction:column;gap:7px;font:inherit;color:inherit}
.billcard:hover{border-color:#B9C4CB;box-shadow:var(--shadow)}
.billcard.priority{border-left:4px solid var(--opp);background:#FDF8F7}
.billcard.more{align-items:center;justify-content:center;border-style:dashed;color:var(--ink-3);font-weight:600}
.bc-top{display:flex;align-items:center;gap:8px}
.bc-num{font-family:inherit;font-size:20px;font-weight:700;line-height:1}
.bc-title{font-size:12.5px;line-height:1.4;color:var(--ink-2);display:-webkit-box;-webkit-line-clamp:2;
  -webkit-box-orient:vertical;overflow:hidden}
.bc-foot{display:flex;gap:5px;flex-wrap:wrap}
.bc-action{font-size:11px;color:var(--ink-3);border-top:1px solid var(--rule-2);padding-top:6px;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.seatwarn{background:#FBF2E0;border:1px solid #EDDCB6;color:#8A5D0B;border-radius:6px;
  padding:8px 11px;font-size:12px;margin-top:11px;line-height:1.45}
.seatwarn.over{background:#FBF2F1;border-color:#EFCCC6;color:#8E3125}
tr.prio-row{background:#FDF7F6}
tr.prio-row td:first-child{box-shadow:inset 3px 0 0 var(--opp)}

/* ============================================================
   Touch and small screens
   Phones get a bottom tab bar and cards instead of wide tables;
   tablets keep the rail but with larger hit areas.
   ============================================================ */

/* Anything that responds to a finger gets a 44px target and no tap flash. */
@media (hover:none){
  button, .btn, select, input[type=checkbox] + .track, .navitem, .lname, .seat, a{
    -webkit-tap-highlight-color:transparent; touch-action:manipulation;
  }
  .btn{min-height:44px;padding:10px 16px}
  .btn.sm{min-height:38px;padding:8px 12px}
  input,select,textarea{min-height:44px;font-size:16px}  /* 16px stops iOS zooming on focus */
  textarea{min-height:88px}
  th{padding:12px 11px}
  td{padding:12px 11px}
  .seat{width:26px;height:26px}
  .drill{padding:4px 2px}
  .datecard{min-width:158px;padding:13px 15px}
  .pctnum{font-size:13px}
  .keybtn{padding:7px 9px}
  .helpbtn{width:40px;height:40px;flex:0 0 40px;font-size:18px}
  .foldbtn{min-height:44px}
  .seat:hover{transform:none}
  .navitem{padding:13px 12px}
  .track{width:46px;height:26px;flex:0 0 46px}
  .track::after{width:22px;height:22px}
  .switch input:checked + .track::after{transform:translateX(20px)}
  .switch.sm .track{width:38px;height:22px;flex:0 0 38px}
  .switch.sm .track::after{width:18px;height:18px}
  .switch.sm input:checked + .track::after{transform:translateX(16px)}
  .tile .kill{opacity:1}
  .tw{-webkit-overflow-scrolling:touch}
}

/* ---------- the phone menu ----------
   Hidden entirely on a wide screen, where the rail is always visible. */
/* ---------- back to top ----------
   Only on a phone, and only once there is something to come back from. It sits
   outside the nav strip, which scrolls sideways, so it stays put wherever that
   list has been dragged to. */
.backtop{display:none;flex-direction:column;align-items:center;justify-content:center;gap:2px;
  flex:0 0 auto;min-width:58px;padding:9px 12px;background:none;border:0;cursor:pointer;
  color:#B7C6CE;font-size:11.5px;font-weight:500;
  border-right:1px solid rgba(255,255,255,.12)}
.backtop:active{background:rgba(255,255,255,.10);color:#fff}
.backtop-arrow{width:9px;height:9px;border-left:2px solid currentColor;
  border-top:2px solid currentColor;transform:rotate(45deg);margin-bottom:2px}

/* ---------- one search ----------
   In the bar, so it is on every page. The results are drawn over the page
   rather than pushing it down: a list that moves the thing somebody is
   reading is a list that makes them lose their place. */
.find{position:relative;margin-left:auto;flex:0 1 280px;min-width:0}
/* Two classes deep on purpose. The app styles every form control with
   input[type="search"] among the selectors, which outweighs a single class —
   so a box written as `.findbox` lost its background to that rule and kept its
   own white text, which put white on white in both themes: an empty white
   rectangle, and nothing appearing as anybody typed.

   It takes its ink from the bar rather than naming a color. The bar is dark
   in the dark theme and light in the light one, and a color named here can
   only ever be right in one of them. The wash and the edge are a neutral gray
   at low opacity, which reads as a slight inset on either. */
.find .findbox{width:100%;height:36px;padding:0 12px;border-radius:9px;
  border:1px solid rgba(128,128,128,.45);background:rgba(128,128,128,.14);color:inherit;
  font-size:13.5px;font-family:inherit}
.find .findbox::placeholder{color:inherit;opacity:.62}
.find .findbox:focus{outline:2px solid #FFD66B;outline-offset:1px;
  background:rgba(128,128,128,.22)}
.findbtn{display:none}
/* ---------- where the platform jumps to (2.153.0) ----------
   The chooser's slot, for an account that belongs to no company. It reuses the search
   panel's own rows rather than growing a second set: two dropdowns that look different
   on one bar read as two different kinds of thing, and these are the same thing asked
   about different records. Positioned so `.findwrap` below hangs off it.

   **Named `statejump` and not `jump`, which was already taken (2.153.2).** `.jump` is the
   *Jump to* pill in the section nav on Settings, defined twice further down this file --
   so this wrapper was picking up a pill's background, border, radius and padding from
   rules that come after it, and of two rules that weigh the same the later one wins.
   Reported as the button looking wrong on a company's own address.

   **And the `[hidden]` line is load-bearing, not tidiness.** The attribute hides an
   element through the browser's own `display:none`, which **any** author `display` rule
   outweighs -- so `wrap.hidden = true` left this on screen, blank, for every company
   administrator. `.findwrap` three rules below has carried that line since it was
   written; this was copied from it without it. */
.statejump{position:relative;display:flex;align-items:center}
.statejump[hidden]{display:none}
.statejump-btn{height:36px;max-width:230px;padding:0 12px;border-radius:9px;cursor:pointer;
  font:inherit;font-size:13px;font-weight:600;white-space:nowrap;overflow:hidden;
  text-overflow:ellipsis;border:1px solid var(--navy-2);background:var(--navy-2);color:#fff}
.statejump-btn:hover{background:#1B4268}
.statejump-btn:focus-visible{outline:2px solid var(--mint);outline-offset:1px}
.statejump-box{width:calc(100% - 20px);margin:10px;height:34px;padding:0 10px;font:inherit;
  font-size:13.5px;border:1px solid var(--rule);border-radius:8px;
  background:var(--surface);color:var(--ink)}
.statejump-box:focus{outline:2px solid var(--mint);outline-offset:1px}
.statejump-none{padding:10px 13px;font-size:13px;color:var(--ink-2)}
/* ---------- the Companies tiles are the filter (2.155.0) ----------
   They were seven figures beside a table they described and nothing to do with them. As
   buttons they keep the look a `.tile` already has -- these rules only add what being
   pressable needs -- so the row reads as it did and behaves as the canvas draws it. */
.co-tiles .tile{font:inherit;text-align:left;cursor:pointer;color:inherit;
  transition:border-color .12s, background .12s}
.co-tiles .tile:hover{border-color:var(--navy-2)}
.co-tiles .tile:focus-visible{outline:2px solid var(--mint);outline-offset:1px}
.co-tiles .tile.on{border-color:var(--navy);background:var(--surface-2);
  box-shadow:inset 0 0 0 1px var(--navy)}
/* What was bought, quieter than what is in use: the figure somebody reads is the first
   one, and the bar behind it is the context. */
.num .of{font-size:11.5px;font-weight:600;color:var(--ink-2);white-space:nowrap}
/* **Amber through `--warn-ink`, never `--pers-ink`** -- attention, not a position
   (2.131.0). Over is a thing to know rather than a refusal: only going further over is
   refused (2.148.0). */
td.num.over{color:var(--warn-ink);font-weight:700}
td.num.over .of{color:var(--warn-ink)}
.co-find{margin-left:auto;height:30px;max-width:230px;padding:0 10px;font:inherit;
  font-size:13px;border:1px solid var(--rule);border-radius:8px;
  background:var(--surface);color:var(--ink)}
.co-find:focus{outline:2px solid var(--mint);outline-offset:1px}
.card-f{padding:10px 15px 13px;border-top:1px solid var(--rule-2);line-height:1.5}
/* ---------- a row's own menu, and the action on an attention row (2.156.0) ----------
   `<details>`/`<summary>` rather than a button and held state: the browser closes it on
   Escape and on a click outside, which is three handlers this does not have to own and
   cannot get wrong. The marker is removed because the summary is the dots. */
.co-menu{position:relative;display:inline-block}
.co-menu>summary{list-style:none;cursor:pointer;width:28px;height:28px;border-radius:7px;
  display:flex;align-items:center;justify-content:center;color:var(--ink-2);
  font-size:16px;line-height:1;user-select:none}
.co-menu>summary::-webkit-details-marker{display:none}
.co-menu>summary::marker{content:""}
.co-menu>summary:hover{background:var(--rule-2);color:var(--ink)}
.co-menu>summary:focus-visible{outline:2px solid var(--mint);outline-offset:1px}
.co-menu-b{position:absolute;right:0;top:calc(100% + 4px);z-index:70;min-width:186px;
  background:var(--surface);border:1px solid var(--rule);border-radius:10px;
  box-shadow:0 12px 32px rgba(23,38,47,.22);padding:5px;display:flex;
  flex-direction:column}
.co-menu-i{font:inherit;font-size:13px;text-align:left;padding:7px 9px;border:0;
  border-radius:6px;background:none;color:var(--ink);cursor:pointer;white-space:nowrap}
.co-menu-i:hover{background:var(--surface-2)}
.co-menu-i:focus-visible{outline:2px solid var(--mint);outline-offset:-2px}
.co-menu-i.danger{color:var(--bad)}
.co-row-end{width:36px;text-align:right}
/* The action sits at the end of its row, so the prose beside it keeps the width it had. */
.co-need-act{text-align:right;white-space:nowrap}
/* A line that costs money if it is ignored (2.157.0). Amber through `--warn-ink`, never
   the persuadable violet they once shared (2.131.0): this is attention, not a position. */
.warn-line{padding:9px 11px;border-radius:8px;font-size:13px;line-height:1.5;
  background:var(--warn-bg);border:1px solid var(--warn-rule);color:var(--warn-ink)}
/* The way back to the top, above the results (2.154.1). It stands where the `<select>`
   drew its separator, because the top is a place rather than a search hit -- so it reads
   as part of the panel's frame and not as the first of the answers. */
.statejump-up{padding:0 10px 10px;border-bottom:1px solid var(--rule-2)}
.statejump-upbtn{width:100%;height:34px;padding:0 10px;text-align:left;font:inherit;
  font-size:13.5px;font-weight:600;cursor:pointer;border:1px solid var(--rule);
  border-radius:8px;background:var(--surface-2);color:var(--ink)}
.statejump-upbtn:hover{background:var(--rule-2)}
.statejump-upbtn:focus-visible{outline:2px solid var(--mint);outline-offset:1px}
.findwrap{position:absolute;top:calc(100% + 8px);right:0;width:min(92vw,420px);z-index:80;
  background:var(--surface);border:1px solid var(--rule);border-radius:12px;
  box-shadow:0 14px 40px rgba(23,38,47,.28);overflow:hidden;max-height:calc(70vh / var(--zoom));overflow-y:auto}
.findwrap[hidden]{display:none}
/* The word this panel is. It was set as a caption — ten and a half point,
   uppercase, spaced out, in the palest of the three inks — which is how a
   heading is styled when it is only there for tidiness. It is there to be
   read, so it is set to be read, with what narrows the list kept quieter
   beside it. */
.findhead{margin:0;padding:10px 13px 8px;display:flex;align-items:baseline;gap:8px;
  border-bottom:1px solid var(--rule-2)}
.findhead b{font-size:13.5px;font-weight:700;color:var(--ink);letter-spacing:0}
.findhead span{font-size:12px;color:var(--ink-2)}
.findrow{display:flex;align-items:stretch;border-bottom:1px solid var(--rule-2)}
.findrow:last-child{border-bottom:0}
.findrow:hover,.findrow.on{background:var(--civic-soft)}
.findhit{display:grid;grid-template-columns:auto 1fr auto;gap:2px 10px;flex:1;min-width:0;
  text-align:left;padding:10px 13px;border:0;background:none;cursor:pointer;font-family:inherit}
/* Keeping something is a star that only fills in once it is kept: an outline
   on every row would read as decoration rather than as a control. */
.findkeep{flex:0 0 auto;width:44px;border:0;background:none;cursor:pointer;
  color:var(--rule);font-size:15px;line-height:1;font-family:inherit}
.findkeep:hover{color:var(--ink-3)}
.findkeep.on{color:var(--warn)}
.findkind{grid-row:1 / span 2;align-self:center;font-size:10px;font-weight:700;
  letter-spacing:.04em;text-transform:uppercase;color:var(--ink-3);
  border:1px solid var(--rule);border-radius:5px;padding:2px 6px}
.findname{font-size:13.5px;font-weight:600;color:var(--ink)}
.finddetail{font-size:12px;color:var(--ink-2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* Which state a result is in, at All states. Two Kealohas in two states are
   not the same person, and nothing else on the row would say so. */
.findstate{grid-column:3;grid-row:1 / span 2;align-self:center;white-space:nowrap;
  font-size:11px;font-weight:600;color:var(--civic);background:var(--civic-soft);
  border-radius:20px;padding:3px 9px}

/* ---------- a row of Worth attention ----------
   What it is, what it says, and what can be done about it. The controls will not
   shrink and prose will, so an unwrapped row gives the sentence whatever is left
   -- which on a phone was about one word, reported with the page in front of it
   (2.193.5). The row wraps, and the prose carries a flex-basis wide enough that
   the controls drop to a line of their own **before** a word is squeezed.

   A basis rather than a width query, deliberately: the question is how much room
   this row actually has, which is not the same as which tier the window is. A
   card in the iPad split, a narrow column or a future two-up layout all get the
   right answer without another breakpoint to keep in step. */
.att-row{display:flex;flex-wrap:wrap;gap:10px;align-items:flex-start;
  padding:10px 12px;border:1px solid var(--rule);border-radius:7px}
.att-sev{flex:0 0 auto}
.att-say{flex:1 1 13rem;min-width:0}
/* The controls stay together and wrap as a group; `min-width:0` so a long label
   cannot push the row wider than the card it is in. */
.att-do{flex:0 0 auto;min-width:0;display:flex;flex-wrap:wrap;gap:8px;align-items:center}
.att-do .btn{max-width:100%}

/* Handing a check to somebody, on the row it is about. */
.cf-assign{flex:0 0 auto;font-size:12px;padding:4px 6px;max-width:150px}

/* ---------- the two lists on Today ----------
   What you owe people this week, and what the team logged in the last seven
   days. A line each: what it is, when, and who it is about, with the name a
   way to their page. */
.duelist{display:flex;flex-direction:column}
.duerow{display:flex;gap:12px;align-items:baseline;padding:9px 16px;
  border-bottom:1px solid var(--rule-2);font-size:13.5px}
.duerow:last-child{border-bottom:0}
.duewhat{flex:1 1 auto;min-width:0;text-align:left;background:none;border:0;padding:0;
  font:inherit;color:var(--ink);cursor:pointer;overflow:hidden;text-overflow:ellipsis;
  white-space:nowrap}
.duewhat:hover{color:var(--civic);text-decoration:underline}
.duenote{color:var(--ink-2)}
.duewhen{flex:0 0 auto;font-size:12px;color:var(--ink-2);font-variant-numeric:tabular-nums}
.duewhen.late{color:var(--bad);font-weight:600}
.duewho{flex:0 0 auto;background:none;border:0;padding:0;font:inherit;font-size:12.5px;
  font-weight:600;color:var(--civic);cursor:pointer}
.duewho:hover{text-decoration:underline}
.duewho.flat{color:var(--ink-2);font-weight:400}
@media (max-width:700px){
  .duerow{flex-wrap:wrap;gap:4px 10px}
  .duewhat{flex:1 1 100%}
}

/* ---------- what you owe people, on a phone ----------
   A card each, with the one thing anybody does to a follow-up standing up on
   the right of it and sized to be hit with a thumb. The desk list, two
   dropdowns and three buttons across a line, is untouched and a tap away on a
   computer. */
.tm .tm-tabs{margin:0 0 10px}
.tm-card{display:flex;gap:12px;align-items:stretch;background:var(--surface);
  border:1px solid var(--rule);border-radius:12px;margin-bottom:9px;overflow:hidden}
.tm-card.done{opacity:.6}
.tm-card.done .tm-body b{text-decoration:line-through}
.tm-body{flex:1 1 auto;min-width:0;padding:11px 13px;font-size:14.5px;line-height:1.35}
.tm-body b{display:block;font-weight:600;color:var(--ink)}
.tm-meta{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-top:7px;font-size:12px}
.tm-when{color:var(--ink-2)}
.tm-late{color:var(--bad);font-weight:600}
.tm-about{margin-top:7px;font-size:13px}
/* The name of whoever it is about is the way to their page: the next question
   after "what do I owe them" is "what do I know about them". */
.tm-who{background:none;border:0;padding:0;font:inherit;font-weight:600;
  color:var(--civic);text-decoration:underline;text-underline-offset:2px;cursor:pointer}
.tm-who.flat{color:var(--ink-2);text-decoration:none;font-weight:400}
.tm-done,.tm-go{flex:0 0 96px;display:flex;flex-direction:column;align-items:center;
  justify-content:center;gap:5px;border:0;border-left:1px solid var(--rule-2);
  background:var(--surface-2);color:var(--ink-2);font-family:inherit;font-size:11.5px;
  font-weight:600;cursor:pointer;padding:8px 6px}
.tm-done:hover,.tm-go:hover{background:var(--civic-soft);color:var(--civic)}
.tm-done.on{background:var(--sup);color:var(--navy);border-left-color:var(--sup)}
.tm-check{width:22px;height:22px;border-radius:50%;border:2px solid currentColor;
  position:relative;flex:0 0 auto}
.tm-done.on .tm-check::after{content:'';position:absolute;left:6px;top:2px;width:6px;height:11px;
  border:solid currentColor;border-width:0 2px 2px 0;transform:rotate(45deg)}
.tm-head{margin:18px 0 8px;font-size:12px;font-weight:700;letter-spacing:.05em;
  text-transform:uppercase;color:var(--ink-3)}
.tm-more{display:block;width:100%;margin-top:6px;padding:11px;border:1px solid var(--rule);
  border-radius:10px;background:var(--surface);color:var(--ink-2);font-family:inherit;
  font-size:13px;cursor:pointer}

/* ---------- a property's note, on a line of its own ----------
   It used to sit under the name, in the narrowest column on the page, so a
   sentence about a property came out three words at a time. It reaches the
   width of the table now, tucked under the row it belongs to: no top border,
   so the two read as one thing. */
tr.has-note > td{border-bottom:0}
.prop-note > td{padding:0 11px 10px;font-size:12.5px;line-height:1.5;color:var(--ink-2)}

/* Where a result landed. A milestone and a property have no page of their own,
   so the page they live on is opened and the row is held under the eye for a
   moment. It fades of its own accord: a mark that stays is a mark to clear. */
@keyframes findlanded{
  from{background:var(--civic-soft);box-shadow:inset 3px 0 0 var(--civic)}
  to{background:transparent;box-shadow:inset 3px 0 0 transparent}
}
.landed{animation:findlanded 2.4s ease-out}
@media (prefers-reduced-motion:reduce){ .landed{animation-duration:0s;background:var(--civic-soft)} }

/* On a phone the bar is full, so the box is a magnifier until it is wanted. */
@media (max-width:820px), (orientation:landscape) and (max-height:540px){
  .find{flex:0 0 auto;margin-left:0}
  .findbox{display:none}
  .findbtn{display:inline-flex;align-items:center;justify-content:center;
    width:40px;height:40px;border:0;background:transparent;color:#fff;font-size:19px;
    cursor:pointer;font-family:inherit}
  body.finding .findbox{display:block;position:fixed;left:12px;right:12px;
    top:calc(8px + env(safe-area-inset-top, 0px));width:auto;z-index:90;height:44px;
    background:var(--surface);color:var(--ink);border-color:var(--rule)}
  body.finding .findbox::placeholder{color:var(--ink-3)}
  body.finding .findwrap{position:fixed;left:12px;right:12px;width:auto;
    top:calc(60px + env(safe-area-inset-top, 0px))}
}

/* ---------- choosing people ----------
   Chips rather than a dropdown: three people out of a select means opening it
   three times, and on a phone a multi-select is a scroll wheel. Forty-four
   points tall, because that is a finger. */
.pick{display:flex;flex-direction:column;gap:8px}
.pfind{width:100%}
.pchips{display:flex;flex-wrap:wrap;gap:8px}
.pchip{display:inline-flex;align-items:center;gap:6px;min-height:44px;padding:8px 14px;
  border:1px solid var(--rule);border-radius:22px;background:var(--surface);
  color:var(--ink);font-size:13.5px;font-weight:600;cursor:pointer;font-family:inherit}
.pchip:hover{border-color:var(--civic)}
.pchip[aria-pressed="true"]{background:var(--civic);border-color:var(--civic);color:#fff}
.pchip[hidden]{display:none}
.pyou,.pno{font-size:11px;font-weight:600;opacity:.75;text-transform:uppercase;letter-spacing:.04em}
.pchip[aria-pressed="true"] .pyou,.pchip[aria-pressed="true"] .pno{opacity:.85}

/* ---------- meetings, one line each ---------- */
.mtglist{border-top:1px solid var(--rule-2)}
.mtg{border-bottom:1px solid var(--rule-2)}
.mtg-h{display:flex;align-items:center;gap:10px;width:100%;text-align:left;background:none;
  border:0;padding:11px 16px;cursor:pointer;font-size:13px;color:var(--ink)}
.mtg-h:hover{background:var(--surface-2)}
.mtg-h .chev{width:7px;height:7px;flex:0 0 7px;border-right:2px solid var(--ink-3);
  border-bottom:2px solid var(--ink-3);transform:rotate(-45deg);transition:transform .15s}
.mtg.open .mtg-h .chev{transform:rotate(45deg)}
.mtg-d{flex:0 0 74px;color:var(--ink-2)}
.mtg-n{flex:1 1 auto;min-width:0;font-weight:600;overflow:hidden;text-overflow:ellipsis;
  white-space:nowrap}
.mtg-t,.mtg-s{flex:0 0 auto;color:var(--ink-2);font-size:12px}
.mtg-p{flex:0 0 auto}
.mtg-o{flex:0 0 96px;color:var(--ink-2);font-size:12px;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
.mtg-b{display:none;padding:2px 16px 16px 33px}
.mtg.open .mtg-b{display:block}
@media (max-width:1180px){
  /* Narrow enough that something has to go. Type and status are the first to
     drop: the position is the thing being scanned for, and who is carrying it
     is how the work gets divided up. */
  .mtg-t,.mtg-s{display:none}
}
@media (max-width:820px){
  .mtg-o{display:none}
  .mtg-b{padding-left:16px}
}

/* ---------- the seat tooltip ----------
   The browser's own tooltip takes about a second to appear, which is too slow
   for scanning a floor of 76 seats. [hidden] is restored explicitly, because
   setting display here would otherwise beat the browser's own rule for it. */
.seattip{position:fixed;z-index:80;pointer-events:none;
  background:var(--ink);color:#fff;border-radius:7px;padding:6px 9px;
  font-size:12px;line-height:1.35;white-space:nowrap;
  box-shadow:0 6px 18px rgba(23,38,47,.35)}
.seattip[hidden]{display:none}
.seattip b{display:block;font-weight:600}
.seattip span{opacity:.78;font-size:11px}

/* ---------- grouped settings ---------- */
/* A row of pills on its own reads as decoration, so the bar says what it is,
   sits on its own surface and is ruled off from the page below it. */
.jumpbar{display:flex;gap:10px;align-items:center;position:sticky;
  /* Below the top bar, measured rather than guessed. A fixed offset was wrong
     at every width: zero on a tablet, where the bar slid under the header and
     vanished on scroll, and too large on a phone, where it left a gap. */
  top:var(--topbar-h, 0px);z-index:15;
  background:var(--surface);border:1px solid var(--rule);border-bottom-width:2px;
  border-radius:9px;padding:9px 12px;margin-bottom:18px;
  box-shadow:0 2px 10px -6px rgba(23,38,47,.35)}
.jump-lab{flex:0 0 auto;font-size:11px;font-weight:700;letter-spacing:.07em;
  text-transform:uppercase;color:var(--ink-3)}
.jump-items{display:flex;gap:6px;flex:1 1 auto;min-width:0;overflow-x:auto;
  scrollbar-width:none}
.jump-items::-webkit-scrollbar{display:none}
.jump{background:var(--surface-2);border:1px solid var(--rule);border-radius:99px;
  padding:6px 13px;font-size:12.5px;font-weight:600;color:var(--ink-2);cursor:pointer;
  white-space:nowrap}
.jump:hover{border-color:var(--civic);color:var(--civic)}
.jump[aria-current="true"]{background:var(--civic);border-color:var(--civic);color:#fff}
.grp-up{text-align:right;margin:-6px 0 4px}
.grp-up button{font-size:12px;color:var(--ink-3)}
.grp{scroll-margin-top:calc(var(--topbar-h, 0px) + 56px);margin-bottom:26px}
.grp-h{font-family:inherit;font-size:21px;font-weight:700;
  margin:0 0 10px;padding-bottom:7px;border-bottom:2px solid var(--rule)}
.grp-h span{display:block;font-family:inherit;font-size:12px;font-weight:400;
  color:var(--ink-3);margin-top:3px}
@media (max-width:820px){
  /* Scrollable rather than wrapped to four lines on a phone. */
  .jumpbar{padding:8px 10px;gap:8px}
  /* The label costs a third of a narrow screen, and the bar is obviously a
     menu once it is the only thing pinned to the top. */
  .jump-lab{display:none}
}

/* Sits in the top bar on every page, because a notice you only see by
   visiting one particular page is one you can miss entirely. */
.mentbtn{flex:0 0 auto;min-width:30px;height:30px;padding:0 9px;border-radius:99px;
  border:1px solid var(--civic);background:var(--civic);color:#fff;font-weight:700;
  font-size:13px;cursor:pointer;line-height:1;
  font-family:inherit;}
.mentbtn[hidden]{display:none}
.mentbtn:hover{filter:brightness(1.1)}
.mentbtn::before{content:"\2709";margin-right:5px;font-weight:400}
@media (hover:none){
  .mentbtn{height:40px;min-width:40px;font-size:15px}
}

/* A result that can be opened says so, and behaves like the rest of the app. */
.qrow{cursor:pointer}
.qrow:hover td{background:var(--civic-soft)}

/* On a narrow bar the word Refresh competes with the project chooser, the
   count of what is waiting and the help button, and it is the least of them:
   the page already keeps itself current over the live connection. Shown as the
/* ---------- the page's own buttons on a narrow screen ----------
   Shown as a symbol each, so the header stays one line however many a page
   offers. Wrapping them onto a second row was tried and looked a mess: the
   header changed height from page to page and the eye had nowhere steady to
   rest.

   The symbol is put on the button when the page is drawn, and the words stay
   on it for a screen reader and for anybody who holds it. */
/* A phone on its side is 844 points across and so falls outside any test made
   on width alone — which is how it ended up with the desktop bar: buttons in
   full words, stacked, above a chooser taking a third of the screen. What
   marks it out is the height, the same test the rest of the layout uses. */
@media (max-width:820px), (orientation:landscape) and (max-height:540px){
  /* One line, in this order: menu, title, what the page offers, which project,
     help. Everything on it is sized so the whole lot fits at 390 points, which
     is the narrowest phone anybody is using.

     The buttons are drawn as bare symbols on the blue rather than as white
     boxes: a row of tiles reads as clutter, and the bar is a place to glance
     at, not a toolbar. */
  .topbar-actions{flex-wrap:nowrap; gap:2px; margin-left:auto; flex:0 0 auto}
  .topbar-actions .btn[data-icon]{
    font-size:0; width:34px; min-width:34px; height:34px; padding:0;
    display:inline-flex; align-items:center; justify-content:center;
    background:transparent; border:0; color:#fff; box-shadow:none;
    flex:0 0 auto; border-radius:8px
  }
  .topbar-actions .btn[data-icon]:active{ background:rgba(255,255,255,.18) }
  .topbar-actions .btn[data-icon]::before{
    content:attr(data-icon); font-size:19px; line-height:1; font-weight:400
  }
  /* Whatever the page is for comes first, so it is never the one squeezed
     off the end. */
  .topbar-actions .btn.primary{order:-1}

  /* The crumb was the first casualty of a narrow bar: it arrived already
     shortened to Live whip … which tells nobody anything. The title alone,
     on one line. */
  .topbar .crumb{display:none}
  .topbar-title{flex:1 1 auto; min-width:0}
  .topbar h1{font-size:17px; line-height:1.2; white-space:nowrap;
    overflow:hidden; text-overflow:ellipsis}

  /* The project chooser comes off the bar and goes in the menu. It was taking
     a quarter of the width, which had to come from either the title or the
     size of everything somebody taps — and shrinking the things people tap is
     the wrong way to pay for it. Changing project is not something anybody
     does mid-sentence; which project they are in is on the line under the
     name, where it always was. */
  .projsel{display:none}
  /* **And the jump box with it (2.154.1).** 2.153.0 wrote down that there is no jump box
     at this tier and nothing made it so: the markup is in the shell unconditionally, so a
     platform account got a 230 px button in the bar the chooser had just been taken out
     of -- for the width reason stated above, which does not care which control is
     spending it. A platform account's way to another company on a phone is the drawer's
     own chooser, which carries the parent; what the platform's navigation should look
     like at this size is still its own question. */
  .statejump{display:none}
  .topbar-actions .btn[data-icon]{width:40px; min-width:40px; height:40px}
  .mentbtn{height:40px; min-width:40px}
  .helpbtn{width:40px; height:40px; flex:0 0 auto}
}

/* ---------- reading and tapping on a phone ----------
   iOS zooms the whole page when a form control smaller than 16px is tapped,
   and then leaves it zoomed. Every dropdown in this app was 11.5 or 12px, so
   choosing a project or a status threw the layout about every time. Sixteen is
   the threshold, not a preference.

   Applied by whether the screen is touched rather than by width, because a
   tablet does it too. */
@media (hover:none){
  input, select, textarea, button.lname,
  .field input, .field select, .field textarea{ font-size:16px }
  /* Which leaves the controls taller, so the things around them keep pace. */
  select{ padding:6px 8px }
}

/* Nothing on a phone smaller than this. Ten and a half point type is fine on a
   desktop a foot away and not on a handset at arm's length. */
@media (max-width:700px){
  .hint, .note, .cm-when, .msg-when, .todo-s, .mini, .pill.sm{ font-size:12.5px }
  .rail-conf, .tl{ font-size:11.5px }
}

/* Anything placed in the page keeps inside it. There are no images today; this
   is so the first one somebody adds cannot push the layout sideways on a
   phone, which is not the sort of thing anybody thinks to check. */
img, svg, video, canvas{ max-width:100%; height:auto }

/* ---------- the actions on a row ----------
   Four plain words in a line read as one run-on phrase, and the one that
   cannot be undone looked exactly like the one that can. Each is a small
   outlined control now, and the two that take something away are marked: the
   reversible one quietly, the permanent one plainly.

   Ordered as they are drawn, which is roughly least to most consequential. */
.rowbtn{display:inline-flex;align-items:center;gap:5px;font-size:12px;
  font-weight:600;line-height:1;padding:5px 9px;border-radius:6px;cursor:pointer;
  border:1px solid var(--rule);background:#fff;color:var(--ink);
  white-space:nowrap}
.rowbtn + .rowbtn{margin-left:5px}
.rowbtn:hover{background:var(--wash);border-color:var(--rule-2)}
.rowbtn::before{font-weight:400;opacity:.75}

/* What it does, said with a mark as well as a word, so the row can be read at
   a glance rather than word by word. */
.rowbtn.edit::before{content:"\270E"}
.rowbtn.access::before{content:"\1F511"; font-size:11px}
.rowbtn.archive::before{content:"\1F4E5"; font-size:11px}
.rowbtn.remove::before{content:"\2715"}

/* Putting away is reversible and reads as ordinary. Removing is not. */
.rowbtn.archive{color:var(--muted)}
.rowbtn.remove{color:var(--opp);border-color:rgba(190,74,74,.4)}
.rowbtn.remove:hover{background:rgba(190,74,74,.08);border-color:var(--opp)}

@media (hover:none){ .rowbtn{padding:8px 11px;font-size:13px} }

/* A small facts table, for showing what a setting actually resolved to. */
.mini{width:100%;border-collapse:collapse;font-size:12.5px}
.mini td{padding:4px 10px 4px 0;border-bottom:1px solid var(--rule-2);vertical-align:top}
.mini tr:last-child td{border-bottom:0}

/* The project this tab is looking at. Sits in the bar because it is the one
   thing a person needs to be sure of before reading anything else on screen. */
/* A solid pill with dark text. It was white text on a barely-there background,
   which a browser draws using the platform's own control colors — so it read
   as an empty space until it was clicked. */
/* The ring: a white pill on a blue bar had a half-white border, which on
   white is no border at all, so nothing said it was something to press. A
   solid white ring stands a little off the pill, with the bar's own blue
   showing between, which reads as a control at a glance. */
.projsel{flex:0 0 auto;max-width:190px;height:30px;padding:0 26px 0 10px;
  border-radius:99px;border:1px solid #fff;background:#fff;
  box-shadow:0 0 0 2px var(--boyd),0 0 0 4px rgba(255,255,255,.95);
  margin:0 4px;
  color:var(--ink);font-size:12.5px;font-weight:600;cursor:pointer;
  appearance:none;-webkit-appearance:none;
  background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8'%3E%3Cpath fill='%2317262F' d='M1 1l5 5 5-5'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 9px center;
  background-size:10px}
.projsel:hover{box-shadow:0 0 0 2px var(--boyd),0 0 0 4px #fff,0 0 0 7px rgba(255,255,255,.28)}
.projsel:focus-visible{outline:none;box-shadow:0 0 0 2px var(--boyd),0 0 0 5px #FFD66B}
.projsel[hidden]{display:none}
.projsel option{color:var(--ink);background:#fff}
@media (hover:none){ .projsel{height:40px} }

/* Renaming a panel in place, in the layout table. */
.dash-name{width:100%;max-width:240px;font-size:13px;padding:4px 7px;
  border:1px solid var(--rule);border-radius:5px;font-weight:600}

/* ---------- the to do list ---------- */
.todolist{display:flex;flex-direction:column}
.todo{display:flex;gap:12px;align-items:flex-start;padding:11px 16px;
  border-bottom:1px solid var(--rule-2)}
.todo:last-child{border-bottom:0}
.todo.done{opacity:.55}
.todo.done b{text-decoration:line-through}
.todo-m{flex:1 1 auto;min-width:0;font-size:13.5px}
.todo-s{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-top:4px;
  font-size:11.5px}
.todo-a{flex:0 0 auto;display:flex;gap:6px;align-items:center;flex-wrap:wrap}
.todo-a select{font-size:12px;padding:4px 6px}
.overdue{color:var(--danger,#B3261E);font-weight:600}
@media (max-width:700px){
  .todo{flex-direction:column;gap:8px}
  .todo-a{width:100%}
  .todo-a select{flex:1 1 auto}
}

/* ---------- messages ---------- */
.msglist{display:flex;flex-direction:column}
.msg-row{display:flex;align-items:flex-start;border-bottom:1px solid var(--rule-2)}
.msg-row:last-child{border-bottom:0}
.msg-row:hover{background:var(--surface-2)}
.msg-row.unread{background:var(--civic-soft)}
.msg-row.unread:hover{filter:brightness(.98)}
.msg{display:block;flex:1 1 auto;min-width:0;text-align:left;background:none;border:0;
  padding:12px 16px;cursor:pointer;color:var(--ink)}
.msg-del{flex:0 0 auto;align-self:center;padding:8px 14px;font-size:12px;
  color:var(--ink-3)}
.msg-del:hover{color:var(--danger,#B3261E)}
.msg-w{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:13px}
.msg-when{color:var(--ink-3);font-size:11.5px;margin-left:auto}
.msg-on{display:block;font-size:12.5px;color:var(--ink-2);margin-top:2px}
.msg-x{display:block;font-size:13px;color:var(--ink-2);margin-top:4px;
  overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}

/* ---------- comments ---------- */
.cmlist{display:flex;flex-direction:column;gap:2px;margin-bottom:14px}
.cm{padding:10px 0;border-bottom:1px solid var(--rule-2)}
.cm:last-child{border-bottom:0}
.cm-h{display:flex;align-items:baseline;gap:9px;font-size:13px;margin-bottom:3px}
.cm-when{color:var(--ink-3);font-size:11.5px}
.cm-act{font-size:11.5px;color:var(--ink-3);font-weight:500}
.cm-act:hover{color:var(--civic)}
.cm-b{font-size:13.5px;line-height:1.55;white-space:pre-wrap}
/* A long address breaks anywhere rather than pushing the thread sideways. */
.cm-link{color:var(--civic-ink);text-decoration:underline;text-underline-offset:2px;
  overflow-wrap:anywhere}
.cm-link:hover{color:var(--civic)}

/* ---------- the calendar (2.138.0) ----------
   Four groups, a color each, none of them a whip color: the legislature's hearings in blue,
   the floor in teal, the session's own dates in navy, the team's events in green. Tentative is
   a dashed edge and canceled a line through, so neither leans on color alone. */
:root{
  --cal-hear:#2563EB; --cal-hear-bg:#EAF1FE; --cal-hear-ink:#1D4ED8;
  --cal-floor:#0F766E; --cal-floor-bg:#E6F6F4; --cal-floor-ink:#0F766E;
  --cal-sess:#0F2D4A; --cal-sess-bg:#EAF0F6; --cal-sess-ink:#0F2D4A;
  --cal-ev:#15803D; --cal-ev-bg:#E8F8EE; --cal-ev-ink:#166534;
}
.cal-bar{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}
.cal-nav{display:flex;align-items:center;gap:8px}
.cal-month{margin:0 6px;font-size:18px;min-width:170px;text-align:center}
.cal-views{display:flex;gap:0}
.cal-views .btn{border-radius:0}
.cal-views .btn:first-child{border-radius:8px 0 0 8px}
.cal-views .btn:last-child{border-radius:0 8px 8px 0;margin-left:-1px}
.cal-views .btn.on{background:var(--navy);color:#fff;border-color:var(--navy)}
.cal-filters{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-top:12px}
.cal-filter{cursor:pointer;border:1px solid var(--rule);background:#fff;color:var(--ink-3);
  font:inherit;font-size:12px;font-weight:600}
.cal-filter.on.cal-hearings{background:var(--cal-hear-bg);color:var(--cal-hear-ink);border-color:var(--cal-hear)}
.cal-filter.on.cal-floor{background:var(--cal-floor-bg);color:var(--cal-floor-ink);border-color:var(--cal-floor)}
.cal-filter.on.cal-session{background:var(--cal-sess-bg);color:var(--cal-sess-ink);border-color:var(--cal-sess)}
.cal-filter.on.cal-events{background:var(--cal-ev-bg);color:var(--cal-ev-ink);border-color:var(--cal-ev)}
.cal-grid{display:grid;grid-template-columns:repeat(7, minmax(0, 1fr));border-top:1px solid var(--rule-2);
  border-left:1px solid var(--rule-2)}
.cal-dow{font-size:11px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-3);
  padding:7px 8px;border-right:1px solid var(--rule-2);border-bottom:1px solid var(--rule-2);background:var(--surface-2)}
.cal-day{min-height:108px;padding:5px 5px 6px;border-right:1px solid var(--rule-2);
  border-bottom:1px solid var(--rule-2);display:flex;flex-direction:column;gap:3px;min-width:0}
.cal-day.out{background:var(--surface-2)}
.cal-day.out .cal-dn{color:#A3AEBB}
.cal-day.addable{cursor:copy}
.cal-dn{font-size:12px;font-weight:600;color:var(--ink-2);align-self:flex-end;min-width:22px;height:22px;
  line-height:22px;text-align:center;border-radius:50%}
.cal-day.today .cal-dn{background:var(--navy);color:#fff}
.cal-ev{display:flex;flex-wrap:wrap;align-items:baseline;gap:0 5px;width:100%;text-align:left;cursor:pointer;
  font:inherit;font-size:11.5px;line-height:1.3;padding:3px 6px;border-radius:5px;border:1px solid transparent;
  border-left-width:3px;min-width:0}
.cal-ev .cal-t{font-weight:700}
.cal-ev .cal-n{font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;flex:1 1 60%}
.cal-ev .cal-b,.cal-ev .cal-st{font-size:10.5px;opacity:.85}
.cal-ev.cal-hearings{background:var(--cal-hear-bg);color:var(--cal-hear-ink);border-color:var(--cal-hear-bg);border-left-color:var(--cal-hear)}
.cal-ev.cal-floor{background:var(--cal-floor-bg);color:var(--cal-floor-ink);border-color:var(--cal-floor-bg);border-left-color:var(--cal-floor)}
.cal-ev.cal-session{background:var(--cal-sess-bg);color:var(--cal-sess-ink);border-color:var(--cal-sess-bg);border-left-color:var(--cal-sess)}
.cal-ev.cal-events{background:var(--cal-ev-bg);color:var(--cal-ev-ink);border-color:var(--cal-ev-bg);border-left-color:var(--cal-ev)}
.cal-ev.tentative{border-style:dashed;border-color:currentColor;background:#fff}
.cal-ev.canceled,.cal-arow.canceled{opacity:.6}
.cal-ev.canceled .cal-n,.cal-arow.canceled b{text-decoration:line-through}
.cal-more{font:inherit;font-size:11px;font-weight:600;color:var(--civic-ink);background:none;border:0;
  padding:1px 4px;text-align:left;cursor:pointer}
.cal-agenda{display:flex;flex-direction:column;gap:18px}
.cal-aday h3{margin:0 0 8px;font-size:14px;color:var(--ink)}
.cal-aday.today h3{color:var(--navy)}
.cal-arow{display:flex;align-items:center;gap:12px;width:100%;text-align:left;cursor:pointer;font:inherit;
  background:#fff;border:1px solid var(--rule-2);border-left:4px solid var(--rule);border-radius:8px;
  padding:9px 12px;margin-bottom:6px}
.cal-arow:hover{border-color:var(--rule);background:var(--surface-2)}
.cal-arow.cal-hearings{border-left-color:var(--cal-hear)}
.cal-arow.cal-floor{border-left-color:var(--cal-floor)}
.cal-arow.cal-session{border-left-color:var(--cal-sess)}
.cal-arow.cal-events{border-left-color:var(--cal-ev)}
.cal-at{flex:0 0 118px;font-size:12.5px;font-weight:700;color:var(--ink-2)}
.cal-aw{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
.cal-am{font-size:12px;color:var(--ink-3)}
.cal-sp.tentative{background:var(--warn-bg);color:var(--warn-ink);border:1px dashed var(--warn)}
.cal-sp.confirmed{background:#E8F8EE;color:var(--sup-ink)}
.cal-sp.canceled{background:#FDECEC;color:var(--opp-ink)}
.cal-facts{display:grid;grid-template-columns:auto 1fr;gap:5px 14px;margin:0}
.cal-facts dt{font-size:12px;color:var(--ink-3);font-weight:600}
.cal-facts dd{margin:0;font-size:13.5px}
.cal-bills{margin:0;padding-left:18px;font-size:13px;line-height:1.7}
.cal-notes{margin:0;white-space:pre-wrap;font-size:13px}
.ce-bills{max-height:190px;overflow:auto;border:1px solid var(--rule-2);border-radius:8px;padding:6px 8px;
  margin-top:6px;display:flex;flex-direction:column;gap:2px}
.ce-bill{font-size:12.5px;display:block;padding:2px 0;cursor:pointer}
.ce-bill[hidden]{display:none}
.bill-hear{font-size:13px;line-height:1.8}
@media (max-width:700px){
  .cal-at{flex-basis:84px}
  .cal-month{min-width:0;font-size:16px}
}
.cm-at{background:var(--civic-soft);color:var(--civic);border-radius:4px;padding:0 3px;
  font-weight:600}
/* Replies sit under what they answer, one level only. */
.cm-replies{margin:8px 0 0 0;padding-left:14px;border-left:2px solid var(--rule)}
.cm-reply{padding:8px 0;border-bottom:0}
.cm-replybox{margin-top:8px}
.cm-replybox[hidden]{display:none}
.cm-replybox textarea{width:100%}
/* The one somebody was brought here to read, marked long enough to find it and
   no longer. */
.cm-lit{background:var(--civic-soft);border-radius:8px;
  box-shadow:0 0 0 8px var(--civic-soft);
  transition:background .3s ease,box-shadow .3s ease}
#comments-card{scroll-margin-top:calc(var(--topbar-h, 0px) + 16px)}
/* Inside a meeting row the thread is part of that row, not a card floating on
   top of one. */
.mtg-b #comments-card{margin:14px 0 0;border-radius:8px;box-shadow:none;
  border:1px solid var(--rule)}
.cm{scroll-margin-top:calc(var(--topbar-h, 0px) + 24px)}
.cm-new{position:relative}
.cm-new textarea{width:100%}
.cm-suggest{position:absolute;left:0;right:0;z-index:30;background:var(--surface);
  border:1px solid var(--rule);border-radius:8px;box-shadow:var(--shadow);overflow:hidden}
.cm-suggest[hidden]{display:none}
.cm-sug{display:block;width:100%;text-align:left;background:none;border:0;padding:9px 12px;
  font-size:13px;cursor:pointer;color:var(--ink)}
.cm-sug:hover,.cm-sug.on{background:var(--civic-soft);color:var(--civic)}

/* what is waiting at sign in */
.mentions{border:1px solid var(--civic);border-radius:9px;background:var(--civic-soft);
  padding:12px 14px;margin-bottom:16px}
.mentions h2{font-size:15px;margin-bottom:6px}
.mention-row{display:flex;gap:10px;align-items:baseline;padding:6px 0;font-size:13px;
  border-top:1px solid rgba(27,77,137,.15)}
.mention-row:first-of-type{border-top:0}
.mention-row .who{font-weight:600;flex:0 0 auto}
.mention-row .what{flex:1 1 auto;min-width:0;color:var(--ink-2)}

/* ---------- capability checkboxes ---------- */
.caps{max-height:calc(46vh / var(--zoom));overflow-y:auto;border:1px solid var(--rule);border-radius:8px;padding:4px 12px}
.capgroup{border:0;margin:12px 0;padding:0}
.capgroup legend{font-size:11px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;
  color:var(--ink-3);padding:0}
.capline{display:flex;gap:9px;align-items:flex-start;padding:6px 0;cursor:pointer}
.capline input{margin-top:2px;flex:0 0 auto}
/* A folding section sitting inside another one. Indented and squared off so it
   reads as part of its parent rather than as a card that has drifted. */
.nested{padding:0 16px 16px}
.nested > .card{margin:0;border-radius:8px;box-shadow:none;border:1px solid var(--rule)}
/* Present to a screen reader, absent to the eye. */
.vh{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;
  clip:rect(0 0 0 0);white-space:nowrap;border:0}
.capname{display:block;font-size:13px}
.caphint{display:block;font-size:11.5px;color:var(--ink-3);margin-top:1px}

.menubtn{display:none;flex-direction:column;justify-content:center;gap:4px;
  width:34px;height:34px;padding:0 4px;flex:0 0 auto;
  background:transparent;border:0;border-radius:6px;cursor:pointer}
.menubtn span{display:block;height:3px;width:100%;background:var(--ink);border-radius:1px}
.menubtn:active{background:rgba(255,255,255,.18)}
.drawer-scrim{position:fixed;inset:0;background:rgba(23,38,47,.45);z-index:70}
/* The panel carries the same blue as the header it opens from, so the two
   read as one piece of furniture rather than two different bars. */
.drawer{position:fixed;top:0;bottom:0;left:0;width:min(82vw,300px);z-index:71;
  background:var(--boyd);color:var(--boyd-ink);display:flex;flex-direction:column;
  box-shadow:2px 0 18px rgba(23,38,47,.35);overflow-y:auto;
  padding-bottom:env(safe-area-inset-bottom)}
/* An author rule beats the browser's own [hidden]{display:none}, so setting
   display above would otherwise leave the drawer on screen permanently with
   nothing able to close it. Both are needed: the attribute for assistive
   technology, this rule to actually hide it. */
.drawer[hidden],.drawer-scrim[hidden]{display:none}
.drawer-h{display:flex;align-items:flex-start;justify-content:space-between;gap:10px;
  padding:16px 14px 12px;border-bottom:1px solid rgba(255,255,255,.14)}
/* The drawer sits on a dark panel, so a control left to the browser's own
   colors reads as white on white until it is touched. Told explicitly. */
/* Who is signed in, in the menu. Built rather than copied out of the sidebar,
   which ran the name, the role and a button label together as one string. */
.drawer-who{display:flex;align-items:center;gap:8px;flex-wrap:wrap;
  margin-bottom:12px;color:#DCE5EA;font-size:13px}
.drawer-who .badge{background:rgba(255,255,255,.16);color:#fff;border-radius:99px;
  padding:2px 9px;font-size:11px;font-weight:600}
/* The project in the phone menu. Its edge was a sixth of white on near
   black: a box nobody could see was a box. A solid ring, the height a thumb
   wants, and an arrow that says it opens. */
.drawer-foot select{background-color:#22333E;border:2px solid rgba(255,255,255,.85);
  color:#fff;font-weight:600;font-size:14px;border-radius:10px;height:44px;
  padding:0 34px 0 12px;width:100%;margin-top:4px;appearance:none;-webkit-appearance:none;
  background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8'%3E%3Cpath fill='%23FFFFFF' d='M1 1l5 5 5-5' stroke='%23FFFFFF' stroke-width='1.6' fill-opacity='0'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 12px center;background-size:12px}
.drawer-foot select:focus-visible{outline:none;border-color:#FFD66B;box-shadow:0 0 0 2px rgba(255,214,107,.35)}
.drawer-foot label{display:block;color:#8CA2AE}
.drawer-mark{font-family:inherit;font-size:24px;line-height:1;font-weight:700;color:#fff}
.drawer-sub{font-size:11.5px;color:rgba(255,255,255,.7);margin-top:4px;line-height:1.4}
.drawer .x{background:transparent;border:0;color:#fff;font-size:26px;line-height:1;
  cursor:pointer;padding:0 4px}
.drawer-nav{padding:8px 0;flex:1}
.drawer-nav .navitem{display:flex;width:100%;justify-content:space-between;align-items:center;
  flex-direction:row;border-radius:0;padding:12px 16px;font-size:14px;min-width:0;
  text-align:left;gap:10px}
/* The current page was marked with a --civic bar, which is the same blue the
   panel is now painted in and so could not be seen. */
.drawer-nav .navitem[aria-current="page"]{background:rgba(255,255,255,.14);color:#fff;
  box-shadow:inset 3px 0 0 #fff}
.drawer-nav .navitem{color:rgba(255,255,255,.86)}
.drawer-nav .navitem:hover{background:rgba(255,255,255,.10);color:#fff}
.drawer-nav .navitem .ct{margin-left:0;font-size:11.5px;color:rgba(255,255,255,.72)}
/* The same symbols as the bar along the bottom, so a page is the same thing
   in both places. */
.drawer-nav .navitem .nl{flex:1 1 auto}
.drawer-nav .navicon{width:19px;height:19px;flex:0 0 19px}
.drawer-foot{padding:12px 16px calc(16px + env(safe-area-inset-bottom));
  border-top:1px solid rgba(255,255,255,.14);font-size:12px}
.drawer-foot select{width:100%;margin-top:5px}
.drawer-foot label{font-size:11.5px;opacity:1;color:rgba(255,255,255,.82);font-weight:600;
  letter-spacing:.04em;text-transform:uppercase}

/* ---------- tablets held upright ----------
   744 to 1024 across and taller than they are wide. The sidebar comes off and
   **the menu is a slim rail of its own (2.198.0)** rather than behind the button. It had
   gone behind it because "a permanent column costs a fifth of the width on a mini" -- true
   of the 264 a laptop gets, and the answer to it is a narrower column rather than no column:
   104 is an eighth of a mini and a ninth of a Pro 11, and navigation stays in view, which is
   what a tablet app does. The button is gone from the top bar with it; what the drawer
   carried that the rail's foot has no room for is one tap away at the foot of the rail.

   No bottom bar either, because vertical space is the one thing a tablet upright has plenty
   of and a fixed bar just eats into it. */
@media (min-width:701px) and (max-width:1194px) and (orientation:portrait){
  :root{--rail:104px}
  .page{padding:20px 22px 40px}
  .cols3{grid-template-columns:1fr 1fr}
  .floor{grid-template-columns:1fr}
  .tiles{grid-template-columns:repeat(auto-fill,minmax(200px,1fr))}
  /* Roomier than a phone, tighter than a desktop. The bar wraps to a second
     row here when a page carries buttons, which is fine on a screen 1194 tall;
     what is not fine is a second row with a desk's padding above and below it. */
  .topbar{padding:10px 20px;gap:12px}
  .topbar h1{font-size:23px}
  .seat{width:24px;height:24px}
  .drawer{width:min(52vw,340px)}
  /* The title, the box and the page's own buttons came to more than the width,
     and the box is what tipped it over: 280 asked for, 220 needed. */
  .find{flex:0 1 220px}
}

/* ---------- tablets on their side ----------
   1133 to 1366 across. Wide enough for the sidebar, but a narrower one than a
   laptop gets, so the page keeps as much width as it can. */
@media (min-width:1195px) and (max-width:1400px) and (orientation:landscape){
  :root{--rail:196px}
  .page{padding:18px 20px 50px}
  .cols3{grid-template-columns:1fr 1fr}
  .tiles{grid-template-columns:repeat(auto-fill,minmax(190px,1fr))}
}

/* A mini and an iPad 11 on their side are under 1195 but still wide screens,
   so they get the sidebar rather than the upright treatment — and so does any
   landscape window wider than a phone. It used to start at 1025, which left a
   tablet in Split View at 900 across carrying the full laptop sidebar: 264 of
   900, with 636 left for the page. */
@media (min-width:701px) and (max-width:1194px) and (orientation:landscape) and (min-height:541px){
  :root{--rail:196px}
  .floor{grid-template-columns:1fr}
  .cols3{grid-template-columns:1fr 1fr}
  .tiles{grid-template-columns:repeat(auto-fill,minmax(190px,1fr))}
  .page{padding:18px 18px 50px}
}

/* Wherever the sidebar is on screen the drawer has no reason to exist. Forced
   off rather than merely unused, so one left open on a phone cannot reappear
   over a layout that already has a menu when the device is turned. */
@media (min-width:701px) and (orientation:landscape) and (min-height:541px){
  .drawer,.drawer-scrim,.menubtn{display:none!important}
}
@media (min-width:1195px){
  .drawer,.drawer-scrim,.menubtn{display:none!important}
}

/* ---------- the bar is one line wherever it is not a phone ----------
   Letting the title shrink was not enough on its own: a flex line only
   squeezes what is already on it, and with the menu button, the title, the
   search, a page's own buttons and the help mark the line was over its width
   before any squeezing began, so the last of them wrapped instead. Wrapping is
   turned off above phone size, which makes the title give way — it has
   min-width:0 and an ellipsis for exactly this — and the bar stays one line.

   Not on a phone: there the bar carries a different set and has the room for
   two rows of it. */
@media (min-width:701px) and (min-height:541px){
  .topbar{flex-wrap:nowrap}
  /* The page's own buttons keep their row too, or the bar is one line with a
     two line block sitting in it. Everything that has to give, gives from the
     title. */
  .topbar-actions{flex:0 0 auto;flex-wrap:nowrap}
}

/* ---------- three sizes ----------
   Width alone cannot tell these apart: an iPad 11 upright is 820 across and an
   iPhone on its side is 844. What separates them is height, so the compact
   tier is "narrow, or short and lying down".

     compact   phones either way up          bottom bar + menu button
     tablet    iPads upright, 744 to 1024    menu button, nothing else taking
                                             space from the page
     wide      iPads on their side, laptops  the sidebar, always there

   Real sizes: mini 744x1133, iPad 11 820x1180, Pro 11 834x1194,
   Pro 13 1024x1366, and each of those the other way round. */
@media (max-width:700px), (orientation:landscape) and (max-height:540px){
  :root{--rail:0}
  .shell{flex-direction:column}
  .rail{position:fixed;bottom:0;left:0;right:0;top:auto;width:100%;height:auto;flex:none;
    flex-direction:row;align-items:stretch;z-index:50;
    padding-bottom:env(safe-area-inset-bottom);
    padding-left:env(safe-area-inset-left);padding-right:env(safe-area-inset-right);
    box-shadow:0 -2px 12px rgba(23,38,47,.25);overflow:visible}
  .rail-top{display:none}
  /* Four pages and More, each the same width. The bar used to be the whole
     menu in a strip that scrolled sideways with an arrow at each end, which on
     a phone showed one page at a time and moved under the thumb between
     pages. Nothing here scrolls and nothing moves: the tabs are in the same
     places on every page, which is the only thing that makes a bar learnable. */
  .rail-nav{display:flex;flex:1;padding:0;gap:0;overflow:visible}
  /* Ten point, which is what a tab this wide can hold: at eleven, Dashboard
     and Legislators both came out as an ellipsis and a guess, and shortening
     the names of pages for the bar alone is how a bar stops matching the app
     it belongs to. */
  .navitem{flex:1 1 0;min-width:0;min-height:52px;flex-direction:column;justify-content:center;
    gap:3px;border-radius:0;padding:7px 2px 8px;font-size:10px;font-weight:600;
    letter-spacing:0;text-align:center;align-items:center;position:relative}
  /* The name is cut rather than allowed to make its own tab wider than the
     rest, which would move every tab beside it. */
  .navitem .nl{max-width:100%}
  .navicon{width:23px;height:23px;flex:0 0 23px;opacity:1}
  /* Where you are: the tab lights up and takes a line across the top of it.
     A line under it, which is where this was, sits on the home indicator. */
  .navitem[aria-current="page"]{background:rgba(255,255,255,.1);color:#fff;box-shadow:none}
  .navitem[aria-current="page"]::before{content:"";position:absolute;top:0;left:50%;
    transform:translateX(-50%);width:34px;height:3px;border-radius:0 0 3px 3px;
    background:currentColor}
  .navitem[aria-current="page"] .navicon{opacity:1}
  /* A number on a tab means something is waiting, so it is a badge on the
     symbol rather than a third line of text nobody has room for. */
  .navitem .ct{position:absolute;top:4px;left:50%;margin-left:5px;font-size:10px;
    font-weight:700;line-height:1;padding:2px 5px;border-radius:9px;
    background:var(--bad);color:#fff}
  .navitem:focus-visible{outline:2px solid currentColor;outline-offset:-3px}
  .rail-foot{display:none}
  #whoson{display:none}
  /* Clear of the bar, and of the home indicator underneath it. */
  .main{padding-bottom:calc(74px + env(safe-area-inset-bottom))}
  /* Two rows on a narrow screen: the title and the fixed controls above,
     whatever the page offers below.

     It used to be one row that scrolled sideways, which kept the header a
     constant height and hid the thing people came to do — on a phone Log a
     meeting sat off the right-hand edge with nothing to say it was there.
     A header that changes height between pages is a smaller price than a
     button nobody can find. */
  /* Kept from the Home Screen the app has no browser chrome: the page starts
     at the very top of the screen with the clock and the battery drawn over
     it, so a bar pinned to the top sat underneath the status bar and could not
     be seen at all. It takes the status bar's room as padding, which leaves
     its own color behind the clock. Lying down, the notch takes a strip off
     whichever side it is on. */
  .topbar{padding:calc(9px + env(safe-area-inset-top,0px)) calc(12px + env(safe-area-inset-right,0px))
    9px calc(12px + env(safe-area-inset-left,0px));
    gap:10px;position:sticky;top:0;align-items:center;
    flex-wrap:nowrap;background:var(--boyd);border-bottom:1px solid rgba(255,255,255,.18)}
  .topbar-title{flex:1 1 auto;min-width:0}
  .topbar h1{font-size:20px;color:var(--boyd-ink);
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  /* The dashboard's Open roster: on a phone Roster is a tab in the bar already, and the button
     took the room the page's name needs once it was called Dashboard again (2.139.0). */
  .topbar-actions .btn[data-goto="legislators"]{display:none}
  .topbar .crumb{color:rgba(255,255,255,.72);white-space:nowrap;overflow:hidden;
    text-overflow:ellipsis}

  
  /* The touch rule above makes this 40px square. Resetting the flex basis to
     30 here left it 30 wide and 40 tall: an oval, and a smaller target than a
     finger wants. */
  .helpbtn{position:static;background:transparent;color:var(--boyd-ink);
    border-color:rgba(255,255,255,.55)}
  .helpbtn:hover{background:rgba(255,255,255,.14);color:var(--boyd-ink);
    border-color:rgba(255,255,255,.8)}
  .menubtn{display:flex}
  .menubtn span{background:var(--boyd-ink)}

  /* Appears once the page has been scrolled. It floats just above the bar
     rather than taking a place in it: in the bar it was a sixth tab that came
     and went as the page scrolled, moving every tab beside it. */
  body.scrolled .backtop{display:flex}
  .backtop{position:fixed;right:12px;bottom:calc(var(--mm-rail, 64px) + 12px);z-index:60;
    width:46px;height:46px;min-width:0;padding:0;border-radius:50%;border:1px solid rgba(255,255,255,.35);
    background:var(--boyd);color:#fff;font-size:9.5px;gap:1px;border-right:0;
    box-shadow:0 6px 16px rgba(0,19,42,.3)}
  .topbar{position:sticky;top:0}
  .topbar-actions::-webkit-scrollbar{display:none}
  .page{padding:14px 12px 40px}

  .cols2,.cols3{grid-template-columns:1fr}
  .floor{grid-template-columns:1fr}
  .tiles{grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:10px}
  .tile .val{font-size:29px}
  .tally{font-size:46px}
  .billstrip{grid-template-columns:1fr;padding:12px}
  .filters{gap:8px}
  .filters .field{min-width:calc(50% - 4px);flex:1 1 calc(50% - 4px)}
  .filters input[type=text],.filters input[type=search]{min-width:0}
  .count-note{width:100%;margin-left:0;text-align:right}
  .kv{grid-template-columns:1fr;gap:2px 0}
  .kv dt{margin-top:9px}
  .modal-b{max-height:none;padding:15px}
  .scrim{padding:0;align-items:flex-end}
  .modal{max-width:100%;border-radius:14px 14px 0 0;max-height:calc(94vh / var(--zoom));display:flex;flex-direction:column}
  .modal-b{overflow-y:auto;flex:1}
  .modal-f{padding-bottom:calc(13px + env(safe-area-inset-bottom))}
  .modal-f .btn{flex:1}
  #toasts{left:12px;right:12px;bottom:calc(74px + env(safe-area-inset-bottom))}
  .toast{max-width:none}
  .rulebar{grid-template-columns:1fr}
  .detail-head{gap:12px}
  .detail-head > div[style*="text-align:right"]{text-align:left!important}
  .chambers{grid-template-columns:1fr}
  .chamber{padding:2px 0}
  .chamber + .chamber{border-left:0;border-top:1px solid var(--rule-2);
    padding-top:15px;margin-top:13px}
  .lead .big{font-size:33px}
  .legend .right-note{margin-left:0;width:100%}
  .card-h{padding:12px 14px}
  .card-b{padding:14px}

  /* Wide tables become stacked cards: each cell carries its own label. */
  table.stack, table.stack thead, table.stack tbody, table.stack tr, table.stack td{display:block;width:100%}
  table.stack thead{display:none}
  table.stack tr{border:1px solid var(--rule);border-radius:8px;margin-bottom:10px;padding:4px 0;
    background:var(--surface)}
  /* Wrapping, because the label before it is a fixed 40% and whatever else the cell
     holds divides what is left: a role's name beside its description left the
     description about eight characters wide. The value drops to a line of its own
     rather than being squeezed, which is the same answer `.att-row` gives. */
  table.stack td{border:0;padding:7px 13px;display:flex;gap:12px;align-items:baseline;
    flex-wrap:wrap}
  table.stack td > *{min-width:0}
  table.stack td::before{content:attr(data-label);flex:0 0 40%;font-size:11.5px;font-weight:600;
    color:var(--ink-2)}
  table.stack td .pctbar{flex:1}
  table.stack td:empty{display:none}
  table.stack td.num{text-align:left}
}

@media (max-width:420px){
  .tiles{grid-template-columns:1fr 1fr}
  .filters .field{min-width:100%;flex:1 1 100%}
  .navitem{min-width:58px;padding:9px 10px;font-size:11px}
  .tally{font-size:40px}
}

/* Landscape phone: the bottom bar eats too much height, so shrink it. */
@media (max-height:480px) and (orientation:landscape){
  .navitem{flex-direction:row;padding:7px 12px}
  .main{padding-bottom:52px}
}
/* ---------- the WhipCount look (2.131.0) ----------
   The design canvas, applied to the whole app: a navy band across the top -- the mark at the
   left of it, the page's name, the search and the state chooser along it -- a white menu down
   the side, white cards with a hairline edge on a light gray page, and Inter for everything.
   Mint is kept for the one thing on a screen somebody is meant to press, and for "with us" in
   a whip count; it is never small type, which is why every position has an -ink beside it.

   It replaced the liquid glass theme and its light twin, and sits where the first of them was. The tokens at the top of this file carry most of it; what is here is what a
   token cannot say. Placed before the short-screen and print blocks, which adjust sizes and
   rely on coming later. */

body{background:var(--ground);color:var(--ink)}
::selection{background:#C7F5D7;color:var(--navy)}
a{color:var(--civic)}
a:hover{color:var(--civic-ink)}
:focus-visible{outline:2px solid var(--civic);outline-offset:2px}

/* ---------- the menu down the side: white, under the band ---------- */
.rail{background:var(--surface);color:var(--ink-2);border-right:1px solid var(--rule-2)}
/* The band's left end is the top of the rail: navy for exactly the band's height, with the
   mark centered in it, and the organization's name below on white. One element holds both,
   so the navy is a gradient stop rather than a second box. */
.rail-top{background:linear-gradient(var(--navy) 0 var(--band), transparent var(--band));
  padding:calc((var(--band) - 22px) / 2) 20px 14px;border-bottom:1px solid var(--rule-2)}
.rail-top .brandhome{margin:0 0 calc((var(--band) - 22px) / 2 + 14px)}
.rail-top .boyd,.drawer-h .boyd{height:22px;margin:0}
/* The reversed mark, always: the band is navy whatever the page is. */
.boyd-dark{display:block}
.boyd-light{display:none}
.brandhome:focus-visible{outline:2px solid var(--mint);outline-offset:3px}
.rail-mark{font-size:15px;font-weight:800;letter-spacing:-.01em;line-height:1.25;color:var(--navy)}
.rail-mark span{font-weight:500;color:var(--navy)}
.rail-sub{font-size:12px;color:var(--ink-3);margin-top:3px}
.rail-conf{margin-top:8px;color:var(--warn-ink);background:var(--warn-bg);border-color:var(--warn-rule);
  border-radius:999px;padding:2px 8px;letter-spacing:.12em}
.rail-nav{padding:14px 12px}
.navitem{color:var(--ink-2);font-size:14px;font-weight:500;padding:9px 12px;border-radius:8px;gap:10px}
.navitem:hover{background:var(--ground);color:var(--navy)}
.navitem[aria-current="page"]{background:var(--navy-soft);color:var(--navy);font-weight:700}
.navitem .ct{color:var(--ink-3);font-size:12px}
.navitem[aria-current="page"] .ct{color:var(--navy)}
.navicon{width:18px;height:18px;flex:0 0 18px;opacity:.85}
.navitem[aria-current="page"] .navicon{opacity:1}
.rail-foot{border-top:1px solid var(--rule-2);color:var(--ink-3);font-size:12px}
.rail-foot select{background:var(--surface);border:1px solid var(--rule);color:var(--ink);border-radius:8px;
  padding:5px 8px;font-size:12px}
.live{color:var(--ink-2)}
.dot{background:var(--mint)}
.dot.off{background:#94A3B8}
.whoami{color:var(--ink)}
.whoami-name:hover{color:var(--civic)}
.whoami .badge{background:var(--ground);color:var(--ink-2);border-radius:999px;padding:1px 8px}
.whoami .chevdown{color:var(--ink-3)}
.whoson-line{color:var(--ink-2)}
.whoson-line:hover{color:var(--navy)}
.backtop{color:var(--ink-2);border-right-color:var(--rule-2)}

/* ---------- the band along the top ---------- */
/* The same --boyd as the phone's bar and the menu it opens: one navy, every size. Its height
   and padding are set only where it is not a phone -- set here for every size, they replaced
   the phone's own padding, which is what leaves the status bar and the notch their room. */
.topbar{background:var(--boyd);color:#fff;border-bottom:0}
@media (min-width:701px) and (orientation:portrait), (min-width:701px) and (min-height:541px){
  .topbar{min-height:var(--band);padding:10px 26px}
  .page{padding:26px 32px 64px}
}
/* The size only from 821 across: narrower, the bar's own rule sets the title smaller so the
   whole bar fits on one line, and a later rule here would have undone it. */
@media (min-width:821px){ .topbar h1{font-size:21px} }
.topbar h1{font-weight:800;letter-spacing:-.02em;color:#fff}
.topbar .crumb{color:#A9B8C9;font-size:12px}
/* The search: the canvas's inset box on the band. */
.find .findbox{height:40px;border-radius:8px;border:1px solid transparent;background:var(--navy-2);
  color:#fff;padding:0 14px}
.find .findbox::placeholder{color:#A9B8C9;opacity:1}
.find .findbox:focus{outline:2px solid var(--mint);outline-offset:1px;background:#1B4268}
/* The page's own buttons, on navy: outlined in white, and the one that matters in mint. */
.topbar .btn{background:transparent;border-color:rgba(255,255,255,.35);color:#fff;box-shadow:none}
.topbar .btn:hover{background:rgba(255,255,255,.1);border-color:rgba(255,255,255,.6);color:#fff}
.topbar .btn.primary{background:var(--mint);border-color:var(--mint);color:var(--navy)}
.topbar .btn.primary:hover{background:#3BCF71;border-color:#3BCF71;color:var(--navy)}
/* Something that cannot be undone, on navy: outlined in a light red rather than a white tile. */
.topbar .btn.danger{background:transparent;border-color:rgba(252,165,165,.55);color:#FECACA}
.topbar .btn.danger:hover{background:rgba(220,38,38,.18);border-color:#FCA5A5;color:#fff}
.helpbtn{background:transparent;border:1px solid rgba(255,255,255,.4);color:#fff;font-family:inherit;font-weight:700}
.helpbtn:hover{background:rgba(255,255,255,.12);border-color:#fff;color:#fff}
.mentbtn{background:var(--mint);border-color:var(--mint);color:var(--navy);font-family:inherit;font-weight:800}
.menubtn span{background:#fff}
.menubtn:active{background:rgba(255,255,255,.14)}
/* The state chooser keeps its white pill and ring, which read the same on navy. */

/* ---------- buttons and the things you type in ---------- */
.btn{border-radius:8px;border-color:var(--rule);color:var(--navy);font-weight:600;padding:8px 14px}
.btn:hover{background:var(--surface-2);border-color:#A9B8C9}
.btn.primary{background:var(--mint);border-color:var(--mint);color:var(--navy);font-weight:700}
.btn.primary:hover{background:#3BCF71;border-color:#3BCF71}
.btn.danger{color:var(--bad);border-color:#F1C4BF;background:var(--surface)}
.btn.danger:hover{background:#FEF3F2;border-color:var(--bad)}
.btn.sm{padding:5px 10px;border-radius:7px}
.btn:disabled{opacity:.5}
input[type=text],input[type=date],input[type=time],input[type=number],input[type=email],input[type=tel],
input[type=search],input[type=password],select,textarea{border-color:var(--rule);border-radius:8px;
  padding:8px 10px;color:var(--ink)}
input[type=text]:focus,input[type=date]:focus,input[type=time]:focus,input[type=number]:focus,input[type=email]:focus,
input[type=tel]:focus,input[type=search]:focus,input[type=password]:focus,select:focus,textarea:focus{
  outline:none;border-color:var(--civic);box-shadow:0 0 0 3px rgba(37,99,235,.15)}
.field > label{font-size:12px;color:var(--ink-2);font-weight:600}
input[type=checkbox],input[type=radio]{accent-color:var(--navy)}
.switch input:checked + .track{background:var(--navy)}
.hint{color:var(--ink-3);font-size:12px}

/* ---------- cards, tiles and section headings ---------- */
.card{background:var(--surface);border:1px solid var(--rule-2);border-radius:12px;box-shadow:none}
.card-h{padding:14px 18px;border-bottom-color:var(--rule-2)}
.card-h h2{font-size:17px;font-weight:800;letter-spacing:-.01em;color:var(--navy)}
.card-h .note{color:var(--ink-3)}
.card-b{padding:18px}
.foldbtn:hover h2{color:var(--civic)}
.nested > .card{border-color:var(--rule-2);border-radius:10px}
/* Headings straight on the page, between cards: the canvas's small tracked capitals. */
.sect > h2{font-size:12px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:#475569}
.sect > .note{color:var(--ink-3)}
.grp-h{font-size:19px;font-weight:800;letter-spacing:-.015em;color:var(--navy);border-bottom:1px solid var(--rule-2)}
.grp-h span{color:var(--ink-3)}
.tile{background:var(--surface);border:1px solid var(--rule-2);border-radius:12px;padding:15px 17px}
.tile .lab{font-size:11px;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:#475569;min-height:0}
.tile .val{font-size:28px;font-weight:800;letter-spacing:-.02em;color:var(--navy);margin:6px 0 2px}
.tile .sub{color:var(--ink-3);font-size:12px}
.tile.add{border:1px dashed var(--rule);background:transparent}
.tile.add:hover{border-color:var(--navy);color:var(--navy);background:var(--navy-soft)}
.empty b{font-weight:800;letter-spacing:-.01em}

/* ---------- tables ---------- */
th{background:var(--surface-2);color:#475569;font-size:11px;font-weight:700;letter-spacing:.1em;
  text-transform:uppercase;border-bottom:1px solid var(--rule-2);padding:10px 12px}
td{border-bottom-color:#EEF0F3;padding:10px 12px}
tbody tr:hover{background:var(--surface-2)}
.lname{color:var(--navy);font-weight:700}
.lname:hover{color:var(--civic)}
.mini td{border-bottom-color:#EEF0F3}

/* ---------- pills, tags and chips ---------- */
.pill{border-radius:999px;font-weight:600}
.chip{border-radius:6px;border-color:var(--rule);color:var(--navy);background:var(--surface)}
.tier1{background:#FEF3F2;color:#912018;border-color:#F1C4BF}
.tier2{background:var(--warn-bg);color:var(--warn-ink);border-color:var(--warn-rule)}
.tier3{background:var(--ground);color:var(--ink-2);border-color:var(--rule)}
.pill.here{background:var(--navy);border-color:var(--navy);color:#fff}
.tg.team{background:var(--civic-soft);color:var(--civic-ink);border-color:#C7D7FE}
.tg.mine{border-color:#94A3B8}
.mm-chip.on,.pchip[aria-pressed="true"],.jump[aria-current="true"],.co-hist-chip.on{background:var(--navy);
  border-color:var(--navy);color:#fff}
.jump{background:var(--surface);border-color:var(--rule)}
.jump:hover{border-color:var(--navy);color:var(--navy)}
.jumpbar{border-color:var(--rule-2);border-bottom-width:1px;border-radius:12px;box-shadow:0 1px 2px rgba(15,45,74,.06)}

/* ---------- a whip count ---------- */
.tally,.lead .big{font-weight:800;letter-spacing:-.03em}
.tally{font-size:50px}
.lead .big{font-size:32px}
.goal{font-size:12px;font-weight:800;letter-spacing:.12em;text-transform:uppercase;border-radius:999px;padding:3px 10px}
.chamber.away{opacity:1}
.chamber.away .segbar,.chamber.away .comms{opacity:.55}
.gatemark{opacity:1;background:var(--navy)}
.gatemark span{position:absolute;top:50%;left:6px;transform:translateY(-50%);white-space:nowrap;
  font-size:10.5px;font-weight:700;line-height:1.3;color:#fff;background:var(--navy);border-radius:4px;padding:0 5px}
.goalmark{background:var(--navy)}
.seat{border-color:rgba(15,45,74,.12);border-radius:4px}
.swatch,.segdot{border-color:rgba(15,45,74,.12)}
.datecard{border-color:var(--rule-2);border-radius:10px}
.datecard.next{border-color:var(--navy);background:var(--navy-soft);box-shadow:inset 0 -3px 0 var(--mint)}
.dc-date{font-weight:800;letter-spacing:-.01em;font-size:19px}
.billcard{border-color:var(--rule-2);border-radius:12px}
.billcard.priority{border-left:4px solid var(--opp);background:var(--surface)}
.bc-num{font-weight:800;letter-spacing:-.01em;font-size:17px}
tr.prio-row{background:#FFF8F7}
.conf-agreed{border-color:#B4E8C6;background:#E7F7EC}
.conf-died{border-color:#F1C4BF;background:#FEF3F2}
.rowbtn{border-radius:7px;border-color:var(--rule);color:var(--navy)}
.rowbtn.remove{color:var(--bad);border-color:#F1C4BF}
.rowbtn.remove:hover{background:#FEF3F2;border-color:var(--bad)}
.findkeep.on{color:var(--warn)}
.wiz-rail li.at .wiz-n{background:var(--navy);border-color:var(--navy)}
.wiz-rail li.done .wiz-n{background:var(--mint);color:var(--navy);border-color:var(--mint)}
.avatar{background:var(--navy);border-radius:10px;font-weight:800;font-size:20px}
.mm-name{font-weight:800;letter-spacing:-.02em;font-size:28px}
.mm-go{background:var(--mint);color:var(--navy);font-weight:700}
.mm-go.ghost{background:transparent;color:var(--civic)}
.mm-prog i{background:var(--mint)}
.mm-toggle.on i{background:var(--navy)}
.mentions{border-color:#C7D7FE;background:var(--civic-soft);border-radius:12px}
.msg-row.unread{background:var(--civic-soft)}

/* ---------- dialogs, notices and the phone menu ---------- */
.scrim{background:rgba(15,45,74,.55)}
.modal{border-radius:16px;box-shadow:0 24px 60px rgba(8,22,38,.45);border:0}
.modal-h{padding:18px 24px;border-bottom-color:var(--rule-2)}
.modal-h h2{font-size:20px;font-weight:800;letter-spacing:-.02em}
.modal-b{padding:20px 24px}
.modal-f{padding:14px 24px;border-top-color:var(--rule-2);background:var(--surface-2)}
.toast{background:var(--navy);border-radius:10px}
.toast.bad{background:var(--bad)}
.drawer-scrim{background:rgba(15,45,74,.55)}
.drawer{background:var(--boyd)}
.drawer-mark{font-size:16px;font-weight:800;letter-spacing:-.01em}
.drawer-nav .navitem[aria-current="page"]{background:rgba(255,255,255,.12);box-shadow:inset 3px 0 0 var(--mint)}
.drawer-foot select{background-color:var(--navy-2)}
.drawer-foot select:focus-visible{border-color:var(--mint);box-shadow:0 0 0 2px rgba(74,222,128,.35)}
.idle-card{background:var(--navy);border-radius:12px}
.seattip{background:var(--navy);border-radius:8px}
.err{background:#FEF3F2;border-color:#F1C4BF;color:#912018;border-radius:8px}
.ok-msg{background:#E7F7EC;border-color:#B4E8C6;color:#14532D;border-radius:8px}
.seatwarn{background:var(--warn-bg);border-color:var(--warn-rule);color:var(--warn-ink);border-radius:8px}
.seatwarn.over{background:#FEF3F2;border-color:#F1C4BF;color:#912018}
.mm-fu.due,.mm-fubox{background:var(--warn-bg);color:var(--warn-ink);border-color:var(--warn-rule)}
.mm-fu.late,.mm-fubox.late,.mm-moved.away,.mm-unsaved{background:#FEF3F2;color:#912018;border-color:#F1C4BF}
.mm-moved.closer{background:#E7F7EC;color:#14532D}
.pending{background:var(--warn-bg);border-color:var(--warn-rule);color:var(--ink);border-radius:12px}
.acctmenu{border-color:var(--rule-2);border-radius:12px;box-shadow:0 18px 44px rgba(15,45,74,.22)}

/* ---------- on a phone ----------
   The band is the bar across the top, navy as the menu it opens. The menu down the side
   becomes the bar along the bottom: white, the page you are on in navy with a mint line
   above it. */
@media (max-width:700px), (orientation:landscape) and (max-height:540px){
  .topbar h1{font-size:19px}
  /* What the rules above set for every size, put back to the phone's own: a bar along the
     bottom has no padding round its tabs and a small gap inside each, cards and dialogs keep
     their tighter phone spacing, and a dialog rises from the bottom with its square foot. */
  .rail-nav{padding:0}
  .navitem{gap:3px}
  .card-h{padding:12px 14px}
  .card-b{padding:14px}
  .modal{border-radius:16px 16px 0 0}
  .modal-b{padding:15px}
  .modal-f{padding:13px 15px calc(13px + env(safe-area-inset-bottom))}
  .rail{background:var(--surface);border-right:0;border-top:1px solid var(--rule-2);
    box-shadow:0 -2px 14px rgba(15,45,74,.10)}
  .navitem{color:var(--ink-3);font-weight:600;font-size:10px;padding:7px 2px 8px;border-radius:0}
  .navitem:hover{background:transparent;color:var(--navy)}
  .navitem[aria-current="page"]{background:var(--navy-soft);color:var(--navy);box-shadow:none}
  .navitem[aria-current="page"]::before{background:var(--mint);width:38px;height:3px}
  .navitem .ct{background:var(--bad);color:#fff}
  .backtop{background:var(--navy);border-color:rgba(255,255,255,.3)}
  .page{padding:14px 12px 40px}
  .tile .val{font-size:24px}
  .tally{font-size:40px}
  .lead .big{font-size:28px}
}
@media (max-width:420px){ .tally{font-size:36px} }
/* A finger's 44: the rules above set padding for a mouse, and a touch screen keeps its own. */
@media (hover:none){
  .btn{padding:10px 16px}
  .btn.sm{padding:8px 12px}
  th,td{padding:12px 11px}
}
/* Tablets held upright have no side menu: the band runs the full width, menu button first. */
@media (min-width:701px) and (max-width:1194px) and (orientation:portrait){
  .topbar{padding:10px 20px}
}

/* ---------- sign in gate (2.131.0) ----------
   The signed-out screens in the WhipCount look: a navy page with the band across its top, the
   name and the line under it in white with mint, and the form on a white card. A state's own
   photograph, where one is set (public/img/login-bg.jpg otherwise, set by gateFrame() in
   02-sync.js), shows faintly through the navy rather than over it, so white type holds on any
   picture. Nothing is loaded from elsewhere: the security policy allows images from this site
   only. */
#gate{position:fixed;inset:0;z-index:200;overflow-y:auto;padding:0;color:#fff;background:var(--navy);
  font-family:Inter,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;-webkit-font-smoothing:antialiased}
.gate-shell{--gate-art:none;min-height:100vh;min-height:100dvh;display:flex;flex-direction:column;
  position:relative;isolation:isolate;overflow:hidden;background:var(--navy)}
.gate-bg{position:absolute;inset:0;z-index:-3;opacity:.12;
  background:var(--gate-art) center center / cover no-repeat;filter:grayscale(.35)}
.gate-veil{position:absolute;inset:0;z-index:-2;background:
  radial-gradient(circle at 78% 22%,rgba(74,222,128,.10),transparent 32%),
  linear-gradient(180deg,rgba(15,45,74,.2),rgba(15,45,74,.85))}
.gate-frame{display:none}

.gate-head-left{display:flex;align-items:center;gap:14px;min-width:0}
.boyd-head{height:22px;margin:0;flex:0 0 auto}
.boyd-hero{height:34px;margin:0 0 18px}
.gate-head{height:var(--band);flex:0 0 var(--band);display:flex;align-items:center;justify-content:space-between;
  gap:12px;padding:0 clamp(18px,3vw,40px);border-bottom:1px solid rgba(255,255,255,.1)}
#gate .gate-word{font-family:inherit;font-size:15px;font-weight:700;letter-spacing:-.01em;line-height:1.2;
  margin:0;color:#fff;white-space:nowrap;padding-left:14px;border-left:1px solid rgba(255,255,255,.2)}
#gate .gate-word span{font-weight:500;color:#A9B8C9}
.gate-headnote{font-size:11px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:var(--navy);
  background:var(--mint);border-radius:999px;padding:5px 10px;white-space:nowrap}
.gate-head-right{display:flex;align-items:center;gap:14px}
.gate-lead{margin:20px 0 0;max-width:520px;font-size:clamp(15px,1.25vw,18px);line-height:1.6;color:#D7E1EC}
.gate-feats{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;margin-top:28px;max-width:660px}
.gate-feat{padding:16px 18px;border-radius:12px;background:var(--navy-2);border:1px solid rgba(255,255,255,.1)}
.gate-feat b{display:block;font-size:14px;margin-bottom:4px;color:#fff}
.gate-feat span{display:block;font-size:12.5px;line-height:1.45;color:#C9D6E3}
.is-landing .gate-hero-content{max-width:680px}

.gate-main{flex:1;width:min(1320px,100%);margin:0 auto;padding:clamp(20px,4vw,56px);display:grid;
  grid-template-columns:minmax(0,1.1fr) minmax(360px,440px);gap:clamp(24px,4vw,64px);align-items:center}
.gate-hero{min-height:480px;display:flex;align-items:center;padding:0;position:relative}
.gate-hero-panel{display:none}
.gate-hero-content{max-width:560px;position:relative}
.gate-h1{margin:0 0 18px;font-size:clamp(40px,4.6vw,68px);font-weight:800;line-height:1;letter-spacing:-.045em;color:#fff}
.gate-h1 span{color:var(--mint)}
.gate-chip{display:inline-flex;align-items:center;padding:7px 13px;border-radius:999px;background:transparent;
  border:1px solid rgba(255,255,255,.3);font-size:12px;font-weight:700;letter-spacing:.14em;
  text-transform:uppercase;color:#fff}

/* the card */
.gate-right{position:relative;display:flex;justify-content:center;align-items:center}
.gate-orb,.gate-ring,.gate-pill{display:none}
.gate-glass{position:relative;width:min(100%,440px);padding:32px 30px 26px;border-radius:16px;
  background:#fff;color:var(--navy);box-shadow:0 24px 60px rgba(8,22,38,.45)}
.gate-glass > *{position:relative}
#gate .gate-mark{font-family:inherit;margin:0 0 6px;font-size:28px;line-height:1.1;letter-spacing:-.025em;
  font-weight:800;color:var(--navy)}
.gate-sub{margin:0 0 22px;color:#475569;font-size:14px;line-height:1.55}
#gate .field{margin-bottom:16px;gap:0}
#gate .field > label{display:block;margin-bottom:6px;font-size:13px;font-weight:600;color:var(--navy)}
.gate-pw{position:relative}
#gate input[type=text],#gate input[type=email],#gate input[type=password]{width:100%;height:46px;
  border:1px solid var(--rule);border-radius:8px;background:#fff;color:var(--navy);
  padding:0 14px;font-size:15px;outline:none;box-shadow:none}
#gate input::placeholder{color:#8A9AAB}
#gate input:focus{border-color:var(--civic);box-shadow:0 0 0 3px rgba(37,99,235,.15)}
#gate .gate-pw input{padding-right:74px}
#gate .hint{display:block;margin-top:6px;font-size:12px;color:#475569}
.gate-reveal{position:absolute;right:12px;top:50%;transform:translateY(-50%);border:0;background:transparent;
  color:var(--civic);font-size:12px;font-weight:700;cursor:pointer;padding:6px 2px}
.gate-options{display:flex;align-items:center;justify-content:flex-end;gap:12px;flex-wrap:wrap;margin:4px 0 18px}
.gate-link{background:none;border:0;padding:0;font-size:13px;font-weight:600;color:var(--civic);cursor:pointer;
  text-decoration:none;text-underline-offset:3px}
.gate-link:hover{text-decoration:underline;color:var(--civic-ink)}
.gate-submit{display:block;width:100%;height:48px;border:0;border-radius:8px;background:var(--mint);
  color:var(--navy);font-weight:800;font-size:16px;cursor:pointer;transition:background .15s ease}
.gate-submit:hover:not(:disabled){background:#3BCF71}
.gate-submit:disabled{opacity:.7;cursor:progress}
.gate-link:focus-visible,.gate-submit:focus-visible,.gate-reveal:focus-visible{outline:3px solid var(--civic);outline-offset:2px}
/* Face ID is an alternative to the password, not the primary action, and mint is for the
   one thing on a screen somebody is meant to press -- two mint buttons would be two
   primaries. So it is the outlined one and Sign In keeps the mint. */
.gate-pk{background:#fff;border:1.5px solid var(--navy);color:var(--navy);margin-bottom:6px}
.gate-pk:hover:not(:disabled){background:#F3F4F6}
.gate-or{display:flex;align-items:center;gap:10px;margin:10px 0 14px;font-size:11.5px;
  color:#64748B;text-transform:uppercase;letter-spacing:.06em}
.gate-or::before,.gate-or::after{content:"";flex:1 1 auto;height:1px;background:var(--rule-2)}
#g-err:not(:empty){margin-top:12px}
#gate .err,#gate .ok-msg{font-family:inherit;border-radius:8px;font-size:12.5px;line-height:1.5}
.gate-note{margin:22px 0 0;padding-top:16px;border-top:1px solid var(--rule-2);font-size:11.5px;
  line-height:1.5;color:#475569}
.gate-foot{padding:12px 24px 18px;text-align:center;font-size:11.5px;color:#A9B8C9}

@media(max-width:1000px){
  .gate-main{grid-template-columns:1fr;gap:12px;padding-top:24px}
  .gate-hero{min-height:0;padding:8px 0 0}
  .gate-right{padding-bottom:24px}
}
@media(max-width:720px){
  .gate-head{height:56px;flex-basis:56px;padding:0 14px}
  .gate-headnote{display:none}
  .gate-main{padding:14px}
  /* On a phone the form is what somebody came for, so the words go and the card comes first. */
  .gate-hero{display:none}
  .gate-glass{padding:26px 20px 22px;border-radius:14px}
  .gate-main{display:flex;flex-direction:column}
  .gate-right{order:1}
  .gate-hero{order:2}
  /* On the landing page the words are the page, so they stay, compactly, under the form. */
  .is-landing .gate-hero{display:flex;min-height:0;padding:20px 4px 4px}
  .is-landing .gate-h1{font-size:38px;margin-top:0}
  .is-landing .gate-feats{grid-template-columns:1fr}
}
@media(prefers-reduced-motion:reduce){.gate-submit{transition:none}}
/* ---------- your own name, and what is yours alone behind it ----------
   Appearance and page layout were settings on Data & Settings, two pages from
   wherever somebody noticed they wanted them and filed among a state's setup,
   where a personal choice reads as something you might be changing for
   everybody. They are on the name now. */
.whoami{display:flex;align-items:center;gap:8px;margin-bottom:10px;font-size:12px;color:var(--ink);
  position:relative}
.whoami-name{display:flex;align-items:center;gap:8px;flex:1;min-width:0;text-align:left;
  background:none;border:0;padding:4px 0;cursor:pointer;color:inherit;font:inherit}
.whoami-name:hover{color:#fff}
.acctmenu{position:absolute;bottom:calc(100% + 8px);left:0;width:min(84vw,244px);z-index:90;
  background:var(--surface);color:var(--ink);border:1px solid var(--rule);border-radius:12px;
  box-shadow:0 14px 40px rgba(23,38,47,.28);overflow:hidden;padding:4px 0}
.acctmenu[hidden]{display:none}
.acct-h{margin:0;padding:9px 13px 4px;font-size:11px;font-weight:700;letter-spacing:.05em;
  text-transform:uppercase;color:var(--ink-3)}
.acctmenu .theme-pick{padding:0 9px 8px}
.acct-item{display:block;width:100%;text-align:left;padding:9px 13px;border:0;background:none;
  cursor:pointer;font-family:inherit;font-size:13.5px;font-weight:600;color:var(--ink);
  border-top:1px solid var(--rule-2)}
.acct-item span{display:block;font-size:11.5px;font-weight:400;color:var(--ink-2);margin-top:2px}
.acct-item:hover{background:var(--civic-soft)}
/* On a phone the menu hangs from the name in the drawer, which is near the
   bottom of a tall panel, so it opens upward there too. */
.drawer-who{position:relative}
/* The corner of the top bar (2.137.0): initials on mint, the one round thing on the band, with
   the same menu hanging down from it rather than up. */
.acctbar{position:relative;flex:0 0 auto;display:flex;align-items:center}
.acctbar:empty{display:none}
.acct-avatar{width:34px;height:34px;border-radius:50%;border:2px solid rgba(255,255,255,.55);
  background:var(--mint);color:var(--navy);font-weight:700;font-size:13px;line-height:1;
  font-family:inherit;
  letter-spacing:.02em;cursor:pointer;display:flex;align-items:center;justify-content:center;
  padding:0}
.acct-avatar:hover,.acct-avatar[aria-expanded="true"]{border-color:#fff}
.acct-avatar:focus-visible{outline:2px solid #fff;outline-offset:2px}
#acctmenu-top{top:calc(100% + 10px);bottom:auto;left:auto;right:0;width:260px}
.acct-who{padding:2px 13px 10px;display:flex;flex-direction:column;gap:2px;min-width:0}
.acct-who b{font-size:14px;color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.acct-who span{font-size:12px;color:var(--ink-3);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.acct-out{color:var(--opp-ink)}
/* Rearranging the side menu by dragging it (2.137.0): the page being moved fades, and a line
   shows where it will land. */
.navitem.dragging{opacity:.45}
.navdragging,.navdragging .navitem{cursor:grabbing;user-select:none;-webkit-user-select:none}
.navitem.drop-before{box-shadow:inset 0 3px 0 var(--civic)}
.navitem.drop-after{box-shadow:inset 0 -3px 0 var(--civic)}
.toast-act{margin-left:14px;background:none;border:1px solid rgba(255,255,255,.5);color:#fff;
  border-radius:6px;padding:3px 10px;font:inherit;font-weight:700;cursor:pointer}
.toast-act:hover{border-color:#fff}
.whoami .badge{background:rgba(255,255,255,.13);border-radius:4px;padding:1px 6px;font-size:10.5px;font-weight:600}
/* Was the Sign out link that sat on this row. Signing out is in the menu on
   the name now, so the only button left on the row is the name itself. */
.whoami .chevdown{margin-left:auto;color:#8CA2AE;font-size:10px;line-height:1}
@media(prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
/* ---------- the platform, grouped by company ----------
   One block per company, its regions nested inside, its states inside those. The nesting
   is the point: a region is what decides who may open the states in it, so a flat list
   could not show whose anything was. Indentation carries the hierarchy rather than boxes
   inside boxes, which at three levels reads as noise. */
.co{
  border:1px solid var(--rule); border-radius:8px; padding:12px 14px; margin:0 0 12px;
}
.co-head{ display:flex; gap:9px; align-items:baseline; flex-wrap:wrap; margin-bottom:10px }
.co-count{ margin-left:auto }
.co-team{ flex:0 0 auto }
.co-reg{
  margin:0 0 10px; padding-left:13px; border-left:2px solid var(--rule-2);
}
.co-reg:last-of-type{ margin-bottom:0 }
.co-reg-head{ display:flex; gap:9px; align-items:baseline; flex-wrap:wrap; margin-bottom:5px }
.co-reg-name{ font-size:13px; font-weight:600 }
.co-empty{ margin:0 0 8px; padding-left:13px }
.co-acts{ display:flex; gap:8px; margin-top:11px; padding-top:10px;
          border-top:1px solid var(--rule-2); flex-wrap:wrap }
.co-ask{ margin:11px 0 0; padding-top:10px; border-top:1px solid var(--rule-2) }
.co-team-wrap{ margin:0 0 10px; padding-left:13px; border-left:2px solid var(--rule-2) }

/* ---------- Companies, the platform's own page ----------
   The list and one company's page. The company's page reuses the blocks above for its
   regions and states, so a company reads the same here as in Data & Settings. */
.co-title{ font-size:16px }
.co-needs-list{
  list-style:none; margin:10px 0 0; padding:10px 0 0; border-top:1px solid var(--rule-2);
  display:flex; flex-direction:column; gap:6px; font-size:13px; color:var(--ink-2);
}

/* ---------- the close-out wizard ----------
   A rail of four steps down the side on a wide screen, across the top on a narrow one.
   The current step is the only one in full ink; the ones behind it carry a check. */
.wiz{ display:grid; grid-template-columns:168px 1fr; gap:20px }
.wiz-rail{ list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:10px }
.wiz-rail li{
  display:flex; gap:9px; align-items:center; font-size:12.5px; color:var(--ink-3);
}
.wiz-rail li.at{ color:var(--ink); font-weight:600 }
.wiz-rail li.done{ color:var(--ink-2) }
.wiz-n{
  flex:0 0 auto; width:21px; height:21px; border-radius:50%; display:grid; place-items:center;
  font-size:11px; background:var(--surface-2); color:var(--ink-3); border:1px solid var(--rule);
}
.wiz-rail li.at .wiz-n{ background:var(--civic); color:#fff; border-color:var(--civic) }
.wiz-rail li.done .wiz-n{ background:var(--ok); color:#fff; border-color:var(--ok) }
.wiz-body{ min-height:220px }
.wiz-lead{ margin:0 0 12px; font-size:14px }
.wiz-lead.warn{ color:var(--warn) }
.wiz-what{ margin:0; padding-left:18px; display:flex; flex-direction:column; gap:7px }
.wiz-what li{ font-size:13px; color:var(--ink-2) }
.wiz-what.confirm li{ font-size:13.5px; color:var(--ink) }
.wiz-what li.warn{ color:var(--warn) }
.wiz-ack{
  display:flex; gap:9px; align-items:flex-start; margin-top:14px; padding:10px 12px;
  border:1px solid var(--warn); border-radius:8px; font-size:13px; color:var(--ink-2);
}
.wiz-acts-row{ display:flex; gap:8px; margin:0 0 10px; flex-wrap:wrap }
.wiz-bills{ max-height:300px; overflow:auto; border:1px solid var(--rule-2); border-radius:8px; padding:4px 10px }
.carry-row{ display:flex; gap:10px; align-items:baseline; padding:6px 0; border-bottom:1px solid var(--rule-2) }
.carry-row:last-child{ border-bottom:0 }
@media (max-width:700px){
  .wiz{ grid-template-columns:1fr; gap:14px }
  .wiz-rail{ flex-direction:row; flex-wrap:wrap; gap:6px 14px }
  .wiz-rail li{ font-size:11.5px }
  .wiz-bills{ max-height:calc(50vh / var(--zoom)) }
}

/* ---------- white label, on the platform card ---------- */
.wl-row{ border:1px solid var(--rule); border-radius:8px; padding:12px; margin-bottom:10px }
.wl-head{ display:flex; gap:10px; align-items:baseline; flex-wrap:wrap; margin-bottom:10px }
.wl-grid{ display:grid; grid-template-columns:repeat(auto-fit, minmax(190px, 1fr)); gap:10px }
.wl-grid label{ display:flex; flex-direction:column; gap:4px; font-size:12px; color:var(--ink-3) }
.wl-grid input{ font-size:13px }
.wl-acts{ display:flex; gap:10px; align-items:center; margin-top:10px; flex-wrap:wrap }
.sub-grid{
  display:grid; grid-template-columns:repeat(auto-fit, minmax(150px, 1fr)); gap:10px;
  align-items:end; margin:0 0 12px; padding-bottom:12px; border-bottom:1px solid var(--rule-2);
}
.sub-grid > label{ display:flex; flex-direction:column; gap:4px; font-size:12px; color:var(--ink-3) }
.sub-comp{ flex-direction:row !important; align-items:center; gap:7px !important }
.sub-now{ display:flex; gap:6px; align-items:center; flex-wrap:wrap }
.sub-acts{ display:flex; gap:9px; align-items:center; flex-wrap:wrap; grid-column:1/-1 }
.wl-setup{ margin-top:12px; padding-top:10px; border-top:1px solid var(--rule-2) }
.wl-steps{ margin:0; padding-left:0; list-style:none; display:flex; flex-direction:column; gap:7px }
.wl-steps li{ font-size:12.5px; color:var(--ink-2); display:flex; gap:8px; align-items:flex-start }
.wl-who{
  flex:0 0 auto; font-size:10px; text-transform:uppercase; letter-spacing:.05em;
  padding:2px 6px; border-radius:4px; margin-top:1px;
  background:var(--civic-soft); color:var(--civic);
}
.wl-who.them{ background:#F3EEE4; color:#7A5B12 }
.wl-note{ margin:8px 0 0 }
.wl-note.warn{ color:var(--warn) }
.wl-dns{ margin:8px 0 0; font-size:12.5px }
.wl-dns.ok{ color:var(--ok) }
.wl-dns.no{ color:var(--warn) }

/* ---------- the data credit ----------
   Small and quiet, and deliberately not hidden: LegiScan's license makes attribution
   a condition, so this is not decoration that a tighter layout may drop. No
   `display:none` anywhere for it, and it is not inside anything that collapses --
   which is why it sits in the rail footer and the gate footer rather than in a panel.
   Readable at the contrast the rest of the footer has. */
.credit{ font-size:11px; color:var(--ink-3); margin-top:8px; line-height:1.45 }
.credit a{ color:inherit; text-decoration:underline }
.gate-foot .credit{ color:rgba(255,255,255,.72); display:inline; margin:0 0 0 6px }
.gate-foot .credit a{ color:inherit }

/* ---------- the platform's own overview (2.147.0) ----------
   The allowance as a bar, because "63,000 of 100,000" is a sentence and a bar is a glance.
   Amber past three quarters, red past nine tenths; attention has one ink (--warn-ink) and
   never the persuadable one. Before the print and short-screen blocks, which set sizes. */
/* `display:block` because this is drawn as a `<span>` on the People page's plan strip and
   as a `<div>` on the platform's overview -- a height on an inline box is ignored, and one
   rule for the bar is the point of having it (2.148.0). */
.pf-meter{ display:block; height:10px; border-radius:6px; background:var(--rule-2);
  overflow:hidden; margin:0 0 8px }
.pf-meter > span{ display:block; height:100%; background:var(--sup); border-radius:6px }
.pf-meter.warn > span{ background:var(--warn) }
.pf-meter.bad > span{ background:var(--opp) }
.pf-mnum{ margin:0 0 4px; font-size:14px }
.pf-mnum b{ font-size:20px }
.pf-att{ list-style:none; margin:10px 0 0; padding:0; display:flex; flex-direction:column;
  gap:6px }
.pf-att li{ font-size:13px; padding:8px 11px; border:1px solid var(--warn-rule);
  background:var(--warn-bg); border-radius:7px; color:var(--warn-ink) }

/* ---------- looking at a company as its administrator (D5, 2.149.1) ----------
   A band above the page, amber because it is attention rather than a position: attention has
   one ink (--warn-ink) and never the persuadable one. Sticky, so scrolling a long page does
   not leave somebody unaware of whose data they are reading. */
.viewband{ position:sticky; top:0; z-index:40; display:flex; flex-wrap:wrap; gap:10px;
  align-items:center; margin:0 0 14px; padding:9px 14px; font-size:13px;
  background:var(--warn-bg); color:var(--warn-ink);
  border:1px solid var(--warn-rule); border-radius:9px }
.viewband b{ font-weight:600 }
.viewband .btn{ margin-left:auto }

/* ---------- what the plan allows, on the People page (2.148.0) ----------
   `Seats 9 of 12` with a bar, drawn only where a number is set. The bands are the allowance
   meter's own (`.pf-meter`), so nearly-full looks the same on a company's page and on the
   platform's. Attention takes `--warn-ink`, never the persuadable one. */
.pp-plan{ display:flex; flex-wrap:wrap; gap:12px; margin:0 0 14px }
.pp-pq{ flex:1 1 220px; min-width:200px; background:var(--card); border:1px solid var(--rule);
  border-radius:10px; padding:10px 12px }
.pp-pq > b{ font-size:12px; text-transform:uppercase; letter-spacing:.04em; color:var(--ink-3) }
.pp-pn{ display:block; font-size:20px; font-weight:600; margin:2px 0 7px }
.pp-pq.warn .pp-pn{ color:var(--warn-ink) }
.pp-pq.bad .pp-pn{ color:var(--opp-ink) }
.pp-pq .hint{ margin:6px 0 0 }

/* ---------- My access (2.146.0) ----------
   A member's own page: where they work, what their role lets them do, and asking for more.
   Placed before the print and short-screen blocks, which adjust sizes -- nothing here sets a
   property either of those sets, so neither has to be reasoned about. */
.ma-grid{ display:grid; gap:14px 26px; grid-template-columns:repeat(auto-fill, minmax(230px, 1fr)) }
.ma-grp > b{ display:block; margin:0 0 5px; font-size:12px; text-transform:uppercase;
  letter-spacing:.04em; color:var(--ink-3) }
.ma-caps{ list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:3px }
.ma-caps li{ display:flex; gap:7px; align-items:baseline; font-size:13px; line-height:1.45 }
.ma-caps li.off{ color:var(--ink-3) }
/* Mint for held and a plain dash for not, so the column reads down without color being the
   only carrier -- a dash and a check differ in shape as well as in weight. */
.ma-yes-mark{ flex:0 0 1em; color:var(--sup-ink); font-weight:600 }
.ma-caps li.off .ma-yes-mark{ color:var(--rule-2); font-weight:400 }
.ma-ask{ display:flex; flex-wrap:wrap; gap:10px 14px; align-items:flex-end }
.ma-ask label{ display:flex; flex-direction:column; gap:4px; font-size:12px; color:var(--ink-3) }
.ma-ask .ma-why{ flex:1 1 240px }
.ma-ask select, .ma-ask input{ font-size:13px }
.ma-reqs{ list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:7px }
.ma-reqs li{ font-size:13px; padding:8px 11px; border:1px solid var(--rule); border-radius:7px }
.ma-yes{ color:var(--sup-ink); font-weight:600 }
.ma-no{ color:var(--opp-ink); font-weight:600 }
/* What is waiting, on the People page: amber is attention, and its ink is --warn-ink, never
   --pers-ink (2.136.0). */
.pp-asked{ border:1px solid var(--warn-rule); background:var(--warn-bg); border-radius:8px;
  padding:10px 12px; margin:0 0 12px }
.pp-asked b{ color:var(--warn-ink) }
.pp-asked ul{ list-style:none; margin:7px 0 0; padding:0; display:flex;
  flex-direction:column; gap:8px }
.pp-asked li{ display:flex; flex-wrap:wrap; gap:8px; align-items:baseline; font-size:13px }
.pp-asked .pp-asked-acts{ margin-left:auto; display:flex; gap:6px }

/* ---------- what a bill needs to pass ----------
   Marked only when it is higher than a majority, because that is the case somebody
   has to notice: an ordinary bill's card should read as ordinary. The left edge rather
   than a fill, so it stands out in a column of cards without shouting over the whip
   count above it. Placed before the print and short-screen blocks so neither has to
   be reasoned about -- nothing here sets a property either of those sets. */
.thr-high{ border-left:3px solid var(--warn) }
.thr-lead{ margin:0 0 10px; font-size:14px }
.thr-chs{ display:flex; flex-wrap:wrap; gap:10px 22px }
.thr-ch{ display:flex; align-items:baseline; gap:7px }
.thr-ch-n{ font-size:12px; color:var(--ink-3); text-transform:uppercase; letter-spacing:.04em }
.thr-ch-v{ font-size:22px; font-weight:600 }
.thr-note{
  margin:12px 0 6px; padding:8px 12px; border-left:2px solid var(--rule);
  color:var(--ink-2); font-size:13px; font-style:normal;
}
.thr-set{ margin-top:12px; display:flex; gap:8px; flex-wrap:wrap; align-items:center }
.thr-set select{ flex:1 1 220px; min-width:0 }

/* ---------- Preview as a client (2.161.0) ----------
   A demonstration state only. The bars reuse the whip colors as FILLS, so the figures
   beside them carry the reading: mint for committed, red for against, and the rule's own
   gray for everybody else -- never a position's name, because a client is never told
   which member holds which. */
.pprow{display:flex;align-items:center;gap:12px;padding:9px 0;border-top:1px solid var(--rule-2)}
.pprow:first-of-type{border-top:0}
.ppnm{font-weight:600}
.ppn{margin-left:auto;color:var(--ink-3);font-size:12.5px;white-space:nowrap}
.pplist{display:flex;flex-direction:column;gap:14px}
.ppbill{border:1px solid var(--rule-2);border-radius:9px;padding:13px 14px;background:var(--surface)}
.ppbill-h{display:flex;align-items:baseline;gap:9px;flex-wrap:wrap}
.ppno{font-weight:800;font-size:15px;letter-spacing:-.02em}
.ppbill-h .ppos{margin-left:auto}
.pptitle{margin:4px 0 0;color:var(--ink-2);max-width:68ch}
.ppwhere{margin:6px 0 0;font-size:12.5px;color:var(--ink-3)}
.ppcount{margin-top:11px;background:var(--surface-2);border:1px solid var(--rule-2);border-radius:8px;padding:10px 12px}
.ppch{display:grid;grid-template-columns:92px minmax(0,1fr);gap:10px;align-items:center}
.ppchn{font-size:13px;font-weight:600}
.ppbar{display:flex;height:18px;border-radius:5px;overflow:hidden;border:1px solid var(--rule-2);background:#fff}
.ppbar span{display:block}
.ppbar .s{background:var(--sup)}
.ppbar .n{background:var(--nomeet)}
.ppbar .o{background:var(--opp)}
.ppfig{margin:3px 0 9px 102px;font-size:12.5px;color:var(--ink-2)}
.ppfig:last-child{margin-bottom:0}
.ppshort{margin:10px 0 0;font-size:12.5px;color:var(--warn-ink);background:var(--warn-bg);border:1px solid var(--warn-rule);border-radius:7px;padding:7px 9px}
@media (max-width:700px){
  .ppch{grid-template-columns:minmax(0,1fr)}
  .ppfig{margin-left:0}
  .pprow{flex-wrap:wrap}
}

/* ---------- print ---------- */
#printarea{display:none}
/* ---------- a tablet on its side is short, not small ----------
   744 to 834 tall. The sidebar's fixed furniture came to 306 of those pixels
   before a single page had been listed — the mark, the state's name, the
   confidentiality marking, who is signed in, the live dot and the refresh
   control — so on a mini the list of pages scrolled and the refresh control
   fell off the bottom.

   Nothing is taken away. The confidentiality marking in particular stays: a
   marking that disappears on some screens is worse than no marking at all.
   Each piece is simply set for a screen that is short. 860 rather than 900 as
   the ceiling, so a laptop 900 tall keeps the roomier sidebar it has space
   for; 541 as the floor, because below that is a phone on its side, which has
   a bottom bar and no sidebar to set.

   It sits here, at the end, because the theme further up this file sets the
   app name's size again at the same weight, and of two rules that weigh the
   same the later one wins. */
@media (min-width:701px) and (orientation:landscape) and
       (min-height:541px) and (max-height:860px){
  /* The top of the rail is the band's left end, so the top padding is the band's: the mark
     stays centered in it whatever the screen. Its sides and foot are tightened. */
  .rail-top{padding:calc((var(--band) - 22px) / 2) 16px 10px}
  .rail-mark{font-size:14px}
  .rail-sub{font-size:11px;margin-top:3px}
  .rail-conf{margin-top:6px;font-size:9px}
  .rail-nav{padding:6px 8px}
  .navitem{padding:6px 11px}
  .rail-foot{padding:9px 14px 12px}
  .whoami{margin-bottom:6px}
  .live{margin-bottom:6px}
  /* The bar takes its share off the top of a short screen too. */
  .topbar{padding:10px 20px;gap:12px}
  .topbar h1{font-size:19px}
  .find{flex:0 1 220px}
  .page{padding:14px 18px 40px}
}


/* ---------- People: a company's directory (2.132.0) ----------
   The canvas's *Company admin . People* board: three tiles, a filter row, the table, and the
   drawer for the one selected. Beside the table on a wide screen; under it, full width, below
   1100 across, where a 440 px drawer would leave the table too narrow to read. */
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;
  clip:rect(0,0,0,0);white-space:nowrap;border:0}
.pp-tiles{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px;margin:0 0 18px}
.pp-tile{background:var(--surface);border:1px solid var(--rule-2);border-radius:12px;padding:14px 16px}
.pp-tn{font-size:26px;font-weight:800;letter-spacing:-.02em;color:var(--ink);line-height:1.1}
.pp-tn .pp-tsm{font-size:17px;letter-spacing:-.01em}
.pp-tl{font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--ink-3);
  margin-top:4px}
.pp-ts{font-size:12px;color:var(--ink-3);margin-top:2px}
.pp-wrap{display:grid;grid-template-columns:minmax(0,1fr) 420px;gap:18px;align-items:start}
.pp-list{overflow:hidden}
.pp-filters{display:flex;flex-wrap:wrap;gap:8px;padding:14px 16px;border-bottom:1px solid var(--rule-2)}
.pp-filters label{display:block}
.pp-search{flex:1 1 160px}
.pp-filters select{max-width:170px}
.pp-search input{width:100%}
.pp-tablewrap{overflow-x:auto}
.pp-table{width:100%;border-collapse:collapse}
.pp-table th{text-align:left;padding:9px 14px}
.pp-table td{padding:10px 14px;border-top:1px solid var(--rule-2);vertical-align:middle}
.pp-row{cursor:pointer}
.pp-row:hover td{background:var(--surface-2)}
.pp-row.on td{background:var(--navy-soft)}
.pp-row.off .pp-name b,.pp-row.off .pp-role{color:var(--ink-3)}
.pp-who{display:flex;align-items:center;gap:10px;background:none;border:0;padding:0;margin:0;
  font:inherit;color:inherit;text-align:left;cursor:pointer;min-width:0}
.pp-who:focus-visible{outline:2px solid var(--civic);outline-offset:3px;border-radius:6px}
.pp-av{flex:0 0 34px;width:34px;height:34px;border-radius:50%;background:var(--navy);color:#fff;
  display:inline-flex;align-items:center;justify-content:center;font-size:12.5px;font-weight:700;
  letter-spacing:.02em}
.pp-av.lg{flex-basis:44px;width:44px;height:44px;font-size:15px}
.pp-name{display:flex;flex-direction:column;min-width:0}
.pp-name b{font-weight:700;color:var(--ink)}
.pp-nl{display:flex;flex-wrap:wrap;align-items:center;gap:4px 6px}
.pp-mail{font-size:12px;color:var(--ink-3);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pp-tag{display:inline-block;font-size:10.5px;font-weight:700;padding:1px 7px;border-radius:10px;
  background:var(--surface-2);color:var(--ink-2);border:1px solid var(--rule-2);vertical-align:1px}
.pp-tag.owner{background:var(--navy);color:#fff;border-color:var(--navy)}
.pp-tag.invited{background:var(--warn-bg);color:var(--warn-ink);border-color:var(--warn-rule)}
.pp-chips{display:flex;flex-wrap:wrap;gap:5px}
.pp-chip{display:inline-block;font-size:11.5px;font-weight:700;padding:2px 8px;border-radius:6px;
  background:var(--surface-2);border:1px solid var(--rule);color:var(--ink-2)}
.pp-chip.region{background:var(--civic-soft);border-color:#C9DAFB;color:var(--civic-ink)}
.pp-chip.all{background:var(--navy);border-color:var(--navy);color:#fff}
.pp-sub{font-size:11.5px;color:var(--ink-3);margin-top:3px}
.pp-yes{color:var(--sup-ink);font-weight:800}
.pp-no{color:var(--ink-3)}
.pp-last{white-space:nowrap;color:var(--ink-2);font-size:13px}
.pp-drawer{position:sticky;top:calc(var(--band) + 16px);display:flex;flex-direction:column;
  max-height:calc(100vh / var(--zoom) - var(--band) - 32px)}
.pp-idle{justify-content:center;min-height:240px}
.pp-dh{display:flex;align-items:center;gap:12px;padding:16px 18px;border-bottom:1px solid var(--rule-2)}
.pp-dname{display:flex;flex-direction:column;min-width:0;flex:1}
.pp-dname b{font-size:16px;font-weight:800;letter-spacing:-.01em}
.pp-dname span{font-size:12.5px;color:var(--ink-3);overflow:hidden;text-overflow:ellipsis}
.pp-dh .x{background:none;border:0;font-size:22px;line-height:1;cursor:pointer;color:var(--ink-3);
  width:36px;height:36px;border-radius:8px}
.pp-dh .x:hover{background:var(--surface-2);color:var(--ink)}
.pp-db{padding:16px 18px;overflow-y:auto;flex:1}
.pp-db .err{margin:0 0 14px}
.pp-owner{background:var(--navy-soft);border:1px solid #CFDBE7;border-radius:10px;padding:12px 14px;
  font-size:12.5px;color:var(--ink-2);line-height:1.5;margin:0 0 16px}
.pp-owner b{display:block;color:var(--ink);font-size:13px;margin-bottom:2px}
.pp-note{background:var(--surface-2);border:1px solid var(--rule-2);border-radius:10px;
  padding:10px 12px;font-size:12.5px;color:var(--ink-2);margin:0 0 16px}
.pp-sec{margin:0 0 18px}
.pp-sec > select{width:100%}
.pp-sec .hint{margin:6px 0 0}
.pp-lab{font-size:11.5px;font-weight:700;text-transform:uppercase;letter-spacing:.07em;color:var(--ink-3);
  margin:0 0 8px}
.pp-sublab{font-size:12px;font-weight:700;color:var(--ink-2);margin:14px 0 6px}
.pp-arow{display:flex;align-items:center;gap:10px;padding:8px 10px;border:1px solid var(--rule-2);
  border-radius:8px;margin:0 0 6px;background:var(--surface)}
.pp-arow.held{border-color:#B9CCE0;background:var(--navy-soft)}
.pp-arow select{flex:0 0 132px;width:132px}
.pp-acheck{display:flex;align-items:flex-start;gap:9px;flex:1;min-width:0;cursor:pointer}
.pp-acheck input{margin:3px 0 0;width:16px;height:16px;flex:0 0 16px;accent-color:var(--navy)}
.pp-acheck > span{display:flex;flex-direction:column;min-width:0}
.pp-acheck b{font-size:13.5px;font-weight:700;color:var(--ink)}
.pp-asub{font-size:11.5px;color:var(--ink-3);line-height:1.35}
.pp-facts{display:grid;grid-template-columns:auto 1fr;gap:4px 14px;margin:0;font-size:12.5px}
.pp-facts dt{color:var(--ink-3)}
.pp-facts dd{margin:0;color:var(--ink-2)}
.pp-df{display:flex;flex-wrap:wrap;gap:8px;padding:14px 18px;border-top:1px solid var(--rule-2)}
.pp-df .btn.primary{flex:1 0 100%}
@media (max-width:1100px){
  .pp-wrap{grid-template-columns:minmax(0,1fr)}
  .pp-drawer{position:static;max-height:none}
  .pp-idle{display:none}
}
@media (max-width:700px){
  .pp-tiles{gap:8px}
  .pp-tile{padding:10px 12px}
  .pp-tn{font-size:21px}
  .pp-tn .pp-tsm{font-size:14px}
  .pp-tl{font-size:10.5px}
  .pp-ts{display:none}
  /* The table becomes one card per person: who, then role, access and when last in. */
  .pp-table thead{display:none}
  .pp-table,.pp-table tbody,.pp-table tr,.pp-table td{display:block;width:100%}
  .pp-table tr{border-top:1px solid var(--rule-2);padding:10px 14px}
  .pp-table td{border:0;padding:3px 0}
  .pp-table td[data-label]{display:flex;gap:10px;align-items:baseline;padding-left:44px}
  .pp-table td[data-label]::before{content:attr(data-label);flex:0 0 78px;font-size:11px;
    font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--ink-3)}
  .pp-table td.pp-budget{display:none}
  .pp-arow{padding:8px}
  .pp-arow select{flex:0 0 112px;width:112px}
  .pp-df .btn{flex:1 0 100%}
}

/* ---------- the Matrix (2.133.0) ----------
   The canvas's Matrix board: the grid in a card with the save bar across its top, the panel,
   key and tips beside it. Role fills run dark to light with rank, so the strongest seat reads
   first; a square that comes through a region or All states is drawn lighter with a dashed
   edge and a marker, never in a role's own fill. Amber is a change not yet saved, red is why
   nothing was. */
.pp-views{display:inline-flex;gap:4px;padding:4px;border-radius:10px;background:var(--rule-2);margin:0 0 14px}
.pp-view{height:34px;padding:0 14px;border:0;border-radius:7px;background:none;color:var(--ink-2);
  font:inherit;font-weight:600;cursor:pointer}
.pp-view.on{background:var(--surface);color:var(--ink);font-weight:700;box-shadow:0 1px 2px rgba(15,45,74,.12)}
.mx-narrow{display:none}
.mx-tools{display:flex;flex-wrap:wrap;align-items:center;gap:10px;margin:0 0 14px}
.mx-tools .pp-search{flex:0 1 280px}
.mx-chips{display:flex;flex-wrap:wrap;gap:6px}
.mx-chip{height:34px;padding:0 12px;border-radius:999px;border:1px solid var(--rule);background:var(--surface);
  color:var(--ink-2);font:inherit;font-size:13px;font-weight:700;cursor:pointer}
.mx-chip.on{background:var(--navy);border-color:var(--navy);color:#fff}
.mx-wrap{display:grid;grid-template-columns:minmax(0,1fr) 280px;gap:18px;align-items:start}
.mx-card{overflow:hidden}
.mx-bar{display:flex;flex-wrap:wrap;align-items:center;gap:10px 12px;padding:12px 16px;
  border-bottom:1px solid var(--rule-2);background:var(--surface)}
.mx-bar.pend{background:var(--warn-bg);border-bottom-color:var(--warn-rule)}
.mx-bar.bad{background:#FEF3F2;border-bottom-color:#F1C4BF}
.mx-bar.ok{background:#F0FDF4;border-bottom-color:#BBF7D0}
.mx-bt{flex:1 1 300px;min-width:0;display:flex;flex-direction:column;gap:2px;font-size:13px;color:var(--ink-2)}
.mx-bt b{font-size:14px;color:var(--ink)}
.mx-bar.pend .mx-bt b{color:var(--warn-ink)}
.mx-bar.bad .mx-bt b{color:#912018}
.mx-bar.ok .mx-bt b{color:var(--sup-ink)}
.mx-scroll{overflow-x:auto;padding:4px 12px 12px}
.mx-none{padding:40px 24px 44px}
.mx-none p{max-width:520px;margin:6px auto 0;line-height:1.55}
.mx-none-acts{display:flex;gap:8px;justify-content:center;flex-wrap:wrap;margin-top:18px}
.mx-none-acts .hint{margin:0;max-width:420px}
.mx{border-collapse:separate;border-spacing:3px 3px;min-width:100%}
.mx th,.mx td{padding:0;text-align:center;white-space:nowrap}
.mx thead th{font-size:11px;font-weight:800;letter-spacing:.08em;color:var(--ink-3)}
.mx .mx-regions th{color:var(--civic-ink);text-transform:uppercase;letter-spacing:.12em;
  border-bottom:2px solid var(--civic);padding:6px 0 3px}
.mx .mx-ph{text-align:left;text-transform:uppercase;letter-spacing:.1em}
.mx tbody th,.mx tfoot th{text-align:left;font-weight:400;background:none;border:0}
.mx tbody th{text-transform:none;letter-spacing:normal;font-size:14px;color:var(--ink)}
.mx tbody tr.off .mx-who{opacity:.55}
.mx-who{display:flex;align-items:center;gap:10px;min-width:190px;max-width:220px;padding:2px 6px 2px 0}
.mx-who .pp-av{flex-basis:30px;width:30px;height:30px;font-size:11px}
.mx-nm{display:flex;flex-direction:column;min-width:0;line-height:1.25}
.mx-nm b{font-weight:700;color:var(--ink);overflow:hidden;text-overflow:ellipsis}
.mx-nm span{font-size:11px;color:var(--ink-3);overflow:hidden;text-overflow:ellipsis}
.mx-col{width:58px;height:30px;border-radius:6px;border:1px solid var(--rule-2);background:var(--surface);
  color:var(--ink);font:inherit;font-size:12px;font-weight:800;letter-spacing:.06em;cursor:pointer}
.mx-col.on{border-color:var(--civic);background:var(--civic-soft)}
.mx tfoot th{font-size:11px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-3);
  padding-top:8px}
.mx tfoot td{font-weight:800;font-variant-numeric:tabular-nums;padding-top:8px}
.mx tfoot td.zero{color:var(--bad)}
.mx-sq{position:relative;display:inline-flex;align-items:center;justify-content:center;width:58px;height:36px;
  box-sizing:border-box;border-radius:8px;border:1px solid transparent;font:inherit;font-size:12px;
  font-weight:700;cursor:pointer;padding:0}
.mx-sq.r-admin{background:#0F2D4A;color:#fff}
.mx-sq.r-super-user{background:#31527A;color:#fff}
.mx-sq.r-editor{background:#C9D8E8;color:#0F2D4A}
.mx-sq.r-custom{background:#EAF1FE;color:#1D4ED8;border-color:#C9DAFB}
.mx-sq.r-viewer{background:#F3F4F6;color:#334155;border-color:#CBD2DA}
.mx-sq.r-none{background:#fff;color:#94A3B8;border:1px dashed #CBD2DA}
.mx-sq.inh{background:#F4F8FC;color:#0F2D4A;border:1px dashed #8FB1D6}
.mx-sq.inh::after{content:"";position:absolute;top:4px;right:5px;width:6px;height:6px}
.mx-sq.via-region::after{border-radius:50%;background:var(--civic)}
.mx-sq.via-all::after{border-radius:1px;background:var(--navy)}
.mx-sq.chg{border:2px solid #B45309}
.mx-sq.r-none.chg,.mx-sq.inh.chg{background:#FFFBEB}
.mx-sq.bad{border:2px solid #B42318;background:#FEF3F2;color:#912018}
.mx-sq.locked{cursor:not-allowed;opacity:.8}
.mx-sq.sel{outline:2px solid var(--civic);outline-offset:1px}
.mx-sq:focus-visible{outline:2px solid var(--civic);outline-offset:1px}
.mx-side{display:flex;flex-direction:column;gap:14px;position:sticky;top:calc(var(--band) + 16px)}
.mx-panel{padding:16px}
.mx-panel h2{margin:0 0 6px;font-size:15px}
.mx-panel .hint{margin:0 0 10px;font-size:13px}
.mx-panel .err{margin:0 0 10px}
.mx-roles{display:flex;flex-direction:column;gap:6px;margin:0 0 10px}
.mx-panel .mx-gone{margin-top:6px;color:var(--opp-ink)}
.mx-role{display:flex;align-items:center;justify-content:space-between;gap:10px;min-height:40px;padding:0 12px;
  border-radius:8px;border:1px solid var(--rule);background:var(--surface);color:var(--ink);font:inherit;
  font-weight:700;text-align:left;cursor:pointer}
.mx-role span{font-size:12px;font-weight:600;color:var(--ink-3)}
.mx-role.on{background:var(--navy);border-color:var(--navy);color:#fff}
.mx-role:disabled{color:#94A3B8;cursor:not-allowed}
.mx-key{padding:16px;display:flex;flex-direction:column;gap:8px;font-size:13px}
.mx-key h2{margin:0 0 2px;font-size:15px}
.mx-key div{display:flex;align-items:center;gap:10px}
.mx-key .mx-sq{width:56px;height:26px;font-size:11px;cursor:default;flex:none}
.mx-tips{padding:14px 16px;border-radius:12px;background:var(--navy);color:#fff;font-size:13px}
.mx-tips p{margin:6px 0 0;color:#C9D6E3}
/* ---------- the Map (2.135.0) ----------
   As the canvas draws it: the people on the left, All states as a navy band, then a column per
   region with its whole-region strip and a card per state. Chips are pills with initials; a held
   change is outlined amber, a taken-away one struck through, a refused one red. */
.mp-wrap{display:grid;grid-template-columns:280px minmax(0,1fr);gap:18px;align-items:start}
.mp-side{display:flex;flex-direction:column;gap:14px;position:sticky;top:calc(var(--band) + 16px)}
.mp-pool{padding:16px;display:flex;flex-direction:column;gap:10px}
.mp-pool h2{margin:0;font-size:15px}
.mp-pool .pp-search{flex:none}
.mp-pool h2 span{font-weight:500;color:var(--ink-3)}
.mp-list{display:flex;flex-direction:column;gap:6px;max-height:calc(52vh / var(--zoom));overflow:auto;padding:2px}
.mp-person{display:flex;align-items:center;gap:10px;width:100%;padding:7px 10px 7px 6px;
  border:1px solid var(--rule);border-radius:10px;background:var(--surface);color:var(--ink);
  font:inherit;text-align:left;cursor:grab}
.mp-person .pp-av{flex:none;width:28px;height:28px;font-size:11px}
.mp-person.sel{border-color:var(--civic);box-shadow:0 0 0 2px var(--civic-soft)}
.mp-person.chg{border-color:var(--warn)}
.mp-person.locked{cursor:default}
.mp-person.locked .mp-grip{visibility:hidden}
.mp-person.off{opacity:.55}
.mp-grip{flex:none;color:#94A3B8}
.mp-pn{display:flex;flex-direction:column;min-width:0;line-height:1.25}
.mp-pn b{font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.mp-pn span{font-size:11px;color:var(--ink-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.mp-keys{margin:0;padding:10px;border-radius:8px;background:#F8FAFC;font-size:12px;color:var(--ink-2)}
.mp-main{min-width:0;display:flex;flex-direction:column;gap:16px}
.mp-all{display:flex;flex-wrap:wrap;align-items:center;gap:10px 16px;padding:14px 16px;border-radius:12px;
  background:var(--navy);color:#fff;border:2px solid transparent}
.mp-all-h h2{margin:0;font-size:15px;color:#fff}
.mp-all-h span{font-size:12px;color:#C9D6E3}
.mp-all .mp-empty{color:#C9D6E3}
.mp-regions{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:14px;align-items:start}
.mp-reg{display:flex;flex-direction:column;gap:10px;padding:14px;border:1px solid var(--rule);
  border-radius:12px;background:var(--surface)}
.mp-reg-h{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}
.mp-reg-h h2{margin:0;font-size:16px}
.mp-reg-h span{font-size:12px;color:var(--ink-3)}
.mp-whole{padding:10px;border-radius:8px;background:var(--civic-soft);border:2px solid transparent}
.mp-lab{font-size:11px;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:var(--civic-ink)}
.mp-state{padding:10px;border:1px solid var(--rule);border-radius:8px}
.mp-state-h{display:flex;justify-content:space-between;gap:8px}
.mp-state-h span{font-size:12px;color:var(--ink-3);text-align:right}
.mp-chips{display:flex;flex-wrap:wrap;gap:6px;margin-top:6px}
.mp-all .mp-chips{margin-top:0}
.mp-empty{font-size:12px;color:var(--ink-3)}
.mp-nostates{margin:0}
.mp-chip{display:inline-flex;align-items:center;gap:6px;padding:3px 8px 3px 3px;border:1px solid var(--rule);
  border-radius:999px;background:var(--surface);color:var(--ink);font:inherit;font-size:12px;font-weight:600;
  cursor:grab}
.mp-chip .mp-av{width:22px;height:22px;border-radius:50%;background:var(--navy-soft);display:flex;
  align-items:center;justify-content:center;font-size:10px;font-weight:800}
.mp-chip .mp-role{color:var(--ink-3);font-weight:500}
.mp-chip.dark{background:var(--navy-2);color:#fff;border-color:transparent}
.mp-chip.dark .mp-av{background:#fff;color:var(--navy)}
.mp-chip.dark .mp-role{color:#A9B8C9}
.mp-chip.chg{border:2px solid var(--warn);padding:2px 7px 2px 2px;background:var(--warn-bg);color:var(--ink)}
.mp-chip.chg .mp-role{color:var(--warn-ink)}
.mp-chip.gone{border:1px dashed #94A3B8;background:transparent;opacity:.7;cursor:pointer}
.mp-chip.dark.gone{color:#C9D6E3}
.mp-chip.gone .mp-cn{text-decoration:line-through}
.mp-chip.bad{border:2px solid #B42318;background:#FEF3F2;color:#912018}
.mp-chip.locked{cursor:default}
.mp-chip.off{opacity:.55}
.mp-chip.sel{outline:2px solid var(--civic);outline-offset:1px}
.mp-chip:focus-visible,.mp-person:focus-visible{outline:2px solid var(--civic);outline-offset:1px}
.mp-hint{display:none;font-size:12px;font-weight:700;margin-top:6px}
.mp-over{border:2px dashed #22C55E!important;background:#F4FBF6!important;color:var(--ink)}
.mp-over .mp-hint{display:block;color:var(--navy)}
.mp-no .mp-hint{display:block;font-weight:600;color:var(--ink-3)}
.mp-all.mp-no .mp-hint{color:#C9D6E3}
.mp-all.mp-over .mp-all-h h2{color:var(--navy)}
.mp-all.mp-over .mp-all-h span,.mp-all.mp-over .mp-empty{color:var(--ink-3)}
.placing.mp-all,.placing.mp-whole,.placing.mp-state{cursor:pointer;border:2px dashed #8FB1D6}
.mp-here{display:inline-flex;align-items:center;margin-top:8px;height:30px;padding:0 12px;border-radius:7px;
  border:1px solid var(--navy);background:var(--mint);color:var(--navy);font:inherit;font-size:12px;
  font-weight:700;cursor:pointer}
.mp-here:focus-visible{outline:2px solid var(--civic);outline-offset:2px}
.mp-add{display:flex;align-items:center;height:38px;padding:0 10px;border:1px dashed #CBD2DA;border-radius:8px;
  background:none;color:var(--ink-2);font:inherit;font-weight:700;cursor:pointer;text-align:left}
.mp-placing{border:2px solid var(--civic)}
.mx-role span{font-size:11px;font-weight:600;color:var(--ink-3)}
.mx-role.mp-take{color:var(--opp-ink)}
@media (max-width:1100px){
  .mx-wrap{grid-template-columns:minmax(0,1fr)}
  .mx-side{position:static}
  .mp-wrap{grid-template-columns:minmax(0,1fr)}
  .mp-side{position:static}
}
@media (max-width:700px){
  .mx-wide{display:none}
  .mx-narrow{display:block}
  /* The switch too: a tab that only says it cannot be used here is not worth a place. */
  .pp-views{display:none}
}

@media print{
  .rail,.topbar,#toasts,#modal-root,.datestrip{display:none!important}
  /* a folded section still prints, since paper has no fold */
  .fold.shut .foldbody{display:block!important}
  .chev{display:none}
  .page{padding:0}
  body{background:#fff}
  /* When a list has been prepared for printing, that is all that prints. */
  body.printing .shell{display:none!important}
  body.printing #printarea{display:block}
  .pr-doc{padding:0;color:#000;font-size:9.5pt}
  .pr-head{display:flex;justify-content:space-between;align-items:flex-start;gap:20px;
    border-bottom:2px solid #17262F;padding-bottom:9px;margin-bottom:11px}
  .pr-org{font-size:8.5pt;letter-spacing:.04em;text-transform:uppercase;color:#405663}
  .pr-title{font-family:inherit;font-size:22pt;line-height:1.05;margin:2px 0 0}
  .pr-sub{font-size:9pt;color:#405663;margin-top:3px}
  .pr-meta{text-align:right;font-size:8.5pt;color:#405663;white-space:nowrap}
  .pr-summary{font-size:9pt;background:#F2F5F6;border:1px solid #D5DCE1;border-radius:4px;
    padding:7px 10px;margin-bottom:11px}
  .pr-table{width:100%;border-collapse:collapse;font-size:8.5pt}
  .pr-table th{background:#17262F;color:#fff;text-align:left;padding:5px 6px;
    font-weight:600;border:.5pt solid #17262F}
  .pr-table td{padding:4px 6px;border:.5pt solid #C9D2D8;vertical-align:top}
  .pr-table tbody tr:nth-child(even) td{background:#F6F8F9}
  .pr-table th.num,.pr-table td.num{text-align:right}
  .pr-table thead{display:table-header-group}   /* repeat the header on every page */
  .pr-table tr{page-break-inside:avoid}
  .pr-empty{font-size:10pt;color:#405663}
  .pr-foot{margin-top:14px;padding-top:6px;border-top:.5pt solid #C9D2D8;
    font-size:7.5pt;color:#6D818C}

  /* the meeting worksheet: a block a member */
  .ws-card{border:.7pt solid #C9D2D8;border-radius:4px;margin-bottom:9pt;page-break-inside:avoid}
  .ws-top{background:#F6F8F9;border-bottom:.7pt solid #C9D2D8;padding:5pt 8pt;
    display:flex;align-items:baseline;gap:8pt}
  .ws-name{font-weight:700;font-size:12pt}
  .ws-who{font-size:8.5pt;color:#6D818C}
  .ws-score{margin-left:auto;font-weight:700;font-size:9pt}
  .ws-facts{display:flex;gap:0;padding:6pt 8pt 5pt;border-bottom:.5pt solid #C9D2D8}
  .ws-facts > div{flex:1;min-width:0;padding-right:6pt}
  .ws-lab{display:block;font-size:6.5pt;letter-spacing:.05em;text-transform:uppercase;color:#6D818C}
  .ws-val{display:block;font-size:8.5pt;margin-top:1pt;overflow:hidden;white-space:nowrap;
    text-overflow:ellipsis}
  .ws-capture{padding:6pt 8pt;display:flex;align-items:center;gap:6pt;flex-wrap:wrap}
  .ws-capture .ws-lab{display:inline;margin-right:2pt}
  .ws-rule{display:inline-block;border-bottom:.5pt solid #BEC7CE;height:9pt}
  .ws-date{width:78pt;margin-right:8pt}
  .ws-box{display:inline-flex;align-items:center;gap:3pt;font-size:7.5pt;margin-right:5pt}
  .ws-box i{display:inline-block;width:8pt;height:8pt;border:.6pt solid #A0ACB4;position:relative}
  .ws-box.now{font-weight:700;color:#0F2D4A}
  .ws-box.now i{border:1pt solid #0F2D4A}
  /* the check mark, drawn from two borders so it prints without relying on a glyph */
  .ws-box i.mark::after{content:"";position:absolute;left:2.4pt;top:.4pt;width:2.4pt;height:5pt;
    border:solid #0F2D4A;border-width:0 1.2pt 1.2pt 0;transform:rotate(45deg)}
  .ws-hint{font-size:6.5pt;color:#6D818C;margin-left:2pt}
  .ws-notes{padding:0 8pt 7pt}
  .ws-line{display:block;border-bottom:.4pt solid #D7DEE3;height:14pt}
  a[href]:after{content:none!important}
}
@page{size:letter landscape;margin:14mm}

/* ---------- work typed in and not saved ----------
   A bar rather than a dialog: the two ways on are on it, and it does not take
   the form away to ask. Above the bottom bar on a phone, which is what
   --mm-rail measures. */
.pending{
  position:fixed; left:12px; right:12px; bottom:calc(14px + var(--mm-rail, 0px));
  z-index:60; display:flex; gap:10px; align-items:center; flex-wrap:wrap;
  padding:11px 13px; border-radius:10px;
  background:var(--warn-bg, #FFF6E5); color:var(--ink-1, #1A1A1A);
  border:1px solid var(--warn-rule, #E8C98A);
  box-shadow:0 6px 20px rgba(0,0,0,.14); font-size:13.5px;
}
.pending[hidden]{ display:none; }
.pending .pending-acts{ margin-left:auto; display:flex; gap:8px; }
@media (max-width:700px){
  .pending{ font-size:13px; }
  .pending .pending-acts{ margin-left:0; width:100%; }
  .pending .pending-acts .btn{ flex:1; }
}

/* ---------- a company's history, on its Companies page ---------- */
.co-hist-chips{ display:flex; flex-wrap:wrap; gap:6px; margin:0 0 6px }
.co-hist-chip{ cursor:pointer; background:var(--surface); border-color:var(--rule); color:var(--ink-2);
  min-height:30px; padding:4px 11px; font:inherit; font-size:12px; font-weight:600 }
.co-hist-chip.on{ background:var(--civic); border-color:var(--civic); color:#fff }
.co-hist{ list-style:none; margin:4px 0 0; padding:0 }
.co-hist li{ display:flex; gap:12px; padding:8px 0; border-top:1px solid var(--rule-2); font-size:13px }
.co-hist-when{ flex:0 0 96px; color:var(--ink-3) }
.co-hist-what{ flex:1; min-width:0; display:flex; flex-direction:column; gap:2px }

/* ---------- closing a company (2.128.0) ----------
   Two choices, each a whole row to tap, and the deletion date said in the danger color so
   it is not read past. */
.co-close-choice{ display:flex; flex-direction:column; gap:8px }
.co-choice{ display:flex; gap:10px; align-items:flex-start; padding:10px 12px; cursor:pointer;
  border:1px solid var(--rule); border-radius:8px }
.co-choice input{ margin-top:3px }
.co-choice > span{ display:flex; flex-direction:column; gap:3px }
.co-choice.off{ opacity:.6; cursor:not-allowed }
.co-del-warn{ margin:0 0 10px; color:var(--bad) }

/* ---------- a company's own logo: the upload widget ----------
   The tiles are the two grounds the logo is drawn on, so what is previewed is what shows. */
.logo-row{ display:flex; flex-wrap:wrap; gap:14px; align-items:center; padding:10px 0;
  border-top:1px solid var(--rule-2) }
.logo-row:first-child{ border-top:0 }
.logo-tile{ flex:0 0 220px; height:72px; border-radius:8px; display:flex; align-items:center;
  justify-content:center; border:1px solid var(--rule); overflow:hidden }
.logo-tile.dark{ background:#0b2440 }
.logo-tile.light{ background:#fff }
.logo-tile img{ max-height:30px; max-width:190px; width:auto; height:auto }
.logo-tile span{ font-size:12px; color:#8a99a9 }
.logo-meta{ flex:1 1 220px; display:flex; flex-direction:column; gap:4px; min-width:0 }
.logo-acts{ display:flex; gap:8px; margin-top:4px }
.logo-said{ min-height:1em }
.logo-warn{ margin:0 0 10px; padding:9px 12px; border:1px solid var(--warn); border-radius:8px;
  font-size:12.5px; color:var(--ink-2) }
.logo-warn p{ margin:0 }
.logo-specs{ margin-top:14px; padding-top:10px; border-top:1px solid var(--rule-2); font-size:12.5px;
  color:var(--ink-2) }
.logo-specs-h{ margin:0 0 4px; font-weight:700; color:var(--ink) }
.logo-specs ul{ margin:0; padding-left:18px; display:flex; flex-direction:column; gap:3px }
.co-logos{ margin-top:16px }

/* A committee chip is pressable: it filters the roster to that committee (2.180.0).
   Scoped to the class rather than to `.chip`, because a stylesheet shares one namespace
   (2.153.2) and plenty of chips are not buttons. `font:inherit` because a button does not
   inherit the chip's type the way a span does. */
/* **A chip is a `<button>`, and a button centers and wraps its own text.** 2.180.0
   made it one so it takes the keyboard and says it is pressable; nothing then told
   it not to behave like a button, so in a narrow column every committee became a
   three-line centered block and a name broke mid-word. Neither was chosen, which
   is why it reads as a fault rather than a decision. A chip is one line now and
   the cell wraps between chips instead.
   And it carries its own surface: the theme redefines `.chip` to `--surface`,
   which is white on a white card, so the committees drew as bare centered text
   rather than as chips at all. Scoped to `.chipbtn`, which only the committee
   chip wears, because a stylesheet shares one namespace (2.153.2, 2.183.0). */
.chipbtn{font:inherit;cursor:pointer;border:1px solid var(--rule);
  background:var(--surface-2);text-align:left;white-space:nowrap;
  max-width:100%;overflow:hidden;text-overflow:ellipsis;vertical-align:top}
.chipbtn:hover{border-color:var(--line);filter:brightness(.97)}
.chipbtn:focus-visible{outline:2px solid var(--mint);outline-offset:1px}

/* Committee boxes grouped by chamber, where a state names a committee in both (2.180.0). */
.comgrp{margin:0 0 6px}
.comgrp-h{font-size:11px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;
  color:var(--muted);margin:4px 0 3px}

/* The committees card on Settings is a table in `.tw` like every other card on this
   page, so it needs no layout of its own (2.183.1). What it had -- a grid, a flex row and
   a ruled-off block -- was a shape nothing else here has, and three of its four faults
   were in that CSS. The worst of them is why this comment stays: the list was called
   `.cmlist`, which **the comment thread has owned since comments were written**, and
   being the later rule it won, so every comment list on every bill and member page drew
   as a grid of columns. A stylesheet shares one namespace (2.153.2), and the surest way
   not to collide is to add no name at all. */
.hint.sm{font-size:11px}

/* ---------- work saved on the phone with nowhere to go (2.193.0) ----------
   Prefixed `ob-`, a stylesheet sharing one namespace (2.153.2, 2.183.0). Waiting is the
   attention ink -- a thing to know, not a refusal -- and a refused one is the opposite
   ink, because that one is a refusal and somebody has to act on it. */
.ob{ display:grid; gap:8px; margin:0 0 14px }
.ob-row{ display:flex; align-items:center; gap:10px; flex-wrap:wrap;
         padding:10px 12px; border-radius:10px; font-size:14px;
         border:1px solid var(--warn-ink); color:var(--warn-ink);
         background:rgba(180,120,10,.06) }
.ob-row > span{ flex:1 1 180px; font-size:13px; opacity:.9 }
.ob-row .btn{ flex:0 0 auto }
.ob-no{ border-color:var(--opp); color:var(--opp-ink); background:rgba(190,40,40,.06) }

/* ---------- notifications on a phone (2.192.0) ----------
   Everything here is prefixed `pu-`, because a stylesheet shares one namespace
   (2.153.2, 2.183.0) and `.jump` and `.cmlist` are what happens when it does not.
   The reason a push did not land is in the attention ink rather than the persuadable
   violet, the distinction 2.131.0 draws: it is a thing to know, not a refusal. */
.pu-on{ margin:0 0 10px; font-size:14px }
.pu-acts{ display:flex; gap:8px; flex-wrap:wrap }
.pu-why{ color:var(--warn-ink); font-size:12px; line-height:1.4; margin-top:2px }
.pu-kinds{ display:grid; gap:2px }
.pu-kind{ display:flex; align-items:flex-start; gap:9px; padding:8px 10px;
          border-radius:8px; cursor:pointer }
.pu-kind:hover{ background:rgba(15,45,74,.04) }
.pu-kind input{ margin:2px 0 0; flex:0 0 auto }
.pu-kind > span{ display:flex; flex-direction:column; gap:1px; font-size:14px }
.pu-kind .hint{ font-size:12px; line-height:1.4 }

/* ---------- the Home Screen app: the camera, the corners and the home indicator (2.186.0) ----------
   Opened from the Home Screen there is no Safari around the page: it starts at the very top of
   the glass with the clock, the camera housing and the home indicator drawn over it
   (viewport-fit=cover and the black-translucent status bar ask for exactly that). Each of
   those is an inset the system reports, and anything the page puts in one is under the
   hardware. The phone's top and bottom bars already took theirs; what this block adds is the
   rest, found by rendering every tier with the insets set:

     - the sign-in screen's header sat under the Dynamic Island;
     - on an iPad, upright and on its side, the band and the rail's mark sat under the clock,
       because only the phone tier asked for the inset;
     - on a phone turned on its side the page, the dialogs and the menu ran under the camera,
       because only the two bars asked for the side insets.

   It sits last because the theme and the short-screen block above set the same properties at
   the same weight, and of two rules that weigh the same the later one wins. Every value is
   the old one plus the inset, which is nought on a desk, so nothing moves anywhere there is
   no hardware in the way. */
/* The rail's own way to the drawer. Absent everywhere else: on a desk the rail carries its
   whole foot, and on a phone the bar's own More opens the same drawer. */
.railmore{display:none;flex-direction:column;align-items:center;justify-content:center;gap:2px;
  width:100%;min-height:48px;margin:0 0 8px;padding:6px 4px;background:none;border:0;
  border-radius:8px;color:var(--ink-3);font-size:10.5px;font-weight:600;cursor:pointer;
  -webkit-tap-highlight-color:transparent}
.railmore:hover{background:var(--ground);color:var(--navy)}
.railmore:active{background:var(--ground)}

/* **Declared above the query that shows it**, or the base rule wins: two rules of the same
   weight are decided by which comes later, and `display:none` after `display:flex` is the
   2.153.2 fault with its sign reversed -- caught by the suite rather than by reading. */

/* ---------- text size (2.199.0) ----------
   `docs/design/mobile-next.md` item 10, settled 2026-10-19: **the setting, not following
   iOS.** Standard / Large / Larger, kept with the person's own preferences and applied as a
   scale -- which is what lets it happen without touching the four hundred and ninety-odd
   sizes this stylesheet sets, nearly all of them in px. Following `-apple-system-body` and
   putting every size in `rem` is the other half of the note and is a pass over the whole
   file; it is worth doing only if this is used, which is the note's own recommendation.

   **`zoom`, not a font size**, because the thing somebody wants at arm's length is a bigger
   row rather than bigger letters in a 30 point box: zoom scales the padding, the icon and
   the tap target with the word, so nothing is cramped at Larger. And not `transform`, which
   would take fixed positioning and scrolling with it.

   **The page and dialogs, never the chrome, and that is a decision rather than an
   oversight.** The top bar and the bottom bar are sized so the whole lot fits at 390 points
   -- the compact tier's own comment -- so scaling them by a third is how a control goes off
   the edge of a phone, which is the opposite of an accessibility setting. Their own sizes are
   already at the larger end (a 17 to 23 point title, 44 point targets), and the item's two
   tests -- no top-bar button under 44, the bottom bar still fits at 375 -- are kept by
   construction rather than by luck.

   **1 is the default, so Standard is byte for byte what shipped.** `calc(X / 1)` is X;
   absent means exactly as before, the rule every gate in this product follows. */
:root{--zoom:1}
:root[data-text-size="large"]{--zoom:1.15}
:root[data-text-size="larger"]{--zoom:1.3}
/* **Declared on the components themselves, below, rather than in rules of their own**: a
   class defined twice at top level is what `tests/home-screen.js` refuses (2.193.5), and it
   refused this -- `.modal` would have been the twelfth name on that list for no reason but
   tidiness. The help panel needs no entry of its own, being an `openModal`. */

/* ---------- the rail on an upright iPad (2.198.0) ----------
   `docs/design/mobile-next.md` item 6. Every page in view down a 104 point column: the icon
   over its short name, the names being `RAIL_SHORT`'s -- the one list, which 2.197.0 settled
   is a list of names rather than of abbreviations. **Icons alone was the other option and is
   refused**: there is no hover on a tablet and iOS does not show `title` on a long press, so
   a column of a dozen unlabelled glyphs is a guess per tap.

   It sits here, after the theme, because the theme sets the rail's padding, the item's size
   and the icon's size at the same weight and of two rules that weigh the same the later one
   wins -- the reason the short-screen and safe-area blocks are where they are. */
@media (min-width:701px) and (max-width:1194px) and (orientation:portrait){
  /* The mark stays the mark: white label swaps this image for the company's own, so nothing
     here may substitute a different picture -- our square icon in a customer's rail would be
     the opposite leak from the one 2.127.0 closed. A logo may be as wide as 10:1
     (`ART.checkLogo`), so the width is what is bounded and the height follows. */
  .rail-top{padding:0 8px 10px;text-align:center}
  .rail-top .brandhome{margin:0;padding:0}
  .rail-top .boyd{height:auto;max-height:16px;max-width:100%;width:auto;margin:0 auto}
  /* **Which state you are in stays, and that is a correction the suite made.** The first
     draft hid the whole of the rail's top on the reasoning that the state is in the top
     bar's chooser -- and `.projsel` is hidden below 821 points, so on a mini and an iPad 11
     upright the state would have been named **nowhere**, which is how somebody works in the
     wrong campaign. It is the one thing on this rail that is not a page, so it keeps its
     place: small, centred, and wrapping, because a company's state can be called *Test
     Public Affairs — NV*.
     `Government Affairs` goes, being the fixed phrase the top bar's crumb says by default;
     CONFIDENTIAL stays, because a confidentiality marker is not this tier's to drop. */
  .rail-mark{display:none}
  .rail-sub{font-size:9.5px;line-height:1.3;margin-top:6px;white-space:normal}
  .rail-conf{margin-top:8px;font-size:8px;padding:2px 4px;letter-spacing:.04em}

  .rail-nav{padding:8px 6px}
  /* Icon over label, the tablet shape. 48 tall, which is past the 44 point target. */
  .navitem{flex-direction:column;gap:3px;padding:7px 4px;min-height:48px;justify-content:center;
    text-align:center;font-size:10.5px;font-weight:600;line-height:1.15;border-radius:8px;
    position:relative}
  .navitem .nl{max-width:100%}
  .navicon{width:22px;height:22px;flex:0 0 22px}
  /* A count beside a 10 point label would take the room the label needs, so it goes to the
     corner of the icon -- the same figure, out of the way of the word. */
  .navitem .ct{position:absolute;top:4px;right:6px;margin:0;font-size:10px;font-weight:700}

  /* The foot: the live dot without its word, and the way to everything the drawer holds. */
  .rail-foot{padding:10px 6px 14px;text-align:center}
  .railmore{display:flex}
  .rail-foot #whoami,.rail-foot #whoson,.rail-foot label[for="refresh"],
  .rail-foot #refresh{display:none}
  .live{justify-content:center;gap:0;margin:0 0 8px}
  .live #livetext{display:none}
  /* **The one credit white label does not remove**, so it is not something this tier may
     hide -- it is a condition of the data grant, not decoration. Narrow and wrapping rather
     than gone. */
  .credit{font-size:9.5px;line-height:1.35;margin:0}

  /* **Found by rendering it, and the fault is older than this release.** 2.186.0 took the
     bar's controls to Apple's 44 points at the compact tier and this tier kept 40, so the
     search and help buttons were under a finger's size on the one device item 6 is named
     for -- an upright iPad is tapped, not clicked, which is the whole premise.

     Two of the same class are **named rather than changed**, because neither is this tier's
     and each needs its own reproduction: the account avatar is 34 at *every* size, phone
     included; and a tablet on its *side* keeps 40, because it is served by the laptop's
     block and the `hover:none` rule that would cover every touch device sits in a query
     `tests/cascade.js` deliberately cannot read -- so fixing it there would be a fix no
     check could see. Both are in the design note. */
  .findbtn,.helpbtn{width:44px;height:44px;flex:0 0 44px}
}


:root{--sat:env(safe-area-inset-top,0px);--sab:env(safe-area-inset-bottom,0px);
  --sal:env(safe-area-inset-left,0px);--sar:env(safe-area-inset-right,0px)}

/* The sign-in screen: the band takes the status bar's room as padding, as the app's does. */
.gate-head{height:auto;flex:0 0 auto;min-height:calc(var(--band) + var(--sat));padding-top:var(--sat);
  padding-left:calc(clamp(18px,3vw,40px) + var(--sal));padding-right:calc(clamp(18px,3vw,40px) + var(--sar))}
.gate-main{padding-left:calc(clamp(20px,4vw,56px) + var(--sal));
  padding-right:calc(clamp(20px,4vw,56px) + var(--sar))}
.gate-foot{padding-bottom:calc(18px + var(--sab))}
@media(max-width:720px){
  .gate-head{min-height:calc(56px + var(--sat));padding-left:calc(14px + var(--sal));
    padding-right:calc(14px + var(--sar))}
  .gate-main{padding-left:calc(14px + var(--sal));padding-right:calc(14px + var(--sar))}
}

/* An iPad, either way up, and anything else above the phone tier: the band and the navy top
   of the rail grow by the status bar together, so their two ends still meet. */
@media (min-width:701px) and (orientation:portrait), (min-width:701px) and (min-height:541px){
  .topbar{padding-top:calc(10px + var(--sat));min-height:calc(var(--band) + var(--sat))}
  .rail-top{background:linear-gradient(var(--navy) 0 calc(var(--band) + var(--sat)),
      transparent calc(var(--band) + var(--sat)));
    padding-top:calc((var(--band) - 22px) / 2 + var(--sat))}
  .rail-foot{padding-bottom:calc(12px + var(--sab))}
  .pp-drawer,.mx-side,.mp-side{top:calc(var(--band) + var(--sat) + 16px)}
  .pp-drawer{max-height:calc(100vh / var(--zoom) - var(--band) - var(--sat) - 32px)}
}

/* The menu that slides in, at any size it appears: under the clock at its head, clear of the
   camera on its side. */
.drawer{padding-left:var(--sal)}
.drawer-h{padding-top:calc(16px + var(--sat))}

/* A phone, either way up. On its side the camera takes a strip off one end and the
   rounded corner a strip off the other, so the page and everything pinned over it keep in. */
@media (max-width:700px), (orientation:landscape) and (max-height:540px){
  .page{padding-left:calc(12px + var(--sal));padding-right:calc(12px + var(--sar))}
  .unsaved,#toasts,.pending,body.finding .findbox,body.finding .findwrap{
    left:calc(12px + var(--sal));right:calc(12px + var(--sar))}
  .backtop{right:calc(12px + var(--sar))}
  /* A dialog rises from the bottom as a sheet; on its side the sheet stops at the camera. */
  .scrim{padding-left:var(--sal);padding-right:var(--sar)}

  /* Forty-four points, which is a finger (Apple's own minimum). The menu button and the
     search were 34 and 40; the initials keep their size and take a wider reach around them. */
  .menubtn,.findbtn{width:44px;height:44px;min-width:44px;flex:0 0 44px}
  .menubtn{padding:0 9px}
  .acct-avatar{position:relative}
  .acct-avatar::after{content:"";position:absolute;inset:-6px;border-radius:50%}
  .topbar{gap:4px}
  .topbar-title{margin-right:4px}

  /* The counts in the menu are sizes, not alerts. The bar's rule makes a number a red badge,
     because on the bar a number is only ever work waiting; it reached the drawer too, so
     76 legislators and 65 meetings read as 141 things somebody had missed. */
  .drawer-nav .navitem .ct{position:static;margin:0;padding:0;background:none;border-radius:0;
    color:rgba(255,255,255,.72);font-size:12px;font-weight:600}
  /* And the bar's mint line over the page you are on is the bar's: in the drawer it floated
     over the middle of the row, beside the drawer's own marker down its left edge. */
  .drawer-nav .navitem[aria-current="page"]::before{content:none}

  /* What is typed in the search was navy on the navy the focused box turned: the phone's
     white box lost to the band's focus color, which is the more specific rule. */
  body.finding .find .findbox:focus{background:var(--surface);color:var(--ink)}

  /* The help mark is the last item under More on a phone (03-state.js barExtras), which is
     what gives the page's name room to be read. Still in the page, so its handler stands. */
  .helpbtn{display:none}
  /* Where the page has a way back, it takes the menu button's place: the bar along the
     bottom opens the menu already. */
  body.has-back .menubtn{display:none}
}

/* ---------- Back and More, wherever the page's buttons are drawn small (2.186.0) ----------
   The same test as the symbols they replace: a phone either way up and an upright iPad. */
.backbtn{display:none}
.moreacts{display:none}
.backbtn[hidden],.moreacts[hidden],.moremenu[hidden]{display:none}
@media (max-width:820px), (orientation:landscape) and (max-height:540px){
  .backbtn{display:inline-flex;align-items:center;justify-content:center;flex:0 0 44px;
    width:44px;height:44px;margin:0 -6px 0 -8px;padding:0;border:0;border-radius:10px;
    background:transparent;color:#fff;cursor:pointer}
  .moreacts{display:flex;position:relative;flex:0 0 auto}
  .backbtn[hidden],.moreacts[hidden]{display:none}
  .morebtn{display:inline-flex;align-items:center;justify-content:center;width:44px;height:44px;
    padding:0;border:0;border-radius:10px;background:transparent;color:#fff;cursor:pointer}
  .backbtn:active,.morebtn:active,.morebtn[aria-expanded="true"]{background:rgba(255,255,255,.16)}
  .backbtn:focus-visible,.morebtn:focus-visible{outline:2px solid #fff;outline-offset:-2px}
  .topbar-actions .btn.in-more,.topbar-actions .btn.is-back{display:none}
  /* Where the search is only its magnifier, it takes only the magnifier's room. An upright
     iPad gave it the 220 the box needs, so the symbol floated in the middle of the band. */
  .find{flex:0 0 auto}
  .moremenu{position:absolute;top:calc(100% + 8px);right:0;min-width:236px;max-width:calc(100vw - 24px);
    z-index:95;background:var(--surface);color:var(--ink);border:1px solid var(--rule-2);
    border-radius:12px;box-shadow:0 18px 44px rgba(15,45,74,.28);padding:6px 0;overflow:hidden}
  .moreitem{display:flex;align-items:center;width:100%;min-height:44px;padding:10px 16px;border:0;
    background:none;text-align:left;font:inherit;font-size:15px;font-weight:600;color:var(--ink);
    cursor:pointer}
  .moreitem:hover,.moreitem:focus-visible{background:var(--civic-soft);outline:none}
  .moreitem[disabled]{opacity:.45;cursor:default}
  .moreitem.danger{color:var(--opp-ink)}
  .moresep{height:1px;margin:6px 0;background:var(--rule-2)}
}

/* The magnifier in the meeting log's name box sat on the first letters typed: the theme's
   padding for every search box is the later rule of the same weight, so it took the room
   the symbol needs. Only a box that has the symbol: the roster's filter shares the class
   and draws none, and room left for nothing reads as a misaligned field. */
.mm-search svg + input{padding-left:40px}

/* ---------- quick whip (2.195.0) ----------
   **The control is off the bar above this width and the page is unreachable from it**,
   which is the 2.189.0 rule: which tier this is, is the stylesheet's, so the script does
   not test the width to decide whether to draw the button. `compactActions` reads the
   computed style and therefore leaves a hidden button out of the More menu, rather than
   offering a Quick whip that opens the page somebody is already on.

   The names are all `qw-`, because a stylesheet shares one namespace (2.153.2, 2.183.0,
   2.193.5) and `.qw-chip` beside `.mm-chip` is the collision invited rather than avoided. */
.qw-only{display:none}
.qw{padding-bottom:18px}
.qw-sum{padding:14px 16px;border-radius:14px;background:var(--surface);border:1px solid var(--rule-2);
  margin-bottom:12px}
.qw-big{display:flex;align-items:baseline;gap:8px}
.qw-big .tnum{font-size:34px;font-weight:800;line-height:1}
.qw-big small{font-size:14px;color:var(--ink-2);font-weight:600}
.qw-bar{margin-top:4px;font-size:13px;font-weight:600;color:var(--ink-2)}
.qw-split{display:flex;flex-wrap:wrap;gap:4px 14px;margin-top:9px;font-size:12.5px;color:var(--ink-3)}
.qw-scopes{margin-bottom:12px}
.qw-ro{margin:0 0 12px;padding:10px 13px;border-radius:11px;background:var(--civic-soft);
  font-size:13px;line-height:1.45}
.qw-list{display:flex;flex-direction:column;gap:8px}
.qw-row{border:1px solid var(--rule-2);border-radius:13px;background:var(--surface);overflow:hidden}
.qw-row.open{border-color:var(--civic)}
.qw-row.busy{opacity:.55}
/* A whole row is the target, 60px of it, because this is pressed standing up. */
.qw-who{display:flex;align-items:center;gap:10px;width:100%;min-height:60px;padding:10px 13px;
  border:0;background:transparent;font:inherit;text-align:left;cursor:pointer}
.qw-who b{font-size:16px;flex:1 1 8rem;min-width:0}
.qw-who:disabled{cursor:default}
.qw-meta{font-size:12.5px;color:var(--ink-3);flex:0 0 auto}
.qw-chip{flex:0 0 auto;display:inline-flex;align-items:center;height:26px;padding:0 10px;
  border-radius:13px;font-size:12px;font-weight:700;color:var(--navy);white-space:nowrap}
/* The positions, each its own color so the one being reached for is found by eye rather
   than by reading seven words. A wrap rather than a scroller: all seven have to be
   reachable without a sideways drag, which a thumb cannot aim at. */
.qw-opts{display:flex;flex-wrap:wrap;gap:7px;padding:0 13px 13px}
.qw-opt{min-height:44px;padding:0 14px;border-radius:22px;border:1.5px solid var(--qw-ink,var(--rule));
  background:var(--surface);color:var(--ink);font:inherit;font-size:14px;font-weight:600;cursor:pointer}
/* The one that is already set is filled rather than inverted. A solid fill of the
   position's own color would put navy on red for Opposed at about 2:1, which is
   `pillStyle`'s lesson (2.131.0) said in a stylesheet: the fill is the color taken most
   of the way to white and the ink most of the way to black. */
.qw-opt.on{background:color-mix(in srgb, var(--qw-ink,var(--civic)) 16%, #fff);
  border-width:2.5px;color:color-mix(in srgb, var(--qw-ink,var(--civic)) 55%, #000)}
.qw-opt.qw-clear{border-style:dashed;color:var(--ink-2)}
@media (max-width:820px), (orientation:landscape) and (max-height:540px){
  /* **`:not(.in-more)` rather than an order the next edit can reverse.** The button has
     to be *shown* at this width for `actionShown` to see it at all -- a hidden one is
     skipped and never reaches the More menu -- and `compactActions` then adds `in-more`,
     which must win. Both selectors weigh the same, so without this the later rule in the
     file would decide, which is the fragility 2.153.2 and 2.183.0 both record. */
  .topbar-actions .btn.qw-only:not(.in-more):not(.is-back){display:inline-flex}
}

/* ---------- a finger on a phone: the whip card, a swipe and a pull (2.189.0) ----------
   docs/design/mobile-next.md items 7 and 8. The last block in the file for the reason the
   blocks above give: the theme sets some of the same properties at the same weight. */
@media (max-width:700px), (orientation:landscape) and (max-height:540px){
  /* The Dashboard's whip card carried two reorder arrows, a Forecast box and an Open button in
     a header a phone has 390 points for. They are desk controls: arranging the cards and
     forecasting are things somebody does at a desk, and the bill's number already opens the
     bill. Not drawn here; a forecast set at a desk still reads as one, because the state is the
     person's and only the control moves. */
  .billcard-whip .card-h [data-pinup],
  .billcard-whip .card-h [data-pindown],
  .billcard-whip .card-h .fc,
  .billcard-whip .card-h .btn[data-billopen]{display:none}
  /* And the whole header opens the bill: the number's own hit area, stretched over the header,
     so it is still one control with one name rather than a second handler wired beside it.
     The bill's own page has no number here (it is headed Whip count), so nothing stretches. */
  .billcard-whip .card-h{position:relative}
  .billcard-whip .card-h .bc-open::after{content:'';position:absolute;inset:0}
  /* The picker the all-bills page slips into the same header stays above it. */
  .billcard-whip .card-h select{position:relative;z-index:1}

  /* A to-do card hands a sideways drag to the page and keeps an up-and-down one for the
     browser, which is what lets a swipe and a scroll share a card (27-touch.js). */
  .tm-card{touch-action:pan-y;position:relative;transition:transform .18s ease}
  /* The card clips to its rounded corners at rest; while it moves it must not clip the strip
     beside it, which is drawn outside its box. */
  .tm-card.swiping{transition:none;z-index:1;overflow:visible}
  /* What letting go will do, drawn beside the card as it moves aside: a trailing strip on the
     card itself, so there is no second element to keep in step with it. It starts under the
     card's rounded edge and is as wide as the card has traveled (--swipe-by, set by
     27-touch.js), so no gap opens behind it. Mint once the card has gone far enough. */
  .tm-card.swiping::after{content:attr(data-swipe-label);position:absolute;top:-1px;bottom:-1px;
    left:calc(100% - 12px);width:calc(var(--swipe-by, 0px) + 12px);z-index:-1;
    display:flex;align-items:center;justify-content:center;padding-left:12px;box-sizing:border-box;
    border-radius:0 12px 12px 0;background:var(--rule);color:var(--ink-2);
    font-weight:700;font-size:14px;white-space:nowrap;overflow:hidden}
  .tm-card.swiping.swipe-ready::after{background:var(--sup);color:var(--navy)}
  /* The strip reaches past the card's right edge; it must not push the page sideways. */
  .mm.tm{overflow-x:clip}
}

/* The note under the band while a page is pulled down: a pill, placed by 27-touch.js just below
   whatever the top bar is at that moment. Hidden means hidden, whatever display says. */
.pullhint{position:fixed;left:50%;transform:translateX(-50%);z-index:90;display:flex;
  align-items:center;gap:8px;padding:8px 14px;border-radius:999px;background:var(--surface);
  color:var(--ink);font-size:13px;font-weight:600;box-shadow:0 6px 20px rgba(15,45,74,.18);
  pointer-events:none}
.pullhint[hidden]{display:none}
.pullhint.ready{background:var(--sup);color:var(--navy)}

/* The committees a member sits on: capped so a long name cannot push the roster
   sideways, wrapping **between** chips rather than inside one. */
.comcell{max-width:260px}
.comcell .chipbtn{margin:0 3px 3px 0}
