/* brewOS — brewos.co
   Paper #FCFCFB · Ink #1B1A18 · Graphite #34373A · Copper #C5792A (punctuation, never paint)
   Instrument Serif display · Inter body. Mobile first. */

:root{
  --paper:#FCFCFB;
  --ink:#1B1A18;
  --graphite:#34373A;
  --copper:#C5792A;
  --rule:rgba(27,26,24,0.12);
  --rule-soft:rgba(27,26,24,0.07);
  --muted:rgba(27,26,24,0.56);
  --gutter:20px;
  --max:1180px;
}

*,*::before,*::after{box-sizing:border-box}

html{-webkit-text-size-adjust:100%}

body{
  margin:0;
  background:var(--paper);
  color:var(--ink);
  font-family:Inter,-apple-system,BlinkMacSystemFont,"Segoe UI",system-ui,sans-serif;
  font-size:17px;
  line-height:1.62;
  -webkit-font-smoothing:antialiased;
  overflow-x:hidden;
}

/* height:auto is load-bearing: the width/height attributes on each <img> are
   there to reserve space and stop layout shift, but without this the browser
   honours the height attribute while constraining the width, and every photo
   gets stretched vertically. */
img{max-width:100%;height:auto;display:block}

a{color:inherit;text-decoration:none}

h1,h2,h3{font-family:"Instrument Serif",Georgia,"Times New Roman",serif;font-weight:400;letter-spacing:-0.004em;margin:0}

p{margin:0 0 1.05em 0}
p:last-child{margin-bottom:0}


/* ---------- shell ---------- */
.wrap{max-width:var(--max);margin:0 auto;padding:0 var(--gutter)}
/* A guard, paid for twice. Nesting a .wrap inside a .wrap doubles the gutter and
   silently puts that block on a different left edge from everything around it —
   it cost a squashed mobile menu once and a screenshot rendered at 88% of its
   width once. An inner wrap is now inert, so the mistake stops mattering. */
.wrap .wrap{max-width:none;padding-left:0;padding-right:0}
.narrow{max-width:720px}
.measure{max-width:660px}   /* the reading column — running text never changes width */

/* ---------- masthead ---------- */
.masthead{border-bottom:1px solid var(--rule);position:sticky;top:0;background:rgba(252,252,251,0.96);backdrop-filter:saturate(1.2) blur(8px);z-index:40}
/* The child combinator is load-bearing. As a descendant selector this also caught
   the drawer's own .wrap — the drawer sits inside <header class="masthead"> — so the
   open mobile menu inherited display:flex and height:60px and laid its five links
   out as a squashed single row 61px tall instead of stacking them. The menu opened;
   it was just unusable. */
.masthead > .wrap{display:flex;align-items:center;justify-content:space-between;height:60px;gap:16px}
.mark{font-size:23px;font-weight:600;letter-spacing:-0.03em;line-height:1;white-space:nowrap}
.mark span{color:var(--copper)}
.nav{display:none;align-items:center;flex-wrap:nowrap;white-space:nowrap;gap:26px;font-size:14.5px;color:var(--graphite)}
.nav a{padding-bottom:3px;border-bottom:2px solid transparent;transition:border-color .15s,color .15s}
.nav a:hover{color:var(--ink)}
.nav a[aria-current]{color:var(--ink);border-bottom-color:var(--copper)}
.langs{font-size:12px;color:rgba(27,26,24,0.3);letter-spacing:0.06em;white-space:nowrap}
.langs b{font-weight:500;color:var(--graphite)}
.menu-btn{width:40px;height:40px;margin-right:-8px;border:0;background:none;padding:0;display:flex;flex-direction:column;justify-content:center;align-items:flex-end;gap:5px;cursor:pointer}
.menu-btn span{display:block;width:21px;height:1.5px;background:var(--ink)}
.drawer{display:none;border-top:1px solid var(--rule-soft);background:var(--paper)}
.drawer.open{display:block}
.drawer a{display:block;padding:14px 0;border-bottom:1px solid var(--rule-soft);font-size:16px}
.drawer a:last-child{border-bottom:0}

