/* Sold Separately concept on the apparel shell. Direction (2026-09-11): Corteiz grid, Benjart type split, Hoodrich hero.
   Bone page, black ink, the product is the only color. Three faces: Big Shoulders Display (wordmark, headings), JetBrains Mono
   (prices, codes, labels, ticker, anything that is data), Archivo (names, body, forms). One signal color for live, errors, sold out.
   Every color is a role token in :root; night is the shipped look since 2026-09-15 (Shawn's call; white ran 09-14 to 09-15, bone before
   that, both stay defined). His hoodie and tee sheets are shot on white and sit as cards on the black; the crop sets, shorts, hero and
   film are shot dark and sink into it. Phone-first. */
:root{
  --paper:#ece9e1;
  --paper-2:#e3dfd5;
  --card:#ece9e1;
  --tile:#dcd8ce;
  --line:#bdb8ad;
  --ink:#0d0d0d;
  --muted:#6a675f;
  --accent:#0d0d0d;
  --on-accent:#ece9e1;
  --alert:#c8321f;
  --on-alert:#ffffff;
  --ok:#2f4b3a;
  --shade:rgba(13,13,13,.62);
  --fade:rgba(236,233,225,0);
  --fade-to:#ece9e1;
  --garment-edge:transparent;
  --grain:.06;
  --display:"Big Shoulders Display","Arial Narrow",Impact,sans-serif;
  --mono:"JetBrains Mono",ui-monospace,Menlo,Consolas,monospace;
  --body:"Archivo",system-ui,-apple-system,"Segoe UI",Roboto,sans-serif}
:root[data-look="white"]{
  /* his sheets are shot on #fefdfe to #fefefe, so the page IS that white and the
     padded tiles stop reading as rectangles. Neutral greys, no warm cast, no grain. */
  --paper:#fefefe;
  --paper-2:#f4f4f4;
  --card:#fefefe;
  --tile:#f7f7f7;
  --line:#d2d2d2;
  --ink:#0d0d0d;
  --muted:#5c5c5c;
  --accent:#0d0d0d;
  --on-accent:#fefefe;
  --alert:#c8321f;
  --on-alert:#ffffff;
  --ok:#2f4b3a;
  --shade:rgba(13,13,13,.62);
  --fade:rgba(254,254,254,0);
  --fade-to:#fefefe;
  --garment-edge:transparent;
  --grain:0}
:root[data-look="night"]{
  --paper:#0b0b0b;
  --paper-2:#141414;
  --card:#0b0b0b;
  --tile:#151515;
  --line:#2a2a2a;
  --ink:#f2f0ea;
  --muted:#8e8c85;
  --accent:#f2f0ea;
  --on-accent:#0b0b0b;
  --alert:#ff4a2e;
  --on-alert:#0b0b0b;
  --ok:#5b8a6b;
  --shade:rgba(0,0,0,.72);
  --fade:rgba(11,11,11,0);
  --fade-to:#0b0b0b;
  --garment-edge:rgba(242,240,234,.45);
  --grain:.1}
