/* ---------------------------------------------------------------------------
   THE TWO ICONS THIS SITE USES, DRAWN RATHER THAN LOADED.

   Font Awesome was three stylesheets and about 30KB on EVERY page for exactly
   two glyphs: a telephone and a right arrow. CLAUDE.md has said so for weeks -
   "Font Awesome is loaded for exactly one arrow and one telephone" - and this
   is that note acted on.

   A MASK, NOT A BACKGROUND IMAGE, so the glyph takes its colour from `color`
   the way a font does. Every rule that used to say `.fas{color:...}` keeps
   working with only its selector renamed, because currentColor is what the mask
   paints. That matters here: the telephone is green on a transparent pill and
   ink on a gold one, and hands back to ink on hover, and all of that was
   already written as colour.

   Sized in em for the same reason - the existing `font-size:.9em` and `.82em`
   rules that tuned the glyph against its label still apply.

   The phone is the artwork Carter supplied, 24x24 single path; the arrow is
   drawn to the same box. No icon font, no third-party request, no FA4 shim.
   ------------------------------------------------------------------------ */
.hat-ico{
  display:inline-block;
  width:1em;
  height:1em;
  flex:none;
  background-color:currentColor;
  -webkit-mask-repeat:no-repeat;  mask-repeat:no-repeat;
  -webkit-mask-position:center;   mask-position:center;
  -webkit-mask-size:contain;      mask-size:contain;
  /* An icon is not text: no baseline shift from the line it sits on, and not
     selectable. */
  vertical-align:-0.125em;
  user-select:none;
}
.hat-ico--phone{-webkit-mask-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M2.00589%204.54166C1.905%203.11236%203.11531%202%204.54522%202H7.60606C8.34006%202%209.00207%202.44226%209.28438%203.1212L10.5643%206.19946C10.8761%206.94932%2010.6548%207.81544%2010.0218%208.32292L9.22394%208.96254C8.86788%209.24798%208.74683%209.74018%208.95794%2010.1448C10.0429%2012.2241%2011.6464%2013.9888%2013.5964%2015.2667C14.008%2015.5364%2014.5517%2015.4291%2014.8588%2015.0445L15.6902%2014.003C16.1966%2013.3687%2017.0609%2013.147%2017.8092%2013.4594L20.8811%2014.742C21.5587%2015.0249%2022%2015.6883%2022%2016.4238V19.5C22%2020.9329%2020.8489%2022.0955%2019.4226%2021.9941C10.3021%2021.3452%202.65247%2013.7017%202.00589%204.54166Z%22%20fill%3D%22%23000%22%2F%3E%3C%2Fsvg%3E");mask-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M2.00589%204.54166C1.905%203.11236%203.11531%202%204.54522%202H7.60606C8.34006%202%209.00207%202.44226%209.28438%203.1212L10.5643%206.19946C10.8761%206.94932%2010.6548%207.81544%2010.0218%208.32292L9.22394%208.96254C8.86788%209.24798%208.74683%209.74018%208.95794%2010.1448C10.0429%2012.2241%2011.6464%2013.9888%2013.5964%2015.2667C14.008%2015.5364%2014.5517%2015.4291%2014.8588%2015.0445L15.6902%2014.003C16.1966%2013.3687%2017.0609%2013.147%2017.8092%2013.4594L20.8811%2014.742C21.5587%2015.0249%2022%2015.6883%2022%2016.4238V19.5C22%2020.9329%2020.8489%2022.0955%2019.4226%2021.9941C10.3021%2021.3452%202.65247%2013.7017%202.00589%204.54166Z%22%20fill%3D%22%23000%22%2F%3E%3C%2Fsvg%3E")}
.hat-ico--arrow{-webkit-mask-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M13.05%204.55%2020.5%2012l-7.45%207.45-1.42-1.4%205.03-5.05H3.5v-2h13.16l-5.03-5.05z%22%20fill%3D%22%23000%22%2F%3E%3C%2Fsvg%3E");mask-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M13.05%204.55%2020.5%2012l-7.45%207.45-1.42-1.4%205.03-5.05H3.5v-2h13.16l-5.03-5.05z%22%20fill%3D%22%23000%22%2F%3E%3C%2Fsvg%3E")}

/* The hero's telephone is an Elementor Button widget, so there is no element of
   ours to hang a class on. Its icon control went with the Font Awesome
   dependency and the glyph is drawn here instead.

   ALIGN-SELF AND A MARGIN, BOTH OF THEM NEEDED, and the first cut had neither.
   The button is display:flex but its align-items computes to `normal`, which
   behaves as stretch; a flex item with an explicit height cannot stretch, so it
   falls to flex-start and the telephone sat at the TOP of a 58px button while
   the label sat centred. And the gap is `normal`, not the 9px that
   .hat-telbtn carries - that is a different class on different markup - so the
   glyph also had nothing between it and the text. */
.hat-telpill .elementor-button::before{
  content:"";
  display:inline-block;
  width:.95em;
  height:.95em;
  flex:none;
  align-self:center;
  margin-right:9px;
  background-color:var(--green-text);
  -webkit-mask:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M2.00589%204.54166C1.905%203.11236%203.11531%202%204.54522%202H7.60606C8.34006%202%209.00207%202.44226%209.28438%203.1212L10.5643%206.19946C10.8761%206.94932%2010.6548%207.81544%2010.0218%208.32292L9.22394%208.96254C8.86788%209.24798%208.74683%209.74018%208.95794%2010.1448C10.0429%2012.2241%2011.6464%2013.9888%2013.5964%2015.2667C14.008%2015.5364%2014.5517%2015.4291%2014.8588%2015.0445L15.6902%2014.003C16.1966%2013.3687%2017.0609%2013.147%2017.8092%2013.4594L20.8811%2014.742C21.5587%2015.0249%2022%2015.6883%2022%2016.4238V19.5C22%2020.9329%2020.8489%2022.0955%2019.4226%2021.9941C10.3021%2021.3452%202.65247%2013.7017%202.00589%204.54166Z%22%20fill%3D%22%23000%22%2F%3E%3C%2Fsvg%3E") center/contain no-repeat;
  mask:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%3E%3Cpath%20d%3D%22M2.00589%204.54166C1.905%203.11236%203.11531%202%204.54522%202H7.60606C8.34006%202%209.00207%202.44226%209.28438%203.1212L10.5643%206.19946C10.8761%206.94932%2010.6548%207.81544%2010.0218%208.32292L9.22394%208.96254C8.86788%209.24798%208.74683%209.74018%208.95794%2010.1448C10.0429%2012.2241%2011.6464%2013.9888%2013.5964%2015.2667C14.008%2015.5364%2014.5517%2015.4291%2014.8588%2015.0445L15.6902%2014.003C16.1966%2013.3687%2017.0609%2013.147%2017.8092%2013.4594L20.8811%2014.742C21.5587%2015.0249%2022%2015.6883%2022%2016.4238V19.5C22%2020.9329%2020.8489%2022.0955%2019.4226%2021.9941C10.3021%2021.3452%202.65247%2013.7017%202.00589%204.54166Z%22%20fill%3D%22%23000%22%2F%3E%3C%2Fsvg%3E") center/contain no-repeat;
}

/* ============================================================================
   Hattricks. The ONLY stylesheet.
   Everything here is something Elementor cannot express. If a rule below could
   have been a Kit value or a widget control, it is in the wrong place.
   ========================================================================= */

:root{
  --gold:#e0ae1f;        /* UI gold. Buttons, marquee, type on dark. Never text on cream (1.79). */
  --gold-logo:#f8cc00;   /* The wordmark only. */
  --green:#009c3b;       /* Shamrock. Fills and badges, always with ink on it (5.1). */
  --green-text:#0f6b32;  /* Green as words on cream (5.93). Never a fill. */
  --green-dark:#003119;  /* Tavern green. Dark bands, header, footer. */
  --ink:#141414;
  --cream:#f7f2e6;
  --bone:#ece5d5;
  /* PAPER IS THE CARD COLOUR. See the surface rule below.

     Added 2026-08-24 on the argument that the light end had no room, because
     cream to bone and cream to white are both 1.12. The first half is true and
     the conclusion was not: measured 2026-08-25, cream to PAPER is 1.082, a
     SMALLER step than either. Paper never added room to a cream ground; what it
     adds is a strong step off a BONE one, 1.215, the largest the light end has.
     That is why the rule below puts cards on bone wherever it has the choice.
     Mirrors hat-paper in the kit, the same way --cream mirrors hat-cream. Keep
     the two in step: tools/set-kit-colors.php is the other half. */
  --paper:#fdfbf8;
  /* The face tokens are prefixed because Elementor 4 sets --display:flex on every
     flexbox container. A token named --display therefore resolves to "flex"
     inside any container, and font-family:var(--display) silently renders in a
     fallback face. Do not rename these back. */
  --face-display:'Big Shoulders Display',Impact,'Arial Narrow',sans-serif;
  --face-ui:'Barlow Semi Condensed',-apple-system,BlinkMacSystemFont,'Helvetica Neue',Arial,sans-serif;

  /* The traced mark, as a mask rather than an image, so its colour still comes
     from the palette instead of being baked into a file. Used by the Locations
     pill and the mobile picker row, both of which are Button widgets: Elementor's
     icon control only accepts a custom SVG when unfiltered uploads are enabled,
     and they are off on this install. */
  --mark-shamrock:url('../img/shamrock-traced.svg');

  /* What the chrome takes out of a mobile viewport, so the hero can fill exactly
     what is left rather than running under it.
     Measured at 390 on 2026-08-20: header bar 88.7 + picker row 42.6 + jersey 7
     = 138.3, and the sticky order bar 49. RE-MEASURE IF THE HEADER CHANGES; these
     are the only two numbers in this file that describe another element's size. */
  --hat-chrome-top:138px;
  --hat-chrome-bottom:49px;
}

/* ---------------------------------------------------------------------------
   THE SURFACE RULE. Decided 2026-08-25. Three light values, one job each.

     BANDS ALTERNATE.        bone and cream are bands. Never a card.
     CARDS ARE PAPER.        paper is a card. Never a band.
     INSIDE A CARD IS BONE.  a card is a raise; a thing inside one is not a
                             second raise, so it steps back down.

   A card is anything that paints its own light background on top of a band.
   That is a mechanical test: a photograph is not a card, text on the band is
   not a card, and an OUTLINE CONTROL is not a card. Controls are governed by
   the button vocabulary instead, which is why .hat-locmodal__pick is
   transparent with an ink border and a press hover rather than a fill.

   Because paper is the top rung, a card is always the lightest thing on the
   page, so "forward is lighter" holds with no exceptions and no flip rule.
   Four rules of the form `.hat-band-cream .hat-thing{background:var(--bone)}`
   were deleted on 2026-08-25 for exactly that reason.

   The steps are deliberately unequal: 1.215 on a bone band, 1.082 on a cream
   one. The ink border is what separates a card in both cases, 2px to 4px of
   it; the tone is the second cue and not the only one. Where a band carries
   cards and has NO alternation to honour it takes bone, which is why
   .hat-locindex is bone rather than cream. That is a preference and not a law:
   .hat-contact__body is the one waiver, cream to match its own head, and the
   reason is written where it lives.

   A CARD THAT CONTAINS AN EYEBROW MUST SET --secbg TO ITS OWN COLOUR.
   .hat-rule-eyebrow > * paints var(--secbg,var(--cream)) to knock a hole in
   its rule line, and --secbg is declared by the BAND. Left alone, an eyebrow
   inside a paper card paints a cream patch on it.

   NOT a card, and deliberately unchanged: .hat-slide, which is the same width
   as the .hat-promos band it sits in and is therefore that band's content
   rather than a card on it. Nothing to separate.
   ------------------------------------------------------------------------ */

/* ---------------------------------------------------------------------------
   Body text colour.

   The mockup's body is `color:var(--ink)`. Hello Elementor's reset sets #333 and
   the kit cannot override it: Site Settings > Typography carries Body TYPOGRAPHY,
   link colours and H1 to H6, and the only kit control with a {{WRAPPER}} colour
   selector is body_background_color. Checked against the kit's own control
   registry on 2026-08-20, not from memory. So this is the one place it can live.

   The kit's own body typography (face, size, weight, line-height) is NOT here.
   That is a global value and it belongs in the kit.
   ------------------------------------------------------------------------ */
body{color:var(--ink)}

/* ---------------------------------------------------------------------------
   Button press-in hover.
   The Kit carries fill, border, radius, shadow and typography, and clears the
   shadow on hover. It has no transform control, and setting Advanced > Transform
   per widget would be a manual operation on every button on the site. One shared
   selector is both cheaper and cached sitewide, so it stays here.
   ------------------------------------------------------------------------ */
.elementor-button{
  transition:transform .09s ease, box-shadow .09s ease;
}
.elementor-button:hover{
  transform:translate(3px,3px);
}
/* The mockup's .btn.sm carries a 2px shadow, so it presses 2px. At the shared
   3px it overshoots its own shadow by a pixel and reads as a slide rather than
   a press. */
.hat-btn-sm .elementor-button:hover{
  transform:translate(2px,2px);
}

/* ---------------------------------------------------------------------------
   Band classes. A section declares its ground once, and anything inside that
   needs to match it reads --secbg rather than restating a colour.

   Apply to a section container via Advanced > CSS Classes. Set the container's
   own background from the matching Global Color, so the class and the control
   agree; the class carries the variable, not the paint.
   ------------------------------------------------------------------------ */
.hat-band-cream{--secbg:var(--cream)}
.hat-band-bone {--secbg:var(--bone)}
.hat-band-dark {--secbg:var(--green-dark)}
.hat-band-gold {--secbg:var(--gold)}

/* ---------------------------------------------------------------------------
   Hero. Mockup 169-190.

   The container controls carry the photograph, the min-height, the padding and
   the centring. Three things they cannot carry:

   The scrim is a THREE stop gradient, 0 / 42% / 100%. Elementor's background
   overlay gradient has two stops, so it cannot express the mid point that keeps
   the headline legible without darkening the whole photo.

   The eyebrow's shadow is two layers. The widget's text-shadow control is one.
   Gold is the palette's weakest colour over an image and this is the only hero
   text without a shadow of its own, so both layers matter.

   The sub's measure is 62ch. Elementor's width control has no ch unit.
   ------------------------------------------------------------------------ */
.hat-hero{background-color:var(--ink)}
/* svh, not vh. On a phone vh measures the LARGE viewport, the one you only get
   once the browser chrome has scrolled away, so 88vh was more than a screenful
   of what you can actually see while the chrome is up. svh measures the small
   viewport. The vh line stays first as the fallback for anything that does not
   know svh. */
.hat-hero{min-height:min(88vh,760px)}
.hat-hero{min-height:min(88svh,760px)}
@media(max-width:980px){
  /* On mobile the hero fills exactly what is left of the screen, rather than a
     percentage of it. 88% of the viewport plus a 138px header plus a 49px sticky
     bar came to 86px more than the screen, which pushed the rating badge under
     the fold: the badge is pinned to the hero's bottom, so if the hero ends
     off-screen the badge does too. */
  .hat-hero{min-height:calc(100svh - var(--hat-chrome-top) - var(--hat-chrome-bottom))}
}
.hat-hero::before{
  content:"";position:absolute;inset:0;z-index:1;pointer-events:none;
  background:linear-gradient(180deg,rgba(0,0,0,.62) 0%,rgba(0,0,0,.34) 42%,rgba(0,0,0,.72) 100%);
}
/* 15px and .2em, not the kit's 14.5px hat-eyebrow: the mockup steps the hero's
   up, and a preset that exists for one use is worse than a class.

   Targeted at the title element, not the widget wrapper. Elementor's Heading
   widget wraps its text and sets `.elementor-heading-title{line-height:1}`, so a
   line-height on the wrapper is inherited and then overridden: the eyebrow
   measured 15px tall where the mockup's is 24. Same reason the section rule
   eyebrow below targets its child. */
.hat-hero__eyebrow .elementor-heading-title{
  font-size:15px;font-weight:700;letter-spacing:.2em;text-transform:uppercase;
  line-height:1.6;margin:0 0 10px;
  text-shadow:0 1px 10px rgba(0,0,0,.8),0 0 26px rgba(0,0,0,.55);
}
/* Measure on the paragraph, spacing on the widget. Elementor pins the widget to
   max-width:100% with more specificity than a single class, so a measure set on
   the wrapper is silently dropped; and it resets the paragraph's own margins, so
   spacing set there never appears. The wrapper is a flex item, whose margins do
   not collapse, which is why the pair works. */
.hat-hero__sub p{max-width:62ch;margin:0 auto}
/* Three selectors, and margin-block-end named explicitly, for one reason: the
   kit's widget spacing emits
       .elementor-widget:not(:last-child){margin-block-end:0}
   in post-2141.css. That is (0,2,0), the same as a two-class rule, and it uses
   the LOGICAL property, so a physical `margin-bottom` at equal specificity loses
   on source order. The symptom is a top margin that applies and a bottom margin
   that does not, which reads like a collapse bug and is not one.
   Expect this on every section, not just here. */
.hat-hero .hat-hero__sub.elementor-widget{margin:18px 0 26px;margin-block-end:26px}
/* The mockup's buttons carry `margin:0 10px 10px 0`, so the row is 10px taller
   than the buttons. Without it the whole hero block centres 5px high. */
.hat-hero__ctas{margin-bottom:10px}
@media(max-width:760px){
  /* At 13px/.22em the eyebrow wrapped and split "South Tampa" over two lines. */
  .hat-hero__eyebrow .elementor-heading-title{font-size:13px;letter-spacing:.11em}
}

/* ---------------------------------------------------------------------------
   Shop. Mockup 328-335. Grid, reflow at 820.

   The merch shot is 3:4 portrait. Without a ratio it drives the row height and
   the section grows far taller than its copy column.
   ------------------------------------------------------------------------ */
