:root{font-family:Inter,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;color:#182c37;background:#f3f6f8;font-size:16px}*{box-sizing:border-box}body{margin:0}button,input,select{font:inherit}button,.button{cursor:pointer;border:0;border-radius:7px;background:#087d79;color:white;padding:11px 16px;text-decoration:none;font-size:14px}button:hover,.button:hover{filter:brightness(.93)}input,select{border:1px solid #cbd6dc;border-radius:7px;padding:12px;background:white;color:#182c37}h1{font-size:30px;letter-spacing:-1px;margin:10px 0}h2{font-size:18px;margin:0 0 16px}small,.muted{color:#687f8c;font-size:14px}p{line-height:1.7}aside{position:fixed;width:240px;background:#122935;color:#dce8ed;inset:0 auto 0 0;padding:32px 24px}.brand{font-size:23px;white-space:nowrap}.brand span,.mark span{color:#5ed2bb}.brand b{font-size:18px;margin-left:8px}aside>small{display:block;margin:16px 0 40px}nav{display:grid;gap:8px}nav button{background:transparent;text-align:left;color:#bdcdd5}nav button.active{background:#234552;color:#8ee2cc}.aside-bottom{position:absolute;bottom:32px;line-height:2}.aside-bottom button{display:block;margin-top:20px;background:#234552}main{margin-left:240px;padding:38px 44px;max-width:1600px}header{display:flex;justify-content:space-between;align-items:center;margin-bottom:28px;gap:20px}.secondary{background:white;color:#294957;border:1px solid #cedae0}.panel{background:white;border:1px solid #dce4e8;border-radius:10px;padding:24px}.panel{margin-bottom:22px}.panelhead{display:flex;justify-content:space-between}.pill{font-size:13px;background:#dff5ee;color:#19765d;padding:6px 10px;border-radius:20px;height:fit-content}.notice{background:#fff7df;border:1px solid #ecdca3;border-radius:8px;padding:16px;margin-bottom:22px;line-height:1.6}.toolbar{display:flex;gap:12px;margin-bottom:20px}.toolbar input{flex:1}.tablewrap{padding:0;overflow:auto}table{width:100%;border-collapse:collapse;font-size:14px;text-align:left}th{background:#f8fafb;color:#687f8c;padding:16px;white-space:nowrap}td{padding:18px 16px;border-top:1px solid #edf1f3;max-width:330px;overflow-wrap:anywhere}td small{display:block;margin-top:7px;font-size:12px}.codecard .cardadv{margin-top:6px}.auth{max-width:390px;margin:12vh auto;padding:20px}.mark{font-size:42px;font-weight:bold}.auth label{display:block;font-size:14px;margin:18px 0}.auth input{display:block;width:100%;margin-top:8px}.auth button{width:100%}#error{color:#a33232;font-size:14px}footer{font-size:12px;color:#81939d;margin-top:28px}dialog{border:1px solid #dce4e8;border-radius:12px;max-width:850px;width:90vw;max-height:85vh;padding:25px}dialog::backdrop{background:#102a3d88}dialog img{max-width:100%;border:1px solid #dde5e9;margin:10px 0}dialog pre{white-space:pre-wrap;overflow-wrap:anywhere;background:#f5f7f8;padding:16px;font-size:12px}dialog a{color:#087d79;overflow-wrap:anywhere}[hidden]{display:none!important}@media(max-width:900px){aside{position:static;width:auto;padding:20px}aside>small,.aside-bottom{display:none}nav{display:flex;margin-top:18px}main{margin:0;padding:24px 18px}header{align-items:flex-start;flex-direction:column}}@media(max-width:480px){.toolbar{flex-direction:column}}main{padding-top:28px}header{margin-bottom:22px}summary{cursor:pointer;font-weight:600;font-size:15px}details.panel{padding:18px 24px}details[open] summary{margin-bottom:16px}button:focus-visible,a:focus-visible,summary:focus-visible{outline:3px solid #39a99c;outline-offset:3px}.filters{align-items:end;flex-wrap:wrap}.filters label{display:grid;gap:7px;font-size:13px;color:#526b78}.filters label select,.filters label input{font-size:14px}#resultcount{font-size:13px}nav{gap:5px}nav button{padding:12px}@media(max-width:700px){nav{flex-wrap:wrap}.filters{align-items:stretch}}
#detail{padding:0;width:min(1000px,94vw);max-width:1000px;max-height:90vh;color:#182c37;box-shadow:0 24px 90px #102a3d44} .dialogbar{position:sticky;top:0;z-index:2;background:#fff;display:flex;align-items:center;justify-content:space-between;padding:14px 26px;border-bottom:1px solid #dce4e8;font-size:14px;color:#687f8c}#detailbody{padding:24px 28px}.detailheading h2{font-size:23px;line-height:1.4;margin:8px 0 14px}.eyebrow{font-size:11px;letter-spacing:1.3px;color:#687f8c}.detailfacts{display:grid;grid-template-columns:repeat(3,1fr);gap:20px;padding:22px;background:#f5f8fa;border-radius:9px;margin:24px 0}.detailfacts dt{font-size:12px;color:#687f8c;margin-bottom:7px}.detailfacts dd{margin:0;font-size:14px;overflow-wrap:anywhere}.detailsection{border-top:1px solid #e2e9ed;padding:20px 0}.detailsection h3{font-size:16px;margin:0 0 14px}.detailsection h3 small{font-weight:400;margin-left:10px;font-size:12px}.urlbox{font-size:13px;overflow-wrap:anywhere;line-height:1.6;background:#f5f8fa;padding:12px;border-radius:6px}.emptystate{padding:16px;background:#f7f9fa;border-radius:7px;font-size:14px}.emptystate small{display:block;font-size:12px;margin-top:8px;line-height:1.6}.evidencegrid{display:grid;grid-template-columns:repeat(2,1fr);gap:16px}.evidencegrid a{border:1px solid #dce4e8;border-radius:8px;overflow:hidden;text-decoration:none;color:#294957}.evidencegrid img{width:100%;height:190px;object-fit:contain;background:#edf1f3;margin:0;border:0}.evidencegrid b,.evidencegrid small{display:block;padding:10px 12px 0;font-size:13px}.evidencegrid small{padding-bottom:12px;font-size:11px}.journey{padding-left:24px}.journey li{padding:6px}.journey .pill{display:inline-block;margin-bottom:8px}@media(max-width:600px){.detailfacts{grid-template-columns:repeat(2,1fr)}.evidencegrid{grid-template-columns:1fr}#detailbody{padding:18px}.dialogbar{padding:12px 18px}}

/* ---- Investigation workspace ---------------------------------------- */
.card{background:#fff;border:1px solid #dce4e8;border-radius:10px;padding:16px 18px;text-align:left;cursor:pointer;font:inherit;color:inherit;display:flex;flex-direction:column;gap:3px}
.card:hover{border-color:#9bb3c1;box-shadow:0 1px 6px rgba(24,44,55,.09)}
.card:focus-visible{outline:2px solid #1d6fa5;outline-offset:2px}
.card b{font-size:29px;line-height:1.1}
.card span{font-weight:600;font-size:14px}
.card small{color:#687f8c;font-size:12px;line-height:1.45}
.panelhead{margin-bottom:14px}
.panelhead h2{margin-bottom:4px}
.invmeta .codes{display:flex;flex-wrap:wrap;gap:5px}
.small{font-size:12px}
.prov{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.4px;color:#8a6100;background:#fff4d9;border:1px solid #f0dca8;border-radius:5px;padding:2px 6px}
.typeline .muted{font-weight:400;margin-left:6px}
.typehead{font-size:15px;font-weight:650;margin-bottom:4px}
label.checkline{display:flex;align-items:center;gap:6px;font-size:13px}
label.checkline input{width:auto;margin:0}
.reason{font-size:12px;background:#eef4f8;border:1px solid #d5e2ea;color:#2b5c77;border-radius:5px;padding:2px 8px}
.chip{font-size:12px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;border-radius:5px;padding:2px 7px;border:1px solid #d5e2ea;background:#eef4f8}
.chip.ok{background:#e6f6ec;border-color:#b8e2c6;color:#1c6b38}
.chip.warn{background:#fff4d9;border-color:#f0dca8;color:#8a6100}
.pills{display:flex;gap:6px;flex-wrap:wrap}
.pill{font-size:12px;border-radius:20px;padding:2px 10px;border:1px solid #dce4e8;background:#f4f7f9}
.pill.state-ready_for_action{background:#e8f0fb;border-color:#c2d6f2;color:#1b4b8f}
.pill.state-resolved{background:#eef1f3;color:#5a6b76}
.pill.auth-not_authorized{background:#fdeaea;border-color:#f3c6c6;color:#9a2222}
.pill.auth-restricted{background:#fff4d9;border-color:#f0dca8;color:#8a6100}
.pill.auth-authorized{background:#e6f6ec;border-color:#b8e2c6;color:#1c6b38}
.empty{padding:18px;background:#f7f9fa;border-radius:7px;font-size:14px;color:#687f8c}
.grid{width:100%;border-collapse:collapse;font-size:13.5px;margin:8px 0 4px}
.grid th,.grid td{border:1px solid #e4eaee;padding:6px 9px;text-align:left;vertical-align:top}
.grid th{background:#f4f7f9;font-weight:600}
.tablescroll{overflow-x:auto;border-radius:7px}
.drawerwrap h3{margin:22px 0 7px;font-size:15px;border-bottom:1px solid #eef2f4;padding-bottom:5px}
.facts{margin:0;padding-left:20px;font-size:14px;line-height:1.65}
.facts.unknown{color:#6b5a33}
.warnbox{background:#fff8e8;border-left:3px solid #d99100;padding:10px 14px;font-size:13.5px;border-radius:0 7px 7px 0;margin:10px 0}
.warn-text{color:#9a2222}
.ok-text{color:#1c6b38}
.next{background:#eef4f8;border:1px solid #d5e2ea;border-radius:7px;padding:11px 14px;font-size:14px}
.thumbs{display:flex;flex-wrap:wrap;gap:12px}
.formrow{display:flex;gap:12px;align-items:center;flex-wrap:wrap}
.btn{display:inline-block;padding:9px 15px;border-radius:7px;text-decoration:none;font-size:14px;border:1px solid #dce4e8;background:#f4f7f9;color:#182c37}
.btn:hover{border-color:#9bb3c1}
/* Provisional subject labels embed a full display URL; without this a long
   domain pushes the page wider than the viewport on a phone. */

/* Long destination URLs are also rendered outside the investigation rows --
   the coupons panel prints them inside a plain <p><b>. Unbreakable URL text
   escaped the container and pushed the document 82px wider than a 390px
   viewport on every view. Wrap anywhere a long URL can legitimately appear. */
main p,main h3,main li,main td,main dd,main summary{overflow-wrap:anywhere;min-width:0}
main p b,main li b{overflow-wrap:anywhere}

/* The view switcher must wrap instead of forcing a horizontal scrollbar on a
   phone; a single long row of buttons cannot fit at 390px. */
nav{display:flex;flex-wrap:wrap;gap:6px}

/* Wide multi-column tables (regional coverage, observations) cannot shrink to
   a phone width. Scroll them inside their own container, the same treatment
   .codetable already gets, so the document itself never widens. */
.tablescroll{overflow-x:auto;-webkit-overflow-scrolling:touch}
.tablescroll table{min-width:560px}

.evidencezoom{padding:0;background:#f0f5f7;border:1px solid #ccd9df;border-radius:8px;overflow:hidden;display:block;width:100%;cursor:zoom-in;color:#196d69}.evidencezoom span{display:block;padding:7px;font-size:12px}.evidencezoom img{display:block;width:100%}.evidencezoom:hover{filter:none;border-color:#149b89}#evidenceviewer{padding:0;width:96vw;max-width:1600px;height:92vh;max-height:92vh;overflow:hidden;background:#14232e;border:1px solid #546572;color:white}#evidenceviewer::backdrop{background:#081521bb}.viewerbar{height:62px;display:flex;justify-content:space-between;align-items:center;gap:12px;padding:12px 20px;background:#203540}.viewerbar span{font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.viewerbar>div{display:flex;gap:16px;align-items:center;flex-shrink:0}.viewerbar a{color:#a4e8db;font-size:13px}.viewerimage{height:calc(100% - 62px);overflow:auto;text-align:center;padding:16px}#viewerimage{margin:0;border:0;max-width:100%;height:auto;background:white}@media(max-width:600px){.viewerbar{padding:8px}.viewerbar span{max-width:100px}.viewerbar>div{gap:8px}}

.galleryarrow{position:absolute;top:50%;transform:translateY(-50%);width:44px;height:56px;padding:0;font-size:24px;background:#183e4ee6;color:white;border:1px solid #79909c;border-radius:8px;box-shadow:0 2px 12px #0004}.galleryarrow.prev{left:18px}.galleryarrow.next{right:18px}.galleryarrow:disabled{opacity:.25;cursor:default}#viewercount{font-variant-numeric:tabular-nums;white-space:nowrap;flex-shrink:0;color:#d5e7ef;font-size:13px}@media(max-width:600px){.galleryarrow.prev{left:6px}.galleryarrow.next{right:6px}.galleryarrow{width:36px;height:48px}.viewerbar #viewerlabel{max-width:75px}.viewerbar #viewercount{max-width:none}}

.codehealth{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin-bottom:10px}.codehelp{font-size:13px;line-height:1.6;margin-bottom:22px}#advertisers td{max-width:none;vertical-align:top}#advertisers td:first-child{min-width:200px}#advertisers td:last-child{min-width:170px}#advertisers button{white-space:nowrap;margin-top:8px}#advertisers .chip{display:inline-block;margin:2px}#advertisers table{min-width:960px}#advertisers .toolbar{flex-wrap:wrap}#advertisers .toolbar input{min-width:240px}@media(max-width:650px){.codehealth{grid-template-columns:1fr}}

/* ---- Investigation detail dialog -------------------------------------
   The dialog was its own scroll container with a sticky bar inside it.
   A dialog's default 1em padding sits above the sticky element, so body
   text scrolled up into that gap and appeared above the header, and long
   headings were clipped behind it. Make the dialog a flex column: the bar
   is a real non-scrolling header and #invbody is the only scrolling
   region. min-height:0 is required or the body refuses to shrink and the
   dialog grows instead of scrolling.
   A <dialog> is display:none until opened, so setting display:flex here
   unconditionally made the closed drawer render as a visible block. Only the
   open state gets the flex column; the closed state keeps the UA default. */
#invdetail{padding:0;width:min(1000px,94vw);max-width:1000px;height:min(90vh,900px);max-height:90vh;color:#182c37;box-shadow:0 24px 90px #102a3d44;overflow:hidden}
#invdetail[open]{display:flex;flex-direction:column}
#invdetail:not([open]){display:none}
#invdetail .dialogbar{position:static;flex:0 0 auto}
#invbody{flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain;padding:0 28px 26px}

/* Identifiers and status badges must never break mid-token: "Anderson938"
   split into "Anderson93 / 8" and "confirmed" into "confirme / d". */
.codecell{white-space:nowrap;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12.5px;word-break:normal;overflow-wrap:normal}
.codetable .basis{white-space:normal;min-width:220px}
.badge{display:inline-block;white-space:nowrap;word-break:normal;overflow-wrap:normal;padding:2px 9px;border-radius:999px;font-size:11.5px;font-weight:600;line-height:1.7}
.badge-confirmed{background:#e6f4ec;color:#1c6b38}
.badge-candidate{background:#fdf0e2;color:#8a5a12}
/* Synthetic samples. Purple, used nowhere else in the app, so the colour
   itself carries the warning: anything purple was invented for review. */
.badge-demo{background:#f0e8f8;color:#5b2d82}
.demoblock{margin-top:26px;border:2px dashed #b79ad4;border-radius:10px;background:#faf7fd;padding:0 16px 8px}
.demohead{padding:14px 0 10px;border-bottom:1px solid #e6dbf2}
.demohead b{display:block;font-size:14px;color:#5b2d82}
.demohead small{display:block;color:#6b5580;font-size:12px;line-height:1.55;margin-top:5px}
.demorow{border-top-color:#e6dbf2}
.demobanner{background:#f0e8f8;border:1px solid #cbb3e0;border-radius:9px;padding:12px 15px;margin-bottom:16px}
.demobanner b{color:#5b2d82;font-size:13.5px}
.demobanner small{display:block;color:#6b5580;font-size:12px;line-height:1.55;margin-top:4px}
/* Same disclosed name across cases: a relation, never an identity claim. */
.chip.shared{background:#eef4f8;border-color:#c3d6e2;color:#2b5a75;margin-left:8px}
.shapeline{display:block;margin-top:7px;font-size:12.5px;color:#33505e;line-height:1.6}
.linkbtn{background:none;border:0;border-bottom:1px solid #8fb4c9;color:#1d6fa5;cursor:pointer;font-size:13px;padding:0 1px;margin:0 3px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}
.linkbtn:hover{color:#0f5f5c;border-bottom-color:#0f5f5c}

/* One visible qualification; the rest folded away. */
.caveat{margin:14px 0 0;border-top:1px solid #eef2f4;padding-top:10px}
.caveat summary{cursor:pointer;font-size:13px;color:#456;font-weight:600}
.caveat .facts{margin-top:9px}

/* Findings summary: one coherent block, not another row of metric tiles. */
.popcards{display:flex;flex-wrap:wrap;gap:12px}
/* `button,.button` sets color:white for real buttons. A popcard is a button
   with a white background, and `strong`/`small` each set their own colour,
   so `b` was the one child left inheriting white-on-white and the tab labels
   ("All cases", "New", ...) were invisible. */
.unknownbox{border:1px solid #e2eaee;border-radius:10px;padding:0 18px;margin-bottom:18px;background:#fff}
.unknownbox summary{cursor:pointer;padding:14px 0;font-size:14px;font-weight:600}
.unknownbox .muted{font-size:13px;line-height:1.6}
.checknote{display:block;font-size:11.5px;margin-top:5px;line-height:1.5}

/* A qualifier ("date only", "requested region") must read as a separate
   statement, not run into the value it qualifies. */
.detailfacts dd small{display:block;color:#687f8c;font-size:12px;line-height:1.5;margin-top:3px}
#casebody .grid td small{display:block;color:#687f8c;font-size:11.5px;line-height:1.45;margin-top:2px}
.regionnote{display:block;color:#687f8c;font-size:12px;line-height:1.5;margin-top:3px}

/* Regions */
.auth-ok{background:#e7f6ee;color:#1c6b43}
.auth-warn{background:#fdf3e0;color:#8a5a12}
.auth-bad{background:#fdeaea;color:#96231f}

/* Metric cards state the unit they count. Without this the four Overview
   numbers read as one comparable ladder; they are records, codes and grouped
   identities, which are three different things. */
.metric .unit{display:block;font-style:normal;font-size:11.5px;line-height:1.35;color:#5b6f7b;margin:-2px 0 9px}

/* ---- Affiliate Monitoring (P0) --------------------------------------- */
/* Nav is now grouped. The labels are not buttons and must not look like one. */
.navgroup{font-size:10.5px;letter-spacing:1.2px;text-transform:uppercase;color:#7e97a3;margin:16px 0 4px;padding:0 12px}
.navgroup:first-child{margin-top:0}
@media(max-width:900px){.navgroup{flex:1 1 100%;margin:10px 0 2px;padding:0}}

/* Case and ad drawers reuse the investigation drawer's geometry so the two
   halves of the product feel like one workspace. */
#casedetail,#addetail{padding:0;width:min(1040px,94vw);max-width:1040px;height:min(90vh,920px);max-height:90vh;color:#182c37;box-shadow:0 24px 90px #102a3d44;overflow:hidden}
#casedetail[open],#addetail[open]{display:flex;flex-direction:column}
#casedetail:not([open]),#addetail:not([open]){display:none}
#casedetail .dialogbar,#addetail .dialogbar{position:static;flex:0 0 auto}
#casebody,#adbody{flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain;padding:22px 28px 26px}

/* The screenshot viewer needs a positioning context for its arrows. */
#shotviewer{position:relative;padding:0;width:96vw;max-width:1600px;height:92vh;max-height:92vh;overflow:hidden;background:#14232e;border:1px solid #546572;color:white}
#shotviewer::backdrop{background:#081521bb}
#shotviewer .viewerimage{height:calc(100% - 62px);overflow:auto;text-align:center;padding:16px}
#shotimage{max-width:100%;height:auto;background:white;border:0;margin:0}
#shotmeta{font-size:12px;color:#c3d7e0}

/* A case row carries more metadata columns than an investigation row. */
#hijrows .invmeta,#bidrows .invmeta{flex:0 0 420px;gap:10px}
#hijrows .invmeta small,#bidrows .invmeta small{display:block;color:#687f8c;font-size:11.5px;line-height:1.5}
/* `#hijfilters{align-items:end}` and `#hijfilters label{display:grid}` lived
   here from the pre-theme filter bar, which wrapped each control in a <label>.
   The current bar has no such labels, but the IDs outranked every class rule
   in theme.css and applied to hijackers only - so the More filters panel
   rendered differently on the two list pages (labels stacked, 57px tall,
   against 36px inline on brand-bidders), and the column layout could not
   stretch its rows. Removed; theme.css styles both pages identically. */
/* Narrow screens: a panel head is a title plus an explanation, not two
   columns. Left unwrapped it squeezes the title into a vertical letter
   stack next to the paragraph. */
@media(max-width:820px){
  #hijrows .invmeta,#bidrows .invmeta{flex:1 1 100%}
  .panelhead{flex-wrap:wrap;gap:4px}
  .panelhead h2{flex:1 1 100%}
  .panelhead p{flex:1 1 100%;max-width:none}
}

/* Compact case table. Replaces the card list: the review measured 12 cards
   at 3383px, which made horizontal scanning impossible. */
.casetable{width:100%;border-collapse:collapse;font-size:13px}
.casetable th{position:sticky;top:0;background:#f3f6f8;z-index:1;text-align:left;white-space:nowrap}
.casetable td{padding:7px 9px;border-top:1px solid #eaeff2;vertical-align:top}
.casetable tbody tr{cursor:pointer}
.casetable tbody tr:hover{background:#f7fbfd}
.casetable tbody tr:focus{outline:2px solid #087d79;outline-offset:-2px}
.casetable .numcol{text-align:right}
.casetable .typecell{font-weight:600;color:#26424f}
.casetable .dimrow{background:#fbfbfb;color:#6b7c85}
.sortbtn{background:transparent;border:0;padding:6px 9px;font:inherit;font-weight:650;color:#33505e;cursor:pointer}
.sortbtn:hover{color:#087d79}
.sortbtn.on{color:#087d79}
.tinytag{font-size:11px;background:#eef4f8;border:1px solid #d5e2ea;color:#2b5c77;border-radius:4px;padding:1px 5px}
.pager{display:flex;align-items:center;gap:12px;padding:10px 2px;flex-wrap:wrap}
.pager .linkbtn[disabled]{opacity:.4;cursor:default}.pager .secondary[disabled]{opacity:.4;cursor:default}
.modeswitch{display:inline-flex;border:1px solid #cbd6dc;border-radius:8px;overflow:hidden;margin-bottom:10px}
.modeswitch button{background:#fff;border:0;padding:7px 14px;font:inherit;font-size:13px;cursor:pointer;color:#33505e}
.modeswitch button[aria-pressed=true]{background:#087d79;color:#fff}
.editcard{border:1px solid #dbe4e9;border-radius:8px;padding:12px 14px;margin-bottom:12px;background:#fff;display:flex;flex-wrap:wrap;gap:10px}
.editcard label{display:flex;flex-direction:column;gap:4px;font-size:13px;flex:1 1 200px}
.editcard label.wide{flex:1 1 100%}
.editcard .formrow{flex:1 1 100%}
#setbody input[type=text],#setbody input:not([type]){width:100%}
.savedflash{background:#e7f6ec;border:1px solid #b6ddc2;border-radius:6px;padding:8px 12px;margin:0 0 12px;font-size:13px}
.detfilters{gap:8px;align-items:center;margin-bottom:8px}
.detfilters input{flex:1 1 260px}
/* `break-all` split the stamp mid-token in the narrow rail, so a commit sha
   and timestamp read as corrupted text. The stamp is now short enough to fit;
   anything longer is clipped with an ellipsis and stays readable in the
   tooltip rather than being chopped across three lines. */
.buildstamp{display:block;margin:6px 0;font-size:11px;opacity:.75;line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* Sidebar as a flex column. The footer used to be absolutely positioned at
   bottom:32px, so adding the build stamp made it grow UPWARD and cover the
   lower nav buttons -- Settings became unclickable. In a column the footer
   is pushed to the bottom by auto margin and can never overlap the nav,
   whatever it ends up containing. */
@media (min-width:821px){
  aside{display:flex;flex-direction:column;overflow-y:auto}
  aside nav{flex:0 0 auto}
  .aside-bottom{position:static;margin-top:auto;padding-top:24px}
  .aside-bottom button{margin-top:12px}
}