/* ---------- rhythm ---------- */
.band{padding:56px 0}
.band-tight{padding:40px 0}
.hr{height:1px;background:var(--rule);border:0;margin:0}

.label{
  font-size:11px;letter-spacing:0.17em;text-transform:uppercase;
  color:var(--graphite);display:block;margin-bottom:14px;
  padding-top:13px;border-top:2px solid var(--copper);
}
.label-plain{border-top-color:var(--rule)}

/* ---------- display type ---------- */
.d1{font-size:clamp(38px,8.4vw,74px);line-height:1.04}
.d2{font-size:clamp(29px,5.6vw,46px);line-height:1.1}
/* The phone minimum is 21px, not 23px, because at 23px a sub-section heading landed
   two pixels under a pull quote (25px) and the difference read as an accident rather
   than a hierarchy. Six levels were sitting inside twenty pixels on a phone. */
.d3{font-size:clamp(21px,3.8vw,31px);line-height:1.2}
.lede{font-size:clamp(18px,2.4vw,21px);line-height:1.6;color:var(--graphite)}
.serif-q{font-family:"Instrument Serif",Georgia,serif;font-style:italic}

.sub{color:var(--graphite)}
.small{font-size:14px;color:var(--muted)}
.copper{color:var(--copper)}

/* ---------- hero ---------- */
.hero{padding:44px 0 0}
.hero h1{margin-bottom:18px}
.hero .lede{max-width:620px}
.hero-img{margin-top:38px}
.hero-img img{width:100%;height:auto;max-height:74vh;object-fit:cover;object-position:center 22%}        /* capped so the hero fits a screen; cover crops rather than stretches */

/* ---------- scene ---------- */
.scene{font-family:"Instrument Serif",Georgia,serif;font-size:clamp(21px,3.2vw,26px);line-height:1.44}
.scene + p{margin-top:20px}

/* ---------- entry moments ---------- */
.moment{padding:44px 0;border-top:1px solid var(--rule)}
.moment:first-of-type{border-top:2px solid var(--copper)}
.moment h2{margin-bottom:16px;max-width:17ch}
.moment .body{color:var(--graphite)}
.moment .body strong{color:var(--ink);font-weight:500}
.moment figure{margin:26px 0 0}
.moment figcaption{margin-top:9px}

/* ---------- screenshot slot ---------- */
.plate{
  border:1px dashed rgba(27,26,24,0.26);
  background:repeating-linear-gradient(135deg,rgba(27,26,24,0.022) 0 11px,transparent 11px 22px);
  display:flex;align-items:center;justify-content:center;text-align:center;
  padding:26px 20px;min-height:170px;
}
.plate span{font-size:12px;letter-spacing:0.07em;color:var(--muted);max-width:40ch;line-height:1.55}
.plate span b{display:block;font-weight:500;color:var(--graphite);letter-spacing:0.14em;text-transform:uppercase;font-size:10.5px;margin-bottom:7px}

/* ---------- a real screenshot ----------
   Screens carry all the colour on this site; the photography is monochrome. So a
   screenshot needs a quiet edge to read as a screen rather than as a picture, and
   nothing more than that — no shadow, no browser frame, no perspective. The rule
   is the same hairline the rest of the page uses. */
.shot{display:block;width:100%;height:auto;border:1px solid var(--rule);border-radius:3px}
.shot-cap{font-size:12.5px;line-height:1.5;color:var(--muted);margin-top:9px}

/* A capture taken on a phone is shown at the size of a phone. Stretched to the
   498px figure column a portrait screen runs about 970px tall and dominates the
   section it illustrates, and the thing it is evidence of — that this is a form
   somebody fills in one-handed standing at a tank — is exactly what the stretch
   destroys. Centred, with the column's air left around it. */
.shot-phone{max-width:316px;margin-left:auto;margin-right:auto}
.shot-phone + .shot-cap{max-width:420px;margin-left:auto;margin-right:auto;text-align:center}

