/*
Theme Name: jingleHeimer Reskin (Catalog Drop)
Description: Custom child theme reskin for jingleHeimer novelty — dark, photography-forward "Catalog Drop" direction. Built on top of the site's existing Beaver Builder Theme (bb-theme).
Author: Derek
Template: bb-theme
Version: 1.15.0
Text Domain: jingleheimer-reskin
*/

:root{
  --ink: #0E0E10;
  --panel: #1A1A1D;
  --panel-2: #232327;
  --paper: #ECEAE2;
  --paper-dim: #A9A9A4;
  --green: #02C443; /* sampled from the new glossy/gradient logo — approximate since the source has 3D shading rather than one flat fill */
  --pink: #FF3E7F;
  --line: rgba(236,234,226,0.14);
  --ease: cubic-bezier(.2,.8,.2,1);
  --dur: 160ms;
  --f-display: 'Arial Narrow', 'Helvetica Neue Condensed', Impact, Haettenschweiler, 'Franklin Gothic Bold', sans-serif;
  --f-body: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
  --f-mono: ui-monospace, 'SF Mono', 'Cascadia Mono', 'Courier New', monospace;
}

/* ============================================================
   PART 1 — Homepage (front-page.php)
   This page is a fully custom "blank canvas" template — it does
   NOT use the parent theme's header/footer, so these styles only
   need to describe our own markup, not fight the parent theme.
   ============================================================ */

.jh-home *{box-sizing:border-box;}
html.jh-home-html{color-scheme:dark; background:var(--ink);}
.jh-home{
  margin:0; background:var(--ink); color:var(--paper);
  font-family:var(--f-body); -webkit-font-smoothing:antialiased;
}
.jh-home section, .jh-home header, .jh-home footer{background:var(--ink);}
.jh-home a{color:inherit; text-decoration:none;}
.jh-home img{max-width:100%; display:block;}
.jh-wrap{max-width:1180px; margin:0 auto; padding:0 28px;}
.jh-eyebrow{
  font-family:var(--f-mono); font-size:11.5px; letter-spacing:0.14em; text-transform:uppercase; font-weight:600;
}
.jh-home h1, .jh-home h2, .jh-home h3{
  font-family:var(--f-display); font-weight:800; letter-spacing:0.005em; line-height:0.92;
  margin:0; text-transform:uppercase; color:var(--paper);
}

.jh-halftone{
  background-image: radial-gradient(circle, rgba(236,234,226,0.16) 1px, transparent 1.3px);
  background-size: 9px 9px;
}

/* header/nav */
.jh-header{
  position:sticky; top:0; z-index:50;
  background:rgba(14,14,16,0.9); backdrop-filter:blur(8px);
  border-bottom:1px solid var(--line);
}
.jh-nav{display:flex; align-items:center; gap:28px; padding:10px 0;}
.jh-logo{display:flex; align-items:center; flex:0 0 auto;}
/* Scoped to .jh-header (not just .jh-logo-img alone) because
   WooCommerce ships ".woocommerce img, .woocommerce-page img{
   height:auto; max-width:100%;}" on every shop/category/product
   page (body gets a "woocommerce-page" class WooCommerce adds
   itself, regardless of theme). That rule and a bare ".jh-logo-img"
   both have one class, but WooCommerce's also has a type selector
   (img), which wins the specificity tiebreak — so the logo rendered
   at full natural size (~650px) on every page except the homepage,
   which has no "woocommerce-page" body class to trigger it. Adding
   the ".jh-header" ancestor class gives us two classes, which beats
   WooCommerce's one-class-plus-type combination outright. */
.jh-header .jh-logo-img{height:64px; width:auto; display:block;}
.jh-navrow{
  display:flex; align-items:center; gap:8px; overflow-x:auto; padding-bottom:2px;
  flex:1 1 auto; min-width:0; scrollbar-width:none;
}
.jh-navrow::-webkit-scrollbar{display:none;}

/* Hamburger toggle — hidden on desktop, shown only below the
   ".jh-nav-toggle-breakpoint" media query further down, where the
   pill row becomes a full-width dropdown instead of a horizontal
   scroller. Plain button + JS (assets/jh-nav.js) rather than a
   checkbox-hack, so screen readers get a real aria-expanded state. */
.jh-nav-toggle{
  display:none; flex:0 0 auto; width:38px; height:38px; padding:0;
  background:transparent; border:1.5px solid var(--line); border-radius:4px;
  cursor:pointer; position:relative; -webkit-tap-highlight-color:transparent;
}
.jh-nav-toggle:hover,
.jh-nav-toggle:focus,
.jh-nav-toggle:active{border-color:var(--green); background:transparent;}
.jh-nav-toggle-bars,
.jh-nav-toggle-bars::before,
.jh-nav-toggle-bars::after{
  position:absolute; left:9px; right:9px; height:2px; background:var(--paper);
  transition:transform var(--dur) var(--ease), opacity var(--dur) var(--ease);
}
.jh-nav-toggle-bars{top:18px;}
.jh-nav-toggle-bars::before{content:""; top:-7px; left:0; right:0;}
.jh-nav-toggle-bars::after{content:""; top:7px; left:0; right:0;}
.jh-nav-toggle[aria-expanded="true"] .jh-nav-toggle-bars{background:transparent;}
.jh-nav-toggle[aria-expanded="true"] .jh-nav-toggle-bars::before{transform:translateY(7px) rotate(45deg);}
.jh-nav-toggle[aria-expanded="true"] .jh-nav-toggle-bars::after{transform:translateY(-7px) rotate(-45deg);}
.jh-pill{
  font-family:var(--f-mono); font-size:11.5px; font-weight:600; letter-spacing:0.06em; text-transform:uppercase;
  padding:8px 14px; border-radius:4px; border:1.5px solid var(--line); color:var(--paper);
  transition:transform var(--dur) var(--ease), background var(--dur) var(--ease), border-color var(--dur) var(--ease), color var(--dur) var(--ease);
  white-space:nowrap; display:inline-block; will-change:transform; flex:0 0 auto;
}
.jh-pill:hover{border-color:var(--green); color:var(--green); transform:translateY(-2px);}
.jh-pill:active{transform:translateY(0) scale(.97); transition-duration:60ms;}
.jh-pill.jh-hot{background:var(--pink); border-color:var(--pink); color:var(--ink);}
.jh-pill.jh-hot:hover{background:var(--paper); border-color:var(--paper); color:var(--ink);}
.jh-pill.jh-current{background:var(--paper); color:var(--ink); border-color:var(--paper);}
.jh-navlinks .jh-plain{border-color:transparent; padding:8px 10px;}
.jh-navlinks .jh-plain:hover{background:transparent; text-decoration:underline; transform:none;}
.jh-cart{
  font-family:var(--f-mono); font-size:11.5px; font-weight:600; color:var(--paper);
  display:flex; align-items:center; gap:7px; flex:0 0 auto; white-space:nowrap;
  transition:color var(--dur) var(--ease); padding:6px 4px;
}
.jh-cart:hover{color:var(--green);}
.jh-cart-icon{width:20px; height:20px; flex:0 0 auto;}