.hat-shop > .e-con-inner{display:grid;grid-template-columns:1fr 1fr;gap:44px;align-items:center}
.hat-shop__copy{align-self:center}
.hat-shop__ph{
  align-self:center;
  border:4px solid var(--ink);border-radius:20px;overflow:hidden;aspect-ratio:1/1;
}
.hat-shop__ph img{width:100%;height:100%;object-fit:cover;object-position:center 62%;display:block}
.hat-shop__p p{margin:0;max-width:40ch;color:#5d574a}
.hat-shop .hat-shop__p.elementor-widget{margin-block-end:16px}
.hat-shop .hat-shop__p.elementor-widget{margin-block-start:16px}
.hat-shop .hat-shop__btn.elementor-widget{margin-block-end:10px}
@media(max-width:820px){
  .hat-shop > .e-con-inner{grid-template-columns:1fr;gap:26px}
}

/* ---------------------------------------------------------------------------
   Instagram row. Mockup 336-348.

   A scroller, not a grid: it overflows on purpose and snaps. The scrollbar is
   hidden because the tiles themselves are the affordance.
   ------------------------------------------------------------------------ */
/* flex-direction too, not just display: an Elementor container defaults to a
   COLUMN, so display:flex alone left eight full-width tiles stacked vertically
   and the section 2931px tall. */
.hat-igcar.e-con{
  display:flex;flex-direction:row;gap:6px;
  /* nowrap, and it matters only on mobile: Elementor sets --flex-wrap-mobile to
     wrap on every container, so below the tablet breakpoint the eight tiles
     wrapped into four rows and the carousel became a grid. */
  flex-wrap:nowrap;
  overflow-x:auto;scroll-snap-type:x mandatory;
  scrollbar-width:none;-ms-overflow-style:none;
}
.hat-igcar.e-con::-webkit-scrollbar{display:none}
/* THE SHORTCODE'S WRAPPERS ARE TRANSPARENT TO THE ROW.
   .hat-igcar is the flex row and .hat-igcar__cell has to be a DIRECT child of
   it. [hat_instagram] arrives inside Elementor's two widget wrappers, which
   would make every tile a grandchild and collapse the row into one block.
   display:contents removes the boxes from the layout while keeping their
   children, which is exactly what is wanted and costs nothing: neither wrapper
   paints a background, a border or a shadow, so there is nothing to lose. */
.hat-igcar > .elementor-widget-shortcode,
.hat-igcar > .elementor-widget-shortcode > .elementor-widget-container,
/* THREE wrappers, not two. Elementor's Shortcode widget adds .elementor-shortcode
   inside the widget container, so a rule that stopped at two left the tiles one
   level down and the row still closed over a single block. */
.hat-igcar > .elementor-widget-shortcode .elementor-shortcode{
  display:contents;
}

/* A live tile is an <a>, and .elementor a{box-shadow:none} is (0,1,1), so
   anything styling it needs two classes. Nothing here needs a shadow; this is
   only to keep the link from picking up the theme's underline and colour. */
.hat-igcar .hat-igcar__cell{
  display:block;
  text-decoration:none;
}

.hat-igcar__cell{
  flex:0 0 clamp(230px,23vw,320px);aspect-ratio:1/1;overflow:hidden;
  scroll-snap-align:start;border:4px solid var(--ink);border-radius:14px;background:var(--ink);
}
.hat-igcar__cell img{width:100%;height:100%;object-fit:cover;transition:transform .5s ease;display:block}
.hat-igcar__cell:hover img{transform:scale(1.05)}
.hat-ig__head{margin-bottom:24px}
@media(max-width:760px){
  /* 230 was the clamp floor, so a 390px screen showed one and a half tiles. 158
     shows two and a half, which is what tells you the row scrolls without a
     "swipe" label saying so. */
  .hat-igcar.e-con{gap:5px}
  .hat-igcar{padding-left:16px;padding-right:16px}
  .hat-igcar__cell{flex:0 0 158px}
}

/* ---------------------------------------------------------------------------
   The story, and the seal. Mockup 316-327.

   Grid again, and again because the reflow is at 900px.

   The seal hangs off the top edge of the band and must not intercept clicks,
   hence pointer-events:none on the rail.
   ------------------------------------------------------------------------ */
.hat-story > .e-con-inner{
  display:grid;grid-template-columns:1.05fr 1fr;gap:52px;align-items:center;
}
/* align-self, because a grid item stretches by default: the collage was taking
   the row's full height instead of centring its 403px against the copy. */
.hat-collage{position:relative;align-self:center}
.hat-collage img{border:6px solid var(--cream);border-radius:16px;display:block}
.hat-collage__p1{width:78%}
.hat-collage__p2{width:56%;position:absolute;right:0;bottom:0}
.hat-story__copy{align-self:center}
.hat-story__p p{margin:0;color:rgba(247,242,230,.86)}
/* The mockup's rhythm here is three separate things: an 18px lead-in on the FIRST
   paragraph only, the global `p{margin:0 0 16px}` under both, and 8px on the
   button. Setting 18 above every paragraph and nothing below them made the copy
   column 14px short, which then stopped the collage centring against it. */
.hat-story .hat-story__p.elementor-widget{margin-block-end:16px}
.hat-story .hat-story__p--lead.elementor-widget{margin-block-start:18px}
/* 8 above from the mockup's inline style, 10 below from `.btn{margin:0 10px 10px 0}`.
   The 10 is what makes the copy column 422 rather than 412, which is in turn what
   the collage centres against. */
.hat-story .hat-story__btn.elementor-widget{margin-block-start:8px;margin-block-end:10px}
/* The rail is absolute against the band, which Elementor already makes relative. */
.hat-sealrail{
  position:absolute;top:-79px;left:0;right:0;z-index:20;pointer-events:none;
  max-width:1240px;margin:0 auto;
}
/* The seal is an HTML widget, and a widget is a block child that fills its
   parent, so justify-content on the rail moved nothing and the seal sat at the
   left. An auto left margin moves the widget itself. */
.hat-sealrail > *{margin-left:auto;width:max-content}
.hat-sealrail .seal{width:158px;height:auto;display:block}
@media(max-width:900px){
  .hat-story > .e-con-inner{grid-template-columns:1fr;gap:34px}
  .hat-sealrail{top:-56px}
  .hat-sealrail .seal{width:112px}
}

/* ---------------------------------------------------------------------------
   The kitchen and the bar. Mockup 302-315.

   A grid rather than container controls for the same reason as sports: the
   reflow is at 820px, which is neither of Elementor's breakpoints.

   The mobile hide is a media query and NOT Elementor's per-widget mobile
   visibility, which was the original instruction. Elementor's mobile breakpoint
   is 767 and this grid drops to two columns at 820, so hiding at 767 would leave
   53px of viewport showing eight cells in two columns: four rows, and roughly
   double the section height. The hide has to happen at the same width as the
   reflow.
   ------------------------------------------------------------------------ */
/* On the container itself, not on .e-con-inner: a FULL width container has no
   inner wrapper, its children are direct. A boxed one does, which is why the
   sports row targets the inner and this does not. And .e-con in the selector
   because Elementor sets display from a variable on that class, so a bare
   one-class rule only wins on source order. */
.hat-foodgrid.e-con{display:grid;grid-template-columns:repeat(4,1fr);gap:6px}
.hat-food__cell{
  aspect-ratio:1/1;overflow:hidden;background:var(--ink);
  border:4px solid var(--ink);border-radius:14px;
}
.hat-food__cell img{width:100%;height:100%;object-fit:cover;transition:transform .5s ease}
.hat-food__cell:hover img{transform:scale(1.05)}
.hat-food__head{margin-bottom:30px}
/* The 10px is the mockup's `.btn{margin:0 10px 10px 0}` again: the row is 10px
   taller than the buttons, and without it the section is 10px short. */
.hat-food__ctas{margin-top:34px;padding-bottom:10px}
@media(max-width:820px){
  .hat-foodgrid.e-con{grid-template-columns:repeat(2,1fr)}
  .hat-foodgrid{padding-left:16px;padding-right:16px}
  .hat-food__cell:nth-child(n+5){display:none}
}

/* ---------------------------------------------------------------------------
   Sports. Mockup 270-287.

   The row is a grid here rather than a container control, and deliberately: the
   columns are 1fr 1.55fr 1fr, and the responsive rule reflows at 900px, which is
   neither of Elementor's breakpoints. Half of this layout has to be a media
   query whatever happens, so keeping both halves together beats splitting one
   layout across a control and a stylesheet.
   ------------------------------------------------------------------------ */
.hat-sports > .e-con-inner{
  display:grid;grid-template-columns:1fr 1.55fr 1fr;gap:26px;align-items:center;
}
.hat-sports__art{display:flex;align-items:center;justify-content:center}
.hat-sports__art img{display:block;width:auto;max-width:100%;height:clamp(170px,22vw,320px)}
/* Both marks are drawn facing right. Unflipped they would run the same way and
   the right-hand one would face away from the headline. The pair faces inward. */
.hat-sports__art--flip img{transform:scaleX(-1)}
/* The grid centres its items, but an Elementor container child stretches by
   default, so the copy column filled the 320px row and sat at the top of it. */
.hat-sports__mid{text-align:center;align-self:center}
/* auto margins, because the measure is narrower than the column and the mockup
   centres it within the column rather than aligning it left. */
.hat-sports__p p{margin:0 auto;max-width:46ch;color:rgba(247,242,230,.86);font-size:16px}
.hat-sports .hat-sports__p.elementor-widget{margin-block-start:16px}
@media(max-width:900px){
  /* Copy first, then both marks side by side underneath. Nothing drops, which
     was the only real flaw in this layout. */
  .hat-sports > .e-con-inner{grid-template-columns:1fr 1fr;gap:18px 26px}
  .hat-sports__mid{grid-column:1 / -1;order:-1}
  /* 200 rather than 150. Stacked, these are the only images in the section and
     the column has the room, so they were reading as decoration at a size the
     desktop layout needed and this one does not. */
  .hat-sports__art img{height:200px}
}

/* ---------------------------------------------------------------------------
   Location cards, option C1. Mockup 248-269.

   The card's photograph, border, radius and height are all container controls.
   What is here:

   The scrim is a FOUR stop gradient, and Elementor's overlay carries two and
   lives on the container's ::before, which Elementor owns. So the body IS the
   scrim: inset over the whole card, gradient behind it, content pinned to the
   bottom. One element doing two jobs, rather than a spare one doing nothing.

   The status chip's arrow is a clip-path. No control expresses that.

   820px is the mockup's own breakpoint for the grid and it is neither of
   Elementor's, so the single-column switch lives here too.
   ------------------------------------------------------------------------ */
.hat-locs{margin-top:34px}
@media(max-width:820px){
  .hat-locs{flex-direction:column}
}
.hat-loc{position:relative;overflow:hidden;transition:border-color .15s ease}

/* THE PHOTOGRAPH, ON ITS OWN LAYER, SO THE HOVER CAN MOVE IT ALONE. Added
   2026-08-25. It was a background image on .hat-loc itself, where a zoom would
   have carried the heading, the address, the buttons and the border with it,
   and where `cover` cannot transition to a percentage anyway: it is a keyword,
   so background-size jumps rather than moves.

   UNDERNEATH THE GRADIENT. .hat-loc__body is absolutely positioned and comes
   later in the DOM, so it paints above this without either needing a z-index;
   the card's own link overlay is z-index:1 and the buttons are 2, both above
   both. Only this layer moves.

   scale(1.06), not more: the card is 4px-bordered with overflow:hidden, so the
   crop is the whole effect, and a larger jump reads as the picture changing
   rather than as the card responding. */
.hat-loc__pic{
  position:absolute;inset:0;
  background-size:cover;background-position:center center;background-repeat:no-repeat;
  transform:scale(1);
  transition:transform .45s cubic-bezier(.25,.85,.35,1);
}
/* DOUBLED CLASS, for the same reason the border hover below is doubled: these
   are Elementor containers and their own generated rules are written at
   element-id specificity. */
.hat-loc.hat-loc:hover .hat-loc__pic,
.hat-loc.hat-loc:focus-within .hat-loc__pic{transform:scale(1.06)}

/* Nothing moves for anyone who has asked for less of it. The border colour
   still changes, so the card still answers the cursor. */
@media(prefers-reduced-motion:reduce){
  .hat-loc__pic{transition:none}
  .hat-loc.hat-loc:hover .hat-loc__pic,
  .hat-loc.hat-loc:focus-within .hat-loc__pic{transform:none}
}
/* FOUR CLASSES, AND THE DOUBLED ONE WAS STILL ONE SHORT.
   Elementor binds the border colour on the container and writes it as
   `.elementor-60 .elementor-element.elementor-element-d200009`, which is
   (0,3,0). `.hat-loc.hat-loc:hover` is (0,2,0), so it did not tie and lose on
   order, it lost outright. Measured 2026-08-25 by reading the cascade: the rule
   was in the served file, greps as present, and had never once fired, which is
   what the comment that used to sit here already suspected and under-counted.

   .elementor-element and .e-con are the container's own classes and do not move
   between rebuilds; the element id does, so it cannot be targeted.

   GOLD, NOT GREEN. It was --green-text, which is a dark green against a 4px ink
   border on a photograph: a change nobody would see even when it worked. Gold
   is what this site already means by "you are interacting with this" - nav
   hover, the current page, every button. */
.hat-loc.hat-loc.elementor-element.e-con:hover,
.hat-loc.hat-loc.elementor-element.e-con:focus-within{border-color:var(--gold)}
/* The whole card is the click target. The anchor on the name is stretched over
   the card, and the buttons are lifted above it so they still get their own
   clicks. Wrapping the card in an anchor would nest buttons inside a link.

   THE WIDGET HAS TO BE STATIC TOO, and that line is the whole fix. Elementor
   gives every .elementor-widget `position:relative`, so the stretched
   pseudo-element resolved against the HEADING WIDGET rather than against the
   card: measured, its containing block was 544px wide and one line tall inside
   a 608 by 520 card. The card was position:relative, the anchor was static, the
   inset was 0, and every one of those was correct, which is why this read as a
   design choice rather than a bug. Only the name was clickable because only the
   name's box was ever being covered. */
.hat-loc .hat-loc__name{position:static}
.hat-loc__name a{position:static;text-decoration:none;color:inherit}
.hat-loc__name a::after{content:"";position:absolute;inset:0;z-index:1}
.hat-loc__ctas{position:relative;z-index:2}
.hat-loc__body{
  position:absolute;inset:0;
  background:linear-gradient(180deg,rgba(0,0,0,.10) 0%,rgba(0,0,0,.10) 34%,rgba(0,0,0,.55) 66%,rgba(0,0,0,.9) 100%);
}
.hat-loc__status .elementor-heading-title{
  display:inline-block;background:var(--gold);color:var(--ink);
  font-size:10.5px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;
  line-height:1.6;padding:5px 22px 5px 12px;
  clip-path:polygon(0 0,100% 0,86% 50%,100% 100%,0 100%);
}
/* Three selectors and the logical property, because the kit's widget spacing
   eats a plain margin-bottom. See the note on .hat-hero__sub. */
.hat-loc .hat-loc__status.elementor-widget{margin-block-end:12px}
/* clamp(32,4.6vw,58) is this card's own step and matches no kit preset. If a
   second thing ever needs it, it becomes a Global Font instead. */
.hat-loc__name .elementor-heading-title{
  font-size:clamp(32px,4.6vw,58px);line-height:.94;margin:0;
}
/* Spacing on the widget, type on the paragraph. Elementor resets the paragraph's
   own margins inside a Text Editor, so an 8px set there never appears. */
.hat-loc__addr p{font-size:17px;color:rgba(247,242,230,.9);margin:0;line-height:1.4}
.hat-loc .hat-loc__addr.elementor-widget{margin-block-start:8px}
/* The 10px is the mockup's `.btn{margin:0 10px 10px 0}`: it lifts the row off the
   card's bottom padding. Without it the buttons sit 10px lower than designed. */
.hat-loc__ctas{margin-top:18px;padding-bottom:10px}

/* ---------------------------------------------------------------------------
   Google rating badge. Mockup 191-210.

   Chrome, layout and spacing are container controls. Here: the position, and
   the two drawn marks.

   Position is a class rather than Elementor's offset controls because of the
   mobile case: at <=760 the badge re-pins to bottom centre with a translate,
   and a container has no transform control to express that. Never make it
   static. It is a flex sibling of the hero's inner column, so static drops it
   beside the headline instead of below it.
   ------------------------------------------------------------------------ */
/* width:max-content because Elementor pins every container to width:100%, so
   an absolutely positioned one spans the viewport and only looks right-aligned
   because the inset happens to land. */
.hat-grating{
  position:absolute;bottom:24px;z-index:3;
  /* Its right edge lines up with the 1240 content column rather than the viewport
     edge. Below 1240 the gutter goes negative, so the 26px floor takes over and
     it behaves as it did. */
  right:max(26px, calc((100% - 1240px) / 2));
  /* Elementor pins every container to width:100%, so an absolutely positioned
     one spans the viewport and only looks right-aligned because the inset lands. */
  width:max-content;max-width:none;
  /* The mockup's .rt. Without it every row here inherits the body's 25.6px and
     the badge measures 47.6 against the mockup's 43. */
  line-height:1.25;
}
/* The Google mark hangs off the SCORE, not off the badge, because ::before on a
   container belongs to Elementor: it uses it for the background overlay and
   positions it absolutely, so it contributes no width and a flex row simply
   closes over it. On a widget the pseudo-element is still free. */
.hat-grating__score .elementor-heading-title{
  display:flex;align-items:center;
  font-size:13.5px;font-weight:700;line-height:1.25;color:var(--ink);
}
.hat-grating__score .elementor-heading-title::before{
  content:"";width:21px;height:21px;flex:0 0 21px;margin-right:11px;
  background:url('../img/google-g.svg') center/contain no-repeat;
}
.hat-grating__reviews .elementor-heading-title{
  display:flex;align-items:center;
  font-size:12.5px;font-weight:500;line-height:1.25;color:#5f6368;
}
/* 5 stars at 13px with 1.5px gaps: 65 + 6. The 7px is .r1's gap, which the row
   container cannot supply here because the stars live inside this element. */
.hat-grating__reviews .elementor-heading-title::before{
  content:"";width:71px;height:13px;flex:0 0 71px;margin-right:7px;
  background:url('../img/rating-stars-4-4.svg') center/contain no-repeat;
}
@media(max-width:760px){
  .hat-grating{right:auto;left:50%;transform:translateX(-50%);bottom:20px;white-space:nowrap}
}

/* ---------------------------------------------------------------------------
   Section heading rule, the eyebrow breaking through it. Option 6d.

   Native was rejected: Elementor's heading background is per widget with no
   inheritance, so the native route needs the band colour set by hand at every
   one of ~40 uses. --secbg lets the section say it once.

   Applied as a Heading widget with CSS Classes "hat-rule-eyebrow". Elementor's
   Heading widget wraps its text in a child element, so the rule targets the
   direct child rather than the container itself.
   ------------------------------------------------------------------------ */
.hat-rule-eyebrow{
  position:relative;margin:0 0 16px;text-align:center;
  /* align-self, and without it there is no rule at all.
     The eyebrow is a Heading widget, so it is a flex ITEM of whatever column
     holds it. align-items on that column is the CROSS axis, which in a column
     is the horizontal one, so a container set to center or flex-start shrinks
     the eyebrow to exactly the width of its own label. The ::before still
     draws, at left:0;right:0 of a box that is now label-width, and the label's
     own knockout background covers every pixel of it.
     The failure is total and looks like the rule was never written: the
     location pages had no line on any of their three eyebrows while the
     homepage, whose columns stretch, had them everywhere. */
  align-self:stretch;
}
/* The 16px again, at a specificity that survives. As a Heading widget this is a
   .elementor-widget, and the kit's widget spacing sets margin-block-end:0 on
   those at the same specificity as a two-class rule. Without this every section
   heading sits 16px tight under its eyebrow. */
.hat-rule-eyebrow.elementor-widget.elementor-widget{margin-block-end:16px}
.hat-rule-eyebrow::before{
  content:"";position:absolute;left:0;right:0;top:50%;height:2px;
  background:var(--green-text);
}
.hat-rule-eyebrow > *{
  position:relative;display:inline-block;
  background:var(--secbg,var(--cream));padding:0 18px;
  /* Colour only. Size, weight, tracking and case come from the kit's hat-eyebrow
     preset, bound on the widget. Colour cannot: it flips per band, and a widget
     binding would pin it to one ground. */
  color:var(--green-text);
}
/* The mockup's label is an inline span, whose box is the font's natural height.
   Elementor sets line-height:1 on the heading title, which made the coloured band
   behind the label 3px shorter than the mockup's and broke the rule at the wrong
   height. */
.hat-rule-eyebrow .elementor-heading-title{line-height:normal}
.hat-rule-eyebrow--left{text-align:left}
.hat-rule-eyebrow--left > *{padding-left:0}

/* PHONE: THE RULE IS DRAWN BEHIND THE LABEL, SO A LONG LABEL HIDES ALL OF IT.
   The knockout above works by painting the label in the band colour on top of a
   full-width line. That needs the label to be NARROWER than the container, and
   on a 390px phone the content width is 342 while the two longest eyebrows on
   the site measure 347 and more at 13px with their 18px of padding:

     "Super Bowls | Stanley Cups | World Series"   /about/      347
     "Bucs | Rays | Lightning | Rowdies | USF..."  /standings/  347+

   Both rendered a full-width label with 0px of line exposed on either side. The
   rule was painted every time and covered every time, which is why it read as a
   missing line rather than a too-long label, and why only SOME eyebrows lost
   theirs: at 300px /downtown/ keeps 42px of rule and looks merely tight.

   So below the tablet breakpoint the line stops being one band behind the label
   and becomes two beside it. flex:1 0 22px is the whole fix - GROW to fill,
   never SHRINK, so each side keeps 22px whatever the label does, and the label
   takes what is left and wraps to a second line rather than pushing the rule to
   nothing. The knockout background goes with it: there is no line under the
   label any more, so painting --secbg there would only put a patch of band
   colour on any card that holds an eyebrow.

   Desktop is deliberately untouched. The approved rendering is the absolute
   ::before, and at 1240 no string on this site comes close to filling it. */
@media (max-width:767px){
  .hat-rule-eyebrow{display:flex;align-items:center;gap:12px}
  .hat-rule-eyebrow::before{position:static;flex:1 0 22px;min-width:0}
  .hat-rule-eyebrow::after{
    content:"";flex:1 0 22px;min-width:0;height:2px;
    background:var(--green-text);
  }
  .hat-rule-eyebrow > *{
    flex:0 1 auto;min-width:0;padding:0;background:none;
  }
  /* The left variant is a line on ONE side by definition. */
  .hat-rule-eyebrow--left{justify-content:flex-start}
  .hat-rule-eyebrow--left::before{display:none}
}

/* On dark and gold bands both the rule and the label flip. The rule is
   --green-text on light grounds because that is the green that passes as type
   on cream at 5.93; shamrock green would be too light at 2px. */
.hat-band-dark .hat-rule-eyebrow::before,
.hat-band-dark .hat-rule-eyebrow::after{background:var(--gold)}
.hat-band-dark .hat-rule-eyebrow > *{color:var(--gold)}
.hat-band-gold .hat-rule-eyebrow::before,
.hat-band-gold .hat-rule-eyebrow::after{background:var(--ink)}
.hat-band-gold .hat-rule-eyebrow > *{color:var(--ink)}

/* ---------------------------------------------------------------------------
   Marquee. Gold band, ink type, traced shamrock between phrases.
   A genuine exception: Elementor has no marquee widget and no animation control
   that produces a seamless infinite scroll.

   Markup, as an HTML widget inside a full-width container:
     <div class="hat-marquee"><div class="hat-marquee__track">
       <span>Cold beer <svg class="hat-marquee__sham">...</svg> Every game ... </span>
       <span aria-hidden="true">...repeat identical content...</span>
     </div></div>
   The track holds the phrase set TWICE and translates -50%, which is what makes
   the loop seamless. Halving the content breaks it.
   ------------------------------------------------------------------------ */
/* The gold comes from the container's own background control, not from here, so
   the band has one source of truth for its paint. */
.hat-marquee{overflow:hidden;white-space:nowrap;margin:0}
/* inline-FLEX, not inline-block: the two sets are Text Editor widgets, which are
   block elements and would otherwise stack. Two equal flex children also make
   the -50% translate land exactly one set along. */
/* Paused until assets/js/marquee.js says the display face has loaded. The track's
   width IS its text's width, 2222px in Big Shoulders Display against 533px on the
   fallback, and the animation translates -50% of it, so a swap mid-scroll moves
   the band by 76% of a cycle in one frame.
   will-change so the transform runs on its own layer rather than repainting
   4445px of masked text every frame. */
.hat-marquee__track{
  display:inline-flex;width:max-content;will-change:transform;
  animation:hat-slide 34s linear infinite;
  animation-play-state:paused;
}
.hat-marquee__track.is-ready{animation-play-state:running}
/* A band that scrolls forever with no way to stop it is a WCAG 2.2.2 problem.
   This covers the people who have asked the platform to stop moving things; a
   pause control for everyone else is a separate decision. */
@media (prefers-reduced-motion:reduce){
  .hat-marquee__track{animation:none}
}
.hat-marquee__set p{
  margin:0;
  font-family:var(--face-display);font-weight:800;font-size:clamp(38px,5.2vw,68px);
  text-transform:uppercase;color:var(--ink);letter-spacing:.02em;line-height:1;white-space:nowrap;
}

/* Equal margin both sides so the mark centres between phrases.
   The traced shamrock is centred at y=32 in its 64 viewBox, so its optical centre is
   the box centre at vertical-align + .36em. Big Shoulders Display 800 measures a 0.6758
   cap ratio, so the cap centre sits at .338em and the offset is .338 - .36 = -.022em.
   This was `baseline` while the display face was Anton. IF THE DISPLAY FACE CHANGES
   AGAIN, RE-MEASURE. Do not assume. */
.hat-marquee__sham{
  display:inline-block;width:.72em;height:.72em;vertical-align:-.022em;
  margin:0 .42em;
  /* A mask rather than an inline SVG, so the separator is a decorative mark on a
     text widget instead of hand-written markup in the page, and its colour is
     still the palette token. */
  background-color:var(--green-dark);
  -webkit-mask:var(--mark-shamrock) center/contain no-repeat;
          mask:var(--mark-shamrock) center/contain no-repeat;
}

@keyframes hat-slide{from{transform:translateX(0)}to{transform:translateX(-50%)}}

/* Respect a reduced-motion preference. An infinite scroll is exactly what this
   setting exists for, and the band still reads fine static. */
@media(prefers-reduced-motion:reduce){
  .hat-marquee__track{animation:none}
}

/* ---------------------------------------------------------------------------
   Location chooser. Click-triggered only, NEVER on load.
   It is not a gate: the homepage stays a rankable brand page. This opens only
   when someone reaches for a location-scoped action, and never once a location
   is already in context.
   ------------------------------------------------------------------------ */
.hat-locmodal{
  position:fixed;inset:0;z-index:200;display:none;
  align-items:center;justify-content:center;padding:20px;
}
.hat-locmodal.is-open{display:flex}
.hat-locmodal__backdrop{position:absolute;inset:0;background:rgba(0,20,10,.72);backdrop-filter:blur(3px)}
/* THE MODAL'S WAY OUT THAT IS NOT A CHOICE.
   Was 14px underlined text below the checkbox, and quiet on purpose so it did
   not compete with the two picks. The reasoning held; the weight did not. Every
   route to /locations/ in the header opens this modal instead of navigating, so
   with JS running the footer is the only other link to that page on the site,
   and this was the quietest thing in the panel.

   SET APART RATHER THAN MADE LOUD. A rule above it and its own breathing room,
   so it reads as a third way OUT rather than a third choice; the two picks are
   still the only cards. The arrow is the one .hat-menu__away uses to mean "this
   leaves rather than staying put", and it is the same Font Awesome Solid that
   is already enqueued.

   Two classes, because `.elementor a` rules would otherwise take the underline
   decision, and :hover is named separately for the same reason. */
.hat-locmodal .hat-locmodal__all{
  display:flex;align-items:center;justify-content:center;gap:9px;
  margin:20px 0 0;padding:16px 0 2px;
  border-top:2px solid rgba(20,20,20,.14);
  font-family:var(--face-ui);font-size:16px;font-weight:700;letter-spacing:.04em;
  color:var(--green-text);text-decoration:none;
}
/* THE RULE BELONGS TO THE WORDS, NOT THE LINK. Declared on the <a> it painted
   across the whole flex line, so the arrow sat on a length of underline that
   was not part of any word. A decoration on an ancestor cannot be cancelled on
   a descendant, so the fix is to never put it on the ancestor: the label
   carries its own, and the glyph is simply outside it. */
.hat-locmodal .hat-locmodal__all span{
  text-decoration:underline;text-underline-offset:3px;text-decoration-thickness:2px;
}
.hat-locmodal .hat-locmodal__all:hover{color:var(--ink)}
.hat-locmodal .hat-locmodal__all:hover span{text-decoration-color:var(--ink)}
/* Sized off the label rather than stated, and it inherits its colour, so the
   glyph follows the link on hover instead of being left behind. */
.hat-locmodal .hat-locmodal__all .hat-ico{font-size:.8em;color:inherit}

/* THE ONLY GREY PANEL SHADOW ON THE SITE, and the only one the mockup draws.
   The offset shadow is a PRESS AFFORDANCE and nothing else, decided 2026-08-25:
   it belongs on controls, which rest in it and press down into it on hover.
   This panel is the exception because it FLOATS, over a scrim, with the page
   still visible behind it, which is the one thing on this site a shadow is
   describing rather than decorating.
   Five others were dropped the same day, each invented while building its own
   section and each at a different offset: .hat-cshot__card and
   .hat-contact__form at 6px, .hat-locindex__map img at 6px, .hat-mapcard at
   5px, .hat-contact__card at 4px/.28, plus a sixth on .hat-fcard set as an
   Elementor control in tools/location/section-hero.php. None of them float and
   none of them press; what they were doing was greying the ground beside them.
   NOT part of this family, and deliberately kept: the two BLURRED shadows, on
   the promo carousel's dots and on .hat-locstrip__item in map view. A blur is
   elevation rather than press, and the strip card sits on a live photographic
   basemap where a border alone cannot hold it. */
.hat-locmodal__panel{
  position:relative;z-index:2;background:var(--paper);border:4px solid var(--ink);
  border-radius:22px;max-width:640px;width:100%;padding:34px 30px 30px;text-align:center;
  box-shadow:8px 8px 0 rgba(0,0,0,.35);
}
/* The real traced mark, printed once by the footer builder. */
.hat-locmodal__shamicon{width:34px;height:34px;fill:var(--green);display:block;margin:0 auto 12px}

/* IT ROLLS IN WHEN THE PICKER OPENS.
   Chosen 2026-08-24 over the same idea beside a section heading, and the
   picker is the better home for one reason: this panel APPEARS. An entrance
   animation on something that was already on screen is decoration; on
   something arriving it is just how it arrived. It also fires once per
   interaction rather than once per section, so it cannot wear out.

   THE ROTATION IS DERIVED FROM THE DISTANCE, not chosen. A mark that travels
   without turning at the matching rate reads as sliding, and the eye catches
   that immediately even when it cannot say why:

       turns = distance / (PI * diameter)
       120 / (PI * 34) = 1.12 turns = 404 degrees

   It travels rightward into place, so it turns clockwise: the keyframe starts
   at -404deg and lands at 0 rather than the reverse. Change either number and
   the other has to change with it. */
.hat-locmodal.is-open .hat-locmodal__shamicon{
  animation:hat-sham-roll .62s cubic-bezier(.25,.85,.35,1) both;
}
@keyframes hat-sham-roll{
  from{transform:translateX(-120px) rotate(-404deg);opacity:0}
  14%{opacity:1}
  to{transform:translateX(0) rotate(0);opacity:1}
}
/* A rolling mark is small and contained, which is a different proposition from
   a full viewport slide, but someone who has asked for less motion has asked
   for less motion. */
@media(prefers-reduced-motion:reduce){
  .hat-locmodal.is-open .hat-locmodal__shamicon{animation:none}
}
.hat-locmodal__panel h2{
  font-family:var(--face-display);font-weight:800;text-transform:uppercase;
  font-size:clamp(30px,4.4vw,44px);line-height:.94;letter-spacing:.01em;
  margin:0 0 8px;color:var(--ink);
}
.hat-locmodal__lede{color:#5d574a;font-size:16.5px;margin:0 0 22px}
.hat-locmodal__picks{display:grid;grid-template-columns:1fr 1fr;gap:14px}
@media(max-width:600px){.hat-locmodal__picks{grid-template-columns:1fr}}
.hat-locmodal__pick{
  display:block;text-decoration:none;background:transparent;border:3px solid var(--ink);
  border-radius:16px;padding:18px 16px;text-align:left;
  transition:transform .1s ease,box-shadow .1s ease;
}
/* THE SITE'S PRESS, NOT A LIFT. Until 2026-08-25 this rested with NO shadow and
   gained `4px 4px 0` on hover while sliding up-left, which is the opposite
   motion to every other control here: a button, .hat-telbtn, the footer pills
   and the menu jump pills all rest at `3px 3px 0 var(--ink)` and press DOWN
   into it. Same gesture, two directions, on one site.

   It matters more now the pick is an outline rather than a fill. A filled pick
   carried its own weight; an outlined one needs the resting shadow to read as
   pressable at all, and that is the better thing for it to communicate anyway,
   since the modal exists to get a choice out of someone.

   TWO CLASSES ON THE REST STATE, AND THAT IS THE WHOLE REASON THE SHADOW LIVED
   IN :hover BEFORE. The pick is an <a>, and `.elementor a{box-shadow:none}` in
   custom-frontend.min.css is (0,1,1), so a bare `.hat-locmodal__pick` at (0,1,0)
   loses and the shadow silently never paints. `:hover` was (0,2,0) and won,
   which is why the old rule worked and looked deliberate. Parenting to
   .hat-locmodal buys the point on both. */
.hat-locmodal .hat-locmodal__pick{box-shadow:3px 3px 0 var(--ink)}
.hat-locmodal .hat-locmodal__pick:hover{transform:translate(3px,3px);box-shadow:none}
/* THE PICKS NEED THEIR OWN FOCUS RING, BECAUSE reset.css's FLATTENS THEM.
   `a:focus-visible{outline:2px solid #000; outline-offset:2px}` in reset.css is
   the only rule setting `outline` on these, so it applies uncontested - its
   box-shadow loses to the resting rule at (0,2,0), which is what made it look
   innocent. The outline is the problem on its own: the 3px 3px offset shadow
   reads as RAISED only because it falls on the right and bottom alone, and a
   black ring on all four sides closes that read. The control then looks pressed
   in from the moment the modal opens, and "un-presses" on blur.

   Gold rather than black, because gold is what this site already means by "you
   are interacting with this" - nav hover, current page, every button - and
   because it cannot be mistaken for the ink border or the ink shadow. Offset 4
   clears the 3px shadow on the right and bottom, so the ring encircles the
   control without touching it.

   Three classes to beat `a:focus-visible` at (0,1,1). */
.hat-locmodal .hat-locmodal__pick:focus-visible{
  outline:3px solid var(--gold);
  outline-offset:4px;
}
/* The panel takes focus on open and must not draw a ring for it: it is a
   container being focused for keyboard reasons, not a control. */
.hat-locmodal .hat-locmodal__panel:focus,
.hat-locmodal .hat-locmodal__panel:focus-visible{outline:none}
.hat-locmodal__pick b{
  display:block;font-family:var(--face-display);font-weight:800;text-transform:uppercase;
  font-size:26px;line-height:1;color:var(--ink);
}
.hat-locmodal__pick span{display:block;font-size:14.5px;color:#6b6455;margin-top:6px}
/* The maps chooser (maps-chooser.js) is this dialog again with two apps for
   picks. Narrower, because its picks are short, and the lede is the address,
   which may run to two lines. */
.hat-mapsmodal .hat-locmodal__panel{max-width:520px}
.hat-mapsmodal .hat-locmodal__lede{overflow-wrap:anywhere}
/* Two pills of equal weight, neither the default: the site's control
   vocabulary (3px ink border, 3px 3px ink shadow, press on hover) in outline
   form. Two classes on everything, because these are <a> elements and
   `.elementor a{box-shadow:none}` is (0,1,1). */
.hat-mapsmodal .hat-mapsmodal__btns{display:flex;flex-wrap:wrap;gap:14px;justify-content:center}
.hat-mapsmodal .hat-mapsbtn{
  flex:1 1 180px;display:flex;align-items:center;justify-content:center;gap:10px;
  padding:13px 22px;border:3px solid var(--ink);border-radius:999px;
  background:transparent;color:var(--ink);text-decoration:none;
  font-family:var(--face-ui);font-size:16px;font-weight:700;letter-spacing:.07em;
  text-transform:uppercase;line-height:1.2;white-space:nowrap;
  box-shadow:3px 3px 0 var(--ink);transition:transform .1s ease,box-shadow .1s ease;
}
.hat-mapsmodal .hat-mapsbtn:hover{transform:translate(3px,3px);box-shadow:none;color:var(--ink)}
.hat-mapsmodal .hat-mapsbtn:focus-visible{outline:3px solid var(--gold);outline-offset:4px}
.hat-mapsmodal .hat-mapsbtn__mark{width:20px;height:20px;flex:none}
/* Stacked on a phone. After the pill rule on purpose: in a column the 180px
   basis would become each pill's HEIGHT, so the basis has to go as well. */
@media(max-width:600px){
  .hat-mapsmodal .hat-mapsmodal__btns{flex-direction:column}
  .hat-mapsmodal .hat-mapsbtn{flex:none}
}
/* Waze on touch devices only: on a mouse-and-trackpad computer its link is a
   web map rather than navigation. Tablets count as touch. */
@media (hover:hover) and (pointer:fine){.hat-mapsmodal .hat-mapsbtn--touch{display:none}}
/* THE SUGGESTED PICK, Order only (location-chooser.js suggest()). Gold fill is
   what this site means by the primary action, so the likely location reads as
   the obvious press without being chosen for anyone: both picks stay live. The
   tag hangs off the <a> itself, which is a plain element, so its ::after is
   free. Two classes for the same (0,1,1) reason as the resting shadow. */
.hat-locmodal .hat-locmodal__pick.is-suggested{background:var(--gold);position:relative}
.hat-locmodal .hat-locmodal__pick.is-suggested span{color:var(--ink)}
.hat-locmodal .hat-locmodal__pick.is-suggested::after{
  content:attr(data-hat-tag);position:absolute;top:-11px;right:14px;
  background:var(--ink);color:var(--paper);border-radius:999px;padding:3px 10px;
  font-size:12px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;line-height:1.3;
}
/* Two class selectors, because a bare .hat-locmodal__close loses to the kit's
   `.elementor-kit-2141 button` and renders as a 13px uppercase gold-bordered
   Elementor button. Every property the kit or Hello Elementor's reset sets on a
   <button> has to be named here, hover included.
   The face is Arial because that is what the mockup's own close renders in: it
   sets no font-family, so it takes the UA button default. Naming it keeps the
   glyph identical on platforms whose default is not Arial. */
.hat-locmodal .hat-locmodal__close{
  position:absolute;top:12px;right:14px;padding:6px;width:auto;min-width:0;
  border:0;border-radius:0;background:transparent;box-shadow:none;cursor:pointer;
  font-family:Arial,Helvetica,sans-serif;font-size:26px;font-weight:400;
  line-height:1;letter-spacing:normal;text-transform:none;color:#8a8272;
}
.hat-locmodal .hat-locmodal__close:hover{background:transparent;color:#8a8272}
.hat-locmodal__remember{
  margin:18px 0 0;font-size:13.5px;color:#6b6455;
  display:flex;align-items:center;justify-content:center;gap:8px;
}
/* Hello Elementor's reset sets label{line-height:1}, which renders this row
   8px shorter than the mockup's, and input{margin:0}, which pulls the box 4px
   tighter to the label than the mockup's UA default. Both restored here so the
   row measures the same as the mockup on any platform. */
.hat-locmodal__remember label{line-height:inherit}
.hat-locmodal__remember input[type=checkbox]{margin:3px 3px 3px 4px}

/* ---------------------------------------------------------------------------
   Jersey stripe. Gold / shamrock / gold, 7px, under the header.
   Footer variant swaps the middle band to cream.

   Colours chosen so it stays visible over any hero image, since the header is
   sticky and the stripe crosses the hero photo on scroll.

   Elementor's gradient control gives two stops with a position each; this needs
   three hard stops with no blend, so it is one rule rather than three stacked
   containers. Applied via Advanced > CSS Classes on a 7px container.
   ------------------------------------------------------------------------ */
.hat-jersey-stripe{
  height:7px;
  background:linear-gradient(90deg,
    var(--gold) 0 33.33%,
    var(--green) 33.33% 66.66%,
    var(--gold) 66.66% 100%);
}

.hat-jersey-stripe--footer{
  background:linear-gradient(90deg,
    var(--gold) 0 33.33%,
    var(--cream) 33.33% 66.66%,
    var(--gold) 66.66% 100%);
}

/* ---------------------------------------------------------------------------
   Header wordmark and its registered mark.

   The (R) is absolutely positioned so it takes NO space in the flow. As a
   sibling in the flow it made the centred group 195px wide instead of 190px,
   which pushed the wordmark 107px off true centre. Measured against the
   mockup, which centres the logo alone.
   ------------------------------------------------------------------------ */
/* The wordmark is an Image widget. Its size and link are widget controls; only
   two things here are not expressible as one:

   The (R) MUST NOT take space in the normal flow. As a sibling widget beside the
   image, Elementor centred the 190px logo plus the 5px mark as one 195px group
   and the wordmark landed 107px left of true centre. It needs a positioning
   context, which is all this is, so it is drawn on the widget's own anchor.

   font-size:0 on the anchor because as an inline-block it sat on a text baseline
   and measured 74px against the image's 69px, pushing the header 5px past the
   mockup. The mark sets its own size, so the zero does not reach it. */
/* The zeroes go on the CONTAINER, not only on the anchor. An inline-block anchor
   still sits in its parent's line box, so the parent's 16px/1.6 strut left 6.6px
   of descender space under the image and the header bar measured 103.3 against
   the mockup's 97. Zeroing the anchor alone does not reach the strut. */
.hat-wordmark .elementor-widget-container{line-height:0;font-size:0}
.hat-wordmark .elementor-widget-container > a{
  position:relative;display:inline-block;line-height:0;font-size:0;
}
.hat-wordmark img{display:block}
/* A location lockup (South Tampa's) carries no (R) in the client's artwork, and
   the mark is positioned for the plain wordmark's corner, so it is not drawn. */
.hat-wordmark.hat-wordmark--loc .elementor-widget-container > a::after{content:none}
.hat-wordmark .elementor-widget-container > a::after{
  content:"\00AE";
  position:absolute;top:2px;right:-.75em;
  font-family:var(--face-ui);font-size:11px;font-weight:400;line-height:1;
  color:var(--gold-logo);
}

/* ---------------------------------------------------------------------------
   Locations pill. A Button widget.

   Border, radius, transparent fill, padding, text colour and the cleared box
   shadow are all widget controls, because the kit's global button would
   otherwise paint this gold with an offset shadow. Two things are not controls:

   The type. 14px at .06em has no kit preset, and the build spec forbids typing a
   raw px size into a widget, so it lives here rather than becoming a Global Font
   that exists for one control.

   The mark. Elementor's icon control only takes a custom SVG when unfiltered
   uploads are enabled, and they are off. Drawn as a mask so the fill is still
   the palette token rather than a colour baked into a file.

   Measured from the mockup: 2px gold border, 999px radius, transparent fill,
   NO shadow, 9px gap, 22px shamrock to the right of the label, box 147x38.
   ------------------------------------------------------------------------ */
/* Type comes from hat-btn now, so the picker matches Order Online beside it
   exactly and moves with the token. It used to carry its own 14px on .06em,
   which made two controls in one bar read as two different objects. Only the
   nowrap is left, which is layout rather than type. */
.hat-locpill .elementor-button{white-space:nowrap}
.hat-locpill .elementor-button-content-wrapper{
  display:flex;align-items:center;gap:9px;
}
.hat-locpill .elementor-button-content-wrapper::after{
  content:"";width:22px;height:22px;flex:0 0 22px;
  background-color:var(--green);
  -webkit-mask:var(--mark-shamrock) center/contain no-repeat;
          mask:var(--mark-shamrock) center/contain no-repeat;
}

/* THE MARK ROLLS ACROSS THE PILL AND THE LABEL APPEARS IN ITS WAKE.

   ON LOAD, NOT ON HOVER, and that is the part worth arguing. Hover was the
   first build and it is wrong for a reveal: the label would re-hide every time
   the pointer arrived, so the control went unreadable at exactly the moment
   somebody was reaching for it. On load it happens once, while the header is
   arriving anyway, and the pill is never unreadable while it is being used.

   THE LABEL IS REVEALED BY A CLIP, NOT BY A FADE. A clip has an EDGE, and an
   edge is what makes this read as the mark uncovering the words rather than as
   two things animating near each other. Both run on the same duration and the
   same easing curve, so the reveal edge tracks the mark rather than drifting
   away from it.

   THE CLIP PERCENTAGE IS SAFE HERE, unlike the transform. CLAUDE.md records
   that a percentage TRANSFORM on a pseudo-element resolves against its own
   border box, which is why the travel below is a fixed length; clip-path
   percentages resolve against the element being clipped, which is the label,
   which is exactly what is wanted.

   129px IS THE LONGEST LABEL PLUS THE GAP. The pill reads "Locations" on brand
   pages and the location's own name inside one, so the text is 72px at its
   shortest and 120px at its longest, on a 9px gap. The travel is sized to the
   longest, so the mark always clears the words instead of stopping halfway
   through the wide case.

       turns = distance / (PI * diameter)
       129 / (PI * 22) = 1.87 turns = 672 degrees

   Travelling rightward turns clockwise, so it starts at -672deg and unwinds
   to zero. */
/* THE .3s DELAY IS THE PAGE TRANSITION, AND WITHOUT IT NONE OF THIS IS SEEN.
   The green flash covers the page for 280ms after a navigation while this ran
   from 0, so it was 45% finished by the time the cover came off: the mark was
   already halfway across the pill and the label already half revealed, which
   reads exactly as "the text appears before the shamrock animates". The
   geometry was never wrong. Measured, the mark starts 3px OUTSIDE the pill's
   left border, which is where it should start.

   .3s is the flash's 280ms plus a frame. Tie the two together if either
   changes: a shorter transition with this delay leaves a beat of empty pill,
   and a longer one goes back to hiding the first half. */
/* THE EASING WAS THE GLITCH, and it is measurable rather than a matter of
   taste. cubic-bezier(.25,.85,.35,1) covers 68% of the distance in the first
   25% of the time and 93% by halfway, so the mark darted across and then
   crawled the last 7% for 300ms. A snap followed by a stall reads as broken
   even when every number in it is correct.

   cubic-bezier(.45,.05,.25,1) spends it evenly: 19% at a quarter, 74% at half,
   96% at three quarters. It also starts SLOW, which is what a ball does from
   rest; the old curve started at its fastest, which nothing physical does.

   And it fades in over the first fifth. The pill clips its overflow, so without
   this the mark appeared instantly at the border rather than arriving there. */
.hat-locpill .elementor-button{overflow:hidden}
.hat-locpill .elementor-button-content-wrapper::after{
  animation:hat-pill-roll .78s cubic-bezier(.45,.05,.25,1) .3s both;
}
/* THE REVEAL LAGS THE ROLL BY 120ms, and that gap is the whole trick.
   Run in step, the clip edge tracks the mark's LEADING edge, so a letter is
   uncovered the instant the mark reaches it and is already visible to the right
   of the mark a frame later. What it should track is the TRAILING edge: text
   appears where the mark has been, not where it is going.

   120ms is the mark's own width in time. It travels 129px in 780ms, so 22px of
   travel takes 133ms, and starting the clip that much later puts the edge
   behind the mark rather than under it. The reveal therefore finishes 120ms
   after the mark parks, which is correct rather than sloppy: the last letters
   should settle after the thing uncovering them has stopped. */
.hat-locpill .elementor-button-text{
  animation:hat-pill-reveal .78s cubic-bezier(.45,.05,.25,1) .42s both;
}
@keyframes hat-pill-roll{
  from{transform:translateX(-129px) rotate(-672deg);opacity:0}
  20%{opacity:1}
  to{transform:translateX(0) rotate(0);opacity:1}
}
@keyframes hat-pill-reveal{
  from{clip-path:inset(0 100% 0 0)}
  to{clip-path:inset(0 0 0 0)}
}
/* Nothing rolls and nothing is hidden first. `both` on the rules above would
   otherwise leave the label clipped for anyone whose animations never run. */
@media(prefers-reduced-motion:reduce){
  .hat-locpill .elementor-button-content-wrapper::after,
  .hat-locpill .elementor-button-text{animation:none;clip-path:none}
}

/* ---------------------------------------------------------------------------
   Header, mobile (<=980px). Option M1-b: burger left, wordmark centred, an
   empty spacer right so the wordmark stays optically centred, no Order button
   in the bar, and the location picker on its own row beneath.
   ------------------------------------------------------------------------ */
@media(max-width:980px){
  /* Flex only where the toggle actually shows, so the centring applies without
     overriding Elementor's own display rule above this width. */
  .hat-header-root .elementor-menu-toggle{display:flex}

  /* Three slots with equal sides, so the wordmark centres against the viewport.
     This IS the mockup's `grid-template-columns:auto 1fr auto`.

     A documented exception to native-first, and the reason is specific: the
     side slots must be equal for the centre to be true, and Elementor's
     container sizing controls do not express that. `width_tablet` is a WIDGET
     control and emits nothing for a container, verified in the generated
     post-3441.css, so the pins produced no CSS at all and the left slot kept
     growing and centring the burger inside itself.

     Columns are placed explicitly rather than by source order, so the hidden
     right cluster cannot claim a cell and the spacer lands in column 3
     regardless of where it sits in the markup. */
  /* NOTE the > .e-con-inner. A BOXED Elementor container wraps its children in
     an .e-con-inner element, so the clusters are grandchildren, not children.
     Applied to .hat-header-inner directly, the grid put that single wrapper in
     column 1 and everything stacked vertically inside 42px. */
/* ---------------------------------------------------------------------------
   THE MOBILE HEADER SHRINKS ONCE YOU START READING, AND ELEMENTOR SAYS WHEN.

   Measured on /downtown/ at 390x844: the header is 138px and only 94 of that is
   content.

       wordmark row     89px  =  61px wordmark + 28px padding
       locations row    43px  =  26px pill     + 16px padding
       jersey stripe     7px

   With the sticky order bar's 55 that is 193px of the screen, 23%, before a
   word is read.

   .elementor-sticky--effects IS ELEMENTOR'S OWN, and that is the whole trick.
   Elementor Pro adds it to the stuck header once the scroll passes the sticky's
   Effects Offset and removes it above that; build-header-template.php sets that
   offset to 48. The scroll detection is already written, already throttled and
   already in step with the sticky it belongs to, so all this file does is say
   what the two states look like.

   It replaces a hand-written scroll handler that cost four rounds and was
   reverted: an equal-specificity tie that squashed the wordmark to 4.20:1
   against its natural 2.78, a height transition that left an uncovered band
   mid-animation reading as a white strip, and a rAF guard that swallowed the
   trailing scroll event so the header was always one position behind.

   THE LOCATIONS ROW NEVER GOES ANYWHERE. An earlier attempt dropped it on
   scroll to reach 76px. It holds the location PICKER, the control a
   two-location site turns on, and hiding it the moment someone starts reading
   puts it behind a scroll back to the top. Only padding and the wordmark give.

       at the top          61px wordmark   ->  138px, exactly as approved
       once scrolling      44px wordmark   ->  122px

   Only the wordmark's own height changes. Its row is content plus padding, so
   the row follows it down and nothing else in the header moves.

   FOUR CLASSES ON THE WORDMARK, because post-3490.css carries that img at
   width:190px with (0,3,1) and is enqueued after this file, so a three-class
   rule ties it and loses on source order. That is exactly how the earlier
   attempt squashed it.
   ------------------------------------------------------------------------ */
@media(max-width:980px){
  /* BOTH ENDS OF A TRANSITION MUST BE A LENGTH, AND ONLY ONE OF THEM WAS.
     This rule used to say `transition:height .16s` while the shrunk state said
     `height:44px` and the resting state said nothing at all, so the resting
     height was `auto`. A transition from `auto` to a length does not run: the
     value is not interpolable, so the browser holds the old one for the whole
     duration and swaps on the last frame. Sampled every 40ms it is
     unmistakable, and it is exactly what "it works, it is just jumpy" is:

         0ms  h=60.7031px    40ms  h=60.7031px    80ms  h=60.7031px
       120ms  h=60.7031px   160ms  h=44px          <- one frame, no ramp

     getComputedStyle reports 60.7031px at rest, which is why the resting value
     reads as a length already and the missing declaration is easy to miss.
     That is the USED value. Transitions run on the SPECIFIED one, and that
     was `auto`.

     SO IT TRANSITIONS WIDTH, NOT HEIGHT, and that is the mockup's own model:
     `.nav .logo img{width:100%;height:auto}` with the width set on the parent,
     168px at mobile. Here that 168 is the image widget's width_mobile control
     and it lands in post-3490.css, which means the resting width is ALREADY a
     length and this file does not have to restate it. Pinning a height instead
     works, but it fights the widget for control of the mark's size and it moved
     the resting header off its approved 138px to 139.

     Height stays `auto` at both ends, so the used height is width / the
     intrinsic ratio, recomputed every frame. It tracks for free and never has
     to appear in the transition list. */
  .hat-header-root .hat-wordmark img{
    transition:width .22s cubic-bezier(.4,0,.2,1);
  }

  /* 61 -> 44. Height only, and width:auto, so the artwork keeps its ratio and
     nothing here has to know how wide the wordmark is. The row is content plus
     padding, so shrinking the mark shrinks the row. */
  /* 121.8px IS THE 44px TARGET WRITTEN AS A WIDTH. The artwork's ratio is
     168 / 60.7031 = 2.7676, so 44 x 2.7676 = 121.8 and the mark lands on 44
     tall without this file naming a height. If width_mobile ever changes, this
     number has to be recomputed from it. */
  .hat-header-root.elementor-sticky--effects .hat-wordmark.hat-wordmark img{
    width:121.8px;
    height:auto;
    max-width:none;
  }
  /* The same 44px target for a location lockup: 44 x 800/350 = 100.6. */
  .hat-header-root.elementor-sticky--effects .hat-wordmark.hat-wordmark--loc.hat-wordmark--loc img{
    width:100.6px;
  }

  /* THE PADDING DOES NOT MOVE, AND NEITHER DOES THE LOCATIONS ROW.
     Both were trimmed in an earlier cut - the wordmark row 14 -> 8 and the
     locations row 8 -> 4 - for another 20px. Carter asked for the logo alone,
     and he is right that it is the cleaner statement: the row is content plus
     padding, so shrinking the mark shrinks the row on its own, and nothing else
     in the header shifts under the reader. The locations row keeps its exact
     height in both states, which is the point of keeping it at all. */
}

  .hat-header-root .hat-header-inner > .e-con-inner{
    display:grid;
    grid-template-columns:42px minmax(0,1fr) 42px;
    align-items:center;
    gap:10px;
  }
  .hat-header-root .hat-header-left{grid-column:1;justify-content:flex-start}
  .hat-header-root .hat-header-center{grid-column:2;justify-content:center}
  .hat-header-root .hat-header-mobile-spacer{grid-column:3}
  .hat-header-root .hat-header-right{display:none}
}
/* Elementor's typography presets emit a bare family with no fallback tail: the
   kit's generic tail only reaches the body rule, not preset-styled elements. So
   any glyph the face does not contain falls through to the browser default
   instead of to the design's stack. The nav's "Menu (down-arrow)" is exactly
   that case, because Barlow Semi Condensed has no U+25BE: the triangle came from
   a different face than the mockup's, which made that one link 2.6px wide of the
   mockup and shifted the three links after it. --face-ui IS the mockup's stack. */
.hat-header-left .elementor-nav-menu a{font-family:var(--face-ui)}

/* The sticky order bar. Mobile only, pinned to the bottom of the viewport.
   Fixed positioning is a class because Elementor's position controls cannot pin
   a widget to the viewport across the full width, and the body offset that stops
   it covering the footer's last row has to live here regardless. */
.hat-orderbar{
  position:fixed;left:0;right:0;bottom:0;z-index:70;width:auto;
  border-top:3px solid var(--ink);
  /* Hidden until the hero has scrolled past, because the hero card already
     carries Order Online and two of the same action at once is noise. Kept OUT
     OF THE FLOW either way, so nothing below it moves when it appears.
     assets/js/orderbar.js adds is-shown. */
  transform:translateY(110%);
  transition:transform .25s ease;
}
.hat-orderbar.is-shown{transform:none}

@media (prefers-reduced-motion: reduce){
  .hat-orderbar{transition:none}
}
/* Type comes from the hat-btn global now, not from here: this is a full width
   primary action, the mobile equivalent of Order Online, so it should move when
   the button token moves. It was typed at 12.5px, which left the site's biggest
   call to action carrying its smallest button text. */
.hat-orderbar .elementor-button{
  display:block;width:100%;border-radius:0;
}
/* No press. The shared .elementor-button hover slides the button 3px into its
   own offset shadow; this bar is flush to the screen edges and has no shadow to
   move into, so the slide just detached it from the bottom of the window. */
.hat-orderbar .elementor-button:hover,
.hat-orderbar .elementor-button:active{
  transform:none;
  box-shadow:none;
}
/* The bar would otherwise sit on top of the footer's last row. */
@media(max-width:980px){
  body{padding-bottom:52px}
  /* AND THE OFFSET GOES WITH IT. inc/orderbar.php puts hat-no-orderbar on the
     body of every page the bar is not allowed on; without this line those pages
     would keep 52px of empty ground under the footer, reserved for a bar that
     is never drawn. Two classes, so it beats the bare `body` rule above at
     (0,0,1) whatever the source order. */
  body.hat-no-orderbar{padding-bottom:0}
}
/* display:none, not visibility or a transform: the bar must take no space and
   its button must not be reachable by keyboard on a page that has decided not
   to offer it. (0,2,0) beats .hat-orderbar's (0,1,0). */
.hat-no-orderbar .hat-orderbar{display:none}

/* Elementor's mobile menu toggle ships as bare grey bars. The mockup draws it
   as a bordered button: gold outline, 9px radius, cream strokes, 42x38. Drawn
   rather than the hamburger character because the glyph sits in a fixed em box
   with thin strokes, so scaling font-size grows the button and barely grows
   the bars. */
.hat-header-root .elementor-menu-toggle{
  width:42px;height:38px;padding:0;
  border:2px solid var(--gold);border-radius:9px;
  background:transparent;color:var(--cream);
}
/* The button's box was already centred, 11px either side and 11.5 top and bottom.
   The GLYPH was not: Elementor renders the toggle as an <i>, and a 20px line box
   inside a 15px-tall element puts the bars low. Size the element to the glyph and
   let the flex centring do the rest. */
/* NO display here. Elementor hides the toggle above its dropdown breakpoint with
   `display:none`, and a two-class rule setting display:flex outranks it, which
   put the burger on the desktop header. The centring is safe to state
   unconditionally; only the display is not. */
.hat-header-root .elementor-menu-toggle{align-items:center;justify-content:center}
.hat-header-root .elementor-menu-toggle svg,
.hat-header-root .elementor-menu-toggle i{
  width:20px;height:auto;font-size:20px;line-height:1;
  fill:var(--cream);color:var(--cream);
}
.hat-header-root .elementor-menu-toggle svg{height:15px}
.hat-header-root .elementor-menu-toggle:hover{background:transparent}

/* ---------------------------------------------------------------------------
   Mobile location row. A thin centred text row, NOT two buttons: built as
   buttons it inherited the kit's gold fill and offset shadow and rendered as
   two large blocks.
   ------------------------------------------------------------------------ */
/* The mobile picker row is the same control as the pill, rendered as a band. The
   band itself is the container: its background, top border and padding are all
   container controls. Only the button's own type and mark are here, for the same
   two reasons the pill's are. */
.hat-locrow .elementor-button{
  /* 14px, up from the mockup's 11. Still typed rather than bound to hat-btn:
     this is a status strip naming the room you are in, not a control, and it
     keeps its own wider .15em tracking. */
  font-family:var(--face-ui);font-size:14px;font-weight:700;
  letter-spacing:.15em;text-transform:uppercase;line-height:1.1;
  white-space:nowrap;
}
.hat-locrow .elementor-button-content-wrapper{
  display:flex;align-items:center;justify-content:center;gap:9px;
}
/* 17px here, not the pill's 22px: the row's type is 11px against the pill's
   14px, so the mark steps down with it. */
.hat-locrow .elementor-button-content-wrapper::after{
  content:"";width:17px;height:17px;flex:0 0 17px;
  background-color:var(--green);
  -webkit-mask:var(--mark-shamrock) center/contain no-repeat;
          mask:var(--mark-shamrock) center/contain no-repeat;
}

/* Both pickers are Buttons now, so the sitewide press-in hover would otherwise
   apply to them. The mockup's picker has no hover motion: it is a control on a
   dark bar, not a call to action. */
.hat-locpill .elementor-button:hover,
.hat-locrow .elementor-button:hover{transform:none;box-shadow:none}

/* ============================================================================
   FOOTER
   Values taken from _redesign/homepage-mockup.html <footer class="site">.
   The footer opens with a jersey stripe, from footer.site::before in the mockup:
   gold / cream / gold, mirroring the header's gold / shamrock / gold. It is
   built by tools/build-footer-template.php as the root's first child.
   ========================================================================= */

.hat-foot-locs{
  display:grid;grid-template-columns:1fr 1fr;gap:0;
  border-bottom:1px solid rgba(247,242,230,.14);
}
.hat-foot-locs > .hat-foot-loc:first-child{border-right:1px solid rgba(247,242,230,.14)}

.hat-foot-ln{
  color:rgba(247,242,230,.84);font-size:16.5px;line-height:1.7;
}
.hat-foot-ln a{color:rgba(247,242,230,.8);text-decoration:none}
.hat-foot-ln a:hover{color:var(--gold)}

.loclinks{display:flex;flex-wrap:wrap;gap:6px 18px;margin-top:16px}
.loclinks a{
  color:rgba(247,242,230,.82);text-decoration:none;
  font-size:15.5px;font-weight:600;
}
.loclinks a:hover{color:var(--gold)}

/* Placeholder marker. South Tampa's address, phone and hours are blocked on the
   client, so the gap is made obvious rather than filled with something
   plausible. Do not replace these with invented values. */
.ph-flag{
  background:rgba(224,174,31,.22);outline:1px dashed var(--gold);
  padding:0 5px;border-radius:2px;
}

.hat-foot-links{display:grid;grid-template-columns:repeat(3,1fr);gap:28px}
/* 820px is the mockup's own breakpoint for this row, and it is neither of
   Elementor's (980 / 767), so it lives here. */
@media(max-width:820px){
  .hat-foot-links{grid-template-columns:repeat(2,1fr);gap:24px}
  /* The Follow column takes the whole row once the grid is two wide. It is the
     third of three, so it lands under the first column alone, 152px on a
     phone: room for three discs, and a fourth (TikTok, 2026-10-06) wrapped to a
     line of its own with the whole right half of the row empty. */
  .hat-foot-links > :has(.hat-foot-soc){grid-column:1 / -1}
}
/* UPPERCASE, AND TRACKED AND STEPPED DOWN BECAUSE OF IT. Departs from the
   mockup's 16.5/400 sentence case, agreed 2026-08-24.

   The three numbers are not a taste call, they follow from the case. The column
   heading above these is already uppercase gold 13.5/700 at .2em, so heading and
   link were told apart by size, weight, colour AND case at once; going caps
   spends one of the four, and at 16.5/400 untracked the links then out-measured
   their own heading in every dimension but colour. 15/600/.09em keeps the link a
   size step BELOW the heading, and caps set without tracking read as cramped
   prose rather than as a nav. Caps also run ~15% wider, and "Our History" is the
   item that would wrap first at the 820px breakpoint, which the step down buys
   back. Change one of the three and re-check that item at 820. */
.hat-foot-links a:not(.hat-soc){
  color:rgba(247,242,230,.82);text-decoration:none;
  font-size:15px;font-weight:600;text-transform:uppercase;letter-spacing:.09em;
  display:block;padding:7px 0;line-height:1.35;
}
.hat-foot-links a:hover{color:var(--gold)}

/* Heading spacing.

   Elementor's Heading widget sets margin:0 and the Kit's typography presets
   cannot carry a margin (the typography group control has no margin field), so
   every footer heading sat flush against its content: measured 0px where the
   mockup has 14px under an h4 and 12px under an h3.

   Set on the widget wrapper rather than the heading itself, because Elementor
   wraps each widget and a margin on the inner element collapses differently. */
.hat-footer-root h3{margin:0 0 12px}
.hat-footer-root h4{margin:0 0 14px}

/* Solid gold discs with ink glyphs, matching the button language. Thin
   outlined circles read as generic social chrome and were the weakest thing
   in the footer. */
.hat-foot-soc{display:flex;flex-wrap:wrap;gap:12px;margin-top:6px}
/* ALWAYS A CIRCLE. Width and height alone are not enough in a flex row: an item
   may SHRINK, so a narrow phone squeezed the width and left the height, and the
   discs drew as ovals. That began showing with a fourth icon (TikTok,
   2026-10-06). flex:0 0 42px forbids the shrink, aspect-ratio holds the square
   whatever else changes, and the row wraps rather than squeezing. The mobile
   menu's discs already had the flex rule; the footer never did. */
.hat-foot-soc a{
  width:42px;height:42px;flex:0 0 42px;aspect-ratio:1/1;box-sizing:border-box;
  background:var(--gold);border:2px solid var(--ink);
  border-radius:50%;display:flex;align-items:center;justify-content:center;
  padding:0;color:var(--ink);
  transition:transform .12s ease,background .12s ease;
}
.hat-foot-soc svg{width:20px;height:20px;fill:currentColor}
.hat-foot-soc a:hover{transform:translateY(-2px);background:var(--cream)}

.hat-fine{
  border-top:1px solid rgba(247,242,230,.14);padding:20px 0 30px;
  font-size:13.5px;color:rgba(247,242,230,.5);
  display:flex;justify-content:space-between;flex-wrap:wrap;gap:10px;
  position:relative;z-index:2;   /* always wins the overlap with the sign-off mark */
}
.hat-fine a{color:inherit;text-decoration:none}
.hat-fine a:hover{color:var(--gold)}

/* Sign-off wordmark. NEVER cropped: a signature with its swash cut reads as a
   rendering fault, not a crop. Pulled up so it rises to just under the legal
   line, which is why .hat-fine carries a stacking context. */
.hat-markband{overflow:hidden;position:relative;line-height:0;padding:0 0 26px;margin-top:-46px}
.hat-markband__img{
  width:min(64%,820px);max-width:none;margin:0 auto;display:block;opacity:.2;
}
@media(max-width:820px){
  /* the legal line wraps to two rows here, so the desktop pull would collide */
  .hat-markband{margin-top:-8px;padding-bottom:18px}
  .hat-markband__img{width:82%}
}

@media(max-width:980px){
  .hat-foot-locs{grid-template-columns:1fr}
  .hat-foot-locs > .hat-foot-loc{padding:34px 24px !important}
  .hat-foot-locs > .hat-foot-loc:first-child{
    border-right:0;border-bottom:1px solid rgba(247,242,230,.14);
  }
}

/* Gold-outline secondary button (.btn.sm.btn-goldline in the mockup): the
   offset shadow is GOLD, not ink, because an ink shadow is nearly invisible
   on the tavern green band.

   THREE CLASSES, AND THIS IS WHY. The kit writes the button's shadow at
   `.elementor-kit-2141 .elementor-button`, which is (0,2,0) - exactly what
   `.hat-btn-goldline .elementor-button` is. A tie is decided by source order,
   and post-2141.css is enqueued at position 14 while hattricks.css is at 8, so
   the kit's `3px 3px 0 #141414` won every time and the footer's Directions
   buttons shipped with a BLACK shadow inside a GOLD border. The rule was in the
   served file and grepped as present the whole time.

   `_css_classes` lands on the widget wrapper, so `.elementor-widget` is there
   to be picked up and costs nothing. Same treatment for :hover, where the kit's
   own hover selector is (0,3,0). */
.hat-btn-goldline.elementor-widget .elementor-button{box-shadow:2px 2px 0 var(--gold)}
.hat-btn-goldline.elementor-widget .elementor-button:hover{box-shadow:none}

/* ---------------------------------------------------------------------------
   The room. A centred intro between the hero and the first feature, on the
   page's own ground.

   All three rules are here for reasons already recorded elsewhere in this file
   and worth restating at the point of use:

   - The heading is targeted at .elementor-heading-title, not at the wrapper. A
     class on a Heading widget lands on the wrapper, and Elementor sets
     line-height:1 on the title inside it, so a size or leading set on the
     wrapper is inherited and then overridden.
   - The paragraph carries the measure and the widget carries the spacing. A
     class on a Text Editor widget cannot set a measure: Elementor pins the
     widget to max-width:100% with more specificity than one class.
   - The button's top margin is a margin-block-end problem in reverse. The kit
     emits .elementor-widget:not(:last-child){margin-block-end:0} at (0,2,0),
     so anything relying on a bottom margin between these widgets loses on
     source order. Spacing here is set as top margins, which nothing fights.
   ------------------------------------------------------------------------ */
.hat-room__h .elementor-heading-title{
  font-size:clamp(34px,4.6vw,64px);
  /* .94, which is the base h2 leading the mockup inherits here, not the .96
     beer of the month uses. At 64px that is 60.16 against 61.44, and the
     difference compounds on a two line heading. */
  line-height:.94;
  margin:0;
}

.hat-room__p{margin-top:18px}
/* Size and leading come from the hat-lead global now. What is left here is the
   measure and the centring, which are layout rather than type. */
.hat-room__p p{
  max-width:60ch;
  margin:0 auto;
}

.hat-room__btn{margin-top:28px}

/* ---------------------------------------------------------------------------
   Promo carousel controls.

   One pill holding the previous arrow, the dots and the next arrow, floating
   over the bottom of the slide.

   IT IS BUILT AS A SEGMENTED CONTROL, not as a pill with two arrows placed on
   top of it, and that is the whole point. The first version pinned the arrows
   at fixed offsets from centre and let the dots' pill grow behind them, which
   works at exactly one slide count: add a third promo and the pill widens, the
   arrows stay put, and the dots slide underneath them. The number of slides is
   the client's to change, so nothing here may depend on it.

   Instead the three controls are laid out in flow, in order, and each carries
   the same background and border. Adjacent, with the outer two rounded and the
   middle one square, they read as one object and the object is exactly as wide
   as its contents. Any number of dots.

   Elementor renders them as siblings of .swiper inside the widget container, in
   the order swiper, prev, next, pagination, so `order` puts the dots back
   between the arrows.
   ------------------------------------------------------------------------ */
.hat-promocar .elementor-widget-container{
  display:flex;
  flex-wrap:wrap;
  align-items:center;
  justify-content:center;
  /* Line two starts exactly where line one ends, rather than being spaced by
     the default. The control line carries a negative margin, so its flex line
     has a NEGATIVE cross size and any distribution of it is guesswork. */
  align-content:flex-start;
}

.hat-promocar .swiper{flex:0 0 100%;order:1}

/* Pulled up over the slide rather than positioned against it: all three sit on
   one flex line, so one negative margin moves the whole control.

   THE MARGIN AND THE LIFT ARE SEPARATE ON PURPOSE, and doing it in one step is
   what put a 26px band of colour under the photograph on mobile.
   -60px is the pill's own height, which makes its flex line measure exactly
   zero, so the widget ends up precisely as tall as the slide and the section
   needs nothing given back to it.
   The 26px it should clear the slide's edge by is then a TRANSFORM, because a
   transform moves paint without moving layout. Rolling both into a -86px margin
   made the line measure -26, which the widget had to repay as padding, and that
   padding was the gap. */
.hat-promos .hat-promocar.hat-promocar .elementor-swiper-button,
.hat-promos .hat-promocar.hat-promocar .swiper-pagination{
  position:relative;
  z-index:7;
  margin:-60px 0 0;
  inset:auto;
  /* The lift, and also the override that Elementor's own offsets need.
     inset:auto above does not cover this: Elementor centres these against the
     slide with a TRANSLATE as well as an offset, translate(-50%,-100%) on the
     dots and translate(0,-50%) on each arrow, and a translate applies to an
     in-flow element exactly as it does to an absolute one. Left standing it
     drew the dots 48px left and 60px up from the flow position they correctly
     held, back underneath the previous arrow. Stating the lift here neutralises
     it and does the 26px in the same declaration. */
  transform:translateY(-26px);
  height:60px;
  display:flex;
  align-items:center;
  /* align-self, so the container's align-items:center cannot move these. A
     zero-height flex line has nothing to centre in, but an earlier version of
     this pull made the line measure -26, the browser clamped that to 0, and
     centring then had 26px of phantom free space to split: the pill sat 13px
     below the offset asked for, for no reason visible in any of the numbers. */
  align-self:flex-start;
  /* The segments draw NOTHING. The pill's ground, outline and shadow are one
     box, hung off the dots below, because three boxes cannot share a shadow:
     each casts its own onto its neighbours, and the dots paint last, so their
     shadow fell across the next arrow and drew a seam down the middle of a
     control that is meant to read as a single object. */
  background:transparent;
  border:0;
  box-shadow:none;
}

/* THE PILL ITSELF. One box behind all three segments.
   -52px is the arrow width set below, stated twice because a pseudo-element
   cannot measure its siblings. The two numbers move together; there is no
   third place to change. */
.hat-promos .hat-promocar.hat-promocar .swiper-pagination::before{
  content:"";
  position:absolute;
  top:0;
  bottom:0;
  left:-52px;
  right:-52px;
  background:var(--cream);
  border:3px solid var(--ink);
  border-radius:999px;
  box-shadow:0 4px 14px rgba(0,0,0,.18);
  z-index:-1;
}

.hat-promos .hat-promocar.hat-promocar .elementor-swiper-button{
  width:52px;
  justify-content:center;
  color:var(--ink);
  transition:background .15s ease,color .15s ease,opacity .15s ease;
  /* Above the dots, and that is what puts the arrows above the pill. The pill
     is a negative-z pseudo-element of the dots, so it paints inside the dots'
     stacking context; anything that must sit on top of it has to outrank the
     dots themselves, not the pseudo-element. */
  z-index:8;
}
/* The end radii are kept for the HOVER FILL, not for an outline: the fill has
   to take the pill's shape at the cap or a square corner overhangs it. */
.hat-promos .hat-promocar.hat-promocar .elementor-swiper-button-prev{
  order:2;
  border-radius:999px 0 0 999px;
  padding-left:6px;
}
.hat-promos .hat-promocar.hat-promocar .swiper-pagination{
  order:3;
  width:auto;
  gap:10px;
  padding:0 4px;
  justify-content:center;
}
.hat-promos .hat-promocar.hat-promocar .elementor-swiper-button-next{
  order:4;
  border-radius:0 999px 999px 0;
  padding-right:6px;
}

/* THE DOTS ARE SET WITH VARIABLES, NOT WITH RULES, for the same reason the
   arrows above are. Fixed 2026-08-25; before it, all three dots were solid
   BLACK at 6px and the active one was indistinguishable, so the pagination
   showed the slide count and nothing else.

   `.elementor-widget-loop-carousel .swiper-pagination-bullet` in
   widget-loop-carousel.min.css is (0,2,0) and writes
   `background:var(--dots-normal-color,#000)` plus width and height from
   `--swiper-pagination-size`. The rule that used to be here was
   `.hat-promocar .swiper-pagination-bullet`, which is ALSO (0,2,0): an equal
   specificity tie, and Pro's stylesheet loads after this one, so it won every
   property it named. That is why the size went too, not just the colour, and
   why the -active rule lost as well: Elementor's selector matches the active
   bullet just as well, at the same weight, later in the cascade.

   THERE IS NO --dots-active-color. Pro only publishes --dots-normal-color and
   --dots-hover-color; the ACTIVE fill comes from swiper's own
   `--swiper-pagination-color`, one layer further down. Three variables from two
   vendors for one control, which is why guessing at this never converges: read
   widget-loop-carousel.min.css and swiper.min.css and set what they name.

   FOUR CLASSES. Elementor declares the --dots-* family on
   `.elementor-widget-loop-carousel`, a single class, so a one-class or
   two-class declaration here silently keeps its defaults. The arrows above
   already use this selector for the same reason. */
.hat-promos .hat-promocar.hat-promocar.elementor-widget{
  --dots-normal-color:transparent;
  --dots-hover-color:var(--green);
  --swiper-pagination-color:var(--ink);
  --swiper-pagination-size:11px;
}

/* What is left is everything Pro's rule does NOT name, so there is no tie to
   lose: it sets background, width and height and nothing else. */
.hat-promocar .swiper-pagination-bullet{
  margin:0;
  border:2px solid var(--ink);
  border-radius:50%;
  opacity:1;
  flex:0 0 auto;
  box-sizing:border-box;
  transition:background .14s ease;
}

/* THE ACTIVE FILL HAS TO BE A RULE, AND IT HAS TO OUTRANK ELEMENTOR'S INACTIVE
   ONE. Setting --swiper-pagination-color above is not enough and the reason is
   worth writing down: swiper's own `.swiper-pagination-bullet-active` is
   (0,1,0), and Elementor's `.elementor-widget-loop-carousel
   .swiper-pagination-bullet` is (0,2,0) and matches the active bullet too. So
   Pro's INACTIVE rule beats swiper's ACTIVE rule, and --dots-normal-color
   painted all three dots the same whatever the active colour said.
   Four classes, so this clears Elementor's two and the tie question never
   arises. Measured 2026-08-25: active is ink, the other two are transparent. */
.hat-promos .hat-promocar.hat-promocar .swiper-pagination-bullet-active{
  background:var(--ink);
}

/* THE ARROWS ARE DRAWN, NOT SET IN A FONT.
   Elementor renders each one as <i class="eicon-chevron-left"> and takes the
   glyph from its `eicons` font. The font loads here and the rule that gives
   that class its character does not: the ::before resolves to an EMPTY content
   string, so the arrows had correct colour, size and position and painted
   nothing at all.

   A mask over currentColor needs no font and no extra request, which is the
   same call already made for the phone mark in the hero. A shaft and a head,
   because the mockup's pill has arrows rather than chevrons. */
.hat-promocar .elementor-swiper-button i,
.hat-promocar .elementor-swiper-button svg{display:none}

.hat-promocar .elementor-swiper-button::before{
  content:"";
  width:17px;
  height:17px;
  background-color:currentColor;
  -webkit-mask:var(--hat-arrow) center/contain no-repeat;
  mask:var(--hat-arrow) center/contain no-repeat;
}
/* One mark, flipped, rather than a second data URI to keep in step with the
   first. The arrow is symmetric about its own axis so the flip is exact. */
.hat-promocar .elementor-swiper-button-prev::before{transform:scaleX(-1)}

/* Fills on hover and holds the fill while pressed. The mark is currentColor,
   so flipping the button's colour flips the arrow with it. focus-visible as
   well, because these are real buttons. */
.hat-promos .hat-promocar.hat-promocar .elementor-swiper-button:hover,
.hat-promos .hat-promocar.hat-promocar .elementor-swiper-button:focus-visible{
  background:var(--ink);
  color:var(--cream);
}

/* With the loop on the arrows never disable, but the rule stays: a disabled
   control must not offer a fill it will not honour. */
.hat-promos .hat-promocar.hat-promocar .elementor-swiper-button.swiper-button-disabled{
  opacity:.32;
  cursor:default;
}
.hat-promos .hat-promocar.hat-promocar .elementor-swiper-button.swiper-button-disabled:hover{
  background:var(--cream);
  color:var(--ink);
}

/* ---------------------------------------------------------------------------
   The to-go band's photograph.

   THE PICTURE COLUMN NEEDS ITS OWN SHAPE. It is an empty container carrying a
   background image, so it has no content to give it height: on desktop it
   would be a flex item stretched by the words beside it, and stacked it
   collapses to nothing. Same trap as the menu features and the carousel
   slides, and the third time it has cost a blank picture on this build.

   1:1 at every width, so the crop is the same picture on a phone as on a
   desktop. The source is a 1520x1708 upright, so a square box loses about
   187px off the BOTTOM of the original at this scale, which is floor and legs.
   The platter ends around y=1450 and survives. background-position keeps the
   top anchored, so faces can never be the thing that gets cut.

   The banner that stood here described an inline SVG's sizing. That drawing was
   replaced by this photograph and the comment outlived it by one commit.
   ------------------------------------------------------------------------ */
/* Two equal tracks, 44px apart, centred: the homepage shop band's grid, copied
   deliberately rather than approximated. A 58/42 flex split had the picture at
   497; equal tracks put it at 598, which is the whole point of matching. */
.hat-togo > .e-con-inner{
  display:grid;grid-template-columns:1fr 1fr;gap:44px;align-items:center;
}
.hat-togo__txt{align-self:center}
.hat-togo__art{
  align-self:center;
  aspect-ratio:1/1;
  min-height:0;
  border-radius:20px;
  overflow:hidden;
  border:4px solid var(--ink);
}

/* hat-room__h centres its heading for the intro band. This one sits beside a
   picture, so it is told otherwise; the type is identical, only the axis
   differs, which is why it is a modifier rather than a second heading class. */
.hat-togo__h .elementor-heading-title{text-align:left}
.hat-togo__p p{max-width:46ch}

/* 820, NOT Elementor's 980. This band stacks with the shop band it copies, and
   the shop band's breakpoint is the mockup's own rather than either of
   Elementor's. Two rows that look identical must not stack at different widths.
   ------------------------------------------------------------------------ */
@media(max-width:820px){
  /* THE BAND STAYS LEFT ALIGNED. Only the track count changes here.

     An earlier version centred everything in this query, on the assumption
     that a stacked row centres like the other stacked rows on this page. This
     one does not: it keeps its flush-left edge at every width, so the eyebrow,
     the heading, the copy and the button all go on starting at the same line
     the picture's left edge sits on. Nothing about alignment belongs here. */
  .hat-togo > .e-con-inner{grid-template-columns:1fr;gap:26px}
}

/* ---------------------------------------------------------------------------
   Feature rows. A picture one side, a block of words the other, full bleed.
   Used by the food and drinks menu sections on every location page.

   Only two things here, because everything else is a container control.

   1. The stripe frame's gradient. Elementor's gradient control gives two stops
      with a position each; this is a repeating gradient with hard stops, so it
      cannot be a control. Its padding and radius stay as controls.

      The bands are QUARTERS of the frame, which is half the page wide, so each
      band is about 166px. Anywhere this frame is used at full width the
      percentage has to halve to keep that band width, or it reads as two
      enormous blocks. Repeating it much tighter reads as a candy cane; that was
      tried and rejected.

   2. Stacking order below the tablet breakpoint. The picture leads on a phone
      in BOTH rows: a stacked layout that alternates picture and text looks like
      a mistake rather than a rhythm. On desktop the order is markup order and
      there is no class for it.
   ------------------------------------------------------------------------ */
.hat-stripeframe{
  background:repeating-linear-gradient(90deg,
    var(--gold) 0 25%,
    var(--green) 25% 50%);
}

@media(max-width:980px){
  .hat-feature__pic{
    order:-1;
    /* 4:3, not square. A square picture on a phone is a full screen width of
       one photograph before any words. The row's own min-height is dropped to
       0 at this breakpoint so this is what sets the height. */
    aspect-ratio:4/3;
  }
}

/* ---------------------------------------------------------------------------
   Beer of the month.

   The flyer is PAPER, not a framed image: no box, no mat, the img keeps its own
   aspect ratio and a shadow sits behind it.

   drop-shadow rather than box-shadow, and it has to be a class rather than a
   control: Elementor's image CSS Filters are blur, brightness, contrast,
   saturation and hue, with no drop-shadow among them. The difference matters
   because flyers arrive as PNGs sometimes, and a box shadow draws a rectangle
   behind a cutout while drop-shadow follows the outline.

   The type block is a class for the same reason the stripe is: what it needs,
   a display face at a size the kit has no preset for, .02em tracking, and a
   colour split between the line and the <b> inside it, is more than one widget
   control can express.
   ------------------------------------------------------------------------ */
/* A LIGHTBOX OF ONE HAS NOWHERE TO GO. Both arrows are correctly disabled by
   gallery.js, which still draws two dead controls over the picture. The beer of
   the month flyer is a gallery of exactly one, so this is not a rare case. */
.hat-lightbox[data-hat-lightbox-single] .hat-lightbox__nav{display:none}

.hat-paper img{
  display:block;
  height:auto;
  transition:transform .2s ease,filter .2s ease;
}

.hat-paper--now img{
  filter:drop-shadow(0 16px 26px rgba(0,0,0,.30)) drop-shadow(0 3px 6px rgba(0,0,0,.16));
  transform:rotate(-1.2deg);
}
.hat-paper--now img:hover{transform:rotate(0deg) translateY(-4px)}

/* The archive sheet. Behind in reading order, knocked back so it never
   competes, and full strength on hover so it reads as browsable. */

.hat-botm__h .elementor-heading-title{
  font-size:clamp(34px,4.6vw,64px);
  line-height:.96;
  margin:0;
}

.hat-botm__beer .elementor-heading-title{
  font-family:var(--face-display);
  font-weight:800;
  text-transform:uppercase;
  letter-spacing:.02em;
  font-size:clamp(21px,2.1vw,27px);
  line-height:1.05;
}

/* #57503F, darkened from the mockup's #6a6355 on 2026-08-21. It is a
   secondary line, so it stays lighter than the copy around it, but 5.33:1 was
   the weakest text on the page. */
.hat-botm__by p{color:#57503F;margin:0}
.hat-botm__by b{color:var(--ink);font-weight:600}

.hat-botm__desc p{margin:0;max-width:46ch}


@media(max-width:980px){
  /* The archive drops out rather than shrinking. Two sheets side by side in a
     phone column leaves neither readable, and last month is the half worth
     losing. The current flyer takes the width it frees up. */
  /* Direction, alignment and the poster's width are all CONTROLS on the
     widgets, not rules here: Elementor writes flex-direction and image width at
     element-id specificity and a class rule loses to both silently. */
}

/* ---------------------------------------------------------------------------
   Location hero, option J. A facts card over a photograph.

   Four things Elementor controls cannot do, and nothing else:

   1. The scrim. Three hard stops; the container's overlay gradient control
      gives two. The overlay is switched ON in the builder purely so this rule
      has something to land on, and on a CONTAINER that something is ::before,
      not a .elementor-background-overlay div. Sections use the div, containers
      use the pseudo-element, which is the same fact already recorded as "the
      ::before on a container belongs to Elementor" and is why a decorative
      pseudo-element cannot be added there.
   2. The phone glyph, as a mask rather than an icon. Elementor's button icon
      control would pull in an icon library for one 15px mark, and the font
      payload on this site was cut from 54 variants to 5 on purpose. A mask
      also takes its colour from the element, so it follows the button.
   3. The address underline. text-underline-offset and -thickness have no
      controls, and the point of the treatment is a green rule under ink type
      that goes ink on hover.
   4. The hours label and time, which need the display face at a size the kit
      has no preset for.
   ------------------------------------------------------------------------ */
/* svh, matching the homepage hero. A phone's toolbar collapses on scroll and
   vh does not notice, so the hero grows mid-scroll; svh is the small viewport
   and holds still. */
.hat-lochero{min-height:min(88svh,760px)}

.hat-lochero::before{
  background-image:linear-gradient(180deg,
    rgba(0,0,0,.62) 0%,
    rgba(0,0,0,.34) 42%,
    rgba(0,0,0,.72) 100%);
  background-color:transparent;
}

/* FOUR classes, and every one of them is load bearing. The eyebrow binds the
   kit's hat-eyebrow typography for its face, weight and case, but this one is
   13px on .11em tracking rather than the preset's 14.5 on .2em. Elementor
   writes a global binding at
   `.elementor-3483 .elementor-element.elementor-element-XXX .elementor-heading-title`,
   which is (0,3,0), so a two class rule here loses on specificity rather than
   on source order and the eyebrow silently comes out at the preset size. */
.hat-fcard .hat-fcard__eyebrow.hat-fcard__eyebrow .elementor-heading-title{
  font-size:13px;
  letter-spacing:.11em;
  /* The shared hero eyebrow carries a two layer shadow for legibility over a
     photograph. This one is on cream inside a card, so it carries none. */
  text-shadow:none;
}

.hat-fcard__h1 .elementor-heading-title{
  font-size:clamp(34px,4.2vw,58px);
  line-height:.9;
  text-shadow:none;
  margin:0;
}

.hat-fcard__adr .elementor-heading-title,
.hat-fcard__adr a{
  font-size:19px;
  font-weight:600;
  line-height:1.3;
  text-decoration:underline;
  text-underline-offset:3px;
  text-decoration-thickness:2px;
  text-decoration-color:var(--green-text);
}
.hat-fcard__adr a:hover{text-decoration-color:var(--ink)}

.hat-fcard__hrslab .elementor-heading-title{font-size:17px;font-weight:600;line-height:1.2}
.hat-fcard__hrsbig .elementor-heading-title{
  font-family:var(--face-display);
  font-weight:800;
  text-transform:uppercase;
  font-size:27px;
  line-height:1;
  white-space:nowrap;
}

/* The phone mark is an Elementor icon now, not a mask: Font Awesome Solid is
   already enqueued on this site by something else, so the payload argument
   that produced the mask does not hold, and an icon control is the thing the
   client can actually change. All that is left here is its colour, which is
   green like the address underline rather than ink like the label. */
/* .hat-telpill .elementor-button-icon is gone with the icon control; the
   glyph is the ::before in the icon block at the top of this file. */
.hat-telpill .elementor-button-text{white-space:nowrap}
:root{
  /* A shaft and a head, so it reads as an arrow rather than a chevron, which is
     what the mockup's pill uses. One mark: the prev button flips it on X. */
  --hat-arrow:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 12h14'/%3E%3Cpath d='M12.5 6.2 18.8 12l-6.3 5.8'/%3E%3C/svg%3E");
  --hat-phone:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M6.6 10.8a15.1 15.1 0 0 0 6.6 6.6l2.2-2.2c.3-.3.7-.4 1-.2 1.2.4 2.4.6 3.7.6.6 0 1 .4 1 1V20c0 .6-.4 1-1 1A17 17 0 0 1 3 4c0-.6.4-1 1-1h3.5c.6 0 1 .4 1 1 0 1.3.2 2.5.6 3.7.1.3 0 .7-.2 1l-2.3 2.1z'/%3E%3C/svg%3E");
}

/* --secbg, SO THE EYEBROW KNOCKS OUT IN THE CARD'S COLOUR RATHER THAN THE
   BAND'S. See the surface rule at the top of this file. .hat-fcard is an
   Elementor container, so its BACKGROUND is a control in
   tools/location/section-hero.php; a custom property is not a control, so it
   has to live here. */
.hat-fcard{--secbg:var(--paper)}

/* Both pills fill the card's column. The Button widget is an inline-block by
   default and a flex column parent blockifies it, which is not the same thing
   as filling: the anchor still shrinks to its text. */
.hat-telpill .elementor-button,
.hat-fcard__order .elementor-button{width:100%;display:flex;justify-content:center}

/* ---------------------------------------------------------------------------
   The promo slide's WHEN chip.

   The schedule used to sit above the heading in eyebrow position, which was
   wrong twice: it did not match the page's other eyebrows, and an eyebrow is a
   label rather than the place for the single most important fact about happy
   hour. Someone reading this needs to know when it is, and that cannot be the
   smallest type in the slide.

   Borrowed from the hero facts card's hours box rather than invented: bone,
   ink border, the same vocabulary the opening hours already use, so the page
   says "this is a time" the same way twice. A pill rather than that card's
   full width box, because it sits under a heading rather than in a stack.

   :empty, so a promo with no schedule renders no chip. A booking has no fixed
   time and an empty bordered pill is worse than nothing.
   ------------------------------------------------------------------------ */
.hat-slide__when .elementor-heading-title{
  display:inline-flex;
  align-items:center;
  background:var(--bone);
  border:2px solid var(--ink);
  border-radius:999px;
  padding:8px 16px;
  font-size:15px;
  font-weight:600;
  line-height:1.2;
}
.hat-slide__when:has(.elementor-heading-title:empty){display:none}

/* ---------------------------------------------------------------------------
   THE PROMO PICTURE'S COVER IS NOT LEFT TO GENERATED CSS.

   THIS IS THE INTERMITTENT "super zoomed in" BUG, reproduced 2026-08-25.

   background-position and background-size are container CONTROLS, so they live
   in the loop template's generated stylesheet. Elementor's print method here is
   `external`, and clear_cache() only DELETES: the file regenerates on the NEXT
   front-end request. So the first load after any cache clear renders with
   loop-3487's CSS absent, background-size falls back to its initial value of
   `auto`, and the photograph draws at its NATURAL size inside the box.

   Measured on that first load: the box was a correct 720x576 and bgSize
   computed `auto`, so ELS5850 drew at 900x1083 and showed 42% of itself at full
   scale, against 66% scaled down with cover. That is exactly "the carousel
   images are super zoomed in", and exactly why a refresh fixes it: by then the
   file exists.

   It is not only a development artefact. Elementor clears this cache on a theme
   or plugin update and on any template save, and the cache is empty after a
   deploy or a database push, so at cutover the FIRST visitor to each page gets
   it.

   Same family as the --display trap already recorded, but on a property whose
   fallback is silent rather than catastrophic, which is why it read as random.

   The controls stay set, so the editor still shows them and the generated rule
   still wins on specificity when it exists; these two lines are the floor for
   when it does not. Anything whose absence is VISIBLE should not depend on a
   file that is deleted and lazily rebuilt.
   ------------------------------------------------------------------------ */
.hat-slide__pic{
  background-size:cover;
  background-position:center center;
}

@media(max-width:980px){
  /* THE SLIDE PICTURE NEEDS A SHAPE OF ITS OWN HERE.
     It is an empty container carrying a background image, so it has no content
     to give it height. On desktop it is a stretched flex item and takes the
     row's; stacked, there is nothing to stretch to and it collapsed to 0px,
     which is a slide with no photograph at all.
     4:3 and a pinned width, matching the two menu features exactly: the width
     is definite so the ratio resolves into a height, rather than backwards
     into a width as it does on a stretched item. */
  .hat-slide__pic{
    aspect-ratio:4/3;
    width:100%;
    min-height:0;
    align-self:start;
    /* THE PICTURE IS THE FIXED PART OF THE SLIDE. It is exactly 4:3 on every
       slide and never absorbs anything; the text box takes up the slack. That
       is the answer to "make the images consistent": the photographs cannot
       differ between slides because nothing can stretch them.
       flex-shrink:0 so equalisation cannot squeeze one either. */
    flex-shrink:0;
  }

  /* THE TEXT BOX IS THE PART THAT GIVES. The picture above is fixed at 4:3 on
     every slide, Swiper equalises every slide to the tallest, and flex-grow
     here hands the whole of that surplus to the words. So all three quantities
     the eye checks come out identical without any of them being a number:
     slides are equal because Swiper makes them so, photographs are equal
     because nothing can stretch them, and text boxes are equal because they
     are each the same slide height minus the same picture.

     THE OLD VERSION PINNED THIS TO 4:3 AND THAT IS WHAT PUT A BUTTON OFF THE
     SIDE OF THE SCREEN. A definite height on a container Elementor gives
     flex-wrap:wrap to does not overflow downward, it wraps into a SECOND
     COLUMN. Happy Hour is the only promo with a WHEN chip, so it is the only
     one with four children, and at 393px its copy needs 265 of the 247 the
     ratio allowed: the button broke to a new column and was drawn at x=369,
     off the right edge, reading as a stray control from the next slide. The
     comment here used to claim the ratio let a long promo grow the box. It
     never did.

     min-height keeps today's proportions as a FLOOR, so a short promo still
     gets the shape the design was drawn at, while a long one is free to push.
     75vw is 4:3 of a full-bleed slide, and the slide is full-bleed wherever
     this query applies.

     flex-wrap:nowrap is belt and braces: with a floor rather than a ceiling
     there should never be overflow to wrap, but a second column is such a bad
     failure mode that it is worth forbidding outright. */
  .hat-promos .hat-slide .hat-slide__txt.hat-slide__txt{
    aspect-ratio:auto;
    min-height:75vw;
    flex-grow:1;
    flex-wrap:nowrap;
  }

  /* NOTHING IS SAID ABOUT THE CONTROLS HERE, AND THAT IS THE POINT.
     They are laid out in flow now, so they follow the widget wherever it ends
     and need no per-breakpoint rescue. Stacked, the slide runs words THEN
     picture, so the bottom of the widget is the bottom of the photograph and
     the same -86px lands the pill on the image exactly as at desktop.

     The version this replaced positioned all three absolutely and had to
     re-declare Elementor's arrow variables here, because Elementor re-declares
     them per breakpoint and its mobile values put the arrows back in the middle
     of the picture. */
}

/* ---------------------------------------------------------------------------
   Tampa teams' records.

   Fed by [hat_team_records] from inc/team-records.php, which renders nothing at
   all when it has nothing trustworthy to say. Everything here therefore styles
   a list that may simply not exist, and nothing reserves space for it.

   Three stacked blocks rather than one running line. Each team gets the big
   fact and then a line qualifying it, because the qualifier is the difference
   between true and misleading: "1-0" is a preseason record, and "2nd in
   Atlantic Division" finished in April.

   Sits on the dark sports band, so gold names, cream numbers, and the divider
   is cream at low alpha rather than a palette colour.
   ------------------------------------------------------------------------ */
/* NOWRAP, and that is the fix rather than a preference. With wrapping on, a
   team pushed to a second line still carried its left border, so the divider
   turned up at the START of the new row with nothing to its left. Three across
   or stacked, never a broken half row. Below the breakpoint it stacks properly
   and the dividers move to the top edge. */
.hat-records__list{
  display:flex;
  flex-wrap:nowrap;
  align-items:stretch;
  justify-content:center;
  gap:0;
  margin:0;
  padding:0;
  list-style:none;
}

.hat-records__team{
  display:flex;
  flex-direction:column;
  align-items:center;
  justify-content:flex-start;
  gap:6px;
  padding:0 clamp(22px,2.8vw,44px);
  /* EQUAL COLUMNS. flex:1 1 0 rather than letting each block size to its own
     content: "Lightning / Back Sep 20 / Last season, 2nd in Atlantic Division"
     is far wider than "Bucs / 1-0 / Preseason", so content sizing made the
     dividers land at three different intervals and the row look accidental.
     A zero basis means the row is split evenly and the dividers are rhythmic. */
  flex:1 1 0;
  min-width:0;
  /* A hairline between teams rather than a bullet, so the row reads as a
     scoreboard. Not on the first. */
  border-left:1px solid rgba(247,242,230,.22);
}
.hat-records__team:first-child{border-left:0}

.hat-records__name{
  font-family:var(--face-ui);
  font-weight:700;
  text-transform:uppercase;
  /* Tracking eased from .16em as the size went up: letterspacing that reads as
     deliberate at 12px reads as loose at 16. */
  letter-spacing:.12em;
  font-size:18px;
  line-height:1;
  color:var(--gold);
  white-space:nowrap;
}

/* The number is the point of the block, so it takes the display face at
   headline weight. */
.hat-records__stat{
  font-family:var(--face-display);
  font-weight:800;
  text-transform:uppercase;
  letter-spacing:.01em;
  font-size:clamp(26px,3vw,38px);
  line-height:1;
  color:var(--cream);
  /* nowrap, because every value here contains a legitimate break opportunity
     and none of them should take it: "76-51" and "13-5-2" break at the hyphen
     and "Back Sep 20" at the spaces. A record split across two lines stops
     being a number. */
  white-space:nowrap;
}

/* Deliberately quiet and deliberately present. Without it "1-0" reads as a
   season record and the Lightning look like they are mid-table today. */
.hat-records__note{
  /* 16, up from 13. It was sized for a 104px column; at 333 it can be read
     rather than squinted at, and the qualifier is the half that stops the
     number being misleading. */
  font-size:16px;
  font-weight:600;
  line-height:1.3;
  text-align:center;
  color:rgba(247,242,230,.72);
  /* min() rather than a bare 22ch. On the widest note, "Last season, 2nd in
     Atlantic Division", 22ch is wider than the column's content box, so the
     text ran to the divider with no air against it. Wrapping is fine; touching
     the rule is not. */
  max-width:min(22ch,100%);
}

@media(max-width:860px){
  /* A PYRAMID, not a stack. Three teams in one column made this the tallest
     thing on a phone for the least information on the page. Two up and one
     across the bottom is the same content in roughly half the height.
     A grid rather than flex, because the shape needs a cell to span: the odd
     one out takes the full width and centres, which gives 2+1 for the strip
     and 2+2+1 for the five on the standings page. */
  .hat-records__list{
    display:grid;
    grid-template-columns:1fr 1fr;
    gap:20px 0;
  }
  .hat-records__team:last-child:nth-child(odd){grid-column:1 / -1}

  /* Vertical rules between the pair, horizontal ones between the rows. The
     first row gets no rule above it and the first cell in a row gets none to
     its left. */
  .hat-records__team{
    padding:20px 12px 0;
    border-left:1px solid rgba(247,242,230,.22);
    border-top:1px solid rgba(247,242,230,.22);
  }
  .hat-records__team:nth-child(odd){border-left:0}
  .hat-records__team:nth-child(-n+2){padding-top:0;border-top:0}
  .hat-records__team:last-child:nth-child(odd){border-left:0}

  .hat-records__note{max-width:none}
}

/* The standings page's closing line. The page moved from the dark green band
   to bone on 2026-08-25 when it became cards: paper cards need a light ground
   under them per the surface rule, and green would have made every card a
   spotlight. So this is ink at low alpha rather than cream at low alpha. */
.hat-standings__note p{
  color:var(--copy);
  max-width:52ch;
  margin:0 auto;
}

/* ---------------------------------------------------------------------------
   The food menu's hero. Option B: a photograph, a gradient over it, type on top.
   Only the two things Elementor cannot express are here.
   ------------------------------------------------------------------------ */
.hat-menuhero__h1 .elementor-heading-title{
  font-size:clamp(46px,7.4vw,86px);
  line-height:.9;
  /* The photograph has bright patches. The gradient handles most of it; this
     holds the largest type up over the worst of them. */
  text-shadow:0 2px 18px rgba(0,0,0,.5);
}
/* text-wrap:pretty is the general guard against a widow on ANY hero lede, not
   just catering's: it is the property whose whole job is refusing to leave one
   word alone on the last line. Where it is unsupported the line simply wraps as
   before, so it costs nothing. The catering lede also binds its own "feeding N
   to M" phrase with non-breaking spaces, because that one is generated from the
   menu data and has to survive the numbers changing. */
.hat-menuhero__lede p{max-width:56ch;margin:0;text-wrap:pretty}

/* The menu's closing band.

   A MINIMUM HEIGHT, not just padding, because it runs video now. Sized by
   padding alone it was 313px: enough for a heading and two buttons and not
   enough to see a room in. This gives the footage somewhere to be, and the
   content centres in whatever height wins. */
/* THE CENTRING GOES ON .e-con-inner, NOT ON THE CONTAINER.

   This is a BOXED container, so Elementor wraps its children in .e-con-inner
   and gives that wrapper flex-grow:1. The outer element then has exactly one
   child that already fills it, so `justify-content:center` there is true,
   computes as `center`, and moves nothing: measured 84px of space above the
   headline and 331px below it while reporting itself centred. The wrapper is
   the flex container the content actually sits in.

   The class is written twice on both so they outrank Elementor's own container
   rules; declared once, each was served and ignored. */
.hat-menutail.hat-menutail{
  min-height:clamp(400px,40vw,560px);
  padding-top:clamp(52px,7vw,84px);
  padding-bottom:clamp(52px,7vw,84px);
}
.hat-menutail.hat-menutail > .e-con-inner{
  justify-content:center;
}
.hat-menutail__h .elementor-heading-title{
  font-size:clamp(38px,5.8vw,70px);line-height:.94;
}

/* ---------------------------------------------------------------------------
   FOOD MENU
   Rendered by [hat_menu] in inc/menu-render.php, which mirrors
   _redesign/menu-mockup.html. Everything below is layout the shortcode cannot
   express; nothing in the PHP carries an inline style.

   THE BANDS SET THEIR OWN GROUND HERE. Elsewhere .hat-band-* only declares
   --secbg, because the background is an Elementor container control on a
   section a builder wrote. These sections come out of a shortcode, so there is
   no control to set, and a band class that only sets a variable would leave
   every course transparent.
   ------------------------------------------------------------------------ */
/* THE WHOLE BLOCK CARRIES THE FIRST COURSE'S GROUND, and the jump row inherits
   it rather than declaring one.

   The pills sit in a transparent nav, and on this page every ancestor above it
   is transparent too, so what showed through was the BODY: Hello Elementor's
   white. It looked correct in the mockup only because that document's body is
   cream. A band of white behind the pills made them a section of their own,
   which is the opposite of what they are.

   Set here rather than on the nav so there is one ground for the block and no
   seam to keep in step: each course paints its own colour over the top, and the
   pills simply fold into the first. */
.hat-menu{background:var(--cream)}

/* THE EYEBROW'S TYPE, READ FROM THE KIT'S OWN VARIABLES.
   Everywhere else on this site an eyebrow is a Heading widget with the
   hat-eyebrow preset bound to it, and the preset supplies size, weight, case
   and tracking. This one comes out of a shortcode, so there is no widget to
   bind and it rendered at the body's 16px, weight 400, no caps, no tracking:
   the rule and the colour were right and the type was simply absent.

   The kit publishes the preset as custom properties on its own element, which
   is on <body>, so they are in scope here. Reading them keeps ONE source: change
   the preset in Site Settings and this follows, which hardcoding 14.5px would
   not. */
/* SCOPED TO BOTH SHORTCODE WRAPPERS. This was .hat-menu only, and happy hour
   renders the same .hat-rule-eyebrow markup inside .hat-hh, so its eyebrows got
   the knockout background and the green rule but none of the type: 16px
   regular sentence case where the rest of the site has 13px bold uppercase on
   .16em. The failure is quiet because the half that DOES match comes from a
   different rule, so the element looks styled and is only wrong. */
/* EVERY PAGE THAT DRAWS AN EYEBROW HAS TO BE NAMED HERE, and that is the
   third time it has been forgotten. Size, weight, tracking and case come from
   the kit's hat-eyebrow preset, which is bound on a WIDGET; a raw HTML eyebrow
   gets it only through this selector. Catering works because the whole page is
   inside .hat-menu. /about/ and /contact/ are not, so each had to be added
   after its eyebrow shipped as 16px body text.
   Anything new rendering .hat-rule-eyebrow outside .hat-menu belongs on this
   list. */
.hat-menu .hat-rule-eyebrow > *,
.hat-about .hat-rule-eyebrow > *,
.hat-about__head .hat-rule-eyebrow > *,
.hat-contact .hat-rule-eyebrow > *,
.hat-contact__head .hat-rule-eyebrow > *,
.hat-contact__aside .hat-rule-eyebrow > *,
.hat-order .hat-rule-eyebrow > *,
.hat-legal__head .hat-rule-eyebrow > *,
.hat-hh .hat-rule-eyebrow > *{
  font-family:var(--e-global-typography-hat-eyebrow-font-family);
  font-size:var(--e-global-typography-hat-eyebrow-font-size);
  font-weight:var(--e-global-typography-hat-eyebrow-font-weight);
  text-transform:var(--e-global-typography-hat-eyebrow-text-transform);
  letter-spacing:var(--e-global-typography-hat-eyebrow-letter-spacing);
}
.hat-menu__wrap{max-width:1240px;margin:0 auto;padding:0 24px}

.hat-course{padding:clamp(56px,7vw,96px) 0;scroll-margin-top:24px}
.hat-course.hat-band-cream{background:var(--cream)}
.hat-course.hat-band-bone{background:var(--bone)}

/* The jump row. No ground, no rule, not sticky: it is a set of controls
   belonging to the page rather than a bar above it. It wraps rather than
   scrolls, because a sideways scroll with nothing signalling it hides courses
   from anyone who does not think to swipe. */
.hat-menu__jump .hat-menu__wrap{
  display:flex;flex-wrap:wrap;gap:10px;
  padding-top:clamp(24px,3vw,38px);
}
/* PADDING MATCHES THE BUTTONS: 13 and 27, the same numbers build-menu-page.php
   sets as text_padding on every Order Online and Get Directions on the site.
   These were 6 and 18, which was tight enough to read as a different family of
   control from the buttons they sit near. It mattered more once the sublabel
   came off the drinks pills, because a pill with one line of text and 6px above
   it is barely taller than the text. */
.hat-menu__jump a{
  display:flex;flex-direction:column;line-height:1.15;text-decoration:none;
  color:var(--ink);border:2px solid var(--ink);border-radius:999px;padding:13px 27px;
}
.hat-menu__jump a b{font-size:14px;font-weight:700;letter-spacing:.09em;text-transform:uppercase}
.hat-menu__jump a span{font-size:12.5px;letter-spacing:.04em;font-weight:500;
  color:var(--copy);white-space:nowrap}
.hat-menu__jump a:hover{background:var(--ink);color:var(--cream)}
.hat-menu__jump a:hover span{color:rgba(247,242,230,.72)}

/* The one pill that LEAVES the page, dressed as the site's PRIMARY BUTTON:
   gold, ink border, ink type, and the offset shadow that presses in on hover.

   It keeps its place in the row rather than being pushed to the end. It carries
   the shadow that the award badge deliberately does not, and the difference is
   what each thing IS: the award is a label and had no business looking pressable,
   this is a link and every other link on the site that matters looks like this. */
/* TWO CLASSES, because Elementor's custom-frontend.min.css carries
   `.elementor a{box-shadow:none}`. That is (0,1,1) and a single class is
   (0,1,0), so the shadow was declared, served, and silently lost: the pill
   rendered gold and flat with no sign anything had been overridden. */
/* EVERY RULE HERE CARRIES TWO CLASSES, and both of the things this pill got
   wrong were that and nothing else.

   The row's own rules are `.hat-menu__jump a` and `.hat-menu__jump a:hover`.
   Those are (0,1,1) and (0,2,1): one class plus a TYPE selector, and the hover
   plus a pseudo-class. A single-class override is (0,1,0)/(0,2,0) and loses to
   both. So the gold pill turned ink on hover exactly like its neighbours, and
   Elementor's own `.elementor a{box-shadow:none}` took the shadow at the same
   time.

   Losing the shadow is what made the press look wrong rather than merely
   plain: the transform still ran, so the pill slid 3px down and right into
   nothing, which reads as a button pretending to be 3D. The slide was never
   the bug. It is the site's primary-button press and it is correct as soon as
   there is a shadow underneath it to press into. */
.hat-menu .hat-menu__away{
  background:var(--gold);
  border-color:var(--ink);
  box-shadow:3px 3px 0 var(--ink);
  transition:transform .09s ease,box-shadow .09s ease;
}
.hat-menu .hat-menu__away:hover{
  background:var(--gold);
  border-color:var(--ink);
  /* The anchor's own colour too, not just the b and span inside it. The row's
     `.hat-menu__jump a:hover` sets cream at (0,2,1) and every visible piece of
     this pill happens to carry its own colour, so nothing looked wrong; a pill
     that renders correctly only because no text is directly inside it is one
     word of markup away from turning cream on gold. */
  color:var(--ink);
  transform:translate(3px,3px);
  box-shadow:none;
}
.hat-menu .hat-menu__away b,
.hat-menu .hat-menu__away:hover b{color:var(--ink)}
.hat-menu .hat-menu__away span,
.hat-menu .hat-menu__away:hover span{color:rgba(20,20,20,.72)}
/* A REAL ICON, not a character in the content string. The arrow was U+2192 on
   a ::after, which is a glyph from whatever face happens to be resolved and
   renders differently in each. Font Awesome Solid is already enqueued on these
   pages by the header and footer widgets, so this is the same icon set
   Elementor's own icon control draws from and it needs no extra request. */
.hat-menu__away b .hat-ico{font-size:.82em;margin-left:6px;vertical-align:baseline}

/* THE ORDER PILL, WHICH IS AN ACTION SITTING IN A ROW OF SECTIONS.
   The other five pills scroll to a course; this one is the answer to "how do I
   get this", and at the same weight it read as a sixth course.

   It takes the away pill's treatment exactly, and for the same reason that pill
   has it: gold on an ink border with a 3px ink shadow is this site's primary
   button, and a row of pills is allowed one. It is NOT .hat-menu__away, because
   that class means "this one leaves the page" and this one scrolls.

   TWO CLASSES ON EVERY RULE. The row's own are `.hat-menu__jump a` at (0,1,1)
   and `.hat-menu__jump a:hover` at (0,2,1), so a single class loses to both and
   the pill would turn ink on hover like its neighbours while
   `.elementor a{box-shadow:none}` took the shadow at the same time. That exact
   pair of failures is already recorded above for the away pill. */
.hat-menu .hat-menu__order{
  background:var(--gold);
  border-color:var(--ink);
  box-shadow:3px 3px 0 var(--ink);
  transition:transform .09s ease,box-shadow .09s ease;
}
.hat-menu .hat-menu__order:hover{
  background:var(--gold);
  border-color:var(--ink);
  color:var(--ink);
  transform:translate(3px,3px);
  box-shadow:none;
}
.hat-menu .hat-menu__order b,
.hat-menu .hat-menu__order:hover b{color:var(--ink)}
.hat-menu .hat-menu__order span,
.hat-menu .hat-menu__order:hover span{color:rgba(20,20,20,.72)}

/* A course opens with a photograph, words beside it. Pre-Game has none, because
   the wings card already opens it with one. */
.hat-course__head{margin-bottom:clamp(32px,4vw,52px)}
.hat-course--pic .hat-course__head{
  display:grid;grid-template-columns:1fr 384px;gap:clamp(28px,4vw,56px);align-items:center;
}
.hat-course__text{min-width:0}
.hat-course__blurb{font-size:18px;line-height:1.6;max-width:60ch;color:var(--copy);margin:0}
.hat-course__shot{border:4px solid var(--ink);border-radius:20px;overflow:hidden;aspect-ratio:4/3}
.hat-course__shot img{width:100%;height:100%;object-fit:cover;display:block}
.hat-course h2 .elementor-heading-title,.hat-course h2{
  font-size:clamp(38px,5.8vw,70px);line-height:.94;margin:0 0 14px;
}

/* TWO COLUMNS, and the columns are independent. column-count would break a name
   from its price across a column boundary. */
.hat-menu__items{
  list-style:none;margin:0;padding:0;display:grid;
  grid-template-columns:1fr 1fr;gap:0 clamp(40px,5vw,72px);
}
.hat-item{padding:22px 0;border-bottom:1px solid rgba(20,20,20,.14)}
.hat-item__line{display:flex;align-items:baseline;gap:10px}
/* THE NAME CARRIES THE DISPLAY FACE EXPLICITLY, because nothing above it does.
   The kit sets tag typography for h1 to h3 only (tools/set-kit-typography.php,
   "H4 to H6 are left alone"), so this h4 fell through to Hello Elementor's
   reset, `h1..h6{font-family:inherit;font-weight:500}`, and inherited the kit
   BODY face. Every food and drink name therefore rendered in Barlow Semi
   Condensed 500: the same face as its own description one line below, and a
   different face from the price on the same baseline beside it.
   The mockup says otherwise and always did:
     menu-mockup.html - h1,h2,h3,h4{font-family:var(--display);
                        text-transform:uppercase;font-weight:800;
                        letter-spacing:.01em}
   with no case override on `.line h4`. Happy hour hit this first and patched it
   under `.hat-hh` alone, so the menu and drinks pages never got the fix; that
   override is now only the case exception, below.
   WEIGHT 800 AND NOT 700: functions.php loads Big Shoulders Display at 800 and
   nothing else, so a rule asking for 700 resolves to 800 anyway. Say the weight
   that paints. (0,1,1) beats the reset's (0,0,1). */
.hat-item__line h4{font-size:clamp(19px,1.6vw,23px);line-height:1.05;flex:0 1 auto;margin:0;
  font-family:var(--face-display);font-weight:800;text-transform:uppercase;
  letter-spacing:.01em}
/* The leader is a dotted BORDER on a flex spacer, not a row of full stops: it
   holds its weight at any width and cannot wrap to a line of its own. */
.hat-item__dots{flex:1 1 auto;border-bottom:2px dotted rgba(20,20,20,.28);
  transform:translateY(-5px);min-width:18px}
.hat-item__price{font-family:var(--face-display);font-size:clamp(19px,1.6vw,23px);
  color:var(--green-text);flex:0 0 auto;letter-spacing:.01em}
.hat-item__price::before{content:"$"}
.hat-item__desc{margin:7px 0 0;font-size:16px;line-height:1.55;color:var(--copy);max-width:54ch}

/* Variants indent under the item they belong to, so a priced option reads as an
   option and not as a dish of its own. */
.hat-item__vars{margin-top:9px;display:flex;flex-direction:column;gap:3px}
.hat-var{display:flex;align-items:baseline;gap:8px;font-size:15px;color:var(--copy)}
.hat-var::before{content:"+";font-weight:700;color:var(--green-text)}
.hat-var span{flex:1 1 auto}
.hat-var b{font-family:var(--face-display);font-size:17px;color:var(--green-text);font-weight:800}
.hat-var b::before{content:"$"}

/* THE TIERED ITEM IS A CARD, not a row. Three prices, an award and three
   preparations do not fit a name-and-price line, and it is the signature item,
   so it opens its course. The photograph is half the card and runs to its edge,
   which is why the card carries no padding and clips instead. */
.hat-wings{
  display:grid;grid-template-columns:1fr 1fr;gap:0;align-items:center;
  background:var(--paper);border:4px solid var(--ink);border-radius:20px;
  overflow:hidden;margin-bottom:clamp(34px,4vw,54px);
}

.hat-wings__shot{position:relative;border-right:4px solid var(--ink);aspect-ratio:1/1}
.hat-wings__shot img{width:100%;height:100%;object-fit:cover;display:block}
/* The award sits ON the photograph, so the heading keeps the whole column. */
.hat-wings__flag{position:absolute;left:16px;top:16px;right:16px;z-index:2}
/* SHAMROCK GREEN, AND FLAT.
   The offset ink shadow is this site's button treatment, and wearing it made an
   award look like something to press. It is a label, so it carries no shadow
   and no press state.
   CREAM ON GREEN, ASKED FOR ON 2026-08-21, AND IT IS BELOW AA AT THIS SIZE.
   Cream on shamrock measures 3.23:1. WCAG AA wants 4.5 for normal text and
   allows 3.0 only for large text, which means 18.66px bold or 24px regular;
   this badge is 13px bold, so it does not qualify. The token's own note says
   shamrock is for fills "always with ink on it", where it measures 5.1.
   Recorded rather than silently overridden: it is a four word label, not body
   copy, and the call is the client's. Switching back is one word. */
.hat-flag{display:inline-block;background:var(--green);color:var(--cream);
  border:3px solid var(--ink);border-radius:999px;padding:5px 14px;font-size:13px;
  font-weight:700;letter-spacing:.08em;text-transform:uppercase}
.hat-wings__copy{padding:clamp(26px,3.4vw,44px)}
/* TWO CLASSES, AND THE REASON IS THE KIT. `.hat-wings__copy h3` is (0,1,1) and
   the kit writes `.elementor-kit-2141 h3{font-size:clamp(20px,2.4vw,28px)}`,
   which is ALSO (0,1,1). An equal-specificity tie with the kit is lost on
   source order every time: hattricks.css is stylesheet 8 and post-2141.css is
   14. So the 40px here never applied and the heading rendered at the kit's 28px
   ceiling, five pixels off an ordinary item name at 23. In a 504px card with a
   square photograph beside it that reads as no hierarchy at all.
   Measured 2026-08-25: was 28px, is 40px at 1440. */
.hat-wings .hat-wings__copy h3{font-size:clamp(26px,3.2vw,40px);line-height:1;margin:0 0 10px}
.hat-wings__ways{margin:14px 0 0;padding:0;list-style:none;display:flex;
  flex-direction:column;gap:7px}
.hat-wings__ways li{position:relative;padding-left:26px;font-size:16px;color:var(--copy)}
.hat-wings__ways li::before{content:"";position:absolute;left:0;top:9px;width:13px;
  height:3px;background:var(--green-text)}
/* Three counts side by side, so 6, 10 and 20 compare at a glance rather than
   being read down a list. */
.hat-wings__tiers{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-top:20px}
.hat-tier{display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:1px;background:var(--gold);border:3px solid var(--ink);border-radius:14px;padding:12px 8px}
.hat-tier b{font-family:var(--face-display);font-size:32px;line-height:1}
.hat-tier span{font-size:11px;letter-spacing:.14em;text-transform:uppercase;
  font-weight:700;color:rgba(20,20,20,.7)}
.hat-tier em{font-family:var(--face-display);font-size:24px;line-height:1;
  font-style:normal;margin-top:2px}
.hat-tier em::before{content:"$"}

/* The course's add-on group. It closes the course because it belongs to all of
   it, not to any one item above. */
.hat-mods{margin-top:30px;border:3px solid var(--ink);border-radius:16px;
  padding:20px 24px;background:var(--paper)}

.hat-mods h5{margin:0 0 12px;font-size:14px;letter-spacing:.16em;text-transform:uppercase;
  font-weight:700;color:var(--green-text)}
.hat-mods__row{display:flex;flex-wrap:wrap;gap:10px 26px}
.hat-mod{display:flex;align-items:baseline;gap:8px;font-size:16px}
.hat-mod b{font-family:var(--face-display);font-size:19px;color:var(--green-text)}
.hat-mod b::before{content:"$"}

@media(max-width:860px){
  .hat-menu__items{grid-template-columns:1fr}
  .hat-course--pic .hat-course__head{grid-template-columns:1fr;gap:24px}
  .hat-wings{grid-template-columns:1fr}

  /* 4:3, not 16:9. Both photographs used to flatten to 16:9 when the layout
     stacked, which made a phone markedly more landscape than a desktop showing
     the same picture at 4:3 and the wings at 1:1. Stacked, a picture is full
     width, and 16:9 gives it a letterbox strip rather than a photograph. */
  .hat-course__shot{aspect-ratio:4/3}
  .hat-wings__shot{border-right:0;border-bottom:4px solid var(--ink);aspect-ratio:4/3}

  /* THE AWARD BADGE STAYS ON ONE LINE. At 390 it needed 335px and its wrapper
     gives 302, because .hat-wings__flag is inset 16px on both sides of a 334px
     shot. It broke after "Loyal", leaving "CUSTOMERS" alone on a second line
     over the photograph, which reads as a rendering fault rather than a badge.

     Scoped to the wings badge, NOT to .hat-flag, which is shared with the
     happy-hour page where the same string has a full column to sit in and fits
     at 13px.

     The size is fluid rather than one step down, because the wrapper scales
     with the viewport and a single number that fits a 390 phone still wraps on
     a 360 one. min() keeps 13px wherever there is room and shrinks only below
     that; nowrap makes a wrap impossible rather than unlikely, and the numbers
     are set so it never has to. */
  .hat-wings__flag .hat-flag{
    white-space:nowrap;
    font-size:min(13px,3.05vw);
    letter-spacing:.04em;
    padding:5px 12px;
  }

  /* A GRID, not a wrapped row. Five pills of different widths wrap to 2, 2 and
     1 with a ragged right edge; two equal columns give every pill the same
     width, which is the thing that was untidy. The fifth keeps its column and
     sits left rather than spanning, because stretched across the bottom it
     stopped being one of a set and read as a summary of the four above it. */
  .hat-menu__jump .hat-menu__wrap{display:grid;grid-template-columns:1fr 1fr;gap:8px}
  /* min-width:0, OR 1fr IS NOT 1fr. A grid track's automatic minimum is
     min-content, so one pill with a long sub-label widens its own column and
     the row stops being two equal halves: measured 176px against 262px on the
     catering page, which pushed the whole document to 470px in a 390px
     viewport. The tracks are meant to be equal, so the items must be allowed
     to shrink below their content. */
  .hat-menu__jump a{align-items:center;text-align:center;min-width:0}
}

/* ---------------------------------------------------------------------------
   DRINKS and HAPPY HOUR
   [hat_drinks] and [hat_happy_hour] in inc/drinks-render.php. Both reuse the
   food menu's chrome: the same jump pills, the same course sections, the same
   bands, the same ruled eyebrow. Only the three shapes drinks has and food does
   not are new.
   ------------------------------------------------------------------------ */

/* Groups sit side by side where there is room. Bourbon, Rye and Scotch are one
   thought and reading them as three stacked lists loses that. */
.hat-dgroups{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));
  gap:clamp(26px,3vw,44px)}
.hat-dgroup__h{font-family:var(--face-display);text-transform:uppercase;font-weight:800;
  font-size:clamp(20px,2vw,26px);line-height:1.05;margin:0 0 14px;
  padding-bottom:10px;border-bottom:2px solid rgba(20,20,20,.18)}

/* A RUN OF BRANDS, NOT A PRICED LIST. No leader, no price column, no rule
   between entries: there is nothing to lead the eye TO. Tighter than the food
   rows for the same reason, since each line is two or three words. */
.hat-names{list-style:none;margin:0;padding:0}
.hat-names li{font-size:16px;line-height:1.5;padding:3px 0;color:var(--copy)}

/* Wines carry two prices, so they get columns and a header rather than a
   leader. The head repeats per group because a group can be long enough to
   scroll its own heading off. */
.hat-dgroup--wine{grid-column:1 / -1}
/* SQUARE, WHICH IS THE COMPROMISE BETWEEN TWO REAL CONSTRAINTS.
   The food courses are plated dishes shot from above, a 4:3 subject, and the
   menu frames them that way. These are people holding a glass and every one is
   taller than it is wide: 911x1200, 1020x1200, 1069x1200. At the menu's 4:3 a
   portrait keeps only the middle 56% of its height and all three lose the face.
   At their native 3:4 the frame is 512px tall against a 384px column, which put
   about 1850px onto the page and left the header towering over the list beside
   it.
   A square crops these three by 145, 90 and 65 pixels top and bottom
   respectively, so every subject survives, and it is the ratio every other
   stacked picture on this build already uses.

   THE COLUMN IS NARROWER THAN THE FOOD MENU'S 384, BUT NOT BY AS MUCH AS IT WAS.
   A square at the food menu's full 384 width is 384 tall, which is 205 to 263px
   taller than the drinks text and read as a header towering over the list.
   Pulled to 288 it matched that page exactly, 288 tall with the same 109px of
   slack, and at that size the pictures read as thumbnails on a wide screen.

   336 is the middle and the number this settled on: 48px taller than the food
   menu's header rather than 96, and half again the area of the 288. The
   trade is deliberate and it is height for presence, since a square photograph
   of a person is doing more work here than a plated dish shot from above. */
/* CENTRED, inheriting the food menu's alignment rather than overriding it.
   Top aligning was tried on 2026-08-21 and reverted: it lines the heading up
   with the top of the photograph, but with only 80 to 137px of text against a
   336px picture it leaves the whole column hanging off the top and the balance
   reads worse than the float it was fixing. Only the column WIDTH is overridden
   here. */
.hat-drinks .hat-course--pic .hat-course__head{grid-template-columns:1fr 336px}
.hat-drinks .hat-course__shot{aspect-ratio:1/1}
/* AND THE STACKING RULE HAS TO BE RESTATED AT THE SAME SPECIFICITY.
   The base sheet stacks this header at 860 with
   `.hat-course--pic .hat-course__head{grid-template-columns:1fr}`, which is two
   classes. The rule above is three, and a media query carries no specificity of
   its own, so the three-class rule kept winning at every width: on a 390px
   phone the header stayed a two column grid and the text column computed to
   THIRTY PIXELS with the heading and blurb crammed into it. The picture looked
   right, which is why it was not obvious.
   Documented in CLAUDE.md, walked into anyway. Anything overridden with an
   extra class has to restate that property in the query as well. */
@media(max-width:860px){
  .hat-drinks .hat-course--pic .hat-course__head{grid-template-columns:1fr}
}

/* The group price, inside the section heading rather than the eyebrow.
   "Martinis" and "$14" are one statement, so the number is set as part of the
   name: green and a size down, so the heading reads as a heading that carries a
   price rather than as two competing lines. */
.hat-course__price{
  color:var(--green-text);
  font-size:.6em;
  vertical-align:baseline;
  margin-left:.16em;
  letter-spacing:.01em;
}

/* THE HEADER ROW HAS THREE CELLS BECAUSE THE PRICE ROW HAS THREE.
   It used to emit only Glass and Bottle into a `1fr 74px 74px` grid, so Glass
   sat in the NAME column and Bottle sat under Glass: every heading was one
   column to the left of the numbers it labelled. The first cell is empty and
   its only job is to hold the name column open. */
.hat-wine__head{display:grid;grid-template-columns:1fr 74px 74px;gap:10px;
  font-size:12px;letter-spacing:.14em;text-transform:uppercase;font-weight:700;
  color:var(--green-text);padding-bottom:6px}
.hat-wine__head span{text-align:right}
.hat-wines{list-style:none;margin:0;padding:0}
.hat-wine{display:grid;grid-template-columns:1fr 74px 74px;gap:10px;align-items:baseline;
  padding:11px 0;border-bottom:1px solid rgba(20,20,20,.14)}
.hat-wine__name{font-size:17px;line-height:1.3}
/* The region is a caption on the name, not a second line of the list. */
.hat-wine__name em{display:block;font-style:normal;font-size:13.5px;color:var(--copy);
  letter-spacing:.02em;margin-top:2px}
.hat-wine__price{display:contents}
.hat-wine__price span{font-family:var(--face-display);font-size:19px;text-align:right;
  color:var(--green-text)}
/* A dash where a wine is not sold by that measure. The source says NA, which is
   not zero and not free, and an empty cell reads as an oversight. */
.hat-wine__price span:empty::before{content:"\2013"}

/* THE FEATURED POUR.
   A section with a run of brand names and exactly ONE priced item is not a
   list. "Premium Featured Whiskies" names twenty one whiskies without prices
   and then sells one shot, and that shot was being drawn through
   .hat-menu__items, the two column grid built for the forty five row food menu.
   It sat in the left half at 560px with a 161px leader running into an empty
   right half, and on a 390px phone it was the only name on either menu long
   enough to wrap.
   THE BOX IS .hat-mods' 3px ink border at 16px radius, which is this build's
   "a bordered thing that belongs to the section around it". No icon: Font
   Awesome is loaded on these pages but the whole redesign uses it for one
   arrow, and everything else visual here is drawn, so a glyph would have been a
   second icon language for two elements. */
.hat-featured{
  display:flex;align-items:center;gap:28px;
  margin-top:30px;padding:22px 28px;
  background:var(--paper);border:3px solid var(--ink);border-radius:16px;
}

.hat-featured__l{flex:1 1 auto;min-width:0}
.hat-featured__eyebrow{
  margin:0 0 5px;font-size:14px;font-weight:700;letter-spacing:.16em;
  text-transform:uppercase;color:var(--green-text);
}
/* TWO CLASSES, NOT ONE. The kit emits `.elementor-kit-2141 h3` at (0,1,1), so a
   single class here would lose its size and line-height to the kit's h3 preset
   and only look right by accident. The face, weight and case would still land,
   which is what makes that failure hard to see. */
.hat-featured .hat-featured__name{
  font-family:var(--face-display);font-weight:800;text-transform:uppercase;
  letter-spacing:.01em;font-size:clamp(26px,3vw,32px);line-height:1;margin:0;
}
/* Rendered even though the one featured item has no description today. Data
   that exists and does not draw is a silent loss, and this costs two lines. */
.hat-featured__desc{margin:8px 0 0;font-size:16px;line-height:1.55;
  color:var(--copy);max-width:54ch}
.hat-featured__price{
  font-family:var(--face-display);font-weight:800;
  font-size:clamp(34px,4vw,42px);line-height:1;
  color:var(--green-text);flex:0 0 auto;
}
.hat-featured__price::before{content:"$"}

/* THE STANDING NOTE, AS A BOX.
   It was a 15.5px line behind a 3px gold rule, closing an 1164px section with
   something that read as a caption someone forgot to finish. Raised to the
   featured pour's box at one step down: 2px border rather than 3, no display
   face and no price, so it cannot be mistaken for something orderable and stays
   below an ordinary priced row.
   THE MARK, NOT AN ICON. Masked rather than inlined, which is how the marquee,
   the header pill, the footer mark and the location card stand-in all draw the
   shamrock, so it takes a colour token and adds no markup. */
/* A PILL, UNDER THE HEADING. It was a full width box at the foot of the
   section, which put a fact about the whole section after nine hundred pixels
   of beer names and wrapped forty three characters in 1192px of border. Both
   are the same mistake: a standing fact drawn as if it were a caption on the
   list above it.
   SHRINKS TO ITS CONTENT. A <p> is block level, so it has to be told. max-width
   keeps a longer note inside the column instead of pushing past it, and the
   shrink is also what holds this under a priced row in the page's weight
   ladder: a row claims the whole column, this never does. */
.hat-dnote{
  display:inline-flex;align-items:center;gap:10px;
  max-width:100%;
  margin:16px 0 0;padding:9px 20px 9px 16px;
  font-size:15px;font-weight:600;letter-spacing:.02em;color:var(--ink);
  background:var(--paper);border:2px solid var(--ink);border-radius:999px;
}

.hat-dnote::before{
  content:"";flex:0 0 auto;width:19px;height:19px;
  background-color:var(--green);
  -webkit-mask:var(--mark-shamrock) center/contain no-repeat;
          mask:var(--mark-shamrock) center/contain no-repeat;
}

@media(max-width:600px){
  /* The price drops under the name rather than squeezing it. align-items is
     restated because centring a wrapped column centres the text as well. */
  .hat-featured{flex-wrap:wrap;gap:14px;align-items:flex-start}
  .hat-featured__l{flex:1 1 100%}
}

/* ---------------------------------------------------------------------------
   CATERING
   [hat_catering] in inc/catering-render.php. The menu itself reuses the food
   page's chrome entirely; these are the only two rules catering adds, and both
   are for shapes neither other menu has.
   ------------------------------------------------------------------------ */

/* HOW TO ORDER, AS THE LOCATION HEROES ALREADY ASK IT.
   The legacy page said "please call" and named no number; the terms and
   contacts came from the client on 2026-08-24.

   THIS IS .hat-fcard, borrowed. That card is the site's existing answer to
   "here is how you reach this place", which is exactly what this section is,
   and it comes with the hierarchy already solved: the telephone is a gold pill
   because it is a control, the email is an underlined link, the hours are
   display-face type because they are a fact stated large, and the terms are
   prose. Four kinds of thing, four treatments.

   THE ALTERNATIVE WAS THREE EQUAL CARDS, one per contact, and it was rejected
   for a reason worth keeping: Hours is not a contact method, so three identical
   cards read as three doors when one of them does not open. On this site a 4px
   border with a 6px hard shadow also already MEANS clickable, because .hat-loc
   throws a full-card click target behind exactly that treatment. */
.hat-cshot{position:relative;overflow:hidden;background:var(--green-dark);
  padding:clamp(48px,6vw,88px) 0}
.hat-cshot__bg{position:absolute;inset:0;z-index:0}
.hat-cshot__bg img{width:100%;height:100%;object-fit:cover;display:block}
/* The location hero's own gradient, which is darkest top and bottom so type
   keeps its contrast wherever the photograph is bright. ::after rather than
   ::before is free here: this is a plain <section> from a shortcode, not an
   Elementor container, so nothing else owns its pseudo-elements. */
.hat-cshot::after{content:"";position:absolute;inset:0;z-index:1;
  background:linear-gradient(180deg,rgba(0,0,0,.62) 0%,rgba(0,0,0,.34) 42%,
    rgba(0,0,0,.72) 100%)}
.hat-cshot > .hat-menu__wrap{position:relative;z-index:2}

/* 520 and this padding are .hat-fcard's, from tools/location/section-hero.php.
   The eyebrow inside keeps its GREEN rule rather than the gold one, because the
   card's ground is cream: hat-band-dark is deliberately NOT on the section, or
   .hat-band-dark .hat-rule-eyebrow would flip a label sitting on cream. */
/* EVERY NUMBER HERE IS MEASURED OFF THE RENDERED .hat-fcard, not read off its
   source. Built from the source first and it came out close and wrong in seven
   places at once: 40/34/34 padding against 52/34/56, a 50px heading against 58,
   a 14.5px eyebrow on .2em against 13px on .11em, a 16px hours label against
   17, a 9px/22px pill against 13px/27px, and the pill filled GOLD when the
   hero's is transparent. Each was defensible alone; together they read as a
   different card, which is exactly what "close but not the same" is. */
.hat-cshot__card{
  width:520px;max-width:100%;
  background:var(--paper);border:4px solid var(--ink);border-radius:20px;
  padding:52px 34px 56px;
  /* Flex column like .hat-fcard, so child margins cannot collapse into the
     card's padding the way they do in a block. */
  display:flex;flex-direction:column;align-items:flex-start;
}
/* The eyebrow is 13px on .11em INSIDE THIS CARD, not the kit's hat-eyebrow
   preset at 14.5 on .2em. Same departure .hat-fcard makes and for the same
   reason: at the preset's tracking the label is nearly as wide as the heading
   under it. Two classes and a child combinator beat `.hat-rule-eyebrow > *`. */
.hat-cshot__card .hat-rule-eyebrow > *{
  font-size:13px;letter-spacing:.11em;line-height:normal;
}
.hat-cshot__card .hat-rule-eyebrow{margin-bottom:16px}
/* Same reason as .hat-fcard: this card carries an eyebrow, so it owns --secbg.
   See the surface rule at the top of this file. */
.hat-cshot__card{--secbg:var(--paper)}
/* TWO CLASSES. The kit emits `.elementor-kit-2141 h2` at (0,1,1) carrying
   clamp(38px,5.8vw,70px), which is a page heading and far too large for a 520px
   card. A single class ties on specificity and would win or lose on stylesheet
   order, which is not something to leave to chance. */
.hat-cshot__card .hat-cshot__h{
  font-family:var(--face-display);font-weight:800;text-transform:uppercase;
  letter-spacing:.01em;font-size:clamp(34px,4.2vw,58px);line-height:.9;margin:0 0 12px;
}
.hat-cshot__lead{margin:0 0 10px;font-size:17px;font-weight:600;line-height:1.4}
.hat-cshot__terms{margin:0;font-size:16.5px;line-height:1.55;color:var(--copy)}

/* THE STACK, AND ITS 26px / 20px ARE MEASURED OFF .hat-fcard__stack. The card
   was built as one flat column first, which put every gap at the mercy of
   whatever margin each element happened to carry. */
.hat-cshot__stack{display:flex;flex-direction:column;gap:20px;margin-top:26px;
  align-self:stretch}

/* The address treatment from .hat-fcard__adr: ink type on a green rule that
   goes ink on hover. Two classes and a type beat `.elementor a` at (0,1,1). */
.hat-cshot__card .hat-cshot__mail{margin:0;font-size:19px;font-weight:600;
  line-height:1.3;word-break:break-word}
.hat-cshot__card .hat-cshot__mail a{
  color:var(--ink);text-decoration:underline;text-underline-offset:3px;
  text-decoration-thickness:2px;text-decoration-color:var(--green-text);
}
.hat-cshot__card .hat-cshot__mail a:hover{text-decoration-color:var(--ink)}

/* THE HOURS ARE A BORDERED BOX, NOT A STACKED LABEL. This is the thing reading
   .hat-fcard's source could not tell me and walking the rendered card did:
   .hat-fcard__hrs is a ROW on a bone ground with a 3px ink border and 20px of
   padding, label left and time right. Built as a plain two line column it had
   the right type at the right sizes and still looked nothing like the card it
   was copied from, because the box is most of what the eye is reading.

   SPACE-BETWEEN, NOT CENTRE, from 2026-08-25. The label came back and the box
   holds two parts again, so it matches the hero card's row exactly: "Open every
   day" left at 17px, the time right at 27px display. It was centred while the
   whole string lived in one 27px span, which made the day and the time the same
   size and read as one long headline rather than as a labelled fact.
   wrap and the row gap stay: they cost nothing and they are what stops a longer
   string, or a bigger text setting, from overflowing the box rather than
   growing it. On a phone the box is narrow enough that the two parts wrap, and
   space-between on a wrapped line puts them on top of each other left aligned,
   which is the right answer there too. */
/* One row per day band (registry 'hours'), each a label-left, time-right row
   as before; the box stacks them. */
.hat-cshot__hrs{
  display:flex;flex-direction:column;gap:12px;padding:20px;
  background:var(--bone);border:3px solid var(--ink);border-radius:14px;
}
.hat-cshot__hrsrow{
  display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:6px 12px;
}
.hat-cshot__hrslab{font-size:17px;font-weight:600;line-height:1.2}
.hat-cshot__hrsbig{font-family:var(--face-display);font-weight:800;
  text-transform:uppercase;font-size:27px;line-height:1}

/* FULL WIDTH AND GOLD. The hero card stacks two of these: a transparent one
   carrying the telephone and a gold one carrying Order Online. Catering has no
   Order Online, so the telephone IS the primary action here and takes the gold.
   Asked for on 2026-08-24; the outline version was the first build and it made
   the one thing this page wants you to do the quietest control on it.
   Geometry, type and the icon are .hat-telpill's exactly: 13px/27px padding,
   3px ink border, 16px/700 on .07em uppercase, fa-phone-alt in green at a 9px
   gap. Two classes so it beats `.elementor a{box-shadow:none}` at (0,1,1),
   which would otherwise drop the offset shadow while :hover still slid. */
.hat-telbtn.hat-telbtn{
  display:flex;align-items:center;justify-content:center;gap:9px;
  background:var(--gold);color:var(--ink);
  border:3px solid var(--ink);border-radius:999px;padding:13px 27px;
  font-size:16px;font-weight:700;letter-spacing:.07em;text-transform:uppercase;
  text-decoration:none;box-shadow:3px 3px 0 var(--ink);
  transition:transform .12s ease,box-shadow .12s ease;
}
/* THE CLASS IS DOUBLED, not parented. This button is drawn twice on the page,
   once in the card and once in the hero, and a rule scoped to either parent
   could only style one of them. `.hat-telbtn.hat-telbtn` is (0,2,0) on the
   element itself, which beats `.elementor a{box-shadow:none}` at (0,1,1)
   wherever it lands. :hover is named separately or Hello Elementor's
   `button:hover{background:#c36}` and the same `.elementor a` rule take it. */
.hat-telbtn.hat-telbtn:hover{
  background:var(--gold);color:var(--ink);
  transform:translate(3px,3px);box-shadow:0 0 0 var(--ink);
}
/* INK, NOT GREEN, AND THE FILL IS WHY. The location hero's phone glyph is
   green because that pill is TRANSPARENT on cream, where green-text measures
   5.93:1. This button is gold, and green-text on gold measures 3.2:1, which is
   under AA for normal text and this is a 12px glyph. Ink on gold is 9.1:1.
   Copying the colour along with the geometry was copying a decision that only
   held on the ground it was made against.

   INHERIT rather than a stated ink, so the glyph is the button's text colour by
   construction. Naming the colour twice is how the two drift: the fill changes
   one day, the text follows it, and the icon stays behind at whatever it was
   pinned to. */
.hat-telbtn.hat-telbtn .hat-ico{color:inherit;font-size:.9em}
/* In the card it fills the stack; in the hero it sits to its own width beside
   nothing, so it must not stretch to the hero's full measure. */
.hat-cshot__stack .hat-telbtn{align-self:stretch}
.hat-menuhero .hat-telbtn{align-self:flex-start;width:max-content;margin-top:22px}
.hat-cshot__note{margin:20px 0 0;font-size:14px;line-height:1.5;color:var(--copy)}

@media(max-width:600px){
  .hat-cshot__card{padding:26px 22px 28px}
}

/* AN ITEM WITH NO PRICE KEEPS ITS ROW AND LOSES ITS LEADER. Catering's Sin Bin
   is four desserts the client has never priced. They are dishes, so the name
   stays an <h4> and takes the display face from .hat-item__line h4 like every
   other dish on the site; there is simply nothing to lead the eye to, and the
   row closes up rather than trailing dots into an empty column. Drawn as
   .hat-names first, which is the drinks page's run of BRAND names in the body
   face, and that made the only visible difference between a dessert and a dish
   the presence of a number. */
.hat-item--noprice{padding:14px 0}

/* ---------------------------------------------------------------------------
   HAPPY HOUR
   [hat_happy_hour] in inc/drinks-render.php. Built to
   _redesign/happy-hour-mockup.html, approved 2026-08-21.

   ALTERNATING: the bucket beside the drinks, the staff beside the wings. Two
   halves, because the seven "deals" are not seven of a kind. The three with a
   price reuse the food menu's .hat-item row, dot leaders and all; the four
   without are a ruled list, because a card with an empty price slot is what
   made the first build read as decoration.

   Almost every part of this is borrowed: .hat-rule-eyebrow, .hat-item,
   .hat-flag and .hat-wings__ways are all already drawn on /downtown/menu/.
   Only the row, the reductions list and the hours chip are new.
   ------------------------------------------------------------------------ */
/* The hero's hours.
   NOT PILLS. A pill is small-object vocabulary: it works at 16px and at 50 it
   reads as a bloated button nobody can press. On the one page where the TIME is
   the headline, the time is set like a headline, in the same display face as
   the wings subhead further down and simply bigger.

   "Every day" sits INSIDE the line rather than as a label above it. As a 13px
   eyebrow it made the frequency the smallest thing in a block entirely about
   when; cream against the gold times separates label from fact without dropping
   two sizes to do it. */
.hat-hh__hours{
  display:flex;flex-wrap:wrap;align-items:baseline;gap:6px 18px;margin:0;
  font-family:var(--face-display);font-weight:800;text-transform:uppercase;
  letter-spacing:.02em;line-height:1;
  font-size:clamp(30px,3.6vw,50px);
  color:var(--cream);
}
/* ONE COLOUR FOR THE WHOLE LINE, set on the parent.
   Cream and not gold: gold on a darkened photograph is the weakest pairing on
   the page, roughly half the contrast of cream, and this is 50px type carrying
   the one fact the page exists to deliver. Gold stays on the small eyebrow
   above it, where it labels rather than speaks.
   "Every day" was briefly a dimmer cream to mark it as the label. It read as
   two colours doing a job the line does not need doing: the words are already
   a frequency followed by two times, and nothing about that is ambiguous. */
/* A dot between the two WINDOWS only, carried by the second one so a wrap never
   strands it at the end of a line. Never after "Every day", which is why this
   keys off .hat-hh__win rather than off any adjacent span. */
.hat-hh__win+.hat-hh__win::before{
  content:"";display:inline-block;vertical-align:middle;
  width:7px;height:7px;border-radius:50%;background:rgba(247,242,230,.45);
  margin-right:18px;transform:translateY(-4px);
}
@media(max-width:600px){
  .hat-hh__hours{gap:2px 12px}
  .hat-hh__win+.hat-hh__win::before{display:none}
}

/* NO DIVIDING RULE BETWEEN THE TWO HALVES. Each paints its own ground instead,
   cream then bone, which is how /downtown/menu/ already separates one course
   from the next. A band change says "different thing" without drawing a line to
   say it, and the alternating pictures were already saying it once.

   The band classes carry --secbg as well as the paint, which .hat-rule-eyebrow
   reads for the knockout behind its label. Painting these with a plain
   background would leave an eyebrow on bone knocking out in cream. */
.hat-hh__row.hat-band-cream{background:var(--cream)}
.hat-hh__row.hat-band-bone{background:var(--bone)}
.hat-hh__row{padding:clamp(48px,6vw,78px) 0}
/* 1288 WITH 24px GUTTERS, SO THE CONTENT SPANS 1240.
   Measured, not assumed: the header's inner and this page's own hero both come
   out at 1240, and CLAUDE.md settled on 1240 for every section on 2026-08-20.
   At .hat-menu__wrap's 1240-including-gutters the content is 1192, which put
   the hero's heading and the first price 24px out of line with each other on
   one screen. NOTE: .hat-menu__wrap is still 1192 and therefore so are
   /downtown/menu/ and /downtown/drinks/. That is a pre-existing defect on those
   two pages, not something this one should copy. */
.hat-hh__in{
  max-width:1288px;margin:0 auto;padding:0 24px;
  display:grid;grid-template-columns:456px 1fr;gap:clamp(34px,4.4vw,64px);
  align-items:center;
}
/* The flipped row puts the picture second in SOURCE order too, so a phone
   stacking the grid gets picture-then-words both times rather than words above
   a picture on one row and below it on the other. */
.hat-hh__row--flip .hat-hh__in{grid-template-columns:1fr 456px}
.hat-hh__row--flip .hat-hh__pic{order:2}
.hat-hh__words{min-width:0}

/* THE PRICED ROWS ARE THE MENU'S .hat-item, ONE SIZE LARGER.
   Structure, leaders, colour and the "$" all come from the food menu so the two
   pages speak one language. The SIZE does not: that row is sized for a list of
   forty five things, and there are three here, on a column 673px wide. At the
   menu's 23px they read as leftovers of a longer list. The mockup set 30 and
   the mockup is right. */
.hat-hh .hat-item__line h4,
.hat-hh .hat-item__price{font-size:clamp(22px,2.2vw,30px);line-height:1}
/* ONE COLUMN, WHICH IS WHAT THE MOCKUP ALWAYS SAID.
   These rows reuse the food menu's `.hat-menu__items`, and that list is
   `1fr 1fr` because it carries forty five items. happy-hour-mockup.html draws
   them as `.lines`, a plain full width stack, and three items in a two column
   grid come out 2 + 1 with a hole in the corner anyway.
   It was also breaking the row: inside the 721px words column each cell was
   324px, and after the names went to caps "BUCKETS OF CORONA" needed 217px
   against the 208 left once the leader hit its 18px floor and the price took
   78. Both longer names wrapped to two lines. Full width gives the name about
   600px and the leaders their length back. The comment above about "a column
   673px wide" was describing this list as if it were already one; it was not.
   (0,2,0) beats the base list's (0,1,0). The 860px query says `1fr` too, so
   there is nothing to restate. */
.hat-hh .hat-menu__items{grid-template-columns:1fr}
/* NOTHING ELSE IS SET HERE, AND THAT IS DELIBERATE. This block used to carry
   the display face, weight and letter-spacing. That was the right diagnosis in
   the wrong place: the item name was taking the kit's BODY face for want of any
   h4 typography at all, which was never a happy hour problem, and scoping the
   fix to `.hat-hh` left forty five food names and thirteen drink names still in
   Barlow. Face, weight, case and letter-spacing all live on
   `.hat-item__line h4` now, and happy hour takes them like every other priced
   row. The old `font-weight:700` was dead in any case: only 800 is loaded.
   UPPERCASE HERE TOO, ASKED FOR ON 2026-08-24. happy-hour-mockup.html has no
   text-transform on its `h2,h3,h4`, so the buckets were approved in sentence
   case on 2026-08-21 and read that way until the menu rows around them went to
   caps. One priced row shape, one treatment; the mockup's silence is not worth
   a second convention. Do not re-add a face override above. */

/* THE FRAME PINS ITS OWN RATIO AND WIDTH. A column whose only content is a
   photograph is a stretched grid item on desktop and has nothing to stretch to
   once the row stacks, so without this it collapses to zero on a phone. Twice
   already on this build: a blank menu photograph and a blank carousel slide. */
.hat-hh__frame{
  width:100%;aspect-ratio:3/4;overflow:hidden;
  border:4px solid var(--ink);border-radius:20px;
  /* Belt and braces against the baseline seam. The img below is display:block,
     which is the actual fix, but any future rule that flips it back to inline
     would put it on a text baseline and leave a few pixels of ground showing
     between the picture and its own bottom border. Zeroing the line box here
     means there is no descender space for it to sit in either way. */
  line-height:0;font-size:0;
}
.hat-hh__frame img{width:100%;height:100%;object-fit:cover;display:block}

/* The four reductions. A RULED LIST, NEVER CARDS: there is no number to put in
   one. */
.hat-hh__cuts{list-style:none;margin:0;padding:0}
.hat-hh__cuts li{
  display:flex;align-items:baseline;gap:12px;padding:15px 0;
  border-bottom:1px solid rgba(20,20,20,.14);
  font-size:19px;font-weight:600;line-height:1.35;
}
/* THE SAME MARKER THE REST OF THE SITE USES: a 13x3 dash in --green-text,
   matching .hat-wings__ways, which until now was the only list on the build
   with a marker at all. The mockup drew a green circle here and a gold diamond
   on the wings bullets, which put two different markers on one page and a third
   convention against the menu. One dash everywhere. */
.hat-hh__cuts li::before{
  content:"";width:13px;height:3px;flex:0 0 13px;
  background:var(--green-text);transform:translateY(-5px);
}

/* Tight to the subhead under it: they are one unit, the offer and its terms. */
.hat-hh__words h2{margin:0 0 8px}
.hat-hh__desc{font-size:17px;line-height:1.6;color:var(--copy);margin:0 0 16px;max-width:56ch}

/* The wings' own hours, AS A SUBHEAD rather than a chip.
   Borrowed from .hat-botm__beer, the beer of the month's name: display face,
   800, uppercase, .02em. It was a bone pill, which was the right vocabulary for
   a time but the wrong weight for this one: the hours are the single most
   misreadable fact on the page, because the hero says 10 p.m. to close and
   these wings stop at 8, and a chip inside a block of copy is not where that
   argument gets won.

   GREEN RATHER THAN INK, which is the one departure from the botm rule. There
   the line IS the subject, the beer's name, so it carries the copy colour;
   here it sits directly under an ink heading of its own and two ink display
   lines stacked read as one heading that wrapped. */
.hat-hh__when{
  font-family:var(--face-display);
  font-weight:800;
  text-transform:uppercase;
  letter-spacing:.02em;
  font-size:clamp(21px,2.1vw,27px);
  line-height:1.05;
  color:var(--green-text);
  margin:0 0 14px;
}
/* THE AWARD IS AN OUTLINE HERE, filled on the menu.
   A deliberate divergence, not drift. On /downtown/menu/ the badge sits against
   photography and copy and the solid green is what makes it read as a badge.
   Here it lands directly beneath the hours subhead, which is itself green
   display type, and a solid green pill under green type is a block of one
   colour doing two different jobs. The outline keeps the shape and gives the
   subhead the emphasis.

   INK, NOT GREEN, matching the promo carousel's .hat-slide__when: 2px ink
   border, ink type. Green on green was still two greens arguing, just quieter.
   Transparent rather than that chip's bone, because on this page's cream the
   two are nearly the same tone and an outline should be an outline.

   Two classes, because .hat-flag sets background, colour and border at one and
   Elementor is full of one-class-plus-type rules that would otherwise win. */
.hat-hh .hat-flag{
  background:transparent;
  color:var(--ink);
  border:2px solid var(--ink);
  margin:0 0 16px;
}

@media(max-width:900px){
  .hat-hh__in,.hat-hh__row--flip .hat-hh__in{grid-template-columns:1fr}
  .hat-hh__row--flip .hat-hh__pic{order:0}
  /* SQUARE ONCE STACKED. At 3:4 full width a phone gets a 342x456 picture, and
     there are two of them, so most of two screens is photograph before a price
     appears. Every other picture on this build already changes ratio at its
     stacking breakpoint: .hat-food__cell and .hat-togo__art go 1/1,
     .hat-feature__pic, .hat-slide__pic and .hat-course__shot go 4/3. This was
     the only one that kept its desktop ratio all the way down.
     1/1 rather than 4/3 because both sources are portrait, so a square keeps
     three quarters of the frame where 4/3 keeps barely half. */
  .hat-hh__frame{aspect-ratio:1/1}
}

@media(max-width:860px){
  .hat-dgroups{grid-template-columns:1fr}
  .hat-wine__head,.hat-wine{grid-template-columns:1fr 62px 62px;gap:8px}
}

/* ---------------------------------------------------------------------------
   THE LOCATIONS PAGE
   [hat_locations] in inc/locations-render.php. Cards left, one map right.

   NAMESPACED .hat-locindex AND NOT .hat-locs, which is already the homepage's
   two-card location section. Reusing it would have crossed the two layouts.

   THE CARDS ARE THE HERO CARD. Same 4px ink border, same 20px radius, same
   cream, same offset shadow, same order of facts, same green-underlined
   address as .hat-fcard on each location's own page. Someone arriving here
   from one of those pages should not have to re-learn where to look.
   ------------------------------------------------------------------------ */
/* The page opens on a heading rather than a band. It shares the cream with the
   section below and carries the top padding for both, so the cards section
   drops its own and the two read as one page. */
/* THE HEADING IS INSIDE THE LEFT COLUMN NOW, so the vertical rhythm the old
   .hat-locindex__head carried moves to .hat-locindex__col below. This selector
   is kept for the Elementor widget version in case a page still uses one. */
.hat-locindex__head{padding-top:clamp(44px,5.5vw,78px);padding-bottom:0}
/* TWO CLASSES on the plain heading. It is a bare <h1> from the shortcode now,
   and the kit emits `.elementor-kit-2141 h1` at (0,1,1) carrying clamp(46px,
   7.4vw,86px). A one class rule loses to that whatever the sheet order, which
   is the same way .hat-loccard__h was rendering at 70px while asking for 44.
   The Elementor form is left matching too, for any page still building one. */
.hat-locindex .hat-locindex__h1,
.hat-locindex__h1 .elementor-heading-title{
  font-size:clamp(38px,5vw,66px);line-height:.94;margin:0;
}
/* 18/1.6 IS hat-lead, STATED RATHER THAN BOUND. The lede was a text-editor
   widget with the global attached; as shortcode markup there is no widget to
   bind, so the value has to be written. Same case as .hat-course__blurb, which
   is the menu sections' equivalent and states the same numbers. Without it the
   paragraph falls to the body's 16 and the page has a 66px heading over body
   copy. */
.hat-locindex .hat-locindex__lede,
.hat-locindex__lede p{margin:12px 0 0;max-width:52ch;color:var(--copy);
  font-size:18px;line-height:1.6}

/* overflow-x:CLIP, NOT HIDDEN. The map below escapes this section to the right
   using 100vw, and 100vw includes the scrollbar, so it overshoots the visible
   edge by however wide that is. Something has to absorb it.
   It must be `clip`: `hidden` creates a scroll container, and a scroll
   container breaks position:sticky for its descendants, which is the one thing
   the map depends on. Same reasoning as the containers' overflow control, one
   layer up. */
/* NO VERTICAL PADDING ON THE SECTION. It moved to the left column, because
   padding here would hold the map off the top and bottom edges and the map is
   the thing that has to reach them. The column pads itself; the map does not. */
.hat-locindex{background:var(--bone);padding:0;overflow-x:clip}
/* The rhythm the section used to own, plus the heading's own top space, which
   the old .hat-locindex__head carried. */
.hat-locindex__col{
  padding:clamp(44px,5.5vw,78px) 0 clamp(48px,6vw,86px);
  min-width:0;
}
.hat-locindex__col .hat-locindex__list{margin-top:clamp(26px,3vw,40px)}
.hat-locindex__wrap{max-width:1288px;margin:0 auto;padding:0 24px}
/* Cards left, map right. Without a key the map is absent and the list takes the
   whole width, so this degrades to one column rather than to a hole. */
/* THE LIST COLUMN IS NARROWER THAN HALF, and the map takes what is left.
   At 1fr 1fr the cards were 597 wide against 552 tall, which is close enough to
   square that the photograph reads as a banner and the card as a wide panel. A
   card wants to be taller than it is wide. This also gives the map the larger
   share, which suits the thing that is bled to the edge and sticky.
   clamp rather than a fixed width so it still yields on a small laptop before
   the 900px stack takes over. */
.hat-locindex--map .hat-locindex__wrap{
  display:grid;
  grid-template-columns:clamp(400px,40vw,540px) minmax(0,1fr);
  gap:clamp(26px,3.4vw,46px);
  /* START, not stretch, and sticky is the reason. A stretched grid item is
     already its container's height, so it has no travel to stick through and
     position:sticky silently does nothing. */
  align-items:start;
}
.hat-locindex__list{display:grid;gap:clamp(20px,2.4vw,32px)}
/* One column even when it is the only child, so a single card cannot stretch
   to the full 1240 and dwarf the other. */
.hat-locindex:not(.hat-locindex--map) .hat-locindex__list{
  grid-template-columns:1fr 1fr;
}

.hat-loccard{
  /* PAPER, NOT CREAM, added 2026-08-24. These were cream on a cream page: a
     surface stacked on its own colour, with the 4px border doing all the work
     and nothing else. Paper is the rung above cream and gives the step back.

     NO OFFSET SHADOW, still. It was 6px 6px 0 rgba(0,0,0,.35), the same press
     treatment the buttons and the location hero card wear. On a card that is
     not pressable it was only greying the cream beside it, and against a full
     height map running to the edge the two cards read as lifted stickers on a
     flat page. The tone is what separates them now; the shadow stays off. */
  background:var(--paper);
  border:4px solid var(--ink);
  border-radius:20px;
  overflow:hidden;display:flex;flex-direction:column;
}
/* The picture pins its own ratio: it is the only content of its box, so once
   the layout stacks there is nothing left to give it a height. */
/* 2.4/1, NOT 16/9. At 16/9 across a 597px card the photograph was 331px, half
   the card's whole height, and the facts underneath it read as a caption on a
   picture rather than the point of the card. The card is a name, an address,
   hours, a telephone number and two controls; the photograph is there to say
   which building, which a letterbox does as well as a square does.
   Only used by [hat_locations] on /locations/, so this is scoped to nothing
   else by construction. */
/* THE UPRIGHT SHAPE COMES FROM THE PICTURE, NOT FROM THE COLUMN. The card read
   as a wide panel at 2.4/1, and narrowing the column fixed that by taking width
   away from the map, which needs it more. 16/9 buys the same upright card while
   giving the column back: 540 wide by 617 tall at 1440, against 480 by 514.
   The two levers pull opposite ways, so the ratio is the one to spend. */
.hat-loccard__pic{aspect-ratio:16/9;overflow:hidden;line-height:0;font-size:0}
.hat-loccard__pic img{width:100%;height:100%;object-fit:cover;display:block}
/* The stand-in for a location with no photography of its own. The mark on
   green: obviously deliberate, obviously not a photograph of anywhere, and it
   cannot be mistaken for the wrong building. */
.hat-loccard__pic--mark{
  background:var(--green-dark);display:flex;align-items:center;justify-content:center;
}
.hat-loccard__pic--mark span{
  width:82px;height:82px;display:block;opacity:.55;
  background-color:var(--gold);
  -webkit-mask:var(--mark-shamrock) center/contain no-repeat;
  mask:var(--mark-shamrock) center/contain no-repeat;
}

.hat-loccard__body{
  /* 28 rather than 34 at the top of the clamp. Two cards and a full height map
     beside them, so the column's job is to be read down, not to be spacious. */
  padding:clamp(20px,2.2vw,28px);display:flex;flex-direction:column;flex:1;
  align-items:flex-start;
}
/* TWO CLASSES, because this is a bare <h2> in shortcode markup and the kit
   emits `.elementor-kit-2141 h2` at (0,1,1) carrying the hat-h2 preset. A single
   class is (0,1,0) and loses no matter what order the sheets print in, so the
   card heading was rendering at the preset's 70px while this rule said 44 and
   looked applied. Measured, not guessed: computed font-size was 70px. */
.hat-loccard .hat-loccard__h{font-size:clamp(30px,3.2vw,44px);line-height:.92;margin:0 0 14px}

/* The address, underlined in green exactly as .hat-fcard__adr does it. Two
   classes on the link rules, because `.elementor a` in custom-frontend.min.css
   is (0,1,1) and takes a one-class decision on decoration and colour. */
.hat-locindex .hat-loccard__adr,
.hat-order .hat-loccard__adr{
  font-size:18px;font-weight:600;line-height:1.35;margin:0 0 16px;
  color:var(--ink);text-decoration:underline;text-underline-offset:3px;
  text-decoration-thickness:2px;text-decoration-color:var(--green-text);
}
.hat-locindex a.hat-loccard__adr:hover,
.hat-order a.hat-loccard__adr:hover{text-decoration-color:var(--ink)}
/* No street address, so no link and no underline: the same words with no
   promise attached. */
.hat-locindex .hat-loccard__adr--flat,
.hat-order .hat-loccard__adr--flat{text-decoration:none}

.hat-loccard__hrs{display:flex;flex-direction:column;gap:10px;margin:0 0 16px}
.hat-loccard__hrsrow{display:flex;flex-direction:column}
.hat-loccard__hrslab{font-size:16px;font-weight:600;line-height:1.2;color:var(--copy)}
.hat-loccard__hrsbig{
  font-family:var(--face-display);font-weight:800;text-transform:uppercase;
  font-size:25px;line-height:1;white-space:nowrap;
}

.hat-locindex .hat-loccard__tel{
  font-size:18px;font-weight:600;color:var(--ink);margin:0 0 20px;
  text-decoration:underline;text-underline-offset:3px;
  text-decoration-thickness:2px;text-decoration-color:var(--green-text);
}
.hat-locindex .hat-loccard__tel:hover{text-decoration-color:var(--ink)}

/* Pushed to the bottom, so two cards holding different amounts of fact still
   line their buttons up with each other.

   align-self:stretch IS LOad-BEARING. The card body is a flex column with
   align-items:flex-start, so this row was shrink to fit and the telephone
   button's flex-basis:100% resolved against the row's CONTENT rather than
   against the card. Downtown measured 476 and South Tampa 325 inside the same
   532px body, so "full width" was two different widths and neither was the
   card's. The tell is two cards that should be identical measuring differently
   for a reason that is in neither of them. */
.hat-loccard__btns{
  margin-top:auto;align-self:stretch;width:100%;
  display:flex;flex-wrap:wrap;gap:10px;
}

/* TWO CLASSES ON EVERY BUTTON RULE. These are <a> elements inside Elementor and
   `.elementor a{box-shadow:none}` is (0,1,1); a single class loses to it and
   the press then animates into a shadow that was never painted. That exact
   failure cost a round on the menu page's drinks pill. */
/* UPPERCASE ON .07em, WHICH IS hat-btn's TRACKING. Every other control on the
   site is set in caps: Order Online, the jump pills, the telephone button, the
   header's picker. These two were sentence case on .04em, so a card carrying
   "Order Online" beside a page carrying "ORDER ONLINE" read as two different
   controls for the same action. Stated rather than bound because these are
   anchors in shortcode markup, not Button widgets, so there is no global to
   attach; same case as .hat-cshot__tel. */
.hat-locindex .hat-btn-solid,
.hat-locindex .hat-btn-lite,
.hat-order .hat-btn-solid,
.hat-order .hat-btn-lite{
  display:inline-flex;align-items:center;border:2px solid var(--ink);
  border-radius:999px;padding:11px 22px;text-decoration:none;
  font-family:var(--face-ui);font-size:15px;font-weight:700;
  text-transform:uppercase;letter-spacing:.07em;
  transition:transform .09s ease,box-shadow .09s ease;
}
.hat-locindex .hat-btn-solid,
.hat-order .hat-btn-solid{background:var(--gold);color:var(--ink);
  box-shadow:3px 3px 0 var(--ink)}
.hat-locindex .hat-btn-lite,
.hat-order .hat-btn-lite{background:transparent;color:var(--ink)}
.hat-locindex .hat-btn-solid:hover,
.hat-order .hat-btn-solid:hover{background:var(--gold);color:var(--ink);
  transform:translate(3px,3px);box-shadow:none}
.hat-locindex .hat-btn-lite:hover,
.hat-order .hat-btn-lite:hover{background:var(--ink);color:var(--cream);
  border-color:var(--ink)}

/* The map. STICKY, because the list beside it is taller than the map is and a
   map that scrolls away is a map you cannot refer to while reading the second
   card. Square because a standard Static Maps request is capped at 640 on a
   side, so anything taller would have to be cropped rather than requested. */
.hat-locindex__map{position:sticky;top:110px}
/* SCOPED TO THE STATIC IMAGE'S OWN LINK. As `.hat-locindex__map a` this was
   (0,1,1) and reached every anchor inside the map container, which now includes
   the card's Get directions and Call buttons: they inherited line-height:0 and
   rendered 20px tall with their padding collapsed onto the text. The rule only
   ever existed to kill the inline gap under the <img>. */
.hat-locindex__map [data-hat-map-static]{display:block;line-height:0}
.hat-locindex__map img{
  width:100%;height:auto;aspect-ratio:1/1;object-fit:cover;display:block;
  border:4px solid var(--ink);border-radius:20px;
}

/* A FULL COLUMN OF MAP, BLED RIGHT.
   It leaves the 1288 measure and runs off the edge of the viewport; the cards
   keep the measure.

   THE OFFSET IS VIEWPORT BASED, NOT A PERCENTAGE. A percentage margin on a grid
   item resolves against its own grid AREA, not against the wrap, so
   `calc((100% - 100vw)/2)` would be measuring the wrong box. This measures what
   it actually needs: the gutter outside the 1288 measure, plus the wrap's own
   24px padding. max() holds it at 0 once the viewport is narrower than the
   measure, where there is no gutter left to cross.

   NO LONGER STICKY, and that is a consequence rather than a separate decision.
   Sticky existed because the map was shorter than the list beside it and would
   scroll away before you had finished reading; a column that is as tall as the
   list never scrolls away, so there is nothing left for sticky to solve. It is
   also incompatible: a stretched item is already its container's height, so
   there is no travel for it to stick through. */
.hat-locindex--map .hat-locindex__map{
  /* ONE SCREEN, STUCK, WHILE THE CARDS SCROLL PAST IT.
     104px is the site header, which is position:fixed at z-index 99 and
     therefore permanently over the top of the page. Sticking at 0 would park
     the top of the map, and its pin, underneath it for good; sticking at the
     header's height and subtracting the same number keeps the whole map on
     screen and exactly one viewport tall.
     svh rather than vh: a phone's toolbar collapses on scroll and vh does not
     notice, so the map would grow mid-scroll. Same choice as .hat-lochero. */
  position:sticky;
  top:104px;
  height:calc(100svh - 104px);
  margin-right:calc(-1 * (max(0px, (100vw - 1288px) / 2) + 24px));
}
/* Also scoped: as `.hat-locindex__map a` this stretched the card's buttons to
   the full height of the map column. Same rule, same mistake, same fix. */
.hat-locindex--map .hat-locindex__map [data-hat-map-static]{height:100%}
/* NO EDGE TREATMENT AT ALL. The border, the radius and the offset shadow all
   say "this object stops here", which is the opposite of what a full bled
   column says.
   aspect-ratio is cleared rather than overridden with another ratio: on a
   stretched grid item a ratio resolves BACKWARDS, computing the width from the
   definite height instead of the height from the width, which is already
   recorded on this build as the cause of two overflows. Height comes from the
   row; width comes from the track. Neither is derived from the other. */
.hat-locindex--map .hat-locindex__map img{
  aspect-ratio:auto;
  width:100%;height:100%;
  object-fit:cover;
  border:0;border-radius:0;box-shadow:none;
}

@media(max-width:900px){
  /* Stacked, it bleeds BOTH sides: half a bleed on a single column column reads
     as a mistake rather than as a decision. */
  .hat-locindex--map .hat-locindex__map{
    margin-left:-24px;margin-right:-24px;
  }
  /* Stacked it is no longer a stretched grid item, so it has nothing to take a
     height from and must state one or collapse to zero. Recorded on this build
     twice already: a blank menu photograph and a blank carousel slide. */
  .hat-locindex--map .hat-locindex__map,
  .hat-locindex--map .hat-locindex__map img{
    height:clamp(280px,58vw,420px);
  }
  .hat-locindex--map .hat-locindex__wrap,
  .hat-locindex:not(.hat-locindex--map) .hat-locindex__list{grid-template-columns:1fr}
  .hat-loccard__pic{aspect-ratio:4/3}
  /* Sticky is meaningless once it is the last thing on the page. */
  .hat-locindex__map{position:static}
}

/* ---------------------------------------------------------------------------
   THE LIVE MAP, THE CARD IT OPENS, AND THE MOBILE LIST / MAP TOGGLE.
   assets/js/locations-map.js. The static image underneath all of this is the
   floor: it renders first and the script removes it once a live map is up.
   ------------------------------------------------------------------------ */

/* Both fill the same box, and the canvas stays out of the way until there is
   something in it. An empty div over the static image would be a grey hole for
   however long Google takes. */
/* THE CANVAS IS ALWAYS LAID OUT. THE STATIC IMAGE SITS ON TOP OF IT.
   This is the order, and getting it the other way round deadlocks the map.

   The canvas was display:none until [data-hat-map-ready], and that attribute
   was set on the map's `tilesloaded` event. Google will not render tiles into
   a zero-size element, so no tile ever loaded, so the event never fired, so
   the attribute was never set, so the canvas stayed hidden. The API loaded
   every one of its modules including map.js and marker.js, the Map object was
   constructed, and nothing was ever drawn: a circle with no error in it.

   So the canvas gets its size from the start and builds behind the picture,
   and the picture is simply lifted off once there is a tile underneath it. If
   Google refuses the key the picture never lifts, which is the behaviour we
   wanted from the fallback in the first place. */
.hat-locindex__map{position:relative}
.hat-locindex__mapcanvas{position:absolute;inset:0;z-index:1}
/* HIDDEN, NOT REMOVED. If the key is rejected after tiles have begun drawing,
   dropping the ready attribute brings this straight back; removing it left
   nothing to come back to. */
.hat-locindex__map [data-hat-map-static]{position:absolute;inset:0;z-index:2;
  display:block;line-height:0}
.hat-locindex__map[data-hat-map-ready] [data-hat-map-static]{display:none}
  /* AND HIDDEN FOR A MOMENT BEFORE THE MAP ARRIVES. The static map used to
     paint from first paint and be replaced the instant tiles loaded, which
     reads as a glitch rather than as a fallback. locations-map.js sets this
     attribute itself and clears it after 4s, on tilesloaded, or on
     gm_authFailure, so a browser running no script never sees it and still gets
     the static image immediately.
     visibility, NOT display: the map root has to keep its size, because Google
     will not render tiles into a zero-size element and says nothing when it
     cannot. */
  .hat-locindex__map[data-hat-map-pending] [data-hat-map-static]{visibility:hidden}
.hat-locindex__map [data-hat-map-static] img{width:100%;height:100%;object-fit:cover;display:block}

/* GOOGLE'S OWN CONTROLS, PULLED TOWARDS THE BRAND. Only the zoom pair is left
   on, and this is as far as CSS can take them: the rest is set in JS. Two
   classes because Google's own rules are one class plus a type. */
.hat-locindex__map .gm-style .gm-bundled-control{margin:14px !important}
.hat-locindex__map .gmnoprint button{border-radius:0 !important}

/* --- the card a pin opens ------------------------------------------------ */
/* Positioned by the script in the map's own pixel space, so this only has to
   say what it looks like and which way it hangs off the point. */
.hat-mapcard__wrap{position:absolute;z-index:5;transform:translate(-50%,calc(-100% - 54px));
  pointer-events:none}
.hat-mapcard{
  pointer-events:auto;
  width:260px;max-width:calc(100vw - 48px);
  background:var(--paper);border:3px solid var(--ink);border-radius:16px;
  padding:18px 20px 16px;position:relative;
}
/* The tail. A pseudo-element on a plain div, which is free here: this is not an
   Elementor container, so nothing else owns its ::after. */
.hat-mapcard::after{
  content:"";position:absolute;left:50%;bottom:-11px;width:16px;height:16px;
  background:var(--paper);border-right:3px solid var(--ink);border-bottom:3px solid var(--ink);
  transform:translateX(-50%) rotate(45deg);
}
/* TWO CLASSES, AND EVERY PROPERTY THE KIT TOUCHES. As a one class rule this
   lost to `.elementor-kit-2141 button` at (0,1,1) and rendered as an Elementor
   button: 66x45, gold, 3px border, 13px type. A close control the size of the
   card's own buttons. Third time this trap has been paid for today. */
.hat-mapcard .hat-mapcard__close{
  position:absolute;top:4px;right:6px;
  display:flex;align-items:center;justify-content:center;
  width:30px;height:30px;min-width:0;padding:0;
  border:0;border-radius:999px;background:transparent;background-color:transparent;
  box-shadow:none;cursor:pointer;
  font-family:Arial,Helvetica,sans-serif;font-size:21px;line-height:1;
  font-weight:400;letter-spacing:normal;text-transform:none;color:#8a8272;
}
.hat-mapcard .hat-mapcard__close:hover{background:transparent;color:var(--ink)}
.hat-mapcard .hat-mapcard__h{
  font-family:var(--face-display);font-weight:800;text-transform:uppercase;
  letter-spacing:.01em;font-size:26px;line-height:1;margin:0 0 8px;
}
.hat-mapcard__adr{margin:0 0 10px;font-size:15px;line-height:1.4;color:var(--copy)}
.hat-mapcard__hrs{margin:0 0 14px;display:flex;flex-direction:column;gap:1px}
.hat-mapcard__hrs span{font-size:14px;font-weight:600;color:var(--copy)}
.hat-mapcard__hrs b + span{margin-top:7px}
.hat-mapcard__hrs b{font-family:var(--face-display);font-weight:800;text-transform:uppercase;
  font-size:20px;line-height:1}
.hat-mapcard__btns{display:flex;gap:8px;flex-wrap:wrap;margin-top:2px}
/* Two classes and a type, so `.elementor a{box-shadow:none}` at (0,1,1) cannot
   take the shadow, which is the failure already recorded for .hat-menu__away. */
/* line-height NAMED, because the container's own anchor rule used to supply a
   zero and this is the property whose absence caused it. The two share the row
   rather than sitting at their content widths, so "Call" is a real target and
   not a 68px sliver beside a 138px one. */
.hat-mapcard .hat-mapcard__btn{
  flex:1 1 auto;min-width:0;
  display:inline-flex;align-items:center;justify-content:center;
  border:2px solid var(--ink);border-radius:999px;
  padding:11px 14px;text-decoration:none;color:var(--ink);background:transparent;
  font-family:var(--face-ui);font-size:13px;font-weight:700;line-height:1.2;
  text-transform:uppercase;letter-spacing:.06em;white-space:nowrap;
}
.hat-mapcard .hat-mapcard__btn--solid{background:var(--gold)}
.hat-mapcard .hat-mapcard__btn:hover{background:var(--ink);color:var(--cream)}
.hat-mapcard .hat-mapcard__btn--solid:hover{background:var(--ink);color:var(--cream)}

/* --- the toggle and the strip, both mobile only -------------------------- */
/* Hidden above the stacking breakpoint by default rather than shown, so a
   desktop that never reads the media query cannot get a control that does
   nothing there. */
.hat-locview,
.hat-locstrip{display:none}

@media(max-width:900px){
  /* ONE PILL WITH A COLOUR THAT SLIDES, not two buttons in a box.
     The first version drew a border round the pair AND a fill on the active
     one, so there were two enclosing shapes for one control.

     EVERY RULE BELOW CARRIES TWO CLASSES, and that is not neatness. These are
     raw <button> elements, and the kit emits `.elementor-kit-2141 button` at
     (0,1,1) carrying a GOLD fill, a border and its own type. A one class rule
     loses to it, which is exactly what happened: the inactive half rendered
     gold and the sliding fill had a second shape competing with it. Already
     recorded in CLAUDE.md for buttons inside an HTML widget; walked into
     anyway. */
  .hat-locview{
    position:relative;display:inline-flex;margin:18px 0 0;padding:3px;
    border:2px solid var(--ink);border-radius:999px;background:var(--cream);
    isolation:isolate;
  }
  /* The travelling fill. left rather than transform: a percentage transform on
     a pseudo-element resolves against its own border box, which made
     translateX(100%) land back where it started. left is measured against the
     pill, which is the thing it has to travel. */
  .hat-locview::before{
    content:"";position:absolute;z-index:-1;
    top:3px;bottom:3px;left:3px;width:calc(50% - 3px);
    background:var(--ink);border-radius:999px;
    transition:left .18s ease;
  }
  .hat-locindex[data-hat-locview-mode="map"] .hat-locview::before{left:50%}
  @media (prefers-reduced-motion: reduce){
    .hat-locview::before{transition:none}
  }
  /* Every property the kit or Hello Elementor's reset puts on a <button> has to
     be named here, or the one left out is the one that shows. */
  .hat-locview .hat-locview__btn{
    appearance:none;-webkit-appearance:none;
    border:0;border-radius:999px;box-shadow:none;
    background:transparent;background-color:transparent;
    cursor:pointer;
    flex:1 1 50%;min-width:0;width:auto;text-align:center;
    padding:8px 22px;
    font-family:var(--face-ui);font-size:14px;font-weight:700;
    text-transform:uppercase;letter-spacing:.07em;line-height:1.4;
    color:var(--ink);transition:color .18s ease;
  }
  .hat-locview .hat-locview__btn.is-on{background:transparent;color:var(--cream)}
  /* :hover named separately, or Hello Elementor's `button:hover{background:#c36}`
     paints over the pill. */
  .hat-locview .hat-locview__btn:hover,
  .hat-locview .hat-locview__btn.is-on:hover{background:transparent}
  .hat-locview .hat-locview__btn:not(.is-on):hover{color:var(--green-text)}

  /* THE TWO STATES. An attribute on the section rather than a class, so this
     reads as a state machine and there is one place to look for what is on. */
  .hat-locindex[data-hat-locview-mode="list"] .hat-locindex__map{display:none}
  .hat-locindex[data-hat-locview-mode="map"] .hat-locindex__list{display:none}

  /* In map view the map takes the whole screen under the header and the
     locations sit ON it, not under it. Below it they were off screen until you
     scrolled, and scrolling moved them away again, so the one thing the mode
     exists for was the one thing you could not keep in view. */
  .hat-locindex[data-hat-locview-mode="map"] .hat-locindex__wrap{position:relative}
  .hat-locindex[data-hat-locview-mode="map"] .hat-locindex__map{
    height:calc(100svh - 104px);
    margin-bottom:0;
  }
  .hat-locindex[data-hat-locview-mode="map"] .hat-locstrip{
    display:flex;gap:12px;
    /* Over the map's bottom edge. -24px each side because an absolutely
       positioned child is placed against the wrap's PADDING box, and the wrap
       carries 24px, so left:0 would inset it by that much. */
    position:absolute;z-index:3;
    left:-24px;right:-24px;bottom:0;
    overflow-x:auto;
    /* Each card lands square rather than half off the edge. */
    scroll-snap-type:x mandatory;
    /* 48, NOT 24, AND THE TWO NUMBERS DO DIFFERENT JOBS. The inset above pulls
       the strip 24px out each side so it lies full bleed over the map; a 24px
       padding then put the content back at exactly the viewport edge, so the
       two cancelled to a zero gutter and the card sat flush against both sides.
       Measured at 390: the first card's left was 0 and, scrolled to the end,
       the last card's right was 390.
       So the padding has to cancel the pull AND supply the gutter: 24 + 24.
       The second 24 is the site's own gutter, the same one .wrap carries, which
       is what the card would have had if the strip had never been pulled out. */
    padding:14px 48px 20px;
    /* The snap point lands inside the gutter rather than under it. */
    scroll-padding-inline:48px;
    -webkit-overflow-scrolling:touch;
    /* The scrollbar would draw a line across the map. */
    scrollbar-width:none;
  }
  .hat-locindex[data-hat-locview-mode="map"] .hat-locstrip::-webkit-scrollbar{display:none}
  /* Sitting on a photograph now rather than on cream, so each card carries the
     separation the ground used to give it. */
  .hat-locindex[data-hat-locview-mode="map"] .hat-locstrip__item{
    box-shadow:0 6px 18px rgba(0,0,0,.28);
  }
  /* THE SAME CARD, SMALLER. It carries the name, the address, the hours and the
     two controls, so map view is a different view of the locations rather than
     a poorer one. */
  .hat-locstrip__item{
    scroll-snap-align:center;
    flex:0 0 min(84vw,320px);
    text-align:left;
    background:var(--paper);border:3px solid var(--ink);border-radius:14px;
    padding:14px 16px 16px;
    display:flex;flex-direction:column;gap:10px;
  }
  /* The pan control is a button wrapping only the TEXT, because the card now
     holds real links and an anchor inside a button is invalid markup that no
     keyboard can reach. */
  .hat-locstrip .hat-locstrip__pick{
    appearance:none;-webkit-appearance:none;
    display:flex;flex-direction:column;gap:3px;align-items:flex-start;
    width:100%;min-width:0;padding:0;margin:0;
    border:0;border-radius:0;background:transparent;background-color:transparent;
    box-shadow:none;cursor:pointer;text-align:left;
    font-family:var(--face-ui);letter-spacing:normal;text-transform:none;
  }
  .hat-locstrip .hat-locstrip__pick:hover{background:transparent}
  .hat-locstrip .hat-locstrip__pick b{
    font-family:var(--face-display);font-weight:800;text-transform:uppercase;
    font-size:22px;line-height:1;letter-spacing:.01em;color:var(--ink);
  }
  .hat-locstrip .hat-locstrip__adr{
    font-size:14px;line-height:1.35;color:var(--copy);font-weight:400;
  }
  .hat-locstrip .hat-locstrip__hrs{
    font-size:13.5px;line-height:1.35;color:var(--copy);font-weight:600;
  }
  /* The card's own controls, at the strip's size. .hat-btn-solid and
     .hat-btn-lite already carry the shape from .hat-locindex; only the fit
     changes here, and they share the row so neither is a sliver. */
  .hat-locstrip__btns{display:flex;gap:8px}
  .hat-locindex .hat-locstrip__btns .hat-btn-solid,
  .hat-locindex .hat-locstrip__btns .hat-btn-lite{
    flex:1 1 auto;justify-content:center;
    padding:9px 12px;font-size:12.5px;letter-spacing:.06em;white-space:nowrap;
  }
}

/* ---------------------------------------------------------------------------
   THE MOBILE MENU PANEL. inc/menu-panel.php, assets/js/menu-panel.js.
   A full screen takeover rather than Elementor's dropdown, because the dropdown
   can only ever be the desktop nav again, and on a location page that nav has
   been replaced by the location's own pages.

   Z-INDEX 150 IS DELIBERATE AND SITS BETWEEN TWO KNOWN NUMBERS: above the site
   header (99) and the sticky order bar (70), so it covers both, and below the
   location chooser (200), because the panel's Menu row opens the chooser and
   would otherwise open it underneath itself.
   ------------------------------------------------------------------------ */
.hat-mpanel{
  position:fixed;inset:0;z-index:150;
  /* The scroll lock's allowance, set by menu-panel.js. See open() there. */
  padding-right:var(--hat-sbw,0px);
  background:var(--green-dark);color:var(--cream);
  display:flex;flex-direction:column;justify-content:space-between;
  overflow-y:auto;-webkit-overflow-scrolling:touch;
  opacity:0;transition:opacity .22s ease;
}
.hat-mpanel.is-open{opacity:1}
/* [hidden] is display:none in the reset, but Elementor's frontend sets
   `display:flex` on plenty of things at one class, so this is stated at two to
   be sure the panel cannot paint while it is closed. */
.hat-mpanel[hidden]{display:none}

/* THE HEADER'S ROW, TO THE PIXEL. Measured off the rendered header rather than
   guessed: its .e-con-inner is `grid-template-columns:42px <centre> 42px` with
   `gap:10px` and `padding:14px 0` inside a container inset 24px from the
   viewport. Reproducing all four is what puts the panel's wordmark exactly over
   the header's, so the mark does not move when the menu opens. It was
   `auto 1fr auto` at `11px 16px`, which was 3px high and, with the scrollbar,
   8px right. */
.hat-mpanel__top{
  display:grid;grid-template-columns:42px 1fr 42px;align-items:center;
  gap:10px;padding:14px 24px;flex:0 0 auto;
}
/* THE X IS A RAW <button>, WHICH THE KIT STYLES AT (0,1,1). This is the trap
   CLAUDE.md already records, and it cost the glyph entirely: at one class the
   kit's `.elementor-kit-2141 button` supplied padding 13px 27px and a 3px
   border, the button measured 60px wide instead of 42, and the SVG inside it
   computed to width 0 and painted NOTHING. A close control that is not there is
   the worst version of this bug, because the panel covers the whole screen and
   the only other way out is the back button.

   So: three selectors, every property named rather than left to default, and
   the SVG carries width/height ATTRIBUTES as well, which no stylesheet can
   take away. */
.hat-mpanel .hat-mpanel__top .hat-mpanel__close{
  width:42px;min-width:42px;height:38px;flex:0 0 42px;
  padding:0;margin:0;cursor:pointer;
  border:2px solid var(--gold);border-radius:9px;background:transparent;
  box-shadow:none;display:flex;align-items:center;justify-content:center;
}
/* :hover and :focus named separately, because Hello Elementor's
   `button:hover{background:#c36}` fires otherwise. */
.hat-mpanel .hat-mpanel__top .hat-mpanel__close:hover,
.hat-mpanel .hat-mpanel__top .hat-mpanel__close:focus{
  background:transparent;border-color:var(--gold);box-shadow:none;
}
.hat-mpanel .hat-mpanel__top .hat-mpanel__close:hover svg{stroke:var(--gold)}
/* SQUARE, because an X is. It was drawn in the burger's own 26x19 viewBox and
   rendered at 20x15, which is the right shape for three horizontal rules and
   the wrong one for two diagonals: the arms met at a flat angle and the whole
   mark read as squashed. 18x18 in a 24 box, and the button stays 42x38 so it
   still sits exactly where the burger was. */
.hat-mpanel .hat-mpanel__close svg{
  width:18px;min-width:18px;height:18px;display:block;fill:none;
  stroke:var(--cream);stroke-width:2.4;stroke-linecap:round;stroke-linejoin:round;
}
/* 168px is the header image widget's width_mobile, so the mark does not move
   when the panel opens over it. The ratio is stated as well as the width: an
   image that has not loaded has no intrinsic ratio, so height:auto resolves
   against nothing and the row can take any height at all. 300x108 is attachment
   2610's medium size. */
.hat-mpanel__wordmark{display:block;width:168px;margin:0 auto}
.hat-mpanel .hat-mpanel__home{display:block;box-shadow:none;line-height:0}
.hat-mpanel__wordmark img{width:100%;height:auto;display:block;aspect-ratio:300/108}
/* A location lockup (menu-panel.php), matching its header's 139px. */
.hat-mpanel__wordmark.hat-mpanel__wordmark--loc{width:139px}
.hat-mpanel__wordmark--loc img{aspect-ratio:800/350}
.hat-mpanel__spacer{display:block;width:42px}

/* The list gives up its slack so the foot can have it. The buttons sit higher
   and the block under them breathes; the list is still flex:1 and still takes
   whatever is left on a taller screen. */
.hat-mpanel__list{padding:10px 22px 0;flex:1 1 auto}

/* UPPERCASE, like the header nav it replaces: the mockup sets `.nav a.lk` to
   text-transform:uppercase, and Big Shoulders Display is a caps face by design.
   Tracking goes from .01 to .02em with it, because caps set tighter than
   sentence case at the same number.

   THE MARK SITS AFTER THE LABEL, so the labels need no gutter and all start at
   the panel's own padding edge. Nothing shifts when the current page changes:
   the mark is the last item in a flex row and only its opacity moves. */
.hat-mpanel .hat-mpanel__big{
  display:flex;align-items:center;gap:12px;
  padding:10px 0;
  font-family:var(--face-display);font-size:38px;font-weight:800;
  letter-spacing:.02em;line-height:1.06;text-transform:uppercase;
  color:var(--cream);text-decoration:none;
}
/* Two classes, and box-shadow named, because `.elementor a{box-shadow:none}` in
   custom-frontend.min.css is (0,1,1) and `.elementor-kit-2141 a` colours links
   at the same weight. */
.hat-mpanel .hat-mpanel__big:hover,
.hat-mpanel .hat-mpanel__big:focus{color:var(--gold)}
.hat-mpanel .hat-mpanel__big.is-on{color:#fff}

.hat-mpanel__mark{
  width:32px;height:32px;flex:0 0 32px;display:block;opacity:0;
  background-color:var(--green);
  -webkit-mask:var(--mark-shamrock) center/contain no-repeat;
  mask:var(--mark-shamrock) center/contain no-repeat;
}
.hat-mpanel__big.is-on .hat-mpanel__mark{opacity:1}

/* Drawn from two borders rather than from a font. eicons is the only icon face
   on this build and its glyphs are not worth loading for one caret. */
.hat-mpanel__caret{
  display:inline-block;width:11px;height:11px;margin-left:12px;
  border-right:3px solid var(--gold);border-bottom:3px solid var(--gold);
  transform:translateY(-6px) rotate(45deg);
}

.hat-mpanel__foot{
  flex:0 0 auto;padding:4px 22px 20px;
}
/* THE HOMEPAGE HERO'S PAIR, MEASURED OFF IT. The hero is the site's other
   control pair on a dark ground, and it is the standard: 16px/700 on .07em
   uppercase, a 999px pill, 3px border, a 3px offset shadow and 13px/27px of
   padding, 58px tall. Gold with an INK border and an ink shadow for the
   primary; transparent with a CREAM border and a cream shadow for the second,
   because ink on tavern green is a shadow nobody can see.

   These were 13px type in a 2px border with a 2px shadow, and the telephone had
   a 45% border and no shadow at all, which is not a quieter version of the site
   language; it is a different one.

   Three selectors, and box-shadow named on each, because
   `.elementor a{box-shadow:none}` is (0,1,1) and drops the shadow while the
   :hover transform still runs, which reads as a button faking a press.
   margin-block-end is named too: the kit's
   `.elementor-widget:not(:last-child){margin-block-end:0}` is (0,2,0) and a
   physical margin-bottom at equal weight loses on source order. */
.hat-mpanel .hat-mpanel__foot .hat-mpanel__order,
.hat-mpanel .hat-mpanel__foot .hat-mpanel__tel{
  display:flex;align-items:center;justify-content:center;gap:10px;
  text-align:center;text-decoration:none;border-radius:999px;
  padding:13px 27px;
  font-family:var(--face-ui);font-size:16px;font-weight:700;
  letter-spacing:.07em;text-transform:uppercase;
  transition:transform .12s ease,box-shadow .12s ease;
}
.hat-mpanel .hat-mpanel__foot .hat-mpanel__order{
  background:var(--gold);color:var(--ink);
  border:3px solid var(--ink);box-shadow:3px 3px 0 var(--ink);
  margin:12px 0 0;margin-block-end:0;
}
.hat-mpanel .hat-mpanel__foot .hat-mpanel__order:hover{
  background:var(--gold);color:var(--ink);
  transform:translate(3px,3px);box-shadow:0 0 0 var(--ink);
}
.hat-mpanel .hat-mpanel__foot .hat-mpanel__tel{
  background:transparent;color:var(--cream);
  border:3px solid var(--cream);box-shadow:3px 3px 0 var(--cream);
  margin:12px 0 0;margin-block-end:0;
}
.hat-mpanel .hat-mpanel__foot .hat-mpanel__tel:hover{
  background:transparent;color:var(--cream);
  transform:translate(3px,3px);box-shadow:0 0 0 var(--cream);
}
/* inherit, so the glyph is the button's own text colour by construction rather
   than a second place the colour is written down. */
.hat-mpanel .hat-mpanel__foot .hat-mpanel__tel .hat-ico{color:inherit;font-size:.9em}
/* TWO COLUMNS, WITH THE HIT AREA KEPT. Three passes on this block, and the
   two things it has to do turned out to be independent: the links must be
   tappable, and the block must not eat the panel. A row each got the first and
   lost the second, costing 114px and pushing an SE 170px into a scroll.

   The grid keeps 15px type and 13px of padding, so each cell is 48px tall and
   still over the 44px minimum, and two per row halves the block's height. The
   pairing reads as arbitrary because it IS arbitrary; that is fine here in a
   way it was not when the cells were also hard to hit, because nothing about
   the order implies a grouping now.

   The gap is a real gap and not a divider. Rules between four cells in two
   columns draw a box, and a box says these four belong together in a way the
   big list above does not; the space says it more quietly. */
.hat-mpanel__minor{
  display:grid;grid-template-columns:1fr 1fr;
  gap:0 20px;margin-top:22px;padding-top:10px;
  border-top:1px solid rgba(247,242,230,.14);
}
.hat-mpanel .hat-mpanel__minor a{
  display:block;padding:13px 0;
  font-size:15px;font-weight:600;letter-spacing:.1em;text-transform:uppercase;
  color:rgba(247,242,230,.82);text-decoration:none;
}
.hat-mpanel .hat-mpanel__minor a:hover{color:var(--gold)}
/* THE FOOTER'S TREATMENT, MEASURED OFF THE FOOTER: a 42px gold disc with a 2px
   ink border and a 20px ink glyph, 12px apart. They were thin cream glyphs at
   18px, which is a different language from the same three links twenty pixels
   further down the page. */
.hat-mpanel__soc{display:flex;flex-wrap:wrap;gap:12px;padding:16px 0 0}
.hat-mpanel .hat-mpanel__soc a.hat-soc{
  width:42px;height:42px;flex:0 0 42px;aspect-ratio:1/1;box-sizing:border-box;border-radius:50%;
  background:var(--gold);color:var(--ink);border:2px solid var(--ink);
  display:flex;align-items:center;justify-content:center;box-shadow:none;
}
.hat-mpanel .hat-mpanel__soc a.hat-soc:hover{background:var(--cream);color:var(--ink)}
.hat-mpanel__soc svg{width:20px;height:20px;fill:currentColor;display:block}

/* Elementor's own dropdown never shows. The widget still renders it, and its
   toggle is still the button this panel listens on. */
.hat-header-root .elementor-nav-menu--dropdown{display:none}

/* AND ITS X NEVER SHOWS EITHER. The header's toggle only ever OPENS the panel;
   the panel covers the header and carries its own close control. Elementor
   swapping in its eicon X put a second X on the same centre point, 20px under
   the panel's 18px, and the panel's 220ms fade made both visible at once: the
   mark appeared to shrink, then flash bigger.

   THIS IS A CSS RULE AND NOT A LINE OF JAVASCRIPT, deliberately. It was tried
   in the click handler first and cannot work there: Elementor sets
   `elementor-active` synchronously on the same click, so the X is painted
   before any deferred removal runs. Timing cannot win a race it starts behind.
   Stated here, no class state can draw it at all.

   Three selectors on each, because Elementor's own rules are
   `.elementor-active .elementor-menu-toggle__icon--open{display:none}` and the
   matching one for --close, both at (0,2,0). */
.hat-header-root .elementor-menu-toggle .elementor-menu-toggle__icon--close,
.hat-header-root .elementor-menu-toggle.elementor-active .elementor-menu-toggle__icon--close{
  display:none;
}
/* THE ACTIVE STATE IS NAMED, and that is the half that was missing. Elementor's
   rule is `.elementor-menu-toggle.elementor-active .icon--open{display:none}`,
   which is (0,3,0): a three-selector rule of mine only TIED it and lost on
   source order, so with the class on, the X was gone and the burger with it.
   The toggle drew nothing at all, which is a worse bug than the one being
   fixed. Four selectors here, and it wins outright. */
.hat-header-root .elementor-menu-toggle .elementor-menu-toggle__icon--open,
.hat-header-root .elementor-menu-toggle.elementor-active .elementor-menu-toggle__icon--open{
  display:block;
}

/* Above the breakpoint the burger is gone, so the panel can never be opened.
   Stated anyway: a resize with the panel open closes it in JS, and this is the
   floor under that in case the script never ran. */
@media(min-width:981px){
  .hat-mpanel{display:none}
}

/* ---------------------------------------------------------------------------
   NAV STATES: hovering, and being here.

   THE BUG UNDERNEATH THE TASTE QUESTION. Elementor drew the SAME mark for both
   states: its pointer underline is one gold ::after whose opacity is 1 on
   :hover and 1 on .elementor-item-active. On the page you were already on the
   underline was permanently drawn, hovering it changed nothing, and the current
   item read as stuck in a hover state.

   Decided 2026-08-24: HOVER IS THE WORD GOING GOLD, nothing else, and the
   CURRENT PAGE IS GOLD PLUS THE SHAMROCK. Both colours are widget controls in
   tools/build-header-template.php, and the pointer is switched off there too,
   so Elementor emits no ::after at all rather than one this file has to fight.

   That drops the mockup's `.nav a.lk:hover` underline deliberately. It is the
   only rule in here overriding something the mockup does state, and the reason
   is the collision above: the mockup has no current-page state, so it never had
   to make the two distinguishable.

   The mark hangs off ::before, which Elementor leaves without a `content`
   under every pointer except double-line, overline and framed. It arrives
   already position:absolute and display:block from the shared pointer rule,
   which is where those two come from.
   ------------------------------------------------------------------------ */

/* Only the colour moves on hover, so only the colour is transitioned. */
.hat-header-root .elementor-nav-menu--main .elementor-item{transition:color .14s ease}

/* GOLD IS NOT SET HERE. It is `color_menu_item_active` on the nav widget, in
   tools/build-header-template.php. A rule at this level lost to Elementor's own
   generated `.elementor-3490 .elementor-element.elementor-element-<id>
   .elementor-nav-menu--main .elementor-item.elementor-item-active`, which is
   five classes and carries an element id that changes on every rebuild.

   NO SHAMROCK UNDER THE ACTIVE ITEM. Removed 2026-08-25. It was a 13px gold
   mark on ::before at bottom:-9px, and the gold word above it already says
   which page this is: on a four item desktop nav the mark was a second signal
   for a state that was not ambiguous. The mobile panel keeps its mark, where
   the rows are 38px apart and colour alone is doing less work.
   ------------------------------------------------------------------------ */

/* The panel's current row, to match: gold word, gold mark. It was white text
   on tavern green, which measures a 4% lift in luminance and is invisible at a
   glance, so the mark was carrying the whole signal on its own. */
.hat-mpanel .hat-mpanel__big.is-on{color:var(--gold)}
.hat-mpanel .hat-mpanel__big.is-on .hat-mpanel__mark{background-color:var(--gold)}

/* NO MARK ON HOVER. Tried on 2026-08-25 and reversed the same day: the mark
   belongs to the CURRENT row and nothing else, so hover is the gold label
   alone. Revealing it on hover was a second thing moving in a row where the
   colour had already said everything. */

/* ---------------------------------------------------------------------------
   THE PHOTO LIGHTBOX. assets/js/gallery.js, opt in with `hat-gallery` on any
   container. Z-INDEX 160: above the menu panel's 150 so a gallery opened from
   under it still wins, and below the location chooser's 200, which is the only
   thing on this site that should ever be able to cover a photograph.
   ------------------------------------------------------------------------ */

/* The picture is a control now, so it reads as one before it is pressed.

   NO `position` HERE, AND THAT IS NOT AN OMISSION. It set position:relative,
   which is (0,1,0), the same weight as `.hat-collage__p2{position:absolute}`
   and later in this file, so it won on source order and flattened the homepage
   story collage: two photographs that overlap became two that stack with no
   spacing. Nothing in the lightbox needed it. The cursor, the hover scale and
   the focus ring all work on a static element, and a gallery must not care how
   the section it is switched on for happens to be laid out. */
.hat-gallery__item{cursor:zoom-in;transition:transform .16s ease}
.hat-gallery__item:hover{transform:scale(1.012)}
.hat-gallery__item:focus-visible{outline:3px solid var(--gold);outline-offset:3px}

.hat-lightbox{
  position:fixed;inset:0;z-index:160;
  padding-right:var(--hat-sbw,0px);
  background:rgba(0,20,10,.93);
  display:flex;align-items:center;justify-content:center;
  opacity:0;transition:opacity .2s ease;
  /* touch-action so a horizontal drag reaches the swipe handler rather than
     being claimed by the browser's own pan gesture. */
  touch-action:pan-y;
}
.hat-lightbox.is-open{opacity:1}
.hat-lightbox[hidden]{display:none}

.hat-lightbox__stage{
  margin:0;max-width:min(1100px,92vw);max-height:86vh;
  display:flex;flex-direction:column;align-items:center;gap:14px;
}
.hat-lightbox__img{
  max-width:100%;max-height:78vh;width:auto;height:auto;display:block;
  border:3px solid var(--cream);border-radius:4px;
  background:var(--green-dark);
  /* A photograph the visitor asked to see should not be draggable off the
     stage by the same gesture that pages the gallery. */
  user-select:none;-webkit-user-drag:none;
}
.hat-lightbox__cap{
  font-family:var(--face-ui);font-size:13px;font-weight:600;
  letter-spacing:.12em;text-transform:uppercase;
  color:rgba(247,242,230,.75);text-align:center;
}

/* Controls. Drawn from borders on a rotated box, not from an icon font: the
   eicons chevron resolves to an EMPTY content string on this install, which is
   recorded in CLAUDE.md and cost a round on the promo carousel. */
.hat-lightbox .hat-lightbox__close,
.hat-lightbox .hat-lightbox__nav{
  position:absolute;padding:0;cursor:pointer;
  background:transparent;border:2px solid var(--cream);border-radius:50%;
  box-shadow:none;display:flex;align-items:center;justify-content:center;
  transition:background .14s ease,border-color .14s ease,opacity .14s ease;
}
.hat-lightbox .hat-lightbox__close{top:18px;right:18px;width:44px;height:44px}
.hat-lightbox .hat-lightbox__close svg{
  display:block;fill:none;stroke:var(--cream);stroke-width:2.4;
  stroke-linecap:round;stroke-linejoin:round;
}
.hat-lightbox .hat-lightbox__close:hover{background:var(--cream)}
.hat-lightbox .hat-lightbox__close:hover svg{stroke:var(--green-dark)}

.hat-lightbox .hat-lightbox__nav{top:50%;width:52px;height:52px;margin-top:-26px}
.hat-lightbox .hat-lightbox__nav--prev{left:18px}
.hat-lightbox .hat-lightbox__nav--next{right:18px}
.hat-lightbox .hat-lightbox__nav span{
  display:block;width:12px;height:12px;
  border-right:2.6px solid var(--cream);border-bottom:2.6px solid var(--cream);
}
.hat-lightbox .hat-lightbox__nav--prev span{transform:rotate(135deg);margin-left:4px}
.hat-lightbox .hat-lightbox__nav--next span{transform:rotate(-45deg);margin-right:4px}
.hat-lightbox .hat-lightbox__nav:hover{background:var(--cream)}
.hat-lightbox .hat-lightbox__nav:hover span{border-color:var(--green-dark)}
/* Disabled rather than hidden at the ends, so the control does not move. */
.hat-lightbox .hat-lightbox__nav[disabled]{opacity:.25;cursor:default}
.hat-lightbox .hat-lightbox__nav[disabled]:hover{background:transparent}
.hat-lightbox .hat-lightbox__nav[disabled]:hover span{border-color:var(--cream)}

.hat-lightbox__dots{
  position:absolute;left:50%;bottom:20px;transform:translateX(-50%);
  display:flex;gap:9px;
}
.hat-lightbox .hat-lightbox__dots button{
  width:9px;height:9px;padding:0;border-radius:50%;cursor:pointer;
  background:rgba(247,242,230,.34);border:0;box-shadow:none;
  transition:background .14s ease,transform .14s ease;
}
.hat-lightbox .hat-lightbox__dots button.is-on{background:var(--gold);transform:scale(1.25)}
.hat-lightbox .hat-lightbox__dots button:hover{background:var(--cream)}

@media(max-width:700px){
  /* The arrows move off the picture's sides, where a thumb cannot reach them
     one-handed, and sit either side of the dots. Swipe is the primary control
     on a phone; these are the fallback. */
  .hat-lightbox .hat-lightbox__nav{top:auto;bottom:14px;margin-top:0;width:44px;height:44px}
  .hat-lightbox .hat-lightbox__nav--prev{left:16px}
  .hat-lightbox .hat-lightbox__nav--next{right:16px}
  .hat-lightbox__dots{bottom:30px}
  .hat-lightbox__stage{max-width:94vw}
  .hat-lightbox__img{max-height:66vh}
}

@media(prefers-reduced-motion:reduce){
  .hat-lightbox,.hat-gallery__item{transition:none}
  .hat-gallery__item:hover{transform:none}
}

/* ---------------------------------------------------------------------------
   THE GREEN WIPE, ON THE NATIVE VIEW TRANSITIONS API.

   THIS REPLACED A JAVASCRIPT VERSION, AND THE REASON IS LATENCY. That one
   intercepted every internal click, held navigation for 300ms so the cover
   could sweep, and set location.href on a timer. The animation was inside
   NN/g's 200-500ms band, but the 300ms was ADDED WAIT rather than a cover over
   a wait that already existed, and it was charged on every click forever. On a
   site people browse by clicking between menu, drinks and happy hour, that is
   the one cost that compounds.

   The browser does the whole thing here: it snapshots the outgoing and incoming
   documents itself and animates between them, with no script and no delay. It
   also supplies free the two safety valves the old version hand-rolled, since
   Chrome skips the transition if a navigation takes over four seconds, and an
   unsupporting browser simply navigates.

   BOTH DOCUMENTS MUST OPT IN, which is why this lives in hattricks.css: it is
   the one stylesheet every page on the site loads.
   ------------------------------------------------------------------------ */
@view-transition{navigation:auto}

/* The ground the two snapshots cross. This is the green. */
::view-transition{background:var(--green-dark)}

/* NOTHING TRANSLATES, AND IT IS OVER QUICKLY. The first build was a
   full-viewport horizontal slide and it made the first person who saw it dizzy,
   which is the strongest evidence available and matches the literature exactly:
   a large area of content crossing the field of view is the shape most likely
   to provoke a vestibular response. Every pixel travelled a full viewport
   width, twice.

   This is the green flash, chosen 2026-08-24 from
   _planning/2026-08-24-transition-options.html. The page goes to green and
   comes back and NO PIXEL CHANGES POSITION. 140ms out, then 140ms in starting
   as the first ends, so there is no overlap and the green is a beat rather than
   a dissolve.

   linear, not eased. An easing curve is something to look at, and the argument
   for this option is that there is nothing to look at: it fires on every single
   click, and at 280ms end to end the right quality is being barely noticed. */
::view-transition-old(root){
  animation:hat-vt-out .14s linear both;
}
::view-transition-new(root){
  animation:hat-vt-in .14s linear .14s both;
}
@keyframes hat-vt-out{from{opacity:1}to{opacity:0}}
@keyframes hat-vt-in{from{opacity:0}to{opacity:1}}

/* Off entirely for anyone who has asked for less motion, at the source rather
   than merely un-animated, so the browser runs no transition at all. This stays
   whatever the effect above is: a fade is gentler than a slide, not exempt.
   WCAG 2.3.3. */
@media(prefers-reduced-motion:reduce){
  @view-transition{navigation:none}
}

/* ---------------------------------------------------------------------------
   OUR HISTORY. inc/about-render.php, tools/build-about-page.php.

   NO PHOTOGRAPH HERO, AND THAT IS THE RULE RATHER THAN THE EXCEPTION. Six of
   the seven pages open on a darkened photograph; /locations/ and this one do
   not. The split is by page TYPE: a photo hero earns its place where the
   photograph is the subject, which is true of a menu and of a location page and
   is not true of a reference page. A darkened picture there is decoration
   charged at full width.

   AND THE OPENING BAND IS BONE, NOT GREEN. The header and the footer are both
   --green-dark. A green band directly under a green header has no edge: the two
   merge and the page appears to start halfway down. The menu heroes get away
   with sitting under it because their overlay is 72 to 78% BLACK, which reads
   as near-black rather than as green.
   ------------------------------------------------------------------------ */

/* THE BAND CLASSES DO NOT PAINT, THEY DECLARE. .hat-band-bone sets --secbg and
   nothing else; that variable is what the eyebrow knocks its label out with, so
   the class is still needed on every section. The BACKGROUND is painted here,
   the same way .hat-course.hat-band-cream already does it. Setting only the
   class gives a section with a correct eyebrow and no ground under it. */
/* Cream at the top, green under it, bone at the finals. The opening was bone
   and went lighter once the band below it turned green: two mid-tones stacked
   read as one smudge, and cream against tavern green is the site's own
   contrast. Still not green itself, for the reason above. */
.hat-about__band{background:var(--cream)}
.hat-about__feature{background:var(--green-dark)}
.hat-about__finals{background:var(--bone)}

.hat-about__head{padding:44px 0 34px}
.hat-about__h1{
  font-family:var(--face-display);font-weight:800;text-transform:uppercase;
  font-size:clamp(40px,6vw,76px);line-height:.9;letter-spacing:.01em;
  margin:0 0 10px;text-align:center;color:var(--ink);
}
/* CENTRED, AND THE LEDE NEEDS margin:auto AS WELL AS text-align. It carries a
   56ch measure, so text-align alone centres the words inside a block still hard
   against the left edge, which reads as a mistake rather than a decision. */
.hat-about__lede{
  font-size:18px;line-height:1.6;color:var(--copy,#4a4438);
  max-width:56ch;margin:0 auto;text-align:center;
}

/* 2:1, NOT FLATTER, AND THE BANNERS ARE THE REASON. This frame's whole value is
   what hangs from the ceiling: RICHARDS 19, LECAVALIER 4, a Stanley Cup banner
   and 2002-03 SOUTHEAST DIVISION CHAMPIONS. A 16:7 strip crops exactly that
   away and leaves a photograph of some bar stools. object-position favours the
   upper half for the same reason: at 2:1 the crop keeps 5% to 71% of the
   frame, so the banners survive and the floor goes. */
/* max-height as well as the ratio, and 62vh rather than 52. The cap was set to
   stop the picture eating a laptop screen, and it overshot: at 52vh the box
   flattened to 2.55:1 and kept only 52% of a 4:3 source, throwing away nearly
   half the frame including the top of what it is there for. At 62vh it settles
   near 2.14:1 and keeps 62%, so more of the banners are in view and the room
   has depth again. Still capped, so it cannot fill the screen on a short
   window. */
/* width:100% IS LOAD-BEARING, and without it the box shrinks instead of
   flattening. With an auto width, an aspect-ratio and a max-height, the height
   binds first and the ratio then computes the WIDTH from it: the strip measured
   936px inside a 1192px column and sat 280px short of the right edge, which
   reads as an image that is not centred. Same family as the aspect-ratio trap
   already recorded for stretched flex items, where the ratio resolves backwards
   off a definite height. Pin the width and the height is what gives. */
.hat-about__strip{
  display:block;width:100%;margin:26px 0 0;aspect-ratio:2/1;max-height:min(62vh,580px);
  border:4px solid var(--ink);border-radius:20px;overflow:hidden;line-height:0;
}
.hat-about__strip img{width:100%;height:100%;object-fit:cover;object-position:center 38%;display:block}

/* Two columns, and the pictures are ratio boxes so a portrait source cannot
   drive the row height. Same trap already recorded for the promo carousel and
   the shop section. */
.hat-about__two{display:grid;grid-template-columns:1fr 1fr;gap:clamp(26px,3.4vw,46px);align-items:center}
.hat-about__two--top{align-items:start}
@media(max-width:860px){.hat-about__two{grid-template-columns:1fr}}
/* THE SITE'S PICTURE TREATMENT, measured off .hat-course__shot: a 4px ink
   border and a 20px radius on the BOX, never on the img, and no shadow. The
   border goes on the ratio box so it survives object-fit cropping; put on the
   image it would follow the scaled bitmap instead of the frame. */
.hat-about__pic{
  display:block;overflow:hidden;line-height:0;
  border:4px solid var(--ink);border-radius:20px;
}
.hat-about__pic img{width:100%;height:100%;object-fit:cover;display:block}
/* The picture no longer sits under a heading, so it starts flush with the list
   beside it.

   1:1 LIKE THE COVER, for two reasons rather than one. It is the site's own
   ratio, counted seven times against 4/3's five; and the list beside it is
   seven rows deep, which a 3/2 box sat well short of. Square, the two columns
   finish near enough together.

   THE CROP IS BIASED LEFT. The source is 1100x734 so a square keeps 67% of the
   width, and what is on the right is a television, an exit sign and an ATM.
   Left of centre are the framed Stamkos, Barber and Bourque sweaters and the
   goalie hanging over them, which is the whole reason to use this frame. */
.hat-about__jerseys{margin-top:0}
.hat-about__jerseys img{object-position:38% center}
/* CENTRED, and the block is centred as well as its text. It carries a 62ch
   measure, so text-align alone would centre the words inside a block still hard
   against the left edge. The eyebrow drops its --left modifier here so its rule
   runs the full width with the label knocked out of the middle. */
.hat-about__finals > .hat-menu__wrap > .hat-rule-eyebrow{margin-bottom:14px}
.hat-about__finalshead{max-width:62ch;margin:0 auto clamp(24px,3vw,38px);text-align:center}
.hat-about__finalshead .hat-lead{margin-bottom:0;margin-inline:auto}
/* 1:1, WHICH IS THE SITE'S RATIO RATHER THAN A CHOICE. Counted across
   hattricks.css the vocabulary is 1/1 seven times (shop, promo slides, drinks
   shots, happy hour, the wings shot), 4/3 five times, 3/4 once and 16/9 on the
   location cards. This box was 4/5, which appears nowhere else: invented, and
   it read as one more ratio for no reason.

   The source is 2072x2560, so a square keeps 81% of its height. The gold script
   sits about a third down, well inside that, and object-position leans slightly
   up so the crop takes worn table from the bottom rather than the logo from the
   top. */
.hat-about__cover img{object-position:center 45%}

/* A PICTURE ON THE DARK BAND TAKES A CREAM BORDER. Ink on tavern green is very
   nearly invisible, so the 4px frame simply disappeared and the photograph read
   as bleeding into the band. Scoped to the band rather than to this one picture,
   so any future image on green gets it without another rule.
   var(--cream), not #fff: the palette has no pure white and one introduced here
   would be the only one on the site. */
.hat-band-dark .hat-about__pic{border-color:var(--cream)}

.hat-about__h{
  font-family:var(--face-display);font-weight:800;text-transform:uppercase;
  font-size:clamp(30px,3.6vw,48px);line-height:.95;letter-spacing:.01em;margin:0 0 12px;
}
.hat-band-dark .hat-about__h{color:var(--cream)}
.hat-about__feature .hat-about__copy p{color:rgba(247,242,230,.86)}
.hat-about__feature,.hat-about__finals{padding:clamp(44px,6vw,74px) 0}

/* -- the seven finals ---------------------------------------------------- */
.hat-fins{list-style:none;margin:0;padding:0}
/* Bigger, because the list owns a column now rather than sharing one with a
   heading and a photograph. Two columns, not three: the team label was dropped
   as a repeat of the title's first word. */
.hat-fin{
  display:grid;grid-template-columns:82px 1fr;gap:18px;align-items:center;
  padding:17px 0;border-bottom:1px solid rgba(20,20,20,.13);
}
.hat-fin:last-child{border-bottom:0}
.hat-fin__yr{font-family:var(--face-display);font-size:34px;font-weight:800;color:var(--green-text);line-height:1}
/* THE DISPLAY FACE IN CAPS, the same treatment the menu and drinks item names
   already carry. These entries are item names: a short label in a dated list.
   A span, so the kit's tag typography for h1 to h3 is not in play and one class
   is enough, unlike .hat-item__line h4. */
.hat-fin__what{
  font-family:var(--face-display);font-weight:800;text-transform:uppercase;
  font-size:23px;line-height:1.06;letter-spacing:.01em;color:var(--ink);
}
/* THE RAYS LOST BOTH, and the list says so by greying the year rather than by
   leaving them out. A tally reading "2 World Series" is quietly hoping it is
   read as two wins. */
.hat-fin--lost .hat-fin__yr{color:rgba(20,20,20,.34)}
/* THE LIST TAKES THE PICTURE'S HEIGHT, ABOVE THE STACK ONLY. The row is
   align-items:stretch, so the grid row is as tall as the taller item, which is
   the square picture; the list fills it and its rows split what they are given.
   No number is shared, so a change of ratio, column width or entry count cannot
   put them out of step.

   ONLY ABOVE 860. Below it the columns stack and there is no picture beside the
   list to stretch against, so `flex:1 1 0` gave every row a basis of nothing
   and they collapsed into each other. Same shape as the aspect-ratio trap:
   a rule that is correct because something else is supplying a height, applied
   where nothing is. */
@media(min-width:861px){
  .hat-about__finals .hat-about__two{align-items:stretch}
  .hat-fins{display:flex;flex-direction:column}
  .hat-fin{flex:1 1 0;min-height:0;padding:8px 0}
}

@media(max-width:600px){
  .hat-fin{grid-template-columns:66px 1fr;gap:14px;padding:15px 0}
  .hat-fin__yr{font-size:28px}
  .hat-fin__what{font-size:20px}
}

/* ---------------------------------------------------------------------------
   CONTACT. tools/build-contact-page.php.

   The form is Elementor Pro's own Form widget, preserved from the legacy page
   rather than rebuilt: its recipient, its recaptcha field and its three submit
   actions are configured in places a builder script cannot see, and rewriting
   them by hand risks dropping one silently. Only the layout around it is ours.
   ------------------------------------------------------------------------ */
.hat-contact__band{background:var(--cream)}
/* CREAM, AND IT IS THE ONE PLACE THE SURFACE RULE'S BONE PREFERENCE IS WAIVED.
   ON PURPOSE, 2026-08-25.

   The rule says a band carrying cards with no alternation to honour takes bone,
   because paper on bone is 1.215 and paper on cream is only 1.082. This page
   was built that way for about an hour and the seam is why it did not stay:
   the head above is cream and carries no card, so bone here drew a hard
   horizontal edge across the page partway down, and a page that is one form and
   two cards has too little going on to carry a band change. The whole page is
   cream, head and body alike, on Carter's call.

   The form is paper with a 3px ink border and its fields are CREAM, which on a
   cream page means each field matches the GROUND: the panel reads as a sheet of
   paper with wells cut back through it, rather than as a sheet holding darker
   blocks. Both cream and bone step DOWN from paper, which is all the rule asks
   for; which one is a drawing call. /locations/ keeps bone as its band, because
   a full-bleed map beside the cards does the work a band change does here. */
.hat-contact__body{background:var(--cream);padding-block:clamp(44px,6vw,74px)}
.hat-contact__head{padding:44px 0 34px}
.hat-contact__h1{
  font-family:var(--face-display);font-weight:800;text-transform:uppercase;
  font-size:clamp(40px,6vw,76px);line-height:.9;letter-spacing:.01em;
  margin:0 0 10px;text-align:center;color:var(--ink);
}
.hat-contact__lede{
  font-size:18px;line-height:1.6;color:var(--copy,#4a4438);
  max-width:56ch;margin:0 auto;text-align:center;
}

/* The form takes the wider column: it is what the page is for. */
.hat-contact__two{
  display:grid;grid-template-columns:1.35fr 1fr;gap:clamp(28px,4vw,56px);align-items:start;
}
@media(max-width:860px){.hat-contact__two{grid-template-columns:1fr}}

/* A LABEL, NOT A HEADING. At clamp(24,32) it was larger than the card headings
   under it, so the aside read as though "Reach us directly" were the important
   part and the two locations were a footnote. The cards are the content here;
   this is the thing that introduces them. */
/* A NORMAL h2, which is 28px here. The kit's own h2 is clamp(38,70) and that is
   a PAGE heading: beside a 76px h1 it read as a second title. Shrunk to 12px it
   read as a caption. This is the size it should have been, and it is set at TWO
   classes because .elementor-kit-2141 h2 is (0,1,1) and a single class ties and
   loses on source order. */
.hat-contact__aside .hat-contact__h{
  font-family:var(--face-display);font-size:28px;font-weight:800;letter-spacing:.01em;
  line-height:1;text-transform:uppercase;color:var(--ink);margin:0 0 16px;
}
.hat-contact__email{display:flex;flex-direction:column;gap:2px;margin:0 0 22px}
.hat-contact__email span{
  font-size:11px;font-weight:700;letter-spacing:.16em;text-transform:uppercase;
  color:var(--mut,#6b6455);
}

/* ONE CARD PER LOCATION. Cream on the bone band so they read as objects, with
   the site's 3px ink border rather than the 4px used on photographs: these are
   panels of type, and 4px around a small card closes it up. */
.hat-contact__cards{display:grid;gap:14px;margin:0 0 20px}
.hat-contact__card{
  background:var(--paper);border:3px solid var(--ink);border-radius:14px;padding:18px 20px;
}
/* Smaller than the aside's h2 above them, so the heading leads and the cards
   sit under it. They were both 28 and read as two headings of equal rank. */
/* TWO CLASSES, same reason as the h2 above: .elementor-kit-2141 h3 is (0,1,1)
   and a single class ties and loses on source order. */
.hat-contact__card .hat-contact__cardh{
  font-family:var(--face-display);font-weight:800;text-transform:uppercase;
  font-size:22px;line-height:1;margin:0 0 8px;color:var(--ink);
}
/* Underlined in green like every other address on the site, and two classes
   because `.elementor a` is (0,1,1). The flat variant is the one with nowhere
   to go: no underline, so it does not look like a link that fails. */
.hat-contact__card a.hat-contact__addr,
.hat-contact__card p.hat-contact__addr{
  display:block;margin:0 0 12px;font-size:16px;line-height:1.45;color:var(--ink);
}
.hat-contact__card a.hat-contact__addr{
  text-decoration:underline;text-underline-offset:3px;text-decoration-thickness:2px;
  text-decoration-color:var(--green-text);
}
.hat-contact__card a.hat-contact__addr:hover{text-decoration-color:var(--ink)}
.hat-contact__card p.hat-contact__addr--flat{color:var(--copy,#4a4438);text-decoration:none}
/* The placeholder is marked rather than dressed up. .ph-flag is the project's
   own convention, a dashed gold outline, so a blocked field looks blocked. */
.hat-contact__addr em{font-style:normal;font-size:14px}
.hat-contact .hat-contact__tel,
.hat-contact__card .hat-contact__tel{
  display:inline-flex;align-items:center;gap:9px;text-decoration:none;
  font-size:17px;font-weight:700;color:var(--ink);
}
.hat-contact__card .hat-contact__tel:hover{color:var(--green-text)}
.hat-contact__card .hat-contact__tel .hat-ico{color:var(--green-text);font-size:.85em}
/* TWO CLASSES ON THE ANCHORS. `.elementor a` is (0,1,1) in
   custom-frontend.min.css and beats a single class, which is recorded in
   CLAUDE.md and has cost a round more than once. */
.hat-contact__email a,
.hat-contact__note a{
  color:var(--ink);font-size:17px;font-weight:600;text-decoration:underline;
  text-underline-offset:3px;text-decoration-thickness:2px;
  text-decoration-color:var(--green-text);
}
.hat-contact__email a:hover,
.hat-contact__note a:hover{text-decoration-color:var(--ink)}
.hat-contact__note{font-size:15.5px;line-height:1.55;color:var(--copy,#4a4438);margin:0}
.hat-contact__note a{font-size:inherit}

/* ---------------------------------------------------------------------------
   THE FORM. Elementor Pro renders it with its own defaults and they are not
   this site: 1px #69727d borders, a 3px radius, 14px Barlow, and labels set as
   plain body text. The submit button was already right, because the kit's
   hat-btn preset reaches .elementor-button, which is the one part not to touch.

   Everything below is two classes minimum. Elementor's form CSS is one class
   and the kit's is more, and a single class here loses the way
   `.elementor a{box-shadow:none}` already beat a one-class rule twice on this
   build.
   ------------------------------------------------------------------------ */
/* THE FORM SITS IN A PANEL, the same object the location cards are: cream on
   the bone band, 3px ink border, matching radius. Bare on the band it read as
   loose fields floating next to two bordered cards, which made the page look
   like two different designs.

   The padding is on the widget ELEMENT rather than set through Elementor's
   padding control, which lands on `> .elementor-widget-container` instead. Here
   that distinction does not matter, but it is the trap recorded in CLAUDE.md
   and the reason this is CSS rather than a control. */
.hat-contact__form{
  background:var(--paper);border:3px solid var(--ink);border-radius:16px;
  padding:clamp(22px,3vw,34px);
}
.hat-contact__form .elementor-field-group{margin-bottom:18px}
.hat-contact__form .elementor-field-group > label{
  font-family:var(--face-ui);font-size:11.5px;font-weight:700;letter-spacing:.16em;
  text-transform:uppercase;color:var(--mut,#6b6455);margin-bottom:7px;
}
/* THE FIELD COLOUR AND THE FIELD TYPE ARE BOTH SET AT THE WIDGET, in
   tools/build-contact-page.php, because Elementor's generated post CSS outranks
   this file. What is left here is everything that is neither.

   THE TYPE USED TO BE HERE AND IT SPLIT THE FORM IN TWO. Elementor writes its
   field typography at `.elementor-field-group .elementor-field`, (0,4,0). On an
   <input> that class is on the input, so Elementor won; on a <select> it is on
   the WRAPPER, so this rule won. The inputs rendered Barlow 14 and the select
   Barlow Semi Condensed 16.5, from one form. Bound to hat-body now, so there is
   one answer and it is a token rather than a number typed here. */
.hat-contact__form .elementor-form-fields-wrapper .elementor-field-textual,
.hat-contact__form .elementor-form-fields-wrapper input.elementor-field-textual,
.hat-contact__form .elementor-form-fields-wrapper textarea.elementor-field-textual,
.hat-contact__form .elementor-form-fields-wrapper select.elementor-field-textual{
  border:3px solid var(--ink);border-radius:12px;
  padding:13px 16px;min-height:52px;
  box-shadow:none;transition:border-color .14s ease,box-shadow .14s ease;
}
.hat-contact__form textarea.elementor-field-textual{min-height:150px;padding-top:14px}
.hat-contact__form .elementor-field-textual::placeholder{color:rgba(20,20,20,.42)}
/* GOLD ON FOCUS, and an outline as well as a colour: a border colour alone is
   the one focus style that disappears for anyone who cannot see the difference
   between ink and gold. */
.hat-contact__form .elementor-field-textual:focus{
  border-color:var(--gold);outline:3px solid rgba(224,174,31,.35);outline-offset:2px;
}

/* The acceptance checkbox. Elementor renders a bare 13px control; accent-color
   paints it in the palette without replacing the native widget, which keeps its
   keyboard behaviour. */
.hat-contact__form .elementor-field-type-acceptance{font-size:14.5px;line-height:1.5}
.hat-contact__form input[type=checkbox]{
  width:18px;height:18px;accent-color:var(--green-text);margin-right:9px;
}
.hat-contact__form .elementor-field-option label{
  font-family:var(--face-ui);font-size:14.5px;font-weight:400;letter-spacing:normal;
  text-transform:none;color:var(--copy,#4a4438);
}

/* THE SUBMIT BUTTON, and all three faults were measurable rather than matters
   of taste.

   IT WAS WHITE ON GOLD. The kit's fill reached it but its text colour did not,
   so the label sat at #fff on #e0ae1f, which is the pairing CLAUDE.md already
   rules out in the other direction: gold and near-white are too close, and this
   is the one control on the page a visitor has to find. Ink on gold is 9.1:1.

   IT WAS 13px. That is the mockup's old button size, which the kit raised to 16
   because 13 reads as a caption rather than a control. A two class rule lost to
   Elementor's own button typography, so this is three.

   AND IT SPANNED THE PANEL at 606px. Elementor stretches the submit field
   group; the site's buttons are content width with 13px/27px of padding, which
   is what makes them read as buttons rather than as bars. */
.hat-contact__form .elementor-field-type-submit{margin-top:4px}
/* flex-basis IS WHAT PINS IT, not width. The group is a flex row and Elementor
   gives the button `flex:0 0 100%`, so `width:max-content` computed correctly
   and changed nothing: a 100% basis had already decided the size. Five
   selectors and a type, because the rule setting it is Elementor's own. */
.hat-contact__form .elementor-field-group.elementor-field-type-submit > button.elementor-button,
.hat-contact__form .elementor-field-group.elementor-field-type-submit > button.elementor-button:hover{
  width:max-content;min-width:0;flex:0 0 auto;flex-basis:auto;align-self:flex-start;
  padding:13px 34px;font-size:16px;letter-spacing:.07em;
  background:var(--gold);color:var(--ink);
}
.hat-contact__form .elementor-field-type-submit .elementor-button .elementor-button-text,
.hat-contact__form .elementor-field-type-submit .elementor-button .elementor-button-content-wrapper{
  color:var(--ink);width:auto;
}
/* The group is a flex row, so the button shrinks to its content only once the
   group stops stretching it. */
.hat-contact__form .elementor-field-type-submit{display:flex;justify-content:flex-start}

/* ---------------------------------------------------------------------------
   /order/. inc/order-render.php, built by tools/build-order-page.php.

   A BONE BAND CARRYING PAPER CARDS, which is what the surface rule at the top
   of this file asks for: a band that carries cards and has no alternation to
   honour takes bone, so the step to paper is 1.215 rather than the 1.082 a
   cream ground would have given.

   The page is deliberately short. Everyone who reaches it has asked one
   question, and the two cards are the answer.
   ------------------------------------------------------------------------ */
.hat-order{
  background:var(--bone);
  padding-block:clamp(44px,6vw,86px);
}
/* TWO CLASSES, BECAUSE THE KIT SETS h1 AND h2 AT (0,1,1). This shipped as
   `.hat-order__h1`, one class on a heading TAG, and lost the tie to
   `.elementor-kit-2141 h1` on source order: the rule said 76px and the browser
   computed 86, which is the kit's own clamp. The card heading below did the
   same at 70px against a rule saying 30. Third time in one session, after
   .hat-wings__copy h3. Anything setting a size on a bare h1 to h6 in this file
   needs a second class. */
.hat-order .hat-order__h1{
  font-family:var(--face-display);font-weight:800;text-transform:uppercase;
  font-size:clamp(40px,6vw,76px);line-height:.9;letter-spacing:.01em;
  margin:0 0 10px;color:var(--ink);
}
/* The measure goes on the PARAGRAPH, not the wrap: a container's max-width here
   would narrow the card grid below it too. */
.hat-order .hat-order__lede{
  font-size:18px;line-height:1.6;color:var(--copy);
  margin:0 0 clamp(28px,3.4vw,44px);max-width:56ch;
}

.hat-order__cards{
  display:grid;grid-template-columns:1fr 1fr;
  gap:clamp(18px,2.2vw,28px);
  /* STRETCH, so the two cards are the same height and each card's action sits
     on its own bottom edge. It was `start`, which left them at 315px and 354px
     because the blocked card carries one element more, and two cards of
     different heights side by side read as one of them being unfinished.
     The grid supplies the height, the cards do not agree on a number, so
     nothing can drift: the same trick the promo slides use, where Swiper
     supplies the height and the surplus all lands in the text box. */
  align-items:stretch;
}
/* PAPER, and a card. The 4px ink border is what separates it; the tone is the
   second cue, as everywhere else on this site. */
.hat-ordercard{
  background:var(--paper);
  border:4px solid var(--ink);border-radius:20px;
  padding:clamp(24px,2.6vw,34px);
  display:flex;flex-direction:column;align-items:flex-start;
}
/* THE CARD HEADING IS A CARD HEADING, not a second h1. It was
   clamp(28px,3vw,38px), which put a 38px location name under a 76px page
   heading in a 582px card and read as two headlines arguing. Down a step, and
   deliberately SMALLER than the /locations/ card's clamp(30,3.2vw,44): that
   card is the page's whole subject, this one is a choice between two. */
.hat-order .hat-ordercard__h{
  font-family:var(--face-display);font-weight:800;text-transform:uppercase;
  font-size:clamp(24px,2.4vw,30px);line-height:1;letter-spacing:.01em;
  margin:0 0 12px;color:var(--ink);
}
/* No .hat-ordercard__note. The card said "Online ordering is not live here yet"
   until 2026-08-25 and now says nothing about the button it does not have: the
   gap reads on its own beside a card that has two buttons, and a sentence
   explaining an absence both enlarges it and dates badly. */

/* The address, the hours block and both buttons come from the /locations/ card
   rules, which now name .hat-order as well. Nothing about them is restated
   here: two pages answering the same question about the same two places should
   not hold two copies of the answer. */

/* THE TELEPHONE PRESSES, LIKE EVERY OTHER CONTROL ON THIS SITE. .hat-btn-lite
   is an outline with no resting shadow, so it filled on hover and never moved;
   beside a solid Order Online that rests in a 3px offset and presses into it,
   two buttons in one row were doing two different things.

   SCOPED TO THIS PAGE ONLY, on purpose. .hat-btn-lite is shared with
   /locations/, where it is "View menu" on a signed-off card, and changing an
   approved page nobody asked about is not a tidy-up. If that card's button
   should press too, it is this rule with the selector widened.

   TWO CLASSES, because `.elementor a{box-shadow:none}` in
   custom-frontend.min.css is (0,1,1) and would take the shadow off a one-class
   rule while leaving the :hover transform running, which reads as a button
   faking a press. That exact failure is recorded in CLAUDE.md twice. */
.hat-order .hat-ordercard__tel{
  gap:9px;
  box-shadow:3px 3px 0 var(--ink);
  transition:transform .09s ease,box-shadow .09s ease,background .09s ease,color .09s ease;
}
.hat-order .hat-ordercard__tel:hover,
.hat-order .hat-ordercard__tel:focus-visible{
  background:var(--ink);color:var(--cream);border-color:var(--ink);
  transform:translate(3px,3px);box-shadow:0 0 0 var(--ink);
}
/* GREEN AT REST, AND THE GROUND IS WHY, which is the rule .hat-telbtn's own
   comment sets out: the glyph is green on a TRANSPARENT pill and ink on a GOLD
   one. This button is transparent on a paper card, so it is the .hat-telpill
   case, and --green-text measures 6.41:1 there.

   AND IT HANDS BACK ON HOVER, because the button fills INK, where green-text is
   2.78:1 and fails. Inheriting there gives it the label's cream at 16.49:1, so
   the glyph cannot be left behind when the fill inverts. Naming a colour twice
   is how those two drift: the fill changes one day, the text follows it, and
   the icon stays at whatever it was pinned to. */
.hat-order .hat-ordercard__tel .hat-ico{color:var(--green-text);font-size:.9em}
.hat-order .hat-ordercard__tel:hover .hat-ico,
.hat-order .hat-ordercard__tel:focus-visible .hat-ico{color:inherit}

/* No .hat-order__all. The page carried "View all locations" until 2026-08-25,
   pointing at /locations/, which offers the same two places with the same
   address and hours already on these cards. The chooser modal keeps its copy,
   where it is a real elsewhere: that overlay shows two names and nothing else. */

@media(max-width:860px){
  /* TWO CLASSES, because a bare .hat-order__cards rule inside a media query is
     still only one class and this file has been bitten by that before: a media
     query carries no specificity of its own. */
  .hat-order .hat-order__cards{grid-template-columns:1fr}
}

/* ---------------------------------------------------------------------------
   LEGAL PAGES. /privacy-policy/, built by tools/build-privacy-page.php.

   Long-form prose, which this site has almost none of: every other page is
   cards, rows and pictures. So the job here is a measure and a rhythm, not a
   layout. Cream throughout, head and body alike, because the surface rule puts
   bone under a band carrying CARDS and there are none here.

   THE MEASURE GOES ON THE PROSE, NOT THE CONTAINER. Elementor pins a Text
   Editor widget to max-width:100% with more specificity than one class, which
   is already recorded in CLAUDE.md, so a measure set on the widget does
   nothing. It is set on the paragraph and heading elements inside instead.
   ------------------------------------------------------------------------ */
.hat-legal__head{padding-block:clamp(44px,5.5vw,78px) 0}
/* THE CHILD, NOT THE WRAPPER. A class on a Heading widget lands on the widget
   wrapper; Elementor puts the text in .elementor-heading-title inside it. A
   font-size on the wrapper is inherited and then overridden, because the kit
   writes `.elementor-kit-2141 h1` straight at the h1 and a direct rule beats an
   inherited value whatever its specificity. This measured 86px against a rule
   saying 76 until it was moved down one level. Recorded in CLAUDE.md, and hit
   anyway. */
.hat-legal__head .hat-legal__h1 .elementor-heading-title{
  font-family:var(--face-display);font-weight:800;text-transform:uppercase;
  font-size:clamp(40px,6vw,76px);line-height:.9;letter-spacing:.01em;
  margin:0;color:var(--ink);
}
/* The two dates. Small, quiet, and the first thing a reader checks. */
.hat-legal__meta p{
  margin:14px 0 0;font-size:15px;font-weight:600;letter-spacing:.02em;
  color:var(--copy);
}

.hat-legal__body{padding-block:clamp(30px,4vw,52px) clamp(56px,7vw,96px)}

/* 68ch, narrower than the 56ch a lede takes and wider than a card's column:
   this is the only page on the site anyone reads top to bottom. */
.hat-legal__prose p,
.hat-legal__prose ul,
.hat-legal__prose h2,
.hat-legal__prose h3{max-width:68ch}

/* TWO CLASSES ON EVERY HEADING, because these are bare h2 and h3 inside a
   widget and the kit writes `.elementor-kit-2141 h2` at (0,1,1). A one-class
   rule ties and loses on source order, which cost three separate headings on
   this build already. */
.hat-legal__prose h2,
.hat-legal__body .hat-legal__prose h2{
  font-family:var(--face-display);font-weight:800;text-transform:uppercase;
  font-size:clamp(24px,2.4vw,30px);line-height:1.05;letter-spacing:.01em;
  color:var(--ink);
  margin:44px 0 0;padding-top:22px;border-top:2px solid rgba(20,20,20,.14);
}
.hat-legal__prose h2:first-child,
.hat-legal__body .hat-legal__prose h2:first-child{margin-top:0;padding-top:0;border-top:0}

.hat-legal__prose h3,
.hat-legal__body .hat-legal__prose h3{
  font-family:var(--face-ui);font-weight:700;
  font-size:16px;letter-spacing:.09em;text-transform:uppercase;
  color:var(--green-text);
  margin:26px 0 0;
}

/* THREE SELECTORS AND margin-block-end NAMED, because the kit emits
   `.elementor-widget:not(:last-child){margin-block-end:0}` at (0,2,0) and it
   sets the LOGICAL property. A physical margin-bottom at equal weight loses on
   source order, which reads as margin collapsing and is not. Recorded in
   CLAUDE.md; the paragraphs here are the same shape of problem. */
.hat-legal__prose p,
.hat-legal__body .hat-legal__prose p,
.hat-legal__body .hat-legal__prose > p{
  font-size:16px;line-height:1.7;color:var(--copy);
  margin:14px 0 0;margin-block-end:0;
}
.hat-legal__prose strong{color:var(--ink);font-weight:700}

.hat-legal__prose ul,
.hat-legal__body .hat-legal__prose ul{
  margin:14px 0 0;padding-left:0;list-style:none;
}
.hat-legal__prose li{
  position:relative;padding-left:26px;
  font-size:16px;line-height:1.7;color:var(--copy);
  margin:7px 0 0;
}
/* The same dash the menu and happy hour use for a list mark. One convention. */
.hat-legal__prose li::before{
  content:"";position:absolute;left:0;top:12px;
  width:13px;height:3px;background:var(--green-text);
}

/* Two classes and the type named, so `.elementor a{box-shadow:none}` at (0,1,1)
   cannot take the underline treatment with it. */
.hat-legal__prose a,
.hat-legal__body .hat-legal__prose a{
  color:var(--ink);text-decoration:underline;text-underline-offset:3px;
  text-decoration-thickness:2px;text-decoration-color:var(--green-text);
  box-shadow:none;
}
.hat-legal__prose a:hover,
.hat-legal__body .hat-legal__prose a:hover{text-decoration-color:var(--ink)}

/* THE STANDINGS PAGE'S TIMESTAMP AND ITS WAY OUT. Added 2026-08-25.

   The page was five records, a note, and nothing to do: a reader who came to
   find out whether the game was on had no way to act on the answer. */

/* Quieter than the note above it, because it is evidence for that note rather
   than a third statement. It renders EMPTY before the first fetch, which is why
   it is a span with no margin of its own: an unfilled line should collapse
   rather than leave a gap under the sentence it belongs to. */
.hat-standings__note .hat-standings__when{
  display:inline-block;
  margin-top:6px;
  font-size:13.5px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;
  color:rgba(20,20,20,.5);
}

/* ---------------------------------------------------------------------------
   THE STANDINGS CARDS.

   Chosen 2026-08-25 from two layouts by four marks: cards over a table, the
   next few fixtures over home and away splits, and the team's colour on the
   RECORD rather than on a bar at the edge of the row.

   Why not the bar: a colour bar means nothing to a reader who has not been
   taught the key, and nobody learns one from five rows. Rays navy and Lightning
   blue are near neighbours besides. On the number it stops being a key and
   becomes decoration attached to the fact the card exists for.

   Why not the splits: how a side does at home matters far less than what is on
   this week, and this is a bar's website. See hat_team_records_cards().

   EVERY SELECTOR THAT TOUCHES A HEADING OR A PARAGRAPH IS DOUBLED. This markup
   comes out of a Shortcode widget, so its h3 meets `.elementor-kit-2141 h3` at
   (0,2,0) and its p meets the kit's paragraph rules the same way; hattricks.css
   is sheet 8 and the kit is 14, so an equal-specificity tie is lost on load
   order every time. .hat-wings__copy h3 rendered at 28px against a rule saying
   40 for exactly this reason.
   ------------------------------------------------------------------------ */
.hat-scards{
  display:grid;grid-template-columns:repeat(3,1fr);gap:16px;
  list-style:none;margin:0;padding:0;width:100%;
}
.hat-scards .hat-scard{
  background:var(--paper);
  border:4px solid var(--ink);
  border-radius:18px;
  padding:20px;
  display:flex;flex-direction:column;
  text-align:left;
  margin:0;
}
.hat-scard .hat-scard__name{
  font-family:var(--face-display);font-weight:800;font-size:24px;line-height:1;
  text-transform:uppercase;color:var(--ink);margin:0;
}
/* THE TEAM COLOUR, from a custom property the markup sets per card. It falls
   back to ink so a team whose colour ESPN does not give still renders a record
   rather than an invisible one. hat_team_colour() has already walked the value
   dark enough to clear 4.5:1 on paper: the Rowdies' own #09bc0c is about 2.1:1
   and reads as a highlighter. */
.hat-scard .hat-scard__rec{
  font-family:var(--face-display);font-weight:800;font-size:44px;line-height:1;
  color:var(--hat-team,var(--ink));
  margin:12px 0 0;
}
/* A PENDING RECORD IS NOT A RESULT. "Back Sep 20" set in the display face at
   record size claims to be a number, so it drops to the UI face and the body
   sizes, and takes no team colour. */
.hat-scard .hat-scard__rec--pending{
  font-family:var(--face-ui);font-weight:600;font-size:19px;line-height:1.25;
  color:var(--ink);
}
.hat-scard .hat-scard__sub{
  font-family:var(--face-ui);font-size:14px;line-height:1.35;color:var(--copy);
  margin:4px 0 0;
}
.hat-scard .hat-scard__next{
  margin-top:14px;padding-top:12px;border-top:2px solid rgba(20,20,20,.14);
}
.hat-scard .hat-scard__eyebrow{
  display:block;
  font-family:var(--face-ui);font-weight:700;font-size:11.5px;line-height:1;
  text-transform:uppercase;letter-spacing:.12em;color:var(--green-text);
  margin-bottom:6px;
}
.hat-scard .hat-scard__games{list-style:none;margin:0;padding:0}
.hat-scard .hat-scard__game{
  display:flex;gap:8px;align-items:baseline;
  font-family:var(--face-ui);font-size:13.5px;line-height:1.35;color:var(--copy);
  padding:5px 0;border-bottom:1px solid rgba(20,20,20,.08);
  margin:0;
}
.hat-scard .hat-scard__game:last-child{border-bottom:0;padding-bottom:0}
.hat-scard .hat-scard__day{
  font-family:var(--face-ui);font-weight:700;font-size:12px;line-height:1.3;
  text-transform:uppercase;letter-spacing:.06em;color:var(--ink);
  flex:0 0 62px;
}
.hat-scard .hat-scard__opp{flex:1 1 auto}
/* A playoff game's label ("ALDS Game 4, if needed") above its opponent. */
.hat-scard .hat-scard__tag{display:block;font-style:normal;font-size:12.5px;font-weight:700;
  letter-spacing:.06em;text-transform:uppercase;color:var(--green-text);line-height:1.3}
.hat-scard .hat-scard__time{font-size:12.5px;opacity:.8;white-space:nowrap}

/* THE FIRST FIXTURE IS THE ONE THE PAGE IS FOR. Three equal lines make a reader
   parse all three to find the next one, which is the failure the record-only
   page already had. Scaled typographically and with the green the eyebrow above
   it already uses, so no new colour enters a card whose whole point is that the
   team's colour lands on the record. */
.hat-scard .hat-scard__game--lead{padding:2px 0 9px}
.hat-scard .hat-scard__game--lead .hat-scard__day{
  font-size:13px;color:var(--green-text);letter-spacing:.08em;flex-basis:76px;
}
.hat-scard .hat-scard__game--lead .hat-scard__opp{
  font-weight:700;font-size:17.5px;line-height:1.25;color:var(--ink);
}
.hat-scard .hat-scard__game--lead .hat-scard__time{
  font-size:13.5px;color:var(--ink);opacity:1;
}
.hat-scard .hat-scard__game--none{color:var(--copy);opacity:.75}

/* Two up before one up: five cards at three across leaves a row of two, and at
   two across leaves a row of one, which is the same shape the grid already has
   and reads as intended rather than as a gap. */
@media(max-width:980px){.hat-scards{grid-template-columns:repeat(2,1fr)}}
@media(max-width:767px){
  .hat-scards{grid-template-columns:1fr;gap:14px}
  .hat-scards .hat-scard{padding:18px}
}

/* THE STALE-CACHE FALLBACK. A transient written before 'fixtures' existed
   renders the old list, and that list was drawn for the dark band this page no
   longer has. Six hours after a deploy it would be cream on bone. */
.hat-band-bone .hat-records__name,
.hat-band-bone .hat-records__stat{color:var(--ink)}
.hat-band-bone .hat-records__note{color:var(--copy)}

/* WRAP, AND CENTRED WHEN IT DOES. Two buttons at 13/27 padding fit one line on
   a phone only just; when they do not, a centred second line reads as a pair
   rather than as one button that fell off. */
.hat-standings__ctas{
  display:flex;flex-wrap:wrap;justify-content:center;align-items:center;
}
/* THE DARK BAND OVERRIDE IS GONE. .hat-btn-goldline's own hover was drawn for
   a light ground and this rule existed only to undo it on tavern green; the
   page is bone now, so the default is the correct one and repeating it here
   would be a second copy to keep in step. */

/* ---------------------------------------------------------------------------
   Location gallery (tools/location/section-photos.php). The homepage grid,
   .hat-foodgrid and .hat-food__cell, unchanged on desktop. Below 820px, where
   the homepage drops to two columns, this one becomes a swipeable row instead.

   Three classes plus .e-con, because the homepage's own 820px rule is
   `.hat-foodgrid.e-con` at (0,2,0) and media queries carry no specificity.
   The cell is the flex item and carries its own 1/1, and it is not stretched
   (align-items:start), so the ratio resolves from the width. */
@media(max-width:820px){
  .hat-foodgrid.hat-foodgrid--carousel.e-con{
    /* Row, explicitly: an Elementor container's direction is a variable that
       defaults to column, so display:flex alone stacked the four squares. */
    display:flex;flex-direction:row;flex-wrap:nowrap;align-items:flex-start;gap:12px;
    overflow-x:auto;scroll-snap-type:x mandatory;-webkit-overflow-scrolling:touch;
    /* Horizontal ONLY. overflow-x:auto turns a visible overflow-y into auto as
       well, and the 74% cells give fractional heights, so on iOS the row had a
       sub-pixel of vertical scroll and dragged up and down under a thumb
       (Carter, 2026-10-06). Vertical swipes now belong to the page, and a fling
       past the last picture no longer drags the page sideways with it. */
    overflow-y:hidden;overscroll-behavior-x:contain;touch-action:pan-x pan-y;
    scrollbar-width:none;padding-left:24px;padding-right:24px;scroll-padding-left:24px;
  }
  .hat-foodgrid.hat-foodgrid--carousel.e-con::-webkit-scrollbar{display:none}
  .hat-foodgrid--carousel > .hat-food__cell{flex:0 0 74%;scroll-snap-align:start}
  .hat-foodgrid--carousel > .hat-food__cell:nth-child(n+5){display:block}
}

/* ---------------------------------------------------------------------------
   Follow buttons under the Instagram row (tools/home/section-instagram.php).
   The tiles open Instagram; these say where else to follow, Instagram first
   and TikTok second (2026-10-06). The logos are CSS masks from Simple Icons,
   drawn in the button's own text colour, the same technique as .hat-ico--phone,
   because the site carries no icon font (eicons resolve to nothing here and
   Font Awesome was removed on purpose). */
.hat-ig__ctas{margin-top:34px;padding-bottom:10px}
.hat-follow .elementor-button-text{display:inline-flex;align-items:center;gap:10px}
.hat-follow .elementor-button-text::before{
  content:"";flex:none;width:18px;height:18px;background:currentColor;
  -webkit-mask:var(--hat-follow-mark) center/contain no-repeat;mask:var(--hat-follow-mark) center/contain no-repeat;
}
.hat-follow--ig{--hat-follow-mark:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7.0301.084c-1.2768.0602-2.1487.264-2.911.5634-.7888.3075-1.4575.72-2.1228 1.3877-.6652.6677-1.075 1.3368-1.3802 2.127-.2954.7638-.4956 1.6365-.552 2.914-.0564 1.2775-.0689 1.6882-.0626 4.947.0062 3.2586.0206 3.6671.0825 4.9473.061 1.2765.264 2.1482.5635 2.9107.308.7889.72 1.4573 1.388 2.1228.6679.6655 1.3365 1.0743 2.1285 1.38.7632.295 1.6361.4961 2.9134.552 1.2773.056 1.6884.069 4.9462.0627 3.2578-.0062 3.668-.0207 4.9478-.0814 1.28-.0607 2.147-.2652 2.9098-.5633.7889-.3086 1.4578-.72 2.1228-1.3881.665-.6682 1.0745-1.3378 1.3795-2.1284.2957-.7632.4966-1.636.552-2.9124.056-1.2809.0692-1.6898.063-4.948-.0063-3.2583-.021-3.6668-.0817-4.9465-.0607-1.2797-.264-2.1487-.5633-2.9117-.3084-.7889-.72-1.4568-1.3876-2.1228C21.2982 1.33 20.628.9208 19.8378.6165 19.074.321 18.2017.1197 16.9244.0645 15.6471.0093 15.236-.005 11.977.0014 8.718.0076 8.31.0215 7.0301.0839m.1402 21.6932c-1.17-.0509-1.8053-.2453-2.2287-.408-.5606-.216-.96-.4771-1.3819-.895-.422-.4178-.6811-.8186-.9-1.378-.1644-.4234-.3624-1.058-.4171-2.228-.0595-1.2645-.072-1.6442-.079-4.848-.007-3.2037.0053-3.583.0607-4.848.05-1.169.2456-1.805.408-2.2282.216-.5613.4762-.96.895-1.3816.4188-.4217.8184-.6814 1.3783-.9003.423-.1651 1.0575-.3614 2.227-.4171 1.2655-.06 1.6447-.072 4.848-.079 3.2033-.007 3.5835.005 4.8495.0608 1.169.0508 1.8053.2445 2.228.408.5608.216.96.4754 1.3816.895.4217.4194.6816.8176.9005 1.3787.1653.4217.3617 1.056.4169 2.2263.0602 1.2655.0739 1.645.0796 4.848.0058 3.203-.0055 3.5834-.061 4.848-.051 1.17-.245 1.8055-.408 2.2294-.216.5604-.4763.96-.8954 1.3814-.419.4215-.8181.6811-1.3783.9-.4224.1649-1.0577.3617-2.2262.4174-1.2656.0595-1.6448.072-4.8493.079-3.2045.007-3.5825-.006-4.848-.0608M16.953 5.5864A1.44 1.44 0 1 0 18.39 4.144a1.44 1.44 0 0 0-1.437 1.4424M5.8385 12.012c.0067 3.4032 2.7706 6.1557 6.173 6.1493 3.4026-.0065 6.157-2.7701 6.1506-6.1733-.0065-3.4032-2.771-6.1565-6.174-6.1498-3.403.0067-6.156 2.771-6.1496 6.1738M8 12.0077a4 4 0 1 1 4.008 3.9921A3.9996 3.9996 0 0 1 8 12.0077'/%3E%3C/svg%3E")}
.hat-follow--tt{--hat-follow-mark:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12.525.02c1.31-.02 2.61-.01 3.91-.02.08 1.53.63 3.09 1.75 4.17 1.12 1.11 2.7 1.62 4.24 1.79v4.03c-1.44-.05-2.89-.35-4.2-.97-.57-.26-1.1-.59-1.62-.93-.01 2.92.01 5.84-.02 8.75-.08 1.4-.54 2.79-1.35 3.94-1.31 1.92-3.58 3.17-5.91 3.21-1.43.08-2.86-.31-4.08-1.03-2.02-1.19-3.44-3.37-3.65-5.71-.02-.5-.03-1-.01-1.49.18-1.9 1.12-3.72 2.58-4.96 1.66-1.44 3.98-2.13 6.15-1.72.02 1.48-.04 2.96-.04 4.44-.99-.32-2.15-.23-3.02.37-.63.41-1.11 1.04-1.36 1.75-.21.51-.15 1.07-.14 1.61.24 1.64 1.82 3.02 3.5 2.87 1.12-.01 2.19-.66 2.77-1.61.19-.33.4-.67.41-1.06.1-1.79.06-3.57.07-5.36.01-4.03-.01-8.05.02-12.07z'/%3E%3C/svg%3E")}