/* A screenshot whose argument IS its detail gets the whole container, not a column.
   Measured: in the two-column moment layout a screenshot renders about 498px wide,
   at which the mash program's pull volumes and the lauter table's figures are
   present but unreadable — and "it shows you the arithmetic" is the claim the
   picture exists to prove. A photograph survives that width; a dense screen does
   not. These three run full width with the caption in the reading column. */
.shotband{margin:14px 0 4px}
.shotband .shot-cap{max-width:660px}
@media (min-width:860px){ .shotband{margin:22px 0 10px} }

/* ---------- full-bleed image ----------
   Art-directed: a separate crop is served to phones, so nothing is squeezed
   into a letterbox it was never framed for. Heights follow the crop. */
.bleed{width:100vw;margin-left:50%;transform:translateX(-50%)}
.bleed img{width:100%;height:auto;display:block}

/* ---------- pull ---------- */
.pull{
  font-family:"Instrument Serif",Georgia,serif;
  font-size:clamp(25px,4.4vw,38px);line-height:1.22;
  max-width:19ch;margin:0;
}

/* ---------- lists ---------- */
.plain{list-style:none;margin:0;padding:0}
.plain li{padding:13px 0;border-top:1px solid var(--rule-soft);color:var(--graphite)}
.plain li:first-child{border-top:0}

.refuse{list-style:none;margin:0;padding:0;max-width:640px}
.refuse li{padding:11px 0;border-top:1px solid var(--rule-soft);color:var(--graphite)}
.refuse li:first-child{border-top:0}

/* ---------- price table ---------- */
.tiers{margin-top:4px}
.tier{display:flex;align-items:baseline;justify-content:space-between;gap:16px;padding:19px 0;border-top:1px solid var(--rule)}
.tier:first-child{border-top:2px solid var(--copper)}
.tier:last-child{border-bottom:1px solid var(--rule)}
.tier .what{font-size:17px}
.tier .amt{font-family:"Instrument Serif",Georgia,serif;font-size:clamp(28px,5vw,36px);line-height:1;white-space:nowrap}
.tier .amt.talk{font-family:Inter,sans-serif;font-size:16px;border-bottom:2px solid var(--copper);padding-bottom:2px}

/* ---------- fit states ---------- */
.state{padding:30px 0;border-top:1px solid var(--rule)}
.state:first-of-type{border-top:2px solid var(--copper)}
.state h2{margin-bottom:14px}
.state .body{max-width:640px;color:var(--graphite)}
.state .body p{margin-bottom:.75em}
.state.no h2{color:rgba(27,26,24,0.42)}

