
/* Fonts load from Google Fonts via the <link> in every page head. Self-hosting was
   tried on 2026-07-18 and reverted the same day: the /fonts/*.woff2 paths hung
   behind the GitHub Pages CDN on the custom domain (origin served them fine, the
   edge did not), and a font preload in <head> pointing at a hanging URL stalled
   page loads badly enough that phones timed out. Do not re-self-host without
   first confirming the custom domain serves a brand-new path reliably. */
:root{--bg:#0c0c0d;--card:#17171a;--ink:#f2f2ee;--dim:#9b9b94;--hot:#6b7036;--hotink:#8f9850;--on-hot:#f2f2ee;--line:#2c2c31;--tape:#d8d4c5;--free:#aebf5a;--sliding:#7fb0a8;--age:#d59b46;--benefit:#d98cb0;--soldout:#9b9b94;--shadow:rgba(107,112,54,.5);--scrim:rgba(12,12,13,.82)}
*{box-sizing:border-box}
/* The `hidden` attribute must ALWAYS win. The UA rule for it is only
   [hidden]{display:none} at the lowest specificity, so any rule here that sets an
   explicit display (.dbtn{display:inline-flex}, .drow.dcancel{display:inline-block},
   …) silently beats it and the element renders anyway. That shipped twice: every
   show in the detail sheet showed "this show was cancelled" and a "dm for the
   address" button, on shows that were neither. This file had already worked around
   it eleven times with per-component .foo[hidden]{display:none} rules; this is that
   fix done once, for everything. JS toggling .hidden can now be trusted. */
[hidden]{display:none!important}
body{margin:0;background-color:var(--bg);color:var(--ink);font:16px/1.5 "Special Elite","Courier New",monospace;
  background-image:radial-gradient(1000px 520px at 50% -140px,rgba(107,112,54,.32),rgba(107,112,54,0) 72%),url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.11'/%3E%3C/svg%3E");
  background-repeat:no-repeat,repeat}
a{color:var(--hotink)}
/* typography polish: balanced heading line-breaks + orphan-free prose. Progressive
   enhancement — silently ignored where unsupported. */
h1,h2,h3,.ehead{text-wrap:balance}
.glead,.post p,.dcap,.emptybig p{text-wrap:pretty}
header{padding:2.2rem 1rem .3rem;text-align:center}
header .logo{width:170px;height:170px;display:block;margin:0 auto .6rem;filter:drop-shadow(0 0 14px rgba(255,255,255,.18));transition:transform .2s}
header .logo.tl{transform:rotate(-6deg) scale(1.04)}
header .logo.tr{transform:rotate(6deg) scale(1.04)}
h1{margin:0;font-family:"Special Elite","Courier New",monospace;font-weight:400;font-size:clamp(2.4rem,11vw,4.4rem);letter-spacing:.02em;
  text-transform:uppercase;transform:rotate(-2deg);text-shadow:4px 4px 0 var(--hot)}
header .tag{color:var(--dim);margin:.7rem 0 0;font-size:.95rem}
/* one-line mission subtitle: reads as "what is this?" for a first-time visitor
   and carries the real search terms (alt scene / genres / house + all-ages) in
   crawlable body text, which ranks far harder than any meta tag */
header .lede{color:var(--dim);max-width:54ch;margin:.5rem auto 0;font-size:.82rem;line-height:1.5}
header h1 a{color:inherit;text-decoration:none}
.homelink{display:block;text-decoration:none}
.links{display:flex;flex-wrap:wrap;gap:1rem .6rem;justify-content:center;max-width:680px;margin:0 auto;padding:.8rem 1rem .2rem}
.links a{font-size:.85rem;text-decoration:none;color:#111;background:var(--tape);padding:.4rem .9rem;
  border:2px solid #111;box-shadow:3px 3px 0 var(--hot);text-transform:uppercase;letter-spacing:.05em}
.links a:nth-child(odd){transform:rotate(-1.5deg)}.links a:nth-child(even){transform:rotate(1.2deg)}
.links a:hover{background:var(--hot);color:var(--on-hot);box-shadow:3px 3px 0 var(--tape)}
/* the CALENDAR / ARCHIVE mode switch under the wordmark: the site's two halves
   as one segmented control. Deliberately NOT a tape button (those are the
   off-site links) but a single stamped ink box split down the middle, two equal
   halves, no tilt. The half you're on is filled green; the other reads dim and
   links across. */
.modebar{position:sticky;top:var(--a2hs-h,0px);z-index:44;display:flex;justify-content:center;
  background:var(--bg);border-bottom:2px solid var(--line);
  padding:.22rem 1rem;padding-top:calc(.22rem + env(safe-area-inset-top))}
/* .modetabs is a <nav>, so zero out the global nav{padding:1.2rem;gap:.6rem} that
   was otherwise inflating this strip to ~55px tall regardless of the tab size. */
.modetabs{display:flex;width:max-content;max-width:100%;padding:0;gap:0}
.modetab{font-family:"Anton","Special Elite",sans-serif;font-weight:400;text-transform:uppercase;
  letter-spacing:.13em;font-size:.72rem;text-decoration:none;color:var(--dim);background:transparent;
  border:0;padding:.12rem .95rem .1rem;line-height:1.02;transition:background .12s,color .12s}
.modetab.on{background:var(--hot);color:var(--on-hot)}
.modetab:not(.on):hover{color:var(--ink)}
.modetab:active{transform:none}
/* the archive reuses the homepage's big centered masthead (logo + wordmark +
   mode tabs + standard links) instead of the compact left-aligned flex header
   ".showpage header" below gets on every other subpage, so neither half of the
   site reads as a lesser page. .bighead re-overrides display/text-align back to
   the homepage's centered block layout; it must NOT touch logo/tag sizing (that
   used to drift the archive's masthead smaller than the calendar's — removed,
   so both pages inherit the exact same header/.logo/.tag rules above). */
.showpage header.bighead{display:block;text-align:center;padding:2.2rem 1rem .3rem}
@media (max-width:640px){
  .modetab{font-size:.72rem;padding:.14rem .85rem .12rem}
}
/* TONIGHT strip: a stapled-on "what's on tonight" slip above the feed. Hidden by
   default; MAIN_JS reveals + fills it only when the VIEWER actually has a show
   today (the page is static + re-buckets client-side), so a quiet night shows
   nothing at all. One tap scrolls to the tonight bucket. */
.tstrip{display:flex;align-items:center;gap:.55rem;width:max-content;max-width:min(92%,560px);
  margin:.75rem auto .1rem;padding:.4rem .7rem;text-decoration:none;color:var(--on-hot);
  background:var(--hot);border:2.5px solid var(--ink);box-shadow:5px 5px 0 var(--shadow);
  transform:rotate(-.8deg)}
.tstrip:hover{box-shadow:6px 7px 0 var(--shadow)}
.tstrip:active{transform:rotate(-.8deg) translate(2px,2px);box-shadow:2px 2px 0 var(--shadow)}
.tstrip-tag{flex:none;font-family:'Anton',Impact,sans-serif;text-transform:uppercase;
  letter-spacing:.08em;font-size:1rem;line-height:1;background:var(--ink);color:var(--hotink);
  padding:.28rem .5rem .22rem;transform:rotate(1.6deg)}
.tstrip-body{font-family:'Special Elite',monospace;font-size:.9rem;line-height:1.15;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.tstrip-go{flex:none;font-size:1rem;line-height:1;margin-left:.05rem}
nav{display:flex;gap:.6rem;justify-content:center;align-items:center;padding:1.2rem 1rem;position:relative}
nav .searchtoggle svg{display:block}
/* print-scope popover, anchored under the nav's printer icon */
.pwrap{position:relative;display:flex;flex:none}
.pmenu{position:absolute;top:calc(100% + 8px);right:0;z-index:48;background:var(--card);
  border:2px solid var(--hot);box-shadow:6px 6px 0 var(--hot);padding:.7rem;
  display:flex;flex-direction:column;gap:.5rem;min-width:11.5rem}
.pmenu[hidden]{display:none}
.pmenu .dbtn{justify-content:center;white-space:nowrap}
/* the print control now lives in a bar down at the bottom of the feed; its menu
   opens upward and centered so it never runs off the bottom of the page. */
.printbar{display:flex;justify-content:center;margin:1.7rem 0 .2rem}
.printbar .dbtn{display:inline-flex;align-items:center;gap:.45rem}
.pwrap.up .pmenu{top:auto;bottom:calc(100% + 8px);right:auto;left:50%;transform:translateX(-50%)}
nav a{background:transparent;color:var(--ink);border:2px dashed var(--dim);padding:.45rem 1.1rem;
  text-decoration:none;text-transform:uppercase;letter-spacing:.08em;font-size:.9rem}
nav a:hover{border-color:var(--hot);color:var(--hot)}
main{max-width:880px;margin:0 auto 2rem;padding:0 1rem}
main section{display:none}
main section:target{display:block}
main:not(:has(section:target)) #list{display:block}
/* sections are programmatic focus targets (focus moves here on view switch); they
   aren't Tab-reachable controls, so they carry no visible focus ring. */
main section[tabindex]:focus{outline:none}
body:has(#list:target) a[href='#list'],body:not(:has(section:target)) a[href='#list'],
body:has(#grid:target) a[href='#grid']{border:2px solid var(--hot);background:var(--hot);color:var(--on-hot)}
.controls{max-width:680px;margin:0 auto .3rem}
.searchtoggle{background:var(--card);border:2px dashed var(--dim);color:var(--ink);cursor:pointer;
  width:2.5rem;height:2.5rem;font:1.25rem/1 inherit;flex:none;display:flex;align-items:center;justify-content:center}
.searchtoggle:hover{border-color:var(--hot);color:var(--hot)}
.searchtoggle.on{background:var(--hot);color:var(--on-hot);border-style:solid;border-color:var(--hot)}
.filterpanel{margin-top:.5rem}
.filterpanel[hidden]{display:none}
.vchips{display:flex;flex-wrap:wrap;gap:.4rem;margin-bottom:.5rem}
.vchip{background:var(--card);border:2px dashed var(--dim);color:var(--ink);cursor:pointer;font:.78rem/1 inherit;
  text-transform:uppercase;letter-spacing:.04em;padding:.45rem .7rem}
.vchip:hover{border-color:var(--hot);color:var(--hot)}
.vchip.on{background:var(--hot);color:var(--on-hot);border-style:solid;border-color:var(--hot)}
.tagchips{display:flex;flex-wrap:wrap;gap:.4rem;margin:0 0 .5rem;padding-top:.5rem;border-top:1px dashed var(--line)}
.tagchip{background:var(--card);border:2px dashed var(--dim);color:var(--ink);cursor:pointer;font:.78rem/1 inherit;
  text-transform:uppercase;letter-spacing:.04em;padding:.45rem .7rem}
.tagchip:hover{border-color:var(--hot);color:var(--hot)}
.tagchip.on{background:var(--hot);color:var(--on-hot);border-style:solid;border-color:var(--hot)}
.search{margin:0}
.search input{width:100%;height:2.3rem;background:var(--card);border:2px solid var(--hot);color:var(--ink);
  font:inherit;padding:.4rem .9rem;text-transform:uppercase;letter-spacing:.05em}
.search input:focus{outline:none}
.search input::placeholder{color:var(--dim)}
.bucket{max-width:680px;margin:0 auto}
.bhead{font-family:"Anton","Special Elite",sans-serif;font-weight:400;text-transform:uppercase;letter-spacing:.03em;
  font-size:1.5rem;margin:1.9rem 0 .9rem;color:var(--ink);display:flex;align-items:center;gap:.7rem}
.bhead::after{content:"";flex:1;border-top:2px dashed var(--line)}
.ht{background-image:radial-gradient(var(--hot) 30%,transparent 32%);background-size:6px 6px;width:34px;height:18px;display:inline-block;opacity:.85}
#b-tonight .bhead{color:var(--hot);font-size:1.95rem}
.cards{display:grid;gap:1.1rem}
.show{display:flex;gap:1rem;background:var(--card);border:1px solid var(--line);padding:1rem;align-items:center;
  box-shadow:5px 5px 0 var(--shadow);cursor:pointer;transition:box-shadow .12s ease,transform .12s ease}
.show.past{display:none}
.show:hover,.show:focus{outline:none;box-shadow:5px 5px 0 var(--hot)}
.thumbwrap{position:relative;flex:none}
.show img.thumb{width:84px;height:106px;object-fit:cover;border:2px solid var(--ink);display:block;background:#000}
.show img.thumb.ph{object-fit:contain;padding:6px;filter:grayscale(.2) opacity(.85)}
.info{min-width:0}
.date{color:var(--hotink);font-weight:700;text-transform:uppercase;font-size:.85rem;letter-spacing:.06em}
.show h3{margin:.2rem 0;font-family:"Anton","Special Elite",sans-serif;font-weight:400;font-size:1.05rem;
  line-height:1.04;text-transform:uppercase;letter-spacing:.01em}
.show h3 .more{color:var(--dim)}
.meta{color:var(--dim);font-size:.92rem}
#b-week .show img.thumb{width:108px;height:135px}
#b-week .show h3{font-size:1.5rem}
#b-tonight .show img.thumb{width:130px;height:163px;transform:rotate(-1.4deg)}
#b-tonight .show h3{font-size:2rem}
#b-tonight .show{box-shadow:6px 6px 0 var(--hot)}
/* tonight cards already wear the hot shadow at rest, so they need their own
   hover/focus state (higher specificity than the base rule) to still signal
   they're clickable — otherwise hovering them does nothing. */
#b-tonight .show:hover,#b-tonight .show:focus{box-shadow:10px 10px 0 var(--hot);transform:translate(-3px,-3px)}
/* price/age tags now ride in the card next to the date badge (not over the
   flyer). .daterow lays the date + its tags on one line with a small gap. */
.daterow{display:flex;flex-wrap:wrap;align-items:center;gap:.75rem;margin-bottom:.12rem}
.stamp{font-family:"Anton","Special Elite",sans-serif;text-transform:uppercase;font-size:.62rem;
  letter-spacing:.05em;padding:.12rem .36rem;border:2px solid currentColor;line-height:1;white-space:nowrap}
.s-free{color:var(--free)}
.s-sliding{color:var(--sliding)}
.s-age{color:var(--age)}
.s-benefit{color:var(--benefit)}
.s-soldout{color:var(--soldout)}
.mon{margin:2rem 0 .6rem;font-size:1.25rem;color:var(--hotink);font-family:"Rock Salt",cursive;transform:rotate(-1deg)}
/* pinned "most active" tag(s) beside a wrapped month's archive header */
.monbadge{display:inline-block;margin-left:.6rem;vertical-align:middle;font-family:"Special Elite","Courier New",monospace;
  font-size:.7rem;font-weight:400;color:var(--dim);text-transform:none;letter-spacing:.02em;line-height:1.35}
.monbadge b{color:var(--hotink);text-transform:uppercase;letter-spacing:.05em;font-weight:400;margin-right:.35rem}
.monbadge.yr b{color:var(--age)}
#agenda{display:none}
.cal{width:100%;border-collapse:collapse;table-layout:fixed}
.cal th{color:var(--dim);font-weight:400;font-size:.78rem;padding:.3rem;text-transform:uppercase}
.cal td{border:1px dashed var(--line);vertical-align:top;height:86px;padding:3px;font-size:.75rem}
.cal td.pad{border:none}.cal td.has{background:var(--card);border:1px solid var(--hot)}
.cal td.today{border:2px solid var(--tape);box-shadow:inset 0 0 0 1px var(--tape)}
.cal td.today .dnum{color:var(--tape);font-weight:700}
.dnum{color:var(--dim);display:block}
.cf{display:block;color:var(--ink);text-decoration:none;cursor:pointer}
.cf img{width:100%;max-height:84px;object-fit:cover;display:block;border:1px solid var(--ink)}
.cf img.ph{object-fit:contain;background:#000;filter:opacity(.7)}
.cf span{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.stats{display:flex;flex-wrap:wrap;gap:.5rem;margin:.2rem 0 1.5rem}
.stat{background:var(--card);border:1px solid var(--line);padding:.5rem .8rem;font-size:.8rem;color:var(--dim)}
.stat b{color:var(--hotink);font-size:1.05rem;display:block;font-family:"Anton","Special Elite",sans-serif;font-weight:400;letter-spacing:.02em}
/* archive year-nav: tape-label jump-links into each era of the archive */
.yearnav{display:flex;flex-wrap:wrap;align-items:center;gap:.4rem;margin:0 0 1.4rem}
.ynlab{font-family:"Special Elite","Courier New",monospace;font-size:.72rem;text-transform:uppercase;
  letter-spacing:.09em;color:var(--dim);margin-right:.1rem}
.yearnav a{font-family:"Anton",Impact,sans-serif;font-size:.95rem;letter-spacing:.03em;text-decoration:none;
  color:#111;background:var(--tape);border:2px solid #111;padding:.12rem .6rem .18rem;
  box-shadow:2px 2px 0 var(--shadow);transform:rotate(-1deg)}
.yearnav a:nth-child(even){transform:rotate(1.3deg)}
.yearnav a:hover,.yearnav a:focus-visible{background:var(--hot);color:var(--on-hot);box-shadow:2px 2px 0 var(--tape)}
.mon[id]{scroll-margin-top:.8rem}
.arch{list-style:none;padding:0;margin:0}
.arch li{display:flex;gap:.7rem;align-items:center;padding:.5rem 0;border-bottom:1px dashed var(--line)}
.athumb{width:52px;height:65px;object-fit:cover;border:1px solid var(--ink);flex:none;cursor:pointer;background:#000}
.athumb.ph{object-fit:contain;padding:3px;filter:opacity(.55);cursor:default}
/* stack date / lineup / meta as their own lines; a fixed-width inline date
   wraps inside itself on phones and the whole row runs together. */
.al{min-width:0}
.arch .date{display:block}
.al strong{display:block;font-weight:400;margin:.1rem 0}
.al .meta{display:block}
.empty{color:var(--dim);text-align:center}
.emptyline{margin:0 0 .9rem}
/* first-use / no-shows state: a dashed-card onboarding moment in the zine
   vocabulary — Anton head, typewriter body, tape-button CTAs. Not a SaaS blank. */
.emptybig{max-width:520px;margin:2.4rem auto;padding:1.7rem 1.4rem;border:2px dashed var(--line);background:var(--card)}
.emptybig .ehead{font-family:"Anton","Special Elite",sans-serif;font-weight:400;text-transform:uppercase;
  font-size:1.45rem;letter-spacing:.02em;color:var(--ink);margin:0 0 .7rem}
.emptybig p{margin:0 0 1.15rem;line-height:1.6;color:var(--dim)}
.eactions{display:flex;flex-wrap:wrap;gap:.6rem;justify-content:center}
footer{text-align:center;color:var(--dim);padding:2.5rem 1rem;font-size:.85rem}
footer b{color:var(--hot)}
.flinks{margin:.7rem 0 0;display:flex;flex-wrap:wrap;gap:.5rem 1rem;justify-content:center}
.flinks a{color:var(--hotink);text-decoration:underline}
.lb{position:fixed;inset:0;background:rgba(0,0,0,.92);display:none;align-items:center;justify-content:center;
  z-index:60;padding:1.5rem;cursor:zoom-out}
.lb.open{display:flex}
.lb img#lbimg{max-width:100%;max-height:90vh;border:3px solid var(--ink);box-shadow:0 0 0 6px var(--hot)}
.lb .x{position:absolute;top:1rem;right:1.2rem;color:var(--ink);font-size:2rem;text-decoration:none;line-height:1;z-index:2}
.detail{z-index:55;cursor:default}
/* desktop close: a clear little corner button in the dbox's top-right (the flyer
   sits on the left, so it never covers the art). Hidden on mobile in favor of the
   swipe-down grab handle. */
.detail .x{top:.55rem;right:.6rem;width:1.9rem;height:1.9rem;display:flex;align-items:center;
  justify-content:center;background:var(--card);border:2px solid var(--line);font-size:1.4rem;z-index:4}
.detail .x:hover,.detail .x:focus-visible{border-color:var(--hot);color:var(--hot)}
.detail .dinfo{padding-right:1.4rem}
.dbox{background:var(--card);border:1px solid var(--line);box-shadow:8px 8px 0 var(--hot);max-width:680px;width:100%;
  max-height:90vh;overflow:auto;display:flex;gap:1.1rem;padding:1.1rem;position:relative;flex-wrap:wrap}
.dflyer{width:230px;max-width:42%;object-fit:contain;align-self:flex-start;border:2px solid var(--ink);background:#000;cursor:zoom-in}
.dinfo{flex:1;min-width:14rem}
.dinfo h2{margin:.1rem 0 .6rem;font-family:"Anton","Special Elite",sans-serif;font-weight:400;
  text-transform:uppercase;font-size:1.7rem;line-height:1.05}
.drow{color:var(--ink);font-size:.95rem;margin:.25rem 0}
.dcap{color:var(--dim);font-size:.9rem;margin:.7rem 0;line-height:1.5}
.dbenefit{color:var(--benefit);font-weight:700;text-transform:uppercase;letter-spacing:.04em}
.submitlist{margin:.3rem 0 1.2rem;padding-left:1.2rem;line-height:1.7}
.submitlist li{margin:.15rem 0}
.dactions{display:flex;gap:.6rem;flex-wrap:wrap;margin-top:.9rem}
.dbtn{display:inline-flex;align-items:center;gap:.4rem;background:var(--tape);color:#111;border:2px solid #111;
  box-shadow:3px 3px 0 var(--hot);padding:.45rem .85rem;cursor:pointer;font:inherit;text-transform:uppercase;
  letter-spacing:.05em;font-size:.82rem;text-decoration:none}
.dbtn:hover{background:var(--hot);color:var(--on-hot);box-shadow:3px 3px 0 var(--tape)}
/* ---------- touch + mobile polish (premium feel, same zine look) ---------- */
html{scroll-behavior:smooth}
body{overflow-x:clip}
a,button,.show,.cf,.vchip,.athumb{touch-action:manipulation;-webkit-tap-highlight-color:transparent}
/* tactile press feedback — invisible at rest, so the static look is unchanged */
.links a:active,.dbtn:active{transform:translate(2px,2px);box-shadow:1px 1px 0 var(--hot)}
nav a:active,.vchip:active,.searchtoggle:active{transform:scale(.95)}
.show:active{box-shadow:3px 3px 0 var(--hot);transform:translate(2px,2px)}
.athumb:active,.cf:active{transform:scale(.96)}
/* gentle entrance when switching views or popping a flyer */
main section:target{animation:viewin .26s ease both}
.lb.open #lbimg{animation:lbin .24s ease both}
@keyframes viewin{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
@keyframes lbin{from{opacity:0;transform:scale(.92)}to{opacity:1;transform:none}}
@keyframes sheetup{from{transform:translateY(100%)}to{transform:translateY(0)}}

/* back-to-top — a tilted tape button that fades in once you've scrolled down.
   z-index sits below the modals (detail 55 / lightbox 60) so it hides behind an open modal. */
.totop{position:fixed;right:1.2rem;bottom:1.2rem;z-index:45;width:3rem;height:3rem;
  display:flex;align-items:center;justify-content:center;cursor:pointer;
  background:var(--tape);color:#111;border:2px solid #111;box-shadow:3px 3px 0 var(--hot);
  font:1.5rem/1 "Anton","Special Elite",sans-serif;text-decoration:none;
  transform:rotate(-3deg) translateY(10px);opacity:0;pointer-events:none;
  transition:opacity .2s,transform .2s}
.totop.on{opacity:1;pointer-events:auto;transform:rotate(-3deg) translateY(0)}
.totop:hover{background:var(--hot);color:var(--on-hot);box-shadow:3px 3px 0 var(--tape)}
.totop:active{transform:rotate(-3deg) translate(2px,2px);box-shadow:1px 1px 0 var(--hot)}

/* intent-timed support nudge: slides up after a high-intent action (sharing a
   show, adding the calendar). Sits below the modals (50/55) so an open dialog
   covers it; the CTA is the existing Venmo link, so the CSP is untouched. */
.tip{position:fixed;left:1rem;bottom:1.2rem;z-index:46;max-width:330px;background:var(--card);
  border:2px solid var(--hot);box-shadow:6px 6px 0 var(--hot);padding:1rem 1.05rem .95rem;
  transform:rotate(-1deg) translateY(14px);opacity:0;pointer-events:none;
  transition:opacity .22s,transform .22s}
.tip.on{opacity:1;pointer-events:auto;transform:rotate(-1deg) translateY(0);
  animation:sheetup .3s cubic-bezier(.2,.85,.25,1) both}
.tip[hidden]{display:none}
.tiptext{margin:0 0 .85rem;font-size:.9rem;line-height:1.5;padding-right:.8rem}
.tiptext b{color:var(--hotink)}
.tipact{display:flex;gap:.6rem;align-items:center;flex-wrap:wrap}
.tiplater{background:transparent;border:none;color:var(--dim);cursor:pointer;font:inherit;
  font-size:.8rem;text-transform:uppercase;letter-spacing:.05em;text-decoration:underline;padding:.45rem .2rem}
.tiplater:hover{color:var(--hot)}
.tipx{position:absolute;top:.3rem;right:.45rem;background:none;border:none;color:var(--dim);
  font:1.3rem/1 inherit;line-height:1;cursor:pointer;padding:.1rem .3rem}
.tipx:hover{color:var(--hot)}
@media (max-width:640px){.tip{left:.7rem;right:.7rem;max-width:none;bottom:calc(.8rem + env(safe-area-inset-bottom))}}

/* "add to home screen" banner: dismissible install nudge for mobile. Android/
   Chrome gets a real install button (beforeinstallprompt); iOS Safari gets
   Share-sheet instructions, since it has no install API. Slides down from the
   top so it never collides with the bottom-corner support tip / back-to-top. */
.a2hs{position:fixed;left:0;right:0;top:0;z-index:47;background:var(--card);
  border-bottom:2px solid var(--hot);box-shadow:0 4px 0 var(--hot);
  padding:calc(.7rem + env(safe-area-inset-top)) .9rem .7rem;display:flex;align-items:center;gap:.7rem;
  transform:translateY(-110%);transition:transform .28s cubic-bezier(.2,.85,.25,1)}
.a2hs.on{transform:translateY(0)}
.a2hs[hidden]{display:none}
.a2hsicon{width:34px;height:34px;flex:0 0 auto;border:1px solid var(--hot)}
.a2hstext{margin:0;font-size:.82rem;line-height:1.4;flex:1 1 auto;color:var(--ink)}
.a2hstext b{color:var(--hotink)}
.a2hsgo{flex:0 0 auto;white-space:nowrap}
.a2hsx{flex:0 0 auto;background:none;border:none;color:var(--dim);font:1.4rem/1 inherit;cursor:pointer;padding:.1rem .4rem}
.a2hsx:hover{color:var(--hot)}
@media (min-width:641px){.a2hs{left:auto;right:1rem;top:1rem;max-width:380px;border:2px solid var(--hot);box-shadow:6px 6px 0 var(--hot);transform:translateY(-160%)}}

/* end-of-page support callout: an in-flow banner just above the footer that
   fades in once it scrolls into view (reduced-motion users get it instantly). */
.endtip{max-width:680px;margin:2.6rem auto .4rem;background:var(--card);border:2px dashed var(--hot);
  padding:1.2rem 1.3rem;text-align:center;opacity:0;transform:translateY(12px);
  transition:opacity .5s ease,transform .5s ease}
.endtip.in{opacity:1;transform:none}
.endtip p{margin:0 0 .95rem;color:var(--ink);font-size:.95rem;line-height:1.6}
.endtip b{color:var(--hotink)}
/* ---- tape deck: radio + mixtapes as ONE object ---- */
/* These were two separate centered callouts stacked above the donate callout,
   which read as three of the same box back to back. They are the same intent
   (hear the scene), so they are now one cassette J-card: a titled label band
   over an A-side / B-side split. Deliberately a different SHAPE from the donate
   callout below it (banded + two-column, vs centered + dashed) so the page stops
   repeating one rhythm. Square corners, 0-blur offset shadow, olive band. */
/* Laid out with the real anatomy of a cassette J-card, unfolded: COVER panel |
   dotted fold | narrow SPINE with the title running vertically | dotted fold |
   INTERIOR panel with the catalog number and tracklist. The folds are dotted
   (like a print template's crease marks), the spine carries a small solid color
   bar at its foot the way pressed tapes do, and the interior reads top to
   bottom: catalog no., title, tracklist with dot leaders, format line. */
.tapedeck{max-width:760px;margin:2.8rem auto .4rem;background:var(--card);
  border:2px solid var(--tape);box-shadow:5px 5px 0 var(--hot);display:flex;overflow:hidden}
/* cover panel: the "front" art — logo pressed on black */
.tdcover{flex:none;width:34%;background:#000;display:flex;flex-direction:column;
  align-items:center;justify-content:center;gap:.45rem;padding:1.1rem .8rem;text-align:center}
.tdcover img{width:60%;max-width:130px;display:block}
.tdcovertitle{font-family:"Anton","Special Elite",sans-serif;text-transform:uppercase;
  letter-spacing:.1em;font-size:1.15rem;color:var(--ink);line-height:1.1}
.tdcoversub{font-size:.66rem;color:var(--dim);letter-spacing:.14em;text-transform:uppercase}
/* spine: vertical title strip between two fold lines, color bar at the foot */
.tdspine{flex:none;width:2.1rem;border-left:2px dotted var(--line);border-right:2px dotted var(--line);
  display:flex;flex-direction:column;align-items:center;padding:.6rem 0 .5rem}
.tdspinetext{writing-mode:vertical-rl;white-space:nowrap;font-size:.62rem;
  letter-spacing:.18em;text-transform:uppercase;color:var(--dim)}
.tdspinebar{margin-top:auto;width:.5rem;height:2.4rem;background:var(--hot)}
/* interior panel: catalog no., title, tracklist, format line */
.tdbody{flex:1;min-width:0;padding:.85rem 1.05rem .9rem;display:flex;flex-direction:column}
.tdcat{font-size:.68rem;color:var(--hotink);letter-spacing:.2em;text-transform:uppercase}
.tdtitle{margin:.1rem 0 .1rem;font-family:"Anton","Special Elite",sans-serif;font-weight:400;
  text-transform:uppercase;letter-spacing:.05em;font-size:1.45rem;line-height:1.1;color:var(--ink)}
.tdcap{margin:0 0 .45rem;font-size:.74rem;color:var(--dim);letter-spacing:.03em}
.tdtrack{padding:.6rem 0 .1rem;border-top:2px dashed var(--line)}
.tdline{display:flex;align-items:baseline;gap:.5rem;margin-bottom:.3rem}
.tdno{flex:none;color:var(--dim);font-size:.78rem;letter-spacing:.08em}
.tdname{flex:none;color:var(--hotink);font-size:.97rem}
.tdlead{flex:1;min-width:1rem;border-bottom:2px dotted var(--line);transform:translateY(-.3rem)}
.tdlen{flex:none;color:var(--dim);font-size:.78rem;letter-spacing:.06em}
.tdtrack p{margin:0 0 .7rem;color:var(--ink);font-size:.88rem;line-height:1.5}
.tdfoot{margin-top:.55rem;padding-top:.45rem;border-top:2px dashed var(--line);
  font-size:.64rem;color:var(--dim);letter-spacing:.16em;text-transform:uppercase}
@media (max-width:620px){
  .tdcover{width:29%;padding:.9rem .5rem}
  .tdcover img{width:74%}
  .tdcovertitle{font-size:.92rem}
  .tdcoversub{display:none}
  .tdspine{width:1.8rem}
  .tdbody{padding:.75rem .8rem .8rem}
  .tdline{flex-wrap:wrap;gap:.4rem}
  .tdlead{display:none}
}

@media (max-width:640px){
  #calgrid{display:none}#agenda{display:block}
  .totop{display:none}  /* the sticky nav already covers this on phones */

  /* header: tighter so shows are reachable sooner — same big punk type */
  header{padding:1.5rem 1rem .2rem}
  header .logo{width:126px;height:126px;margin-bottom:.5rem}
  h1{font-size:clamp(2.2rem,11.5vw,3.05rem)}  /* fits "DIYPENSACOLA" (12ch, 7.23em wide) on phones down to 320px */
  /* the tagline is one sentence and must READ as one line — "or die" dangling on
     its own row looked like a mistake. It's 32.98em wide in Special Elite, so the
     size is solved from the viewport (100vw minus the 1rem header padding each
     side) instead of guessed: 2.95vw - .9px keeps it just inside the screen down
     to ~320px, and it stops growing at .83rem once the phone is wide enough. */
  header .tag{font-size:clamp(.52rem,calc(2.95vw - .9px),.83rem);margin-top:.5rem;line-height:1.45;white-space:nowrap;overflow:hidden}
  /* overflow:hidden is the guard for the Courier fallback: it's a wider face, so
     during the Google Fonts swap the nowrap line would otherwise make the whole
     page scroll sideways for a beat. Clipped for that beat beats that. */

  /* 8 buttons, 2 rows of 4 — but still taped-up scraps, not a tidy grid:
     each keeps its border/shadow/tilt, alternating rotation so the row reads
     hand-placed even though the columns line up. */
  .links{display:grid;grid-template-columns:repeat(4,1fr);gap:.65rem .5rem;padding:.7rem .85rem .15rem;max-width:100%}
  .links a{font-size:.64rem;padding:.5rem .35rem;text-align:center;line-height:1.25;box-shadow:2px 2px 0 var(--hot)}
  .links a:nth-child(4n+1),.links a:nth-child(4n+3){transform:rotate(-1.4deg)}
  .links a:nth-child(4n+2),.links a:nth-child(4n){transform:rotate(1.3deg)}

  /* sticky segmented view-switcher — always one tap away */
  /* sticks below the install banner when it's up: --a2hs-h (set by JS to the
     banner's height, else 0) keeps the view-switcher from hiding behind it. */
  nav{position:sticky;top:calc(var(--a2hs-h,0px) + var(--modebar-h,0px));z-index:40;gap:.5rem;margin-bottom:.2rem;
    transition:top .28s cubic-bezier(.2,.85,.25,1);
    padding:.55rem .8rem;padding-top:calc(.55rem + env(safe-area-inset-top));
    background:var(--scrim);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);
    border-bottom:1px solid var(--line)}
  nav a{flex:1;text-align:center;padding:.58rem .3rem;font-size:.82rem}
  main section{scroll-margin-top:calc(4.4rem + var(--a2hs-h,0px) + var(--modebar-h,0px))}
  main{padding:0 .85rem}

  /* controls + chips: comfy 44px-ish tap targets */
  .controls{padding:0}
  .searchtoggle{width:2.7rem;height:2.7rem;font-size:1.35rem}
  .vchip,.tagchip{padding:.6rem .8rem;font-size:.8rem;min-height:44px;display:inline-flex;align-items:center;justify-content:center}
  .search input{height:2.7rem}

  .show{padding:.85rem;gap:.85rem}
  #b-tonight .show img.thumb{width:112px;height:140px}

  /* detail view becomes a slide-up bottom sheet with a grab handle */
  .detail{align-items:flex-end;padding:0}
  .detail .dbox{width:100%;max-width:100%;max-height:90vh;border:none;border-top:3px solid var(--hot);
    border-radius:20px 20px 0 0;box-shadow:none;-webkit-overflow-scrolling:touch;
    padding:1.6rem 1.05rem calc(1.3rem + env(safe-area-inset-bottom));
    animation:sheetup .3s cubic-bezier(.2,.85,.25,1) both}
  .detail .dbox::before{content:"";position:absolute;top:.6rem;left:50%;transform:translateX(-50%);
    width:44px;height:5px;border-radius:3px;background:var(--dim);opacity:.6;z-index:3}
  /* on mobile the grab handle IS the close affordance (swipe the sheet down), so
     drop the X — it otherwise sits on top of the full-width flyer. #detail wins
     over the later .lb .x rule (the detail sheet also carries the .lb class). */
  #detail .x{display:none}
  .dflyer{width:100%;max-width:100%;margin-top:.4rem}
  .detail .dinfo{padding-right:0}
  .dinfo h2{font-size:1.5rem}
  .dactions{gap:.5rem}
  .dactions .dbtn{flex:1;justify-content:center;padding:.7rem .8rem}

  /* roomier lightbox close, clear of the notch */
  .lb .x{font-size:2.3rem;width:2.6rem;height:2.6rem;display:flex;align-items:center;justify-content:center;
    top:calc(.5rem + env(safe-area-inset-top));right:.8rem}
  .lb img#lbimg{max-height:84vh}

  footer{padding:2rem 1rem calc(2rem + env(safe-area-inset-bottom))}

  /* the photocopy poster is a desktop ritual; on phones the nav space is scarcer
     than the feature is useful, so the print button sits this one out. */
  .pwrap{display:none}
}

@media (prefers-reduced-motion:reduce){
  html{scroll-behavior:auto}
  *{animation-duration:.001ms!important;animation-iteration-count:1!important;transition:none!important}
}

/* ---------- accessibility: visible keyboard focus + skip link ---------- */
/* The styles above strip outlines on :hover/:focus for the pressed-tape look,
   which leaves keyboard users with no focus indicator. :focus-visible only
   matches keyboard focus, so this restores a high-contrast ring for keyboard
   and screen-reader users while mouse/touch users see the unchanged zine look. */
a:focus-visible,button:focus-visible,input:focus-visible,[tabindex]:focus-visible,
.show:focus-visible,.cf:focus-visible,.athumb:focus-visible,.vchip:focus-visible,
.tagchip:focus-visible,.searchtoggle:focus-visible,.search input:focus-visible{
  outline:3px solid var(--tape);outline-offset:2px}
/* skip link: off-screen until a keyboard user Tabs to it, then a tape chip
   top-left that jumps straight to the show list. */
.skip{position:absolute;left:-9999px;top:0;z-index:60;background:var(--tape);color:#111;
  border:2px solid #111;box-shadow:3px 3px 0 var(--hot);padding:.5rem .9rem;text-decoration:none;
  text-transform:uppercase;letter-spacing:.05em;font-size:.85rem}
.skip:focus{left:8px;top:8px}

/* ---------- standalone per-show pages (site/s/<id>.html) ---------- */
/* Real shareable URLs so a link previews with that show's flyer. They reuse the
   zine tokens above and stay script-free (stricter CSP). */
.showpage main.spwrap{max-width:760px}
.showpage header{padding:1.6rem 1rem .2rem;text-align:left}
.showpage .home{display:inline-flex;align-items:center;gap:.7rem;text-decoration:none;color:var(--ink)}
.showpage .home img{width:64px;height:64px;filter:drop-shadow(0 0 10px rgba(255,255,255,.16))}
.showpage .home span{font-family:"Special Elite","Courier New",monospace;text-transform:uppercase;
  letter-spacing:.03em;font-size:1.35rem;text-shadow:3px 3px 0 var(--hot)}
.spcard{display:flex;gap:1.3rem;background:var(--card);border:1px solid var(--line);
  box-shadow:8px 8px 0 var(--hot);padding:1.2rem;flex-wrap:wrap;margin-top:1.1rem}
.spflyer{width:300px;max-width:100%;border:2px solid var(--ink);background:#000;display:block;
  align-self:flex-start;cursor:zoom-in}
.spinfo{flex:1;min-width:15rem}
.spinfo h1{margin:.1rem 0 .7rem;font-family:"Anton","Special Elite",sans-serif;font-weight:400;
  font-size:clamp(1.7rem,6vw,2.1rem);line-height:1.05;letter-spacing:.01em;text-transform:uppercase;
  transform:none;text-shadow:none}
.spback{text-align:center;margin:1.7rem 0 .5rem}
.spback a{text-decoration:none}
/* ---------- showgoer guide (site/guide.html) — blog-post layout ---------- */
.guide{max-width:680px}
.guide h1{font-family:"Anton","Special Elite",sans-serif;font-weight:400;text-transform:uppercase;
  font-size:clamp(2rem,8vw,3rem);line-height:1.08;letter-spacing:.01em;margin:.4rem 0 .95rem;
  text-shadow:3px 3px 0 var(--hot)}
.glead{color:var(--dim);margin:0 0 2.4rem;line-height:1.7;font-size:.92rem}
.post h2{font-family:"Anton","Special Elite",sans-serif;font-weight:400;text-transform:uppercase;
  font-size:clamp(1.45rem,5.5vw,2rem);line-height:1.05;letter-spacing:.01em;color:var(--hotink);
  margin:2.2rem 0 .7rem;padding-top:1.5rem;border-top:2px dashed var(--line)}
.post h2:first-child{border-top:none;padding-top:0;margin-top:.5rem}
.post p{margin:0 0 1.05rem;line-height:1.75}
.post em{font-style:italic;color:var(--ink)}
.post strong{color:var(--ink)}
@media (max-width:640px){.showpage header{text-align:center}.spflyer{width:100%}.spcard{padding:1rem}}

/* ---------- flyer wall: the telephone-pole view of the upcoming feed ----------
   Toggleable; the list stays the default. Cards become layered posters: full-width
   flyer, slight alternating rotations, a tape strip across the top corner, and a
   caption strip underneath. Same DOM, same click-to-open detail. */
#list.wall .cards{display:block;column-count:3;column-gap:1.2rem}
#list.wall .bucket{max-width:880px}
#list.wall .show{display:block;padding:0;background:transparent;border:none;box-shadow:none;
  break-inside:avoid;margin:0 0 1.5rem;position:relative}
#list.wall .show:nth-child(3n+1){transform:rotate(-1.6deg)}
#list.wall .show:nth-child(3n+2){transform:rotate(1.2deg)}
#list.wall .show:nth-child(3n){transform:rotate(-.5deg)}
#list.wall .show:hover,#list.wall .show:focus{transform:rotate(0) scale(1.02);box-shadow:none;z-index:2}
/* the tape sits ON the poster's top edge (like tape actually holding it up), so
   it can never float loose in the gap between two stacked posters. */
#list.wall .thumbwrap::before{content:"";position:absolute;top:2px;left:50%;transform:translateX(-50%) rotate(-2deg);
  width:64px;height:18px;background:var(--tape);opacity:.8;z-index:3;box-shadow:0 1px 2px rgba(0,0,0,.4)}
#list.wall .show img.thumb{width:100%;height:auto;max-height:none;border:3px solid var(--ink);
  box-shadow:6px 6px 0 var(--shadow);background:#000}
#list.wall .show img.thumb.ph{padding:1.4rem;opacity:.75}
#list.wall .info{background:var(--card);border:1px solid var(--line);border-top:none;padding:.5rem .7rem .6rem;
  margin:0 3px;box-shadow:6px 6px 0 var(--shadow)}
#list.wall .show h3{font-size:1rem}
/* tonight stays the same poster size as everything else (a blown-up flyer reads
   badly); it's marked instead by the hot border + tape, and the TONIGHT header. */
#list.wall #b-tonight .show img.thumb{transform:none;border-color:var(--hot);box-shadow:6px 6px 0 var(--hot)}
#list.wall #b-tonight .show h3{font-size:1rem}
#list.wall #b-tonight .thumbwrap::before{background:var(--hot)}
@media (max-width:900px){#list.wall .cards{column-count:2}}
@media (max-width:560px){#list.wall .cards{column-count:1}}

/* saved-shows tab: one undivided wall. The tonight/this week/next week/later
   split is a scanning aid for the full feed and just fragments a handful of
   saved flyers, so the headers (and the quiet-night notice) go and each card's
   own countdown carries the timing instead. */
#list.yours .bhead,#list.yours .bnone{display:none}
#list.yours .bucket{margin-top:0}
/* every saved card is lifted into #b-yours (see the JS), so the masonry runs
   through all of them as one wall instead of breaking a row per date bucket */
#list.wall.yours #b-yours .cards{column-count:3;max-width:none;margin:0}
@media (max-width:900px){#list.wall.yours #b-yours .cards{column-count:2}}
@media (max-width:560px){#list.wall.yours #b-yours .cards{column-count:1}}
/* a saved show happening today keeps the hot border it wears in the tonight bucket */
#list.wall.yours .show.istonight img.thumb{border-color:var(--hot);box-shadow:6px 6px 0 var(--hot)}
#list.wall.yours .show.istonight .thumbwrap::before{background:var(--hot)}

/* ---------- print poster: "print this week" photocopy handout ---------- */
.printhead,.printfoot{display:none}
@media print{
  /* The photocopy poster. Not the web page in black and white: a dense zine
     flyer-wall someone would actually staple to a pole — double-rule masthead
     with a tilted FREE/TAKE ONE stamp and a framed QR, ink-black section bars,
     three columns of hand-tilted flyer tiles, and a bottom rule with a YOUR
     SHOW HERE recruitment box. All pure ink: black bars are forced with
     print-color-adjust since photocopiers are the target output anyway. */
  @page{margin:.4in}
  body{background:#fff;color:#000;font:10.5pt/1.35 "Special Elite","Courier New",monospace}
  header,.links,.modebar,nav,.controls,#grid,.endtip,.tapedeck,footer,.totop,.tip,.a2hs,.lb,.detail,#nohits,#noupcoming,.tstrip,.printbar,.savebtn,.doorsin,.bnone,.ht{display:none!important}
  main:not(:has(section:target)) #list{display:block}
  main section{display:none!important}
  main section#list{display:block!important}
  /* ---- masthead: gutter (FREE stamp) · title stack · QR ---- */
  .printhead{display:grid;grid-template-columns:1in 1fr 1in;column-gap:.14in;align-items:start;text-align:center;border-bottom:6px double #000;margin-bottom:.2in;padding-bottom:.14in}
  .pfree{grid-column:1;grid-row:1;justify-self:start;align-self:start;background:#000;color:#fff;
    -webkit-print-color-adjust:exact;print-color-adjust:exact;
    font-size:8pt;letter-spacing:.14em;text-transform:uppercase;padding:.05in .08in;transform:rotate(-4deg);margin-top:.12in}
  .printhead .pt{grid-column:2;font-family:"Anton","Special Elite",sans-serif;font-weight:400;font-size:40pt;line-height:.95;text-transform:uppercase;letter-spacing:.02em}
  .printhead .ps2{grid-column:2;justify-self:center;font-size:9pt;letter-spacing:.16em;text-transform:uppercase;margin-top:.06in;border-top:2px solid #000;border-bottom:2px solid #000;padding:.025in .12in}
  .printhead .ps{grid-column:2;font-size:10pt;margin-top:.06in}
  /* QR back to the site: paper on a pole should route people to the calendar */
  .pqr{grid-column:3;grid-row:1/span 3;justify-self:end}
  .pqr img{display:block;width:.9in;height:.9in;margin:0 auto;border:2px solid #000;padding:.04in}
  .pqr small{display:block;font-size:6.5pt;letter-spacing:.08em;text-transform:uppercase;margin-top:.04in;text-align:center}
  /* ---- section bars: solid ink, condensed caps ---- */
  .bucket{max-width:none;margin:0}
  /* section bars in Rock Salt: the site's hand-scrawl is reserved for period
     headers (month headers on screen), and tonight/this week/next week ARE
     period headers — white scrawl on an ink bar reads like marker on gaff tape */
  .bhead{display:block;background:#000!important;color:#fff!important;
    -webkit-print-color-adjust:exact;print-color-adjust:exact;
    border:0!important;box-shadow:none!important;transform:none!important;
    font-family:"Rock Salt","Special Elite",cursive;font-weight:400;font-size:11pt;
    letter-spacing:.06em;text-transform:lowercase;padding:.05in .1in .07in;margin:.22in 0 .02in;break-after:avoid}
  #b-tonight .bhead{margin-top:.04in}
  .bhead::after{display:none}
  .bhead .lab{background:none!important;color:#fff!important;padding:0;transform:none!important;box-shadow:none!important;border:0!important}
  /* ---- the gig guide: a date-led ledger, not a collage of boxes ---- */
  /* One fluent chronological flow, set like a zine listings page: flyer at
     left in a fixed column, typography at right (date line, lineup in big
     condensed caps, venue-time-price in typewriter), a dashed rule between
     rows, and no card boxes at all. Tonight's rows run a double-size flyer —
     the headline act. Rows never split across pages; a single flow means no
     multicol holes.
     !important throughout: the screen poster-feed rules
     (#list:not(.wall) #b-tonight .show{display:grid}, per-bucket thumb sizes,
     the dense-list frame, clamp()'d h3 sizes...) sit LATER in this sheet with
     id-level specificity, so plain print declarations lose to them. Print is
     the one place a blanket !important is the honest tool. */
  .cards{display:block!important;column-count:auto!important;
    border:0!important;background:none!important;box-shadow:none!important;gap:0!important}
  .show{display:grid!important;grid-template-columns:1in 1fr!important;gap:.16in!important;
    align-items:center!important;width:auto!important;break-inside:avoid;
    margin:0!important;padding:.1in .02in!important;flex:none!important;
    background:none!important;border:0!important;border-bottom:1.5px dashed #000!important;
    box-shadow:none!important;color:#000!important;transform:none!important}
  .cards .show:last-child{border-bottom:0!important}
  #b-tonight .show{grid-template-columns:2.2in 1fr!important;padding:.14in .02in!important}
  .thumbwrap{display:block!important;width:100%!important;max-width:none!important;
    aspect-ratio:auto!important;margin:0!important;padding:0!important;flex:none!important}
  .thumbwrap::before{display:none!important}   /* screen-only tape */
  .show img.thumb{display:block!important;width:100%!important;height:auto!important;
    max-height:none!important;object-fit:contain!important;transform:none!important;
    filter:grayscale(1) contrast(1.15)!important;background:#fff!important;
    border:1.5px solid #000!important;padding:0!important}
  .show .info{display:block!important;min-width:0}
  .show .daterow{display:flex!important;flex-wrap:wrap;gap:.06in;align-items:center;margin-bottom:.02in}
  .show .date{display:inline-block!important;background:#000!important;color:#fff!important;
    -webkit-print-color-adjust:exact;print-color-adjust:exact;
    border:0!important;box-shadow:none!important;transform:none!important;
    padding:.015in .05in!important;font-weight:400;
    font-family:"Special Elite","Courier New",monospace!important;
    font-size:8.5pt!important;letter-spacing:.12em;text-transform:uppercase}
  .stamp{position:static!important;transform:none!important;color:#000!important;
    border:1.5px solid #000!important;background:#fff!important;text-shadow:none!important;
    font-size:6.5pt!important;letter-spacing:.08em}
  .show h3{margin:.015in 0!important;font-family:"Anton","Special Elite",sans-serif!important;font-weight:400!important;
    font-size:15pt!important;line-height:1.05!important;text-transform:uppercase;letter-spacing:.015em!important;
    text-wrap:balance}
  #b-tonight .show h3{font-size:21pt!important}
  .show h3 .more{font-size:9pt!important;color:#333!important}
  .meta{color:#000!important;font-size:9pt!important;line-height:1.4!important;letter-spacing:.02em}
  .meta a.vlink{color:#000!important;text-decoration:none!important;border:0!important}
  .show.off h3{text-decoration:line-through!important}
  /* ---- footer: the recruitment rail. This poster gets handed out at shows,
     so the bottom sells the site: a scrawled "there's more" lead, three boxed
     teasers with real archive numbers, then the sign-off + YOUR SHOW HERE. ---- */
  .printfoot{display:block;border-top:6px double #000;margin-top:.16in;padding-top:.1in;break-inside:avoid}
  .pfmore{font-family:"Rock Salt","Special Elite",cursive;font-size:11pt;margin:.02in 0 .09in;text-align:center}
  .pfpromos{display:grid;grid-template-columns:1fr 1fr 1fr;gap:.14in}
  .pfpromo{border:2px solid #000;padding:.07in .09in .08in;text-align:center}
  .pfpromo:nth-child(1){transform:rotate(-.6deg)}
  .pfpromo:nth-child(3){transform:rotate(.6deg)}
  .pfphead{font-family:"Anton","Special Elite",sans-serif;font-size:11.5pt;text-transform:uppercase;letter-spacing:.06em;
    border-bottom:1.5px dashed #000;padding-bottom:.03in;margin-bottom:.045in}
  .pfptext{font-size:7.4pt;line-height:1.45}
  .pfpurl{font-size:7.6pt;font-weight:700;letter-spacing:.04em;margin-top:.045in;
    background:#000;color:#fff;-webkit-print-color-adjust:exact;print-color-adjust:exact;
    display:inline-block;padding:.015in .05in}
  .pfrow{display:grid;grid-template-columns:1fr auto;gap:.24in;align-items:center;
    border-top:1.5px dashed #000;margin-top:.12in;padding-top:.09in}
  .pfbig{font-family:"Rock Salt","Special Elite",cursive;font-size:13pt}
  .pfsmall{font-size:8pt;letter-spacing:.05em;margin-top:.05in}
  .pfsubmit{border:2.5px dashed #000;padding:.08in .16in;text-align:center;transform:rotate(1deg)}
  .pfsubhead{font-family:"Anton","Special Elite",sans-serif;font-size:12pt;text-transform:uppercase;letter-spacing:.1em}
  .pfsubtxt{font-size:7.5pt;margin-top:.03in;line-height:1.45}
  body.printweek .show:not(.pw){display:none!important}
  body.printweek .bucket:not(.pw-has){display:none!important}
}

/* ---------- band-page quick hits under the search box ---------- */
#bandhits{margin-top:.45rem}
#bandhits a{display:inline-block;font-size:.78rem;text-decoration:none;color:var(--ink);background:var(--card);
  border:2px dashed var(--dim);padding:.35rem .6rem;margin:0 .35rem .35rem 0;text-transform:lowercase}
#bandhits a:hover{border-color:var(--hot);color:var(--hot)}
#bandhits a small{color:var(--dim)}

/* ---------- band + venue pages (script-free, reuse zine tokens) ---------- */
.dirwrap{max-width:760px}
.dirhead{font-family:"Anton","Special Elite",sans-serif;font-weight:400;text-transform:uppercase;
  font-size:clamp(1.9rem,7vw,2.7rem);line-height:1.06;letter-spacing:.01em;margin:.4rem 0 .4rem;
  text-shadow:3px 3px 0 var(--hot);transform:none}
.dirsub{color:var(--dim);margin:0 0 1.4rem;font-size:.92rem;line-height:1.6}
/* the archive hub stacks the taped link cluster right above the big SEARCH THE
   SCENE headline; the shared .links row sits tight by default, so give the whole
   archive main air up top and a touch more space under the headline. */
.arcwrap{padding-top:2rem}
.arcwrap .dirhead{margin:0 0 .7rem}
.arcwrap .dirsub{margin-bottom:1.6rem}
/* the "?" help badge next to SEARCH THE SCENE, linking to archive-help.html */
.helpq{display:inline-flex;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;
  margin-left:.5rem;vertical-align:.28em;border:2px solid var(--hot);color:var(--hot);border-radius:50%;
  font-family:"Special Elite",monospace;font-size:.9rem;line-height:1;text-decoration:none;
  text-shadow:none;box-shadow:none;flex:none}
.helpq:hover,.helpq:focus-visible{background:var(--hot);color:var(--on-hot)}
/* the archive-help page: readable prose cards + the "try this" recipe list */
.archelp .dirhead{margin:.2rem 0 1rem}
.archelp .spcard{margin:0 0 1.1rem}
.archelp .spcard h2{font-family:"Anton","Special Elite",sans-serif;font-weight:400;text-transform:uppercase;
  letter-spacing:.02em;color:var(--hotink);font-size:1.35rem;margin:0 0 .6rem}
.archelp p{line-height:1.6;margin:.5rem 0}
.archelp .caselist li{margin-bottom:.7rem;line-height:1.55}
.archelp .caselist li b{color:var(--hotink)}
.dirsec{font-family:"Anton","Special Elite",sans-serif;font-weight:400;text-transform:uppercase;letter-spacing:.03em;
  font-size:1.25rem;margin:1.8rem 0 .7rem;color:var(--hotink)}
.actsec>.dirsec{display:flex;align-items:center;gap:.6rem;flex-wrap:wrap}
.sortsel{margin-left:auto;background:var(--card);color:var(--ink);border:2px dashed var(--dim);
  font:.72rem/1.2 "Special Elite","Courier New",monospace;text-transform:uppercase;letter-spacing:.04em;
  padding:.35rem 1.4rem .35rem .5rem;cursor:pointer;-webkit-appearance:none;appearance:none;
  background-image:linear-gradient(45deg,transparent 50%,var(--dim) 50%),linear-gradient(135deg,var(--dim) 50%,transparent 50%);
  background-position:calc(100% - .55rem) center,calc(100% - .35rem) center;background-size:.3rem .3rem,.3rem .3rem;background-repeat:no-repeat}
.sortsel:hover{border-color:var(--hot);color:var(--hot)}
.sortsel:focus{outline:none;border-color:var(--hot)}
.dirlist{list-style:none;padding:0;margin:0}
.dirlist li{display:flex;gap:.7rem;align-items:baseline;padding:.45rem 0;border-bottom:1px dashed var(--line);font-size:.95rem;flex-wrap:wrap}
.dirlist .date{width:6.6rem;flex:none}
.dirlist a{text-decoration:none}
.dirlist a:hover{text-decoration:underline}
.dirlist .meta{color:var(--dim);font-size:.85rem}
/* act dossier masthead: the band page opens like the act's file in the scene's
   records. Tilted Anton name + a rotated inked stamp (local / on tour), the
   show count as plain text, the next gig as a cassette-tape banner, and
   the venues they've hit as chips linking to venue pages. All static,
   script-free, and built from the same zine tokens as the rest of the site. */
.actmast{display:flex;align-items:baseline;gap:.85rem;flex-wrap:wrap}
.actmast .dirhead{transform:rotate(-1deg);margin-bottom:.15rem}
.ostamp{font:.7rem/1.2 "Special Elite","Courier New",monospace;text-transform:uppercase;letter-spacing:.07em;
  border:2px solid currentColor;padding:.24rem .55rem;background:var(--scrim);white-space:nowrap;
  color:var(--hotink);transform:rotate(5deg);align-self:center}
.ostamp.tour{color:var(--dim);transform:rotate(-4deg)}
.tallyrow{display:flex;align-items:center;column-gap:.8rem;row-gap:.3rem;flex-wrap:wrap;margin:.55rem 0 .2rem}
.tcap{color:var(--dim);font-size:.85rem}
.tcap b{color:var(--ink);font-weight:400}
.nextgig{display:inline-flex;align-items:baseline;gap:.55rem;background:var(--tape);color:#111;border:2px solid #111;
  box-shadow:4px 4px 0 var(--hot);padding:.55rem .95rem;margin:.9rem 0 .3rem;text-decoration:none;
  font-family:"Anton","Special Elite",sans-serif;text-transform:uppercase;letter-spacing:.04em;font-size:1.08rem;
  transform:rotate(-1deg);transition:background .12s ease,color .12s ease,box-shadow .12s ease}
.nextgig small{font-family:"Special Elite","Courier New",monospace;font-size:.68rem;letter-spacing:.08em}
.nextgig:hover{background:var(--hot);color:var(--on-hot);box-shadow:4px 4px 0 var(--tape)}
.nextgig:active{transform:rotate(-1deg) translate(2px,2px);box-shadow:1px 1px 0 var(--hot)}
.nextgig:focus-visible{outline:3px solid var(--tape);outline-offset:2px}
@media (max-width:560px){.nextgig{display:flex;justify-content:center;text-align:center;flex-wrap:wrap}}
.vstamps{display:flex;flex-wrap:wrap;gap:.5rem;align-items:center;margin:.9rem 0 .2rem}
.vstamps .lead{color:var(--dim);font-size:.78rem;text-transform:uppercase;letter-spacing:.06em}
.vstamps a{font:.76rem/1.2 "Special Elite","Courier New",monospace;text-transform:lowercase;color:var(--ink);
  text-decoration:none;border:2px dashed var(--line);padding:.32rem .6rem;background:var(--card)}
.vstamps a:nth-child(even){transform:rotate(1.3deg)}
.vstamps a:nth-child(odd){transform:rotate(-1.2deg)}
.vstamps a:hover,.vstamps a:focus-visible{border-color:var(--hot);border-style:solid;color:var(--hotink)}
.resume{list-style:none;margin:.9rem 0 .15rem;padding:0;max-width:36rem}
.resume li{display:flex;align-items:baseline;gap:.85rem;padding:.32rem 0;border-bottom:1px dashed var(--line);
  font:.86rem/1.5 "Special Elite","Courier New",monospace}
.resume li:last-child{border-bottom:none}
.resume .rk{flex:none;min-width:7.4rem;color:var(--dim);font-size:.66rem;text-transform:uppercase;letter-spacing:.09em}
.resume .rv{color:var(--ink)}
.resume .rv small{color:var(--dim);font-size:.72rem}
.resume .rv a{color:var(--hotink);text-decoration-style:dotted;text-underline-offset:3px}
.resume .rv a:hover,.resume .rv a:focus-visible{color:var(--ink);text-decoration-style:solid}
@media (max-width:560px){.resume .rk{min-width:6rem}}
/* scene-history line on act + venue pages (derived from the record at build time) */
.actstory{max-width:36rem;margin:.55rem 0 .2rem;color:var(--ink);
  font:.88rem/1.7 "Special Elite","Courier New",monospace}
/* cited pull-quotes (band-research.json): torn-clipping blockquotes with source links */
.pressrow{display:flex;flex-wrap:wrap;gap:1rem;max-width:760px}
.pressq{flex:1 1 20rem;margin:0;padding:.9rem 1rem .7rem;background:var(--card);
  border:1px solid var(--line);border-left:4px solid var(--hot)}
.pressq:nth-child(even){transform:rotate(.4deg)}
.pressq:nth-child(odd){transform:rotate(-.35deg)}
.pressq blockquote{margin:0 0 .5rem;color:var(--ink);
  font:.92rem/1.65 "Special Elite","Courier New",monospace}
.pressq figcaption{color:var(--dim);font-size:.68rem;text-transform:uppercase;letter-spacing:.09em}
.pressq figcaption a{color:var(--hotink);text-decoration-style:dotted;text-underline-offset:3px}
.pressq figcaption a:hover,.pressq figcaption a:focus-visible{color:var(--ink);text-decoration-style:solid}
.pressq figcaption small{text-transform:none;letter-spacing:0}
.bandindex{columns:2;column-gap:2rem;max-width:760px}
@media (max-width:560px){.bandindex{columns:1}}
.bandindex a{display:block;padding:.32rem 0;border-bottom:1px dashed var(--line);text-decoration:none;color:var(--ink);break-inside:avoid}
.bandindex a:hover{color:var(--hot)}
.bandindex a small{color:var(--dim)}
.bandindex .letter{font-family:"Rock Salt",cursive;color:var(--hotink);margin:1.1rem 0 .3rem;font-size:1.05rem;break-after:avoid}
.dirnote{color:var(--dim);font-size:.85rem;border:2px dashed var(--line);background:var(--card);padding:.8rem 1rem;margin:1.6rem 0 0;line-height:1.6}
/* ---------- act pages: poster-led dossier (b/<slug>.html) ----------
   The masthead pairs the act's file with its latest flyer taped up as a real
   poster; the flyer archive is a telephone-pole wall (whole flyers, tape,
   alternating tilt) instead of square crops; and the show record reads as a
   dated gig ledger whose co-billed names link across the scene. Script-free,
   built from the same zine tokens as everything else. */
.actpage{max-width:980px}
.acthero{display:flex;gap:2.4rem;align-items:flex-start;margin-top:1.1rem}
/* the info + media (youtube/bandcamp) box together as one contained card; the
   flyer poster stays outside it, taped up beside it like any other flyer */
.actcard{flex:1;min-width:0;background:var(--card);border:1px solid var(--line);
  box-shadow:8px 8px 0 var(--hot);padding:1.3rem 1.4rem 1.5rem}
.heroinfo{min-width:0}
.actpage .dirhead{font-size:clamp(2.3rem,8vw,3.8rem);text-shadow:4px 4px 0 var(--hot)}
.heropost{flex:none;width:min(300px,36%);position:relative;display:block;text-decoration:none;
  transform:rotate(1.8deg);margin-top:.5rem}
.heropost::before{content:"";position:absolute;top:-7px;left:50%;transform:translateX(-50%) rotate(-3deg);
  width:64px;height:17px;background:var(--tape);opacity:.8;z-index:2;box-shadow:0 1px 2px rgba(0,0,0,.4)}
.heropost img{width:100%;height:auto;display:block;border:3px solid var(--ink);
  box-shadow:8px 8px 0 rgba(0,0,0,.5);background:#000}
.heropost .hpcap{display:block;background:var(--card);border:1px solid var(--line);border-top:none;
  margin:0 3px;padding:.4rem .6rem;font:.7rem/1.4 "Special Elite","Courier New",monospace;
  letter-spacing:.06em;text-transform:uppercase;color:var(--dim)}
.heropost:hover img,.heropost:focus-visible img{border-color:var(--hot);box-shadow:8px 8px 0 var(--hot)}
.heropost:hover .hpcap{color:var(--ink)}
.heropost:focus-visible{outline:3px solid var(--tape);outline-offset:3px}
/* upcoming posters keep the SAME cream masking-tape as every other poster (a
   solid green bar read as clip-art, not tape); the "up next" signal lives in the
   green caption text and the hot hover border instead. */
.heropost.up .hpcap{color:var(--hotink)}
@media (max-width:700px){.acthero{flex-direction:column;gap:.4rem}
  .heropost{width:min(320px,92%);align-self:center;margin:1.3rem 0 .4rem;transform:rotate(-1.5deg)}
  .actcard{padding:1rem 1rem 1.2rem}}
/* flyer wall: every flyer this act is on, pinned up whole (no square crop) */
.postwall{column-count:3;column-gap:1.1rem;margin:.5rem 0 .6rem}
@media (max-width:820px){.postwall{column-count:2}}
.pwtile{display:block;break-inside:avoid;position:relative;margin:0 0 1.2rem;text-decoration:none}
.pwtile:nth-child(3n+1){transform:rotate(-1.4deg)}
.pwtile:nth-child(3n+2){transform:rotate(1.1deg)}
.pwtile:nth-child(3n){transform:rotate(-.4deg)}
.pwtile::before{content:"";position:absolute;top:-6px;left:50%;transform:translateX(-50%) rotate(-4deg);
  width:46px;height:13px;background:var(--tape);opacity:.7;z-index:2;box-shadow:0 1px 2px rgba(0,0,0,.4)}
.pwtile img{width:100%;height:auto;display:block;border:2px solid var(--ink);
  box-shadow:5px 5px 0 var(--shadow);background:#000}
.pwcap{display:block;background:var(--card);border:1px solid var(--line);border-top:none;margin:0 3px;
  padding:.32rem .55rem;font-size:.66rem;letter-spacing:.05em;text-transform:uppercase;color:var(--dim)}
.pwtile:hover,.pwtile:focus-visible{transform:rotate(0);z-index:2}
.pwtile:focus-visible{outline:3px solid var(--tape);outline-offset:3px}
.pwtile:hover img,.pwtile:focus-visible img{box-shadow:5px 5px 0 var(--hot)}
.pwtile:hover .pwcap{color:var(--ink)}
.pwtile.up img{border-color:var(--hot)}
/* gig ledger: dated record rows; upcoming rows carry the hot ink */
.gigledger{list-style:none;padding:0;margin:0}
.gigledger li{display:flex;gap:.9rem;align-items:center;padding:.55rem 0;
  border-bottom:1px dashed var(--line);flex-wrap:wrap}
.gdate{flex:none;width:3.6rem;text-align:center;border:2px solid var(--line);background:var(--card);
  padding:.28rem 0 .34rem}
.gdate b{display:block;font-family:"Anton","Special Elite",sans-serif;font-weight:400;
  font-size:1.3rem;line-height:1}
.gdate i{display:block;font-style:normal;font-size:.6rem;letter-spacing:.09em;text-transform:uppercase;
  color:var(--dim);margin-top:.16rem}
.gigledger li.up .gdate{border-color:var(--hot);box-shadow:3px 3px 0 var(--shadow)}
.gwho{flex:1;min-width:12rem;line-height:1.6;font-size:.95rem}
.gwho a{color:var(--ink);text-decoration:underline;text-decoration-style:dotted;text-underline-offset:3px}
.gwho a:hover,.gwho a:focus-visible{color:var(--hotink)}
.gwho .self{font-weight:400;color:var(--hotink)}
.gven{flex:none;font:.72rem/1.2 "Special Elite","Courier New",monospace;text-transform:lowercase;
  border:2px dashed var(--line);padding:.26rem .55rem;color:var(--dim);text-decoration:none;background:var(--card)}
.gven:hover,.gven:focus-visible{border-color:var(--hot);border-style:solid;color:var(--hotink)}
.gigledger li.gyear{border-bottom:none;padding:1rem 0 .15rem}
.gigledger li.gyear span{font-family:"Anton","Special Elite",sans-serif;font-weight:400;font-size:1rem;
  letter-spacing:.06em;color:var(--dim);border:2px solid var(--line);padding:.12rem .55rem;
  display:inline-block;transform:rotate(-2deg);text-transform:uppercase}
/* shared bills: the co-billed web, stamped chips like the venue row */
.bmates{display:flex;flex-wrap:wrap;gap:.55rem;margin:.3rem 0 .4rem}
.bmates a{font:.8rem/1.3 "Special Elite","Courier New",monospace;text-transform:lowercase;color:var(--ink);
  text-decoration:none;border:2px dashed var(--line);padding:.34rem .65rem;background:var(--card)}
.bmates a:nth-child(even){transform:rotate(1.2deg)}
.bmates a:nth-child(odd){transform:rotate(-1.1deg)}
.bmates a small{color:var(--dim);font-size:.68rem}
.bmates a:hover,.bmates a:focus-visible{border-color:var(--hot);border-style:solid;color:var(--hotink)}
/* youtube embeds + bandcamp link-card, grouped in the actcard's media row
   (curated in band-videos.json at the root) */
.ytgrid{display:grid;grid-template-columns:1fr;gap:.7rem;margin:1.2rem 0 0;
  padding-top:1.1rem;border-top:1px dashed var(--line)}
@media (min-width:700px){.ytgrid{grid-template-columns:repeat(2,1fr)}}
.ytwrap{position:relative;aspect-ratio:16/9;background:#000;border:2px solid var(--ink);box-shadow:3px 3px 0 var(--shadow)}
.ytwrap iframe{position:absolute;inset:0;width:100%;height:100%;border:0}
/* bandcamp: no track/album id is on file, so a real EmbeddedPlayer iframe isn't
   possible offline. Modeled on bandcamp's own dark EmbeddedPlayer chrome
   (art thumb + play button, name, scrubber, cta) instead of a plain link. */
.bcembed{position:relative;aspect-ratio:16/9;display:flex;text-decoration:none;
  background:#1a1a1a;border:2px solid var(--ink);box-shadow:3px 3px 0 var(--shadow);overflow:hidden}
.bcembed:hover,.bcembed:focus-visible{box-shadow:3px 3px 0 var(--hot);border-color:var(--hot)}
.bcart{flex:none;width:38%;max-width:9.5rem;position:relative;background:#101010;
  display:flex;align-items:center;justify-content:center}
.bclogoimg{width:48%;height:auto;display:block;filter:drop-shadow(0 2px 3px rgba(0,0,0,.5))}
.bcart .bcplay{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;
  font-size:1.5rem;color:#fff;background:rgba(0,0,0,0);opacity:0;transition:opacity .15s,background-color .15s}
.bcembed:hover .bcart .bcplay,.bcembed:focus-visible .bcart .bcplay{opacity:1;background:rgba(0,0,0,.4)}
.bcbody{flex:1;min-width:0;display:flex;flex-direction:column;justify-content:center;
  gap:.4rem;padding:.9rem 1.1rem}
.bclabel{font-size:.62rem;letter-spacing:.13em;text-transform:uppercase;color:#0f91ff;font-weight:700}
.bcname{font:1rem/1.3 "Special Elite","Courier New",monospace;text-transform:lowercase;
  color:#f4f4f4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.bcscrub{height:4px;border-radius:2px;background:#3a3a3a;overflow:hidden}
.bcscrub .bcfill{display:block;height:100%;width:32%;background:#0f91ff}
.bccta{font-size:.68rem;letter-spacing:.04em;text-transform:uppercase;color:#8fc9f2}
.bcembed:hover .bccta,.bcembed:focus-visible .bccta{color:#fff}

/* ---------- zine polish: date stamp, venue links, act chips, list tape ---------- */
/* (the masthead .upstamp date stamp was removed 2026-07-18; the freshness stamp
   now lives once in the footer as .built, which carries this same look) */
/* venue names in card/list meta link to their venue page */
.meta a.vlink{color:inherit;text-decoration:underline;text-decoration-style:dotted;text-underline-offset:2px}
.meta a.vlink:hover{color:var(--hot)}
/* quiet-night line under the TONIGHT header (shown only when nothing's on today) */
.bnone{color:var(--dim);margin:.1rem 0 0;font-size:.95rem}
.bnone a{color:var(--hotink)}
/* act chips: each lineup name links to its band page (detail modal + show pages) */
.actchips{display:flex;flex-wrap:wrap;gap:.35rem;margin:.1rem 0 .55rem}
.actchips a{font-size:.78rem;text-decoration:none;color:var(--ink);background:var(--card);
  border:2px dashed var(--dim);padding:.3rem .55rem;text-transform:lowercase}
.actchips a:hover{border-color:var(--hot);color:var(--hot)}
/* a little tape holding each list-card flyer down — echoes the wall view's tape
   without changing the card layout. Wall view keeps its own bigger strip. */
#list:not(.wall) .thumbwrap::before{content:"";position:absolute;top:-5px;left:50%;
  transform:translateX(-50%) rotate(-4deg);width:38px;height:11px;background:var(--tape);
  opacity:.5;z-index:2;box-shadow:0 1px 2px rgba(0,0,0,.35);pointer-events:none}
/* a lone poster in a wall bucket centers instead of hugging the left column
   ("no two non-past cards in this bucket"; active filters are a rare, benign miss).
   Skipped in the saved-shows tab, where the headers are gone and per-bucket
   resizing would just look like randomly sized flyers. */
#list.wall:not(.yours) .cards:not(:has(.show:not(.past) ~ .show:not(.past))){column-count:1;max-width:430px;margin:0 auto}

/* ---------- round 2: site-wide zine polish ---------- */
/* tape-label subnav: every subpage carries the strip so nothing dead-ends */
.showpage header{display:flex;align-items:center;justify-content:space-between;gap:.9rem 1.2rem;flex-wrap:wrap}
.subnav{display:flex;gap:.55rem;flex-wrap:wrap}
.subnav a{font-size:.72rem;text-decoration:none;color:#111;background:var(--tape);padding:.32rem .62rem;
  border:2px solid #111;box-shadow:2px 2px 0 var(--hot);text-transform:uppercase;letter-spacing:.06em}
.subnav a:nth-child(odd){transform:rotate(-1.6deg)}
.subnav a:nth-child(even){transform:rotate(1.3deg)}
.subnav a:hover{background:var(--hot);color:var(--on-hot);box-shadow:2px 2px 0 var(--tape)}
.subnav a:active{transform:translate(1px,1px);box-shadow:1px 1px 0 var(--hot)}
@media (max-width:640px){.showpage header{justify-content:center;text-align:center}}
/* halftone rest state on feed thumbs: inks wildly different flyer art into one
   wall; the full-color art is a hover (or the open card) away. hover-only so
   touch devices, which can't hover it off, get full-color flyers straight away */
@media (hover:hover){
  #list:not(.wall) .show img.thumb:not(.ph){transition:filter .18s ease;
    filter:grayscale(.4) sepia(.1) hue-rotate(28deg) saturate(.85) contrast(1.03)}
  #list:not(.wall) .show:hover img.thumb,#list:not(.wall) .show:focus img.thumb{filter:none}
}
/* tonight reads as a torn ticket stub: bone header + doors countdown */
#b-tonight .bhead{color:#111;background:var(--tape);border:2px solid #111;box-shadow:5px 5px 0 var(--hot);
  display:inline-flex;padding:.34rem .9rem .34rem .7rem;transform:rotate(-1.2deg);gap:.65rem}
#b-tonight .ht{background-image:radial-gradient(#111 30%,transparent 32%)}
.doorsin{color:var(--age);white-space:nowrap}
/* quiet-night stamp under the tonight header */
.nstamp{--rot:-2deg;display:inline-block;border:2px solid var(--dim);color:var(--dim);padding:.16rem .55rem;
  text-transform:uppercase;letter-spacing:.09em;font-size:.8rem;margin-right:.4rem;transform:rotate(-2deg)}
/* pull-off tab fringe along the bottom of wall-view posters (one tab gone) */
#list.wall .info::after{content:"";display:block;height:13px;margin:.5rem -.7rem -.6rem;
  background:linear-gradient(var(--bg),var(--bg)) 62% 0/20px 100% no-repeat,
  repeating-linear-gradient(90deg,var(--card) 0 19px,var(--bg) 19px 21px)}
/* calendar: show days get circled by hand instead of boxed hot */
.cal td.has{border:1px dashed var(--line)}
.cal td.has .dnum{position:relative;display:inline-block;color:var(--ink);padding:0 .4em .05em .35em}
.cal td.has .dnum::after{content:"";position:absolute;inset:-5px -6px -3px -6px;pointer-events:none;
  background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 36'%3E%3Cpath d='M14 7C34 2 58 6 59 16c1 11-17 16-31 15C13 30 4 25 5 17 6 10 15 6 27 5' fill='none' stroke='%238f9850' stroke-width='2.6' stroke-linecap='round'/%3E%3C/svg%3E") center/100% 100% no-repeat}
/* stamp slam: inked stamps land once on page load (reduced motion collapses it) */
.ostamp{--rot:5deg}
.ostamp.tour{--rot:-4deg}
.ostamp,.nstamp{animation:stampslam .35s cubic-bezier(.16,1,.3,1) .12s both}
@keyframes stampslam{from{opacity:0;transform:rotate(var(--rot)) scale(1.9)}to{opacity:1;transform:rotate(var(--rot)) scale(1)}}
/* bands index roster: crate-divider letters + a stamp on acts playing this week */
.soonstamp{display:inline-block;font-size:.62rem;color:var(--hotink);border:1px solid var(--hotink);
  padding:.1rem .3rem;margin-left:.35rem;text-transform:uppercase;letter-spacing:.07em;transform:rotate(-2deg)}
.bandindex .letter{display:inline-block;border:2px solid var(--line);background:var(--card);
  padding:.15rem .65rem .25rem;transform:rotate(-2deg);box-shadow:3px 3px 0 var(--shadow)}

/* ==================== REDESIGN 2026: poster feed ====================
   Default (list) view only — the flyer-wall toggle keeps its own look.
   Tonight = hero, this week = full-flyer posters, later = dense list.
   Flyers show WHOLE (object-fit:contain), only ~12% desaturated at rest,
   full color on hover. Layered last so it overrides the base feed rules. */

/* buttons: stretch to fill the masthead like a taped-up banner */
header .links{max-width:840px}
header .links a{flex:1 1 auto;text-align:center}

/* the poster feed wants more room than the old 680px reading column */
main{max-width:940px}
#list .bucket{max-width:900px}

/* section labels: torn-paper tape for every bucket (tonight label = green "now") */
#list .bhead{display:flex;align-items:center;gap:.8rem;background:none;border:none;
  box-shadow:none;transform:none;padding:0;color:var(--ink);font-size:1.7rem}
#list .bhead .lab{display:inline-block;background:var(--tape);color:#111;line-height:1;
  padding:.3rem .82rem .38rem;transform:rotate(-1.2deg);box-shadow:4px 4px 0 var(--hot);
  clip-path:polygon(0 8%,4% 0,12% 6%,24% 1%,38% 7%,52% 1%,66% 6%,80% 1%,92% 6%,100% 2%,100% 92%,95% 100%,84% 95%,70% 100%,55% 94%,42% 100%,28% 95%,15% 100%,5% 96%,0 100%)}
#list #b-tonight .bhead .lab{background:var(--free)}
#list .bhead::after{content:"";flex:1;height:0;border-top:3px dashed var(--line);transform:translateY(1px)}
#list .bhead .ht{display:none}

/* date becomes a stamped, rotated block (feed only; archive lists untouched) */
#list:not(.wall) .show .date{display:inline-block;font-family:"Anton","Special Elite",sans-serif;
  border:2px solid var(--hotink);color:var(--hotink);background:rgba(12,12,13,.5);
  padding:.2rem .5rem .24rem;transform:rotate(-3deg);letter-spacing:.05em;font-size:.86rem;
  margin-bottom:.4rem;line-height:1}

/* flyers: whole art, ~12% desaturated at rest, full color on hover */
@media (hover:hover){
  #list:not(.wall) .show img.thumb:not(.ph){filter:grayscale(.12);transition:filter .2s ease}
  #list:not(.wall) .show:hover img.thumb,#list:not(.wall) .show:focus img.thumb{filter:none}
}

/* --- HERO: the very next show. Tonight's card, or (nothing tonight) the first
   This Week poster. The :has() flips it live if the JS re-buckets by viewer date. --- */
#list:not(.wall) #b-tonight .cards{display:block}
#list:not(.wall) #b-tonight .show,
#list:not(.wall) #b-tonight:not(:has(.show)) ~ #b-week .show:first-child{
  display:grid;grid-template-columns:minmax(0,320px) 1fr;gap:1.5rem;align-items:center;padding:1.2rem}
#list:not(.wall) #b-tonight:not(:has(.show)) ~ #b-week .show:first-child{flex-basis:100%;width:100%;transform:rotate(-.4deg)}
#list:not(.wall) #b-tonight .thumbwrap,
#list:not(.wall) #b-tonight:not(:has(.show)) ~ #b-week .show:first-child .thumbwrap{width:100%;aspect-ratio:auto}
#list:not(.wall) #b-tonight .show img.thumb,#list:not(.wall) #b-tonight .show img.thumb.ph,
#list:not(.wall) #b-tonight:not(:has(.show)) ~ #b-week .show:first-child img.thumb,
#list:not(.wall) #b-tonight:not(:has(.show)) ~ #b-week .show:first-child img.thumb.ph{
  width:100%;height:auto;max-height:440px;object-fit:contain;background:#000;border:3px solid var(--ink);transform:none;padding:0}
#list:not(.wall) #b-tonight .show h3,
#list:not(.wall) #b-tonight:not(:has(.show)) ~ #b-week .show:first-child h3{font-size:clamp(2rem,4.5vw,3.4rem);line-height:.92}
#list:not(.wall) #b-tonight .thumbwrap::before,
#list:not(.wall) #b-tonight:not(:has(.show)) ~ #b-week .show:first-child .thumbwrap::before{
  left:26%;transform:translateX(-50%) rotate(-16deg);width:78px;height:22px;opacity:.72}

/* --- THIS WEEK: full-flyer vertical posters, uniform 4:5 frames so heights
   line up; a centered flex wrap so a leftover card centers instead of
   stranding empty space next to it --- */
#list:not(.wall) #b-week .cards{display:flex;flex-wrap:wrap;justify-content:center;
  align-items:flex-start;gap:1.2rem}
#list:not(.wall) #b-week .show{flex:0 1 200px;flex-direction:column;align-items:stretch;gap:.7rem;padding:.9rem}
#list:not(.wall) #b-week .show:nth-child(odd){transform:rotate(-.5deg)}
#list:not(.wall) #b-week .show:nth-child(even){transform:rotate(.5deg)}
#list:not(.wall) #b-week .thumbwrap{width:100%;aspect-ratio:4/5}
#list:not(.wall) #b-week .show img.thumb,
#list:not(.wall) #b-week .show img.thumb.ph{width:100%;height:100%;max-height:none;
  object-fit:contain;background:#000}
#list:not(.wall) #b-week .show h3{font-size:clamp(1.4rem,2.4vw,1.7rem);line-height:1}

/* --- LATER: dense list, whole flyer in a small frame --- */
#list:not(.wall) .bucket.dense .cards{display:block;border:2px solid var(--line);
  background:var(--card);box-shadow:6px 6px 0 rgba(0,0,0,.45)}
#list:not(.wall) .bucket.dense .show{gap:.9rem;padding:.6rem .9rem;background:none;border:none;
  border-bottom:2px dashed var(--line);box-shadow:none;transform:none;align-items:center}
#list:not(.wall) .bucket.dense .cards .show:last-child{border-bottom:none}
#list:not(.wall) .bucket.dense .show:hover{box-shadow:none;background:#1d1d20}
#list:not(.wall) .bucket.dense .thumbwrap{flex:none}
#list:not(.wall) .bucket.dense .thumbwrap::before{display:none}
#list:not(.wall) .bucket.dense .show img.thumb,
#list:not(.wall) .bucket.dense .show img.thumb.ph{width:54px;height:70px;object-fit:contain;background:#000;padding:0}
#list:not(.wall) .bucket.dense .show .date{font-size:.72rem;margin-bottom:.2rem;padding:.14rem .4rem}
#list:not(.wall) .bucket.dense .show h3{font-size:1.05rem}

/* varied hand-torn tape across This Week posters */
#list:not(.wall) #b-week .thumbwrap::before{clip-path:polygon(2% 8%,98% 0,96% 92%,4% 100%);height:20px;opacity:.72}
#list:not(.wall) #b-week .show:nth-child(4n+1) .thumbwrap::before{left:32%;transform:translateX(-50%) rotate(-13deg);width:60px}
#list:not(.wall) #b-week .show:nth-child(4n+2) .thumbwrap::before{left:66%;transform:translateX(-50%) rotate(9deg);width:54px}
#list:not(.wall) #b-week .show:nth-child(4n+3) .thumbwrap::before{left:44%;transform:translateX(-50%) rotate(-5deg);width:46px}
#list:not(.wall) #b-week .show:nth-child(4n) .thumbwrap::before{left:58%;transform:translateX(-50%) rotate(14deg);width:62px}

/* tonight quiet-night line: a small green taped note */
/* :not([hidden]) so the JS `hidden` attribute actually wins — an id+class rule
   otherwise out-specifies the UA [hidden] rule and the strip shows on nights that
   DO have a show. */
#list .bnone{display:none}
#list .bnone:not([hidden]){display:inline-flex;align-items:center;gap:.65rem;flex-wrap:wrap;
  border:2px solid var(--free);background:var(--card);box-shadow:5px 5px 0 rgba(107,112,54,.4);
  padding:.7rem 1rem;transform:rotate(-.5deg);color:var(--dim);margin:.3rem 0 0;font-size:.95rem}
#list .bnone .nstamp{border-color:#111;background:var(--free);color:#111;margin-right:.1rem}

@media (max-width:640px){
  /* the hero stacks (flyer over name) so the big name never clips on a phone. The
     flyer HUGS its own art and centers, so a portrait poster no longer strands a
     big black gutter down one side of the card. */
  #list:not(.wall) #b-tonight .show,
  #list:not(.wall) #b-tonight:not(:has(.show)) ~ #b-week .show:first-child{grid-template-columns:1fr;gap:1rem;padding:1rem}
  #list:not(.wall) #b-tonight .thumbwrap,
  #list:not(.wall) #b-tonight:not(:has(.show)) ~ #b-week .show:first-child .thumbwrap{width:100%;max-width:min(88%,340px);margin:0 auto}
  #list:not(.wall) #b-tonight .show img.thumb,#list:not(.wall) #b-tonight .show img.thumb.ph,
  #list:not(.wall) #b-tonight:not(:has(.show)) ~ #b-week .show:first-child img.thumb,
  #list:not(.wall) #b-tonight:not(:has(.show)) ~ #b-week .show:first-child img.thumb.ph{width:100%;height:auto;max-height:none}
  #list:not(.wall) #b-tonight .show h3,
  #list:not(.wall) #b-tonight:not(:has(.show)) ~ #b-week .show:first-child h3{font-size:clamp(1.8rem,8vw,2.6rem)}
  /* THIS WEEK posters: always two per row on a phone (a lone odd card centers
     under them), instead of one giant single column with the page half empty. */
  #list:not(.wall) #b-week .cards{gap:.6rem}
  #list:not(.wall) #b-week .show{flex:0 1 calc(50% - .3rem);padding:.5rem;gap:.45rem}
  #list:not(.wall) #b-week .show h3{font-size:clamp(1rem,4.6vw,1.35rem)}
  #list:not(.wall) #b-week .show .daterow{gap:.4rem}
}

/* venue detail pages (v/<slug>.html): stamped directory rows */
.venuelist{list-style:none;padding:0;margin:.5rem 0 0}
.venuelist li{display:flex;align-items:baseline;gap:.7rem;flex-wrap:wrap;padding:.6rem 0;border-bottom:1px dashed var(--line)}
.venuelist a.vn{font-family:"Anton","Special Elite",sans-serif;text-transform:uppercase;letter-spacing:.02em;
  font-size:1.2rem;color:var(--ink);text-decoration:none}
.venuelist a.vn:hover,.venuelist a.vn:focus-visible{color:var(--hotink)}
.venuelist .vc{color:var(--dim);font-size:.85rem}
.venuelist li.ret a.vn{color:var(--dim)}
.retstamp{font-family:"Special Elite","Courier New",monospace;font-size:.62rem;text-transform:uppercase;
  letter-spacing:.07em;border:2px solid var(--dim);color:var(--dim);padding:.1rem .42rem;
  transform:rotate(-3deg);white-space:nowrap}

/* ---------- show page: past-show flag + "also that night" links ---------- */
.pastflag{display:inline-block;margin-left:.6rem;font-size:.6rem;text-transform:uppercase;letter-spacing:.09em;
  color:var(--dim);border:2px solid var(--line);padding:.08rem .4rem;transform:rotate(-2deg);vertical-align:middle}
.samenight{margin:.9rem 0 .2rem;display:flex;flex-wrap:wrap;gap:.4rem;align-items:baseline}
.samenight .lead{font-size:.7rem;text-transform:uppercase;letter-spacing:.08em;color:var(--dim);width:100%}
.samenight a{display:inline-block;font-size:.8rem;text-decoration:none;color:var(--ink);background:var(--card);
  border:1px solid var(--line);padding:.22rem .5rem}
.samenight a:hover,.samenight a:focus-visible{border-color:var(--hot);color:var(--hot)}
.samenight a small{color:var(--dim)}

/* ---------- archive hub (archive.html): filter/search toolbar over the record ---------- */
.filt-out{display:none!important}
.arctoolbar{position:sticky;top:var(--modebar-h,0px);z-index:5;background:var(--bg);border-bottom:2px solid var(--line);
  padding:.7rem 0 .8rem;margin:.4rem 0 1rem;display:flex;flex-direction:column;gap:.55rem}
.arctoolbar .search{margin:0}
.arcrow{display:flex;flex-wrap:wrap;gap:.5rem;align-items:center}
.arcsel{background:var(--card);border:2px dashed var(--dim);color:var(--ink);font:.78rem/1 inherit;
  padding:.32rem .5rem;cursor:pointer;max-width:15rem}
.arcsel:hover{border-color:var(--hot)}
.viewtoggle{display:flex;gap:.3rem;margin-left:auto}
.arccount{color:var(--dim);font-size:.76rem;white-space:nowrap;align-self:center}
.vchip.lucky{border-style:dotted;transform:rotate(-1deg)}
.arcempty{border:2px dashed var(--line);background:var(--card);padding:1rem 1.2rem;margin:.6rem 0 1rem;
  font:.9rem/1.7 "Special Elite","Courier New",monospace;color:var(--dim);max-width:44rem}
.arcempty .clearall{font:inherit;font-size:.8rem}
/* the one search box: a big hero field. In "search all" scope, typing surfaces
   a few matching bands/venues inline right underneath (not a floating popover,
   not a separate search) as a fast jump to a specific act or room. */
.arcsearch{position:relative;margin:.2rem 0 1.1rem}
.arcsearch>input{font-size:1rem;padding:.65rem .8rem}
.quickmatch[hidden]{display:none}
.quickmatch{margin-top:.4rem;background:var(--card);border:2px solid var(--line);
  box-shadow:3px 3px 0 var(--tape);max-height:60vh;overflow:auto;padding:.3rem 0}
.quickmatch .qmgroup{padding:0}
.quickmatch h3{font-family:"Anton","Special Elite",sans-serif;text-transform:uppercase;letter-spacing:.05em;
  font-size:.7rem;color:var(--dim);margin:0;padding:.5rem .8rem .2rem;border-top:1px dashed var(--line);
  display:flex;align-items:center;justify-content:space-between;gap:.5rem}
.quickmatch .qmgroup:first-child h3{border-top:none}
.quickmatch a{display:block;font-size:.85rem;text-decoration:none;color:var(--ink);padding:.34rem .8rem}
.quickmatch a:hover,.quickmatch a:focus-visible{background:var(--hot);color:var(--on-hot)}
.quickmatch a:hover small,.quickmatch a:focus-visible small{color:var(--on-hot)}
.quickmatch a small{color:var(--dim)}
.qmmore{background:transparent;border:0;color:var(--hot);cursor:pointer;font:.68rem/1 inherit;
  text-decoration:underline;text-transform:none;letter-spacing:0;white-space:nowrap}
.arch li a.arow{color:var(--ink);text-decoration:none}
.arch li a.arow:hover strong,.arch li a.arow:focus-visible strong{color:var(--hotink)}
.arch li strong a{color:var(--ink);text-decoration:none}
.flashback{border:2px dashed var(--line);background:var(--card);padding:.7rem .9rem;margin:0 0 1.1rem}
.flashback h2{font-family:"Anton","Special Elite",sans-serif;font-weight:400;text-transform:uppercase;
  letter-spacing:.03em;font-size:.95rem;margin:0 0 .5rem;color:var(--hotink)}
.flashback ul{list-style:none;padding:0;margin:0}
.flashback li{padding:.3rem 0;border-bottom:1px dashed var(--line);font-size:.85rem}
.flashback li:last-child{border-bottom:none}
.flashback a{text-decoration:none}
.flashback .yr{color:var(--dim);font-size:.72rem;margin-right:.4rem}
/* scope tabs: "search all" / "bands" / "venues" — tape-button tabs that pick
   which dataset the one search box + refine rail + results pane below is
   slicing. Not a separate panel: everything stays put, only the active tab
   and the results underneath change. */
.arcbrowse{display:flex;flex-wrap:wrap;gap:.6rem;margin:0 0 1rem}
.browsetoggle{font:inherit;font-size:.85rem;cursor:pointer;color:#111;background:var(--tape);padding:.4rem .9rem;
  border:2px solid #111;box-shadow:3px 3px 0 var(--hot);text-transform:uppercase;letter-spacing:.05em}
.browsetoggle:hover{background:var(--hot);color:var(--on-hot);box-shadow:3px 3px 0 var(--tape)}
.browsetoggle.on{background:var(--hot);color:var(--on-hot);box-shadow:1px 1px 0 var(--tape)}
/* ---- one-search refine: quick-pick presets, control bar, active chips, facet rail ---- */
.activechips[hidden],.clearall[hidden],.filtn[hidden]{display:none!important}
.arcpresets{display:flex;flex-wrap:wrap;align-items:center;gap:.4rem;margin:0 0 .5rem}
.arcpresets .ptag{font-family:"Anton","Special Elite",sans-serif;text-transform:uppercase;
  letter-spacing:.06em;font-size:.7rem;color:var(--dim);margin-right:.1rem}
.preset{background:var(--card);border:2px dashed var(--dim);color:var(--ink);cursor:pointer;
  font:.76rem/1 inherit;text-transform:lowercase;letter-spacing:.02em;padding:.4rem .6rem}
.preset:hover{border-color:var(--hot);color:var(--hot)}
.preset.on{background:var(--hot);color:var(--on-hot);border-style:solid;border-color:var(--hot)}
.arcbar{display:flex;flex-wrap:wrap;gap:.5rem;align-items:center}
.refinebtn{background:var(--card);border:2px solid var(--hot);color:var(--ink);cursor:pointer;
  font:.8rem/1 inherit;text-transform:uppercase;letter-spacing:.05em;padding:.45rem .8rem;
  display:inline-flex;align-items:center;gap:.4rem}
.refinebtn:hover{background:var(--hot);color:var(--on-hot)}
.refinebtn .filtn{background:var(--hot);color:var(--on-hot);font-size:.72rem;
  min-width:1.2rem;text-align:center;padding:.05rem .3rem;line-height:1.25}
.refinebtn:hover .filtn{background:var(--on-hot);color:var(--hot)}
.arcsortwrap{font-size:.74rem;color:var(--dim);text-transform:uppercase;letter-spacing:.04em;
  display:inline-flex;align-items:center}
.activechips{display:flex;flex-wrap:wrap;gap:.4rem;margin-top:.4rem}
.achip{background:var(--hot);color:var(--on-hot);border:2px solid var(--ink);cursor:pointer;
  font:.74rem/1 inherit;padding:.35rem .5rem;display:inline-flex;align-items:center;gap:.35rem;
  text-transform:lowercase}
.achip .ax{font-weight:700;font-size:.85rem}
.achip:hover{box-shadow:2px 2px 0 var(--shadow)}
.achip-q{background:var(--card);color:var(--ink)}
.arclayout{display:block}
.arcfacets{border:2px dashed var(--line);background:var(--card);padding:0 .8rem .8rem;margin:0 0 1.1rem}
.facetstop{display:flex;align-items:center;justify-content:space-between;
  padding:.55rem 0 .3rem;border-bottom:2px solid var(--line);margin-bottom:.3rem}
.facetstitle{font-family:"Anton","Special Elite",sans-serif;text-transform:uppercase;
  letter-spacing:.05em;font-size:1rem;color:var(--hotink)}
.clearall{background:transparent;border:0;color:var(--hot);cursor:pointer;
  font:.74rem/1 inherit;text-transform:uppercase;letter-spacing:.04em;text-decoration:underline}
.facetgroup{padding:.5rem 0;border-bottom:1px dashed var(--line)}
.facetgroup:last-child{border-bottom:none}
.facethead{font-family:"Anton","Special Elite",sans-serif;font-weight:400;text-transform:uppercase;
  letter-spacing:.05em;font-size:.76rem;color:var(--dim);margin:0 0 .3rem}
.facetlist{display:flex;flex-direction:column;gap:.02rem}
.facet{display:flex;align-items:center;gap:.5rem;background:transparent;border:0;cursor:pointer;
  color:var(--ink);font:.82rem/1.2 inherit;text-align:left;padding:.26rem .15rem;width:100%}
.facet .fx{flex:none;width:.85rem;height:.85rem;border:2px solid var(--dim);background:var(--bg)}
.facet .flabel{flex:1;text-transform:lowercase}
.facet .fcount{flex:none;color:var(--dim);font-size:.73rem;font-variant-numeric:tabular-nums}
.facet:hover .flabel{color:var(--hot)}
.facet:hover .fx{border-color:var(--hot)}
.facet.on .fx{background:var(--hot);border-color:var(--hot);box-shadow:inset 0 0 0 2px var(--card)}
.facet.on .flabel{color:var(--hotink);font-weight:700}
.facet.on .fcount{color:var(--ink)}
.facet-extra{display:none}
.facetgroup.expanded .facet-extra{display:flex}
.facet-zero{display:none}
.facetmore{background:transparent;border:0;color:var(--hot);cursor:pointer;font:.76rem/1 inherit;
  text-decoration:underline;padding:.3rem .15rem;text-align:left}
@media(min-width:820px){
  .arclayout{display:grid;grid-template-columns:236px minmax(0,1fr);gap:1.5rem;align-items:start}
  .arcfacets{position:sticky;top:calc(var(--modebar-h,0px) + .4rem);margin:0;
    max-height:calc(100vh - var(--modebar-h,0px) - .8rem);overflow:auto}
  .refinebtn{display:none}
}
@media(max-width:819px){
  .arcfacets{display:none}
  .arcfacets.open{display:block}
}

/* ---------- scene stats (archive.html panel): typewriter bar charts + leaderboards ---------- */
.statbig{display:flex;flex-wrap:wrap;gap:.6rem;margin:.4rem 0 1.6rem}
.statbig .stat{font-size:.86rem}
.monthbars{list-style:none;padding:0;margin:.3rem 0 0;display:flex;flex-direction:column;gap:.18rem}
.mbar{display:grid;grid-template-columns:5.4rem 1fr auto;align-items:center;gap:.5rem;font-size:.76rem}
.mbar .ml{color:var(--dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.mbar .mt{height:.82rem;background:linear-gradient(90deg,var(--hot),var(--hotink));min-width:2px}
.mbar .mn{color:var(--dim);font-size:.72rem}
.mbar.peak .mt{background:linear-gradient(90deg,var(--hotink),var(--free))}
.leaders{list-style:none;padding:0;margin:.3rem 0 0}
.leaders li{display:flex;align-items:baseline;gap:.6rem;padding:.4rem 0;border-bottom:1px dashed var(--line)}
.leaders .rank{font-family:"Anton","Special Elite",sans-serif;color:var(--dim);width:1.8rem;font-size:1rem}
.leaders a,.leaders .nm{font-family:"Anton","Special Elite",sans-serif;text-transform:uppercase;letter-spacing:.02em;
  font-size:1.05rem;color:var(--ink);text-decoration:none}
.leaders a:hover,.leaders a:focus-visible{color:var(--hotink)}
.leaders .ct{color:var(--dim);font-size:.8rem;margin-left:auto;white-space:nowrap}
.statcols{display:grid;grid-template-columns:1fr;gap:1.6rem}
@media(min-width:680px){.statcols{grid-template-columns:1fr 1fr}}
/* ---- scene radio (radio.html): the shuffle jukebox over every curated clip ---- */
.radiowrap{max-width:900px;margin:0 auto;padding:0 1rem 3rem}
.radiolede{color:var(--dim);font-size:.9rem;max-width:60ch;margin:.2rem auto 1.4rem;text-align:center;line-height:1.55}
.radiolede b{color:var(--hotink)}
.rstage{position:relative;aspect-ratio:16/9;background:#000;border:3px solid #111;box-shadow:6px 6px 0 var(--hot);margin-bottom:.7rem}
.rstage iframe{position:absolute;inset:0;width:100%;height:100%;border:0}
/* start overlay: nothing plays until a tap (browsers block autoplay-with-sound) */
.rstart{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.6rem;
  background:radial-gradient(120% 120% at 50% 30%,rgba(107,112,54,.30),rgba(12,12,13,.94));cursor:pointer;border:0;color:var(--ink);
  font-family:"Special Elite","Courier New",monospace;text-align:center;padding:1rem}
.rstart .rbig{font-family:"Anton","Special Elite",sans-serif;text-transform:uppercase;letter-spacing:.06em;font-size:clamp(1.4rem,6vw,2.4rem);
  color:var(--ink);text-shadow:3px 3px 0 var(--hot)}
.rstart .rsub{color:var(--dim);font-size:.85rem;max-width:34ch}
.rstart:hover .rbig{color:var(--hotink)}
.rstart[hidden]{display:none}
.rcount{text-align:center;color:var(--dim);font-size:.8rem;text-transform:uppercase;letter-spacing:.08em;margin:.1rem 0 .9rem}
/* now playing: hot-ink act name + clip title, badges for type/scene */
.rnow{background:var(--card);border:2px solid var(--line);padding:.8rem 1rem;margin-bottom:.7rem}
.rnow .rnlabel{color:var(--dim);font-size:.68rem;text-transform:uppercase;letter-spacing:.14em;display:block;margin-bottom:.2rem}
.rnow .rnact{font-family:"Anton","Special Elite",sans-serif;text-transform:uppercase;letter-spacing:.02em;font-size:1.3rem;
  color:var(--hotink);text-decoration:none;line-height:1.1}
.rnow .rnact:hover{text-decoration:underline}
.rnow .rntitle{color:var(--ink);font-size:.9rem;margin:.15rem 0 .35rem;overflow-wrap:anywhere}
.rbadge{display:inline-block;font-size:.64rem;text-transform:uppercase;letter-spacing:.08em;padding:.12rem .5rem;
  border:1px solid var(--line);color:var(--dim);margin-right:.35rem}
.rbadge.tour{color:var(--age);border-color:var(--age)}
.rbadge.local{color:var(--free);border-color:var(--free)}
/* transport controls: tape buttons like the rest of the site */
.rcontrols{display:flex;gap:.6rem .7rem;flex-wrap:wrap;justify-content:center;margin-bottom:1.3rem}
.rbtn{font-family:"Special Elite","Courier New",monospace;font-size:.82rem;text-transform:uppercase;letter-spacing:.05em;
  color:#111;background:var(--tape);border:2px solid #111;box-shadow:3px 3px 0 var(--hot);padding:.45rem 1rem;cursor:pointer}
.rbtn:hover{background:var(--hot);color:var(--on-hot);box-shadow:3px 3px 0 var(--tape)}
.rbtn:active{transform:translate(2px,2px);box-shadow:1px 1px 0 var(--hot)}
/* filter rail: chip toggles per dimension. Compact — each dimension is ONE row
   (label pinned left, chips flowing right), boxed tight so the controls read
   as a small console, not half the page. */
.rfilters{margin-bottom:1.1rem;border:2px solid var(--line);padding:.15rem .7rem}
.rfgroup{display:flex;align-items:center;flex-wrap:wrap;gap:.35rem .5rem;padding:.32rem 0;border-bottom:1px dashed var(--line)}
.rfgroup:last-child{border-bottom:0}
.rflabel{color:var(--dim);font-size:.62rem;text-transform:uppercase;letter-spacing:.13em;margin:0;flex:0 0 auto;min-width:3.6rem;white-space:nowrap}
.rchips{display:flex;flex-wrap:wrap;gap:.3rem .35rem}
.rchip{font-family:"Special Elite","Courier New",monospace;font-size:.72rem;text-transform:lowercase;letter-spacing:.02em;
  color:var(--ink);background:transparent;border:2px solid var(--line);padding:.16rem .55rem;cursor:pointer;transition:background .12s,color .12s,border-color .12s}
.rchip:hover{border-color:var(--hotink)}
.rchip.on{background:var(--hot);color:var(--on-hot);border-color:var(--hot)}
/* up next queue */
.rnext{margin-top:.4rem}
.rnext ol{list-style:none;padding:0;margin:.3rem 0 0;counter-reset:rq}
.rnext li{display:flex;gap:.6rem;align-items:baseline;padding:.35rem 0;border-bottom:1px dashed var(--line);font-size:.85rem}
.rnext li::before{counter-increment:rq;content:counter(rq);font-family:"Anton","Special Elite",sans-serif;color:var(--dim);width:1.4rem;flex:none}
.rnext .rqact{color:var(--ink);font-weight:400}
.rnext .rqt{color:var(--dim);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rempty{text-align:center;color:var(--dim);padding:1.4rem;border:2px dashed var(--line);font-size:.88rem}
.rempty[hidden]{display:none}

/* dcx: hidden owner-only flag tool, unlocked by a long-press on the logo;
   suppress the mobile "save image" callout so the press isn't interrupted */
.home img,.homelink img{-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}
.dcx-fab{position:fixed;right:1rem;bottom:1rem;z-index:9999;width:2.2rem;height:2.2rem;
  border-radius:50%;border:1px solid var(--line);background:var(--card);color:var(--dim);
  font-size:1rem;line-height:2.1rem;text-align:center;cursor:pointer;opacity:.18;
  transition:opacity .15s;padding:0}
.dcx-fab:hover,.dcx-fab:focus{opacity:1}
.dcx-fab[hidden]{display:none}
.dcx-scrim{position:fixed;inset:0;background:var(--scrim);z-index:9998}
.dcx-scrim[hidden]{display:none}
.dcx-panel{position:fixed;right:1rem;bottom:3.6rem;z-index:9999;width:min(22rem,calc(100vw - 2rem));
  max-height:min(28rem,calc(100vh - 6rem));overflow:auto;background:var(--card);
  border:1px solid var(--line);border-radius:.4rem;padding:.8rem;box-shadow:0 .5rem 1.5rem var(--shadow)}
.dcx-panel[hidden]{display:none}
.dcx-panel textarea{width:100%;min-height:5rem;background:var(--bg);color:var(--ink);
  border:1px solid var(--line);border-radius:.3rem;padding:.5rem;font:inherit;resize:vertical}
.dcx-row{display:flex;gap:.4rem;margin-top:.5rem;flex-wrap:wrap}
.dcx-panel button{background:var(--bg);color:var(--ink);border:1px solid var(--line);
  border-radius:.3rem;padding:.35rem .6rem;font:inherit;cursor:pointer;font-size:.82rem}
.dcx-panel button:hover{border-color:var(--hotink)}
.dcx-log{margin-top:.6rem;border-top:1px dashed var(--line);padding-top:.5rem}
.dcx-log[hidden]{display:none}
.dcx-item{border-bottom:1px dashed var(--line);padding:.4rem 0;font-size:.78rem;position:relative}
.dcx-item .dcx-ts{color:var(--dim)}
.dcx-item .dcx-x{position:absolute;right:0;top:.3rem;background:none;border:none;color:var(--dim);
  cursor:pointer;font-size:.9rem;padding:0 .2rem}
.dcx-item .dcx-x:hover{color:var(--ink)}
.dcx-item .dcx-np{color:var(--hotink)}

/* ---- cancelled / postponed status ---- */
/* Two more entries in the reserved stamp system (never used decoratively). Cancelled
   is the loudest: bare ink on a double border, no hue, so it can't be mistaken for a
   price/age tag. Postponed is quieter in the muted gray. The whole card also strikes
   its lineup + desaturates the flyer so a dead show never scans as live. */
.s-cancelled{color:var(--ink);border-color:var(--ink);border-style:double;border-width:3px}
.s-postponed{color:var(--dim);border-color:var(--dim)}
.show.off h3{text-decoration:line-through;text-decoration-thickness:2px}
.show.off .thumb{opacity:.5;filter:grayscale(.4)}
#dlineup.off,.spcard.off h1{text-decoration:line-through;text-decoration-thickness:3px}
.spcard.off .spflyer{opacity:.6;filter:grayscale(.4)}
.pastflag.off{border-color:var(--ink);color:var(--ink)}
.drow.dcancel{color:var(--ink);border:2px solid var(--ink);display:inline-block;
  padding:.15rem .5rem;text-transform:uppercase;letter-spacing:.03em;font-size:.8rem}

/* ---- house / DIY-space note ---- */
.drow.dhouse,p.drow.dhouse{color:var(--hotink)}

/* ---- build stamp in the footer ---- */
/* The freshness stamp, moved out of the masthead tagline (2026-07-18) so it lands
   once, at the foot of every page. Carries the old .upstamp rubber-stamp look with
   the whole phrase inside the box: bordered, olive-cast, caps, letterspaced. No
   entrance animation here, unlike the masthead one, since it sits below the fold
   and would only ever slam in unseen. */
.built{display:inline-block;margin-top:.7rem;border:2px solid var(--hotink);color:var(--hotink);
  padding:.06rem .45rem;text-transform:uppercase;letter-spacing:.08em;font-size:.78rem}

/* ---- show-page flyer lightbox image (mirrors #lbimg) ---- */
.lb img#splbimg{max-width:100%;max-height:90vh;border:3px solid var(--ink);box-shadow:0 0 0 6px var(--hot)}

/* ---- saved ("going") shows + "yours" filter ---- */
/* The save toggle is a tape scrap pinned to the card corner. Selection follows the
   site's dashed=inactive / solid=active rule; a hit-area pseudo-element brings the
   32px glyph up to a 44px touch target without changing the visual size. */
.show{position:relative}
/* Just a mark, not a button: no border, no background, no shadow. The hollow vs
   filled star IS the state, so the box chrome was only adding noise to the card
   corner. Visually ~13px; the invisible ::after still gives it a 44px tap target. */
.savebtn{position:absolute;top:.3rem;right:.4rem;z-index:2;
  background:none;border:0;color:var(--dim);cursor:pointer;
  font-size:.82rem;line-height:1;padding:0;opacity:.75;transition:opacity .12s,color .12s}
.savebtn::before{content:"\2606"}          /* hollow star = not saved */
.savebtn::after{content:"";position:absolute;inset:-15px}  /* invisible 44px hit area */
.savebtn.on{color:var(--hotink);opacity:1}
.savebtn.on::before{content:"\2605"}       /* filled star = saved */
@media (hover:hover){.savebtn:hover{opacity:1;color:var(--hotink)}}
#list.wall .savebtn{top:.25rem;right:.3rem}
.savetoggle.on{background:var(--hot);color:var(--on-hot);border-color:var(--hot)}
/* star only, no label: it sits with the other square nav buttons and the star
   already reads as "saved". The accessible name still says "show only shows you
   saved" via aria-label. */
.yoursbtn{font-size:.95rem;line-height:1}
.yoursbtn.on{background:var(--hot);color:var(--on-hot);border-color:var(--hot)}
/* the nav buttons set an explicit display, which beats the UA [hidden] rule, so
   spell out that a hidden "yours" button stays hidden until a show is saved. */
.yoursbtn[hidden]{display:none}

/* ---- followed venues / bands: a quiet star before the date on matching cards ---- */
.show.followed .date::before{content:"\2605 ";color:var(--hotink)}
.followbtn.on{background:var(--hot);color:var(--on-hot);border-color:var(--hot)}

/* The masthead logo is the owner-mode unlock (long press). On iOS a long press on
   a linked image pops the native "Save Image"/share callout, which eats the
   gesture, so suppress the callout and text selection on the logo only. Normal
   tapping (navigate home) is unaffected. */
header .homelink,header .home,header .logo,header .home img{
  -webkit-touch-callout:none;-webkit-user-select:none;user-select:none}

/* ---- owner mode bar (only rendered when the ⚑ passcode is unlocked) ---- */
/* Deliberately reads as a utility strip, not site UI: mono-ish caps label, hard
   olive rule, no tape/tilt. It should never be mistaken for something a visitor
   is meant to touch. */
.dcx-owner{margin-top:.7rem;padding:.5rem .6rem;border:2px dashed var(--hot);
  display:flex;flex-wrap:wrap;gap:.4rem;align-items:center;background:rgba(107,112,54,.08)}
.dcx-owner .dcx-olab{font-size:.62rem;text-transform:uppercase;letter-spacing:.12em;
  color:var(--hotink);margin-right:.2rem}
.dcx-owner button{font-family:inherit;font-size:.72rem;padding:.35rem .55rem;cursor:pointer;
  background:var(--card);color:var(--ink);border:1px solid var(--line);min-height:34px}
.dcx-owner button:hover{border-color:var(--hotink);color:var(--hotink)}
/* The status line is the only feedback owner mode gives, and it is read on a
   phone in a dark venue with a show falling through. It used to be .7rem dim
   grey, which read as "the button did nothing". Full size, and errors/successes
   carry a hard rule so they can't be skimmed past. */
.dcx-owner .dcx-osay{font-size:.85rem;line-height:1.35;color:var(--dim);flex:1 1 100%;min-height:1.2em}
.dcx-owner .dcx-osay.dcx-busy{color:var(--dim)}
.dcx-owner .dcx-osay.dcx-err,.dcx-owner .dcx-osay.dcx-ok{
  font-weight:700;color:var(--ink);padding:.3rem .45rem;border-left:5px solid var(--hot)}
.dcx-owner .dcx-osay.dcx-err{background:rgba(107,112,54,.16)}

/* ---- screen-reader-only live region ---- */
.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}

/* ---- accessibility beyond the AA floor ---- */
/* Opt-in high-contrast: only fires when the OS asks for it, so the midnight-zine
   default is untouched. Drops the noise + olive wash, lifts muted text well past
   4.5:1, and thickens the hairline borders. */
@media (prefers-contrast:more){
  :root{--dim:#c9c9c2;--line:#565660}
  body{background-image:none}
  .savebtn{border-color:var(--ink);color:var(--ink)}
  a{text-decoration:underline}
}
/* Touch devices: guarantee 44px hit targets on the filter chips without resizing
   them on desktop (pointer:fine stays as-is). */
@media (pointer:coarse){
  .vchip,.tagchip{min-height:44px;display:inline-flex;align-items:center}
}
