/* Nello Olivo Winery — one stylesheet for every page.
   Deliberately no build step: this is plain CSS served as-is, same spirit as the
   sibling sites in this repo, but shared across pages instead of copied into each. */

/* ─────────────  TOKENS  ───────────── */
/* Palette sampled directly off charleskrug.com:
     #ECE5D9  cream ground        #D4B68E  gold on dark (their "Join Us" tan)
     #F6F1E7  raised cream        #8E7048  deep gold on cream (Add to Cart)
     #000     black backfill      #161616  soft black
   Cream is the DEFAULT ground here; .dark is the backfill, not the base. */
:root{
  --paper:#FDFCF9;        /* near-white with the faintest warmth, the real base */
  --paper-2:#FFFFFF;      /* product / card ground, pure white */
  --paper-3:#F5EFE4;      /* warm cream, tint bands only */
  --black:#000000;
  --black-2:#161616;

  --gold-lo:#D4B68E;      /* on dark grounds */
  --gold-hi:#8C6F47;      /* on cream grounds, 4.57:1 (WCAG AA body text) */
  --wine:#5C1526;
  --ember:#8C3A18;

  /* live tokens, dark by default. Nello ruled out white grounds entirely, so
     the base set IS the dark set and .dark sections become harmless no-ops.
     One flip here restyles the footer and every unclassed section on all 34
     pages; nothing was edited per page. */
  --ink:var(--black);     /* ground   */
  --ink-2:var(--black-2); /* raised   */
  --ink-3:#1D1B1A;        /* card     */
  --cream:#F2EAD9;        /* text     */
  --dim:#9C8E7C;
  --gold:var(--gold-lo);
  --ember:#C2703A;
  --line:rgba(242,234,217,.15);
  --line-2:rgba(242,234,217,.30);

  /* Charles Krug's measured type system: Radley for display, Montserrat Light for
     everything else. His own logo artwork carries the wordmark, so no brand face
     is needed for the name itself. */
  --brand:"Radley",Georgia,serif;
  --display:"Radley",Georgia,serif;
  --body:"Montserrat",system-ui,-apple-system,"Helvetica Neue",Arial,sans-serif;
  --label:"Montserrat",system-ui,-apple-system,"Helvetica Neue",Arial,sans-serif;

  --gut:clamp(20px,5vw,72px);
  --maxw:1320px;
  --ease:cubic-bezier(.22,.61,.36,1);
  --ann:42px;              /* announcement bar height, header and hero offset from it */
}

*{margin:0;padding:0;box-sizing:border-box}
html{scroll-behavior:smooth;-webkit-text-size-adjust:100%}
body{
  background:var(--ink);color:var(--cream);
  /* Krug runs Montserrat Light at 14.4px. Nudged up slightly for readability. */
  font-family:var(--body);font-weight:300;font-size:clamp(15px,1.05vw,16.5px);line-height:1.85;
  -webkit-font-smoothing:antialiased;
  /* clip, NOT hidden. overflow-x:hidden makes <body> its own scroll container, so the
     document ends up with two competing scrollers and wheel scrolling stalls. clip
     stops the horizontal overflow without creating a scroll box at all. */
  overflow-x:clip;
}
::selection{background:var(--wine);color:var(--cream)}
img,video{display:block;max-width:100%}
a{color:inherit}

/* film grain over everything */
body::after{
  content:"";position:fixed;inset:-50%;z-index:9999;pointer-events:none;
  opacity:.16;mix-blend-mode:overlay;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='300' height='300'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.82' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='300' height='300' filter='url(%23n)'/%3E%3C/svg%3E");
  animation:grain 700ms steps(1) infinite;
}
@keyframes grain{
  0%{transform:translate(0,0)}20%{transform:translate(-3%,2%)}40%{transform:translate(2%,-3%)}
  60%{transform:translate(-2%,-2%)}80%{transform:translate(3%,1%)}100%{transform:translate(0,0)}
}

.wrap{max-width:var(--maxw);margin:0 auto;padding:0 var(--gut)}

/* ─────────────  SHARED TYPE  ───────────── */
/* letterspaced serif caps, not a sans. This single rule is most of the Antica feel. */
.label{
  font-family:var(--label);font-weight:600;font-size:13px;
  letter-spacing:.28em;text-transform:uppercase;color:var(--gold);
}
.sec-head{margin-bottom:clamp(40px,5vw,72px)}
.sec-head h2{
  font-family:var(--display);font-weight:400;
  font-size:clamp(38px,5.6vw,76px);line-height:1.02;letter-spacing:-.015em;margin-top:18px;
}
.sec-head h2 em{font-style:italic;color:var(--ember)}
.lede{max-width:56ch;color:var(--dim);margin-top:22px;font-size:1.06em}

.rule{height:1px;background:var(--line);border:0}

/* buttons */
.btn{
  display:inline-flex;align-items:center;justify-content:center;gap:13px;
  /* Lighter than before. The weight, the tight tracking and the hard square
     corners together made these read as slabs; 500 with a touch more letter
     spacing, a hairline corner and taller, narrower proportions let them sit
     on the page rather than sitting on top of it. */
  font-family:var(--label);font-weight:500;font-size:11.5px;letter-spacing:.24em;text-transform:uppercase;
  text-decoration:none;color:var(--cream);
  border:1px solid var(--line-2);border-radius:3px;
  padding:18px 38px;background:transparent;position:relative;overflow:hidden;
  transition:color .45s var(--ease),border-color .45s var(--ease),
             box-shadow .45s var(--ease),transform .45s var(--ease);
}
.btn:hover{transform:translateY(-1px)}
.btn:active{transform:translateY(0)}
.btn::before{
  content:"";position:absolute;inset:0;background:var(--cream);z-index:-1;
  transform:translateY(101%);transition:transform .45s var(--ease);
}
.btn:hover{color:var(--ink);border-color:var(--cream)}
.btn:hover::before{transform:translateY(0)}
/* The filled one was the blockiest of the set: a solid maroon rectangle with no
   edge. Softening the corner and lifting it on a shadow instead of a hard fill
   edge gives it weight without the slab. */
.btn.solid{
  background:var(--wine);border-color:var(--wine);
  box-shadow:0 1px 2px rgba(60,14,24,.28), 0 8px 22px -10px rgba(60,14,24,.55);
}
.btn.solid:hover{box-shadow:0 2px 4px rgba(60,14,24,.32), 0 14px 30px -12px rgba(60,14,24,.6)}
.btn.solid:hover{color:var(--ink)}
.btn .arw{transition:transform .45s var(--ease)}
.btn:hover .arw{transform:translateX(5px)}

/* ─────────────  ANNOUNCEMENT BAR  ───────────── */
.announce{
  /* A thin strip, like theirs: it announces, it does not take up residence. */
  position:fixed;top:0;left:0;right:0;z-index:120;height:var(--ann);
  display:flex;align-items:center;justify-content:center;gap:14px;
  padding:0 44px 0 20px;color:#EFE7D8;
  background:var(--black);border-bottom:0;
  /* The display face here too, so the top of every page is set in one voice.
     A 600-weight sans was shouting; Radley at this size is just as legible and
     considerably better mannered. */
  font-family:var(--display);font-weight:400;font-size:15.5px;letter-spacing:.02em;
  transition:opacity .5s var(--ease),transform .5s var(--ease),background .5s var(--ease);
}
.announce p{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:0}
/* Two colours, as Krug does it: the sentence in cream, the action in gold
   with a rule under it, so the clickable half is obvious without a button. */
.announce a{color:var(--gold-lo);text-decoration:none;border-bottom:1px solid rgba(212,182,142,.7);
  white-space:nowrap;padding-bottom:1px;transition:color .3s var(--ease),border-color .3s var(--ease)}
.announce a:hover{color:#F6E9CE;border-color:#F6E9CE}

.announce .x{
  position:absolute;right:10px;top:50%;transform:translateY(-50%);
  background:none;border:0;color:inherit;opacity:.55;cursor:pointer;
  font-size:15px;line-height:1;padding:8px;
}
.announce .x:hover{opacity:1}
body.ann-off{--ann:0px}
body.ann-off .announce{display:none}

/* ─────────────  HEADER  ───────────── */
/* Three columns: icon rail, centred script mark, account rail. The mark only
   fades in once you scroll past the hero, so the logo never doubles up. */
#hdr{
  position:fixed;top:var(--ann);left:0;right:0;z-index:100;
  padding:15px 0;border-bottom:1px solid transparent;
  background:var(--black);color:#F2EAD9;
  transition:background .5s var(--ease),padding .5s var(--ease),border-color .5s var(--ease),
             top .3s var(--ease),opacity .5s var(--ease),transform .5s var(--ease);
}
#hdr::before{content:none}
#hdr.stuck{padding:9px 0}
#hdr.stuck::before{opacity:0}

/* ── top furniture over the hero ─────────────────────────────────────────────
   Set the way Krug set theirs: the announcement strip keeps its solid black at
   every scroll position, and only the header below it opens up over the film.
   The strip is the one hard edge at the top of the page, and having it there is
   what lets the header be soft, because the eye reads the two together as one
   piece of furniture rather than as a band floating on the video.

   .at-top is only ever set on hover-capable pointers (see site.js), so a phone
   or tablet keeps the ordinary solid bar and never has to discover a hidden one.
   Keyboard users are covered by :focus-within, which fires before the pointer
   rules and outranks them, so tabbing into the page always shows the nav. */
body.at-top #hdr{background:transparent}
/* Frost, not fill. A solid panel is what she kept rejecting and a bare gradient
   still had to be dark enough to carry the type on its own. Blurring the film
   behind the bar does most of the work instead: it flattens out the blown sky
   and the tree detail that the letters were competing with, so the tint over it
   can stay light and the type can stay at its normal weight.

   Cream on the brightest frames measures 0.79:1 bare, which is unreadable, and
   is what forced the pure white at 600 this replaces. Frosted it composites to
   about 6:1 at the height the labels sit, and the gold marks to 4:1.

   It runs on a pseudo-element that overhangs the bar rather than on the bar
   itself, and the mask fades the blur out along with the tint. That matters:
   backdrop-filter alone stops dead at its box edge, which is exactly the hard
   band she has rejected every time it has appeared. Masked, the frost dissolves
   into the film and there is no edge anywhere to see. */
body.at-top #hdr::before{
  content:"";position:absolute;left:0;right:0;top:0;height:calc(100% + 76px);
  z-index:-1;pointer-events:none;
  backdrop-filter:blur(16px) saturate(118%);
  -webkit-backdrop-filter:blur(16px) saturate(118%);
  background:linear-gradient(to bottom,
    rgba(8,8,9,.80)  0%,
    rgba(8,8,9,.62) 30%,
    rgba(8,8,9,.38) 55%,
    rgba(8,8,9,.15) 80%,
    rgba(8,8,9,0)  100%);
  -webkit-mask-image:linear-gradient(to bottom,#000 0%,#000 34%,rgba(0,0,0,.45) 68%,transparent 100%);
          mask-image:linear-gradient(to bottom,#000 0%,#000 34%,rgba(0,0,0,.45) 68%,transparent 100%);
}
/* Without backdrop-filter the frost cannot happen, so the tint has to carry the
   contrast by itself and goes back up to where the plain scrim had it. */
@supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){
  body.at-top #hdr::before{
    background:linear-gradient(to bottom,
      rgba(8,8,9,.92) 0%, rgba(8,8,9,.74) 30%,
      rgba(8,8,9,.46) 55%, rgba(8,8,9,.18) 80%, rgba(8,8,9,0) 100%);
  }
}
/* The scrim carries the contrast now, so the halo only has to catch the worst
   frames. The old setting stacked three shadows and pushed the labels to pure
   white at 600, which lit the rail up like a toolbar; this is one soft shadow
   under warm cream at the same weight the rest of the site is set in. */
body.at-top .ico{
  opacity:1;color:#EDE3D0;
  text-shadow:0 1px 3px rgba(0,0,0,.8), 0 0 10px rgba(0,0,0,.45);
}
body.at-top .ico svg{stroke-width:1.4}
body.at-top .ico .bars i{height:1.5px}
/* body.at-top .ico outranks .ico:hover on specificity, so the hover colour has
   to be restated at the same weight or the rail goes dead over the hero. */