/* ---------- actions ---------- */
.btn{
  display:inline-flex;align-items:center;justify-content:center;
  height:50px;padding:0 24px;background:var(--ink);color:var(--paper);
  font-size:15px;font-weight:500;border:1px solid var(--ink);
}
.btn:hover{background:#000}
.btn-ghost{background:none;color:var(--ink);border:1px solid rgba(27,26,24,0.26)}
.btn-ghost:hover{background:none;border-color:var(--ink)}
.actions{display:flex;flex-direction:column;gap:12px;margin-top:26px}
.actions .btn{width:100%}

/* ---------- article ---------- */
.article{max-width:660px}
.article h2{margin:34px 0 12px}
.article p{color:var(--graphite)}
.article .first{font-size:19px;color:var(--ink)}

/* ---------- footer ---------- */
.foot{border-top:1px solid var(--rule);padding:34px 0 46px;margin-top:30px}
.foot .cols{display:flex;flex-direction:column;gap:22px}
.foot .mark{font-size:21px}
.foot nav{display:flex;flex-wrap:wrap;gap:16px;font-size:14px;color:var(--graphite)}
.foot .fine{font-size:12.5px;color:var(--muted);line-height:1.7}

/* ---------- desktop ---------- */
@media (min-width:860px){
  :root{--gutter:48px}
  body{font-size:17.5px}
  .band{padding:84px 0}
  .band-tight{padding:56px 0}
  .hero{padding:72px 0 0}
  /* The photograph is a full-height panel, not a thumbnail parked at the top of
     a tall column. It fills the row and crops to fit, so there is never dead
     space under it. Sides alternate so the page has a rhythm. */
  .moment{padding:0;display:grid;grid-template-columns:repeat(12,1fr);gap:56px;align-items:stretch}
  .moment .text{grid-column:1/span 5;grid-row:1;padding:88px 0;align-self:center}
  .moment .text:only-child{grid-column:1/span 7}
  /* THE PHOTOGRAPHS KEEP THEIR OWN SHAPE. This figure used to be a flex column with
     min-height:500px and flex:1 on each child, which stretched every landscape photo
     to fill a tall portrait box and then cover-cropped it from the centre. Measured:
     the moment images were losing 56% to 74% of their width, which is how two brewers
     ended up as one ear and a pointing finger. The column was being balanced against
     the text at the cost of the pictures, which is the wrong trade — a figure column
     shorter than its text column is ordinary editorial layout. Note the phone was
     always fine, because the columns stack and the image renders at its native ratio;
     only desktop was destroying them. */
  .moment figure{grid-column:7/span 6;grid-row:1;margin:0;display:flex;flex-direction:column;gap:18px;align-self:center}
  .moment figure > img{width:100%;height:auto;object-fit:contain}
  /* CROPPED TO THE SUBJECT, NOT TO THE COLUMN (2026-10-13). Native landscape left a
     short photo beside a tall text column, and the page read as white space. Each
     photograph now carries its own shape (--ar) and its own focal point (--pos),
     chosen by looking at the picture: a single person goes portrait, a group stays
     square or wider so nobody is cut out. This is the opposite of the rule this
     replaced — the column never decides the crop; the subject does. Phones keep the
     native ratio, because there the columns stack. The figure then rides alongside
     its text (sticky), so a long section never leaves the picture behind. */
  .moment figure:has(> img.crop){align-self:start;position:sticky;top:110px;margin:88px 0}
  .moment figure > img.crop{aspect-ratio:var(--ar);object-fit:cover;object-position:var(--pos)}
  .moment figure > .plate{width:100%;min-height:230px}
  .moment:nth-of-type(even) .text{grid-column:8/span 5}
  .moment:nth-of-type(even) figure{grid-column:1/span 6}
  /* A moment with no figure keeps its text on the left, whichever side it falls on. */
  .moment:nth-of-type(n) .text:only-child{grid-column:1/span 7}
  .moment h2{margin-bottom:22px;max-width:16ch}
  .moment .body{max-width:44ch}
  .hero{display:grid;grid-template-columns:repeat(12,1fr);gap:40px;align-items:center;
        max-width:var(--max);margin:0 auto;padding:60px var(--gutter) 0}
  .hero .wrap{max-width:none;margin:0;padding:0}
  .hero .wrap:first-of-type{grid-column:1/span 6}
  .hero .hero-img{grid-column:7/span 6;margin-top:0}
  .hero.plain{display:block;padding-top:76px}
  .hero.plain .wrap{max-width:none;padding:0}
  .actions{flex-direction:row;gap:14px}
  .actions .btn{width:auto}
  .two{display:grid;grid-template-columns:repeat(12,1fr);gap:34px}
  .two .a{grid-column:1/span 6}
  .two .b{grid-column:8/span 5}
  .three{display:grid;grid-template-columns:repeat(3,1fr);gap:40px}
  .state{display:grid;grid-template-columns:repeat(12,1fr);gap:34px}
  .state h2{grid-column:1/span 3;margin-bottom:0}
  .state .body{grid-column:5/span 7}
  .tier .what{font-size:18px}
}

@media (min-width:1100px){
  :root{--gutter:64px}
}

/* The lede sits close under the hero so it reads as the opening of the story,
   not as a separate band floating between two images. */
.band.opening{padding:40px 0 72px}
@media (min-width:860px){
  .band.opening{padding:52px 0 92px}
}

/* The navigation needs real room before it earns its place. Below this the
   menu button carries it — five labels plus the language list wrap into a
   mess somewhere around 900px, which is exactly where tablets sit. */
@media (min-width:1040px){
  .nav{display:flex}
  .menu-btn{display:none}
  .drawer{display:none !important}
}
@media (min-width:1040px) and (max-width:1199px){
  .nav{gap:20px;font-size:14px}
  .langs{display:none}
}

/* ---------- lists inside the reference pages ---------- */
.inline-list{list-style:none;margin:16px 0 18px;padding:0;display:flex;flex-wrap:wrap;gap:8px 10px}
.inline-list li{font-size:14.5px;color:var(--graphite);border:1px solid var(--rule);padding:5px 11px;white-space:nowrap}
.plain.tight li{padding:9px 0}
.pairs{margin:18px 0 20px;display:grid;grid-template-columns:1fr;gap:0}
.pairs dt{font-weight:500;color:var(--ink);padding-top:12px;border-top:1px solid var(--rule-soft)}
.pairs dd{margin:2px 0 10px;color:var(--graphite)}
@media (min-width:640px){
  .pairs{grid-template-columns:minmax(140px,auto) 1fr;column-gap:28px}
  .pairs dt{padding:12px 0 0}
  .pairs dd{margin:0;padding:12px 0 0;border-top:1px solid var(--rule-soft)}
}

/* ---------- the beer's path ----------
   Drawn, not generated: a flowchart is almost entirely type, and type is the
   one thing an image generator cannot be trusted with. Real text also means it
   reflows on a phone and can be read aloud. */
/* padding:0 matters. An <ol> carries a 40px browser default inline-start padding,
   and .flow never reset it — so every flow diagram on the site sat 40px to the
   right of the heading and body text above it, on a page whose whole discipline is
   one left edge. .chain already resets it; this now matches. */
.flow{margin:34px 0 6px;padding:0;display:flex;flex-direction:column;gap:0;counter-reset:step}
.flow li{list-style:none;position:relative;padding:0 0 26px 30px;border-left:1px solid var(--rule)}
.flow li:last-child{border-left-color:transparent;padding-bottom:0}
.flow li::before{content:"";position:absolute;left:-5px;top:4px;width:9px;height:9px;background:var(--copper);border-radius:50%}
.flow .step{display:block;font-size:17px;font-weight:500;color:var(--ink);line-height:1.3}
.flow .what{display:block;font-size:14.5px;color:var(--muted);margin-top:3px}
@media (min-width:860px){
  .flow{flex-direction:row;gap:0;margin-top:40px}
  .flow li{flex:1;border-left:0;border-top:1px solid var(--rule);padding:22px 18px 0 0}
  .flow li:last-child{border-top-color:var(--rule)}
  .flow li::before{left:0;top:-5px}
}

/* ---------- the lot chain ---------- */
.chain{margin:30px 0 26px;padding:0;list-style:none;position:relative}
.chain li{position:relative;padding:0 0 22px 32px;border-left:2px solid var(--copper)}
.chain li:last-child{border-left-color:transparent;padding-bottom:0}
.chain li::before{content:"";position:absolute;left:-7px;top:5px;width:12px;height:12px;
  background:var(--paper);border:2px solid var(--copper);border-radius:50%}
.chain .step{display:block;font-weight:500;color:var(--ink)}
.chain .what{display:block;font-size:15px;color:var(--graphite);margin-top:2px}
.chain code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13.5px;
  background:rgba(27,26,24,0.05);padding:1px 6px;white-space:nowrap}