*{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body{margin:0;background:var(--paper);color:var(--ink);font:15px/1.5 var(--body);color-scheme:light}
body.locked{overflow:hidden}
body::before{content:"";position:fixed;inset:0;z-index:60;pointer-events:none;opacity:var(--grain);background:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='320' height='320'%3E%3Cfilter id='g'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix values='0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 .6 0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23g)'/%3E%3C/svg%3E") repeat;background-size:320px}
img{display:block;max-width:100%}
button,input,select,textarea{font:inherit;color:inherit}
button{cursor:pointer;-webkit-tap-highlight-color:transparent}
a{color:var(--ink)}
#app{max-width:560px;margin:0 auto;padding:0 16px calc(112px + env(safe-area-inset-bottom))}
.ribbon{position:sticky;top:0;z-index:5;margin:0 -16px;padding:7px 16px;background:var(--alert);color:var(--on-alert);font:700 10px/1.2 var(--mono);letter-spacing:.14em;text-transform:uppercase;text-align:center}
/* the data voice: mono caps, tracked */
.lbl,.sumlbl,.codelbl,.ccolors,.ctag,.kicker,.live,.form label,.form legend,.summary h2,.status,.ready{font:400 11px/1.3 var(--mono);letter-spacing:.12em;text-transform:uppercase;color:var(--muted)}

/* hero: his render, the wordmark on top of the fade */
.hero{position:relative;margin:0 -16px;padding:0}
.heroimg{width:100%;aspect-ratio:1000/598;object-fit:cover;object-position:center;background:var(--tile)} /* ratio = assets/hero.jpg, so nothing is cropped at any width; check.mjs asserts it matches the file */
.hero::after{content:"";position:absolute;left:0;top:0;width:100%;aspect-ratio:1000/598;background:linear-gradient(to bottom,var(--fade) 63%,var(--fade-to) 80%);pointer-events:none} /* a box the exact size of the image: clear over the lettering (ends ~63% down), solid by 80% where the text starts */
.herotext{position:relative;z-index:1;margin-top:-16%;padding:0 16px;text-align:left} /* 16% of width = 27% of the image height, so the kicker lands at ~73% on the solid part of the fade, measured 7.17:1 */
.kicker{margin:0 0 8px;color:var(--ink)}
.brand{margin:0;font:800 clamp(56px,19vw,100px)/.84 var(--display);letter-spacing:-.005em;text-transform:uppercase;color:var(--ink);text-wrap:balance}
.tag{margin:14px 0 0;max-width:34ch;color:var(--muted);font:400 11px/1.6 var(--mono);letter-spacing:.12em;text-transform:uppercase}
.live{display:inline-flex;align-items:center;gap:8px;margin:16px 0 0;color:var(--ink)}
.live::before{content:"";width:7px;height:7px;border-radius:50%;background:var(--alert);box-shadow:0 0 0 3px color-mix(in srgb,var(--alert) 25%,transparent)}
.live.closed::before{background:var(--muted);box-shadow:none}
.note{margin:10px 0 0;max-width:40ch;color:var(--muted);font-size:14px}

/* ticker: the one moving thing on the page */
.ticker{margin:22px -16px 0;padding:10px 0;border-top:1px solid var(--line);border-bottom:1px solid var(--line);overflow:hidden;white-space:nowrap}
.ticker .track{display:inline-block;animation:tick 34s linear infinite;font:400 11px/1 var(--mono);letter-spacing:.16em;text-transform:uppercase;color:var(--ink)}
.ticker .track span{padding:0 1.4em}
.ticker .track span::after{content:"·";margin-left:2.8em;color:var(--muted)}
@keyframes tick{from{transform:translateX(0)}to{transform:translateX(-50%)}}

/* grid: one product per row, front and back side by side in equal boxes
   (Shawn, 2026-09-14: "I just want it to look uniform"). Every tile is the same
   16:9 box, content centred and padded with its own ground by media.py. */
.sec{padding:8px 0 6px}
.grid{display:grid;grid-template-columns:1fr;gap:26px 14px}
.card{display:grid;gap:0;padding:0;border:0;border-radius:0;background:none;text-align:left;transition:opacity .15s}
.card:active{opacity:.7}
.card:disabled{opacity:.45;cursor:default}
.pic{width:100%;aspect-ratio:16/9;object-fit:cover;background:var(--tile)}
.garment{display:block;padding:12%;fill:currentColor;stroke:var(--garment-edge);stroke-width:2;stroke-linejoin:round}
.garment.light{stroke:var(--shade);stroke-width:2.5;stroke-linejoin:round}
.cmeta{display:grid;grid-template-columns:1fr auto;gap:4px 10px;align-items:baseline;padding:9px 0 0;border-top:1px solid var(--line);margin-top:10px}
.cname{font:600 12px/1.3 var(--body);letter-spacing:.08em;text-transform:uppercase}
.cprice{font:400 13px/1 var(--mono);letter-spacing:.02em;text-align:right;font-variant-numeric:tabular-nums}
.ccolors{color:var(--muted)}
.ctag{text-align:right;color:var(--ink)}
.ctag.out{color:var(--alert)}

/* sheet */
.scrim{position:fixed;inset:0;z-index:20;background:var(--shade)}
.sheet{position:fixed;left:0;right:0;bottom:0;z-index:21;max-width:560px;margin:0 auto;max-height:88vh;overflow:auto;padding:16px 16px calc(16px + env(safe-area-inset-bottom));background:var(--paper);border-top:1px solid var(--ink);animation:up .22s ease-out}
@keyframes up{from{transform:translateY(24px);opacity:.6}to{transform:none;opacity:1}}
.close{position:absolute;top:10px;right:12px;width:38px;height:38px;border:1px solid var(--ink);border-radius:50%;background:var(--paper);color:var(--ink);font-size:22px;line-height:1}
.shead{display:grid;grid-template-columns:minmax(0,1fr);gap:12px;padding-right:0} /* the swipe strip is the only sheet layout; minmax(0,…) stops a flex track widening the column to all its slides */
.pic.big{width:172px;aspect-ratio:16/9}
/* detail strip: full-width swipe, one slide per screen, caption in the data voice */
.shead .sinfo{padding-right:44px}
.gallery{margin:0 -16px;min-width:0}
.gallery .track{display:flex;overflow-x:auto;scroll-snap-type:x mandatory;-webkit-overflow-scrolling:touch;scrollbar-width:none}
.gallery .track::-webkit-scrollbar{display:none}
.gallery .slide{flex:0 0 100%;margin:0;scroll-snap-align:start;scroll-snap-stop:always}
.gallery .slide img{width:100%;aspect-ratio:16/9;object-fit:cover;background:var(--tile)}
.gallery figcaption{padding:8px 16px 0;font:400 11px/1.3 var(--mono);letter-spacing:.12em;text-transform:uppercase;color:var(--muted)}
.gcount{margin:4px 16px 0;font:400 11px/1 var(--mono);letter-spacing:.12em;color:var(--muted);text-align:right}
.gallery .track:focus-visible{outline:2px solid var(--ink);outline-offset:-2px}
.sinfo h2{margin:0;font:800 28px/.92 var(--display);letter-spacing:.005em;text-transform:uppercase}
.sprice{margin:6px 0 0;font:400 15px/1 var(--mono);letter-spacing:.02em}
.sdesc{margin:8px 0 0;color:var(--muted);font:400 13px/1.4 var(--body)}
.status{display:flex;flex-wrap:wrap;gap:6px 14px;margin:14px 0 0;padding:10px 0;border-top:1px solid var(--line);border-bottom:1px solid var(--line);color:var(--ink)}
.status .ready{color:var(--muted)}
.lbl{display:flex;justify-content:space-between;align-items:baseline;margin:18px 0 8px}
.lbl .cur{color:var(--ink);letter-spacing:.04em}
.swatches{display:flex;flex-wrap:wrap;gap:10px}
.swatch{position:relative;width:34px;height:34px;border-radius:50%;border:1px solid var(--muted);padding:0} /* muted, not the hairline: a swatch the colour of the paper (black on night, creme on white) is only findable by its ring, and the hairline measured 1.58:1 on night against a 3:1 floor */
.swatch[aria-pressed=true]{box-shadow:0 0 0 2px var(--paper),0 0 0 3px var(--ink)}
.swatch.out{opacity:.35;cursor:default}
.swatch.out::after{content:"";position:absolute;left:2px;right:2px;top:50%;height:2px;background:var(--paper);box-shadow:0 0 0 1px var(--alert);transform:rotate(-45deg)}
.sizes{display:flex;flex-wrap:wrap;gap:8px}
.chip{display:flex;flex-direction:column;align-items:center;gap:2px;min-width:50px;padding:10px 12px;border:1px solid var(--ink);border-radius:0;background:none;text-align:center;font:400 12px/1.1 var(--mono);letter-spacing:.08em;text-transform:uppercase}
.chip small{color:var(--muted);font:400 10px/1.1 var(--mono);letter-spacing:.1em;text-transform:uppercase}
.chip[aria-pressed=true],.chip:has(input:checked){background:var(--ink);color:var(--on-accent)}
.chip[aria-pressed=true] small,.chip:has(input:checked) small{color:var(--on-accent);opacity:.7}
.chip input{position:absolute;opacity:0;pointer-events:none}
.chip>span{display:flex;flex-direction:column;align-items:center;gap:2px}
.builder{display:flex;align-items:center;gap:10px;margin-top:20px}
.qty{display:inline-flex;align-items:center;border:1px solid var(--ink);background:var(--paper)}
.qty button{width:40px;height:44px;border:0;background:none;font-size:20px;line-height:1;color:var(--ink)}
.qty button:disabled{color:var(--line)}
.qty output{min-width:26px;text-align:center;font:700 15px/1 var(--mono)}
.btn{display:block;width:100%;padding:15px 18px;border:1px solid var(--ink);border-radius:0;background:var(--accent);color:var(--on-accent);font:700 12px/1.1 var(--mono);letter-spacing:.14em;text-transform:uppercase;text-align:center;text-decoration:none}
.btn:disabled{background:none;border-color:var(--line);color:var(--muted);cursor:default}
.btn.add{flex:1}
.btn.ghost{background:none;color:var(--ink)}
.btn.pay{margin:16px 0 4px}

/* film: him in the piece, a full-bleed break between the grid and the footer */
.film{margin:30px -16px 0;background:var(--ink)}
.film video{display:block;width:100%;aspect-ratio:16/10;object-fit:cover;background:var(--ink)}
.fcap{margin:0;padding:9px 16px;font:400 11px/1.3 var(--mono);letter-spacing:.12em;text-transform:uppercase;color:var(--on-accent);opacity:.75}
@media (prefers-reduced-motion:reduce){.film video{display:none}.film{background:none}.film::before{content:"";display:block;width:100%;aspect-ratio:16/10;background:var(--tile) center/cover no-repeat}}

/* footer */
.foot{margin-top:34px;padding:18px 0 8px;border-top:1px solid var(--line);color:var(--muted);font-size:13px;text-align:left}
.foot p{margin:4px 0}
.foot .fmeta{font:400 11px/1.6 var(--mono);letter-spacing:.12em;text-transform:uppercase;color:var(--ink)}
.legal{margin:16px 0 0;padding-top:12px;border-top:1px solid var(--line)}
.legal p{margin:6px 0;font-size:11px;line-height:1.45;color:var(--muted)}
.credit{margin-top:14px;font:400 10px/1.4 var(--mono);letter-spacing:.12em;text-transform:uppercase}

/* sticky bag bar, inverted */
.bar{position:fixed;left:0;right:0;bottom:0;z-index:10;padding:0 16px calc(12px + env(safe-area-inset-bottom));background:linear-gradient(to top,var(--paper) 60%,transparent)}
.barin{display:flex;align-items:center;gap:12px;max-width:528px;margin:0 auto;padding:10px 12px 10px 16px;background:var(--ink);color:var(--on-accent)}
.sum{display:grid;flex:1;min-width:0;gap:2px}
.sumlbl{color:var(--on-accent);opacity:.7}
.sumamt{font:700 22px/1 var(--mono);letter-spacing:.01em;font-variant-numeric:tabular-nums}
.sumsub{opacity:.7;font:400 10px/1.2 var(--mono);letter-spacing:.1em;text-transform:uppercase;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.bar .btn{flex:1;width:auto;min-height:48px;padding:12px 14px;font-size:11px;background:var(--on-accent);color:var(--ink);border-color:var(--on-accent)}
.bar.pop .sumamt{animation:pop .3s ease-out}
@keyframes pop{0%{transform:scale(.96)}60%{transform:scale(1.03)}100%{transform:none}}
.toast{position:fixed;left:50%;bottom:calc(104px + env(safe-area-inset-bottom));z-index:11;max-width:92vw;padding:10px 16px;background:var(--ink);color:var(--on-accent);font:400 10px/1 var(--mono);letter-spacing:.12em;text-transform:uppercase;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;pointer-events:none;opacity:0;transform:translate(-50%,10px);transition:opacity .18s,transform .18s}
.toast.show{opacity:1;transform:translate(-50%,0)}
@media (prefers-reduced-motion:reduce){.bar.pop .sumamt{animation:none}.toast{transition:none}.sheet{animation:none}.ticker .track{animation:none}}

/* checkout */
.sub-head{display:flex;align-items:baseline;gap:14px;padding:22px 0 8px;border-bottom:1px solid var(--ink)}
.sub-head h1{margin:0;font:800 36px/.92 var(--display);letter-spacing:.005em;text-transform:uppercase}
.back{border:0;background:none;color:var(--muted);font:400 11px/1 var(--mono);letter-spacing:.14em;text-transform:uppercase;padding:8px 0}
.lines{list-style:none;margin:6px 0 0;padding:0;display:grid}
.lines li{display:grid;grid-template-columns:1fr auto auto;align-items:center;gap:10px;padding:12px 0;border-bottom:1px solid var(--line)}
.lmeta{display:flex;flex-direction:column;min-width:0}
.lname{font:600 13px/1.3 var(--body);letter-spacing:.02em}
.lunit{color:var(--muted);font:400 11px/1.4 var(--mono)}
.ltotal{min-width:64px;text-align:right;font:400 14px/1 var(--mono);font-variant-numeric:tabular-nums}
.lines .qty{transform:scale(.9);transform-origin:right center}
.totals{margin:12px 0 0}
.trow{display:flex;justify-content:space-between;margin:4px 0;color:var(--muted);font:400 12px/1.5 var(--mono);letter-spacing:.04em}
.total{display:flex;justify-content:space-between;align-items:baseline;margin:8px 0 0;padding-top:10px;border-top:1px solid var(--ink);font:400 11px/1.2 var(--mono);letter-spacing:.14em;text-transform:uppercase}
.total strong{font:700 24px/1 var(--mono);letter-spacing:.01em;font-variant-numeric:tabular-nums}
.empty{color:var(--muted);font:400 15px/1.5 var(--body)}
.info{padding:4px 0 30px;max-width:62ch}
.info h2{margin:26px 0 6px;padding-top:14px;border-top:1px solid var(--line);font:400 11px/1.3 var(--mono);letter-spacing:.14em;text-transform:uppercase;color:var(--ink)}
.info h2:first-child{margin-top:14px;padding-top:0;border-top:0}
.info h3{margin:16px 0 4px;font:600 12px/1.3 var(--body);letter-spacing:.08em;text-transform:uppercase;color:var(--ink)}
.info p,.info li{margin:8px 0;font:400 14px/1.55 var(--body);color:var(--ink)}
.info ul{margin:8px 0;padding-left:18px}
.info .sign{margin-top:28px;color:var(--muted);font:400 11px/1.6 var(--mono);letter-spacing:.12em;text-transform:uppercase}
.status a.ready{text-decoration:underline;text-underline-offset:3px}
#garments{position:absolute}
.form{display:grid;gap:14px;margin-top:24px}
.form label{display:grid;gap:6px}
.form input,.form select,.form textarea{width:100%;padding:13px 12px;border:1px solid var(--line);border-radius:0;background:var(--paper-2);color:var(--ink);font:400 16px/1.3 var(--body);text-transform:none;letter-spacing:0}
.form input:focus,.form textarea:focus{border-color:var(--ink);outline:0}
.form fieldset{margin:0;padding:0;border:0;display:grid;gap:8px}
.form legend{padding:0;margin-bottom:2px}
.chips{display:grid;grid-template-columns:1fr 1fr;gap:8px}
.chips.pay .chip{position:relative;padding:12px;font-size:11px;cursor:pointer}
.addr{display:grid;gap:14px}
.row3{display:grid;grid-template-columns:2fr 1fr 1.2fr;gap:8px}
.hidden-field{display:none}
.err{margin:0;padding:10px 12px;border:1px solid var(--alert);color:var(--alert);font-size:14px}
.fine{margin:6px 0 0;color:var(--muted);font-size:12px;text-align:center}
.fine.left{text-align:left;margin:0}

/* done: the order code is a barcode, same as his sleeve */
.done{text-align:center;padding:34px 0 10px}
.check{display:grid;place-items:center;width:56px;height:56px;margin:0 auto 14px;border-radius:50%;background:var(--ok);color:var(--on-alert);font-size:28px;font-weight:700}
.done h1{margin:0;font:800 42px/.92 var(--display);letter-spacing:.005em;text-transform:uppercase}
.codelbl{margin:22px 0 0}
.barcode{display:block;width:min(100%,320px);height:auto;margin:10px auto 0;color:var(--ink)}
.code{margin:8px 0 0;font:700 clamp(22px,7vw,32px)/1 var(--mono);letter-spacing:.18em}
.payinfo{margin:16px 0 0;padding:14px;border:1px solid var(--line);font-size:15px}
.next{margin:20px 0 0;padding:0 0 0 22px;text-align:left;font-size:15px}
.next li{margin:6px 0}
.summary{margin-top:20px;padding:14px 0 0;border-top:1px solid var(--ink);text-align:left}
.summary h2{margin:0 0 8px}
.summary ul{list-style:none;margin:0;padding:0;display:grid;gap:4px;font-size:14px}
.summary li{display:flex;justify-content:space-between;gap:10px}
.done .btn.ghost{margin-top:20px}
.fail h1{color:var(--alert)}
.fail p{text-align:left}
.ordertext{margin:14px 0;padding:12px;border:1px solid var(--line);background:var(--paper-2);text-align:left;white-space:pre-wrap;font:12px/1.5 var(--mono)}
.fail .btn+.btn{margin-top:10px}
:focus-visible{outline:2px solid var(--ink);outline-offset:2px}
@media (min-width:600px){.grid{grid-template-columns:1fr 1fr}}