body.at-top .ico:hover,body.at-top .ico:focus-visible{color:#F8EDD6}
/* The gold mark sits on the film with nothing behind it, so it is lifted well
   above its printed value to hold against the sunlit rows. */
body.at-top .hmark img{
  filter:brightness(1.5) saturate(1.05)
         drop-shadow(0 1px 2px rgba(0,0,0,.92)) drop-shadow(0 0 6px rgba(0,0,0,.6));
}

/* This used to hold the bar 34px down once the strip was dismissed, so the icons
   would stay where they had always been. That was the wrong trade: it left a
   band of film showing above the bar and the whole thing read as floating loose
   rather than sitting on the top edge. With the strip gone the bar goes to the
   top, which is where a bar belongs. */

.hrow{display:grid;grid-template-columns:1fr auto 1fr;align-items:center;gap:18px}
.rail{display:flex;align-items:center;gap:clamp(12px,2.2vw,32px)}
.rail.right{justify-self:end}

.ico{
  /* Icon and word on one line, the way Krug sets theirs. Stacked, the word sat
     under the glyph and the whole rail read as a phone tab bar; inline it reads
     as a line of type that happens to carry a mark. */
  display:flex;flex-direction:row;align-items:center;gap:9px;
  background:none;border:0;padding:0;cursor:pointer;text-decoration:none;color:#F2EAD9;
  /* Set in Radley, the display face, rather than the utility sans. The icons are
     drawn in fine 1.25px strokes and a heavy uppercase sans underneath them read
     as a toolbar; a light serif with generous tracking sits with the script mark
     in the middle and lets the whole bar read as one piece of typography. */
  font-family:var(--display);font-weight:400;font-size:12.5px;letter-spacing:.26em;text-transform:uppercase;
  opacity:.88;transition:opacity .3s var(--ease),color .3s var(--ease);
}
.ico:hover{opacity:1;color:var(--gold-lo)}

/* ── his tracks, in his own palette ──────────────────────────────────────────
   The native <audio controls> widget cannot be styled: it renders as a grey
   browser bar with a blue focus ring, which on a cream page looked like a bug.
   This is the same functionality drawn to match the site. */
.player{
  display:flex;align-items:center;gap:clamp(12px,1.6vw,20px);
  max-width:520px;margin:26px auto 0;padding:14px 18px;
  border:1px solid var(--line-2);border-radius:3px;
  background:rgba(0,0,0,.02);
}
.dark .player,.mob .player{background:rgba(242,234,217,.05)}
.pl-play{
  flex:none;width:46px;height:46px;border-radius:50%;cursor:pointer;
  display:grid;place-items:center;
  background:var(--gold);border:0;color:#1A1512;
  transition:transform .3s var(--ease),box-shadow .3s var(--ease);
  box-shadow:0 1px 2px rgba(60,44,18,.22), 0 8px 20px -10px rgba(60,44,18,.45);
}
.pl-play:hover{transform:translateY(-1px)}
.pl-play:focus-visible{outline:2px solid var(--gold);outline-offset:3px}
.pl-play svg{width:22px;height:22px;fill:currentColor}
.pl-i-pause{display:none}
.player.on .pl-i-play{display:none}
.player.on .pl-i-pause{display:block}

.pl-bar{
  flex:1;height:3px;border-radius:2px;cursor:pointer;position:relative;
  background:var(--line-2);
}
.pl-bar:focus-visible{outline:2px solid var(--gold);outline-offset:6px}
.pl-fill{
  position:absolute;inset:0 auto 0 0;width:0%;
  background:var(--gold);border-radius:2px;
}
.pl-bar::after{
  content:"";position:absolute;top:50%;left:var(--at,0%);
  width:11px;height:11px;margin:-5.5px 0 0 -5.5px;border-radius:50%;
  background:var(--gold);opacity:0;transition:opacity .25s var(--ease);
}
.pl-bar:hover::after,.pl-bar:focus-visible::after,.player.on .pl-bar::after{opacity:1}

.pl-time{
  flex:none;font-family:var(--label);font-size:11.5px;letter-spacing:.12em;
  color:var(--dim);font-variant-numeric:tabular-nums;min-width:74px;text-align:right;
}
.pl-time b{color:var(--cream);font-weight:500}
.dark .pl-time b,.mob .pl-time b{color:#F2EAD9}
.pl-dl{
  flex:none;color:var(--dim);text-decoration:none;font-size:15px;line-height:1;
  padding:6px;transition:color .3s var(--ease);
}
.pl-dl:hover{color:var(--gold)}

/* The sound toggle. Off shows the crossed-out speaker, on shows the waves, so
   the state is legible without relying on colour alone. */
.snd .snd-on{opacity:0;transition:opacity .3s var(--ease)}
.snd .snd-off{opacity:1;transition:opacity .3s var(--ease)}
.snd.on .snd-on{opacity:1}
.snd.on .snd-off{opacity:0}
.snd.on{color:var(--gold-lo);opacity:1}
/* Set when the browser refused to start the track on its own. One slow pulse,
   so a blocked autoplay reads as an invitation rather than nothing happening. */
@keyframes sndNudge{
  0%,100%{transform:scale(1)}
  50%    {transform:scale(1.16)}
}
.snd.nudge{color:var(--gold-lo);opacity:1;animation:sndNudge 2.2s var(--ease) 3}
@media (prefers-reduced-motion: reduce){ .snd.nudge{animation:none} }
.snd .snd-cone{fill:currentColor;stroke:currentColor;stroke-width:1}


/* Kept on phones: the 640px block below drops every label, not just this one. */
.ico svg{
  width:26px;height:26px;display:block;
  stroke:currentColor;stroke-width:1.25;fill:none;stroke-linecap:round;stroke-linejoin:round;
}
.ico .bars{display:block;width:26px;height:26px;position:relative}
.ico .bars i{
  position:absolute;left:0;right:0;height:1.25px;background:currentColor;border-radius:2px;
  transition:transform .4s var(--ease),opacity .3s;
}
.ico .bars i:nth-child(1){top:5px}
.ico .bars i:nth-child(2){top:10px}
.ico .bars i:nth-child(3){top:15px}
[aria-expanded="true"] .bars i:nth-child(1){transform:translateY(5px) rotate(45deg)}
[aria-expanded="true"] .bars i:nth-child(2){opacity:0}
[aria-expanded="true"] .bars i:nth-child(3){transform:translateY(-5px) rotate(-45deg)}

/* ── the rail in two tones, the way Krug sets theirs ─────────────────────────
   Everything above draws from currentColor, which meant glyph and word were
   always the same value and the whole rail read as one flat toolbar. Splitting
   them gives the gold the decorating to do and leaves the cream to be read.

   The mark colour travels as a custom property rather than as a colour on each
   selector, so a state only has to redeclare --mark once and the stroke, the
   hamburger bars and the speaker cone all follow it. */
.ico{--mark:#D4B68E;color:#EDE3D0}
.ico svg{stroke:var(--mark)}
.ico .bars i{background:var(--mark)}
.snd .snd-cone{fill:var(--mark);stroke:var(--mark)}
.ico:hover,.ico:focus-visible{color:#F8EDD6;--mark:#F0DDB8}
.snd.on{--mark:#F0DDB8}

.hmark{justify-self:center;line-height:0;display:block}
.hmark img{
  height:clamp(30px,3.2vw,44px);width:auto;
  opacity:0;transition:opacity .5s var(--ease);
}
#hdr .hmark img{opacity:1}

/* full-screen overlay menu at every width */
nav.main{
  z-index:125;
  position:fixed;inset:0;z-index:115;
  /* See-through: the vineyard keeps running behind the list, softened rather
     than hidden. The blur is what makes the text sit still against moving
     footage; the brightness knock-down is held light enough that the rows and
     the light are still legibly there. Cream on this lands near 2.5:1 on the
     brightest frames, under the 3:1 large-text minimum, so each item carries
     its own halo below to hold the letters up. */
  /* The panel carries its own footage rather than sampling the page behind it.
     Reading the page was the flaw in the see-through version: over the hero it
     showed the vineyard, but over any cream section it showed blurred cream,
     which came out flat grey. With the film inside the panel the menu looks the
     same everywhere, and the ground under the text is one known thing instead
     of whatever section happened to be underneath. */
  background:transparent;
  backdrop-filter:blur(3px);
  -webkit-backdrop-filter:blur(3px);
  display:flex;flex-direction:column;align-items:center;justify-content:flex-start;gap:4px;
  /* Centred by auto margins rather than justify-content. A centred flex column
     that overflows clips at the top, taking the first items out of reach with
     no way to scroll back to them; on a 412px-tall window that hid Cali Mojo,
     Members, Gift Cards and Contact entirely. Auto margins centre when there is
     room and collapse when there is not, so the list always scrolls to all of
     itself. The top pad clears the announcement bar. */
  overflow-y:auto;overscroll-behavior:contain;
  padding:calc(var(--ann) + 40px) 20px 34px;
  opacity:0;visibility:hidden;transition:opacity .45s var(--ease),visibility .45s;
}
nav.main::before{content:"";margin-top:auto}
nav.main::after{content:"";margin-bottom:auto}
nav.main.open{opacity:1;visibility:visible}

/* His vineyard, running inside the panel. Sits under everything the menu draws;
   the list and the close button get a layer above it. */
.navbg{
  position:absolute;inset:0;z-index:0;
  width:100%;height:100%;object-fit:cover;
  pointer-events:none;border:0;
}
/* The scrim is what makes the type safe. Measured on this footage the cream sat
   near 1.1:1 unaided, so this floors the ground while still reading as film
   rather than as a black panel: the rows and the light stay visible through it,
   they are just held down. */
.navbg-scrim{
  position:absolute;inset:0;z-index:1;pointer-events:none;
  background:
    linear-gradient(180deg, rgba(8,5,4,.82) 0%, rgba(8,5,4,.72) 50%, rgba(8,5,4,.86) 100%),
    radial-gradient(120% 78% at 50% 46%, rgba(8,5,4,.30) 0%, rgba(8,5,4,.72) 100%);
}
nav.main > a,
nav.main > .nav-sub,
nav.main > .navfoot{position:relative;z-index:2}
/* z-index only. Giving this position:relative pulled the close button out of its
   corner and into the middle of the list, because it is absolutely positioned. */
nav.main > .nav-close{z-index:2}

/* No footage for anyone who asked for stillness. */
@media (prefers-reduced-motion: reduce){
  .navbg{display:none}
  .navbg-scrim{background:rgba(8,5,4,.93)}
}

/* Without backdrop-filter nothing is flattening the footage, so the panel falls
   back to nearly solid. The look is what gives, not the legibility. */
@supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){
  nav.main{background:rgba(16,8,6,.965)}
}

/* The menu stands in for the mark rather than covering it. The panel is
   see-through, so leaving the logo lit underneath would print the list straight
   through it. Both come back the moment the menu closes. */
.hero-in,.hero .cue{transition:opacity .4s var(--ease)}
body:has(nav.main.open) .hero-in,
body:has(nav.main.open) .hero .cue{opacity:0;pointer-events:none}

nav.main a{
  /* Sized against the height as well as the width. Adding Events and the two
     rooms pushed a nine-item list past a 720px window, and while the panel does
     scroll, a menu you have to scroll to reach Cali Mojo is a menu that has
     stopped doing its job. The vh term gives the list back its own page on a
     short window and changes nothing on a tall one. */
  font-family:var(--display);font-weight:300;font-size:clamp(30px,min(5.4vw,5.9vh),58px);
  line-height:1.25;color:var(--cream);text-decoration:none;
  transition:color .3s var(--ease);
  /* Carries the letters when a bright frame passes behind them. */
  text-shadow:0 1px 3px rgba(0,0,0,.85), 0 0 16px rgba(0,0,0,.6);
}

/* The list arrives rather than appearing: each item slides in from the left, a
   beat behind the one above it. Staggering is what stops eight items landing at
   once, which is the thing that reads as cheap. Delays live on the .open state
   so closing snaps back without playing the whole cascade in reverse. */
nav.main a,nav.main .nav-sub,nav.main .navfoot{
  opacity:0;transform:translateX(-34px);
  transition:opacity .45s var(--ease),transform .55s var(--ease),color .3s var(--ease);
}
nav.main.open a,nav.main.open .nav-sub,nav.main.open .navfoot{opacity:1;transform:none}
/* Direct children only. Unscoped, :nth-of-type also numbered the links nested
   inside .navfoot and .nav-sub against their own parents, so the first item in
   each group picked up the first item's delay and the cascade restarted. */
nav.main.open > a:nth-of-type(1){transition-delay:.10s}
nav.main.open > a:nth-of-type(2){transition-delay:.16s}
nav.main.open > a:nth-of-type(3){transition-delay:.22s}
nav.main.open > a:nth-of-type(4){transition-delay:.28s}
nav.main.open > a:nth-of-type(5){transition-delay:.34s}
nav.main.open > a:nth-of-type(6){transition-delay:.40s}
nav.main.open > .nav-sub{transition-delay:.43s}
nav.main.open > a:nth-of-type(7){transition-delay:.46s}
nav.main.open > a:nth-of-type(8){transition-delay:.52s}
nav.main.open > a:nth-of-type(9){transition-delay:.58s}
nav.main.open .navfoot{transition-delay:.66s}
@media (prefers-reduced-motion: reduce){
  nav.main a,nav.main .nav-sub,nav.main .navfoot{transform:none;transition-delay:0s !important}
}
nav.main a:hover{color:var(--gold)}
nav.main .navfoot{
  margin-top:clamp(28px,4vw,52px);display:flex;gap:26px;flex-wrap:wrap;justify-content:center;
  font-family:var(--label);font-size:12px;letter-spacing:.2em;text-transform:uppercase;
}
nav.main .navfoot a{font-family:var(--label);font-size:12px;color:var(--dim);letter-spacing:.2em}
nav.main .navfoot a:hover{color:var(--gold)}
.nav-close{position:absolute;top:22px;right:26px;background:none;border:0;color:var(--cream);cursor:pointer;font-size:26px;line-height:1;padding:10px}

/* ─────────────  HERO  ───────────── */
/* Name high, image filling everything under it. */
.hero{
  position:relative;min-height:100svh;overflow:hidden;
  display:flex;flex-direction:column;align-items:center;
  /* Raised in stages, then brought back down twice. With the page below it gone
     the mark is the whole composition now, so it sits lower and closer to the
     optical centre than it did when it had to leave room for what followed. */
  padding-top:calc(var(--ann) + clamp(132px,23vh,252px));
}

/* His own Camino tasting room: stone wall, hand-hewn beams, his gold labels on
   the shelves. Graded down in Pillow rather than in CSS so the falloff lives in
   the pixels. The <video> sits above this and fades in over it, so dropping in
   img/vineyard.mp4 later needs no CSS change. */
.hero-bg{position:absolute;inset:0;z-index:0;background:#140A08;overflow:hidden}
.hero-bg::before{
  content:"";position:absolute;inset:-4%;
  background:url("/img/vineyard-poster.jpg") center center/cover no-repeat;
  animation:drift 52s ease-in-out infinite alternate;
}
/* Edge-only shade. Neutral black, not warm: a brown falloff reads as faded 70s
   film. Nothing darkens the middle, so the room light carries the centre and the
   gold script sits in it rather than in a hole. */
.hero-bg::after{
  content:"";position:absolute;inset:0;
  background:
    radial-gradient(92% 76% at 50% 42%, transparent 0%, transparent 44%, rgba(6,6,7,.26) 70%, rgba(4,4,5,.78) 100%),
    linear-gradient(to bottom, rgba(6,6,7,.66) 0%, rgba(6,6,7,.16) 20%, transparent 42%, rgba(4,4,5,.88) 100%);
}
@keyframes drift{
  from{transform:scale(1) translate3d(0,0,0)}
  to{transform:scale(1.08) translate3d(-1.4%,-1%,0)}
}
.hero video{
  position:absolute;inset:0;width:100%;height:100%;object-fit:cover;z-index:1;
  opacity:1;
}
.hero video.ready{opacity:1}
.hero .scrim{
  position:absolute;inset:0;z-index:2;pointer-events:none;
  /* No vignette. The radial that used to close the corners is gone, and so is
     the darkening across the top, which was the other half of what read as a
     bar behind the icons. What is left is one soft rise at the foot, carrying
     the region line and handing off to the section below. Corner to corner the
     frame is now open. */
  background:linear-gradient(to bottom,
    transparent 0%, transparent 56%, rgba(4,4,5,.70) 100%);
}
/* Stated outright. It was resolving to the cream page's ink, rgb(26,21,18), so
   it rendered near-black on the footage and vanished. Nothing in the hero should
   inherit a colour from the page's default token set. */
.hero .region{color:#F3EADB}
.hero .cue{color:#E6DCCB}

/* The region line used to rest on the scrim that is now gone, and it sits right
   where the rows are brightest. Its own halo replaces what the scrim was doing. */
.hero .region,.hero .cue{
  text-shadow:0 1px 3px rgba(0,0,0,.9), 0 0 12px rgba(0,0,0,.7), 0 0 26px rgba(0,0,0,.45);
}

.hero-in{position:relative;z-index:3;width:100%;text-align:center}
h1{margin:0;line-height:0}
/* His actual logo artwork, black keyed to alpha. Not typeset, so it stays his. */
}

/* Anyone who asked for stillness gets the finished mark, no writing. */
@media (prefers-reduced-motion: reduce){
  }

/* The mark arrives left to right, so the script reads in the order it was
   written: the N, then ello, then Olivo. A clip wipe rather than a traced pen
   path, because tracing his artwork produced outlines rather than stroke
   centres and drew the edges of the letters instead of the letters. This only
   clips, so it cannot move or hide the mark if the animation never runs. */
@keyframes penWipe{
  from { clip-path:inset(0 100% 0 0) }
  to   { clip-path:inset(0 0 0 0) }
}
.hero .logo{
  clip-path:inset(0 100% 0 0);
  animation:penWipe 2.1s cubic-bezier(.62,.02,.30,1) .45s forwards;
}
@media (prefers-reduced-motion: reduce){
  .hero .logo{clip-path:none;animation:none}
}

.logo{
  display:block;margin:0 auto;width:min(64vw,520px);height:auto;
  /* Lifted well above its printed value. His gold sits on moving footage with
     nothing behind it, so it has to carry itself; the shadow underneath is what
     keeps it from going flat when a bright frame passes. */
  filter:brightness(1.42) saturate(1.06)
         drop-shadow(0 5px 30px rgba(12,3,4,.78))
         drop-shadow(0 0 18px rgba(0,0,0,.45));
}
/* Letterspacing adds trailing space after the last letter, which throws a centred
   line visibly left. The negative left margin of one space cancels it. */
.region{
  display:block;margin-top:clamp(22px,2.8vw,38px);
  margin-left:-.34em;
  font-family:var(--label);font-weight:500;
  font-size:clamp(13px,1.35vw,18px);letter-spacing:.34em;text-transform:uppercase;
  color:var(--cream);opacity:.9;text-shadow:0 2px 16px rgba(12,3,4,.9);
}

/* ─────────────  INTRO  ───────────── */
.intro{padding:clamp(70px,9vw,120px) 0;text-align:center;border-bottom:1px solid var(--line)}
.intro-line{
  font-family:var(--display);font-weight:300;font-style:italic;
  font-size:clamp(26px,3.6vw,48px);line-height:1.2;max-width:20ch;margin:0 auto;
}
.intro-sub{color:var(--dim);max-width:48ch;margin:22px auto 0}
.intro-cta{display:flex;flex-wrap:wrap;gap:14px;justify-content:center;margin-top:clamp(30px,3.6vw,44px)}

.cue{
  position:absolute;bottom:26px;left:50%;transform:translateX(-50%);z-index:3;
  font-family:var(--label);font-size:9.5px;letter-spacing:.34em;text-transform:uppercase;color:var(--dim);
  display:flex;flex-direction:column;align-items:center;gap:10px;text-decoration:none;
}
.cue i{display:block;width:1px;height:42px;background:linear-gradient(to bottom,var(--gold),transparent);animation:cue 2.4s var(--ease) infinite}
@keyframes cue{0%,100%{transform:scaleY(.35);opacity:.4;transform-origin:top}50%{transform:scaleY(1);opacity:1;transform-origin:top}}

/* staggered load-in */
.rise{opacity:0;transform:translateY(26px);animation:rise 1.1s var(--ease) forwards}
@keyframes rise{to{opacity:1;transform:none}}
.d1{animation-delay:.15s}.d2{animation-delay:.32s}.d3{animation-delay:.5s}.d4{animation-delay:.68s}.d5{animation-delay:.86s}

/* ── selected grows ──────────────────────────────────────────────────────────
   One rule for the whole site: whatever is currently chosen sits slightly
   forward of everything around it. Applied to the browse dock, the overlay menu
   and the membership cards, so the feedback is the same wherever you are rather
   than each component inventing its own.

   Kept to 1.06 deliberately: enough to read as selected, small enough not to
   disturb the row it sits in. Anyone who asked for reduced motion gets the
   colour and weight changes without the movement. */
.dock-item,
nav.main a,
.tier{transition:transform .35s var(--ease),border-color .35s var(--ease),opacity .35s var(--ease)}

.dock-item[aria-current="page"],
nav.main a[aria-current="page"]{transform:scale(1.06)}
.dock-item:hover,
.dock-item:focus-visible{transform:scale(1.06)}
.tier:hover,
.tier:focus-visible,
.tier:focus-within{transform:scale(1.03)}
.tier.feat{transform:scale(1.03)}
.tier.feat:hover{transform:scale(1.06)}
/* These were plain divs with no link, no pointer and no action, so only the
   featured one, which carries a gold border, read as something you could press.
   They are anchors now; the rest is making all four say so. */
.tier{display:flex;flex-direction:column;cursor:pointer;text-decoration:none}
.tier:hover,.tier:focus-visible{border-color:var(--gold)}
.tier .go{
  margin-top:auto;padding-top:16px;
  font-family:var(--label);font-weight:600;font-size:11px;
  letter-spacing:.24em;text-transform:uppercase;color:var(--gold-hi);
}
.tier .go .arw{display:inline-block;transition:transform .3s var(--ease)}
.tier:hover .go .arw{transform:translateX(5px)}

@media (prefers-reduced-motion: reduce){
  .dock-item,nav.main a,.tier,
  .dock-item[aria-current="page"],nav.main a[aria-current="page"],
  .dock-item:hover,.tier:hover,.tier.feat,.tier.feat:hover{transform:none}
}

/* One line of flavour on each carousel slide, so browsing tells you something
   about the wine rather than just its price. It is the sensory sentence lifted
   out of his own notes, clamped to three lines: the full note lives on the
   wine's own page and this is the invitation to go there. */
.cf-notes{
  display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;
  margin-top:9px;max-width:34ch;margin-inline:auto;
  font-size:.86em;line-height:1.45;color:var(--dim);
}
.cf-item[data-off="0"] .cf-notes{color:#CFC4B4}

/* ── his tasting notes ───────────────────────────────────────────────────────
   Every wine page used to carry the same sentence about eleven varieties and
   small lots. These are his own words, harvested from his shop, unedited: the
   pairing line and the ABV are split out because they answer different
   questions and a reader scans for them separately. */
.pairing{
  margin-top:clamp(14px,1.8vw,22px);
  font-size:1.02em;line-height:1.6;color:var(--cream);
}
.pairing span{
  display:block;margin-bottom:4px;
  font-family:var(--label);font-size:11px;letter-spacing:.24em;
  text-transform:uppercase;color:var(--gold);
}
.abv{
  margin-top:clamp(12px,1.5vw,18px);
  font-family:var(--label);font-size:11px;letter-spacing:.18em;
  text-transform:uppercase;color:var(--dim);
}

/* ── press and contact ───────────────────────────────────────────────────────
   The coverage list is empty on purpose: nothing was recorded anywhere in the
   old site or its archive, and a press page with invented entries is worse than
   one that is honestly short. Each item is outlet, headline, date, linking out
   to the original, which is the whole convention. */
.social-row{
  display:flex;flex-wrap:wrap;gap:14px;justify-content:center;
  margin-top:clamp(20px,3vw,34px);
}
.press-list{list-style:none;margin:clamp(20px,3vw,34px) auto 0;padding:0;max-width:860px}
.press-list:empty{display:none}
.press-item{
  display:grid;grid-template-columns:1fr auto;gap:4px 24px;align-items:baseline;
  padding:20px 0;border-bottom:1px solid var(--line);
}
.press-item a{
  grid-column:1;font-family:var(--display);font-size:clamp(18px,2vw,24px);
  color:var(--cream);text-decoration:none;line-height:1.25;
  transition:color .3s var(--ease);
}
.press-item a:hover{color:var(--gold)}
.press-item .outlet{
  grid-column:1;font-family:var(--label);font-size:11px;letter-spacing:.2em;
  text-transform:uppercase;color:var(--gold);
}
.press-item time{
  grid-column:2;grid-row:1/3;font-family:var(--label);font-size:11.5px;
  letter-spacing:.14em;color:var(--dim);white-space:nowrap;
}
.press-empty{
  max-width:560px;margin:clamp(18px,2.6vw,28px) auto 0;text-align:center;
  color:var(--dim);font-size:.95em;
}
.press-empty a{color:var(--gold)}

/* ─────────────  TICKER  ───────────── */
.ticker{border-top:1px solid var(--line);border-bottom:1px solid var(--line);background:var(--ink-2);overflow:hidden;padding:16px 0}
.ticker-in{display:flex;gap:56px;white-space:nowrap;width:max-content;animation:slide 42s linear infinite}
.ticker:hover .ticker-in{animation-play-state:paused}
.ticker b{font-family:var(--label);font-weight:600;font-size:11px;letter-spacing:.28em;text-transform:uppercase;color:var(--dim)}
.ticker b i{color:var(--gold);font-style:normal;margin-right:12px}
@keyframes slide{from{transform:translateX(0)}to{transform:translateX(-50%)}}

/* ─────────────  SECTIONS  ───────────── */
section{padding:clamp(40px,5vw,76px) 0}
.reveal{opacity:0;transform:translateY(34px);transition:opacity 1s var(--ease),transform 1s var(--ease)}
.reveal.in{opacity:1;transform:none}
.reveal.s1{transition-delay:.1s}.reveal.s2{transition-delay:.2s}.reveal.s3{transition-delay:.3s}.reveal.s4{transition-delay:.4s}

/* STORY */
.story{display:grid;grid-template-columns:1fr .85fr;gap:clamp(40px,6vw,96px);align-items:start}
.story .drop::first-letter{
  font-family:var(--display);font-size:4.4em;line-height:.78;float:left;
  margin:.1em .12em 0 0;color:var(--ember);font-weight:400;
}
.story p+p{margin-top:1.3em}
.pull{
  border-left:2px solid var(--wine);padding:8px 0 8px 30px;margin-top:44px;
  font-family:var(--display);font-style:italic;font-weight:400;
  font-size:clamp(21px,2.5vw,31px);line-height:1.32;color:var(--cream);
}
.pull cite{
  display:block;font-family:var(--label);font-style:normal;font-weight:600;font-size:11px;
  letter-spacing:.26em;text-transform:uppercase;color:var(--gold);margin-top:20px;
}
.facts{border-top:1px solid var(--line)}
.fact{display:flex;justify-content:space-between;gap:20px;align-items:baseline;padding:20px 0;border-bottom:1px solid var(--line)}
.fact dt{font-family:var(--label);font-weight:600;font-size:10.5px;letter-spacing:.24em;text-transform:uppercase;color:var(--dim)}
.fact dd{font-family:var(--display);font-size:clamp(20px,2vw,27px);text-align:right}
.fact dd em{font-style:italic;color:var(--ember)}

/* WINES — real bottle photography, his own shots off the shop */
.bottles{display:grid;grid-template-columns:repeat(4,1fr);gap:clamp(16px,2.2vw,34px)}
.btl{display:block;text-decoration:none;color:inherit;text-align:center}
.btl .shot{
  display:block;overflow:hidden;background:transparent;
  border:0;position:relative;
}
.btl .shot img{
  width:100%;height:auto;display:block;
  transition:transform .8s var(--ease),filter .6s var(--ease);
  filter:saturate(.94);
}
.btl:hover .shot img{transform:scale(1.045);filter:saturate(1.06)}
.btl h3{
  font-family:var(--display);font-weight:400;font-size:clamp(21px,2.1vw,29px);
  line-height:1.15;margin:20px 0 0;transition:color .4s var(--ease);
}
.btl:hover h3{color:var(--gold)}
.btl .vin{
  display:block;margin-top:7px;
  font-family:var(--label);font-weight:500;font-size:12px;letter-spacing:.2em;text-transform:uppercase;color:var(--dim);
}
.btl .cred{
  display:block;margin-top:12px;color:var(--gold);opacity:.86;
  font-size:.86em;line-height:1.45;font-style:italic;
}
.wines-foot{display:flex;flex-wrap:wrap;gap:14px;justify-content:center;margin-top:clamp(44px,5vw,72px)}

/* AWARDS — the credential section */
.awards{position:relative;overflow:hidden;border-top:1px solid var(--line);border-bottom:1px solid var(--line)}
.awards::before{
  content:"";position:absolute;inset:0;
  background:url("/img/hero-vines.jpg") center/cover no-repeat;
  opacity:.20;filter:saturate(.8);
}
.awards::after{
  content:"";position:absolute;inset:0;
  background:radial-gradient(88% 74% at 50% 40%, rgba(10,9,9,.62) 0%, rgba(8,7,7,.90) 100%);
}
.awards .wrap{position:relative;z-index:2}

.tally{
  display:grid;grid-template-columns:repeat(4,1fr);gap:1px;
  background:var(--line);border:1px solid var(--line);
}
.tally div{background:rgba(10,9,9,.72);padding:clamp(24px,3vw,40px) 16px;text-align:center}
.tally dt{
  font-family:var(--label);font-weight:600;font-size:11.5px;letter-spacing:.24em;text-transform:uppercase;color:var(--dim);
}
.tally dd{
  font-family:var(--brand);font-weight:400;font-size:clamp(38px,5.2vw,72px);line-height:1;
  margin-top:14px;color:var(--gold);
}

.perfect{
  margin-top:clamp(34px,4vw,56px);padding:clamp(30px,4vw,56px);
  border:1px solid var(--gold);background:rgba(10,9,9,.6);text-align:center;
}
.perfect .score{
  font-family:var(--brand);font-weight:400;font-size:clamp(74px,12vw,180px);line-height:.9;
  color:var(--gold);margin-top:16px;letter-spacing:-.02em;
}
.perfect .score i{
  display:block;font-style:normal;font-family:var(--label);font-weight:600;
  font-size:13px;letter-spacing:.34em;text-transform:uppercase;color:var(--cream);opacity:.8;margin-top:14px;
}
.perfect .what{margin-top:22px;color:var(--cream);opacity:.9;max-width:44ch;margin-left:auto;margin-right:auto}

.honours{
  list-style:none;margin-top:clamp(34px,4vw,56px);
  display:grid;grid-template-columns:repeat(auto-fit,minmax(320px,1fr));gap:0 clamp(30px,4vw,64px);
}
.honours li{
  display:flex;flex-direction:column;gap:5px;
  padding:17px 0;border-bottom:1px solid var(--line);
}
.honours b{font-family:var(--display);font-weight:400;font-size:clamp(19px,1.9vw,25px);color:var(--cream)}
.honours span{
  font-family:var(--label);font-size:12.5px;letter-spacing:.11em;color:var(--dim);
}
.asof{
  margin-top:30px;text-align:center;color:var(--dim);opacity:.65;
  font-family:var(--label);font-size:12px;letter-spacing:.2em;text-transform:uppercase;
}

/* THE WINE MOB */
.mob{background:var(--ink-2);border-top:1px solid var(--line);border-bottom:1px solid var(--line);position:relative}
.mob::before{
  content:"";position:absolute;inset:0;pointer-events:none;
  background:radial-gradient(85% 62% at 50% 0%, rgba(92,21,38,.5) 0%, rgba(18,16,14,0) 68%);
}
.mob .wrap{position:relative}
.mob-head{text-align:center;max-width:760px;margin:0 auto clamp(44px,5vw,76px)}
.mob-head .lede{margin-left:auto;margin-right:auto}
/* On the homepage these sit over his footage, so they run as one low band along
   the bottom rather than a two by two grid filling the frame and landing square
   on his face. Everywhere else they stay the grid they were. */
.tiers{display:grid;grid-template-columns:repeat(auto-fit,minmax(238px,1fr));gap:18px}
.mob .tiers{
  display:flex;gap:16px;align-items:stretch;
  /* Centred when the cards fit, which is the usual case on a laptop, and the
     "safe" keyword falls back to flex-start when they overflow, so nothing gets
     stranded off the left edge where it cannot be scrolled back to. */
  justify-content:center;
  justify-content:safe center;
  overflow-x:auto;overscroll-behavior-x:contain;
  scroll-snap-type:x mandatory;scroll-behavior:smooth;
  scrollbar-width:none;-ms-overflow-style:none;
  padding:4px 2px 10px;
  /* The cards live below the film band now, so they no longer need to be pushed
     down past his face; that push was leaving a long empty stripe between the
     two. */
  margin-top:0;
}
.mob .tiers::-webkit-scrollbar{display:none}
.mob .tier{
  flex:0 0 clamp(228px,24vw,272px);
  scroll-snap-align:center;
  padding:clamp(18px,1.7vw,24px);
  backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);
}
.mob .tier h3{font-size:clamp(19px,2vw,24px)}
.mob .tier .price{font-size:clamp(26px,2.7vw,34px)}
.mob .tier .per{font-size:10px}
.mob .tier p{font-size:.88em;line-height:1.5}
/* The cards were running past the foot of the section and getting clipped. */
.mob{padding-bottom:clamp(40px,5vw,72px)}

.tier{
  background:var(--ink);border:1px solid var(--line);padding:clamp(26px,2.6vw,38px);
  display:flex;flex-direction:column;position:relative;transition:border-color .5s var(--ease),transform .5s var(--ease);
}
.tier:hover{border-color:var(--line-2)}
.tier.feat{border-color:var(--gold)}
.tier .flag{
  position:absolute;top:-1px;right:-1px;background:var(--gold);color:var(--ink);
  font-family:var(--label);font-weight:700;font-size:9px;letter-spacing:.2em;text-transform:uppercase;padding:7px 13px;
}
/* Every card reserves the same band at the top, whether it carries a badge or
   not, so all four stay the same shape and sit on the same line. Nudging only
   the featured card down made it the odd one out; padding the heading instead
   pushed "Inner Circle" onto two lines. Uniform space solves both. */
.tier{padding-top:calc(clamp(26px,2.6vw,38px) + 16px)}
.mob .tier{padding-top:calc(clamp(18px,1.7vw,24px) + 14px)}
.tier .flag{top:0;right:0;border-radius:0 0 0 2px}
.mob .tier .flag{font-size:8.5px;padding:5px 10px;letter-spacing:.16em}
.tier h3{font-family:var(--display);font-weight:400;font-size:clamp(26px,2.5vw,34px);line-height:1;letter-spacing:.01em}
.tier .qty{font-family:var(--label);font-weight:600;font-size:10.5px;letter-spacing:.2em;text-transform:uppercase;color:var(--gold);margin-top:14px}
.tier .price{font-family:var(--display);font-size:clamp(34px,3.6vw,46px);line-height:1;margin:24px 0 4px}
.tier .per{font-family:var(--label);font-size:10.5px;letter-spacing:.2em;text-transform:uppercase;color:var(--dim)}
.tier p{color:var(--dim);font-size:.93em;margin-top:20px;flex:1;padding-top:20px;border-top:1px solid var(--line)}

.perks{margin-top:clamp(44px,5vw,72px);border-top:1px solid var(--line);padding-top:clamp(34px,4vw,52px)}
.perks h4{font-family:var(--label);font-weight:600;font-size:11px;letter-spacing:.3em;text-transform:uppercase;color:var(--gold);margin-bottom:30px}
.perk-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(248px,1fr));gap:14px 40px;list-style:none}
.perk-grid li{padding-left:26px;position:relative;color:var(--dim);font-size:.96em;line-height:1.6}
.perk-grid li::before{content:"";position:absolute;left:0;top:.62em;width:11px;height:1px;background:var(--ember)}
.perk-grid li b{color:var(--cream);font-weight:400}
.mob-cta{text-align:center;margin-top:clamp(40px,4.6vw,64px)}

/* VISIT */
.rooms{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:1px;background:var(--line);border:1px solid var(--line)}
@media(max-width:980px){.rooms{grid-template-columns:1fr}}
.room{background:var(--ink);padding:clamp(32px,4vw,60px);display:flex;flex-direction:column}
.room .n{font-family:var(--label);font-weight:600;font-size:10.5px;letter-spacing:.26em;text-transform:uppercase;color:var(--gold)}
.room h3{font-family:var(--display);font-weight:400;font-size:clamp(32px,4vw,52px);line-height:1;margin:18px 0 10px}
.room .addr{color:var(--dim);font-size:.97em}
.room .addr a{color:var(--dim);text-decoration:none;border-bottom:1px solid var(--line-2);transition:color .3s var(--ease)}
.room .addr a:hover{color:var(--gold)}
.room .note{margin-top:22px;font-family:var(--display);font-style:italic;font-size:1.12em;color:var(--cream);opacity:.9}
.hours{margin-top:30px;border-top:1px solid var(--line);flex:1}
.hours div{display:flex;justify-content:space-between;gap:18px;padding:12px 0;border-bottom:1px solid var(--line);font-size:.93em}
.hours dt{font-family:var(--label);font-weight:500;font-size:10.5px;letter-spacing:.18em;text-transform:uppercase;color:var(--dim)}
.hours dd{font-variant-numeric:tabular-nums}
.hours .shut dd{color:var(--dim);font-style:italic}
.room .btn{margin-top:32px;align-self:flex-start}

/* PRIVATE */
.private{position:relative;overflow:hidden;background:var(--wine)}
.private::before{
  content:"";position:absolute;inset:0;
  background:radial-gradient(96% 130% at 82% 12%, rgba(217,164,65,.34) 0%, rgba(92,21,38,0) 62%);
}
.private .wrap{position:relative;text-align:center}
.private h2{font-family:var(--display);font-weight:400;font-size:clamp(34px,5.2vw,70px);line-height:1.04;margin-top:18px}
.private h2 em{font-style:italic;color:var(--gold)}
.private .lede{margin:24px auto 0;color:rgba(242,234,217,.82)}
.private .btn{margin-top:38px;border-color:rgba(242,234,217,.42)}

/* FOOTER */
footer{padding:clamp(72px,9vw,120px) 0 44px;border-top:1px solid var(--line);background:var(--black)}
.f-top{display:grid;grid-template-columns:1.5fr 1fr 1fr;gap:clamp(32px,5vw,72px);padding-bottom:clamp(48px,5vw,72px)}
.f-mark{font-family:var(--brand);font-weight:400;font-size:clamp(30px,3.6vw,46px);line-height:1;letter-spacing:.06em;text-transform:uppercase}
.f-mark span{color:var(--ember)}
.f-sig{font-family:var(--display);font-style:italic;color:var(--ember);font-size:1.2em;margin-top:12px}
.f-col h4{font-family:var(--label);font-weight:600;font-size:10.5px;letter-spacing:.28em;text-transform:uppercase;color:var(--gold);margin-bottom:22px}
.f-col a,.f-col p{display:block;color:var(--dim);text-decoration:none;font-size:.95em;padding:6px 0;transition:color .3s var(--ease)}
.f-col a:hover{color:var(--cream)}
.f-bot{padding-top:34px;border-top:1px solid var(--line);display:flex;flex-wrap:wrap;gap:20px;justify-content:space-between;align-items:flex-start}
.f-bot p,.f-bot a{font-family:var(--label);font-size:10.5px;letter-spacing:.1em;color:#5F5648;text-decoration:none;line-height:1.8}
.f-bot a:hover{color:var(--dim)}
.p65{max-width:62ch}
.p65 b{color:var(--dim);font-weight:700}

/* ─────────────  RESPONSIVE  ───────────── */
@media(max-width:1000px){
  .story{grid-template-columns:1fr}
  .rooms{grid-template-columns:1fr}
  .f-top{grid-template-columns:1fr 1fr}
  .f-brand{grid-column:1/-1}
  .bottles{grid-template-columns:repeat(2,1fr)}
  .tally{grid-template-columns:repeat(2,1fr)}
}
@media(max-width:820px){
  .burger{display:block;order:3}
  /* Same see-through treatment as the desktop panel. This block used to reset
     the background to near-solid, which quietly undid it below 820px. */
  nav.main{
    position:fixed;inset:0;background:transparent;
    backdrop-filter:blur(3px);
    -webkit-backdrop-filter:blur(3px);
    /* Must repeat the scroll and clearance rules from the base declaration.
       This block previously reset justify-content to center and carried no
       padding, which quietly undid both below 820px: the first items slid under
       the announcement bar and the last four could not be reached. */
    flex-direction:column;justify-content:flex-start;gap:8px;
    overflow-y:auto;overscroll-behavior:contain;
    padding:calc(var(--ann) + 54px) 18px 44px;
    opacity:0;visibility:hidden;transition:opacity .45s var(--ease),visibility .45s;
  }
  nav.main.open{opacity:1;visibility:visible}
  nav.main a{font-family:var(--display);font-size:31px;letter-spacing:.02em;text-transform:none;color:var(--cream);padding:11px 0}
  nav.main a::after{display:none}
  .acct{order:2;margin-left:auto;margin-right:6px}
  header .hrow{gap:12px}
  .hero-in{padding-top:120px}
  .f-top{grid-template-columns:1fr;gap:38px}
  .f-brand{grid-column:auto}
}
@media(max-width:520px){
  .acct .desk{display:none}
  h1{font-size:clamp(46px,15vw,84px)}
  .fact{flex-direction:column;gap:4px}
  .fact dd{text-align:left}
}

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


/* ─────────────  PAGE HERO  ─────────────
   Charles Krug pattern: the photograph fills the whole viewport and the title
   sits centred near the bottom, kicker above it, thin gold rule beneath. */
.phero{
  position:relative;overflow:hidden;
  min-height:100svh;
  display:flex;align-items:flex-end;justify-content:center;
  padding:calc(var(--ann) + 140px) 0 clamp(74px,10vh,120px);
  text-align:center;
}
.phero-bg{position:absolute;inset:0;z-index:0}
.phero-bg::before{
  content:"";position:absolute;inset:-4%;
  /* --pos carries the whole position. The literal `center` in front of it
     meant any two-value --pos, like `center 18%`, expanded to three
     position values, which is invalid, so the browser threw the entire
     background away and the hero came out grey. */
  background:var(--shot) var(--pos,center)/cover no-repeat;
  animation:drift 60s ease-in-out infinite alternate;
}
.phero-bg::after{
  content:"";position:absolute;inset:0;
  background:
    /* Optional mid-band, off unless a page asks for it. The radial below leaves
       the centre of the frame clear, which is right over a dark hero and wrong
       over a bright one: the dance footage is a sunlit ballroom, and the lede
       was sitting on the brightest part of the floor with nothing behind it.
       Pages that need it set --scrim-lo; the rest are untouched. */
    linear-gradient(to bottom,
      rgba(4,4,5,0)                  22%,
      rgba(4,4,5,var(--scrim-lo,0))  44%,
      rgba(4,4,5,var(--scrim-lo,0))  90%,
      rgba(4,4,5,0)                 100%),
    radial-gradient(96% 82% at 50% 42%, transparent 0%, transparent 48%, rgba(6,6,7,.24) 74%, rgba(3,3,4,.74) 100%),
    linear-gradient(to bottom, rgba(6,6,7,.62) 0%, rgba(6,6,7,.10) 26%, rgba(4,4,5,.46) 66%, rgba(2,2,3,.92) 100%);
}
.phero-in{position:relative;z-index:2;text-shadow:0 2px 24px rgba(4,3,3,.9)}
.phero .label{color:var(--cream);opacity:.82;font-size:12px;letter-spacing:.42em}
.phero h1{
  font-family:var(--display);font-weight:400;
  font-size:clamp(46px,9.4vw,128px);line-height:1.04;letter-spacing:0;
  margin-top:16px;text-transform:uppercase;color:#fff;
}
.phero h1 em{font-style:normal;color:var(--gold)}
.phero-lede{margin:22px auto 0;max-width:50ch;color:#F4ECDE;
  /* Was 0.86 opacity on top of the scrim, over moving footage, which is why it
     kept reading as unreadable no matter how much the scrim was strengthened.
     Full opacity, a size that holds, and its own shadow. */
  font-size:clamp(16px,1.25vw,19px);line-height:1.6;
  text-shadow:0 1px 10px rgba(0,0,0,.85), 0 0 22px rgba(0,0,0,.55);
}
/* The eyebrow above every hero headline. 13px of 0.28em tracking on film is
   decoration, not text; this is the size it needed to be to actually be read. */
.phero .label,.mhero .label{
  font-size:clamp(14px,1.15vw,16px);letter-spacing:.30em;color:#EBD3A6;
  text-shadow:0 1px 10px rgba(0,0,0,.9), 0 0 20px rgba(0,0,0,.6);
}
/* the thin gold scroll rule under the title */
/* Not on the medal hero: its text block sits directly above the bottle
   carousel, so the lengthened rule drew itself down over the bottle's neck and
   its added height pushed the whole carousel toward the dock. */
.phero-in::after,
.hero-in::after{
  content:"";display:block;width:2px;height:clamp(72px,12vh,140px);margin:clamp(26px,4vh,46px) auto 0;
  background:linear-gradient(to bottom,var(--gold-lo),transparent);
}

/* ─────────────  LIGHT SECTIONS  ─────────────
   Krug alternates black and cream down every page. Redefining the SAME tokens
   inside .light inverts every component for free, because the whole stylesheet
   was written against var(--ink)/var(--cream)/var(--line) rather than literals. */
/* .dark is now the backfill, used for bands and anything sitting over photography.
   Same token-inversion trick, just the other direction. */
.dark{
  --ink:var(--black);
  --ink-2:var(--black-2);
  --ink-3:#1D1B1A;
  --cream:#F2EAD9;          /* text flips light */
  --dim:#9C8E7C;
  --gold:var(--gold-lo);
  --ember:#C2703A;
  --line:rgba(242,234,217,.15);
  --line-2:rgba(242,234,217,.30);
  background:var(--black);
  color:#F2EAD9;
}
.dark .btn{color:var(--cream);border-color:var(--line-2)}
.dark .btn::before{background:var(--cream)}
.dark .btn:hover{color:var(--black)}
.dark .btn.solid{background:var(--wine);border-color:var(--wine);color:var(--cream)}
.dark .vtable tr:hover td{background:rgba(242,234,217,.05)}
.dark .tally div{background:rgba(12,11,11,.6)}
.dark .perfect{background:rgba(12,11,11,.5)}
.dark .wine{background:var(--black-2)}

/* Panel tuning. Every ground is dark, so these carry the dark value outright.
   They used to hold a cream-ground tuning, and 55% white over black rendered
   as muddy grey. .tier and .room are sealed further down with their own
   palettes, so they are deliberately not restated here. */
.tally div{background:rgba(12,11,11,.6)}
.perfect{background:rgba(12,11,11,.5)}

/* ── the dance band on the events page ───────────────────────────────────────
   A full-bleed strip of the ballroom footage under a short line. Colours are
   stated outright rather than drawn from the tokens: this sits between a cream
   section and a dark one, and --cream resolves to the ink value in half the
   places it lands, which is what painted the cellar headings black on black. */
.danceband{
  position:relative;overflow:hidden;
  min-height:clamp(340px,46vh,520px);
  display:flex;align-items:center;justify-content:center;text-align:center;
  background:#0B0A0A;
}
.danceband-vid{
  position:absolute;inset:0;width:100%;height:100%;object-fit:cover;z-index:0;
}
.danceband-scrim{
  position:absolute;inset:0;z-index:1;pointer-events:none;
  background:
    radial-gradient(78% 70% at 50% 50%, rgba(6,6,7,.22) 0%, rgba(4,4,5,.72) 100%),
    linear-gradient(to bottom, rgba(6,6,7,.55) 0%, rgba(6,6,7,.18) 40%, rgba(4,4,5,.78) 100%);
}
.danceband-in{position:relative;z-index:2;text-shadow:0 2px 22px rgba(4,3,3,.9)}
.danceband-in .label{color:#D4B68E;font-size:12px;letter-spacing:.42em}
.danceband-in h2{
  margin-top:14px;color:#F6EFE2;
  font-family:var(--display);font-weight:400;
  font-size:clamp(34px,5.4vw,68px);line-height:1.06;
}
.danceband-in h2 em{color:#E2C47A;font-style:italic}
@media (prefers-reduced-motion: reduce){ .danceband-vid{display:none} }

/* ── the cellar categories ───────────────────────────────────────────────────
   These carried a background colour and nothing else, so they rendered as raw
   anchors: browser underlines, and the "Shop" spans reading as white boxes on
   the dark ground. Four of the six categories are reachable from nowhere else
   on the site, so the section earns its place; it just needed to be drawn.

   Same idiom as the membership tiers: a bordered card that grows very slightly
   under the cursor, the name in the display face, the action in gold. */
.wines{display:grid;gap:clamp(10px,1.4vw,18px);grid-template-columns:repeat(4,1fr);margin-top:clamp(30px,4vw,54px)}
@media(max-width:1100px){.wines{grid-template-columns:repeat(2,1fr)}}
@media(max-width:560px){.wines{grid-template-columns:1fr}}
/* six cards (the wines index) ride the same tiers: 3 wide, 2, then 1 */
.wines.six{grid-template-columns:repeat(3,1fr)}
@media(max-width:1100px){.wines.six{grid-template-columns:repeat(2,1fr)}}
@media(max-width:560px){.wines.six{grid-template-columns:1fr}}
.wine{
  display:flex;flex-direction:column;gap:8px;
  padding:clamp(20px,2.2vw,30px);
  background:rgba(242,234,217,.045);
  border:1px solid rgba(242,234,217,.16);border-radius:3px;
  /* Stated outright, not taken from the tokens. This block sits inside .mob,
     where --cream resolves to the cream page's ink, #1A1512, on a ground of
     rgb(20,16,14). Drawing the headings from the token painted them black on
     black, which is most of why the section looked broken. */
  text-decoration:none;color:#F2EAD9;
  transition:transform .35s var(--ease),border-color .35s var(--ease),background .35s var(--ease);
}
.wine:hover,.wine:focus-visible{
  transform:scale(1.03);border-color:var(--gold-lo);background:rgba(242,234,217,.075);
}
.wine h3{
  margin:0;font-family:var(--display);font-weight:400;
  font-size:clamp(21px,1.9vw,27px);line-height:1.2;color:#F2EAD9;
}
.wine p{margin:0;color:#C6BCAE;font-size:.95em;line-height:1.5}
.wine .go{
  margin-top:auto;padding-top:10px;
  font-family:var(--label);font-weight:600;font-size:11px;
  letter-spacing:.24em;text-transform:uppercase;color:var(--gold-lo);
}
.wine:hover .go{color:#F6E9CE}
.wine .go .arw{display:inline-block;transition:transform .3s var(--ease)}
.wine:hover .go .arw{transform:translateX(5px)}
.btn.solid{color:var(--paper)}
.btn.solid::before{background:var(--paper)}
.btn.solid:hover{color:#1A1512}

/* interior pages have no giant hero logo, so the header mark shows immediately */
body:not(.home) #hdr .hmark img{opacity:1}

/* On the home hero his mark is already large in the middle of the frame, so the
   small one in the bar would set the name twice. It is only hidden while the
   hero still fills the screen: scroll off it, or land on any other page, and
   the bar carries the mark as usual. */
#hdr .hmark img{transition:opacity .45s var(--ease)}
body.home.at-top #hdr .hmark img{opacity:0}
body.home.at-top #hdr .hmark{pointer-events:none}
nav.main a[aria-current="page"]{color:var(--gold)}

/* ─────────────  AWARDS TABLES  ───────────── */
.vgroup{margin-bottom:clamp(40px,5vw,72px)}
.vhead{display:flex;flex-wrap:wrap;align-items:baseline;gap:12px 22px;padding-bottom:14px;border-bottom:1px solid var(--line-2)}
.vhead h2{font-family:var(--display);font-weight:400;font-size:clamp(26px,3vw,40px);line-height:1}
.vmeta{font-family:var(--label);font-size:clamp(14px,1.1vw,16px);letter-spacing:.09em;color:#6A6055}

/* Seven of the twenty-three awarded varietals still have somewhere to buy them.
   Those names are links; the rest stay as plain headings rather than becoming
   dead ends at the moment someone is most impressed by the record. */
.vbuy{color:inherit;text-decoration:none;display:inline-flex;align-items:baseline;gap:.4em}
.vbuy:hover,.vbuy:focus-visible{color:var(--gold-hi)}
.vbuy-go{font-size:.6em;opacity:0;transform:translateX(-6px);
  transition:opacity .3s var(--ease),transform .3s var(--ease)}
.vbuy:hover .vbuy-go,.vbuy:focus-visible .vbuy-go{opacity:1;transform:none}
.vmeta b{color:var(--gold);font-weight:600}

/* ── the record, folded ──────────────────────────────────────────────────────
   Twenty-three varietals with every row showing came to two hundred and five
   lines, which buries the thing worth seeing: that he has been winning with the
   same grapes for fifteen years straight. The years ride up into the header as
   a strip, so the run reads at a glance, and the full table stays one click
   away rather than gone. */
.vyears{
  flex-basis:100%;display:flex;flex-wrap:wrap;align-items:center;gap:6px;
  margin-top:4px;font-family:var(--label);font-size:11px;letter-spacing:.14em;
}
.vyears-span{color:var(--dim);letter-spacing:.18em;text-transform:uppercase;margin-right:6px}
.vyears i{
  font-style:normal;padding:3px 7px;border-radius:2px;
  border:1px solid var(--line-2);
  /* Not var(--gold): on cream that lands at 4.57:1, which clears AA by two
     hundredths and would fail on any future tint of the page background. This
     is the same hue carried darker, at 5.9:1. */
  color:#7A5F3A;
  font-variant-numeric:tabular-nums;
}
.dark .vyears i{color:var(--gold-lo)}
.vfold summary{
  display:flex;align-items:center;gap:9px;cursor:pointer;list-style:none;
  padding:13px 0;color:var(--dim);
  font-family:var(--label);font-size:11.5px;letter-spacing:.22em;text-transform:uppercase;
  transition:color .3s var(--ease);
}
.vfold summary::-webkit-details-marker{display:none}
.vfold summary::after{
  content:"";width:7px;height:7px;flex:none;
  border-right:1.4px solid currentColor;border-bottom:1.4px solid currentColor;
  transform:rotate(45deg) translate(-2px,-2px);
  transition:transform .35s var(--ease);
}
.vfold[open] summary::after{transform:rotate(225deg) translate(-2px,-2px)}
.vfold summary:hover,.vfold summary:focus-visible{color:var(--gold)}
.vfold summary:focus-visible{outline:2px solid var(--gold);outline-offset:3px}
.vfold[open] summary{border-bottom:1px solid var(--line)}

.vtable{width:100%;border-collapse:collapse;font-size:.94em}
.vtable th{
  text-align:left;padding:14px 14px 12px 0;border-bottom:1px solid var(--line);
  font-family:var(--label);font-weight:600;font-size:11.5px;letter-spacing:.22em;
  text-transform:uppercase;color:var(--dim);white-space:nowrap;
}
.vtable td{padding:12px 14px 12px 0;border-bottom:1px solid var(--line);vertical-align:top}
.vtable tr:hover td{background:rgba(242,234,217,.035)}
.vtable .med{color:var(--gold)}
.vtable .yr{font-variant-numeric:tabular-nums;color:var(--dim);white-space:nowrap}
.vtable .cmp{color:var(--dim)}
@media(max-width:700px){
  .vtable thead{display:none}
  .vtable tr{display:grid;grid-template-columns:1fr auto;gap:2px 14px;padding:14px 0;border-bottom:1px solid var(--line)}
  .vtable td{border:0;padding:0}
  .vtable .cmp{grid-column:1/-1;font-size:.9em}
}

/* Anchor jumps must clear the announcement bar and the fixed header. */
:target,[id]{scroll-margin-top:calc(var(--ann) + 96px)}

/* closing CTA band, Krug's footer-cta pattern */
.cta-band{text-align:center;max-width:760px;margin:0 auto}
.cta-band h2{
  font-family:var(--display);font-weight:400;
  font-size:clamp(34px,5vw,68px);line-height:1.05;margin-top:16px;
}
.cta-band h2 em{font-style:normal;color:var(--gold)}
.cta-band .lede{margin:20px auto 0}

/* Krug product treatment: cut-out bottle floating on cream, name in Radley,
   deep-gold detail line. No card, no border, no shadow. */
.bottles{align-items:end}
.btl .shot img{filter:none;mix-blend-mode:multiply}
.dark .btl .shot img{mix-blend-mode:normal}
.btl h3{font-size:clamp(20px,2vw,27px);letter-spacing:.01em}
.btl .vin{font-size:11.5px;letter-spacing:.22em}
.btl .cred{color:var(--gold);font-style:normal;font-size:.84em;letter-spacing:.02em}

/* A page hero always sits over a photograph, so it always needs the dark token
   set no matter what theme the sections around it are using. Without this the
   hero lede inherits --cream from the cream default and renders dark-on-dark. */
.phero{
  --ink:var(--black);
  --cream:#F2EAD9;
  --dim:#CBC0B2;
  --gold:var(--gold-lo);
  --ember:#C2703A;
  --line:rgba(242,234,217,.15);
  --line-2:rgba(242,234,217,.30);
  color:#F2EAD9;
}
.phero .label{color:var(--gold-lo);opacity:.95}
.phero-lede{color:#F2EAD9;opacity:.9}

/* ─────────────  PRODUCT CARD (Charles Krug proportions)  ─────────────
   The whole bottle, small, with real air around it. Their bottles occupy
   roughly a third of the card height; filling the frame is what made ours
   read as cropped snapshots rather than product shots. */
.bottles{grid-template-columns:repeat(4,1fr);gap:clamp(18px,2.4vw,40px);align-items:start}
.btl{text-align:center;display:flex;flex-direction:column;align-items:center;background:none}
.btl .shot{
  display:flex;align-items:flex-end;justify-content:center;
  height:clamp(230px,24vw,340px);width:100%;
  background:none;border:0;padding:0 12px;
}
.btl .shot img{
  max-height:100%;width:auto;max-width:100%;object-fit:contain;
  mix-blend-mode:normal;filter:none;
  transition:transform .6s var(--ease);
}
.btl:hover .shot img{transform:translateY(-6px) scale(1.02)}
.btl h3{margin-top:22px}
.btl h3 a{text-decoration:none}
.btl .price{
  display:block;margin-top:10px;color:var(--gold-hi);
  font-family:var(--body);font-weight:400;font-size:1.18em;letter-spacing:.02em;
}
.btl .cart{
  display:inline-block;margin-top:16px;padding:13px 30px;
  background:var(--gold-hi);color:#fff;text-decoration:none;
  font-family:var(--label);font-weight:600;font-size:11.5px;letter-spacing:.16em;text-transform:uppercase;
  transition:background .35s var(--ease);
}
.btl .cart:hover{background:#7A5F3C}
.btl .details{
  display:block;margin-top:14px;color:var(--gold-hi);text-decoration:none;
  font-family:var(--label);font-weight:600;font-size:11px;letter-spacing:.18em;text-transform:uppercase;
}
.btl .details:hover{text-decoration:underline}
.btl .cred{margin-top:16px;font-size:.8em;color:var(--dim);max-width:26ch}
.dark .btl .cart{background:var(--gold-lo);color:#1A1512}
.dark .btl .price,.dark .btl .details{color:var(--gold-lo)}
@media(max-width:900px){.bottles{grid-template-columns:repeat(2,1fr)}}

/* Bottles were sitting too small inside wide cards. Taller frame, and the
   column count steps down sooner so a card never gets much wider than its bottle. */
.btl .shot{height:clamp(300px,32vw,470px);padding:0 8px}
.bottles{grid-template-columns:repeat(4,1fr)}
@media(max-width:1240px){.bottles{grid-template-columns:repeat(3,1fr)}}
@media(max-width:820px){.bottles{grid-template-columns:repeat(2,1fr)}}
@media(max-width:460px){.bottles{grid-template-columns:1fr}.btl .shot{height:340px}}

/* ─────────────  COVERFLOW CAROUSEL  ─────────────
   Krug pattern: the active bottle is large and lit, the flanks sit back,
   smaller, dimmed and defocused. Position is driven by --off (distance from the
   active index) set in JS, so every transform is one CSS rule rather than N. */
.cf{position:relative;margin-top:clamp(24px,3vw,44px)}
.cf-stage{
  /* Taller stage, so the bottles read at something like their real presence.
     The meta reservation below is a fixed band, so every pixel added here goes
     straight to the glass rather than to the caption. */
  position:relative;height:clamp(470px,52vw,690px);
  perspective:1400px;overflow:hidden;
}
/* The offerings block sat under a deep run of empty black. Pulled up so the
   bottles start close behind the heading. */
.offerings{padding-top:clamp(26px,3vw,44px)}
.offerings .cf{margin-top:clamp(10px,1.4vw,20px)}
.cf-item{
  position:absolute;top:0;left:50%;height:100%;
  display:flex;flex-direction:column;align-items:center;justify-content:flex-end;
  /* The offset has to be exactly half the width. It was min(-23vw,-170px), and
     min() of two negatives returns the more negative one, so past 740px wide the
     offset kept growing while the width stayed clamped at 340px: 106px too far
     left at 1200, 198px at 1600. Deriving it from the width cannot drift. */
  width:min(46vw,340px);margin-left:calc(min(46vw,340px) / -2);
  transition:transform .7s var(--ease),opacity .7s var(--ease),filter .7s var(--ease);
  cursor:pointer;
}
.cf-item img{
  /* The capsule used to be cut off. At a flat 78% the bottle plus the meta
     block below it came to more than the stage height, and because the column
     is bottom-aligned the excess ran off the top, where .cf-stage clipped it.
     Reserving the meta's height means the whole bottle, foil and all, is inside
     the stage, which also stops it colliding with "Our offerings" above. */
  height:auto;
  /* Reserve the meta block AND its 20px top margin. Measured at 149px + 20px,
     so 146 was three pixels short and still clipped the foil. */
  max-height:calc(100% - clamp(176px,20vw,216px));
  width:auto;max-width:100%;object-fit:contain;
  filter:drop-shadow(0 22px 34px rgba(0,0,0,.34));
}
/* off = 0 active, ±1 flank, ±2 further back, beyond that hidden */
.cf-item{
  transform:translateX(calc(var(--off) * 78%)) scale(calc(1 - min(abs(var(--off)),3) * .26));
  opacity:calc(1 - min(abs(var(--off)),3) * .42);
  filter:blur(calc(min(abs(var(--off)),3) * 2.4px));
  z-index:calc(10 - min(abs(var(--off)),3));
}
.cf-item[data-off="0"]{cursor:default}
.cf-item[aria-hidden="true"]{opacity:0;pointer-events:none;visibility:hidden}
/* visibility, not just opacity. Transparent elements stay focusable, so a
   keyboard user was getting eight tab stops on the wines page where only one
   was visible, and three of those were also marked hidden from screen readers,
   which meant landing on a control the software says does not exist. */
.cf-meta{margin-top:20px;text-align:center;opacity:0;visibility:hidden;
  transition:opacity .5s var(--ease) .15s,visibility 0s .65s}
.cf-item[data-off="0"] .cf-meta{opacity:1;visibility:visible;
  transition:opacity .5s var(--ease) .15s,visibility 0s}
.cf-meta h3{font-family:var(--display);font-weight:400;font-size:clamp(22px,2.4vw,32px);line-height:1.1}
.cf-meta .vin{display:block;margin-top:6px;font-family:var(--label);font-size:11px;letter-spacing:.22em;text-transform:uppercase;color:var(--dim)}
.cf-meta .price{display:block;margin-top:10px;color:var(--gold);font-size:1.1em}
.cf-meta .cart{
  display:inline-block;margin-top:14px;padding:13px 34px;background:var(--gold);color:#1A1512;
  border-radius:3px;
  box-shadow:0 1px 2px rgba(60,44,18,.22), 0 8px 20px -10px rgba(60,44,18,.45);
  text-decoration:none;font-family:var(--label);font-weight:600;font-size:11px;
  letter-spacing:.2em;text-transform:uppercase;
  transition:transform .35s var(--ease),box-shadow .35s var(--ease),background .35s var(--ease);
}
.cf-meta .cart:hover{transform:translateY(-1px);box-shadow:0 2px 5px rgba(60,44,18,.26), 0 14px 28px -12px rgba(60,44,18,.5)}
.cf-meta .cart:active{transform:translateY(0)}
.cf-nav{
  position:absolute;top:42%;z-index:20;width:46px;height:46px;
  background:none;border:1px solid var(--line-2);color:var(--cream);
  cursor:pointer;font-size:20px;line-height:1;
  transition:background .3s var(--ease),color .3s var(--ease),border-color .3s var(--ease);
}
.cf-nav:hover{background:var(--gold);color:#1A1512;border-color:var(--gold)}
.cf-nav.prev{left:0}
.cf-nav.next{right:0}
.cf-dots{display:flex;gap:9px;justify-content:center;margin-top:clamp(20px,2.6vw,34px)}
.cf-dots button{
  width:7px;height:7px;border-radius:50%;border:0;padding:0;cursor:pointer;
  background:var(--line-2);transition:background .3s var(--ease),transform .3s var(--ease);
}
.cf-dots button[aria-current="true"]{background:var(--gold);transform:scale(1.5)}
@media(max-width:640px){.cf-nav{display:none}}

/* ─────────────  MEDAL HERO (awards page)  ─────────────
   Cuvaison composition made from real data: every mark is an award he won,
   its full citation in the title attribute. */
.mhero{
  position:relative;overflow:hidden;min-height:100svh;
  /* A column, so the headline and the rotating caption stack instead of being
     laid over one another. */
  display:flex;flex-direction:column;align-items:center;justify-content:center;
  padding:calc(var(--ann) + clamp(84px,11vh,132px)) 0 clamp(52px,7vh,96px);
  text-align:center;
  --ink:var(--black);--cream:#F2EAD9;--dim:#CBC0B2;--gold:var(--gold-lo);
  --line:rgba(242,234,217,.15);--line-2:rgba(242,234,217,.3);color:#F2EAD9;
}
.mhero-bg{position:absolute;inset:0;z-index:0;background:#0A0A0B url("/img/awards-ground.jpg") center/cover no-repeat}
.mhero-bg::after{content:"";position:absolute;inset:0;
  background:radial-gradient(58% 50% at 50% 46%, rgba(8,8,9,.10) 0%, rgba(6,6,7,.62) 68%, rgba(4,4,5,.92) 100%)}
.mhero-bottle{position:absolute;left:50%;top:48%;transform:translate(-50%,-50%);
  height:min(58vh,520px);width:auto;z-index:3;
  filter:drop-shadow(0 30px 60px rgba(0,0,0,.75)) brightness(1.06)}
.mhero-scatter{position:absolute;inset:0;z-index:2;pointer-events:none}

/* ── the hero, rotating through his varietals ────────────────────────────────
   It used to hold one bottle, Grapefather, for ever, while twenty-two other
   wines with their own medals sat further down the page. Now the same frame
   cycles all of them, so the number at the top is backed by the wines that
   earned it. Cross-fade rather than slide: the medal field behind stays put,
   and only the bottle and its line change. */
/* In flow, not absolute. Floating it over the hero meant the headline and the
   slide caption occupied the same band and printed through one another. */
.mcar{
  position:relative;z-index:3;pointer-events:none;
  width:100%;height:clamp(520px,64vh,760px);
  margin-top:clamp(10px,2vh,26px);
}
.mslide{
  position:absolute;inset:0;margin:0;
  /* the browse dock overlays the foot of the hero; this keeps the bottle and
     its caption above it instead of half-buried behind the thumbnails */
  padding-bottom:clamp(150px,19vh,200px);
  display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:clamp(14px,2vw,26px);
  opacity:0;visibility:hidden;
  transition:opacity .9s var(--ease),visibility .9s,transform .9s var(--ease);
  transform:scale(.965);
}
.mslide.on{opacity:1;visibility:visible;transform:none}
.mslide img{
  /* Sized against the carousel box rather than the viewport, so the glass grows
     with the frame and the caption below it always has somewhere to sit. */
  /* one clearance, not two: the slide's own bottom padding already keeps the
     caption above the dock, so the image only reserves the caption's height */
  height:auto;max-height:calc(100% - 104px);width:auto;max-width:68%;
  filter:drop-shadow(0 30px 60px rgba(0,0,0,.78)) brightness(1.06);
}
.mslide figcaption{display:flex;flex-direction:column;align-items:center;gap:7px;text-align:center;padding:0 20px}
.ms-name{
  font-family:var(--display);font-weight:400;
  font-size:clamp(26px,3.4vw,46px);line-height:1;color:#F7F0E2;
  text-shadow:0 2px 18px rgba(0,0,0,.9);
}
/* These were 11.5px of tracked-out caps in a dim grey, floating on a dark plate
   full of moving medals. The record is the whole point of the page, so it is
   set to be read: larger, brighter, and carrying its own shadow. */
.ms-count{
  font-family:var(--label);font-size:clamp(13px,1.15vw,15px);
  letter-spacing:.16em;text-transform:uppercase;color:#E6DCCB;
  text-shadow:0 1px 10px rgba(0,0,0,.9);
}
.ms-count b{color:#F0DDB8;font-weight:600}
.ms-best{
  color:#E9D6AE;font-size:clamp(14px,1.25vw,17px);line-height:1.4;max-width:34ch;
  text-shadow:0 1px 12px rgba(0,0,0,.92);
}

/* ── every medal, behind one title ───────────────────────────────────────────
   Twenty-three varietals of medal lists used to sit open on the page. They are
   the record, not the pitch, so they fold away behind a single line you click. */
.medal-all{border-top:1px solid var(--line);padding-top:clamp(26px,3vw,40px)}
.medal-all > summary{
  list-style:none;cursor:pointer;text-align:center;
  display:flex;flex-direction:column;align-items:center;gap:10px;
}
.medal-all > summary::-webkit-details-marker{display:none}
.medal-title{
  font-family:var(--display);font-weight:400;
  /* One colour. The white-then-gold split across a heading is a tell. */
  font-size:clamp(38px,5.2vw,72px);line-height:1.05;color:var(--cream);
  transition:color .3s var(--ease);
}
.medal-all > summary:hover .medal-title,
.medal-all > summary:focus-visible .medal-title{color:var(--gold)}
.medal-title::after{
  content:"";display:block;width:34px;height:34px;margin:14px auto 0;
  border-right:1.5px solid var(--gold);border-bottom:1.5px solid var(--gold);
  transform:rotate(45deg) scale(.62);transform-origin:center;
  transition:transform .35s var(--ease);
}
.medal-all[open] > summary .medal-title::after{transform:rotate(225deg) scale(.62)}
.medal-sub{max-width:46ch;color:var(--dim);font-size:1.02em;line-height:1.55}
.medal-all .vgrid{margin-top:clamp(34px,4vw,58px)}

.mcar-btn{
  position:absolute;top:50%;transform:translateY(-50%);z-index:5;
  pointer-events:auto;width:46px;height:46px;
  background:rgba(10,8,7,.42);border:1px solid rgba(242,234,217,.30);border-radius:50%;
  color:#F2EAD9;font-size:22px;line-height:1;cursor:pointer;
  transition:background .3s var(--ease),border-color .3s var(--ease);
}
.mcar-btn:hover{background:rgba(10,8,7,.75);border-color:var(--gold-lo)}
.mcar-btn:focus-visible{outline:2px solid var(--gold-lo);outline-offset:3px}
.mcar-btn.prev{left:clamp(10px,3vw,40px)}
.mcar-btn.next{right:clamp(10px,3vw,40px)}
@media (prefers-reduced-motion: reduce){
  .mslide{transition:opacity .01ms,visibility .01ms;transform:none}
}
.mk{position:absolute;display:block;width:var(--s);height:var(--s);border-radius:50%;
  transform:translate(-50%,-50%) rotate(var(--r));pointer-events:auto;
  background:radial-gradient(circle at 34% 30%, #F6E3B4 0%, #D4B68E 42%, #8E7048 78%, #5A4529 100%);
  box-shadow:0 2px 7px rgba(0,0,0,.6), inset 0 0 0 .5px rgba(255,240,205,.5);
  opacity:.9;transition:transform .4s var(--ease),opacity .4s var(--ease)}
/* struck-coin face rather than a ribbon medal: at 10-20px a ribbon reads as a pin */
.mk::after{content:"";position:absolute;inset:22%;border-radius:50%;
  border:.5px solid rgba(90,69,41,.55);
  background:radial-gradient(circle at 62% 68%, rgba(255,246,220,.35), transparent 60%)}
.mk.plat{background:radial-gradient(circle at 34% 30%,#FFF 0%,#E4E4E8 40%,#9A9AA2 78%,#5E5E66 100%)}
.mk.dbl{transform:translate(-50%,-50%) rotate(var(--r)) scale(1.25)}
.mk:hover{opacity:1;transform:translate(-50%,-50%) rotate(0deg) scale(1.7);z-index:9}
.mhero-in{position:relative;z-index:4;text-shadow:0 2px 24px rgba(4,3,3,.95)}
.mhero h1{font-family:var(--display);font-weight:400;font-size:clamp(46px,9vw,124px);
  line-height:1.04;text-transform:uppercase;color:#fff;margin-top:16px}
.mhero h1 em{font-style:normal;color:var(--gold-lo)}

/* ─────────────  SECTION SCROLLER  ─────────────
   Charles Krug's homepage device: full-bleed panels scrolling sideways, the
   section name centred in each with a gold arrow. Native scroll-snap, so it
   keeps momentum scrolling and trackpad swipe for free, no JS needed to drag. */
.scroller{position:relative;padding:clamp(40px,6vw,90px) 0}
/* Reverted from flush-to-edge. Dropping the track padding made panels snap to
   the left rather than to the middle, so the one you were looking at sat off
   centre. The gutter is what centres them. */
.sc-track{
  display:flex;gap:clamp(16px,2vw,34px);
  overflow-x:auto;overflow-y:hidden;
  scroll-snap-type:x mandatory;scroll-behavior:smooth;
  padding:0 max(calc((100vw - min(1180px,86vw)) / 2), var(--gut));
  scrollbar-width:none;-ms-overflow-style:none;
}
.sc-track::-webkit-scrollbar{display:none}
.sc-panel{
  position:relative;flex:0 0 min(1180px,86vw);
  height:clamp(400px,64vh,700px);
  scroll-snap-align:center;overflow:hidden;
  text-decoration:none;color:#fff;display:grid;place-items:center;
  background:#0B0A0A;
}
.sc-panel img{
  position:absolute;inset:0;width:100%;height:100%;object-fit:cover;
  transition:transform 1s var(--ease),filter .6s var(--ease);
}
.sc-panel::after{
  content:"";position:absolute;inset:0;
  background:radial-gradient(70% 60% at 50% 50%, rgba(6,6,7,.62) 0%, rgba(5,5,6,.72) 70%, rgba(3,3,4,.84) 100%);
}
.sc-panel:hover img{transform:scale(1.04)}
.sc-in{position:relative;z-index:2;text-align:center;text-shadow:0 2px 22px rgba(3,3,4,.9)}
.sc-in h3{
  font-family:var(--display);font-weight:400;
  font-size:clamp(34px,5.4vw,76px);line-height:1;color:#fff;
}
.sc-in .go{
  display:grid;place-items:center;width:52px;height:52px;border-radius:50%;
  border:1px solid var(--gold-lo);color:var(--gold-lo);margin:clamp(18px,2.4vw,30px) auto 0;
  font-size:19px;transition:background .4s var(--ease),color .4s var(--ease);
}
.sc-panel:hover .go{background:var(--gold-lo);color:#0B0A0A}
/* Drawn and placed exactly like the offerings carousel's arrows. These used to
   sit out at the window edge at a different size with a different fill, so two
   carousels a page apart looked like two unrelated controls. */
.sc-btn{
  position:absolute;top:42%;transform:translateY(-50%);z-index:20;
  width:46px;height:46px;border:1px solid var(--line-2);background:none;
  color:var(--cream);cursor:pointer;font-size:20px;line-height:1;
  transition:background .3s var(--ease),color .3s var(--ease),border-color .3s var(--ease);
}
.sc-btn:hover{background:var(--gold);color:#1A1512;border-color:var(--gold)}
.sc-btn.prev{left:0}
.sc-btn.next{right:0}
@media(max-width:640px){.sc-btn{display:none}.sc-panel{flex-basis:88vw}}

/* page-hero video, same fade-in contract as the homepage hero */
.phero-vid{
  position:absolute;inset:0;width:100%;height:100%;object-fit:cover;z-index:1;
  opacity:1;
}
.phero-vid.ready{opacity:1}
.phero-bg::after{z-index:2}
.phero-in{z-index:3}

/* ─────────────  VARIETAL SCROLLER (awards)  ───────────── */
.vscroll .sc-track{align-items:stretch}
.vpanel{
  flex:0 0 min(560px,78vw);scroll-snap-align:center;
  display:flex;flex-direction:column;
}
.vpanel-stage{
  position:relative;height:clamp(430px,52vw,600px);
  display:grid;place-items:center;overflow:hidden;
  background:#0A0A0B url("/img/awards-ground.jpg") center/cover no-repeat;
}
.vpanel-stage::after{
  content:"";position:absolute;inset:0;
  background:radial-gradient(58% 54% at 50% 48%, rgba(8,8,9,.06) 0%, rgba(6,6,7,.60) 70%, rgba(4,4,5,.88) 100%);
}
/* A percentage height needs a definite parent height at layout time, and inside a
   grid + flex chain that is not guaranteed. max-height in absolute units always
   resolves, so the whole bottle fits instead of being cropped to its neck. */
.vpanel-stage img{
  position:relative;z-index:3;
  height:auto;width:auto;
  max-height:clamp(340px,42vw,490px);
  max-width:62%;
  object-fit:contain;
  filter:drop-shadow(0 20px 40px rgba(0,0,0,.7)) brightness(1.05);
}
.vpanel-marks{position:absolute;inset:0;z-index:2}
.vpanel-meta{padding:26px 4px 0;text-align:center}
.vpanel-meta h3{font-family:var(--display);font-weight:400;font-size:clamp(26px,3vw,40px);line-height:1}
.vpanel-count{margin-top:12px;font-family:var(--label);font-size:12.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--dim)}
.vpanel-count b{color:var(--gold);font-weight:600}
.vpanel-best{margin-top:12px;color:var(--gold);font-size:.95em}
.vpanel-vint{margin-top:6px;color:var(--dim);font-size:.86em}
@media(max-width:640px){.vpanel{flex-basis:84vw}}

/* ─────────────  ACCESSIBILITY  ─────────────
   He has been sued under California law before, so these are requirements, not
   polish. Each rule below maps to a specific WCAG 2.1 success criterion. */

/* 1.4.3 Contrast. The overlay menu sits on near-black, so it needs the dark token
   set. Without this it inherits --cream from the cream default and renders dark
   text on a dark panel: measured 1.09:1 against a 4.5:1 requirement. */
nav.main{
  --ink:var(--black);
  --cream:#F2EAD9;
  --dim:#C6BCAE;
  --gold:var(--gold-lo);
  --line:rgba(242,234,217,.15);
  --line-2:rgba(242,234,217,.30);
  color:#F2EAD9;
}
nav.main a{color:#F2EAD9}
nav.main a:hover,nav.main a:focus-visible{color:var(--gold-lo)}
nav.main .navfoot a{color:#D8CDBC}
nav.main .navfoot a:hover{color:var(--gold-lo)}
/* Camino and Placerville are two rooms on one page, so they are named under
   Visit rather than given a line of their own at display size. Everything that
   appears on the browse strip is now reachable from this menu, which is the
   only thing a menu is really for. */
nav.main .nav-sub{display:flex;gap:clamp(18px,3vw,30px);justify-content:center;margin:-2px 0 8px}
nav.main .nav-sub a{
  font-family:var(--label);font-weight:600;font-size:11px;letter-spacing:.24em;
  text-transform:uppercase;color:#C6BCAE;padding:6px 2px;
  text-shadow:0 1px 3px rgba(0,0,0,.85);
}
nav.main .nav-sub a:hover,nav.main .nav-sub a:focus-visible{color:var(--gold-lo)}
.nav-close{color:#F2EAD9}

/* 2.4.7 Focus Visible. A visible, high-contrast focus ring on every interactive
   element, in both themes. */
a:focus-visible,button:focus-visible,[tabindex]:focus-visible,
input:focus-visible,select:focus-visible,textarea:focus-visible{
  outline:3px solid var(--gold-lo);
  outline-offset:3px;
  border-radius:2px;
}
.dark a:focus-visible,.dark button:focus-visible,
nav.main a:focus-visible,#hdr a:focus-visible,#hdr button:focus-visible,
.phero a:focus-visible,.mhero a:focus-visible{
  outline-color:#FFFFFF;
}

/* 2.4.1 Bypass Blocks. Keyboard and screen-reader users must be able to skip the
   header rail on every page. */
.skip{
  position:absolute;left:8px;top:8px;z-index:200;
  transform:translateY(-160%);
  background:var(--black);color:#F2EAD9;
  padding:14px 22px;text-decoration:none;
  font-family:var(--label);font-weight:600;font-size:13px;letter-spacing:.14em;text-transform:uppercase;
  transition:transform .18s var(--ease);
}
.skip:focus{transform:translateY(0)}

/* 1.4.4 Resize text: nothing is pinned to px-only line boxes that would clip.
   2.5.5 Target size: give the small icon rail a comfortable hit area. */
.ico{min-height:44px;min-width:44px;justify-content:center}
.announce .x{min-width:44px;min-height:44px}
.cf-dots button{position:relative}
.cf-dots button::after{content:"";position:absolute;inset:-16px}

/* 1.4.13 Content on hover: the medal marks expose their citation via title, so
   they must also be reachable and readable without a mouse. */
.mk:focus-visible{outline:2px solid #fff;outline-offset:2px;transform:translate(-50%,-50%) scale(1.7);z-index:9}

/* responsive video embed */
.embed{position:relative;width:100%;max-width:1000px;margin:0 auto;aspect-ratio:16/9;background:var(--black)}
/* The film at the foot of the home page. It runs muted on its own; this is the
   way in to the sound, and it says plainly which state it is in. */
.filmrow .film-note{margin-top:clamp(20px,2.6vw,32px);text-align:center}
.filmrow .film-note .btn{color:#F2EAD9;border-color:rgba(242,234,217,.34)}
.filmrow .film-note .btn.on{border-color:var(--gold-lo);color:var(--gold-lo)}
.embed iframe{position:absolute;inset:0;width:100%;height:100%;border:0}
.sc-sub{display:block;margin-top:10px;font-family:var(--label);font-size:12px;
  letter-spacing:.16em;text-transform:uppercase;color:#F2EAD9}

/* ── struck medals, Cuvaison burst ── */
/* ── raining medals ──────────────────────────────────────────────────────────
   Each mark falls the height of its stage and starts again. The negative delay
   baked into every element equals how far down it used to sit, so frame zero
   reproduces the old static scatter exactly and nothing jumps on load; the
   spread of durations comes from size, so the larger ones read as nearer and
   fall faster. Transform only, never top, so this composites on the GPU rather
   than laying out four hundred elements a frame. */
/* Coming at the viewer rather than falling past. Each mark starts far off and
   small, then grows and sweeps outward along its own vector away from the
   centre of the stage. The outward drift is the part that sells it: scaling
   alone reads as a zoom, while travel plus growth reads as approach. Bigger
   marks reach further, so the field pulls apart as it arrives. */
@keyframes rain{
  0%   { transform:translate(-50%,-50%) scale(.42) rotate(var(--r));
         opacity:0 }
  16%  { opacity:var(--o,.9) }
  74%  { opacity:var(--o,.9) }
  /* Held to 1.65. At 2.9 the drop shadow scaled with the disc and smeared into
     a comet tail behind every medal, and the outward drift was far enough that
     two panels side by side looked like they were moving in different
     directions. Shorter travel, gentler growth, one readable direction. */
  100% { transform:translate(calc(-50% + var(--tx,0px) * .45), calc(-50% + var(--ty,0px) * .45))
                   scale(1.65) rotate(calc(var(--r) + 22deg));
         opacity:0 }
}
.mk{
  position:absolute;top:0;display:block;width:var(--s);height:var(--s);border-radius:50%;
  transform:translate(-50%,-50%) rotate(var(--r));pointer-events:auto;
  animation:rain var(--d,16s) linear var(--dl,0s) infinite;
  opacity:var(--o,.9);
  /* A struck disc, not a sphere. The old radial gradient put a specular dot up
     in one corner of every mark, which is what read as a bubble: that is how a
     glass ball is lit, not a coin. Real metal is flat and turned, catching the
     light around its face rather than at a single point, so a conic sweep does
     the work and the rim is drawn explicitly as two inset lines: bright where
     it is raised, dark just inside where it drops back to the face. */
  background:
    conic-gradient(from 208deg,
      #6E5229 0deg,  #C6A464 48deg,  #FFF7DC 96deg,  #EACF97 142deg,
      #A98741 202deg, #7B5D2F 254deg, #DCC087 312deg, #6E5229 360deg);
  /* Inset only. An outer drop shadow scales with the disc as it comes forward,
     and at any real magnification it detaches into a smear trailing each medal. */
  box-shadow:
    inset 0 0 0 1px rgba(255,249,225,.80),
    inset 0 0 0 2px rgba(94,70,35,.55);
  transition:opacity .35s var(--ease),box-shadow .35s var(--ease);
}
/* The struck relief: an inner ring pressed into the face, lit opposite the rim
   so the two read as different depths rather than as concentric drawn circles. */
.mk::after{
  content:"";position:absolute;inset:26%;border-radius:50%;
  box-shadow:
    inset 0 0 0 .5px rgba(255,250,230,.45),
    0 0 0 .5px rgba(86,62,28,.6);
  background:conic-gradient(from 28deg,
    rgba(120,90,44,.32) 0deg, rgba(255,250,228,.30) 110deg,
    rgba(120,90,44,.32) 210deg, rgba(255,250,228,.22) 320deg,
    rgba(120,90,44,.32) 360deg);
}
/* Same turned face in other metals: silver for platinum, deeper gold for double
   gold, palest for his best of show. */
.mk.plat{background:conic-gradient(from 208deg,
  #5C5C64 0deg, #B4B4BE 48deg, #FFFFFF 96deg, #DDDDE4 142deg,
  #9096A0 202deg, #6A6A74 254deg, #CACAD2 312deg, #5C5C64 360deg)}
.mk.dbl{transform:translate(-50%,-50%) rotate(var(--r)) scale(1.35);
  background:conic-gradient(from 208deg,
    #5E4212 0deg, #C39332 48deg, #FFEFB4 96deg, #EBC96E 142deg,
    #A87B26 202deg, #7A5A18 254deg, #DDBA62 312deg, #5E4212 360deg)}
.mk.best{background:conic-gradient(from 208deg,
  #6E5628 0deg, #CDB075 48deg, #FFFCEC 96deg, #F2E2BB 142deg,
  #B39A5E 202deg, #866C38 254deg, #E4D2A4 312deg, #6E5628 360deg)}
/* Hover holds the mark where it is rather than yanking it back to a fixed spot,
   which is what setting transform here would do mid-fall. */
.mk:hover,.mk:focus-visible{
  animation-play-state:paused;
  /* The independent scale property, not transform: a running animation owns
     transform outright, so a transform here would simply be ignored. This
     composes on top of the fall instead of fighting it. */
  scale:1.9;
  opacity:1;z-index:9;
  box-shadow:0 4px 18px rgba(0,0,0,.8), inset 0 0 0 1px rgba(255,248,224,.9);
}

/* The stage is what they travel across. */
.vpanel-marks{--fall:calc(clamp(430px,52vw,600px) + 90px)}

/* ── a varietal's medals, in its own panel ───────────────────────────────────
   The scroller gave the headline number and the single best award, and the full
   record lived on another page. This opens the whole list where you are stood,
   best first, so the panel answers the question it raises. */
/* Sixteen of his twenty-three varietals have no bottle photograph, and two of
   them, Toscanello and Sagrantino, are his most decorated wines. Rather than
   leave them out of the scroller entirely, or put someone else's label on them,
   those panels lead with the name set in the medal field. */
.vpanel.no-bottle .vpanel-stage{display:grid;place-items:center}
.vpanel-name{
  position:relative;z-index:3;padding:0 8%;
  font-family:var(--display);font-weight:400;
  font-size:clamp(30px,4.4vw,58px);line-height:1.08;text-align:center;
  color:#F6EEDD;text-shadow:0 2px 20px rgba(0,0,0,.9), 0 0 40px rgba(0,0,0,.6);
}
.vpanel.no-bottle .vpanel-meta h3{
  /* the name is already large on the stage; no need to set it twice */
  position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);
}
.vpanel-years{
  margin-top:10px;font-family:var(--label);font-size:10.5px;
  letter-spacing:.2em;text-transform:uppercase;color:var(--dim);
}

.vpanel-fold{margin-top:16px;text-align:left}
.vpanel-fold summary{
  display:flex;align-items:center;justify-content:center;gap:8px;
  cursor:pointer;list-style:none;padding:9px 0;color:var(--dim);
  font-family:var(--label);font-size:11px;letter-spacing:.2em;text-transform:uppercase;
  transition:color .3s var(--ease);
}
.vpanel-fold summary::-webkit-details-marker{display:none}
.vpanel-fold summary::after{
  content:"";width:6px;height:6px;flex:none;
  border-right:1.4px solid currentColor;border-bottom:1.4px solid currentColor;
  transform:rotate(45deg) translate(-1px,-1px);
  transition:transform .35s var(--ease);
}
.vpanel-fold[open] summary::after{transform:rotate(225deg) translate(-1px,-1px)}
.vpanel-fold summary:hover,.vpanel-fold summary:focus-visible{color:var(--gold)}
.vpanel-fold summary:focus-visible{outline:2px solid var(--gold);outline-offset:3px}

.vpanel-list{
  list-style:none;margin:6px 0 0;padding:0 2px 4px;
  max-height:clamp(190px,26vh,300px);overflow-y:auto;overscroll-behavior:contain;
  scrollbar-width:thin;
}
.vpanel-list li{
  display:grid;grid-template-columns:1fr auto;gap:2px 12px;
  padding:9px 0;border-bottom:1px solid var(--line);
  font-size:.86em;line-height:1.35;
}
.vpanel-list li b{color:var(--gold);font-weight:600}
.vpanel-list li span{color:var(--dim);font-family:var(--label);font-size:10.5px;
  letter-spacing:.1em;text-align:right;white-space:nowrap}
.vpanel-list li i{grid-column:1/-1;font-style:normal;color:var(--dim);font-size:.92em}

/* ── the wine mob, on his own footage ────────────────────────────────────────
   The membership pitch used to open on flat cream while the Wine Mob page led
   with him. Same film here, carrying the heading, with the tiers staying on
   cream below so the cards keep their contrast. */
/* Film on top carrying the heading, cards on their own ground underneath. The
   version where the footage ran behind everything put white cards across his
   face and drove the section so tall that cover cropped to one eye. A band has
   a fixed, wide aspect, so the whole shot stays in frame. */
/* Set outright, not inherited. --ink-2 resolves light inside the cream token
   set, so the section came out white and the translucent panel over it averaged
   to grey. Everything below is stated so nothing depends on which token set
   happens to be in scope. */
.mob{position:relative;background:#14100E;color:#F2EAD9}
.mob-band{
  position:relative;overflow:hidden;isolation:isolate;
  min-height:clamp(300px,42vh,470px);
  display:flex;align-items:center;
  padding:clamp(48px,7vw,92px) 0;
}
.mob-vid{
  position:absolute;inset:0;z-index:0;
  width:100%;height:100%;object-fit:cover;object-position:center 34%;
  pointer-events:none;
}
.mob-body{padding:clamp(38px,5vw,64px) 0 clamp(44px,6vw,76px)}
/* The cards stay light on the dark ground, stated rather than inherited. */
.mob .tier,.tier,.room{
  background:#FBF8F2;color:#1A1512;border-color:rgba(26,21,18,.14);
  --ink:#FBF8F2;--ink-2:#F3EEE4;--ink-3:#FFFFFF;
  --cream:#1A1512;--dim:#6A6055;--gold:var(--gold-hi);--ember:#8C3A18;
  --line:rgba(26,21,18,.16);--line-2:rgba(26,21,18,.34);
}
.mob .tier h3,.mob .tier .price{color:#1A1512}
.mob .tier .qty,.mob .tier .per{color:#6A6055}
.mob .tier p{color:#3C352E}
/* The perks panel: a real dark card, not a translucent wash that went grey. */
.mob .perks{background:#1B1613;border:1px solid rgba(242,234,217,.10);backdrop-filter:none}
.mob-film-scrim{
  position:absolute;inset:0;z-index:1;pointer-events:none;
  /* Light enough to actually see him. The heading sits in the upper third where
     this is thinnest; it thickens further down, where the tier cards need a
     settled ground to sit against rather than moving footage. */
  background:
    linear-gradient(180deg,
      rgba(10,6,5,.34) 0%, rgba(10,6,5,.28) 26%,
      rgba(10,6,5,.52) 52%, rgba(10,6,5,.80) 78%, rgba(10,6,5,.90) 100%);
}
.mob > .wrap{position:relative;z-index:2}
/* The section is dark now, so its type has to flip to the light token set the
   way .dark sections do; without this it inherits cream-page ink and vanishes. */
.mob .mob-head{--cream:#F2EAD9;--dim:#C9BCA9;--gold:var(--gold-lo);color:#F2EAD9}
.mob .mob-head .label{color:#E8D8B4}
.mob .mob-head h2{color:#FBF6EC;text-shadow:0 2px 12px rgba(0,0,0,.8)}
.mob .mob-head h2 em{color:#E9A778}
.mob .mob-head .lede{color:#EDE5D8;text-shadow:0 1px 8px rgba(0,0,0,.75)}

/* The perks list kept the cream-page ink after the section went to film, which
   left grey type on dark footage. The bold runs were the worst of it: they use
   the gold token, which is mixed for a pale ground and disappears on this one.
   Colours are set directly rather than by flipping --ink, because the tier
   cards below are white and would inevitably invert with it. */
.mob .perks h4{color:#E8D8B4;text-shadow:0 1px 8px rgba(0,0,0,.8)}
.mob .perk-grid li{color:#F1EADF;text-shadow:0 1px 7px rgba(0,0,0,.85)}
.mob .perk-grid li b{color:#F5C98E;font-weight:600}
.mob .perk-grid li::before{color:#E9A778}
.mob .perks{
  /* a soft panel under the list so it never rests directly on a bright frame */
  background:linear-gradient(180deg, rgba(8,5,4,.42), rgba(8,5,4,.58));
  padding:clamp(26px,3vw,42px);border-radius:4px;
  backdrop-filter:blur(3px);-webkit-backdrop-filter:blur(3px);
}
/* Set by the observer in site.js while the stage is off screen. */
.marks-still .mk{animation-play-state:paused}

/* Reduced motion keeps the picture and loses the movement: a paused animation
   still renders at its delay offset, which is exactly the scatter this replaced.
   Simply turning the animation off would stack all four hundred at the top,
   because the per-element top values are gone now. */
@media (prefers-reduced-motion: reduce){
  .mk{animation-play-state:paused}
}
/* warm pool of light behind the bottle so it lifts off the ground */
.mhero-bottle{filter:drop-shadow(0 30px 60px rgba(0,0,0,.8)) brightness(1.10) contrast(1.04)}
.mhero-bg::before{
  content:"";position:absolute;inset:0;z-index:1;
  background:radial-gradient(38% 46% at 50% 46%, rgba(214,168,86,.30) 0%, rgba(160,110,40,.12) 46%, transparent 74%);
}
.vpanel-stage::before{
  content:"";position:absolute;inset:0;z-index:1;
  background:radial-gradient(46% 52% at 50% 50%, rgba(214,168,86,.26) 0%, transparent 72%);
}

/* The centre column carries the mark again. Without content here it collapsed to
   0px and both icon rails slid together into the middle. */
.hmark{justify-self:center;line-height:0;display:block;padding:0 clamp(8px,2vw,28px)}
.hmark img{height:clamp(30px,3.2vw,44px);width:auto;opacity:1}
.hrow{grid-template-columns:1fr auto 1fr;gap:clamp(10px,2vw,24px)}
.rail{gap:clamp(14px,2.4vw,34px)}
@media(max-width:820px){
  .hmark img{height:26px}
  .rail{gap:12px}
  .ico{font-size:8.5px;letter-spacing:.12em}
}
@media(max-width:560px){
  .hmark{display:none}
  .hrow{grid-template-columns:1fr 1fr}
}

/* ─────────────  EMAIL CAPTURE  ───────────── */
.capture{text-align:center;max-width:760px;margin:0 auto}
.capture h2{font-family:var(--display);font-weight:400;
  font-size:clamp(32px,4.6vw,62px);line-height:1.05;margin-top:16px}
.capture .lede{margin:20px auto 0}
.capture-form{margin-top:clamp(26px,3.4vw,40px)}
/* a visible label, not a placeholder pretending to be one (WCAG 3.3.2) */
.capture-form label{
  display:block;margin-bottom:12px;
  font-family:var(--label);font-weight:600;font-size:12px;
  letter-spacing:.22em;text-transform:uppercase;color:var(--dim);
}
.capture-row{display:flex;flex-wrap:wrap;gap:12px;justify-content:center}
.capture-row input{
  flex:1 1 320px;max-width:420px;
  padding:16px 20px;border:1px solid var(--line-2);background:transparent;
  color:var(--cream);font-family:var(--body);font-size:1em;
}
.capture-row input::placeholder{color:var(--dim)}
.capture-row input:focus-visible{outline:3px solid var(--gold);outline-offset:2px}
.capture-row .btn{flex:0 0 auto}
.capture-note{margin-top:14px;font-size:.85em;color:var(--dim)}
.capture-status{margin-top:10px;font-size:.88em;color:var(--gold);min-height:1.2em}
.capture-alt{margin-top:16px;font-size:.88em;color:var(--dim)}
.capture-alt a{color:var(--gold)}

/* ─────────────  BOTTOM DOCK  ─────────────
   The section scroll, kept reachable from every interior page. Without it you
   can arrive from the homepage scroller and have no way back to it. */
.dock{
  position:fixed;left:0;right:0;bottom:0;z-index:90;
  background:rgba(8,8,9,.94);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);
  border-top:1px solid rgba(242,234,217,.16);
  transition:transform .4s var(--ease);
}
.dock-toggle{
  display:flex;align-items:center;gap:9px;margin:0 auto;
  height:42px;padding:0 20px;background:none;border:0;cursor:pointer;color:#F2EAD9;
  font-family:var(--label);font-weight:600;font-size:11px;letter-spacing:.24em;text-transform:uppercase;
}
.dock-chev{display:inline-block;transform:rotate(-90deg);transition:transform .4s var(--ease);font-size:16px}
.dock-rail{
  display:flex;gap:10px;overflow-x:auto;scroll-snap-type:x proximity;
  padding:0 clamp(12px,3vw,28px) 14px;scrollbar-width:none;
}
.dock-rail::-webkit-scrollbar{display:none}
.dock-item{
  flex:0 0 auto;width:clamp(104px,13vw,152px);text-decoration:none;
  scroll-snap-align:center;opacity:.72;transition:opacity .3s var(--ease),transform .3s var(--ease);
}
.dock-item:hover,.dock-item:focus-visible{opacity:1;transform:translateY(-3px)}
.dock-item[aria-current="page"]{opacity:1}
.dock-item img{width:100%;height:clamp(58px,7vw,84px);object-fit:cover;display:block;border:1px solid rgba(242,234,217,.14)}
.dock-item[aria-current="page"] img{border-color:var(--gold-lo)}
.dock-item span{
  display:block;margin-top:7px;text-align:center;color:#E4DACA;
  font-family:var(--label);font-weight:600;font-size:11.5px;letter-spacing:.14em;text-transform:uppercase;
}
.dock-item[aria-current="page"] span{color:var(--gold-lo)}
body:has(.dock) footer{padding-bottom:clamp(150px,18vh,210px)}
@media(max-width:560px){
  /* fixed pixels made these shrink on a Pro Max: the tile stayed 110px while
     the screen got wider, so it read smaller. Everything scales with the
     phone now, with floors so a small phone never gets worse. */
  .dock-item{width:clamp(112px,30vw,152px)}
  .dock-item img{height:clamp(68px,18vw,92px)}
  .dock-item span{font-size:clamp(12.5px,3.5vw,15px);letter-spacing:.08em;margin-top:8px}
}

/* ── sideways affordance on the rail ─────────────────────────────────────────
   Nothing said the thumbnails carried on past the edge of the screen. The fade
   says there is more, the arrow says you can go and get it, and both are keyed
   to the actual scroll position rather than shown unconditionally. */
.dock-arrow{
  position:absolute;z-index:6;
  /* against the middle of the thumbnail row, under the toggle bar */
  top:calc(42px + clamp(58px,7vw,84px) / 2);transform:translateY(-50%);
  width:34px;height:34px;border-radius:50%;
  display:flex;align-items:center;justify-content:center;
  border:1px solid rgba(212,182,142,.5);background:rgba(10,10,11,.86);
  backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);
  color:var(--gold-lo);font-size:18px;line-height:1;cursor:pointer;
  opacity:0;pointer-events:none;
  transition:opacity .25s var(--ease),background .25s var(--ease),color .25s var(--ease);
}
.dock-arrow.prev{left:8px}
.dock-arrow.next{right:8px}
.dock-arrow:hover,.dock-arrow:focus-visible{background:var(--gold-lo);color:#0B0A0A}
/* only when there is somewhere to go, and only toward the side with more on it */
.dock.scrolls:not(.at-start) .dock-arrow.prev,
.dock.scrolls:not(.at-end)   .dock-arrow.next{opacity:1;pointer-events:auto}
.dock::before,.dock::after{
  content:"";position:absolute;z-index:5;pointer-events:none;
  top:42px;bottom:0;width:56px;opacity:0;transition:opacity .25s var(--ease);
}
.dock::before{left:0;background:linear-gradient(to right,rgba(8,8,9,.95),rgba(8,8,9,0))}
.dock::after{right:0;background:linear-gradient(to left,rgba(8,8,9,.95),rgba(8,8,9,0))}
.dock.scrolls:not(.at-start)::before,
.dock.scrolls:not(.at-end)::after{opacity:1}

/* logo 50% larger in the bar */
.hmark img{height:clamp(45px,4.8vw,66px)}
@media(max-width:820px){.hmark img{height:38px}}

/* Dock hides until you reach for it. Revealed by pointer near the bottom edge or
   by keyboard focus, so it is not mouse-only. */
.dock{transform:translateY(100%);transition:transform .38s var(--ease)}
.dock.peek,.dock.pinned,.dock:focus-within{transform:translateY(0)}
.dock .dock-rail{opacity:1;transition:opacity .3s var(--ease)}

/* ── the Browse tab ──────────────────────────────────────────────────────────
   All that ever shows is this: a small tab on the bottom edge with a gold
   pointer on it, the same device Krug use to say there is more below the fold.
   It used to be pointer-events:none, which made it a label for a thing you had
   to already know how to open. It is a button now, so hovering near the bottom
   reveals the bar and clicking the tab keeps it. */
.dock-hint{
  position:fixed;left:50%;bottom:0;z-index:89;
  transform:translateX(-50%);
  display:flex;align-items:center;gap:12px;
  padding:13px 30px 14px;
  background:rgba(8,8,9,.94);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);
  /* A full gold keyline and a lift off the edge. At a hairline of 32% opacity
     this read as a caption on the page rather than as a control, which is how
     it got missed entirely. */
  border:1px solid rgba(212,182,142,.62);border-bottom:0;border-radius:4px 4px 0 0;
  box-shadow:0 -6px 26px rgba(0,0,0,.55);
  color:#F2E8D6;cursor:pointer;white-space:nowrap;
  font-family:var(--label);font-weight:600;font-size:11.5px;letter-spacing:.26em;text-transform:uppercase;
  transition:transform .3s var(--ease),opacity .3s var(--ease),
             color .3s var(--ease),border-color .3s var(--ease);
}
.dock-hint:hover,.dock-hint:focus-visible{
  color:#F8EDD6;border-color:var(--gold-lo);
  transform:translateX(-50%) translateY(-3px);
}
/* A drawn triangle rather than a glyph: at this size a chevron character sits
   off the baseline and renders differently on every platform. */
.dock-hint-caret{
  flex:none;width:0;height:0;
  border-left:7px solid transparent;border-right:7px solid transparent;
  border-bottom:9px solid var(--gold-lo);
  animation:hintBob 2.6s var(--ease) infinite;
}
/* Two hops rather than one. A single nudge every three seconds was easy to miss
   between glances; a double beat reads as something asking to be pressed. */
@keyframes hintBob{
  0%,58%,100%{transform:translateY(0)}
  68%{transform:translateY(-5px)}
  78%{transform:translateY(0)}
  88%{transform:translateY(-3px)}
}
@media (prefers-reduced-motion: reduce){.dock-hint-caret{animation:none}}
/* On touch there is no hover reveal, so this tab is the only way in and has to
   be a real target rather than a caption. */
@media (hover: none),(pointer: coarse){
  .dock-hint{padding:15px 26px 16px;font-size:11px}
}
/* At this tracking the full phrase runs to two lines on a phone; the word on its
   own says the same thing. */
@media(max-width:560px){.dock-hint-more{display:none}}
/* The one-time first-visit reveal rides a slower curve than a hover peek, so it
   reads as the page showing you something rather than as a twitch. */
.dock.demo{transition:transform .85s cubic-bezier(.22,.9,.28,1)}

/* ── page heroes on a phone ──────────────────────────────────────────────────
   A portrait screen crops a 16:9 hero to roughly a quarter of its width, so the
   composition the desktop scrim was shaped around is not what is on screen.

   The radial left the middle of the frame clear, which is fine over a dark shot
   and wrong over a bright one: on Cali Mojo the headline sat on the blown-out
   side of a backlit glass with nothing behind it at all. And the same radial
   was dimming the subject on the dark shots, which is what buried Nello on the
   Wine Mob page.

   On phones it is one bottom-weighted gradient instead. It stays light across
   the upper third so whoever is up there stays visible, then builds a real
   ground under the words. */
@media(max-width:640px){
  .phero{
    min-height:88svh;
    padding:calc(var(--ann) + 92px) 0 clamp(58px,8vh,88px);
  }
  .phero-bg::after{
    background:
      /* An extra mid-band, off by default. A shot that is dark where the type
         lands needs nothing here, and darkening it further only buries the
         subject; a pale one like the Cali Mojo glass needs a real ground or the
         headline sits on a blown highlight. So the pages that need it ask for
         it by setting --scrim-lo, and the rest are untouched. */
      linear-gradient(to bottom,
        rgba(4,4,5,0)                   26%,
        rgba(4,4,5,var(--scrim-lo,0))   48%,
        rgba(4,4,5,var(--scrim-lo,0))   90%,
        rgba(4,4,5,0)                  100%),
      linear-gradient(to bottom,
        rgba(6,6,7,.56)  0%,
        rgba(6,6,7,.16) 15%,
        rgba(6,6,7,.12) 33%,
        rgba(4,4,5,.64) 62%,
        rgba(2,2,3,.94) 100%);
  }
  /* Framing is per page. Where a hero has a person in it the subject is rarely
     in the middle of the frame, and the middle is all a phone keeps, so these
     carry their own horizontal anchor. */
  .phero-vid{object-position:var(--vpos,50% 50%)}
  .phero-bg::before{background-position:var(--vpos,var(--pos,center))}
  .phero h1{font-size:clamp(42px,11vw,64px)}
  .phero-lede{font-size:1em}
}
/* Once the bar is up the tab has nothing left to say, so it drops out from
   under it rather than fading in place behind the glass. */
.dock.peek ~ .dock-hint,
.dock.pinned ~ .dock-hint,
.dock:focus-within ~ .dock-hint{
  opacity:0;pointer-events:none;transform:translateX(-50%) translateY(10px);
}
/* the chevron points the way the click will send it */
.dock.pinned .dock-chev{transform:rotate(90deg)}
.dock .dock-chev{transform:rotate(-90deg);transition:transform .3s var(--ease);display:inline-block}

/* logo up another 25% in the bar */
.hmark img{height:clamp(56px,6vw,82px)}
@media(max-width:820px){.hmark img{height:47px}}

/* awards teaser on the homepage: the same medal plate as the awards hero */
.awards-teaser{position:relative;overflow:hidden}
.awards-teaser-bg{position:absolute;inset:0;z-index:0;
  background:#080809 var(--shot) center/cover no-repeat}
.awards-teaser-bg::after{content:"";position:absolute;inset:0;
  background:radial-gradient(70% 62% at 50% 50%, rgba(8,8,9,.34) 0%, rgba(6,6,7,.80) 72%, rgba(4,4,5,.94) 100%)}

/* a band that carries a photograph behind its copy */
.has-shot{position:relative;overflow:hidden}
.has-shot .shot-bg{position:absolute;inset:0;z-index:0;
  background:#0A0908 var(--shot) center 42%/cover no-repeat}
.has-shot .shot-bg::after{content:"";position:absolute;inset:0;
  background:radial-gradient(76% 68% at 50% 50%, rgba(8,7,6,.52) 0%, rgba(6,5,5,.82) 68%, rgba(4,4,4,.94) 100%)}
.has-shot .wrap{position:relative;z-index:2}
.private.has-shot::before{content:none}

/* The record heading sits on the scroller's own black ground, so it reads at
   16.5:1 rather than fighting a photograph behind it. */
.vscroll{background:#070708}
.awards-head{padding-top:clamp(10px,2vw,26px)}
.awards-head .lede{max-width:58ch}
.awards-head .intro-cta{margin-top:clamp(22px,3vw,34px)}
/* deeper scrim on each panel so the bottle and medals stay legible */
.vpanel-stage::after{
  background:radial-gradient(56% 52% at 50% 48%, rgba(6,6,7,.10) 0%, rgba(5,5,6,.66) 68%, rgba(3,3,4,.92) 100%)}
.intro-line cite{
  display:block;margin-top:18px;font-style:normal;
  font-family:var(--label);font-weight:600;font-size:11.5px;
  letter-spacing:.24em;text-transform:uppercase;color:var(--gold);
}
blockquote.intro-line{margin:0 auto;max-width:20ch}

/* The private band carries a photograph, so it must not also paint the oxblood
   fill or its gold radial, and it needs the dark token set for legible copy. */
.private.has-shot{
  background:#0A0908;
  --ink:var(--black); --cream:#F2EAD9; --dim:#CBC0B2; --gold:var(--gold-lo);
  --line:rgba(242,234,217,.15); --line-2:rgba(242,234,217,.30);
  color:#F2EAD9;
}
.private.has-shot::before{content:none !important;background:none !important}
.private.has-shot h2{color:#F2EAD9}
.private.has-shot h2 em{color:var(--gold-lo)}
.private.has-shot .lede{color:#E4DACA}
.private.has-shot .label{color:var(--gold-lo)}
.private.has-shot .btn{color:#F2EAD9;border-color:rgba(242,234,217,.42)}
.private.has-shot .btn::before{background:#F2EAD9}
.private.has-shot .btn:hover{color:#0A0908}

/* audio player: native controls, never autoplaying */
.track{width:100%;max-width:560px;margin:clamp(22px,3vw,34px) auto 0;display:block}
.dark .track{filter:invert(1) hue-rotate(180deg)}

/* ─────────────  PRODUCT PAGE  ───────────── */
.product{padding-top:calc(var(--ann) + 150px)}
.product-grid{display:grid;grid-template-columns:1fr 1fr;gap:clamp(30px,5vw,80px);align-items:center}
.product-shot{display:grid;place-items:center}
.product-shot img{max-height:min(64vh,620px);width:auto;max-width:100%;
  filter:drop-shadow(0 26px 50px rgba(0,0,0,.7))}
.crumb{font-family:var(--label);font-size:11.5px;letter-spacing:.22em;text-transform:uppercase;margin-bottom:18px}
.crumb a{color:var(--dim);text-decoration:none}
.crumb a:hover{color:var(--gold)}
.product h1{font-family:var(--display);font-weight:400;
  font-size:clamp(40px,5.4vw,80px);line-height:1;margin-top:14px}
.product-price{font-family:var(--display);font-size:clamp(26px,3vw,40px);color:var(--gold);margin-top:16px}
.product-cred{margin-top:12px;color:var(--gold);font-size:.95em}
.product .lede{margin-top:20px}
.product-cta{display:flex;flex-wrap:wrap;gap:14px;margin-top:clamp(24px,3vw,36px)}
.product-note{margin-top:18px;font-size:.84em;color:var(--dim);max-width:44ch}
@media(max-width:820px){.product-grid{grid-template-columns:1fr}.product-shot img{max-height:44vh}}

/* A faint cue at each edge so the hover affordance is discoverable rather than
   secret. Hidden from assistive tech and from touch, where it does not apply. */
@media (hover: hover) and (pointer: fine){
  .edge-cue{
    position:fixed;top:50%;transform:translateY(-50%);z-index:95;
    width:3px;height:74px;border-radius:3px;
    background:linear-gradient(var(--gold-lo),rgba(212,182,142,.15));
    opacity:.5;transition:opacity .3s var(--ease),width .3s var(--ease);
    pointer-events:none;
  }
  .edge-cue.left{left:0}
  .edge-cue.right{right:0}
  body:has(nav.main.open) .edge-cue{opacity:0}
}
@media (hover: none), (pointer: coarse){ .edge-cue{display:none} }

/* ── the top bar on a phone ──────────────────────────────────────────────────
   The strip was one nowrap line at a fixed 42px, so on a 390px screen it
   truncated to "E…" and the sentence was simply lost. It wraps to two lines
   here and the bar grows to suit. The rail carried nine words across the same
   390px and overflowed; below 640px the icons stand alone, which is the reason
   they are icons. */
@media(max-width:900px){
  :root{--ann:74px}
  .announce{
    height:var(--ann);padding:9px 34px 9px 14px;
    flex-direction:column;justify-content:center;gap:3px;
    text-align:center;font-size:13px;line-height:1.32;
  }
  .announce p{white-space:normal;overflow:visible;text-overflow:clip}
  .announce a{font-size:12.5px}
  .announce .x{right:8px;top:10px;transform:none}

  /* icon only: the words do not fit and the glyphs already say it. Sized so
     seven icons and the mark fit a 375px screen without the bar overflowing,
     while every target stays at or above the 44px minimum for a fingertip. */
  .ico{font-size:0;gap:0;padding:0}
  .ico svg,.ico .bars{width:21px;height:21px}
  .ico .bars i{height:1.6px}
  .rail{gap:clamp(9px,3.4vw,16px)}
  /* Seven 44px targets plus the mark cannot fit 375px: 401px was the best it
     got. Reserve and Events step aside on a phone; both are one tap away in
     the menu, and dropping them keeps every remaining target at full size
     rather than shrinking all seven below what a fingertip can hit. */
  .rail .ico[href*="private-wine-tastings"],
  .rail .ico[href*="event-tickets"]{display:none}
  .hrow{gap:6px}
  .hmark img{height:26px}
  #hdr .wrap{padding-left:10px;padding-right:10px}
  #hdr{padding:11px 0}
  /* the tap area stays full size even though the glyph shrank */
  .ico::after{content:"";position:absolute;inset:-11px -7px}
  .ico{position:relative}
}

/* Off-screen but still read aloud. The page needs an h1; the film carries the
   mark visually. A class named sr-only was used here first and never existed in
   this stylesheet, so the heading rendered as plain text over the hero. */
.vis-hide{
  position:absolute;width:1px;height:1px;margin:-1px;padding:0;
  overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0;
}


/* ── the mark, written rather than wiped ─────────────────────────────────────
   The old reveal was one left-to-right clip-path sweep, which is why it read as
   computer generated: a straight edge crossing the artwork has nothing to do
   with how a pen moves.

   This traces his real logo. The ink is skeletonised to a one-pixel spine, the
   spine is walked into ordered pen runs, and those runs mask his actual
   artwork, so what appears is always his logo, drawn in the order a pen would
   travel.

   The runs are grouped by word, not sorted left to right. Sorting by x
   interleaved the two words, because Nello's swash reaches x=1034 while Olivo
   begins at x=707. Splitting on the vertical centre at y=400 separates them
   cleanly: Nello finishes, the pen lifts, then Olivo. */
.logo-write{
  display:block;margin:0 auto;width:min(64vw,520px);height:auto;
  filter:brightness(1.42) saturate(1.06)
         drop-shadow(0 5px 30px rgba(12,3,4,.78))
         drop-shadow(0 0 18px rgba(0,0,0,.45));
}
@keyframes penDraw{to{stroke-dashoffset:0}}
@keyframes penFade{to{opacity:1}}
  .logo-write .p1{stroke-dasharray:79.0;stroke-dashoffset:79.0;animation:penDraw 0.080s linear 0.000s forwards}
  .logo-write .p2{stroke-dasharray:1713.7;stroke-dashoffset:1713.7;animation:penDraw 0.470s linear 0.080s forwards}
  .logo-write .p3{stroke-dasharray:104.7;stroke-dashoffset:104.7;animation:penDraw 0.080s linear 0.551s forwards}
  .logo-write .p4{stroke-dasharray:2621.5;stroke-dashoffset:2621.5;animation:penDraw 0.720s linear 0.631s forwards}
  .logo-write .p5{stroke-dasharray:93.8;stroke-dashoffset:93.8;animation:penDraw 0.080s linear 1.351s forwards}
  .logo-write .p6{stroke-dasharray:433.7;stroke-dashoffset:433.7;animation:penDraw 0.119s linear 1.431s forwards}
  .logo-write .p7{stroke-dasharray:811.5;stroke-dashoffset:811.5;animation:penDraw 0.334s linear 1.830s forwards}
  .logo-write .p8{stroke-dasharray:186.1;stroke-dashoffset:186.1;animation:penDraw 0.082s linear 2.164s forwards}
  .logo-write .p9{stroke-dasharray:56.1;stroke-dashoffset:56.1;animation:penDraw 0.082s linear 2.246s forwards}
  .logo-write .p10{stroke-dasharray:1185.6;stroke-dashoffset:1185.6;animation:penDraw 0.488s linear 2.328s forwards}
  .logo-write .p11{stroke-dasharray:66.8;stroke-dashoffset:66.8;animation:penDraw 0.082s linear 2.816s forwards}
  .logo-write .p12{stroke-dasharray:310.8;stroke-dashoffset:310.8;animation:penDraw 0.127s linear 2.898s forwards}
  .logo-write .p13{stroke-dasharray:377.4;stroke-dashoffset:377.4;animation:penDraw 0.155s linear 3.025s forwards}
  .logo-write .pn-winery{opacity:0;animation:penFade .5s ease 3.340s forwards}

/* Anyone who asked for stillness gets the finished mark, immediately. */
@media (prefers-reduced-motion: reduce){
  .logo-write .pn{stroke-dashoffset:0!important;animation:none!important}
  .logo-write .pn-winery{opacity:1!important;animation:none!important}
}

/* The wines hero sits lower than the others. With the label and the lede gone
   the headline had room to drop, and dropping it keeps the glass clear rather
   than laying type across the middle of the shot. */
.phero-in.low{margin-bottom:clamp(-44px,-7vh,-96px)}
@media(max-width:640px){.phero-in.low{margin-bottom:0}}

/* Phone home hero. The announcement strip runs to two lines there, so the strip
   plus the header plus 23vh of padding pushed the mark down behind the browse
   dock. On a phone the padding is small and the mark is sized to the width it
   actually has. */
@media(max-width:640px){
  .hero{padding-top:calc(var(--ann) + clamp(28px,5vh,60px))}
  .hero .logo-write,.hero .logo{width:min(80vw,430px)}
}

/* The scroll cue: the words, then the same gold rule used under every hero.
   A filled button here read as a blocky slab across the shot. */
.scrollcue{
  display:block;margin-top:clamp(22px,3.5vh,40px);text-decoration:none;text-align:center;
}
.scrollcue span{
  display:block;
  font-family:var(--label);font-weight:600;font-size:clamp(12px,1.05vw,14px);
  letter-spacing:.30em;text-transform:uppercase;color:#EBD3A6;
  text-shadow:0 1px 10px rgba(0,0,0,.9), 0 0 20px rgba(0,0,0,.6);
  transition:color .3s var(--ease);
}
.scrollcue::after{
  content:"";display:block;width:2px;height:clamp(72px,12vh,140px);
  margin:clamp(18px,2.6vh,30px) auto 0;
  background:linear-gradient(to bottom,var(--gold-lo),transparent);
  transition:height .3s var(--ease);
}
.scrollcue:hover span,.scrollcue:focus-visible span{color:#F8EDD6}
.scrollcue:hover::after{height:clamp(86px,14vh,164px)}
/* the hero already carries its own rule; the cue supplies it here */
.phero-in.low::after{display:none}

/* The medal hero grows rather than clipping. Locked to one screen height, the
   headline, the lede and the bottle together overflowed it on phones and short
   laptops, and the bottle was what got cut. */
.mhero{height:auto}
.mhero .mcar{height:clamp(400px,52vh,700px)}
@media(max-width:640px){
  .mhero{padding-top:calc(var(--ann) + clamp(30px,5vh,64px))}
  .mhero h1{font-size:clamp(40px,13vw,64px)}
  .mhero .mcar{height:clamp(360px,46vh,520px)}
  .mslide{padding-bottom:clamp(128px,17vh,168px)}
  .mslide img{max-width:56%}
}

/* ── phone audit: one rule for the whole family of heroes ────────────────────
   The browse dock is fixed over the foot of every page, about 150px of it. No
   hero accounted for that, so on a phone the last line of every one ran under
   the thumbnails: the Private Tastings lede, the medal caption, the Wine Mob
   subtitle. Reserving the dock's height once fixes all of them together. */
@media(max-width:640px){
  .phero{padding-bottom:clamp(172px,23vh,215px)}
  .phero h1{font-size:clamp(38px,11.5vw,58px);line-height:1.06}
  .phero-lede{font-size:clamp(15px,4vw,17px);max-width:34ch}
  .scrollcue::after{height:clamp(54px,8vh,88px)}
  .scrollcue{margin-top:clamp(16px,2.4vh,26px)}
  /* the mark on a portrait screen: framed on the subject, not the frame */
  .phero-vid{object-position:var(--vpos,50% 50%)}
}

/* Awards on a phone: the bottle is the point of the page, so the type yields to
   it. The eyebrow, the headline and the three-line lede were together taking
   more than half the screen before the bottle got any of it. */
@media(max-width:640px){
  .mhero .label{font-size:12px;letter-spacing:.26em}
  .mhero h1{font-size:clamp(34px,10vw,48px);margin-top:8px}
  .mhero .phero-lede{
    font-size:14px;line-height:1.45;max-width:30ch;margin-top:12px;
    display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
  }
  /* the dock clearance belongs to the section, once. The slide was padding for
     it as well, and the two together left the bottle a sliver. */
  .mhero{
    padding-top:calc(var(--ann) + clamp(18px,3vh,40px));
    padding-bottom:clamp(158px,20vh,196px);
  }
  .mhero .mcar{height:clamp(310px,44vh,470px);margin-top:clamp(6px,1vh,14px)}
  .mslide{padding-bottom:0}
  .mslide img{max-width:82%;max-height:calc(100% - 104px)}
  .ms-name{font-size:clamp(24px,7vw,34px)}
}

/* ── the hero shortcut ───────────────────────────────────────────────────────
   Everything else on this site asks the visitor to be patient: the film plays,
   the logo writes itself, the dock waits to be opened. That is right for a
   first visit and wrong for the second, when someone arrives already knowing
   they want a bottle. This is the one control that skips all of it, and on a
   phone it sits where a thumb already rests, so buying never starts with a
   scroll. Glass and gold rather than a slab, so it belongs to the film. */
.hero-cta{margin-top:clamp(22px,3.4vh,40px)}
.hero-buy,.cta-pill{
  display:inline-flex;align-items:center;gap:.7em;
  padding:.85em 1.7em;
  font-family:var(--label);font-weight:600;
  font-size:clamp(12px,1.05vw,14px);letter-spacing:.26em;text-transform:uppercase;
  color:#F3E2BE;text-decoration:none;white-space:nowrap;
  border:1px solid rgba(212,182,142,.5);border-radius:999px;
  background:rgba(10,9,8,.34);
  -webkit-backdrop-filter:blur(10px) saturate(120%);
          backdrop-filter:blur(10px) saturate(120%);
  box-shadow:0 2px 26px rgba(0,0,0,.38);
  transition:color .38s var(--ease),background .38s var(--ease),
             border-color .38s var(--ease),transform .38s var(--ease);
}
.hero-buy .hb-go,.cta-pill .hb-go{
  font-size:1.5em;line-height:0;transform:translateY(-.04em);
  transition:transform .38s var(--ease);
}
.hero-buy:hover,.hero-buy:focus-visible,.cta-pill:hover,.cta-pill:focus-visible{
  color:#1A1512;background:var(--gold-lo);border-color:var(--gold-lo);
  transform:translateY(-2px);
}
.hero-buy:hover .hb-go,.hero-buy:focus-visible .hb-go,.cta-pill:hover .hb-go,.cta-pill:focus-visible .hb-go{transform:translate(3px,-.04em)}
@media(max-width:640px){
  .hero-cta{margin-top:clamp(18px,2.6vh,30px)}
  .hero-buy,.cta-pill{padding:1em 1.9em;font-size:13px;letter-spacing:.22em}
}

/* ── the medal bottle, sized to be looked at ─────────────────────────────────
   It was being squeezed from both ends: the carousel was short, the slide
   reserved dock clearance out of that same short box, and then the image
   subtracted the caption on top of it. Three deductions from one small number
   left a bottle a couple of hundred pixels tall on a wide screen. The hero is
   height:auto, so the frame can simply be bigger. */
/* The hero is already a flex column, so the carousel can take the space the
   headline leaves rather than claiming a fixed slice of the viewport and
   overshooting it. A tall window gives the bottle a tall frame; a short one
   still fits, and the min-height stops it collapsing to nothing (the slides
   are absolutely positioned, so the box has no content height of its own). */
.mhero .mcar{flex:1 1 auto;height:auto;min-height:clamp(300px,40vh,560px)}
/* Clearance for the dock, measured rather than guessed: the closed bar is about
   forty pixels, so a hundred and sixty was reserving four times what it needed
   and taking it straight out of the bottle. Same for the hero's top padding,
   which was set when this section had no carousel under the headline. */
.mhero{padding-top:calc(var(--ann) + clamp(78px,10vh,120px))}
.mhero .mslide{padding-bottom:clamp(52px,6.5vh,80px)}

/* The bottle is the point of this page, so it gets the height the hero has and
   the caption stays under it, centred, the way a bottle shot should read.

   What was starving it was arithmetic, not layout: the slide reserved dock
   clearance out of an already short box and then the image subtracted a
   guessed caption height from 100%, which is the slide's WHOLE height and
   takes no account of that same padding. Two deductions from one small number.
   Flex knows both, so the image just takes what is left. */
.mhero .mslide{padding-bottom:clamp(46px,6vh,72px)}
.mhero .mslide img{
  flex:1 1 auto;min-height:0;
  width:100%;height:auto;max-width:none;max-height:none;
  object-fit:contain;
}

/* The caption stays under the bottle at every size. It was tried beside it on
   short windows, where the height really is scarce, and it read as two things
   sharing a frame rather than one bottle shot: the name wrapped, the pair sat
   off centre, and the crossfade showed two captions at once. On a short window
   the text above the bottle compresses instead, which costs a headline a few
   points and keeps the composition intact. */
@media(max-height:760px){
  .mhero h1{font-size:min(9vw,16vh)}
  .mhero .phero-lede{font-size:clamp(14px,1.55vh,16px);margin-top:.4em}
  .mhero .label{font-size:11px}
  .mhero .mcar{min-height:0}
}

/* Whatever else changes, the hero must start below the header. Trimming this
   to buy the bottle a few pixels ran "THE RECORD" straight through the logo. */
.mhero{padding-top:calc(var(--ann) + clamp(96px,11vh,128px))}
/* Every previous attempt subtracted a guessed caption height from 100%, but
   100% is the slide's whole height and takes no account of the slide's own
   bottom padding, so the deduction was always short by that amount and the
   caption fell off the end. Flex already knows both numbers: hand the image
   the leftover space with min-height:0 so it is allowed to shrink, and let
   object-fit keep the bottle's shape inside whatever is left. Nothing to
   re-tune when the padding or the caption changes. */
.mhero .mslide img{
  flex:1 1 auto;min-height:0;
  width:100%;height:auto;max-width:none;max-height:none;
  object-fit:contain;
}
@media(max-width:640px){
  .mhero .mcar{height:clamp(340px,46vh,520px)}
  .mhero .mslide{padding-bottom:0}
}

/* Ivan's note: a flat total reads like a closed book, and this one is not
   closed. Set as a small line under the number rather than inside the headline,
   which would wrap it onto two lines and cost the bottle its frame. */
.h1-run{
  display:block;margin-top:.34em;
  font-family:var(--label);font-weight:600;
  font-size:clamp(11px,1vw,14px);letter-spacing:.34em;text-transform:uppercase;
  color:#D8CCB8;opacity:.92;
}

/* Space recovery for the bottle, measured at 1600x900: the hero reserved 141px
   above and 63 below, and the slide added another 54 of dock clearance on top
   of the hero's own. That is three separate margins guarding one 40px bar. */
.mhero{padding-top:calc(var(--ann) + clamp(74px,8.5vh,102px));padding-bottom:clamp(26px,3.4vh,42px)}
.mhero h1{margin-bottom:.1em}
.mhero .phero-lede{margin-top:.55em;margin-bottom:0}
.mhero .mslide{padding-bottom:clamp(6px,1.2vh,16px);gap:clamp(10px,1.4vw,18px)}

/* Under about 700px the lede is the thing to lose. It restates the headline in
   longer words, and the two lines it costs are the difference between a bottle
   worth looking at and a thumbnail. It stays on every taller window. */
@media(max-height:700px){
  .mhero .phero-lede{display:none}
  .mhero h1{font-size:min(9vw,14vh)}
  /* clears the closed browse bar, which the caption was landing exactly on */
  .mhero .mslide{padding-bottom:clamp(30px,5vh,46px);gap:10px}
  .mhero .ms-best{font-size:13px;line-height:1.4}
  .mhero .ms-count{font-size:12px}
}

/* The awards hero carries more than the others: headline, bottle, caption and
   now the arrow. A full-length cue would eat the bottle's frame, so this one is
   drawn short. Same shape, less height. */
.mhero .scrollcue{margin-top:clamp(6px,1vh,12px)}
.mhero .scrollcue::after{height:clamp(26px,3.4vh,42px);margin-top:clamp(7px,1vh,11px)}

/* Every pixel above the bottle is one it does not get, and this hero was
   spending them three times over: a top padding set before it had a carousel,
   a headline capped only against width, and a caption on loose leading. */
.mhero{padding-top:calc(var(--ann) + clamp(62px,7.2vh,92px));padding-bottom:clamp(12px,1.6vh,22px)}
/* Capped against height, not just width. On a laptop the headline was 103px of
   a 900px screen and the bottle underneath was the thing paying for it. Still a
   statement at this size, and the bottle is half again as big for it. */
.mhero h1{font-size:min(9vw,8vh);margin-bottom:.04em}
.mhero .h1-run{margin-top:.3em}
.mhero .mslide{gap:clamp(8px,1.1vw,14px)}
.mhero .mslide figcaption{gap:5px}
.mhero .ms-count{font-size:12.5px}
.mhero .ms-best{font-size:13.5px;line-height:1.38}
.mhero .ms-name{line-height:1.02}
.awards-intro{
  max-width:56ch;margin:0 auto clamp(26px,3.4vw,44px);text-align:center;
  color:var(--dim);font-size:clamp(15px,1.15vw,17px);line-height:1.6;
}

/* The hero copy block already draws a decorative rule beneath itself. Now that
   the arrow carries its own line, the two stack up as a double stroke, so the
   older one steps aside wherever a cue is present. */
.phero-in:has(.scrollcue)::after,
.hero-in:has(.scrollcue)::after{display:none}

/* These cues sit over footage that is not always dark. The dance floor on the
   events hero is nearly white, and the gold was disappearing into it, so the
   type carries its own shadow rather than relying on the scrim behind it. */
.scrollcue span{
  text-shadow:0 1px 2px rgba(0,0,0,.85), 0 2px 14px rgba(0,0,0,.7), 0 0 34px rgba(0,0,0,.55);
}
.scrollcue::after{
  box-shadow:0 0 8px rgba(0,0,0,.6);
}

/* ── up next ─────────────────────────────────────────────────────────────────
   A page that ends in a footer is a dead end, and the browse bar only helps
   people who already know it is there. This names the next room by title
   rather than by direction, so it reads as an invitation rather than a
   navigation control, and the visitor is the one who decides to take it.
   Order matches the browse bar exactly: one spine, not two. */
.upnext{
  position:relative;display:block;overflow:hidden;
  margin:0;padding:clamp(52px,7vw,104px) clamp(24px,6vw,90px) clamp(56px,7.5vw,110px);
  text-decoration:none;isolation:isolate;
  background:#0B0A09;
  border-top:1px solid rgba(242,234,217,.1);
}
.upnext-img{
  position:absolute;inset:0;z-index:-2;
  width:100%;height:100%;object-fit:cover;
  opacity:.46;transform:scale(1.04);
  transition:opacity .8s var(--ease),transform 1.4s var(--ease);
}
.upnext::after{
  content:"";position:absolute;inset:0;z-index:-1;pointer-events:none;
  background:linear-gradient(to right,rgba(8,7,7,.94) 0%,rgba(8,7,7,.72) 46%,rgba(8,7,7,.44) 100%);
}
.upnext-lab{
  display:block;font-family:var(--label);font-weight:600;
  font-size:clamp(11px,.95vw,13px);letter-spacing:.34em;text-transform:uppercase;
  color:var(--gold-lo);margin-bottom:clamp(12px,1.4vw,20px);
}
.upnext-name{
  display:block;font-family:var(--display);font-weight:400;
  font-size:clamp(34px,5.4vw,76px);line-height:1.04;color:#F4ECDC;
  transition:color .5s var(--ease);
}
.upnext-blurb{
  display:block;max-width:44ch;margin-top:clamp(12px,1.3vw,20px);
  color:#C9BEAF;font-size:clamp(15px,1.15vw,17px);line-height:1.55;
}
.upnext-go{
  position:absolute;right:clamp(24px,5vw,80px);top:50%;transform:translateY(-50%);
  font-size:clamp(38px,4.4vw,64px);line-height:0;color:var(--gold-lo);
  transition:transform .5s var(--ease);
}
.upnext:hover .upnext-img,.upnext:focus-visible .upnext-img{opacity:.62;transform:scale(1.08)}
.upnext:hover .upnext-name,.upnext:focus-visible .upnext-name{color:#FFF6E4}
.upnext:hover .upnext-go,.upnext:focus-visible .upnext-go{transform:translate(9px,-50%)}
.upnext:focus-visible{outline:2px solid var(--gold-lo);outline-offset:-6px}
@media(max-width:640px){
  .upnext{padding-right:clamp(58px,16vw,84px)}
  .upnext-go{font-size:34px;right:20px}
  .upnext-blurb{font-size:15px}
}
@media (prefers-reduced-motion: reduce){
  .upnext-img,.upnext-name,.upnext-go{transition:none}
}

/* The page heroes were reserving 187px of dock clearance on a phone for a bar
   that is 46px when closed, and on the darker photographs that surplus reads as
   a black band between the hero and whatever follows it. Enough to clear the
   bar and breathe, no more. */
@media(max-width:640px){
  .phero{padding-bottom:clamp(78px,10vh,112px)}
}
@media(max-width:640px){
  /* The section under a hero opened with desktop-sized breathing room stacked
     on top of the hero's own, and the cue's rule is drawn for a big screen. On
     a phone the two together read as a hole rather than as space. */
  .phero + section{padding-top:clamp(38px,5.5vh,56px)}
  .phero .scrollcue::after{height:clamp(44px,6.5vh,68px);margin-top:clamp(12px,1.8vh,18px)}
}

/* The shortcut arrives rather than being there from the start: it waits out one
   pass of the montage, then rises into place. Held out of the tab order and off
   the pointer until then, so nothing invisible is clickable or focusable. */
.hero-cta{
  opacity:0;transform:translateY(16px) scale(.965);
  pointer-events:none;visibility:hidden;
  transition:opacity .8s var(--ease),transform .8s var(--ease),visibility 0s .8s;
}
.hero-cta.in{
  opacity:1;transform:none;
  pointer-events:auto;visibility:visible;
  transition:opacity .8s var(--ease),transform .8s var(--ease),visibility 0s;
}
@media (prefers-reduced-motion: reduce){
  .hero-cta{transition:opacity .3s linear,visibility 0s .3s;transform:none}
  .hero-cta.in{transition:opacity .3s linear,visibility 0s;transform:none}
}

/* ── page change ─────────────────────────────────────────────────────────────
   Only the hero fades. The header, the announcement bar and the browse bar are
   untouched, and everything below the hero is off the bottom of the screen at
   the moment of the change, so swapping it instantly is invisible. The bars
   look like they never moved because they never did.

   An animation rather than a transition, and the arriving one deliberately has
   no fill: a transition needs its class taken off at just the right moment to
   land, and if that ever failed to run the hero would sit invisible for the
   rest of the visit. An animation without fill returns the element to its own
   styles when it ends, so the worst a failure costs is the fade, never the
   picture. */
@keyframes heroFadeOut{ to{opacity:0} }
@keyframes heroFadeIn{ from{opacity:0} to{opacity:1} }
body.swapping #main > section:first-of-type{animation:heroFadeOut .26s var(--ease) forwards}
body.swapping.sw-fade-in #main > section:first-of-type{animation:heroFadeIn .36s var(--ease)}
@media (prefers-reduced-motion: reduce){
  body.swapping #main > section:first-of-type{animation:heroFadeOut .1s linear forwards}
  body.swapping.sw-fade-in #main > section:first-of-type{animation:heroFadeIn .1s linear}
}

/* The browse tab was lifted off the floor on the landing page only, which
   looked better there but is exactly what makes the bottom bar jump when you
   swipe from home to anywhere else: two pages, two heights, one visible drop.
   A bar that holds still matters more than a bar that sits prettily on one
   page, so it is back on the edge everywhere.

   To have both, it would have to be lifted on every page, and the hero clearance
   on the inner pages would need re-tuning so the scroll cue does not end up
   underneath it. Worth doing if the floating look is wanted; not worth a
   bottom bar that moves. */

/* The white flash. For the instant between the old page being cleared and the
   new one being parsed the body has no content, and the body's own background
   is the pale one the inner pages use, so it flashed white on every change.
   The moving hero made it worse by uncovering a strip of it at the edge.

   While a swap is in flight the ground goes dark, which is what every hero
   sits on anyway, so there is nothing to see through the gap. */
body.swapping{background-color:#08080A}
body.swapping #main{background-color:#08080A}

/* The chrome is rebuilt from the incoming page on every swap, so its
   transitions would replay each time: the header re-easing its padding, the
   frosted-to-solid background sliding across. Off during a swap, so the bars
   are simply already correct on the other side rather than seen adjusting. */
body.swapping #hdr,
body.swapping #announce,
body.swapping .dock,
body.swapping .dock-hint{
  transition:none !important;
  animation:none !important;
}

/* ── edge arrows ─────────────────────────────────────────────────────────────
   Barely there until you look for them. A third opacity is enough to register
   as a control without competing with the film, and they come up to full on
   hover. Fixed to the viewport rather than the page, so they stay put while you
   scroll and stay findable in the same place on every page.

   The glyph carries its own shadow because these sit over footage that is
   sometimes nearly white, and gold on a bright dance floor disappears. */
.pagearrow{
  position:fixed;top:50%;z-index:88;
  transform:translateY(-50%);
  display:flex;align-items:center;justify-content:center;
  width:clamp(38px,3.4vw,52px);height:clamp(64px,6.5vw,86px);
  color:var(--gold-lo);text-decoration:none;
  opacity:.6;
  transition:opacity .45s var(--ease),transform .45s var(--ease);
}
.pagearrow.prev{left:clamp(2px,.7vw,14px)}
.pagearrow.next{right:clamp(2px,.7vw,14px)}
.pagearrow span{
  font-size:clamp(34px,3.6vw,48px);line-height:0;
  text-shadow:0 2px 10px rgba(0,0,0,.85),0 0 28px rgba(0,0,0,.6);
}
.pagearrow:hover,.pagearrow:focus-visible{opacity:1}
.pagearrow.prev:hover,.pagearrow.prev:focus-visible{transform:translate(-4px,-50%)}
.pagearrow.next:hover,.pagearrow.next:focus-visible{transform:translate(4px,-50%)}
.pagearrow:focus-visible{outline:1px solid var(--gold-lo);outline-offset:2px;border-radius:4px}
@media(max-width:640px){
  .pagearrow{width:34px;height:56px;opacity:.65}
  .pagearrow span{font-size:30px}
  .pagearrow.prev{left:0}
  .pagearrow.next{right:0}
}
@media (prefers-reduced-motion: reduce){
  .pagearrow{transition:opacity .2s linear}
  .pagearrow.prev:hover,.pagearrow.next:hover{transform:translateY(-50%)}
}

/* The medal reel's own prev/next are off for now. It turns on its own, the edge
   arrows sit just above them, and two sets of chevrons a few pixels apart on
   the same edge asked the visitor to work out which one moved what.
   Keyboard left/right on the carousel still steps through the bottles, and the
   markup stays put, so this is one line to undo. */
.mhero .mcar-btn{display:none}

/* ── plain document page (privacy notice and anything like it) ───────────────
   Long-form legal text wants none of the cinema: a comfortable measure, real
   heading structure a screen reader can navigate by, and generous line height.
   Set on the light ground so it reads like a document rather than a mood. */
.doc{background:#0E0C0B;color:#D8CEC0;
  padding:calc(var(--ann) + clamp(104px,13vh,150px)) 0 clamp(70px,9vh,120px)}
.doc .wrap{max-width:70ch}
.doc .label{color:#D4B68E}
.doc h1{font-family:var(--display);font-weight:400;color:#F2EAD9;
  font-size:clamp(40px,6vw,78px);line-height:1.04;margin:.16em 0 .5em}
.doc h1 em{font-style:normal;color:#D4B68E}
.doc h2{font-family:var(--display);font-weight:400;color:#F2EAD9;
  font-size:clamp(22px,2.4vw,30px);line-height:1.2;margin:1.9em 0 .5em}
.doc p{margin:0 0 1.15em;font-size:clamp(16px,1.15vw,17px);line-height:1.72;color:#C9BEAF}
.doc .doc-date{font-family:var(--label);font-size:13px;letter-spacing:.14em;
  text-transform:uppercase;color:#9C8E7C;margin-bottom:2.4em}
.doc .doc-lead{border-left:2px solid #C9A66B;padding-left:clamp(16px,2vw,26px);
  margin-bottom:1.7em}
.doc .doc-lead b{color:#F2EAD9}
.doc .doc-list{margin:0 0 1.4em;padding-left:1.3em}
.doc .doc-list li{margin-bottom:.5em;font-size:clamp(16px,1.15vw,17px);line-height:1.7;color:#C9BEAF}
.doc a{color:#D4B68E;text-decoration:underline;text-underline-offset:3px}
.doc a:hover{color:#F2EAD9}
@media(max-width:640px){
  .doc{padding-top:calc(var(--ann) + clamp(84px,11vh,120px))}
  .doc .wrap{max-width:none}
}

/* ── accessibility remediation, WCAG 2.1 AA ──────────────────────────────────
   2.9 Non-text Contrast. The email field's only boundary was a hairline at
   2.17:1 against cream and 2.24:1 against the dark bands, where 3:1 is the
   requirement. Low vision visitors could read the label and not find the box.
   Set per ground rather than on the shared --line-2 token, which feeds dozens
   of purely decorative rules. */
.capture-row input{border-color:rgba(242,234,217,.45)}
.dark .capture-row input,
.phero .capture-row input{border-color:rgba(242,234,217,.45)}

/* 2.2 Contrast Minimum. The gold eyebrow over the hero photographs measured as
   low as 1.09:1 on /visit/, where 4.5:1 is required. Darkening the photo scrim
   was tried and does not work, because on a video hero every frame is a
   different background and no fixed ratio can be promised. The text block
   carries its own plate instead, which is the only version that can be stated
   honestly. Kept subtle: it reads as a deepening of the scrim, not a box. */
.phero-in{
  background:linear-gradient(to bottom,
    rgba(4,4,5,0) 0%, rgba(4,4,5,.56) 12%, rgba(4,4,5,.66) 50%,
    rgba(4,4,5,.56) 88%, rgba(4,4,5,0) 100%);
  padding:clamp(22px,3vh,44px) clamp(20px,3vw,44px);
  border-radius:3px;
}
/* the landing page's hero is the written logo, not text, so it keeps its
   clean ground; the mhero carries its own much darker treatment already */
.hero-in,.mhero-in{background:none;padding:0}

/* 2.3 Contrast Minimum on the two tasting room addresses, which are the one
   piece of text a visitor needs in order to physically reach the winery.
   Measured 1.79:1 and 2.31:1 over the barn siding. */

/* Gold at 1.09:1 was the worst reading in the audit. Two levers exist: darken
   the plate further, which starts to look like a black box over the film, or
   lighten the type. Lightening wins: measured against a pure white pixel behind
   a .66 plate this reaches 4.53:1, where the gold needed a .72 plate to pass.
   The gold stays where it earns its keep, on the dark grounds further down. */
.phero-in .label{color:#EFE3CF}
.phero-in .phero-lede{color:#EFE6D8}

/* ── motion switch ───────────────────────────────────────────────────────────
   One class stops everything the page animates: CSS keyframes (the medal rain,
   the film grain, the writing logo) pause where they stand, and transitions
   stop retiming. The videos are paused separately in script, because a video
   is not a CSS animation. */
body.no-motion *,
body.no-motion *::before,
body.no-motion *::after{
  animation-play-state:paused !important;
  transition-duration:.01ms !important;
}
.ico.motion .motion-play{display:none}
body.no-motion .ico.motion .motion-pause{display:none}
body.no-motion .ico.motion .motion-play{display:block}
.ico.motion svg path{fill:none;stroke:var(--mark);stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.ico.motion .motion-play{fill:var(--mark);stroke:var(--mark)}

/* Someone who has asked their operating system for reduced motion should not
   have to ask this site as well. */
@media (prefers-reduced-motion: reduce){
  .mk{animation:none!important}
  .grain{display:none}
}

/* The Prop 65 notice was set at 10.5px in a dim brown, the smallest and faintest
   text on the site. It is voluntary here (the regulation names the tasting room,
   the checkout and the shipment, not a marketing page) but if it is going to be
   shown at all it should be readable, and the safe harbour sentence reads better
   standing on its own than folded in with the age line. */
.f-bot .p65{font-size:12px;color:#A79A87;line-height:1.75}
.f-bot .p65 b{color:#E4DACA}

/* Holiday hours sit under the weekly ones rather than inside the list, so the
   regular pattern stays scannable and the exceptions read as exceptions. */
.hours-hol{
  margin-top:clamp(16px,2vh,24px);padding-top:clamp(14px,1.8vh,20px);
  border-top:1px solid var(--line);
  font-family:var(--label);font-size:12.5px;letter-spacing:.06em;
  line-height:1.9;color:var(--dim);
}
.hours-hol b{color:var(--gold);letter-spacing:.18em;text-transform:uppercase;font-size:11.5px}

/* ── room info blocks and club FAQ ───────────────────────────────────────────
   The old site answered the questions people phone about, dogs, kids,
   restrooms, access, walk-ins, and what a tasting costs. Those answers were
   the working part of that site, so they come back as compact lists under
   each room rather than as prose nobody scans. */
.roominfo{margin-top:clamp(20px,2.6vh,30px)}
.ri-h{font-family:var(--label);font-weight:600;font-size:11.5px;letter-spacing:.24em;
  text-transform:uppercase;color:var(--gold);margin:clamp(18px,2.2vh,26px) 0 10px}
.ri-list{list-style:none;margin:0;padding:0}
.ri-list li{padding:7px 0;border-bottom:1px solid var(--line);
  font-size:14.5px;line-height:1.55;color:var(--dim)}
.ri-list li:last-child{border-bottom:0}
.ri-list b{color:var(--cream);font-weight:600}
.clubfaq{max-width:64ch;margin:0 auto}
.clubfaq > div{padding:clamp(16px,2vh,22px) 0;border-bottom:1px solid var(--line)}
.clubfaq dt{font-family:var(--display);font-size:clamp(18px,1.6vw,22px);color:var(--cream);margin-bottom:6px}
.clubfaq dd{margin:0;color:var(--dim);line-height:1.65;font-size:15.5px}
.book-note{margin-top:14px;padding:12px 16px;border-left:2px solid var(--gold-lo);
  color:var(--dim);font-size:14px;line-height:1.6}
.pdf-line{margin-top:10px;text-align:center}
.pdf-line a{color:var(--gold-lo);font-family:var(--label);font-size:12px;
  letter-spacing:.18em;text-transform:uppercase;text-decoration:underline;text-underline-offset:4px}
.pdf-line a:hover{color:var(--cream)}

/* ── contact form ────────────────────────────────────────────────────────────
   Same discipline as the rest of the dark ground: the field border carries the
   3:1 non-text contrast the email capture row was corrected to. */
.mailform{max-width:620px;margin:0 auto}
.mf-row{margin-bottom:clamp(16px,2vh,22px)}
.mf-row label{display:block;font-family:var(--label);font-weight:600;font-size:11.5px;
  letter-spacing:.22em;text-transform:uppercase;color:var(--gold);margin-bottom:8px}
.mf-row input,.mf-row textarea{
  width:100%;padding:14px 16px;background:transparent;color:var(--cream);
  border:1px solid rgba(242,234,217,.45);border-radius:2px;
  font-family:var(--body);font-size:16px;line-height:1.5;
}
.mf-row input:focus-visible,.mf-row textarea:focus-visible{
  outline:2px solid var(--gold-lo);outline-offset:1px;border-color:var(--gold-lo)}
.mf-foot{display:flex;align-items:center;gap:18px;flex-wrap:wrap}
.mf-status{margin:0;font-size:14px;color:var(--dim)}
.mf-status.ok{color:var(--gold-lo)}

/* ── the whole cellar grid ───────────────────────────────────────────────────
   The carousel stays the shop window for the core eight; this is the cellar
   door for everything else, one tile per bottle so no wine in the shop is
   unreachable from the site. */
.cellar-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));
  gap:clamp(18px,2.4vw,34px);margin-top:clamp(30px,4vw,52px)}
.cellar-card{display:flex;flex-direction:column;align-items:center;text-align:center;
  text-decoration:none;padding:clamp(14px,1.6vw,22px) 8px;
  border:1px solid transparent;border-radius:4px;
  transition:border-color .4s var(--ease),transform .4s var(--ease)}
.cellar-card img{height:clamp(150px,17vw,230px);width:auto;object-fit:contain;
  filter:drop-shadow(0 14px 26px rgba(0,0,0,.6))}
.cellar-card .cc-name{margin-top:14px;font-family:var(--display);
  font-size:clamp(16px,1.5vw,20px);color:var(--cream);line-height:1.2}
.cellar-card .cc-vin{margin-top:3px;font-family:var(--label);font-weight:600;
  font-size:10.5px;letter-spacing:.22em;text-transform:uppercase;color:var(--gold)}
.cellar-card:hover,.cellar-card:focus-visible{border-color:rgba(212,182,142,.4);transform:translateY(-4px)}
.cellar-card:focus-visible{outline:2px solid var(--gold-lo);outline-offset:2px}
@media (prefers-reduced-motion: reduce){.cellar-card{transition:none}}

/* ── mobile tap comfort ──────────────────────────────────────────────────────
   Inline phone, email and announcement links measured 13 to 19px tall. The
   negative margin cancels the padding in layout, so nothing shifts; only the
   touchable area grows to a comfortable size. */
a[href^="tel:"],a[href^="mailto:"],
#announce a,.f-bot a{
  display:inline-block;padding:6px 2px;margin:-6px -2px;
}

/* ── socials ─────────────────────────────────────────────────────────────────
   One genuinely live feed rather than a wall of dead widgets. The cards carry
   everything that cannot legally or technically embed. */
.social-grid{display:grid;grid-template-columns:minmax(300px,500px) minmax(260px,1fr);
  gap:clamp(24px,3.5vw,56px);justify-content:center;align-items:start}
.social-live iframe{background:#0B0A09;border-radius:4px}
.social-cap{margin-top:12px;font-size:13.5px;color:var(--dim);text-align:center}
.social-cards{display:flex;flex-direction:column;gap:clamp(12px,1.6vh,18px)}
.social-card{display:block;padding:clamp(16px,2vh,24px) clamp(18px,2vw,26px);
  border:1px solid var(--line);border-radius:4px;text-decoration:none;
  transition:border-color .4s var(--ease),transform .4s var(--ease)}
.social-card:hover,.social-card:focus-visible{border-color:rgba(212,182,142,.5);transform:translateY(-2px)}
.social-card:focus-visible{outline:2px solid var(--gold-lo);outline-offset:2px}
.soc-net{display:block;font-family:var(--label);font-weight:600;font-size:10.5px;
  letter-spacing:.26em;text-transform:uppercase;color:var(--gold)}
.soc-handle{display:block;margin-top:6px;font-family:var(--display);
  font-size:clamp(18px,1.7vw,23px);color:var(--cream)}
.soc-line{display:block;margin-top:4px;font-size:13.5px;color:var(--dim)}
@media(max-width:760px){
  .social-grid{grid-template-columns:1fr}
  .social-live iframe{width:100%;height:560px}
}
@media (prefers-reduced-motion: reduce){.social-card{transition:none}}

/* the live player keeps its film shape at every width */
.social-video{position:relative;width:100%;max-width:560px;aspect-ratio:16/9;background:#0B0A09;border-radius:4px;overflow:hidden}
.social-video iframe{position:absolute;inset:0;width:100%;height:100%;border:0}

/* ── the motion switch, out of the header ────────────────────────────────────
   The owner did not want it in the navigation, and the rule only demands that
   a pause mechanism exist and be findable. It keeps its early place in the tab
   order (the markup has not moved) but paints as a quiet corner icon in the
   manner of the page arrows: a third opacity until wanted. */
.ico.motion{
  position:fixed !important;left:clamp(6px,1vw,16px);bottom:clamp(64px,9vh,96px);z-index:88;
  width:40px;height:40px;padding:0;justify-content:center;
  opacity:.34;transition:opacity .4s var(--ease);
  background:rgba(8,8,9,.55);border-radius:50%;
  -webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);
}
.ico.motion:hover,.ico.motion:focus-visible{opacity:1}
.ico.motion svg{width:18px;height:18px}
@media(max-width:640px){
  .ico.motion{bottom:auto;top:calc(var(--ann) + 8px);left:auto;right:10px;opacity:.45}
}

/* ── photo bands and the story trio ──────────────────────────────────────────
   Ashley's photography, placed. A band is one wide photograph breathing
   between sections; the trio is the story page's family album row. */
.photo-band{padding:clamp(30px,4vw,60px) 0;background:#0B0A09}
.photo-band img{display:block;width:min(1180px,92vw);margin:0 auto;
  border-radius:4px;box-shadow:0 24px 60px rgba(0,0,0,.5)}
.photo-band .pb-cap{width:min(1180px,92vw);margin:14px auto 0;text-align:center;
  font-family:var(--label);font-size:12px;letter-spacing:.2em;text-transform:uppercase;color:var(--dim)}
.photo-trio{display:grid;grid-template-columns:repeat(3,1fr);gap:clamp(10px,1.6vw,22px);
  width:min(1180px,92vw);margin:0 auto;padding:clamp(30px,4vw,60px) 0}
.photo-trio img{width:100%;height:clamp(260px,36vw,460px);object-fit:cover;
  border-radius:4px;box-shadow:0 18px 44px rgba(0,0,0,.45)}
@media(max-width:640px){
  .photo-trio{grid-template-columns:1fr}
  .photo-trio img{height:clamp(240px,60vw,340px)}
}
.ri-photo{width:100%;height:auto;border-radius:4px;margin-bottom:clamp(14px,2vh,20px);
  box-shadow:0 14px 34px rgba(0,0,0,.4)}

/* event cards carry their photographs; cover-cropped so the row stays even */
.wine .wine-thumb{width:100%;height:clamp(150px,16vw,200px);object-fit:cover;
  /* Three of the four card photos are portrait. Centering the crop cut heads
     off; biasing upward keeps faces and bottle necks in frame. */
  object-position:50% 28%;
  border-radius:3px;margin-bottom:16px;display:block}

/* the trio sits on the dark ground like everything else on his story */
.photo-trio{background:#0B0A09;width:100%;max-width:none;margin:0;
  padding:clamp(30px,4vw,60px) max(calc((100% - min(1180px,92vw))/2),4vw)}

/* two photographs sit as a pair, not three columns with a hole */
.photo-trio.duo{grid-template-columns:repeat(2,1fr)}
@media(max-width:640px){.photo-trio.duo{grid-template-columns:1fr}}

/* ── the minimal footer ──────────────────────────────────────────────────────
   Nello's ruling: the disclaimer on every page, and nothing else repeated
   everywhere. Addresses, hours, socials and the rest live on Contact and
   Visit, one tap away in the browse bar. */
.f-min{padding:0}
footer{padding:clamp(36px,4.5vh,56px) 0 40px}
.f-min .p65{max-width:72ch;font-family:var(--label);font-size:12px;
  letter-spacing:.05em;line-height:1.75;color:#A79A87}
.f-min .p65 b{color:#E4DACA}
.f-min .p65 a{color:#C9BCA6;text-decoration:underline;text-underline-offset:3px}
.f-min .f-legal{margin-top:14px;font-family:var(--label);font-size:12px;
  letter-spacing:.08em;color:#8F8474}
.f-min .f-legal a{color:#C9BCA6;text-decoration:underline;text-underline-offset:3px}
.f-min .f-legal a:hover,.f-min .p65 a:hover{color:#F2EAD9}

.dock-arrow[disabled]{pointer-events:none;opacity:0}

/* ── transcripts ─────────────────────────────────────────────────────────────
   The text alternative for each film, folded under its player. Level A media
   alternative: the spoken words plus what the screen alone shows. */
.transcript{max-width:760px;margin:18px auto 0}
.transcript summary{cursor:pointer;font-family:var(--label);font-weight:600;
  font-size:12px;letter-spacing:.22em;text-transform:uppercase;color:var(--gold-lo);
  padding:10px 0;list-style-position:inside}
.transcript summary:hover{color:var(--cream)}
.transcript summary:focus-visible{outline:2px solid var(--gold-lo);outline-offset:2px}
.transcript-body{padding:14px 18px;border-left:2px solid rgba(212,182,142,.35);
  max-height:420px;overflow-y:auto}
.transcript-body p{margin:0 0 1em;color:#C9BEAF;font-size:15px;line-height:1.7}
.transcript-body .tr-line{margin:0 0 .35em}
.tr-note{font-style:italic;color:#9C8E7C}
.media-alt{max-width:760px;margin:12px auto 0;font-size:14px}

/* Debi's line in the private tastings hero: the booking route stated on the
   first screen, so nobody has to scroll to find out who to ask. */
.phero-contact{
  margin:18px auto 0;max-width:640px;text-align:center;
  font-size:15.5px;line-height:1.7;color:#D8CCBA;
}
.phero-contact a{color:var(--gold-lo);text-decoration:none;
  border-bottom:1px solid rgba(212,182,142,.55);padding-bottom:1px;white-space:nowrap}
.phero-contact a:hover{color:#F6E9CE;border-color:#F6E9CE}
.phero-contact .sep{opacity:.5;margin:0 8px}
@media(max-width:520px){.phero-contact .sep{display:block;height:0;overflow:hidden;margin:6px 0}}

/* ── Made Members: the family album ──────────────────────────────────────────
   An ornate gold frame, photos flush to its inner edge. The frame is built
   from layered gradients: a broad gold fillet, a thin inner bead, and a
   hairline. Photos cover the frame opening completely (no letterboxing, so
   crossfades never ghost) and carry a soft vignette into the frame. */
.album{position:relative;max-width:940px;margin:0 auto;aspect-ratio:2528/1694}
.album::after{content:"";position:absolute;inset:0;z-index:3;pointer-events:none;
  background:url("/img/frame-rococo.webp?v=bdaf47d5") center/100% 100% no-repeat}
.al-frame{position:absolute;left:20.17%;right:19.30%;top:21.84%;bottom:20.31%;
  background:#0B0908;overflow:hidden;border-radius:clamp(10px,2.4vw,26px)}
.al-frame img{position:absolute;inset:0;width:100%;height:100%;
  object-fit:cover;object-position:50% 32%;
  filter:sepia(.1) saturate(1.06) contrast(1.03);
  opacity:0;transition:opacity .9s var(--ease)}
.al-frame img.on{opacity:1}
.al-frame::after{content:"";position:absolute;inset:0;z-index:1;pointer-events:none;
  background:radial-gradient(ellipse 78% 72% at 50% 46%, transparent 52%, rgba(10,7,4,.42) 100%);
  box-shadow:inset 0 0 46px rgba(10,7,4,.5)}
.al-bar{position:absolute;top:100%;left:0;right:0;
  display:flex;align-items:center;justify-content:center;gap:18px;
  margin-top:clamp(8px,1.4vw,14px)}
.al-btn{background:none;border:1px solid rgba(212,182,142,.4);color:#D8CCBA;
  font-family:var(--label);font-weight:600;font-size:12px;letter-spacing:.16em;
  text-transform:uppercase;padding:8px 14px;cursor:pointer;
  transition:border-color .3s var(--ease),color .3s var(--ease)}
.al-btn:hover{border-color:var(--gold-lo);color:var(--gold-lo)}
.al-btn:focus-visible{outline:2px solid var(--gold-lo);outline-offset:2px}
.al-count{font-family:var(--label);font-weight:600;font-size:12px;
  letter-spacing:.16em;color:#9C8E7C;min-width:64px;text-align:center}
@media(max-width:640px){.al-bar{gap:10px}.al-btn{padding:7px 10px}}

/* label sitting under its headline instead of above it (Made Members) */
.label-under{display:block;margin-top:14px}

.made-sec{background:#000;padding-bottom:clamp(100px,11vw,150px)}

/* ── the calendar deck: what Deb writes, the site shows ─────────────────────
   Rows on the dark ground with a gold date tile. The whole section stays
   hidden until the feed returns at least one entry. */
.caldeck{list-style:none;margin:0 auto;padding:0;max-width:760px}
.caldeck li{display:flex;gap:22px;align-items:flex-start;
  padding:22px 6px;border-bottom:1px solid rgba(242,234,217,.14)}
.caldeck li:first-child{border-top:1px solid rgba(242,234,217,.14)}
.cal-date{flex:0 0 64px;text-align:center;border:1px solid rgba(212,182,142,.4);
  padding:9px 0 11px}
.cal-date b{display:block;font-family:var(--label);font-weight:600;font-size:11px;
  letter-spacing:.22em;text-transform:uppercase;color:var(--gold-lo)}
.cal-date span{display:block;font-family:var(--brand);font-size:30px;line-height:1.1;
  color:var(--cream);margin-top:2px}
.cal-body h3{font-family:var(--brand);font-weight:400;font-size:clamp(19px,2.2vw,24px);
  color:var(--cream);margin:0 0 6px}
.cal-meta{font-family:var(--label);font-weight:500;font-size:11.5px;letter-spacing:.18em;
  text-transform:uppercase;color:var(--dim);margin:0}
.cal-desc{color:#C9BEAF;font-size:15px;line-height:1.65;margin:8px 0 0;max-width:56ch}
.cal-body a.cal-link{color:var(--gold-lo);text-decoration:none;
  border-bottom:1px solid rgba(212,182,142,.55);padding-bottom:1px;
  font-family:var(--label);font-weight:600;font-size:11.5px;letter-spacing:.18em;
  text-transform:uppercase}
.cal-body a.cal-link:hover{color:#F6E9CE;border-color:#F6E9CE}
@media(max-width:520px){.caldeck li{gap:14px}.cal-date{flex-basis:54px}.cal-date span{font-size:24px}}

/* On a phone each card is full width, so a 150px strip crops a portrait photo
   to a letterbox. A 3:2 window is kind to faces and still keeps cards short
   enough to scan. */
@media(max-width:560px){
  .wine .wine-thumb{height:auto;aspect-ratio:3/2}
}

/* the line that holds the calendar's place until Deb posts something */
.cal-empty{max-width:640px;margin:0 auto;text-align:center;color:#9C8E7C;
  font-size:15px;line-height:1.7}
.cal-empty a{color:var(--gold-lo);text-decoration:none;
  border-bottom:1px solid rgba(212,182,142,.5)}

/* ── the calendar: a real month grid ────────────────────────────────────────
   Live music is standing knowledge (Fri, Sat, Sun) so it is drawn in from the
   start. Anything Deb posts overlays on top. Tapping a day says what is on. */
.calbox{max-width:680px;margin:clamp(26px,4vw,44px) auto 0;
  border:1px solid rgba(242,234,217,.16);padding:clamp(14px,2.4vw,24px)}
.cal-nav{display:flex;align-items:center;justify-content:space-between;gap:12px;
  margin-bottom:clamp(12px,2vw,18px)}
.cal-title{font-family:var(--brand);font-weight:400;font-size:clamp(19px,2.6vw,25px);
  color:var(--cream);margin:0;text-align:center;flex:1}
.cal-arrow{background:none;border:1px solid rgba(212,182,142,.4);color:var(--gold-lo);
  width:40px;height:40px;font-size:20px;line-height:1;cursor:pointer;
  transition:border-color .3s var(--ease),color .3s var(--ease)}
.cal-arrow:hover{border-color:var(--gold-lo);color:#F6E9CE}
.cal-arrow:focus-visible{outline:2px solid var(--gold-lo);outline-offset:2px}
.cal-dow{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:4px}
.cal-dow span{text-align:center;font-family:var(--label);font-weight:600;font-size:10.5px;
  letter-spacing:.12em;text-transform:uppercase;color:var(--dim);padding-bottom:6px}
.cal-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}
.cal-cell{position:relative;aspect-ratio:1;background:rgba(242,234,217,.03);
  border:1px solid transparent;color:#C9BEAF;font-family:var(--label);font-size:13px;
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;
  cursor:default;padding:0;transition:background .25s var(--ease),border-color .25s var(--ease)}
.cal-cell.blank{background:none}
.cal-cell.has{cursor:pointer;color:var(--cream)}
.cal-cell.has:hover{background:rgba(242,234,217,.09);border-color:rgba(212,182,142,.4)}
.cal-cell:focus-visible{outline:2px solid var(--gold-lo);outline-offset:-2px}
.cal-cell.today{border-color:rgba(212,182,142,.55)}
.cal-cell.on{background:rgba(212,182,142,.16);border-color:var(--gold-lo)}
.cal-dots{display:flex;gap:3px;height:6px;align-items:center}
.cal-dots i{width:5px;height:5px;border-radius:50%;display:block}
.k-music,.cal-dots i.m{background:#8FA98C}
.k-event,.cal-dots i.e{background:var(--gold-lo)}
.cal-legend{display:flex;gap:20px;justify-content:center;margin-top:14px;
  font-family:var(--label);font-size:11px;letter-spacing:.12em;text-transform:uppercase;color:var(--dim)}
.cal-legend span{display:flex;align-items:center;gap:7px}
.cal-legend i{width:7px;height:7px;border-radius:50%;display:block}
.cal-day{margin-top:clamp(14px,2vw,20px);padding-top:clamp(14px,2vw,20px);
  border-top:1px solid rgba(242,234,217,.14);min-height:64px}
.cal-day h4{font-family:var(--brand);font-weight:400;font-size:18px;color:var(--cream);margin:0 0 10px}
.cal-day ul{list-style:none;margin:0;padding:0}
.cal-day li{padding:7px 0;color:#C9BEAF;font-size:15px;line-height:1.55}
.cal-day li b{color:var(--cream);font-weight:400;font-family:var(--brand);font-size:16.5px}
.cal-day .when{font-family:var(--label);font-size:11px;letter-spacing:.14em;
  text-transform:uppercase;color:var(--dim);display:block;margin-top:2px}
.cal-day a{color:var(--gold-lo);text-decoration:none;border-bottom:1px solid rgba(212,182,142,.5);
  font-family:var(--label);font-size:11.5px;letter-spacing:.14em;text-transform:uppercase}
.cal-day a:hover{color:#F6E9CE}
.cal-day .none{color:var(--dim);font-size:15px}
@media(max-width:520px){
  .cal-cell{font-size:12px}
  .cal-dow span{font-size:9.5px;letter-spacing:.06em}
  .calbox{padding:12px 10px}
}

/* The events page ran long: hero, schedule, calendar and cards each claimed a
   full section's worth of air. These three tighten toward each other so the
   page reads as one stretch instead of four. */
.cal-sec{padding-top:clamp(26px,3vw,44px)}
.cal-sec .sec-head{margin-bottom:clamp(12px,1.6vw,20px)}
.calbox{margin-top:clamp(14px,2vw,22px)}
.cal-cell{aspect-ratio:auto;min-height:clamp(38px,7vw,54px)}
.cal-day{min-height:0}
/* the weekly tally sits right on top of the calendar now, so it gives up its
   trailing space rather than stacking two full paddings */
.cal-sec + section, section:has(> .wrap > .tally) + .cal-sec{padding-top:clamp(20px,2.4vw,34px)}
@media(max-width:560px){
  .cal-sec{padding-top:20px;padding-bottom:26px}
  .cal-cell{min-height:40px;font-size:12px;gap:2px}
  .calbox{padding:10px 8px}
  .cal-legend{margin-top:10px;gap:16px}
}

/* The events page was five screens of scrolling. Two blocks carried most of
   it: the weekly tally, which is four numbers in a full section's worth of
   air, and the four cards, which stacked one per screen on a phone. */
section:has(> .wrap > .tally){padding-top:clamp(30px,3.4vw,50px);padding-bottom:clamp(24px,3vw,40px)}
section:has(> .wrap > .tally) .sec-head{margin-bottom:clamp(14px,2vw,24px)}
.tally div{padding:clamp(16px,2.2vw,26px) 12px}
@media(max-width:560px){
  /* two across instead of one: the deck stops being its own scroll journey */
  .wines{grid-template-columns:repeat(2,1fr);gap:8px}
  .wine{padding:12px 12px 16px}
  .wine .wine-thumb{aspect-ratio:4/3}
  .wine h3{font-size:17px;margin-bottom:5px}
  .wine p{font-size:13.5px;line-height:1.5}
  .wine .go{font-size:10.5px;letter-spacing:.12em}
  section:has(> .wrap > .tally){padding-top:26px;padding-bottom:22px}
  .tally div{padding:14px 8px}
  .tally dd{font-size:clamp(26px,7vw,34px)}
}

/* Header icons were a flat 21px, which disappears on a large phone. */
@media(max-width:900px){
  .ico svg,.ico .bars{width:clamp(22px,6.2vw,27px)!important;height:clamp(22px,6.2vw,27px)!important}
  .ico{min-width:clamp(40px,11vw,50px)}
  .ico .bars i{height:2px}
}