/* ---------- the twelve places ----------
   An honest counter. data-taken on the container fills that many marks, so the
   number on the page is changed by editing one digit and nothing else. */
.places{display:flex;gap:10px;margin:26px 0 14px;flex-wrap:wrap}
.places span{width:14px;height:14px;border:2px solid var(--copper);border-radius:50%}
.places[data-taken="1"] span:nth-child(-n+1),
.places[data-taken="2"] span:nth-child(-n+2),
.places[data-taken="3"] span:nth-child(-n+3),
.places[data-taken="4"] span:nth-child(-n+4),
.places[data-taken="5"] span:nth-child(-n+5),
.places[data-taken="6"] span:nth-child(-n+6),
.places[data-taken="7"] span:nth-child(-n+7),
.places[data-taken="8"] span:nth-child(-n+8),
.places[data-taken="9"] span:nth-child(-n+9),
.places[data-taken="10"] span:nth-child(-n+10),
.places[data-taken="11"] span:nth-child(-n+11),
.places[data-taken="12"] span:nth-child(-n+12){background:var(--copper)}
.places-note{font-size:15.5px;color:var(--graphite);margin:0}
.places-note strong{color:var(--ink);font-weight:500}

/* ---------- deadline stamp ---------- */
.stamp{display:inline-block;margin:24px 0 0;padding-top:11px;border-top:2px solid var(--copper);
  font-size:12px;letter-spacing:0.16em;text-transform:uppercase;color:var(--graphite)}