/* hero */
.jh-hero{padding:80px 0 56px; position:relative; overflow:hidden;}
.jh-hero-grid{display:grid; grid-template-columns:1.1fr 0.9fr; gap:48px; align-items:center;}
.jh-hero h1{font-size:clamp(42px,5.6vw,78px);}
.jh-hero h1 .jh-accent{color:var(--green);}
.jh-hero p.jh-dek{max-width:440px; margin-top:20px; font-size:16.5px; line-height:1.55; color:#C7C6C1;}
.jh-hero-ctas{display:flex; gap:14px; margin-top:30px; flex-wrap:wrap;}
.jh-btn{
  font-family:var(--f-mono); font-weight:600; font-size:13px; letter-spacing:0.04em; text-transform:uppercase;
  padding:14px 26px; border-radius:4px; display:inline-flex; align-items:center; gap:8px;
  border:2px solid var(--paper);
  transition:transform var(--dur) var(--ease), box-shadow var(--dur) var(--ease), background var(--dur) var(--ease);
  will-change:transform;
}
.jh-btn-solid{background:var(--green); color:var(--ink); border-color:var(--green);}
.jh-btn-solid:hover{transform:translate(-2px,-2px); box-shadow:4px 4px 0 var(--pink);}
.jh-btn-solid:active{transform:translate(0,0) scale(.98); box-shadow:1px 1px 0 var(--pink); transition-duration:60ms;}
.jh-btn-outline{color:var(--paper);}
.jh-btn-outline:hover{transform:translate(-2px,-2px); box-shadow:4px 4px 0 var(--paper); border-color:var(--paper);}
.jh-btn-outline:active{transform:translate(0,0) scale(.98); box-shadow:1px 1px 0 var(--paper); transition-duration:60ms;}

.jh-stack{position:relative; height:400px;}
.jh-stack img{
  position:absolute; width:auto; height:auto;
  filter:drop-shadow(0 16px 28px rgba(0,0,0,0.55));
}
.jh-stack .jh-s1{top:6px; left:4%; width:230px; transform:rotate(-8deg); z-index:3;}
.jh-stack .jh-s2{top:30px; left:42%; width:240px; transform:rotate(7deg); z-index:2;}
.jh-stack .jh-s3{top:190px; left:2%; width:200px; transform:rotate(6deg); z-index:1;}
.jh-stack .jh-tag-chip{
  position:absolute; bottom:-28px; right:-10px; width:280px; height:auto;
  filter:drop-shadow(0 10px 18px rgba(0,0,0,0.5));
  transform:rotate(-4deg); z-index:4; pointer-events:none;
}

/* marquee */
.jh-marquee-strip{
  background:var(--panel); border-top:1px solid var(--line); border-bottom:1px solid var(--line);
  overflow:hidden; white-space:nowrap; padding:14px 0;
}
.jh-marquee-track{display:inline-block; animation:jh-scroll 26s linear infinite;}
.jh-marquee-track span{
  font-family:var(--f-mono); font-weight:600; font-size:13px; letter-spacing:0.1em; text-transform:uppercase;
  color:var(--green); margin:0 28px;
}
@keyframes jh-scroll{from{transform:translateX(0);} to{transform:translateX(-50%);}}
@media (prefers-reduced-motion: reduce){
  .jh-marquee-track{animation:none;}
  .jh-pill, .jh-btn, .jh-tag-card, .jh-catcard, .jh-addtocart .button,
  .jh-product-wrap form.cart .button, .jh-product-wrap div.summary a.button,
  body.woocommerce a.button, body.woocommerce-page a.button,
  body.woocommerce button.button, body.woocommerce-page button.button,
  ul.products.jh-shelf li.product.jh-tag-card{
    transition:none !important;
  }
  .jh-pill:hover, .jh-pill:active, .jh-btn:hover, .jh-btn:active,
  .jh-tag-card:hover, .jh-catcard:hover, .jh-addtocart .button:hover, .jh-addtocart .button:active,
  .jh-product-wrap form.cart .button:hover, .jh-product-wrap form.cart .button:active,
  ul.products.jh-shelf li.product.jh-tag-card:hover{
    transform:none !important;
  }
}

/* category shortcuts */
.jh-catgrid{display:grid; grid-template-columns:repeat(4,1fr); gap:16px; margin:36px 0 0;}
.jh-catcard{
  border:1px solid var(--line); border-radius:12px; padding:20px 18px; min-height:110px;
  display:flex; flex-direction:column; justify-content:space-between; background:var(--panel);
  transition:transform .15s ease, border-color .15s ease;
}
.jh-catcard:hover{transform:translateY(-4px); border-color:var(--green);}
.jh-catcard h3{font-size:18px; color:var(--green);}
.jh-catcard span{font-family:var(--f-mono); font-size:10.5px; color:var(--paper-dim);}
/* "Not for everyone" shortcut card: pink instead of green, matching
   its nav pill and every other pink accent used for this category. */
.jh-catcard-explicit:hover{border-color:var(--pink);}
.jh-catcard-explicit h3{color:var(--pink);}

/* catalog grid */
.jh-catalog{padding:56px 0 90px;}
.jh-section-head{display:flex; align-items:baseline; justify-content:space-between; margin-bottom:30px; flex-wrap:wrap; gap:12px;}
.jh-section-head h2{font-size:clamp(26px,3.2vw,38px);}
.jh-shelf{display:grid; grid-template-columns:repeat(4,1fr); gap:22px;}

.jh-tag-card{
  background:var(--panel); border:1px solid var(--line); border-radius:12px;
  padding:18px 16px 16px; position:relative; transition:transform .15s ease, border-color .15s ease;
}
.jh-tag-card:hover{transform:translateY(-5px); border-color:var(--green);}
.jh-tag-card .jh-grommet{
  width:16px; height:16px; border-radius:50%; border:3px solid var(--ink); background:var(--panel-2);
  margin:0 auto 10px; box-shadow:0 0 0 1px var(--line);
}
.jh-tag-card .jh-thumb{
  width:100%; aspect-ratio:1/1; border-radius:8px; overflow:hidden; background:#0A0A0B;
  display:flex; align-items:center; justify-content:center; margin-bottom:12px;
}
.jh-tag-card .jh-thumb img{width:100%; height:100%; object-fit:cover;}
.jh-thumb .jh-fallback{
  font-family:var(--f-display); text-transform:uppercase; text-align:center; font-size:15px; color:var(--paper-dim); padding:14px;
}
.jh-tag-card h3{font-size:15.5px; line-height:1.15; margin-bottom:6px; letter-spacing:0.01em; font-family:var(--f-body); font-weight:700; text-transform:none;}
.jh-tag-card .jh-sku{font-family:var(--f-mono); font-size:9.5px; color:var(--paper-dim); text-transform:uppercase; margin-bottom:10px; display:block;}
.jh-tag-card .jh-meta{display:flex; align-items:center; justify-content:space-between; gap:8px;}
.jh-tag-card .jh-price{font-family:var(--f-mono); font-size:13.5px; font-weight:600; color:var(--green);}
.jh-tag-card .jh-price del{color:var(--paper-dim); font-weight:500; margin-right:6px; text-decoration:line-through;}
.jh-tag-card .jh-price ins{text-decoration:none;}
.jh-tag-card .jh-cat{
  font-family:var(--f-mono); font-size:9px; text-transform:uppercase; font-weight:700; padding:3px 8px; border-radius:999px;
  border:1px solid var(--paper-dim); color:var(--paper-dim); white-space:nowrap;
}
.jh-tag-card .jh-cat.jh-explicit{background:var(--pink); border-color:var(--pink); color:var(--ink);}

/* Homepage "From the actual catalog" grid only: category badges are
   green (Stickers/Mugs/Everyone) except "Not for everyone", which
   stays pink — same pink/green split used for the nav pills and the
   "Not for everyone" archive page itself. Scoped to ".jh-catalog"
   (this section) so shop/category archive cards, which reuse the
   same ".jh-cat" class via content-product.php, are unaffected. */
.jh-catalog .jh-tag-card .jh-cat{border-color:var(--green); color:var(--green);}
.jh-catalog .jh-tag-card .jh-cat.jh-explicit{background:var(--pink); border-color:var(--pink); color:var(--ink);}

/* about */
.jh-about{background:var(--panel); padding:76px 0; border-top:1px solid var(--line); border-bottom:1px solid var(--line);}
.jh-about-grid{display:grid; grid-template-columns:1fr 1fr; gap:48px; align-items:center;}
.jh-about h2{font-size:clamp(28px,3.8vw,42px);}
.jh-about p{color:#C7C6C1; line-height:1.6; margin-top:18px; max-width:460px;}
.jh-about .jh-stat-row{display:flex; gap:36px; margin-top:28px; flex-wrap:wrap;}
.jh-about .jh-stat b{font-family:var(--f-display); font-size:32px; display:block; color:var(--green);}
.jh-about .jh-stat span{font-family:var(--f-mono); font-size:10.5px; text-transform:uppercase; color:var(--paper-dim);}
.jh-about-logo{display:flex; align-items:center; justify-content:center;}
.jh-about-logo img{width:100%; max-width:420px; height:auto; display:block; margin:0 auto;}

/* footer */
.jh-footer{border-top:1px solid var(--line); padding:50px 0 26px;}
.jh-foot-grid{display:grid; grid-template-columns:1.4fr 1fr 1fr 1fr; gap:32px; align-items:start;}
/* Same specificity fix as .jh-header .jh-logo-img above — see the
   comment there. */
.jh-footer .jh-foot-logo-img{height:52px; width:auto; display:block; margin-bottom:14px;}
.jh-foot-grid h4{font-family:var(--f-mono); font-size:11px; letter-spacing:0.1em; text-transform:uppercase; color:var(--green); margin:0 0 14px;}
.jh-foot-grid ul{list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:10px;}
.jh-foot-grid a:hover{text-decoration:underline; color:var(--green);}
.jh-foot-bottom{
  display:flex; justify-content:space-between; align-items:center; margin-top:44px; padding-top:20px;
  border-top:1px solid var(--line); font-family:var(--f-mono); font-size:11px; color:var(--paper-dim); flex-wrap:wrap; gap:10px;
}

@media (max-width:860px){
  .jh-hero-grid{grid-template-columns:1fr;}
  .jh-stack{order:-1; height:300px; margin-bottom:20px;}
  .jh-stack .jh-s1{width:150px; top:0; left:2%;}
  .jh-stack .jh-s2{width:160px; top:6px; left:46%;}
  .jh-stack .jh-s3{width:130px; top:150px; left:0;}
  .jh-stack .jh-tag-chip{width:190px; bottom:-14px; right:2%;}
  .jh-catgrid{grid-template-columns:repeat(2,1fr);}
  .jh-shelf{grid-template-columns:repeat(2,1fr);}
  .jh-about-grid{grid-template-columns:1fr;}
  .jh-foot-grid{grid-template-columns:1fr 1fr;}

  /* Mobile nav: the pill row was a horizontal scroller with its
     scrollbar deliberately hidden (::-webkit-scrollbar{display:none}
     above) and no other hint it scrolls — and below 480px, About/
     Contact used to just disappear (display:none) with no other way
     to reach them from the nav at all. Replaced with a real
     hamburger + full-width dropdown panel, toggled by
     assets/jh-nav.js, so every link stays reachable and each one
     gets a full-width, thumb-sized touch target instead of a packed
     horizontal strip. */
  .jh-nav-toggle{display:inline-flex; align-items:center; justify-content:center;}
  /* .jh-navrow was the flex:1 1 auto item filling the gap between
     logo and cart — hidden now, so without this the cart would sit
     right next to the toggle button instead of pinned to the edge. */
  .jh-cart{margin-left:auto;}
  .jh-navrow.jh-navlinks{
    display:none; position:absolute; top:100%; left:0; right:0;
    flex-direction:column; align-items:stretch; gap:4px;
    max-height:calc(100vh - 66px); overflow-y:auto; overflow-x:visible;
    background:var(--ink); border-bottom:1px solid var(--line);
    padding:10px 20px 20px; box-shadow:0 12px 24px rgba(0,0,0,0.4);
  }
  .jh-header.jh-nav-open .jh-navrow.jh-navlinks{display:flex;}
  .jh-navrow.jh-navlinks .jh-pill{
    width:100%; text-align:left; padding:14px 16px; font-size:13px;
  }
  .jh-navlinks .jh-plain{padding:14px 16px;}
}
@media (max-width:480px){
  .jh-header .jh-logo-img{height:44px;}
  .jh-cart-label{display:none;}
  .jh-stack{height:260px;}
  .jh-stack .jh-s1{width:120px;}
  .jh-stack .jh-s2{width:130px; left:44%;}
  .jh-stack .jh-s3{width:105px; top:135px;}
  .jh-stack .jh-tag-chip{width:160px; bottom:-10px;}
}
.jh-home :focus-visible{outline:3px solid var(--green); outline-offset:2px;}
.jh-sr-only{
  position:absolute !important; width:1px; height:1px; padding:0; margin:-1px;
  overflow:hidden; clip:rect(0,0,0,0); white-space:nowrap; border:0;
}


/* ============================================================
   PART 2 — Fallback safety net for WooCommerce's default markup
   Archive/single product pages now use their own blank-canvas
   templates (archive-product.php, single-product.php — see PART 3
   below), so these rules mostly matter for any WooCommerce output
   we haven't taken over yet (e.g. widgets, search results). Kept
   here as a safety net rather than removed.
   ============================================================ */

body.woocommerce, body.woocommerce-page{
  background:var(--ink) !important;
  color:var(--paper) !important;
}
body.woocommerce ul.products li.product,
body.woocommerce-page ul.products li.product{
  background:var(--panel);
  border:1px solid var(--line);
  border-radius:12px;
  padding:16px 14px 18px;
  position:relative;
  transition:transform .15s ease, border-color .15s ease;
}
body.woocommerce ul.products li.product:hover{
  transform:translateY(-5px);
  border-color:var(--green);
}
body.woocommerce ul.products li.product img{
  border-radius:8px;
}
body.woocommerce ul.products li.product .woocommerce-loop-product__title,
body.woocommerce ul.products li.product h2,
body.woocommerce ul.products li.product h3{
  color:var(--paper) !important;
  font-family:var(--f-body);
  font-size:15px;
}
body.woocommerce ul.products li.product .price{
  color:var(--green) !important;
  font-family:var(--f-mono);
}
body.woocommerce ul.products li.product .price del{
  color:var(--paper-dim) !important;
}
body.woocommerce a.button, body.woocommerce-page a.button,
body.woocommerce button.button, body.woocommerce-page button.button{
  background:var(--green) !important;
  color:var(--ink) !important;
  border-radius:4px !important;
  border:2px solid var(--green) !important;
  font-family:var(--f-mono) !important;
  text-transform:uppercase;
  letter-spacing:0.04em;
  font-weight:600 !important;
  transition:transform var(--dur) var(--ease), box-shadow var(--dur) var(--ease) !important;
}
body.woocommerce a.button:hover, body.woocommerce-page a.button:hover,
body.woocommerce button.button:hover, body.woocommerce-page button.button:hover{
  transform:translate(-2px,-2px); box-shadow:4px 4px 0 var(--pink);
}
body.woocommerce a.button:active, body.woocommerce-page a.button:active,
body.woocommerce button.button:active, body.woocommerce-page button.button:active{
  transform:translate(0,0) scale(.98); box-shadow:none; transition-duration:60ms;
}
body.woocommerce nav.woocommerce-pagination ul li,
body.woocommerce nav.woocommerce-pagination ul{
  background:transparent !important;
  border-color:var(--line) !important;
}
body.woocommerce nav.woocommerce-pagination a,
body.woocommerce nav.woocommerce-pagination span{
  color:var(--paper) !important;
}
body.single-product div.product .price{
  color:var(--green) !important;
  font-family:var(--f-mono);
  font-size:22px;
}
body.single-product div.summary h1.product_title{
  font-family:var(--f-display);
  text-transform:uppercase;
  color:var(--paper) !important;
}

/* ============================================================
   PART 3 — Archive (shop/category) + single product pages
   These style the blank-canvas templates: archive-product.php,
   single-product.php, and content-product.php (the reusable card
   used in every product loop, including related products).
   ============================================================ */

/* archive header */
.jh-archive-head{padding:64px 0 32px;}
.jh-archive-head h1{font-size:clamp(34px,4.5vw,56px); margin-top:10px;}
.jh-archive-head .jh-dek{max-width:620px; margin-top:14px; font-size:15px; line-height:1.6; color:#C7C6C1;}

/* visible breadcrumb trail (Home / Shop / Category) — output by
   WooCommerce's own woocommerce_breadcrumb(), fired automatically on
   the woocommerce_before_main_content hook we call in both
   archive-product.php and single-product.php. Separate from
   jh_breadcrumb_schema() in functions.php, which only emits
   invisible JSON-LD for search engines — this rule styles what
   visitors actually see, which otherwise renders with the browser's
   default blue link color since nothing in this theme touched it. */
.woocommerce-breadcrumb{color:var(--paper-dim); font-size:13px;}
.woocommerce-breadcrumb a{color:var(--green) !important;}
.woocommerce-breadcrumb a:hover{text-decoration:underline;}

/* "Not for everyone" category archive — carries the same pink used
   for its nav pill (.jh-pill.jh-hot) through onto the page itself,
   so it reads as a distinct, edgier section rather than looking
   identical to the Stickers/Mugs/Tees archives. Body gets the
   "jh-archive-explicit" class from archive-product.php only when
   viewing this specific category. */
.jh-archive-explicit .jh-archive-head{border-bottom:1px solid rgba(255,62,127,0.3);}
.jh-archive-explicit .jh-halftone{
  background-image: radial-gradient(circle, rgba(255,62,127,0.22) 1px, transparent 1.3px);
}
.jh-archive-explicit .jh-archive-head h1{color:var(--pink);}
/* !important: this page's own product grid uses
   "ul.products.jh-shelf li.product.jh-tag-card:hover" for the green
   hover border (4 classes + 2 types + :hover), which out-specifies
   this rule (2 classes + :hover) — so the override below never
   actually won, on this or any other grid page. Confirmed live by
   hovering a card on this exact page before fixing. */
.jh-archive-explicit .jh-tag-card:hover{border-color:var(--pink) !important;}
/* Sale badge pink override moved to a single universal rule near the
   base ".jh-tag-card span.onsale"/".jh-product-wrap div.product >
   span.onsale" rules (search "product_cat-explicit") — targets the
   PRODUCT's own category via WooCommerce's automatic
   "product_cat-{slug}" class instead of the page you're viewing it
   on, so a "Not for everyone" product's badge is pink everywhere it
   appears (shop grid, homepage catalog, related products, upsells),
   and a card for any OTHER category shown on this page (via related/
   upsells) correctly stays green instead of inheriting this page's
   pink just because of where it happens to be displayed. */
.jh-archive-explicit .jh-pagination nav.woocommerce-pagination a,
.jh-archive-explicit .jh-pagination nav.woocommerce-pagination span{
  background:var(--pink) !important; border-color:var(--pink) !important;
}
.jh-archive-explicit .jh-pagination nav.woocommerce-pagination a:hover{
  background:var(--green) !important; border-color:var(--green) !important;
}

.jh-shop-body{padding-bottom:90px;}

.jh-shop-toolbar{
  display:flex; align-items:center; justify-content:space-between; gap:16px; flex-wrap:wrap;
  margin-bottom:28px; padding-bottom:16px; border-bottom:1px solid var(--line);
}
.jh-shop-toolbar .woocommerce-result-count{margin:0; font-family:var(--f-mono); font-size:11.5px; color:var(--paper-dim); text-transform:uppercase; letter-spacing:0.06em;}
.jh-sort select{
  background:var(--panel); color:var(--paper); border:1px solid var(--line); border-radius:4px;
  padding:8px 12px; font-family:var(--f-mono); font-size:12px;
}

/* product grid — reuses .jh-tag-card from PART 1, applied as <li> here */
ul.products.jh-shelf{
  display:grid; grid-template-columns:repeat(4,1fr); gap:22px;
  list-style:none; margin:0 0 40px; padding:0;
}

/* WooCommerce's stylesheet gives ul.products a clearfix pair —
   "ul.products:before, ul.products:after{content:" "; display:table;}"
   — left over from its float-based grid, where an invisible
   table-display pseudo-element was needed to contain floated <li>s.
   In a CSS Grid container that pseudo-element isn't a no-op: it's
   still a real box (display:table, not none), so it becomes an
   actual grid ITEM occupying row 1 / column 1, pushing every real
   product over by one cell and leaving the top-left slot empty —
   which is why the first row only showed 3 of 4 cards. Same issue
   would hit the related-products grid on single product pages. */
ul.products.jh-shelf::before, ul.products.jh-shelf::after,
.jh-product-wrap .related.products ul.products::before,
.jh-product-wrap .related.products ul.products::after,
.jh-product-wrap .upsells.products ul.products::before,
.jh-product-wrap .upsells.products ul.products::after{
  display:none !important;
}

/* WooCommerce's own stylesheet ships a float-based grid —
   ".woocommerce ul.products li.product{float:left; width:22.05%;
   margin:0 3.8% 2.992em 0;}" — that still matches every card here.
   We never declared width/float/margin ourselves, so those values
   applied uncontested: each card's width:22.05% resolved against
   its CSS Grid COLUMN (not the row), collapsing cards down to
   slivers (~52px) instead of filling the ~236px column — which is
   also why product titles wrapped one letter per line. !important
   is used because this needs to beat WooCommerce's rule regardless
   of load order or any other plugin CSS, and because
   "li.product.jh-tag-card" (no ul-class requirement) intentionally
   also covers the related-products grid in single-product.php,
   which reuses this same card markup under a plain "ul.products"
   WooCommerce generates itself (no "jh-shelf" class there). */
li.product.jh-tag-card{
  width:auto !important; float:none !important; margin:0 !important;
}
ul.products.jh-shelf li.product.jh-tag-card{
  background:var(--panel); border:1px solid var(--line); border-radius:12px;
  padding:18px 16px 16px; position:relative; transition:transform .15s ease, border-color .15s ease;
}
ul.products.jh-shelf li.product.jh-tag-card:hover{transform:translateY(-5px); border-color:var(--green);}

/* sale badge (fired via woocommerce_before_shop_loop_item_title).
   !important throughout: WooCommerce's own stylesheet targets this
   same badge with ".woocommerce ul.products li.product .onsale"
   (4 classes + 2 types), which outranks our 2-class "span.onsale"
   selector on class count alone and wins position/size regardless
   of load order — hence the oversized, misplaced, wrong-colored
   badge instead of the small pill this rule describes. Green/white
   everywhere except the "Not for everyone" archive, which keeps the
   badge pink (override below, alongside that page's other
   jh-archive-explicit pink accents). */
.jh-tag-card span.onsale{
  position:absolute !important; top:10px !important; right:auto !important; left:10px !important; margin:0 !important; z-index:2;
  min-width:0 !important; min-height:0 !important; height:auto !important; width:auto !important;
  background:var(--green) !important; color:#fff !important; font-family:var(--f-mono); font-weight:700 !important;
  font-size:9px !important; text-transform:uppercase; padding:4px 8px !important; border-radius:999px !important; line-height:1.4 !important; text-align:center;
}

/* star rating (fired via woocommerce_after_shop_loop_item_title) */
.jh-tag-card .star-rating{
  font-size:12px; color:var(--green); margin:4px 0 8px;
}

/* add-to-cart button inside the card */
.jh-addtocart{margin-top:12px;}
.jh-addtocart .button{
  display:block; width:100%; text-align:center;
  background:var(--green); color:var(--ink); border-radius:4px; border:2px solid var(--green);
  font-family:var(--f-mono); font-weight:600; font-size:11.5px; text-transform:uppercase; letter-spacing:0.04em;
  padding:9px 10px; transition:transform var(--dur) var(--ease), box-shadow var(--dur) var(--ease); will-change:transform;
}
.jh-addtocart .button:hover{transform:translate(-1px,-1px); box-shadow:3px 3px 0 var(--pink);}
.jh-addtocart .button:active{transform:translate(0,0) scale(.98); box-shadow:none; transition-duration:60ms;}
.jh-addtocart .added_to_cart{
  display:block; margin-top:6px; font-family:var(--f-mono); font-size:10.5px; color:var(--paper-dim); text-align:center;
}

/* pagination */
.jh-pagination nav.woocommerce-pagination ul{
  display:flex; gap:6px; list-style:none; margin:0; padding:0; border:none !important;
}
.jh-pagination nav.woocommerce-pagination ul li{border:none !important;}
/* Every page-number box: green background, white number. !important
   on all three properties (not just color) because a plugin/theme
   style targeting ".current" (and, separately, ".onsale" — see the
   sale-badge comment above) sets a blue background at a specificity
   that otherwise wins over an un-!important declaration here. */
.jh-pagination nav.woocommerce-pagination a,
.jh-pagination nav.woocommerce-pagination span{
  display:inline-flex; align-items:center; justify-content:center; min-width:36px; height:36px;
  border:1px solid var(--green) !important; border-radius:4px;
  background:var(--green) !important; color:#fff !important;
  font-family:var(--f-mono); font-size:12px; font-weight:600;
}
.jh-pagination nav.woocommerce-pagination a:hover{background:var(--pink) !important; border-color:var(--pink) !important;}
.jh-pagination nav.woocommerce-pagination .current{font-weight:700;}

/* notices (added-to-cart / out-of-stock / error messages) */
.jh-shop-body .woocommerce-notices-wrapper .woocommerce-message,
.jh-shop-body .woocommerce-notices-wrapper .woocommerce-error,
.jh-product-wrap .woocommerce-notices-wrapper .woocommerce-message,
.jh-product-wrap .woocommerce-notices-wrapper .woocommerce-error{
  background:var(--panel); border:1px solid var(--line); border-left:3px solid var(--green);
  color:var(--paper); border-radius:6px; padding:14px 18px; font-size:13.5px; list-style:none;
}
.jh-product-wrap .woocommerce-notices-wrapper .woocommerce-error{border-left-color:var(--pink);}

/* ---- single product page ---- */
.jh-product-wrap{padding:56px 0 90px;}
/* "div.product" (tag-qualified), NOT a bare ".product" — and NOT the
   ">" direct-child combinator this used briefly in v1.13, which
   turned out to be wrong: Beaver Builder Theme's own
   woocommerce_before_main_content hook wraps the real product markup
   in several extra divs (".container > .row >
   .fl-content.fl-woo-content"), so ".product" is 4 levels deep, not
   a direct child — meaning ".jh-product-wrap > .product" matched
   NOTHING, and this whole two-column gallery/summary layout silently
   collapsed to one column for as long as v1.13 was live. Confirmed
   live via the actual DOM chain before landing this fix.
   Tag-qualifying as "div.product" instead solves the ORIGINAL v1.13
   problem just as well — WooCommerce puts a bare "product" class on
   both this top-level <div> and every related/upsell card's <li>,
   but content-product.php's cards are always <li> elements (see its
   own header comment), never <div>, so "div.product" can only match
   the real top-level wrapper regardless of how many divs it's
   nested inside. */
.jh-product-wrap div.product{
  display:grid; grid-template-columns:1fr 1fr; gap:48px; align-items:start;
}
/* The single product's own "Sale!" badge (on the main gallery image)
   is a direct child of that same div.product — never styled before,
   so it rendered in a plugin skin's default blue (rgb(43,123,185),
   same source as the pre-fix card badge and pagination bugs).
   Deliberately ".product" here, NOT "div.product": the "div" tag
   qualifier on the layout rule above exists to dodge related/upsell
   <li class="product">  cards, but for THIS selector the ">"
   direct-child combinator already does that job on its own — a
   card's onsale span sits inside "<a class='jh-thumb'>", never as a
   direct child of the <li> itself — so adding "div" here would only
   inflate this rule's specificity for no reason. That inflation is
   exactly what broke the very first version of this fix: with "div"
   included this rule out-specified the universal pink override below
   for this one element (3 classes+2 types vs. 3 classes+1 type,
   losing on type count), even though both are !important. Confirmed
   live, twice, before landing on this version. */
.jh-product-wrap .product > span.onsale{background:var(--green) !important; color:#fff !important;}
/* Universal "Not for everyone" sale-badge override — WooCommerce
   automatically adds "product_cat-{slug}" to both a card's <li> and
   the single product's own top-level <div>, so this one rule catches
   every place a badge for an explicit-category product can render:
   the shop grid, any category archive, the homepage catalog, related
   products, upsells, and the single product page itself — based on
   the PRODUCT's actual category, not which page happens to be
   showing it. That matters for related products/upsells specifically:
   a non-explicit product shown on an explicit product's page should
   stay green, and an explicit product shown among related items on a
   non-explicit product's page should still show pink. Same
   specificity (3 classes + 1 type) as the green rule immediately
   above on purpose — a genuine tie, correctly broken by this rule
   coming second. */
.jh-home .product_cat-explicit span.onsale{background:var(--pink) !important; color:var(--ink) !important;}
.jh-product-wrap .woocommerce-product-gallery{background:var(--panel); border-radius:12px; padding:16px; border:1px solid var(--line);}
.jh-product-wrap .woocommerce-product-gallery img{border-radius:8px;}
.jh-product-wrap div.summary{color:var(--paper);}
.jh-product-wrap div.summary h1.product_title{
  font-family:var(--f-display); text-transform:uppercase; color:var(--paper); font-size:clamp(28px,3.5vw,40px); margin-bottom:14px;
}
.jh-product-wrap div.summary .price{
  color:var(--green); font-family:var(--f-mono); font-size:24px; display:block; margin-bottom:16px;
}
.jh-product-wrap div.summary .price del{color:var(--paper-dim); text-decoration:line-through;}
.jh-product-wrap div.summary .woocommerce-product-details__short-description{color:#C7C6C1; line-height:1.6; margin-bottom:20px;}
.jh-product-wrap div.summary .star-rating{color:var(--green); margin-bottom:14px;}
.jh-product-wrap form.cart{margin-top:20px;}
.jh-product-wrap form.cart .button,
.jh-product-wrap div.summary a.button{
  background:var(--green); color:var(--ink); border-radius:4px; border:2px solid var(--green);
  font-family:var(--f-mono); font-weight:700; text-transform:uppercase; letter-spacing:0.04em;
  padding:14px 28px; font-size:13px;
  transition:transform var(--dur) var(--ease), box-shadow var(--dur) var(--ease); will-change:transform;
}
.jh-product-wrap form.cart .button:hover,
.jh-product-wrap div.summary a.button:hover{transform:translate(-2px,-2px); box-shadow:4px 4px 0 var(--pink);}
.jh-product-wrap form.cart .button:active,
.jh-product-wrap div.summary a.button:active{transform:translate(0,0) scale(.98); box-shadow:none; transition-duration:60ms;}
/* !important: a Beaver Builder skin stylesheet
   ("skin-<hash>.css", generated by the parent theme's Customizer
   settings — see the dequeue note in functions.php) ships its own
   ".woocommerce .quantity input.qty{background:#fff; color:#757575;}"
   plus a generic "input[type=number]{background:#fcfcfc;
   color:#757575;}" — both with enough specificity to beat these
   rules for at least one of background/color, leaving the quantity
   number nearly illegible (dark gray text on a white/near-white
   field sitting on our dark page). Confirmed live via computed
   styles before adding !important here rather than guessing. */
.jh-product-wrap form.cart .quantity input{
  background:var(--panel) !important; border:1px solid var(--line) !important; color:var(--paper) !important; border-radius:4px; padding:10px; width:64px;
}
.jh-product-wrap table.variations select{
  background:var(--panel) !important; color:var(--paper) !important; border:1px solid var(--line) !important; border-radius:4px; padding:8px;
}
.jh-product-wrap .product_meta{
  margin-top:24px; padding-top:16px; border-top:1px solid var(--line);
  font-family:var(--f-mono); font-size:11.5px; color:var(--paper-dim);
}
.jh-product-wrap .product_meta a{color:var(--paper-dim); text-decoration:underline;}

/* tabs (description / additional information / reviews).
   !important throughout: both WooCommerce core AND a Beaver Builder
   skin stylesheet ship ".woocommerce div.product .woocommerce-tabs
   ul.tabs li(.active)" rules (5 classes + 3 types) that outrank ours
   (4 classes + 2 types) on class count alone — confirmed live via
   computed styles (white active tab, dark gray text, no green
   anywhere) before adding !important rather than guessing. Every
   tab now gets the same green-pill / white-text treatment regardless
   of how many tabs a given product has (Reviews always present;
   Additional information only shows up for products with attributes). */
.jh-product-wrap .woocommerce-tabs{grid-column:1 / -1; margin-top:48px; border-top:1px solid var(--line); padding-top:32px;}
.jh-product-wrap .woocommerce-tabs ul.tabs{list-style:none; display:flex; gap:10px; margin:0 0 24px; padding:0; flex-wrap:wrap;}
.jh-product-wrap .woocommerce-tabs ul.tabs li{
  font-family:var(--f-mono); font-size:12px; text-transform:uppercase; letter-spacing:0.04em;
  padding:10px 16px; border:1px solid var(--green) !important; border-radius:999px; cursor:pointer;
  background:var(--green) !important;
}
.jh-product-wrap .woocommerce-tabs ul.tabs li a{color:#fff !important;}
.jh-product-wrap .woocommerce-tabs ul.tabs li.active{font-weight:700;}
.jh-product-wrap .woocommerce-tabs ul.tabs li.active a{color:#fff !important;}
/* WooCommerce's own ".woocommerce-Tabs-panel" ships a solid white
   background (confirmed live: rgb(255,255,255)). We already set the
   panel's own text to a light gray/paper — on that white background
   it was nearly illegible (white-on-white for headings, light gray
   on white for body copy). !important since this is WooCommerce's
   own class, not ours. */
.jh-product-wrap .woocommerce-tabs .panel{color:#C7C6C1; line-height:1.7; background:transparent !important;}
.jh-product-wrap .woocommerce-tabs .panel h2{color:var(--paper); font-family:var(--f-display); text-transform:uppercase; margin-bottom:14px;}

/* Related products AND Upsells — same card design, same section
   treatment, own heading. These are two separate WooCommerce
   sections ("Related products" vs. the Upsells block, which
   defaults to the heading "You may also like…") — up-sells is a
   distinct, curated list (products the merchant explicitly marked
   as upsells for this product), completely separate from "related",
   which WooCommerce generates automatically from shared categories/
   tags. Both use content-product.php for their cards, so both need
   the same grid CSS; only "related.products" had it, leaving
   Upsells to fall back to broken styling once the global card reset
   (li.product.jh-tag-card{width:auto!important; float:none!important})
   stripped its old float-based layout with nothing to replace it. */
.jh-product-wrap .related.products,
.jh-product-wrap .upsells.products{grid-column:1 / -1; margin-top:56px; padding-top:32px; border-top:1px solid var(--line);}
.jh-product-wrap .related.products > h2,
.jh-product-wrap .upsells.products > h2{
  font-family:var(--f-display); text-transform:uppercase; font-size:26px; margin-bottom:24px; color:var(--paper);
}
.jh-product-wrap .related.products ul.products,
.jh-product-wrap .upsells.products ul.products{
  display:grid; grid-template-columns:repeat(4,1fr); gap:22px; list-style:none; margin:0; padding:0;
}

@media (max-width:900px){
  .jh-product-wrap div.product{grid-template-columns:1fr;}
  ul.products.jh-shelf,
  .jh-product-wrap .related.products ul.products,
  .jh-product-wrap .upsells.products ul.products{grid-template-columns:repeat(2,1fr);}
}

/* ============================================================
   PART 4 — Generic Pages (page.php): About Us, Contact Us, Terms
   of Service, Privacy Policy, and any future Page.

   These pages were authored in Beaver Builder using PowerPack/
   Ultimate Addons modules (".pp-primary-title", ".pp-button", etc.)
   styled for the OLD light-background design: near-black headings,
   mid-gray body text, a solid black button. page.php still calls
   the_content() so the client can keep editing these pages in
   Beaver Builder — so instead of matching specific module classes,
   these rules force color/background broadly (and use !important
   throughout, since BB writes plenty of its own specific,
   sometimes per-element-ID, CSS) across whatever text and structural
   wrapper elements the page editor happens to contain.
   ============================================================ */

.jh-page-wrap{padding:64px 0 90px; max-width:820px;}
.jh-page-wrap h1{font-size:clamp(32px,4.2vw,50px); margin-bottom:32px;}

/* Structural Beaver Builder row/column/module wrappers: strip
   whatever background color the page editor set so our dark
   .jh-home background shows through instead of a light panel. */
.jh-page-content .fl-row,
.jh-page-content .fl-row-content-wrap,
.jh-page-content .fl-col-content,
.jh-page-content .fl-module-content,
.jh-page-content [class*="fl-node-"]{
  background-color:transparent !important;
  background-image:none !important;
}

/* Text: force onto the site's light-on-dark palette regardless of
   whatever color the page editor originally set, but leave buttons/
   links alone here — those get their own treatment below. */
.jh-page-content,
.jh-page-content h1, .jh-page-content h2, .jh-page-content h3,
.jh-page-content h4, .jh-page-content h5, .jh-page-content h6,
.jh-page-content p, .jh-page-content li, .jh-page-content span,
.jh-page-content div{
  color:var(--paper) !important;
}
.jh-page-content p, .jh-page-content li{
  color:#C7C6C1 !important; line-height:1.7; margin-bottom:16px; font-size:15.5px;
}
.jh-page-content h1, .jh-page-content h2, .jh-page-content h3{
  font-family:var(--f-display); text-transform:uppercase; letter-spacing:0.01em;
  color:var(--paper) !important; margin:32px 0 14px; line-height:1.1;
}
.jh-page-content > *:first-child{margin-top:0;}
.jh-page-content a:not([class*="button"]){color:var(--green) !important; text-decoration:underline;}
.jh-page-content a:not([class*="button"]):hover{color:var(--pink) !important;}

/* Buttons (Beaver Builder's own ".fl-button" and PowerPack's
   ".pp-button") — restyled to match the site's own .jh-btn look
   instead of the black CTA button these pages shipped with, which
   had almost no contrast against our near-black background. */
.jh-page-content a.fl-button,
.jh-page-content a.pp-button,
.jh-page-content .fl-button-wrap a{
  display:inline-flex !important; align-items:center; gap:8px;
  background:var(--green) !important; color:var(--ink) !important;
  border:2px solid var(--green) !important; border-radius:4px !important;
  font-family:var(--f-mono) !important; font-weight:600 !important; font-size:13px !important;
  text-transform:uppercase; letter-spacing:0.04em; text-decoration:none !important;
  padding:14px 26px !important; transition:transform var(--dur) var(--ease), box-shadow var(--dur) var(--ease);
}
.jh-page-content a.fl-button:hover,
.jh-page-content a.pp-button:hover,
.jh-page-content .fl-button-wrap a:hover{
  transform:translate(-2px,-2px); box-shadow:4px 4px 0 var(--pink);
}
.jh-page-content a.fl-button *,
.jh-page-content a.pp-button *,
.jh-page-content .fl-button-wrap a *{color:inherit !important;}

/* Cart and Checkout are WooCommerce shortcodes ([woocommerce_cart],
   [woocommerce_checkout]) sitting on ordinary WordPress Pages, so
   page.php — and therefore .jh-page-content — now covers them too.
   The generic overrides above don't reach WooCommerce's own table/
   payment-panel markup, which ships styled for a white page
   background: the cart items table, the checkout order-review
   table, the coupon toggle, and the payment-method box (GoDaddy
   Payments/Poynt's card-entry panel included) all rendered as a
   barely-legible near-white-on-white panel. Confirmed live by
   adding a real item to cart and walking through to Checkout. */
.jh-page-content table.shop_table{
  background:transparent !important; border-color:var(--line) !important; color:var(--paper) !important;
}
.jh-page-content table.shop_table th,
.jh-page-content table.shop_table td{
  border-color:var(--line) !important; color:var(--paper) !important;
}
.jh-page-content table.shop_table .product-name a{color:var(--green) !important;}
.jh-page-content table.shop_table del{color:var(--paper-dim) !important;}
.jh-page-content table.shop_table ins{text-decoration:none;}
.jh-page-content .cart_totals,
.jh-page-content .woocommerce-checkout-payment,
.jh-page-content .wc_payment_methods,
.jh-page-content .payment_box,
.jh-page-content #payment,
.jh-page-content .woocommerce-form-coupon,
.jh-page-content .woocommerce-info,
.jh-page-content .woocommerce-NoticeGroup{
  background:var(--panel) !important; border-color:var(--line) !important; color:var(--paper) !important;
}
.jh-page-content .payment_box{border-radius:0 0 8px 8px;}
.jh-page-content ul.payment_methods{border-color:var(--line) !important;}
.jh-page-content ul.payment_methods li{border-color:var(--line) !important; color:var(--paper) !important;}
.jh-page-content .woocommerce-form-coupon-toggle .woocommerce-info,
.jh-page-content .woocommerce-form-coupon-toggle a{color:var(--green) !important;}
.jh-page-content .woocommerce-Price-amount{color:var(--green);}
.jh-page-content #order_review_heading,
.jh-page-content h3#order_review_heading{color:var(--paper) !important;}

/* ============================================================
   PART 5 — About Us (page-about-us.php)
   A page-specific template, so it takes over from the generic
   page.php + .jh-page-content rules above for this one URL. Reuses
   existing tokens/classes wherever one already fit (.jh-eyebrow,
   .jh-halftone, .jh-btn, .jh-hero-ctas, .jh-stat-row/.jh-stat — the
   same stat-row styling the homepage's "Who's behind the printer"
   section already uses) rather than inventing parallel ones.
   ============================================================ */

.jh-story-head{padding:64px 0 40px;}
.jh-story-head h1{font-size:clamp(38px,6vw,64px); margin-top:10px;}

.jh-story-block{padding:64px 0;}
.jh-story-grid{display:grid; grid-template-columns:0.85fr 1.15fr; gap:56px; align-items:center;}
.jh-story-reverse .jh-story-media{order:2;}
.jh-story-reverse .jh-story-copy{order:1;}
/* Framed panel rather than a cropped photo treatment: the two
   images used here (a product mockup, a logo lockup) have very
   different native aspect ratios, and object-fit:cover would crop
   the logo lockup's tagline right off. Same framed-panel language
   as .jh-thumb uses for product photos elsewhere on the site. */
.jh-story-media{
  background:var(--panel); border:1px solid var(--line); border-radius:10px;
  padding:36px; display:flex; align-items:center; justify-content:center; min-height:280px;
}
.jh-story-media img{width:100%; height:auto; max-width:360px;}
.jh-story-copy h2{font-size:clamp(28px,3.6vw,42px); margin:10px 0 18px;}
.jh-story-copy > p{font-size:16px; line-height:1.65; color:#C7C6C1; max-width:52ch;}

.jh-quote{border-left:3px solid var(--green); padding:4px 0 4px 22px; margin:22px 0 30px;}
.jh-quote p{font-size:19px; line-height:1.5; color:var(--paper); font-style:italic; max-width:44ch;}

.jh-story-stats{padding:20px 0 76px;}
.jh-story-stats .jh-stat-row{margin-top:18px;}

.jh-story-cta{
  padding:76px 0; text-align:center; border-top:1px solid var(--line);
}
.jh-story-cta h2{font-size:clamp(30px,4.6vw,52px); max-width:16ch; margin:0 auto 30px;}

@media (max-width:820px){
  .jh-story-grid{grid-template-columns:1fr;}
  .jh-story-reverse .jh-story-media{order:1;}
  .jh-story-reverse .jh-story-copy{order:2;}
  .jh-story-media img{aspect-ratio:4/3;}
}