/* Founding price, ahead of the standard bands on Pricing */
.founding-price{border-top:2px solid var(--copper);padding-top:4px;max-width:720px}
.founding-price .label{border-top:0;padding-top:0}
.founding-price .fp{margin:18px 0 8px;display:flex;align-items:baseline;gap:16px;flex-wrap:wrap}
.founding-price .amt{font-family:"Instrument Serif",Georgia,serif;font-size:clamp(64px,11vw,104px);line-height:.9;color:var(--ink)}
.founding-price .per{font-size:19px;color:var(--graphite)}
.foot .fine a{border-bottom:1px solid var(--rule)}

/* Languages */
.langs a{color:inherit;text-decoration:none}
.langs a:hover{color:var(--graphite)}
.drawer-langs{margin-top:14px;padding-top:14px;border-top:1px solid var(--rule-soft);font-size:13px;color:var(--muted);letter-spacing:.02em}
.drawer-langs a{color:var(--muted)}
.drawer-langs b{font-weight:500;color:var(--graphite)}
.foot .fine a[lang]{border-bottom:0}
.langnote{background:var(--paper);border-bottom:1px solid var(--rule);font-size:14px;color:var(--graphite)}
.langnote .wrap{display:flex;align-items:center;gap:14px;padding-top:10px;padding-bottom:10px}
.langnote a{border-bottom:2px solid var(--copper);padding-bottom:1px}
.langnote button{margin-left:auto;background:none;border:0;font-size:20px;line-height:1;color:var(--muted);cursor:pointer;padding:4px 8px}
.drawer .drawer-langs a{display:inline;padding:0;border:0;font-size:13px}
.drawer .drawer-langs{padding-bottom:16px}
/* Long compound words in German and French headlines */
html:lang(de) :is(h1,h2,h3,.d1,.d2,.d3,.pull),html:lang(fr) :is(h1,h2,h3,.d1,.d2,.d3,.pull){-webkit-hyphens:auto;hyphens:auto;overflow-wrap:break-word}
/* Screens are captured in English until the demo brewery is recaptured in each language */
html:lang(es) .shot-cap::after{content:" Pantalla en inglés."}
html:lang(pt-BR) .shot-cap::after{content:" Tela em inglês."}
html:lang(de) .shot-cap::after{content:" Bildschirm auf Englisch."}
html:lang(fr) .shot-cap::after{content:" Écran en anglais."}
.shot-cap::after{color:var(--muted)}

/* Social links — header, phone menu, footer */
.social{display:inline-flex;align-items:center;gap:12px;margin-left:4px;padding-left:18px;border-left:1px solid var(--rule)}
.social a{display:inline-flex;padding:2px;border:0;color:var(--graphite);transition:color .15s}
.social a:hover{color:var(--copper)}
.social svg,.drawer-social svg,.foot-social svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round}
.social svg .dot,.drawer-social svg .dot,.foot-social svg .dot{fill:currentColor;stroke:none}
.drawer .drawer-social{display:flex;gap:22px;padding:4px 0 18px}
.drawer .drawer-social a{display:inline-flex;align-items:center;gap:8px;padding:0;border:0;font-size:14px;color:var(--graphite)}
.foot-social{display:flex;flex-wrap:wrap;gap:12px 26px}
.foot-social a{display:inline-flex;align-items:center;gap:9px;font-size:14px;color:var(--ink);transition:color .15s}
.foot-social a:hover{color:var(--copper)}
.foot-social svg{width:22px;height:22px}
