/* FONTS ARE NO LONGER LOADED FROM THIS FILE. Removed 31 Aug 2026.

   There was an @import here pulling Young Serif, Figtree and DM Mono.
   It worked, but it was the most expensive possible way to fetch a font:
   an @import is a CHAINED request, unable to start until this 49.5 KB
   stylesheet has itself been downloaded and parsed. The fonts queued
   behind it rather than loading alongside everything else - straight
   onto the critical path, on mobile, where it hurts most.

   It also duplicated: Elementor was fetching Figtree separately from
   fonts-api.wp.com, and Montserrat and Poppins came from both Kadence
   and the je-fonts snippet. Five families arrived over four requests to
   two hosts, three of them twice over.

   All five now come in ONE request enqueued by the PERFORMANCE TRIM
   snippet, with preconnect to fonts.gstatic.com. Same families, same
   weights - Young Serif (headings), Figtree (body/UI), DM Mono (labels),
   Montserrat and Poppins (header and homepage).

   SO: if type falls back to Georgia and system-ui across the site, the
   cause is that snippet being inactive, NOT anything in this file.
   Nothing here loads a font any more. */
/* ==========================================================================
   JE TOKENS — brand fonts and colours, single source of truth
   Previously declared twice, independently, inside body.single-product
   (JE PHASE 2) and body.term-jute-bags-for-branding-or-promotions
   (JE PHASE 5) - a colour change meant editing both blocks and hoping they
   were not missed a third time on the next page that needed them. Moved
   to :root so every var(--je-*) reference anywhere in this file - present
   or future - now resolves from exactly one place.

   6 Aug 2026, second pass: every remaining raw hex colour literal in this
   file (outside this block) has been converted to reference one of these
   tokens - header nav, My Account, category titles, shadows, everything.
   A first pass only matched the exact hex strings already tokenized here,
   which missed near-duplicate shades doing the same visual job with
   slightly drifted values - found by auditing every distinct hex literal
   still left in the file afterwards, not by re-guessing the same list.
   (Deliberately describing these by NAME below, not by hex digit, after
   the first version of this comment quoted the literal values it was
   explaining and a later find-and-replace pass mangled its own prose the
   same way it mangled the CSS - this paragraph is now exempt from that
   class of accident by construction.)

     My Account's button-hover green and its lost-password hover colour
       were both a very slightly different shade from --je-green-deep -
       close enough to look identical, never actually the same value.
       Consolidated into --je-green-deep, the token that role already
       exists for.
     My Account's select2 dropdown text and its lost-password link's
       default colour were each their own near-black, doing exactly the
       job --je-ink already does. Consolidated into --je-ink.

   Three genuinely distinct colours had no token at all and got one added,
   rather than being force-mapped onto an existing value that would have
   changed how they render:
     --je-cream-deep - a deliberately DARKER shade than --je-cream, used
       only on :hover/:drag-hover states (the WhatsApp button, the file
       upload dropzone). Mapping it onto --je-cream instead would have
       made the hover state indistinguishable from rest - the opposite of
       what a hover state is for.
     --je-white - crisp white button and badge text, distinct from
       --je-paper's warm off-white background tone. Visually close, not
       the same design decision, so kept as its own token.
     --je-muted-inverse - the closing CTA band's paragraph colour, muted
       text sized for the dark --je-ink background rather than for paper.

   Zero raw hex colour literals remain anywhere in this file outside this
   block. */
:root{
  /* Migrated to Young Serif + Figtree (20 Aug 2026), the Earth & Green
     pairing, so product pages match the category pages instead of
     switching typeface mid-journey. These now ALIAS --je-serif/--je-sans
     rather than naming Archivo/Instrument Sans, which are no longer
     loaded - one definition, so the two can never drift apart again.
     Kept as names rather than search-replaced across the file because
     every Phase 2/3 product rule already references them; repointing the
     token migrates all of it at once. */
  --je-display:var(--je-serif);
  --je-body:var(--je-sans);
  --je-mono:'DM Mono', 'DM Mono Fallback', ui-monospace, monospace;
  --je-green:#027D0E; /* was #03AC13 (3.0:1 on white); #027D0E passes 4.5:1 for text and white-on-green. JE POLISH, 13 Sep 2026 */
  --je-green-deep:#02790D;
  --je-sand:#EFE6D3;
  --je-cream:#FAF4E8;
  --je-cream-deep:#F3EAD8;
  --je-ochre:#B07D2B;
  --je-paper:#FDFBF6;
  --je-white:#FFFFFF;
  --je-ink:#241A12;
  --je-rule:#D9CDB6;
  --je-muted:#7C6A56;
  --je-muted-inverse:#C9B9A0;
  --je-soil:#4A3423;

  /* ---- Earth & Green theme (theme 3 of the homepage design preview,
     picked 20 Aug 2026) ----
     The palette was already here - Sand, Soil, Ochre and Green are the
     same values the preview used. What the preview did differently was
     how it APPLIES them, and that is what these aliases name:

       ground  = Sand, not near-white paper. The page sits on the warm
                 tone and cards lift off it in Cream. Painting the ground
                 white and the cards white, as the first pass did, is why
                 the design read flat - there was no layering to see.
       primary = Soil for headings and dark bands, not near-black Ink.
       on-primary = Cream text on those dark bands.

     Aliases rather than renamed tokens so the existing Phase 2/3 product
     page styling, which is built on --je-ink and --je-paper, keeps
     working untouched. */
  --je-ground:var(--je-sand);
  --je-surface:var(--je-cream);
  --je-primary:var(--je-soil);
  --je-on-primary:var(--je-cream);

  /* Young Serif + Figtree are the preview's pairing. Kept as separate
     tokens from --je-display/--je-body so the two type systems can
     coexist while the rollout is category-pages-only. */
  --je-serif:'Young Serif', 'Young Serif Fallback', Georgia, serif;
  --je-sans:'Figtree', 'Figtree Fallback', Arial, system-ui, sans-serif;

  /* A deepened ochre, for ochre used as a BACKGROUND behind small text.
     --je-ochre (#B07D2B) is a mid-tone: white on it is 3.6:1 and Soil on
     it is 3.2:1, so neither clears the 4.5:1 WCAG AA needs for text at
     the announcement bar's 10.5px. Nothing sits on the brand ochre safely
     at that size, so the background is darkened instead of the text being
     nudged around. White on this is 4.84:1.
     Use --je-ochre for ochre AS text/accents on light grounds; use this
     only where ochre is the ground. */
  --je-ochre-deep:#96691F;

  /* Text-weight variants, needed because the Earth & Green ground is Sand
     rather than white and that costs roughly a stop of contrast:
       --je-muted  on Sand  = 4.18:1  (fails AA; it passes on Cream at 4.73)
       --je-ochre  on Sand  = 2.91:1  (fails badly)
       --je-ochre  on Cream = 3.30:1  (also fails)
     So ochre is not usable as small text anywhere in this palette, and
     --je-muted is only safe on the lighter Cream surface. These two are
     the same hues carried down until they clear 4.5:1 on both grounds:
       --je-muted-deep on Sand = 5.27:1
       --je-ochre-text on Sand = 5.39:1, on Cream = 6.10:1
     Keep --je-ochre for ochre as a BACKGROUND or a large graphic element,
     and --je-ochre-text wherever it is set as type. */
  --je-muted-deep:#6B5B48;
  --je-ochre-text:#7A5518;

  /* Ochre as text on a DARK ground - the footer's column headings. The
     other two ochres both fail there, in opposite directions:
       --je-ochre      on Soil = 3.20:1   (too dark)
       --je-ochre-text on Soil = 1.55:1   (far too dark; it is built to sit
                                           on Sand, which is the reverse job)
     Carried up until it clears on Soil at 5.09:1. So the palette now holds
     three ochres, each for one specific ground: -text on light, -deep as a
     background behind white, and this one as text on dark. */
  --je-ochre-on-dark:#D9A247;
}
/* ==========================================================================
   JE POLISH 2, theme font stacks - 13 Sep 2026 (second Lighthouse pass).
   Placed right after the tokens ON PURPOSE: these rules must beat the
   theme's own stacks (same specificity, printed earlier in the page) and
   lose to every Juteearth rule below (all later in this file).

   Kadence paints every heading, breadcrumb and loop title in Montserrat
   and every button and price in Poppins; Elementor's kit paints the body
   and header menu in Figtree. None of those stacks name a metric-matched
   fallback, so on the cart, About Us, the story page, How It Works and
   every blog post the text re-flowed when the web font arrived (the
   "Web font loaded" layout shifts, 0.04 to 0.26). Same fonts, same look;
   only the fallback face behind each one changes. Faces are declared in
   the JE POLISH block near the end of this file.

   REVERT: delete from this header to the END JE POLISH 2 TOP marker.
   ========================================================================== */
h1, h2, h3, h4, h5, h6,
.entry-hero h1,
.entry-hero .kadence-breadcrumbs, .entry-hero .search-form,
.product-title .kadence-breadcrumbs,
.woocommerce div.product .product_title,
.wp-site-blocks .product-archive-title h1,
.woocommerce ul.products li.product h3, .woocommerce ul.products li.product .product-details .woocommerce-loop-product__title, .woocommerce ul.products li.product .product-details .woocommerce-loop-category__title, .wc-block-grid__products .wc-block-grid__product .wc-block-grid__product-title,
.elementor-754 .elementor-element.elementor-element-b422a0e .elementor-nav-menu--dropdown .elementor-item, .elementor-754 .elementor-element.elementor-element-b422a0e .elementor-nav-menu--dropdown .elementor-sub-item{
  font-family:Montserrat, "Montserrat Fallback", sans-serif;
}
button, .button, .wp-block-button__link, input[type="button"], input[type="reset"], input[type="submit"], .fl-button, .elementor-button-wrapper .elementor-button, .wc-block-components-checkout-place-order-button, .wc-block-cart__submit,
.woocommerce div.product .product-single-category,
.woocommerce ul.products li.product .product-details .price, .wc-block-grid__products .wc-block-grid__product .wc-block-grid__product-price,
.woocommerce ul.products.woo-archive-btn-button .product-action-wrap .button:not(.kb-button), .woocommerce ul.products li.woo-archive-btn-button .button:not(.kb-button), .wc-block-grid__product.woo-archive-btn-button .product-details .wc-block-grid__product-add-to-cart .wp-block-button__link{
  font-family:Poppins, "Poppins Fallback", sans-serif;
}
/* Elementor kit 533: body copy and the primary typography variable. */
body.elementor-kit-533{
  font-family:var(--je-sans);
  --e-global-typography-primary-font-family:var(--je-sans);
}
.elementor-754 .elementor-element.elementor-element-b422a0e .elementor-nav-menu .elementor-item{ font-family:var(--je-sans); }
/* My Jute Cute Story: the page's own styles name Poppins and Montserrat
   with a bare system-ui fallback (specificity raised because that style
   block sits in the body, after this file). */
body .jjs-page{ font-family:Poppins, "Poppins Fallback", system-ui, sans-serif; }
body .jjs-heading, body .jjs-subheading{ font-family:Montserrat, "Montserrat Fallback", system-ui, sans-serif; }
/* ================= END JE POLISH 2 TOP ================= */
/* ================= END JE TOKENS ================= */
/* ==========================================================================
   JE SITE — content container width
   The WooCommerce Product Catalog layout in Appearance > Customize was
   switched to Full Width sitewide (6 Aug 2026) to match the Single Product
   template. Measured live afterwards: .content-container.site-container
   carried max-width:none AND padding:0 on every page, not just a wider
   cap - the Customizer control removed the gutter along with the box, so
   text ran to the literal browser edge and the branding-page hero's photo
   ended up stranded far right with a dead gap before it.

   This restores a real cap and a real gutter without undoing the Full
   Width intent: still much wider than the old 1290px box, still no hard
   "boxed card" look, but nothing touches the edge and nothing sprawls
   past a sane reading width on an ultrawide monitor. Site-wide, matching
   where the Customizer setting itself applies - not scoped to one page.

   Padding is a flat 24px up to 1024px, matching JE HEADER P's mobile
   gutter exactly rather than approximately: an earlier version of this
   rule used clamp(20px, 3vw, 48px) at every width, which is a continuous
   vw-based curve, while JE HEADER P is a flat 24px - the two only agreed
   at the single viewport width where 3vw happens to equal 24px (800px),
   and drifted apart everywhere else below that. A flat value below
   1025px and the SAME clamp() above it, split at the exact breakpoint
   JE HEADER R also uses, is the only way to guarantee they compute
   identically at every width, not just coincide at one.

   JE HEADER R (below) uses these exact numbers at the exact same
   breakpoints so the header stays aligned with content everywhere. If
   these values change, change them there too.

   1600px -> 1800px -> 1880px, clamp ceiling 48px -> 40px -> 32px (both
   6 Aug 2026): asked for wider still, closer to the browser edges on
   large monitors, twice in the same session. Widening the cap and
   trimming the gutter's top end both push the same direction - more
   usable width, less dead margin - without going back to the broken
   zero-padding state this block was written to fix. */
.content-container.site-container{
  max-width: 1880px !important;
  margin-inline: auto !important;
  padding-inline: 24px !important;
}
@media (min-width: 1025px){
  .content-container.site-container{
    padding-inline: clamp(24px, 1.6vw, 32px) !important;
  }
}
/* ================= END JE SITE — content container width ================= */
/* FIX: Shop page (Bags) footer not visible */
body.woocommerce-shop,
body.page-template-default.page-id-{
  min-height: auto !important;
  height: auto !important;
  overflow-y: auto !important;
}

/* Release Elementor containers that block footer */
body.woocommerce-shop .elementor-section,
body.woocommerce-shop .elementor-container,
body.woocommerce-shop .elementor-widget-wrap,
body.woocommerce-shop .e-con,
body.woocommerce-shop .e-con-inner{
  min-height: auto !important;
  height: auto !important;
  overflow: visible !important;
}

/* Ensure footer is reachable */
body.woocommerce-shop footer,
body.woocommerce-shop .site-footer,
body.woocommerce-shop #colophon{
  position: relative !important;
  display: block !important;
  visibility: visible !important;
}
/* ===============================
   Juteearth – Category Title Styling
   =============================== */

/* DESKTOP & TABLET (default) */
.woocommerce ul.products li.product-category 
.woocommerce-loop-category__title {
    font-size: 25px !important;   /* Desktop size */
    font-weight: 500 !important;
    color: var(--je-green) !important;
    text-align: center;
}

/* MOBILE ONLY */
@media (max-width: 767px) {
    .woocommerce ul.products li.product-category 
    .woocommerce-loop-category__title {
        font-size: 29px !important;   /* Mobile size */
        font-weight: 500 !important;
    }
}

/* Remove category product count */
.woocommerce ul.products li.product-category 
.woocommerce-loop-category__title mark.count {
    display: none !important;
}








/* =====================================================
   Juteearth – My Account Page Styling
   Kadence + WooCommerce (Login & Register)
   ===================================================== */

/* ---------- BUTTONS (Login & Register) ---------- */
body.woocommerce-account .woocommerce form .button,
body.woocommerce-account .woocommerce-Button.button {
  background-color: var(--je-green) !important;      /* Brand Green */
  color: var(--je-white) !important;
  border: 2px solid var(--je-green) !important;
  border-radius: 12px !important;
  padding: 14px 32px !important;
  font-size: 16px !important;
  font-weight: 700 !important;
  letter-spacing: 0.3px;
  cursor: pointer;
  transition: all 0.25s ease-in-out;
  box-shadow: 0 10px 24px rgba(3, 172, 19, 0.25);
}

/* Hover */
body.woocommerce-account .woocommerce form .button:hover,
body.woocommerce-account .woocommerce-Button.button:hover {
  background-color: var(--je-green-deep) !important;
  border-color: var(--je-green-deep) !important;
  color: var(--je-white) !important;
  transform: translateY(-2px);
  box-shadow: 0 14px 28px rgba(3, 172, 19, 0.35);
}

/* Active */
body.woocommerce-account .woocommerce form .button:active {
  transform: translateY(0);
  box-shadow: 0 6px 14px rgba(3, 172, 19, 0.25);
}

/* ---------- INPUT FIELDS ---------- */
body.woocommerce-account .woocommerce form .input-text {
  border: 1.8px solid var(--je-green) !important;
  border-radius: 10px !important;
  padding: 12px 14px !important;
  font-size: 15px;
  transition: all 0.2s ease-in-out;
}

/* Input focus */
body.woocommerce-account .woocommerce form .input-text:focus {
  outline: none !important;
  border-color: var(--je-green) !important;
  box-shadow: 0 0 0 4px rgba(3, 172, 19, 0.18) !important;
}

/* ---------- CHECKBOX & LINKS ---------- */
body.woocommerce-account .woocommerce form .woocommerce-form__label span,
body.woocommerce-account .woocommerce a {
  color: var(--je-green);
  font-weight: 500;
}

/* ---------- MOBILE OPTIMIZATION ---------- */
@media (max-width: 768px) {
  body.woocommerce-account .woocommerce form .button,
  body.woocommerce-account .woocommerce-Button.button {
    width: 100% !important;
    padding: 14px !important;
    text-align: center;
  }
}
/* ---------- LOST PASSWORD LINK (FORCE BRAND GREEN) ---------- */
body.woocommerce-account .woocommerce-form-login .lost_password a,
body.woocommerce-account .woocommerce-form-login p.lost_password a {
  color: var(--je-ink) !important;
  font-weight: 600;
  text-decoration: none;
}

/* Hover effect */
body.woocommerce-account .woocommerce-form-login .lost_password a:hover,
body.woocommerce-account .woocommerce-form-login p.lost_password a:hover {
  color: var(--je-green-deep) !important;
  text-decoration: underline;
}


/* =================================================
   FIX: My Account B2B dropdown going behind footer
   Kadence + WooCommerce + Select2
   ================================================= */

/* 1️⃣ Ensure account content stacks above footer */
body.woocommerce-account #primary,
body.woocommerce-account .site-main,
body.woocommerce-account .content-area {
  position: relative;
  z-index: 10;
}

/* 2️⃣ Force Select / Select2 dropdown above everything */
/* =========================================================
   Juteearth – FIX footer overlay + dropdown behind footer
   Kadence + WooCommerce My Account / Register fields
   ========================================================= */

/* 1) Make footer NEVER overlap content */
#colophon,
.site-footer,
.kadence-footer-wrap,
.kadence-footer {
  position: relative !important;
  bottom: auto !important;
  top: auto !important;
  transform: none !important;
  z-index: 1 !important;
}

/* 2) Ensure page content always has enough space before footer */
body.woocommerce-account #primary,
body.woocommerce-account .content-area,
body.woocommerce-account .site-main {
  position: relative !important;
  z-index: 5 !important;
  padding-bottom: 260px !important; /* increase if footer is tall */
}

/* 3) Force ALL dropdown menus & select2 above footer */
.select2-container,
.select2-container--open,
.select2-dropdown,
.select2-results,
.select2-results__options {
  z-index: 999999 !important;
}

/* 4) If your “Country/State” or B2B fields are NOT select2 */
body.woocommerce-account select,
body.woocommerce-account .select2-selection,
body.woocommerce-account .select2-container {
  position: relative !important;
  z-index: 999999 !important;
}
/* Dropdown styling */
body.woocommerce-account .select2-container .select2-selection--single {
  border: 1.8px solid var(--je-green) !important;
  border-radius: 10px !important;
  height: 46px !important;
  display: flex !important;
  align-items: center !important;
  padding: 0 12px !important;
}

body.woocommerce-account .select2-container--default .select2-selection--single .select2-selection__rendered {
  color: var(--je-ink);
  line-height: 46px !important;
}

body.woocommerce-account .select2-container--default .select2-results__option--highlighted {
  background: var(--je-green) !important;
  color: var(--je-white) !important;
}


/* =========================================================
   FIX: Register fields hidden (clipped) + Select overflow
   Kadence + WooCommerce My Account
   ========================================================= */

/* 1) IMPORTANT: stop clipping/hiding the register form */
body.woocommerce-account .woocommerce .u-column2,
body.woocommerce-account .woocommerce .woocommerce-form-register {
  overflow: visible !important;     /* <-- this brings back missing fields */
  height: auto !important;
  max-height: none !important;
}

/* 2) Make sure all rows are normal flow and full width */
body.woocommerce-account .woocommerce form .form-row {
  float: none !important;
  display: block !important;
  width: 100% !important;
  max-width: 100% !important;
  clear: both !important;
  margin-left: 0 !important;
  margin-right: 0 !important;
}

/* 3) Box sizing prevents “out of box” width */
body.woocommerce-account .woocommerce,
body.woocommerce-account .woocommerce * {
  box-sizing: border-box !important;
}

/* 4) Select2 / SelectWoo must stay inside container */
body.woocommerce-account .woocommerce form .select2-container,
body.woocommerce-account .woocommerce form .select2-container[style] {
  width: 100% !important;
  max-width: 100% !important;
  display: block !important;
}

/* 5) Visible select styling (inside the box) */
body.woocommerce-account .woocommerce form .select2-selection--single {
  width: 100% !important;
  max-width: 100% !important;
  border: 2px solid var(--je-green) !important;
  border-radius: 10px !important;
  height: 46px !important;
  padding: 0 38px 0 14px !important; /* space for arrow */
}

/* 6) Dropdown above footer */
.select2-dropdown,
.select2-container--open {
  z-index: 999999 !important;
}
/* Fix Select2 dropdown overlay on My Account */
body.woocommerce-account .select2-container { width:100% !important; }
body.woocommerce-account .select2-dropdown { z-index: 999999 !important; }



/* ===============================
   MOBILE OFFERS PAGE: ENABLE X-SCROLL + FIX BUTTON WRAP
   Works for B2BKing / Woo MyAccount tables
================================= */

/* 1) Stop theme wrappers from killing horizontal scroll */
html, body{
  overflow-x: visible !important;
}

/* 2) Make the My Account content area allow horizontal scroll when needed */
body.woocommerce-account .woocommerce-MyAccount-content{
  overflow-x: auto !important;
  -webkit-overflow-scrolling: touch;
  touch-action: pan-x pan-y;
}

/* 3) Any table inside My Account (offers) should be scrollable */
body.woocommerce-account .woocommerce-MyAccount-content table{
  min-width: 680px;              /* forces overflow on small screens */
}

/* 4) Create scroll behavior around wide tables without breaking layout */
body.woocommerce-account .woocommerce-MyAccount-content .woocommerce,
body.woocommerce-account .woocommerce-MyAccount-content .entry-content,
body.woocommerce-account .woocommerce-MyAccount-content .woocommerce-MyAccount-content{
  overflow-x: auto !important;
  -webkit-overflow-scrolling: touch;
  touch-action: pan-x pan-y;
}

/* 5) If plugin uses wrappers, make them scroll too (safe even if not present) */
.b2bking_offers_container,
.b2bking_offers_table,
.b2bking_myaccount_offers,
.woocommerce-account .offers,
.woocommerce-account .available-offers{
  overflow-x: auto !important;
  -webkit-overflow-scrolling: touch;
  touch-action: pan-x pan-y;
}

/* 6) Buttons row: prevent Add to Cart + PDF from going out of screen */
body.woocommerce-account .woocommerce-MyAccount-content a.button,
body.woocommerce-account .woocommerce-MyAccount-content button,
body.woocommerce-account .woocommerce-MyAccount-content .button{
  max-width: 100%;
  white-space: nowrap;
}

@media (max-width: 767px){
  /* If buttons are in same row container, allow wrap */
  .woocommerce-account .woocommerce-MyAccount-content .actions,
  .woocommerce-account .woocommerce-MyAccount-content .buttons,
  .woocommerce-account .woocommerce-MyAccount-content .offer-actions{
    display: flex !important;
    flex-wrap: wrap !important;
    gap: 10px;
  }

  .woocommerce-account .woocommerce-MyAccount-content .actions a,
  .woocommerce-account .woocommerce-MyAccount-content .buttons a,
  .woocommerce-account .woocommerce-MyAccount-content .offer-actions a{
    flex: 1 1 160px;
  }
}

/* ✅ FINAL FIX: Stop "Edit" wrapping on mobile (Checkout Blocks address card) */
@media (max-width: 600px){

  /* Make the card a positioning context */
  .wc-block-components-address-card{
    position: relative !important;
  }

  /* Put actions (Edit) at top-right, always */
  .wc-block-components-address-card__actions{
    position: absolute !important;
    top: 12px !important;
    right: 12px !important;
    z-index: 5 !important;
    width: auto !important;
    min-width: 44px !important;   /* enough space for tap + no wrap */
    display: inline-flex !important;
    align-items: center !important;
    justify-content: flex-end !important;
  }

  /* Force the word "Edit" to stay one line */
  .wc-block-components-address-card__actions a,
  .wc-block-components-address-card__edit{
    white-space: nowrap !important;
    display: inline-flex !important;
  }

  /* Give the header space so text doesn't collide with Edit */
  .wc-block-components-address-card__header{
    padding-right: 70px !important;
  }
}


/* ✅ FIX: dropdown menu should overlay My Account content (only /my-account/) */
body.woocommerce-account #masthead,
body.woocommerce-account .site-header,
body.woocommerce-account header{
  position: relative !important;
  z-index: 999999 !important;
  overflow: visible !important;
}

/* Make parent LI the anchor for absolute dropdown.
   DESKTOP ONLY. These two rules were written for the hover dropdown and
   used to apply at every width, so on a phone the My Account page's menu
   drew the "Bags" sub-items as an absolute box on top of "Custom Printing"
   and "Blogs" (Krishna's iPhone, 11 Sep 2026). The phone menu is a stacked
   list and must keep position:static. */
@media (min-width: 1025px){
  body.woocommerce-account .menu-item-has-children{
    position: relative !important;
  }

  /* Force dropdown to sit above everything */
  body.woocommerce-account .sub-menu,
  body.woocommerce-account .nav-menu .sub-menu,
  body.woocommerce-account .main-navigation ul ul{
    position: absolute !important;
    z-index: 1000000 !important;
  }
}

/* Ensure My Account content can't overlay the header */
body.woocommerce-account .site,
body.woocommerce-account .content-area,
body.woocommerce-account .entry-content,
body.woocommerce-account .woocommerce{
  position: relative !important;
  z-index: 1 !important;
}



/* =========================================================
   Header only: My Account menu badge/icon
   Class: .je-account-badge (added by PHP)
   ========================================================= */

/* BUTTON */
.elementor-location-header a.je-account-badge{
  font-size: 0 !important; /* hide menu text */
  line-height: 0 !important;

  display: inline-flex !important;
  align-items: center !important;
  justify-content: center !important;

  width: 42px !important;
  height: 42px !important;
  padding: 0 !important;
  border-radius: 999px !important;

  background:var(--je-white) !important;
  text-decoration: none !important;
}

/* hide any inner spans/icons from menu widget */
.elementor-location-header a.je-account-badge *{
  display: none !important;
}

/* DEFAULT (logged out): PROFILE ICON ALWAYS VISIBLE */
.elementor-location-header a.je-account-badge::before{
  content: "" !important;
  width: 22px !important;
  height: 22px !important;
  display: inline-block !important;
  opacity: 1 !important;
  visibility: visible !important;

  background-repeat: no-repeat !important;
  background-size: contain !important;
  background-position: center !important;

  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23111827'%3E%3Cpath d='M12 12a4 4 0 1 0-4-4 4 4 0 0 0 4 4Zm0 2c-4.42 0-8 2.24-8 5v1h16v-1c0-2.76-3.58-5-8-5Z'/%3E%3C/svg%3E") !important;
}

/* LOGGED IN: show INITIAL (always, not hover) */
.elementor-location-header a.je-account-badge[data-initial]:not([data-initial=""])::before{
  content: attr(data-initial) !important;

  width: 42px !important;
  height: 42px !important;

  display: inline-flex !important;
  align-items: center !important;
  justify-content: center !important;

  font-size: 16px !important;
  font-weight: 800 !important;
  line-height: 1 !important;

  color: var(--je-white) !important;
 background-color: var(--je-green) ;
	border-radius : 999%;
	

  background-image: none !important; /* remove svg */
}

/* Optional hover: only background change (badge/icon stays visible) */
.elementor-location-header a.je-account-badge:hover{
  background: var(--je-white) !important;
}
selector {
  width: 100vw !important;
  max-width: 100vw !important;
  margin-left: calc(50% - 50vw) !important;
  margin-right: calc(50% - 50vw) !important;
  padding-left: 0 !important;
  padding-right: 0 !important;
}
/* ============================================
   STICKY GALLERY — bounded by summary column
   ============================================ */
@media (min-width: 1025px) {

  body.single-product .je-product-top {
    display: flex !important;
    align-items: flex-start !important;
    gap: 40px !important;
  }

  body.single-product .je-product-top > .woo-variation-product-gallery {
    flex: 0 0 48% !important;
    max-width: 48% !important;
    position: -webkit-sticky !important;
    position: sticky !important;
    top: 120px !important;
    float: none !important;
    margin: 0 !important;
  }

  body.single-product .je-product-top > .summary {
    flex: 1 1 auto !important;
    width: auto !important;
    max-width: 100% !important;
    min-width: 0 !important; /* a flex item's default min-width is its content's minimum; below ~1500px that
                                minimum (813px of order desk) pushed the desk past the viewport. 12 Sep 2026. */
    float: none !important;
    margin: 0 !important;
  }

  body.single-product div.product > .woocommerce-tabs,
  body.single-product div.product > .related {
    clear: both !important;
    width: 100% !important;
  }
}
/* Hide ₹0 price next to shipping options (freight quoted separately) */
.wc-block-components-shipping-rates-control
  .wc-block-components-radio-control__secondary-label {
  display: none !important;
}

/* Style the description text under each option */
.wc-block-components-shipping-rates-control
  .wc-block-components-radio-control__description {
  font-size: 13px !important;
  line-height: 1.55 !important;
  color: var(--je-soil) !important;
  margin-top: 6px !important;
}

/* Order summary: hide the "Free" value on the Delivery row */
/* Hide duplicate shipping text in order summary */
.wc-block-components-totals-shipping {
  display: none !important;
}
/* =========================================================
   JUTEEARTH — Phase 1 product page blocks
   ========================================================= */
.je-block{margin:40px 0}
.je-block h3{
  font-size:clamp(20px,2.4vw,28px);
  line-height:1.15;letter-spacing:-.02em;
  color:var(--je-ink);margin:0 0 6px;
}
.je-block .je-lede{color:var(--je-muted);margin:0 0 22px;max-width:35.9em /* was 56ch */}
.je-lbl{
  font-family:ui-monospace,'SF Mono',Menlo,monospace;
  font-size:10px;letter-spacing:.14em;text-transform:uppercase;
  color:var(--je-muted);display:block;margin-bottom:5px;
}

/* spec sheet */
.je-spec{
  display:grid;
  grid-template-columns:repeat(4,1fr);
  gap:1px;
  background:var(--je-rule);
  border:1px solid var(--je-rule);
  border-radius:3px;
  overflow:hidden;
}
@media(max-width:1000px){.je-spec{grid-template-columns:repeat(2,1fr)}}
@media(max-width:560px){.je-spec{grid-template-columns:1fr}}
.je-spec > div{background:var(--je-paper);padding:16px 18px}
.je-spec strong{display:block;font-size:15.5px;color:var(--je-ink);line-height:1.3}
.je-spec em{
  display:block;font-style:normal;font-size:13px;
  color:var(--je-muted);margin-top:3px;
}

/* shipping routes */
.je-ship{
  display:grid;grid-template-columns:1.1fr 1fr;
  gap:clamp(24px,4vw,48px);align-items:start;
}
.je-ship p{color:var(--je-soil);margin:0 0 14px;max-width:34.6em /* was 54ch */}
.je-vow{
  border-left:3px solid var(--je-green);padding-left:16px;
  font-size:18px;font-weight:600;line-height:1.35;
  color:var(--je-ink);margin-top:20px !important;
}
.je-routes{
  display:grid;gap:1px;background:var(--je-rule);
  border:1px solid var(--je-rule);border-radius:3px;overflow:hidden;
}
.je-route{
  background:var(--je-paper);padding:16px 18px;
  display:grid;grid-template-columns:120px 1fr;gap:16px;align-items:start;
}
@media(max-width:520px){
  .je-route{grid-template-columns:1fr;gap:6px}
}.je-route .je-where{
  font-family:ui-monospace,'SF Mono',Menlo,monospace;
  font-size:10.5px;letter-spacing:.13em;text-transform:uppercase;
  color:var(--je-green-deep);padding-top:3px;white-space:nowrap;
}
.je-route b{display:block;font-size:15px;margin-bottom:2px;color:var(--je-ink)}
.je-route span{font-size:13.5px;color:var(--je-muted);line-height:1.45;display:block}

/* client row */
.je-clients{display:flex;gap:9px;flex-wrap:wrap;margin-top:26px}
.je-clients span{
  border:1px solid var(--je-rule);background:var(--je-paper);border-radius:2px;
  padding:8px 14px;color:var(--je-soil);
  font-family:ui-monospace,'SF Mono',Menlo,monospace;
  font-size:10.5px;letter-spacing:.12em;text-transform:uppercase;
}

@media(max-width:860px){
  .je-ship{grid-template-columns:1fr}
}
/* Hide Jetpack related posts on product pages only */
body.single-product .jp-relatedposts{
  display:none !important;
}
/* ==========================================================================
   JE PHASE 2 — Single product restyle
   Scope: body.single-product only. Layers on existing output.
   REVERT: delete everything from this header to the END OF JE PHASE 2 marker.
   Requires Young Serif / Figtree / DM Mono, which the PERFORMANCE TRIM
   snippet now enqueues - they are no longer imported from this file.
   Token declarations (--je-*) moved to :root under JE TOKENS near the top
   of this file (6 Aug 2026) - this used to redeclare them locally. */

/* ---------- Title ---------- */
body.single-product h1.product_title.entry-title{
  font-family:var(--je-display);
  font-weight:400;   /* Young Serif ships one weight; 600 synthesises a smeared fake bold */
  font-size:clamp(26px,3.2vw,38px);
  line-height:1.12;
  letter-spacing:-.02em;
  color:var(--je-ink);
  margin:0 0 14px;
}

/* ---------- Price: range, and the del/ins sale pair ---------- */
body.single-product .entry-summary > p.price,
body.single-product .woocommerce-variation-price .price{
  font-family:var(--je-body);
  font-size:30px;
  font-weight:600;
  line-height:1.25;
  color:var(--je-ink);
  margin:0 0 4px;
}

/* regular price: struck, small, muted */
body.single-product .entry-summary > p.price del,
body.single-product .woocommerce-variation-price del{
  font-size:17px;
  font-weight:400;
  color:var(--je-muted);
  opacity:1;
  text-decoration:line-through;
  text-decoration-thickness:1px;
  margin-right:4px;
}

/* sale price: full size, no underline, no highlight */
body.single-product .entry-summary > p.price ins,
body.single-product .woocommerce-variation-price ins{
  text-decoration:none !important;
  background:none !important;
  background-color:transparent !important;
  font-weight:600;
  color:var(--je-ink);
}

/* ---------- Price suffix ---------- */
body.single-product .woocommerce-price-suffix{
  display:inline-block;
  font-family:var(--je-mono);
  font-size:10.5px;
  font-weight:400;
  letter-spacing:.1em;
  text-transform:uppercase;
  color:var(--je-muted);
  margin-left:8px;
  vertical-align:middle;
}

/* ---------- Variation attribute labels ---------- */
body.single-product table.variations th.label label{
  display:block;
  font-family:var(--je-mono);
  font-size:10.5px;
  font-weight:500;
  letter-spacing:.14em;
  text-transform:uppercase;
  color:var(--je-muted);
  margin:0 0 8px;
}

body.single-product .woo-selected-variation-item-name{
  font-family:var(--je-body);
  font-size:14px;
  font-weight:500;
  letter-spacing:0;
  text-transform:none;
  color:var(--je-ink);
}

body.single-product table.variations td.value{ padding-bottom:6px; }

/* ---------- Variation swatch buttons ----------
   Scoped to ul.single-product-variable-items on purpose:
   ul.archive-variable-items in related products must stay untouched. */
body.single-product ul.single-product-variable-items li.variable-item.button-variable-item{
  border:1px solid var(--je-rule) !important;
  border-radius:2px !important;
  background:var(--je-white) !important;
  box-shadow:none !important;
  padding:0 !important;
  margin:0 8px 8px 0 !important;
  transition:border-color .15s ease, background-color .15s ease;
}

body.single-product ul.single-product-variable-items li.variable-item.button-variable-item
  .variable-item-span-button{
  display:block;
  font-family:var(--je-body);
  font-size:13.5px;
  font-weight:500;
  line-height:1.2;
  color:var(--je-soil);
  padding:11px 16px;
}

body.single-product ul.single-product-variable-items li.variable-item.button-variable-item:hover{
  border-color:var(--je-green) !important;
  background:var(--je-cream) !important;
}

body.single-product ul.single-product-variable-items li.variable-item.button-variable-item.selected,
body.single-product ul.single-product-variable-items li.variable-item.button-variable-item[aria-checked="true"]{
  border-color:var(--je-green-deep) !important;
  background:var(--je-green) !important;
  box-shadow:none !important;
}

body.single-product ul.single-product-variable-items li.variable-item.button-variable-item.selected
  .variable-item-span-button,
body.single-product ul.single-product-variable-items li.variable-item.button-variable-item[aria-checked="true"]
  .variable-item-span-button{
  color:var(--je-white);
}

body.single-product ul.single-product-variable-items li.variable-item.disabled,
body.single-product ul.single-product-variable-items li.variable-item.out-of-stock{
  opacity:.4;
}

body.single-product a.reset_variations{
  font-family:var(--je-mono);
  font-size:10.5px;
  letter-spacing:.12em;
  text-transform:uppercase;
  color:var(--je-muted);
  text-decoration:none;
  border-bottom:1px solid var(--je-rule);
}
body.single-product a.reset_variations:hover{
  color:var(--je-green-deep);
  border-bottom-color:var(--je-green);
}

/* ---------- Quantity ---------- */
body.single-product form.cart .quantity input.qty{
  font-family:var(--je-body);
  font-size:15px;
  font-weight:500;
  color:var(--je-ink);
  background:var(--je-white);
  border:1px solid var(--je-rule);
  border-radius:2px;
  box-shadow:none;
  height:48px;
  padding:0 10px;
  text-align:center;
}
body.single-product form.cart .quantity input.qty:focus{
  outline:none;
  border-color:var(--je-green);
  box-shadow:0 0 0 3px rgba(3,172,19,.15);
}

/* ---------- Add to cart ---------- */
body.single-product form.cart button.single_add_to_cart_button{
  font-family:var(--je-body);
  font-size:14px;
  font-weight:600;
  letter-spacing:.02em;
  text-transform:none;
  color:var(--je-white);
  background:var(--je-green);
  border:1px solid var(--je-green);
  border-radius:2px;
  box-shadow:none;
  height:48px;
  padding:0 30px;
  transition:background-color .15s ease, border-color .15s ease;
}
body.single-product form.cart button.single_add_to_cart_button:hover{
  background:var(--je-green-deep);
  border-color:var(--je-green-deep);
}
body.single-product form.cart button.single_add_to_cart_button.disabled,
body.single-product form.cart button.single_add_to_cart_button:disabled{
  background:var(--je-rule);
  border-color:var(--je-rule);
  color:var(--je-muted);
  opacity:1;
}

/* ---------- Tabs ---------- */
body.single-product .woocommerce-tabs ul.tabs.wc-tabs{
  border-bottom:1px solid var(--je-rule);
  padding:0;
  margin:0 0 26px;
}
body.single-product .woocommerce-tabs ul.tabs.wc-tabs::before{ display:none; }
body.single-product .woocommerce-tabs ul.tabs.wc-tabs li{
  background:none;
  border:0;
  border-radius:0;
  box-shadow:none;
  margin:0 26px 0 0;
  padding:0;
}
body.single-product .woocommerce-tabs ul.tabs.wc-tabs li::before,
body.single-product .woocommerce-tabs ul.tabs.wc-tabs li::after{ display:none; }
body.single-product .woocommerce-tabs ul.tabs.wc-tabs li a{
  display:block;
  font-family:var(--je-mono);
  font-size:11px;
  font-weight:500;
  letter-spacing:.14em;
  text-transform:uppercase;
  color:var(--je-muted);
  padding:0 0 12px;
  border-bottom:2px solid transparent;
}
body.single-product .woocommerce-tabs ul.tabs.wc-tabs li.active a,
body.single-product .woocommerce-tabs ul.tabs.wc-tabs li a:hover{
  color:var(--je-ink);
  border-bottom-color:var(--je-green);
}

/* ---------- Description panel ---------- */
body.single-product .woocommerce-Tabs-panel--description h2{
  font-family:var(--je-display);
  font-weight:400;   /* Young Serif ships one weight; 600 synthesises a smeared fake bold */
  font-size:clamp(22px,2.4vw,28px);
  line-height:1.15;
  letter-spacing:-.015em;
  color:var(--je-ink);
  margin:0 0 14px;
}
body.single-product .woocommerce-Tabs-panel--description h3{
  font-family:var(--je-display);
  font-weight:400;   /* Young Serif ships one weight; 600 synthesises a smeared fake bold */
  font-size:clamp(18px,1.9vw,22px);
  line-height:1.2;
  letter-spacing:-.01em;
  color:var(--je-ink);
  margin:34px 0 12px;
}
body.single-product .woocommerce-Tabs-panel--description p{
  font-family:var(--je-body);
  font-size:15.5px;
  line-height:1.7;
  color:var(--je-soil);
}

/* ---------- Phase 1 blocks: typography refresh only ---------- */
body.single-product .je-block h3{ font-family:var(--je-display); }
body.single-product .je-lbl,
body.single-product .je-route .je-where,
body.single-product .je-clients span{ font-family:var(--je-mono); }
body.single-product .je-spec strong{ font-family:var(--je-body); font-weight:600; }
body.single-product .je-spec em,
body.single-product .je-block .je-lede,
body.single-product .je-ship p,
body.single-product .je-route b,
body.single-product .je-route span{ font-family:var(--je-body); }
body.single-product .je-vow{ font-family:var(--je-display); font-weight:400; }

/* ---------- Mobile ---------- */
@media (max-width:767px){
  body.single-product .entry-summary > p.price,
  body.single-product .woocommerce-variation-price .price{ font-size:26px; }
  body.single-product form.cart button.single_add_to_cart_button{
    width:100%;
    padding:0 20px;
  }
  body.single-product .woocommerce-tabs ul.tabs.wc-tabs li{ margin-right:18px; }
}
/* ---------- Phase 3: live price ladder ---------- */
body.single-product .je-ladder{
  margin:18px 0;
  padding:16px 18px 14px;
  background:var(--je-cream);
  border:1px solid var(--je-rule);
  border-radius:3px;
  width:100%;
  clear:both;
}

body.single-product .je-ladder__head{
  display:flex;
  justify-content:space-between;
  align-items:baseline;
  gap:12px;
  flex-wrap:wrap;
  margin-bottom:12px;
}
body.single-product .je-ladder__lbl,
body.single-product .je-ladder__tier{
  font-family:var(--je-mono);
  font-size:10.5px;
  letter-spacing:.13em;
  text-transform:uppercase;
}
body.single-product .je-ladder__lbl{ color:var(--je-muted); }
body.single-product .je-ladder__tier{ color:var(--je-green-deep); }

body.single-product .je-ladder__readout{
  display:flex;
  align-items:baseline;
  gap:10px;
  flex-wrap:wrap;
  margin-bottom:16px;
}
body.single-product .je-ladder__was{
  font-family:var(--je-body);
  font-size:16px;
  color:var(--je-muted);
  text-decoration:line-through;
  text-decoration-thickness:1px;
}
body.single-product .je-ladder__unit{
  font-family:var(--je-display);
  font-size:clamp(28px,3.4vw,38px);
  font-weight:400;      /* Young Serif is single-weight; it is already heavy enough to carry this */
  line-height:1;
  letter-spacing:0;     /* negative tracking closes up a chunky serif and muddies the figures */
  color:var(--je-ink);
}
body.single-product .je-ladder__per{
  font-family:var(--je-mono);
  font-size:10px;
  letter-spacing:.1em;
  text-transform:uppercase;
  color:var(--je-muted);
}

body.single-product .je-ladder__bars{
  display:grid;
  grid-template-columns:repeat(7,1fr);
  align-items:end;
  gap:4px;
}
body.single-product .je-ladder__bar{
  appearance:none;
  border:0;
  padding:0;
  cursor:pointer;
  background:var(--je-sand);
  border-radius:2px 2px 0 0;
  display:flex;
  align-items:flex-start;
  justify-content:center;
  transition:background-color .15s ease;
}
body.single-product .je-ladder__bar:hover{ background:var(--je-rule); }
body.single-product .je-ladder__bar.is-current{ background:var(--je-green); }
body.single-product .je-ladder__pct{
  font-family:var(--je-mono);
  font-size:10px;
  font-weight:500;
  color:var(--je-soil);
  padding-top:5px;
}
body.single-product .je-ladder__bar.is-current .je-ladder__pct{ color:var(--je-white); }

body.single-product .je-ladder__axis{
  display:grid;
  grid-template-columns:repeat(7,1fr);
  gap:4px;
  margin-top:5px;
}
body.single-product .je-ladder__axis span{
  font-family:var(--je-mono);
  font-size:10px;
  color:var(--je-muted);
  text-align:center;
}
body.single-product .je-ladder__axis span.is-current{
  color:var(--je-ink);
  font-weight:500;
}

body.single-product .je-ladder__nudge{
  margin:14px 0 0;
  padding-top:12px;
  border-top:1px solid var(--je-rule);
  font-family:var(--je-body);
  font-size:13.5px;
  line-height:1.5;
  color:var(--je-soil);
}
body.single-product .je-ladder__nudge b{ color:var(--je-ink); font-weight:600; }

body.single-product .je-ladder__summary{
  margin-top:14px;
  padding-top:12px;
  border-top:1px solid var(--je-rule);
}
body.single-product .je-ladder__row{
  display:flex;
  justify-content:space-between;
  align-items:baseline;
  gap:12px;
  padding:5px 0;
  font-family:var(--je-body);
  font-size:13.5px;
  line-height:1.4;
  color:var(--je-soil);
}
body.single-product .je-ladder__row b{
  font-weight:600;
  color:var(--je-ink);
  white-space:nowrap;
}
body.single-product .je-ladder__row.is-save b{ color:var(--je-green-deep); }
body.single-product .je-ladder__row.is-total{
  margin-top:6px;
  padding-top:11px;
  border-top:1px solid var(--je-rule);
  font-family:var(--je-display);
  font-size:17px;
  font-weight:400;   /* single-weight face */
  color:var(--je-ink);
}
body.single-product .je-ladder__row.is-total b{ font-size:20px; }

@media (max-width:520px){
  body.single-product .je-ladder{ padding:14px; }
  body.single-product .je-ladder__pct{ font-size:9px; }
  body.single-product .je-ladder__axis span{ font-size:9px; }
  body.single-product .je-ladder__row{ font-size:12.5px; }
  body.single-product .je-ladder__row.is-total{ font-size:15px; }
  body.single-product .je-ladder__row.is-total b{ font-size:17px; }
}
/* ---------- Phase 3: order desk card ----------
   form.variations_form already contains the swatches, price, quantity and
   add-to-cart button, and Barn2 renders its option fields inside the same
   form - so a future handle-colour option lands inside the card for free. */
body.single-product form.variations_form{
  position:relative;
  border:1px solid var(--je-rule);
  border-radius:4px;
  background:var(--je-white);
  padding:52px 20px 20px;
  margin-top:18px;
}
body.single-product form.variations_form::before{
  content:"Order desk" !important;
  display:block !important;  position:absolute;
  top:0; left:0; right:0;
  background:var(--je-ink);
  color:var(--je-cream);
  font-family:var(--je-mono);
  font-size:10.5px;
  letter-spacing:.16em;
  text-transform:uppercase;
  padding:11px 20px;
  border-radius:3px 3px 0 0;
}

/* Selected chips move from solid green to ink. Green is reserved for
   accents and actions; a green fill on every selected chip competed with
   the CTA and contradicted the brand tokens. */
body.single-product ul.single-product-variable-items li.variable-item.button-variable-item.selected,
body.single-product ul.single-product-variable-items li.variable-item.button-variable-item[aria-checked="true"]{
  border-color:var(--je-ink) !important;
  background:var(--je-ink) !important;
}

body.single-product form.cart button.single_add_to_cart_button{
  width:100%;
}
/* ---------- Phase 3: quantity block ----------
   Sits above the ladder. The JS moves .quantity in here on every render. */
body.single-product .je-qty{
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:14px;
  flex-wrap:wrap;
  margin:0 0 4px;
}
body.single-product .je-qty__lbl{
  font-family:var(--je-mono);
  font-size:10.5px;
  letter-spacing:.13em;
  text-transform:uppercase;
  color:var(--je-muted);
}
body.single-product .je-qty .quantity{
  margin:0 !important;
  float:none !important;
  display:block !important;
}

/* Orders run to 20,000, so the field has to hold five digits plus the
   spinner arrows. The theme's default width clipped anything past two -
   "300" rendered as "30". Width is set on the input rather than the
   wrapper because WooCommerce sizes .quantity from its contents. */
body.single-product .je-qty input.qty,
body.single-product form.cart .quantity input.qty{
  width:130px !important;
  min-width:130px;
  max-width:100%;
  font-size:16px;
  text-align:center;
}

/* Same clipping on the cart page, where the field showed "30(" at 300.
   NOTE: this is the one rule in the Phase 3 work not scoped to
   body.single-product - the cart is a different page and the bug is there
   too. Deleting the Phase 2 block therefore also reverts this cart fix. */
body.woocommerce-cart td.product-quantity input.qty,
body.woocommerce-cart .quantity input.qty{
  width:100px !important;
  min-width:100px;
  max-width:100%;
  text-align:center;
}

@media (max-width:520px){
  body.single-product .je-qty input.qty,
  body.single-product form.cart .quantity input.qty{
    width:110px !important;
    min-width:110px;
  }
}
/* ---------- Phase 3: WhatsApp secondary CTA ----------
   Sits under Add to cart. Secondary by design: cream and outlined, never
   green, so it reads as the alternative rather than competing with the
   primary action. */
body.single-product .je-wa{
  display:block;
  width:100%;
  box-sizing:border-box;
  margin:14px 0 4px;
  padding:17px 20px;
  text-align:center;
  font-family:var(--je-body);
  font-size:14.5px;
  font-weight:600;
  letter-spacing:.01em;
  line-height:1.2;
  color:var(--je-ink);
  background:var(--je-cream);
  border:1px solid var(--je-rule);
  border-radius:2px;
  text-decoration:none;
  transition:background-color .15s ease, border-color .15s ease;
}
body.single-product .je-wa:hover,
body.single-product .je-wa:focus{
  background:var(--je-cream-deep);
  border-color:var(--je-green);
  color:var(--je-ink);
  text-decoration:none;
}

/* The primary label now carries a total, so it can run long on narrow
   screens. Let it wrap rather than overflow, and give the two buttons a
   clear gap instead of the theme's default flush stacking. */
body.single-product form.cart button.single_add_to_cart_button{
  white-space:normal;
  line-height:1.3;
  height:auto;
  min-height:52px;
  padding-top:14px;
  padding-bottom:14px;
  margin-bottom:0;
}

/* The variation wrapper holds the price row, the CTA and the WhatsApp
   button. Space it off the ladder above it. */
body.single-product .woocommerce-variation-add-to-cart{
  padding-top:2px;
}

@media (max-width:520px){
  body.single-product .je-wa{
    padding:15px 16px;
    font-size:14px;
  }
}
/* ---------- Phase 3: two corrections ----------
   Additive overrides, placed after the rules they adjust so they win on
   order rather than by editing those rules in place. */

/* 1. Hide the WooCommerce variation price row entirely.
      It showed ₹89.00 struck against ₹84.00 - the regular and the 1-unit
      price - while the ladder directly above showed the price actually
      being charged. At 100 bags that read ₹84.00 here and ₹79.80 there:
      the same bag, two prices, the wrong one larger and lower down the
      page. Hiding only the struck ₹89.00 would have left ₹84.00 still
      contradicting the ladder, so the whole row goes.

      Safe because the ladder's readout now renders whenever a variation is
      priced, including below the 50 minimum, so there is always a price on
      screen. The ₹52.00 – ₹84.00 range higher up is a different element
      and is untouched, so the page still shows a price before any variation
      is selected. */
body.single-product .woocommerce-variation-price{
  display:none;
}

/* 2. Centre the WhatsApp label.
      Block plus padding left it sitting high in its box. Flex centres it on
      both axes whatever height the box ends up. */
body.single-product .je-wa{
  display:flex;
  align-items:center;
  justify-content:center;
  min-height:54px;
}
/* ---------- Phase 3: type scale bump ----------
   One override block rather than edits spread across a dozen existing
   rules. Additive is safer to paste, and it keeps the whole size decision
   in one place to tune again or delete outright.

   Second pass, a step up from the first. The mono labels carry heavy
   letter-spacing so they read smaller than their nominal size and take
   the largest lift; body copy follows. */

/* Mono labels: PRICE LADDER, % OFF AT YOUR QUANTITY, QUANTITY */
body.single-product .je-ladder__lbl,
body.single-product .je-ladder__tier,
body.single-product .je-qty__lbl{
  font-size:12.5px;
}
body.single-product .je-ladder__per{
  font-size:12px;
}
body.single-product .je-ladder__pct,
body.single-product .je-ladder__axis span{
  font-size:12px;
}

/* The headline per-bag price. Lifted so it still clearly outranks a
   24px order total below it. */
body.single-product .je-ladder__unit{
  font-size:clamp(31px,3.7vw,41px);
}

/* Struck 1-unit price beside it */
body.single-product .je-ladder__was{
  font-size:19px;
}

/* Nudge line and the order summary rows */
body.single-product .je-ladder__nudge,
body.single-product .je-ladder__row{
  font-size:16.5px;
}

/* Order total row */
body.single-product .je-ladder__row.is-total{
  font-size:20px;
}
body.single-product .je-ladder__row.is-total b{
  font-size:24px;
}

/* Secondary CTA */
body.single-product .je-wa{
  font-size:16.5px;
}

/* Primary CTA, so it keeps pace with the button beneath it */
body.single-product form.cart button.single_add_to_cart_button{
  font-size:15.5px;
}

/* Attribute labels above the swatches, and the selected value beside them */
body.single-product table.variations th.label label{
  font-size:12.5px;
}
body.single-product .woo-selected-variation-item-name{
  font-size:16px;
}

/* Swatch chip text */
body.single-product ul.single-product-variable-items li.variable-item.button-variable-item
  .variable-item-span-button{
  font-size:15.5px;
}

/* Quantity field */
body.single-product .je-qty input.qty,
body.single-product form.cart .quantity input.qty{
  font-size:17px;
}

@media (max-width:520px){
  body.single-product .je-ladder__pct,
  body.single-product .je-ladder__axis span{
    font-size:10.5px;
  }
  body.single-product .je-ladder__nudge,
  body.single-product .je-ladder__row{
    font-size:15px;
  }
  body.single-product .je-ladder__row.is-total{
    font-size:17.5px;
  }
  body.single-product .je-ladder__row.is-total b{
    font-size:20px;
  }
  body.single-product .je-wa{
    font-size:15.5px;
  }
  body.single-product ul.single-product-variable-items li.variable-item.button-variable-item
    .variable-item-span-button{
    font-size:14.5px;
  }
}
/* ---------- Phase 3: option rows ----------
   Ledger rows with segmented controls. The variations table becomes three
   stacked blocks: label left, current selection right, one joined control
   beneath, hairline between. */

body.single-product table.variations,
body.single-product table.variations tbody,
body.single-product table.variations tr,
body.single-product table.variations td.value{
  display:block;
  width:100%;
  border:0;
  margin:0;
  padding:0;
  background:none;
}

/* The plugin writes the attribute name and a ": Selected Value" line in
   here. That leading colon read as a rendering fault, and the header row
   below states both facts better. */
body.single-product table.variations th.label{
  display:none;
}

body.single-product table.variations tr{
  padding:15px 0;
  border-bottom:1px solid var(--je-sand);
}
body.single-product table.variations tr:first-child{ padding-top:4px; }
body.single-product table.variations tr:last-child{
  border-bottom:0;
  padding-bottom:8px;
}

/* Label left, current selection right */
body.single-product .je-opt__head{
  display:flex;
  justify-content:space-between;
  align-items:baseline;
  gap:10px;
  flex-wrap:wrap;
  margin-bottom:11px;
}
body.single-product .je-opt__lbl,
body.single-product .je-opt__val{
  font-family:var(--je-mono);
  font-size:11px;
  text-transform:uppercase;
  line-height:1.35;
}
body.single-product .je-opt__lbl{
  letter-spacing:.13em;
  color:var(--je-muted);
}
body.single-product .je-opt__val{
  letter-spacing:.1em;
  color:var(--je-ink);
  text-align:right;
  white-space:nowrap;
}

/* Segmented control: the border moves to the list, the chips become
   segments divided by hairlines. Overrides the per-chip border, radius and
   margin set in the Phase 2 block, so it has to come after it. */
body.single-product ul.single-product-variable-items{
  display:inline-flex;
  flex-wrap:wrap;
  gap:0;
  margin:0 !important;
  padding:0 !important;
  list-style:none;
  border:1px solid var(--je-rule);
  border-radius:2px;
  overflow:hidden;
  max-width:100%;
}
body.single-product ul.single-product-variable-items li.variable-item.button-variable-item{
  border:0 !important;
  border-right:1px solid var(--je-rule) !important;
  border-radius:0 !important;
  margin:0 !important;
  background:var(--je-white) !important;
}
body.single-product ul.single-product-variable-items li.variable-item.button-variable-item:last-child{
  border-right:0 !important;
}
body.single-product ul.single-product-variable-items li.variable-item.button-variable-item:hover{
  background:var(--je-cream) !important;
}
body.single-product ul.single-product-variable-items li.variable-item.button-variable-item.selected,
body.single-product ul.single-product-variable-items li.variable-item.button-variable-item[aria-checked="true"]{
  background:var(--je-ink) !important;
}
body.single-product ul.single-product-variable-items li.variable-item.button-variable-item
  .variable-item-span-button{
  padding:11px 20px;
  text-align:center;
  font-size:14px;
}

/* Size labels are down to M / L / XL, so widen those segments back out to
   a comfortable tap target. */
body.single-product ul[data-attribute_name^="attribute_size"]
  li.variable-item.button-variable-item .variable-item-span-button{
  padding:11px 24px;
}

/* Artwork note, with the green rule that marks it as an aside rather than
   another control. */
body.single-product .je-print-note{
  margin:12px 0 0;
  border-left:3px solid var(--je-green);
  border-radius:0;
  padding:1px 0 1px 12px;
  font-family:var(--je-body);
  font-size:13.5px;
  line-height:1.5;
  color:var(--je-soil);
  max-width:35.9em /* was 56ch */;
}

/* CLEAR: a quiet exit, right-aligned under the last row. */
body.single-product a.reset_variations{
  display:block;
  width:100%;
  text-align:right;
  margin-top:12px;
  border-bottom:0;
}

@media (max-width:520px){
  body.single-product .je-opt__lbl,
  body.single-product .je-opt__val{ font-size:10px; }
  body.single-product .je-opt__val{ white-space:normal; }
  body.single-product ul.single-product-variable-items li.variable-item.button-variable-item
    .variable-item-span-button{
    padding:10px 14px;
    font-size:13.5px;
  }
  body.single-product ul[data-attribute_name^="attribute_size"]
    li.variable-item.button-variable-item .variable-item-span-button{
    padding:10px 18px;
  }
  body.single-product .je-print-note{ font-size:13px; }
}
/* ---------- Phase 3: chip sizing correction ----------
   The swatch plugin runs in "large size / squared" mode, which puts a fixed
   height and min-width on each li - 75px on closure, 50px elsewhere - and
   overrides the padding on the inner span down to 0 5px. The result was a
   line of 16.8px text floating in a 75px box.

   Size the chip from its own padding instead, so every segment is the same
   height and only as wide as its label needs. !important throughout because
   the plugin's own rules carry it. */

body.single-product ul.single-product-variable-items li.variable-item.button-variable-item{
  height:auto !important;
  min-height:0 !important;
  width:auto !important;
  min-width:0 !important;
  line-height:normal !important;
  display:flex !important;
  align-items:stretch !important;
}

body.single-product ul.single-product-variable-items li.variable-item.button-variable-item
  .variable-item-span-button{
  display:flex !important;
  flex-direction:column !important;
  align-items:center !important;
  justify-content:center !important;
  height:auto !important;
  min-height:0 !important;
  width:auto !important;
  padding:12px 20px !important;
  line-height:1.2 !important;
  white-space:nowrap;
}

/* Size chips carry the dimensions on a second line. */
body.single-product .je-chip__sub{
  display:block;
  margin-top:4px;
  font-family:var(--je-mono);
  font-size:10.5px;
  font-weight:400;
  letter-spacing:.04em;
  line-height:1.2;
  color:var(--je-muted);
}
body.single-product ul.single-product-variable-items li.variable-item.button-variable-item.selected
  .je-chip__sub,
body.single-product ul.single-product-variable-items li.variable-item.button-variable-item[aria-checked="true"]
  .je-chip__sub{
  color:rgba(250,244,232,.72);
}

/* Two lines need a wider floor than a bare M / L / XL did. */
body.single-product ul[data-attribute_name^="attribute_size"]
  li.variable-item.button-variable-item .variable-item-span-button{
  min-width:80px !important;
  padding:11px 16px !important;
}

/* Any size row of MORE THAN THREE options wraps unevenly under the
   segmented control's natural content width - four short chips fill row
   one, leaving row two with a couple of chips and a wide empty gap. First
   found on one Juco product (six sizes); a second Juco product turned out
   to use a different attribute name for the identical problem, which is
   why this is written to catch both rather than either one by name.

   :has(li:nth-child(4)) gates it to rows with FOUR OR MORE chips, so the
   canvas products' three-chip M / L / XL row - under either attribute name
   below - is completely untouched. Forcing three equal columns onto
   exactly three items would be a no-op today, but there is no reason to
   depend on that staying true.

   [data-attribute_name^="attribute_size"] (prefix match) covers BOTH
   spellings in one selector: attribute_sizes (canvas, and one Juco
   product) and attribute_size (the other Juco product). The two Juco
   products do not even agree with each other on which to use, so name-
   matching either one alone was never going to cover the other.

   flex-basis rather than width: the general rule above sets width:auto
   !important on this same selector, and flex-basis takes precedence over
   width on a flex item whenever it is not itself "auto", so this wins
   without needing a specificity fight. */
body.single-product ul[data-attribute_name^="attribute_size"]:has(li.variable-item:nth-child(4))
  li.variable-item.button-variable-item{
  flex:0 0 calc(33.333% - 1px) !important;
  box-sizing:border-box !important;
  justify-content:center !important;
}
body.single-product ul[data-attribute_name^="attribute_size"]:has(li.variable-item:nth-child(4))
  li.variable-item.button-variable-item .variable-item-span-button{
  width:100% !important;
  box-sizing:border-box !important;
}

/* Row divider. The segmented control was designed for one row, so it only
   ever carries a border-right between columns - forcing a size row into two
   rows above left the seam between them bare, with nothing marking where
   row one ends and row two begins. Same rule (colour, weight) as the column
   dividers, just turned 90 degrees.

   :nth-child(n+4) is "everything from the second row on" for a 3-column
   grid, true for ANY item count above 3 - a 5-chip row wraps 3+2, and item
   4 still correctly starts the new row. */
body.single-product ul[data-attribute_name^="attribute_size"]:has(li.variable-item:nth-child(4))
  li.variable-item.button-variable-item:nth-child(n+4){
  border-top:1px solid var(--je-rule) !important;
}

/* Column divider at the RIGHT EDGE of each row. The segmented control
   clears border-right on :last-child only, which is correct while the
   chips are one row - the last item is the right edge. Forced into three
   columns, item 3 is also a right edge but is NOT :last-child, so its
   divider painted straight against the container's own border and read
   as a doubled line beside S on every six-size product.

   :nth-child(3n) is "last in its row" for a 3-column grid, and stays
   correct for any item count: 6 chips clear items 3 and 6, 9 would clear
   3, 6 and 9. */
body.single-product ul[data-attribute_name^="attribute_size"]:has(li.variable-item:nth-child(4))
  li.variable-item.button-variable-item:nth-child(3n){
  border-right:0 !important;
}

@media (max-width:520px){
  body.single-product ul.single-product-variable-items li.variable-item.button-variable-item
    .variable-item-span-button{
    padding:11px 15px !important;
  }
  body.single-product ul[data-attribute_name^="attribute_size"]
    li.variable-item.button-variable-item .variable-item-span-button{
    min-width:70px !important;
    padding:10px 12px !important;
  }
  body.single-product .je-chip__sub{ font-size:9.5px; }
}
/* ---------- Phase 3: option area type, 1.3x ----------
   Every size in the closure / screen print / size block multiplied by 1.3
   and rounded to a half pixel. Chip padding and the size min-width grow
   with it, or the larger text would sit tight against the segment edges.

   !important on the chip font-size because the swatch plugin sets its own
   and beat the earlier declaration. */

body.single-product .je-opt__lbl,
body.single-product .je-opt__val{
  font-size:14.5px;
}

body.single-product ul.single-product-variable-items li.variable-item.button-variable-item
  .variable-item-span-button{
  font-size:18px !important;
  padding:13px 22px !important;
}

body.single-product .je-chip__sub{
  font-size:13.5px;
  margin-top:5px;
}

body.single-product ul[data-attribute_name^="attribute_size"]
  li.variable-item.button-variable-item .variable-item-span-button{
  min-width:98px !important;
  padding:12px 18px !important;
}

body.single-product .je-print-note{
  font-size:17.5px;
  max-width:30.8em /* was 48ch */;
}

body.single-product a.reset_variations{
  font-size:13.5px;
}

@media (max-width:520px){
  body.single-product .je-opt__lbl,
  body.single-product .je-opt__val{ font-size:13px; }

  body.single-product ul.single-product-variable-items li.variable-item.button-variable-item
    .variable-item-span-button{
    font-size:17.5px !important;
    padding:12px 16px !important;
  }
  body.single-product ul[data-attribute_name^="attribute_size"]
    li.variable-item.button-variable-item .variable-item-span-button{
    min-width:88px !important;
    padding:11px 13px !important;
  }
  body.single-product .je-chip__sub{ font-size:12.5px; }
  body.single-product .je-print-note{ font-size:17px; }
  body.single-product a.reset_variations{ font-size:12.5px; }
}
/* ---------- Phase 3: Barn2 option rows ----------
   REPLACES the earlier blind "Phase 3: Barn2 option rows" block. That one
   guessed [class*="wpo-option"], which matches p.wpo-option-name - the
   LABEL - not the row. Written now against the real markup:

     .wpo-options-container
       .wpo-layout-default
         .wpo-field.wpo-field-datepicker.wpo-field-required
           p.wpo-option-name > span.wpo-option-name__text
                             + span.wpo-field-required-symbol
           div.flatpickr-wrapper > input.wpo-datepicker-alt-input
           p.wpo-field-description
         .wpo-field.wpo-field-color_swatches
           ul.wpo-color-checkboxes > li.wpo-choice-item
             > label > input[radio] + span.wpo-swatch-inner
         .wpo-field.wpo-field-file_upload
           div.wpo-file-dropzone.dropzone > div.dz-message > button.dz-button

   The container sits inside .woocommerce-variation-add-to-cart, so these
   rows land between the price row and the quantity/CTA. */

body.single-product .wpo-options-container,
body.single-product .wpo-layout-default{
  display:block;
  width:100%;
  margin:0;
  padding:0;
}

/* Row treatment, matching the WooCommerce attribute rows above. */
body.single-product .wpo-field{
  display:block;
  width:100%;
  margin:0;
  padding:15px 0;
  border-bottom:1px solid var(--je-sand);
}
body.single-product .wpo-field:last-child{
  border-bottom:0;
  padding-bottom:8px;
}

/* Label left, status right. */
body.single-product .wpo-field p.wpo-option-name{
  display:flex !important;
  justify-content:space-between !important;
  align-items:baseline;
  gap:10px;
  margin:0 0 11px;
  width:100% !important;
  text-align:left !important;
  font-family:var(--je-mono);
  font-size:14.5px;
  font-weight:400;
  letter-spacing:.13em;
  text-transform:uppercase;
  line-height:1.35;
  color:var(--je-muted);
}
/* The label is pinned left by its own margin, not only by the row's
   justify-content, and that redundancy is deliberate.

   These headings come in two shapes: the required fields render
   [label][Required] - two children, which space-between puts at the two
   ends correctly - while HANDLE COLOR renders [label] alone. A single
   flex child is laid out from flex-start, so it should also sit left, and
   measured on the live page it does: offset 0 from the container edge at
   both 1280 and 1920, with no ancestor overriding text-align.

   It was still reported as sitting centre/right, which cannot be
   reproduced here - so rather than guess at which rule wins elsewhere,
   margin-right:auto makes the outcome independent of the container's
   justify-content entirely. Even if something later flips the row to
   center or flex-end, the label stays hard left and only the Required
   tag moves. It costs nothing when the row is already correct. */
body.single-product .wpo-field p.wpo-option-name .wpo-option-name__text{
  margin-right:auto !important;
  text-align:left !important;
}
/* Same treatment for the plugin's separate <label>, which the file upload
   field renders instead of a heading span. */
body.single-product .wpo-field > label,
body.single-product .wpo-field label .wpo-choice-label{
  text-align:left !important;
}

/* The bare asterisk becomes a right-aligned word, matching OPEN TOP /
   BOTH SIDES / XL in the attribute rows. */
body.single-product .wpo-field .wpo-field-required-symbol{
  font-size:0;
  letter-spacing:0;
  color:transparent;
  white-space:nowrap;
}
body.single-product .wpo-field .wpo-field-required-symbol::after{
  content:"Required";
  font-family:var(--je-mono);
  font-size:14.5px;
  letter-spacing:.1em;
  text-transform:uppercase;
  color:var(--je-green-deep);
}

body.single-product .wpo-field p.wpo-field-description{
  margin:10px 0 0;
  font-family:var(--je-body);
  font-size:16px;
  line-height:1.5;
  letter-spacing:0;
  text-transform:none;
  color:var(--je-muted);
  max-width:33.3em /* was 52ch */;
}

/* ---- Colour swatches ---- */
body.single-product ul.wpo-color-checkboxes{
  display:flex;
  flex-wrap:wrap;
  gap:10px;
  margin:0;
  padding:0;
  list-style:none;
}
body.single-product li.wpo-choice-item.wpo-color-checkbox{
  margin:0;
  padding:0;
  list-style:none;
}
body.single-product li.wpo-color-checkbox label{
  display:block;
  margin:0;
  cursor:pointer;
  line-height:0;
}
body.single-product li.wpo-color-checkbox span.wpo-swatch-inner{
  display:block;
  width:42px;
  height:42px;
  border-radius:50%;
  border:1px solid var(--je-rule);
  box-shadow:none;
  transition:box-shadow .15s ease, border-color .15s ease;
}
body.single-product li.wpo-color-checkbox label:hover span.wpo-swatch-inner{
  border-color:var(--je-soil);
}
/* Ring stands off the swatch so it reads on Off White as well as Black. */
body.single-product li.wpo-color-checkbox input:checked + span.wpo-swatch-inner{
  border-color:var(--je-green);
  box-shadow:0 0 0 2px var(--je-white), 0 0 0 4px var(--je-green);
}
body.single-product li.wpo-color-checkbox input:focus-visible + span.wpo-swatch-inner{
  outline:2px solid var(--je-green);
  outline-offset:3px;
}

/* ---- Date field ---- */
body.single-product .wpo-field-datepicker .flatpickr-wrapper{
  display:block;
  width:100%;
}
body.single-product input.wpo-datepicker-alt-input{
  display:block;
  width:100%;
  box-sizing:border-box;
  height:auto;
  padding:15px 16px;
  font-family:var(--je-mono);
  font-size:17px;
  letter-spacing:.04em;
  color:var(--je-ink);
  background:var(--je-white);
  border:1px solid var(--je-rule);
  border-radius:2px;
  box-shadow:none;
}
body.single-product input.wpo-datepicker-alt-input:focus{
  outline:none;
  border-color:var(--je-green);
  box-shadow:0 0 0 3px rgba(3,172,19,.15);
}

/* ---- File upload ---- */
body.single-product .wpo-file-dropzone{
  min-height:0;
  padding:26px 20px;
  background:var(--je-cream);
  border:1px dashed var(--je-rule);
  border-radius:3px;
  transition:border-color .15s ease, background-color .15s ease;
}
body.single-product .wpo-file-dropzone:hover,
body.single-product .wpo-file-dropzone.dz-drag-hover{
  border-color:var(--je-green);
  background:var(--je-cream-deep);
}
body.single-product .wpo-file-dropzone .dz-button{
  font-family:var(--je-body);
  font-size:16px;
  line-height:1.5;
  color:var(--je-soil);
  background:none;
  border:0;
  padding:0;
  cursor:pointer;
}
body.single-product .wpo-file-dropzone .dz-button-icon svg{
  width:34px;
  height:34px;
}

@media (max-width:520px){
  body.single-product .wpo-field p.wpo-option-name{ font-size:13px; }
  body.single-product .wpo-field .wpo-field-required-symbol::after{ font-size:13px; }
  body.single-product .wpo-field p.wpo-field-description{ font-size:15px; }
  body.single-product input.wpo-datepicker-alt-input{ font-size:16px; padding:13px 14px; }
  body.single-product li.wpo-color-checkbox span.wpo-swatch-inner{ width:38px; height:38px; }
  body.single-product .wpo-file-dropzone{ padding:22px 16px; }
}
/* ---------- Phase 3: hide Barn2's total ----------
   Barn2 prints its own "Total:" above the CTA, and it is wrong twice over.
   At 300 bags of Both Sides / L it read ₹15,600.00, which is 300 x ₹52 -
   the M / One Side price. It multiplies the product's base (minimum
   variation) price by quantity: it does not follow the selected variation,
   and it has no knowledge of the quantity tiers.

   The correct figure for that basket is ₹20,865.60, which the ladder, the
   CTA and the cart all agree on. Two totals differing by ₹5,265 on one
   screen is worse than one, and this is the one that cannot be made right -
   Barn2 has no way to see the tier discount applied in
   woocommerce_before_calculate_totals.

   Hidden rather than restyled. If Barn2's settings offer a "show totals"
   toggle, turning it off there is cleaner than hiding it here. */
body.single-product .wpo-totals-container{
  display:none !important;
}
/* ---------- Phase 3: over the quantity ceiling ----------
   Shown instead of the readout, nudge and summary when quantity exceeds
   12,000. Cream panel with a green rule so it reads as a redirection
   rather than an error - this is a good problem to have. */
body.single-product .je-ladder__over{
  margin:14px 0 0;
  padding:16px 18px;
  background:var(--je-white);
  border:1px solid var(--je-rule);
  border-left:3px solid var(--je-green);
  border-radius:0 3px 3px 0;
}
body.single-product .je-ladder__over-lead{
  margin:0 0 13px;
  font-family:var(--je-body);
  font-size:16.5px;
  line-height:1.5;
  color:var(--je-soil);
  max-width:33.3em /* was 52ch */;
}
body.single-product a.je-ladder__over-cta{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  padding:13px 22px;
  font-family:var(--je-body);
  font-size:15.5px;
  font-weight:600;
  line-height:1.2;
  color:var(--je-white);
  background:var(--je-green);
  border:1px solid var(--je-green);
  border-radius:2px;
  text-decoration:none;
  transition:background-color .15s ease, border-color .15s ease;
}
body.single-product a.je-ladder__over-cta:hover,
body.single-product a.je-ladder__over-cta:focus{
  background:var(--je-green-deep);
  border-color:var(--je-green-deep);
  color:var(--je-white);
  text-decoration:none;
}

@media (max-width:520px){
  body.single-product .je-ladder__over{ padding:14px; }
  body.single-product .je-ladder__over-lead{ font-size:15px; }
  body.single-product a.je-ladder__over-cta{
    display:flex;
    width:100%;
    box-sizing:border-box;
    font-size:15px;
  }
}
/* ---------- Phase 3: summary row overflow ----------
   The value side carried white-space:nowrap so currency never splits
   across lines. That also stopped "Are Extra Quoted Actuals before
   dispatch" wrapping, and it ran out of the panel on mobile.

   white-space:normal breaks at spaces only, so the shipping text wraps
   while ₹19,872.00 stays whole - there is no space inside a formatted
   amount to break at. No nowrap needed. */

body.single-product .je-ladder__row{
  align-items:baseline;
  gap:14px;
}

/* Both sides must be allowed to shrink. Flex children default to
   min-width:auto, which is what lets long content push past the container
   in the first place. */
body.single-product .je-ladder__row > span{
  flex:1 1 auto;
  min-width:0;
}
body.single-product .je-ladder__row b{
  flex:0 1 auto;
  min-width:0;
  white-space:normal;
  text-align:right;
}

/* Belt and braces: nothing in the ladder may push the card sideways. */
body.single-product .je-ladder{
  max-width:100%;
  overflow-wrap:break-word;
}

@media (max-width:520px){
  body.single-product .je-ladder__row{
    gap:10px;
  }
}
/* ================= END OF JE PHASE 2 ================= *//* =====================================================================
   JE HEADER REGION  -  replaces everything from the JE HEADER opener to
   the end of the stylesheet. Blocks: JE HEADER, D, F, E, G, H, I, J, K.

   ANCHOR: the mega menu keys on  li.je-mega , a CSS class set by hand on
   the Bags item (Appearance > Menus > Screen Options > CSS Classes).
   It previously keyed on li.menu-item-722, a WordPress-generated ID that
   changed the moment the menu was deleted and rebuilt, silently reverting
   the panel to a narrow flyout. A hand-set class survives rebuilds,
   reordering and renaming.

   If the mega panel ever goes narrow again, check that the Bags menu item
   still carries je-mega before touching anything here.
   ===================================================================== */
/* ================= JE HEADER (replaces A + B) ================= */
/* Selectors carry an extra class so they outrank Elementor's
   widget CSS (.elementor-754 .elementor-element-b422a0e ... = 0,4,0).
   !important is used only where Elementor writes the same property
   from its widget Style tab. */

header.elementor-location-header{
  position: sticky;
  top: 0;
  z-index: 100;
  background: var(--je-paper);
  border-bottom: 1px solid var(--je-rule);
}
body.admin-bar header.elementor-location-header{ top: 32px; }

@media (min-width: 1025px){

  /* --- top level --- */
  header.elementor-location-header .elementor-nav-menu--main > ul.elementor-nav-menu{ gap: 26px; }

  header.elementor-location-header .elementor-nav-menu--main ul.elementor-nav-menu > li > a.elementor-item{
    font-family: var(--je-sans);
    font-size: 14px;
    font-weight: 600;
    color: var(--je-ink) !important;
    fill: var(--je-ink) !important;
    padding: 0;
    border-bottom: 2px solid transparent;
    transition: border-color .16s ease;
  }
  header.elementor-location-header .elementor-nav-menu--main ul.elementor-nav-menu > li > a.elementor-item:hover,
  header.elementor-location-header .elementor-nav-menu--main ul.elementor-nav-menu > li > a.elementor-item.elementor-item-active{
    color: var(--je-ink) !important;
    background: transparent !important;
    border-bottom-color: var(--je-green);
  }

  /* --- the panel ---
     position:static carries !important because of a page-specific
     collision: the My Account block elsewhere in this file sets
     `body.woocommerce-account .menu-item-has-children{ position: relative
     !important; }`, written for an unrelated bug (a B2B/account dropdown
     rendering behind the footer). li.je-mega also has children, so on
     /my-account/ that rule forces it back to position:relative, which
     changes the mega panel's containing block from the full-width header
     down to the narrow "Bags" nav item itself - the panel's own
     background then paints only that ~170px box, while its 3-column grid
     content still lays out at full width and spills outside it with
     nothing behind it, reading as the page content and the menu bleeding
     into each other. Confirmed live via the DOM on /my-account/, not
     guessed: li.je-mega measured position:relative there, sub-menu width
     172.8px against the header's 1424px. !important is required because
     the My Account rule already carries one. */
  header.elementor-location-header .elementor-nav-menu--main li.je-mega{ position: static !important; }

  header.elementor-location-header .elementor-nav-menu--main li.je-mega > ul.sub-menu{
    left: 0; right: 0;
    width: auto !important;
    min-width: 0 !important;
    background: var(--je-paper) !important;
    border: 0 !important;
    border-top: 1px solid var(--je-rule) !important;
    border-bottom: 1px solid var(--je-rule) !important;
    box-shadow: 0 18px 40px rgba(36,26,18,.10) !important;
    padding: 34px max(20px, calc((100vw - 1320px) / 2)) 40px !important;
    display: none;
    grid-template-columns: repeat(3, 1fr);
    gap: 44px;
    align-items: start;
  }
  header.elementor-location-header .elementor-nav-menu--main li.je-mega:hover > ul.sub-menu,
  header.elementor-location-header .elementor-nav-menu--main li.je-mega:focus-within > ul.sub-menu{
    display: grid;
  }

  /* --- every nested list: flatten, strip the box --- */
  header.elementor-location-header .elementor-nav-menu--main li.je-mega ul.sub-menu ul.sub-menu{
    position: static !important;
    display: block !important;
    width: auto !important;
    min-width: 0 !important;
    background: transparent !important;
    border: 0 !important;
    box-shadow: none !important;
    padding: 0 !important;
    margin: 0 !important;
    transform: none !important;
    opacity: 1 !important;
    visibility: visible !important;
  }

  /* --- column headings: Jute / Cotton Canvas / Juco --- */
  header.elementor-location-header .elementor-nav-menu--main li.je-mega > ul.sub-menu > li{
    width: auto !important;
  }
  header.elementor-location-header .elementor-nav-menu--main li.je-mega > ul.sub-menu > li > a{
    font-family: var(--je-mono);
    font-size: 10px !important;
    letter-spacing: .16em;
    text-transform: uppercase;
    color: var(--je-ochre) !important;
    background: transparent !important;
    padding: 0 0 10px !important;
    border-bottom: 1px solid var(--je-rule);
    margin-bottom: 14px;
  }

  /* --- links inside the panel --- */
  header.elementor-location-header .elementor-nav-menu--main li.je-mega ul.sub-menu ul.sub-menu a{
    font-family: var(--je-sans);
    font-size: 13.5px !important;
    color: var(--je-soil) !important;
    background: transparent !important;
    border: 0 !important;
    padding: 5px 0 !important;
    white-space: normal;
  }
  header.elementor-location-header .elementor-nav-menu--main li.je-mega ul.sub-menu ul.sub-menu a:hover{
    color: var(--je-ink) !important;
    background: transparent !important;
    text-decoration: underline;
    text-underline-offset: 3px;
  }

  /* level 3 reads as a group lead, level 4 sits under it */
  header.elementor-location-header .elementor-nav-menu--main li.je-mega > ul.sub-menu > li > ul > li > a{
    font-weight: 700 !important;
    color: var(--je-ink) !important;
    margin-top: 12px;
  }
  header.elementor-location-header .elementor-nav-menu--main li.je-mega > ul.sub-menu > li > ul > li > ul > li > a{
    font-weight: 400 !important;
    padding-left: 12px !important;
  }
}
/* ================= END JE HEADER ================= */
/* ================= JE HEADER — D: mobile ================= */
/* Elementor renders the whole 4-level tree expanded (36 items, no
   accordion), so hierarchy has to come from type and indentation.
   Depth is targeted with child combinators, not classes, because every
   nested list shares .sub-menu.elementor-nav-menu--dropdown. */

@media (max-width: 1024px){

  /* --- burger --- */
  header.elementor-location-header .elementor-menu-toggle{
    width: 40px; height: 40px;
    border: 1px solid var(--je-rule) !important;
    border-radius: 2px;
    background: transparent !important;
    color: var(--je-ink) !important;
    display: grid; place-items: center;
    transition: border-color .16s ease;
  }
  header.elementor-location-header .elementor-menu-toggle:hover{ border-color: var(--je-muted) !important; }
  header.elementor-location-header .elementor-menu-toggle.elementor-active{
    background: var(--je-ink) !important;
    border-color: var(--je-ink) !important;
    color: var(--je-cream) !important;
  }
  header.elementor-location-header .elementor-menu-toggle svg{ width: 20px; height: 20px; fill: currentColor; }

  /* --- panel ---
     max-height and overflow-y carry !important because Elementor's own
     open-state rule outranks this one on specificity alone:
     `.elementor-nav-menu--toggle .elementor-menu-toggle.elementor-active +
     .elementor-nav-menu__container{ max-height: var(--menu-height); }` is
     (0,4,0) - four classes - against this selector's (0,2,2). --menu-height
     is set by Elementor's JS to 1000vmax (thousands of px), meant as
     "uncapped", and without !important here it wins outright, so the panel
     never caps at the viewport at all - it grows to fit however many items
     are expanded. Sitting inside `header{ position:sticky; top:0 }`, a box
     that tall has no scroll of its own: the user sees one screenful and
     everything past it is permanently off-screen with nothing to scroll to
     reach it. Confirmed live via the CSSOM (matched rules + computed
     specificity), not guessed - this exact fight is why the Bags submenu
     stopped moving once expanded past one screen. */
  header.elementor-location-header nav.elementor-nav-menu--dropdown{
    background: var(--je-paper) !important;
    border-top: 1px solid var(--je-rule);
    box-shadow: 0 18px 40px rgba(36,26,18,.12);
    /* Elementor's own JS sets left/width as INLINE styles on this element
       when the menu opens - measured live at left:-24px, width:375px on a
       375px-wide phone, against a header that itself spans the full
       0-375px. That 24px leftward shift is presumably meant to counter
       some default side padding Elementor expects on its own markup, but
       JE HEADER P already moved that padding onto `.e-con` instead (see
       below), so the offset no longer corresponds to anything real here -
       it just leaves the right 24px of the header, and everything behind
       it, exposed down the whole height of the open panel. Only
       !important beats an inline style; left/right/width pin the panel to
       the header's own edges regardless of whatever pixel figures
       Elementor's script computes. */
    left: 0 !important;
    right: 0 !important;
    width: auto !important;
    /* vh is the LAYOUT viewport - fixed at page-load size and blind to the
       browser's own address bar / toolbar showing or hiding afterwards.
       Across phones that differ in how much chrome they reserve (and on
       the SAME phone as the bar auto-hides while scrolling), 100vh over-
       or under-shoots the panel's real available height, so the cap
       looked right on some devices/moments and wrong on others - short
       on tall content, or leaving a dead gap on short content.

       dvh is the DYNAMIC viewport height - it tracks the visible area as
       chrome shows/hides, so the cap - and the scroll region overflow-y
       creates inside it - stay correct continuously rather than only at
       the instant the page loaded. Declared as a second, later
       declaration rather than replacing the vh one: a browser that
       doesn't understand dvh discards that whole line as invalid and
       keeps the vh rule above; one that does understand it uses this
       line instead, since it comes later at equal specificity. No
       @supports query needed - the cascade already resolves it. */
    max-height: calc(100vh - 62px) !important;
    max-height: calc(100dvh - 62px) !important;
    overflow-y: auto !important;
    overscroll-behavior: contain;
    /* Bottom padding clears the home-indicator / gesture-bar strip on
       notched phones, so the last menu item is not sitting under it.
       env() resolves to 0 on devices without a safe-area inset (older
       phones, no notch), so this is additive everywhere, never a loss. */
    padding: 6px 20px calc(28px + env(safe-area-inset-bottom));
  }

  header.elementor-location-header nav.elementor-nav-menu--dropdown ul.sub-menu{
    background: transparent !important;
    border: 0 !important;
    padding: 0 !important;
    margin: 0 !important;
  }

  /* all links: comfortable tap targets, no Elementor chrome */
  header.elementor-location-header nav.elementor-nav-menu--dropdown a.elementor-item{
    background: transparent !important;
    border: 0 !important;
    padding: 11px 0 !important;
    line-height: 1.35;
    white-space: normal;
  }

  /* --- level 1 --- */
  header.elementor-location-header nav.elementor-nav-menu--dropdown
    > ul.elementor-nav-menu > li{
    border-bottom: 1px solid var(--je-rule);
  }
  header.elementor-location-header nav.elementor-nav-menu--dropdown
    > ul.elementor-nav-menu > li > a.elementor-item{
    /* Figtree, not the serif: this is a mobile nav row, which is UI rather
       than display type, and Young Serif is single-weight so the 700 below
       would synthesise a fake bold on it. */
    font-family: var(--je-sans);
    font-size: 17px !important;
    font-weight: 700 !important;
    letter-spacing: -.015em;
    color: var(--je-ink) !important;
    padding: 15px 0 !important;
  }

  /* --- level 2: Jute / Cotton Canvas / Juco as section labels --- */
  header.elementor-location-header nav.elementor-nav-menu--dropdown
    > ul > li > ul.sub-menu > li > a.elementor-item{
    font-family: var(--je-mono);
    font-size: 10px !important;
    letter-spacing: .16em;
    text-transform: uppercase;
    color: var(--je-ochre) !important;
    padding: 16px 0 6px !important;
  }

  /* --- level 3: group leads --- */
  header.elementor-location-header nav.elementor-nav-menu--dropdown
    > ul > li > ul > li > ul.sub-menu > li > a.elementor-item{
    font-size: 15px !important;
    font-weight: 700 !important;
    color: var(--je-ink) !important;
    padding: 9px 0 !important;
  }

  /* --- level 4: indented children --- */
  header.elementor-location-header nav.elementor-nav-menu--dropdown
    > ul > li > ul > li > ul > li > ul.sub-menu > li > a.elementor-item{
    font-size: 14px !important;
    font-weight: 400 !important;
    color: var(--je-soil) !important;
    padding: 8px 0 8px 14px !important;
    border-left: 1px solid var(--je-rule);
    margin-left: 2px;
  }

  header.elementor-location-header nav.elementor-nav-menu--dropdown
    a.elementor-item.elementor-item-active{ color: var(--je-green-deep) !important; }
}
/* ================= END JE HEADER D ================= */
/* ================= JE HEADER — F: submenu indicator ================= */

@media (min-width: 1025px){
  /* Inside the mega panel every level is already expanded, so these seven
     carets point at visible content and do nothing. Not a style choice. */
  header.elementor-location-header .elementor-nav-menu--main
    li.je-mega ul.sub-menu .sub-arrow{
    display: none !important;
  }

  /* Top-level caret on Bags and Blogs, kept as an affordance. */
  header.elementor-location-header .elementor-nav-menu--main
    ul.elementor-nav-menu > li > a.elementor-item .sub-arrow{
    margin-left: 5px !important;
    opacity: .5;
  }
  header.elementor-location-header .elementor-nav-menu--main
    ul.elementor-nav-menu > li > a.elementor-item .sub-arrow svg{
    width: 9px; height: 9px; fill: currentColor;
  }
  header.elementor-location-header .elementor-nav-menu--main
    ul.elementor-nav-menu > li:hover > a.elementor-item .sub-arrow{ opacity: 1; }

  /* To remove the top-level caret entirely, uncomment:
  header.elementor-location-header .elementor-nav-menu--main
    ul.elementor-nav-menu > li > a.elementor-item .sub-arrow{
    display: none !important;
  }
  */
}

@media (max-width: 1024px){
  /* The arrow is the only way to open a submenu here, so it needs a real
     tap target. Negative margins expand the hit area without moving the row. */
  header.elementor-location-header nav.elementor-nav-menu--dropdown .sub-arrow{
    padding: 12px !important;
    margin: -12px -6px -12px 0 !important;
    color: var(--je-muted) !important;
    display: flex !important;
    align-items: center;
  }
  header.elementor-location-header nav.elementor-nav-menu--dropdown .sub-arrow svg{
    width: 12px; height: 12px; fill: currentColor;
  }
}
/* ================= END JE HEADER F ================= */
/* ================= JE HEADER — E: mobile corrections ================= */
@media (max-width: 1024px){

  /* --- 1. account badge overlap ---
     D's level-1 rule (0,4,5) outranked the badge rule (0,2,1) despite both
     using !important, re-showing the menu text at 17px while ::before still
     drew the icon. In a vertical list this item should just be a link. */
  header.elementor-location-header nav.elementor-nav-menu--dropdown
    > ul.elementor-nav-menu > li > a.elementor-item.je-account-badge{
    display: block !important;
    width: auto !important;
    height: auto !important;
    border-radius: 0 !important;
    background: transparent !important;
    font-size: 17px !important;
    line-height: 1.35 !important;
    padding: 15px 0 !important;
  }
  header.elementor-location-header nav.elementor-nav-menu--dropdown
    a.je-account-badge::before{ content: none !important; display: none !important; }
  header.elementor-location-header nav.elementor-nav-menu--dropdown
    a.je-account-badge *{ display: inline !important; }

  /* --- 2. empty band under the closed header ---
     Padding sat on the nav, and padding still renders while Elementor holds
     max-height:0 on the closed drawer. Move it onto the list. */
  header.elementor-location-header nav.elementor-nav-menu--dropdown{
    padding: 0 !important;
  }
  header.elementor-location-header nav.elementor-nav-menu--dropdown
    > ul.elementor-nav-menu{ padding: 6px 20px 28px !important; }

  /* --- 3. dividers: Elementor draws its own in green on the anchor --- */
  header.elementor-location-header nav.elementor-nav-menu--dropdown
    > ul.elementor-nav-menu > li{ border-bottom: 0 !important; }
  header.elementor-location-header nav.elementor-nav-menu--dropdown
    > ul.elementor-nav-menu > li > a.elementor-item{
    border-bottom: 1px solid var(--je-rule) !important;
  }

  /* --- 4. submenu hierarchy ---
     Submenu links are .elementor-sub-item, not .elementor-item, which is why
     every level-2/3/4 rule in D was a dead selector. */
  header.elementor-location-header nav.elementor-nav-menu--dropdown
    a.elementor-sub-item{
    background: transparent !important;
    border: 0 !important;
    white-space: normal !important;
    line-height: 1.35 !important;
  }

  /* level 2 — Jute / Cotton Canvas / Juco, as section labels */
  header.elementor-location-header nav.elementor-nav-menu--dropdown
    > ul > li > ul.sub-menu > li > a.elementor-sub-item{
    font-family: var(--je-mono) !important;
    font-size: 10px !important;
    letter-spacing: .16em !important;
    text-transform: uppercase !important;
    color: var(--je-ochre) !important;
    padding: 16px 0 6px !important;
  }

  /* level 3 — group leads */
  header.elementor-location-header nav.elementor-nav-menu--dropdown
    > ul > li > ul > li > ul.sub-menu > li > a.elementor-sub-item{
    font-size: 15px !important;
    font-weight: 700 !important;
    color: var(--je-ink) !important;
    padding: 9px 0 !important;
    text-transform: none !important;
    letter-spacing: normal !important;
  }

  /* level 4 — indented children */
  header.elementor-location-header nav.elementor-nav-menu--dropdown
    > ul > li > ul > li > ul > li > ul.sub-menu > li > a.elementor-sub-item{
    font-size: 14px !important;
    font-weight: 400 !important;
    color: var(--je-soil) !important;
    padding: 8px 0 8px 14px !important;
    border-left: 1px solid var(--je-rule) !important;
    margin-left: 2px;
    text-transform: none !important;
    letter-spacing: normal !important;
  }
}
/* ================= END JE HEADER E ================= */
/* ================= JE HEADER — G: panel geometry ================= */
@media (min-width: 1025px){

  /* The submenu's containing block is ul.elementor-nav-menu, not the
     viewport, so the old calc((100vw - 1320px)/2) padding ballooned to
     300px a side on a wide screen. Make the header the containing block
     so left/right:0 spans the full width, as in the mockup. */
  header.elementor-location-header .elementor-nav-menu--main
    > ul.elementor-nav-menu{
    position: static !important;
  }

  header.elementor-location-header .elementor-nav-menu--main
    li.je-mega > ul.sub-menu{
    padding: 38px clamp(24px, 6vw, 110px) 46px !important;
    gap: clamp(28px, 4vw, 72px) !important;
  }

  /* Product counts on the column heads. Matched on href so re-ordering
     the menu can't misplace them.

     HARDCODED, AND THAT IS THE KNOWN WEAKNESS. These numbers do not read
     the catalogue - CSS has no way to. They were " · 140 products" and
     " · 42 products" until 25 Aug 2026, and went stale the moment the
     printed/occasion products were drafted: the menu advertised 140 and
     42 against a real 29 and 28 for several days with nothing visibly
     wrong.

     Cotton Canvas had NO rule at all until the same date - not hidden,
     not zero, simply never written, because this is a hand-maintained
     list of hrefs rather than anything derived. That is the same defect
     as the stale numbers wearing a different face.

     Re-measure after ANY bulk product change (draft, import, delete):
       /wp-json/wc/store/v1/products/categories?per_page=100
     Counts there aggregate children, e.g. jute 29 = customised 22 +
     plain 7, so the figure can be read straight off the parent row.

     The permanent fix is the MENU PRODUCT COUNTS snippet, which counts
     the catalogue and emits these same three rules with live numbers.
     It is currently blocked by the host WAF on save. WHEN IT ACTIVATES,
     DELETE ALL THREE RULES BELOW - two rules with one selector, resolved
     by load order, is how a wrong number quietly comes back. */
  header.elementor-location-header .elementor-nav-menu--main
    li.je-mega > ul.sub-menu > li > a[href$="/jute-bags/"]::after{
    content: " · 29 products";
  }
  header.elementor-location-header .elementor-nav-menu--main
    li.je-mega > ul.sub-menu > li > a[href$="/juco-bags/"]::after{
    content: " · 28 products";
  }
  header.elementor-location-header .elementor-nav-menu--main
    li.je-mega > ul.sub-menu > li > a[href$="/cotton-canvas-bags/"]::after{
    content: " · 6 products";
  }
}
/* ================= END JE HEADER G ================= */
/* ================= JE HEADER — H: mobile badge + type ================= */

/* --- 1. the standalone .je-mobile-account anchor ---
   Injected directly into the header template, outside both navs, with no
   breakpoint of its own - so it laid out as a block row at every width.
   That is the 42px dead band on mobile and the 131px header on desktop,
   where it also duplicates the badge already in the nav. */

@media (min-width: 1025px){
  header.elementor-location-header > a.je-mobile-account{
    display: none !important;
  }
}

@media (max-width: 1024px){
  /* Lift it out of flow and sit it beside the burger. Burger is 40px wide
     with a 10px right gap, so 60px clears it with 10px of breathing room.
     Header is sticky, so it is already the containing block. */
  header.elementor-location-header > a.je-mobile-account{
    position: absolute !important;
    top: 9px !important;
    right: 60px !important;
    margin: 0 !important;
    z-index: 5;
  }
}

/* --- 2. type scale, up to match the mockup --- */
@media (min-width: 1025px){
header.elementor-location-header .elementor-nav-menu--main
    li.je-mega > ul.sub-menu > li > a{
    font-size: 10.5px !important;
  }
  header.elementor-location-header .elementor-nav-menu--main
    li.je-mega ul.sub-menu ul.sub-menu a{
    font-size: 14.5px !important;
  }
  header.elementor-location-header .elementor-nav-menu--main
    li.je-mega > ul.sub-menu > li > ul > li > a{
    font-size: 16px !important;
  }
}
/* ================= END JE HEADER H ================= */
/* ================= JE HEADER — I: account badge ================= */

@media (min-width: 1025px){
  /* Desktop: plain text menu item, no circular icon. */
  header.elementor-location-header .elementor-nav-menu--main a.je-account-badge{
    font-size: 16px !important;   /* matches the Elementor nav setting */
    line-height: normal !important;
    width: auto !important;
    height: auto !important;
    border-radius: 0 !important;
    background: transparent !important;
    padding: 0 !important;
    display: inline-flex !important;
    align-items: center !important;
  }
  header.elementor-location-header .elementor-nav-menu--main a.je-account-badge::before,
  header.elementor-location-header .elementor-nav-menu--main
    a.je-account-badge[data-initial]:not([data-initial=""])::before{
    content: none !important;
    display: none !important;
  }
  header.elementor-location-header .elementor-nav-menu--main a.je-account-badge *{
    display: inline !important;
  }
}

@media (max-width: 1024px){
  /* Mobile: icon to the left edge, away from the burger. */
  header.elementor-location-header > a.je-mobile-account{
    left: 20px !important;
    right: auto !important;
  }
}
/* ================= END JE HEADER I ================= */
/* ================= JE HOME — J: type scale ================= */
/* Scoped to body.home only. The hero h1 was 42px under 44px section
   headings - the page's most important line was its least prominent.
   Nothing here touches product pages, which Phase 2/3 already sets. */

body.home h1.je-title{
  font-size: clamp(30px, 4vw, 52px) !important;
  line-height: 1.1 !important;
  letter-spacing: -0.02em !important;
}

body.home .je-heroWrap .je-left p{
  font-size: 18.5px !important;
  line-height: 1.55 !important;
}

/* Footer links were 13px, small enough to strain on a laptop. */
footer a,
.footer-navigation a{
  font-size: 14px !important;
}
/* ================= END JE HOME J ================= */
/* ================= JE HEADER — K: secondary dropdowns ================= */
/* Any top-level dropdown that is NOT the Bags mega panel. Written as
   :not(.je-mega) rather than naming Blogs, so a future menu item
   with children inherits this instead of Elementor's default flyout. */

@media (min-width: 1025px){
  header.elementor-location-header .elementor-nav-menu--main
    > ul.elementor-nav-menu > li:not(.je-mega) > ul.sub-menu{
    min-width: 232px !important;
    width: auto !important;
    padding: 8px 0 !important;
    background: var(--je-paper) !important;
    border: 1px solid var(--je-rule) !important;
    border-radius: 2px !important;
    box-shadow: 0 14px 32px rgba(36, 26, 18, .10) !important;
    margin-top: 2px;
  }

  header.elementor-location-header .elementor-nav-menu--main
    > ul.elementor-nav-menu > li:not(.je-mega) > ul.sub-menu a{
    font-size: 14px !important;
    color: var(--je-soil) !important;
    padding: 9px 18px !important;
    background: transparent !important;
    white-space: normal !important;
    line-height: 1.35 !important;
  }
  header.elementor-location-header .elementor-nav-menu--main
    > ul.elementor-nav-menu > li:not(.je-mega) > ul.sub-menu a:hover{
    background: var(--je-cream) !important;
    color: var(--je-ink) !important;
  }
}
/* ================= END JE HEADER K ================= */
/* ================= JE HEADER — M: search + cart ================= */

/* --- 1. mega panel containing block ---
   G made the ul static, but the nav WIDGET wrapper and the container are
   both position:relative, so the panel was bounded by the widget (707px).
   Make both static and the sticky header becomes the containing block. */
header.elementor-location-header > div.elementor-element,
header.elementor-location-header [data-widget_type="nav-menu.default"]{
  position: static !important;
}

/* --- 2. push the pair right ---
   The widget is search.default, not search-form. */
header.elementor-location-header [data-widget_type="search.default"]{
  margin-left: auto !important;
}

/* --- 3. search: compact 38px field --- */
header.elementor-location-header .e-search-form{ min-height: 0 !important; }

header.elementor-location-header input.e-search-input{
  height: 38px !important;
  min-height: 38px !important;
  width: 190px !important;
  padding: 0 12px !important;
  font-family: var(--je-sans) !important;
  font-size: 13.5px !important;
  color: var(--je-ink) !important;
  background: var(--je-white) !important;
  border: 1px solid var(--je-rule) !important;
  border-radius: 2px !important;
  box-shadow: none !important;
  transition: border-color .16s ease;
}
header.elementor-location-header input.e-search-input:hover{ border-color: var(--je-muted) !important; }
header.elementor-location-header input.e-search-input:focus{
  border-color: var(--je-green) !important;
  outline: none !important;
}
header.elementor-location-header input.e-search-input::placeholder{
  color: var(--je-muted) !important;
  opacity: 1;
}

/* --- 4. cart: 38px outlined square with a green count --- */
header.elementor-location-header .elementor-menu-cart__toggle_button{
  position: relative !important;
  width: 38px !important;
  min-width: 38px !important;
  height: 38px !important;
  padding: 0 !important;
  display: inline-flex !important;
  align-items: center !important;
  justify-content: center !important;
  background: transparent !important;
  border: 1px solid var(--je-rule) !important;
  border-radius: 2px !important;
  color: var(--je-ink) !important;
  fill: var(--je-ink) !important;
  transition: border-color .16s ease;
}
header.elementor-location-header .elementor-menu-cart__toggle_button:hover{
  border-color: var(--je-muted) !important;
  background: transparent !important;
}
header.elementor-location-header .elementor-menu-cart__toggle_button .elementor-button-text{
  display: none !important;
}
header.elementor-location-header .elementor-button-icon-qty{
  background: var(--je-green) !important;
  color: var(--je-white) !important;
  font-family: var(--je-mono) !important;
  font-size: 9.5px !important;
  min-width: 17px !important;
  height: 17px !important;
  line-height: 17px !important;
  border-radius: 9px !important;
  top: -6px !important;
  right: -6px !important;
}

/* --- 5. mobile: drop the field, keep the cart --- */
@media (max-width: 1024px){
  header.elementor-location-header [data-widget_type="search.default"]{
    display: none !important;
  }
}
/* ================= END JE HEADER M ================= */
/* ================= JE HEADER — O: utility bar ================= */
/* Replaces N. Three things N got wrong:
   1. Elementor's flex row lives on .e-con-inner, not on the container that
      carries the CSS class - so padding and height went to the wrong box.
   2. The link rule was (0,4,2); the main-nav rule in the JE HEADER block is
      (0,4,4) with !important, so it won and painted these links var(--je-ink) on
      a var(--je-ink) bar. Selector below is (0,5,4).
   3. span + span never matched, so the two facts ran together. */

header.elementor-location-header .je-utilbar{
  background: var(--je-ink) !important;
  padding-block: 0 !important;
}
header.elementor-location-header .je-utilbar > .e-con-inner{
  min-height: 38px !important;
  padding-block: 0 !important;
  align-items: center !important;
}

/* --- left: the facts --- */
header.elementor-location-header .je-utilbar [data-widget_type^="text-editor"]{
  font-family: var(--je-mono) !important;
  font-size: 10.5px !important;
  letter-spacing: .14em !important;
  text-transform: uppercase !important;
  color: var(--je-sand) !important;
  opacity: .72;
  line-height: 1.2 !important;
}
header.elementor-location-header .je-utilbar [data-widget_type^="text-editor"] p{
  margin: 0 !important;
}
header.elementor-location-header .je-utilbar [data-widget_type^="text-editor"] span{
  display: inline-block;
}
header.elementor-location-header .je-utilbar [data-widget_type^="text-editor"] span + span,
header.elementor-location-header .je-utilbar [data-widget_type^="text-editor"] p + p{
  margin-left: 28px;
}

/* --- right: the links. (0,5,4) so it outranks the main-nav rule --- */
header.elementor-location-header .je-utilbar .elementor-nav-menu--main
  ul.elementor-nav-menu > li > a.elementor-item{
  font-family: var(--je-mono) !important;
  font-size: 10.5px !important;
  font-weight: 400 !important;
  letter-spacing: .14em !important;
  text-transform: uppercase !important;
  color: var(--je-sand) !important;
  fill: var(--je-sand) !important;
  background: transparent !important;
  opacity: .78;
  padding: 0 !important;
  border: 0 !important;
  border-bottom: 0 !important;
  transition: opacity .16s ease;
}
header.elementor-location-header .je-utilbar .elementor-nav-menu--main
  ul.elementor-nav-menu > li > a.elementor-item:hover,
header.elementor-location-header .je-utilbar .elementor-nav-menu--main
  ul.elementor-nav-menu > li > a.elementor-item.elementor-item-active{
  color: var(--je-sand) !important;
  opacity: 1;
  background: transparent !important;
  border-bottom: 0 !important;
}
header.elementor-location-header .je-utilbar .elementor-nav-menu{ gap: 22px !important; }

/* Account may still carry the badge class - text only in this bar. */
header.elementor-location-header .je-utilbar a.je-account-badge{
  width: auto !important; height: auto !important;
  border-radius: 0 !important; background: transparent !important;
  padding: 0 !important; display: inline !important;
}
header.elementor-location-header .je-utilbar a.je-account-badge::before{
  content: none !important; display: none !important;
}
header.elementor-location-header .je-utilbar a.je-account-badge *{ display: inline !important; }

@media (max-width: 1024px){
  header.elementor-location-header .je-utilbar{ display: none !important; }
}
/* ================= END JE HEADER O ================= */
/* ================= JE HEADER — P: mobile gutter ================= */
/* The header container is e-con-full with padding:0, so the cart button
   ended flush against the viewport edge. Give the row a gutter and keep
   the absolutely-positioned account badge on the same optical margin.

   16px -> 24px: the original fix picked 16px on its own, without checking
   what the page content actually uses. Kadence's own content-container
   padding is 24px site-wide (every page, not set anywhere in this
   stylesheet - it's the theme's layout default), so at 16px the header's
   logo/burger/cart sat 8px inside of where every page's title, text and
   product grid start below it - a visible sideways jog site-wide, worst
   on mobile where 8px is a bigger fraction of the gutter. Matching it to
   24px lines the header up with the content on every page, since this
   gutter is header-only and not scoped to any one page type. */

@media (max-width: 1024px){
  header.elementor-location-header > .e-con{
    padding-inline: 24px !important;
  }
  header.elementor-location-header > a.je-mobile-account{
    left: 24px !important;
  }
}
/* ================= END JE HEADER P ================= */
/* ================= JE HEADER — Q: widget vertical align ================= */
/* The Nav Menu widget carries align-self:flex-start, which beats the row's
   align-items:center - the burger pinned to the top of a 59px row while the
   cart centred, a 10px offset. Centring is correct at every width. */

header.elementor-location-header [data-widget_type="nav-menu.default"],
header.elementor-location-header [data-widget_type="search.default"],
header.elementor-location-header [data-widget_type="woocommerce-menu-cart.default"]{
  align-self: center !important;
}
/* ================= END JE HEADER Q ================= */
/* ================= JE HEADER — R: align header width to content ================= */
/* Originally written against the old 1290px boxed content width; the
   Customizer's Product Catalog layout was later switched to Full Width
   sitewide (see "JE SITE - content container width" near the top of this
   file), which changes what "aligned with content" now means. Updated to
   use the exact same max-width and padding-inline as that block, so the
   two can never drift out of sync with each other again - if that value
   changes, change it in both places.

   Same underlying bug as before, still true: neither header row's width
   is tied to the page's content width on its own.
     - utility bar's .e-con-inner: width:100%, max-width capped by Elementor
       - only the cap needs overriding.
     - main nav row (.elementor-element-344e8b3): WIDTH itself (not just
       max-width) is a fixed 70% from Elementor, and it sat at left:0, not
       centred - an e-con-full container. max-width alone cannot fix this:
       it only constrains a box DOWN when width would exceed it, never
       widens a box whose own width already computes smaller. width:100%
       is required alongside max-width so the row can actually reach the
       full cap at every viewport, not just the wide end of the range.

   Desktop only (min-width:1025px): below that the utility bar is
   display:none (JE HEADER O) and the main nav is replaced entirely by the
   mobile dropdown (JE HEADER D/E), so neither row exists in this form. */

@media (min-width: 1025px){
  header.elementor-location-header .je-utilbar .e-con-inner{
    max-width: 1880px !important;
    padding-inline: clamp(24px, 1.6vw, 32px) !important;
  }
  header.elementor-location-header .elementor-element-344e8b3{
    width: 100% !important;
    max-width: 1880px !important;
    margin-inline: auto !important;
    padding-inline: clamp(24px, 1.6vw, 32px) !important;
  }
}
/* ================= END JE HEADER R ================= */
/* ================= JE HEADER — S: product breadcrumb overlap ================= */
/* Kadence's single-product template ships the breadcrumb wrapper with
   margin-top:-16px - harmless while the header scrolled away with the
   page, but the header has been position:sticky since Phase 4, so that
   negative margin now collapses upward through .product-title.product-above
   and pulls the breadcrumb (and the rest of main.site-main with it) 16px
   under the header's bottom edge on every product page.

   Not present on the shop archive template, which uses a different wrapper
   (.entry-header.product-archive-title) and already carries a POSITIVE
   margin - so this is scoped to .product-title.product-above only, and
   flips the sign rather than zeroing it, landing on the same clean gap the
   archive page already has. */
body.single-product .product-title.product-above .kadence-breadcrumbs{
  margin-top: 16px;
}
/* ================= END JE HEADER S ================= */
/* ==========================================================================
   JE HEADER — T: Earth & Green header
   Brings the header onto the same palette as the pages under it. Before
   this it was still on the old scheme - a #FDFBF6 near-white shell with
   #241A12 ink text and 2px corners - sitting directly above a Sand page
   with Soil text and 8-12px corners. It read as a strip bolted on rather
   than part of the page.

   Follows the theme preview's own header: an Ochre announcement bar over
   a Soil nav with cream links and a green accent. Safe to go dark here
   because the header carries NO logo image - measured: zero <img>, no
   site-logo widget, only text and 25 inline SVG icons, all of which use
   fill:currentColor and therefore follow the text colour automatically.
   Had there been a raster logo built for a light ground, this would have
   needed a reversed version first.

   The mega panel deliberately stays light. It holds ~36 links; cream on
   dark at that density is harder to scan, and a light panel dropping out
   of a dark bar is the clearer relationship anyway.

   Loads LAST of the header blocks on purpose - it overrides colour only,
   and leaves every layout rule in JE HEADER A-S untouched.
   REVERT: delete this block; the header returns to the old palette.
   ========================================================================== */

/* ---- shell + sticky ---- */
header.elementor-location-header{
  background:var(--je-primary) !important;
  border-bottom:1px solid rgba(255,255,255,.10) !important;
}

/* ---- announcement / utility bar: ochre ---- */
header.elementor-location-header .je-utilbar{
  background:var(--je-ochre-deep) !important;
}
/* opacity is forced to 1, not left at the .72/.78 the old ink bar used.
   Fading white text is the same as lowering contrast - at .9 the effective
   ratio drops back under the threshold the deepened background was chosen
   to clear, which would have quietly undone the fix. */
header.elementor-location-header .je-utilbar [data-widget_type^="text-editor"]{
  color:#fff !important;
  opacity:1 !important;
}
header.elementor-location-header .je-utilbar .elementor-nav-menu--main
  ul.elementor-nav-menu > li > a.elementor-item{
  color:#fff !important;
  fill:#fff !important;
  opacity:1 !important;
}
header.elementor-location-header .je-utilbar .elementor-nav-menu--main
  ul.elementor-nav-menu > li > a.elementor-item:hover,
header.elementor-location-header .je-utilbar .elementor-nav-menu--main
  ul.elementor-nav-menu > li > a.elementor-item.elementor-item-active{
  color:#fff !important;
  opacity:1 !important;
  text-decoration:underline !important;   /* hover cue that does not rely on a contrast change */
  text-underline-offset:3px;
}

/* ---- main nav: cream on soil ---- */
@media (min-width:1025px){
  header.elementor-location-header .elementor-nav-menu--main
    ul.elementor-nav-menu > li > a.elementor-item{
    color:var(--je-on-primary) !important;
    fill:var(--je-on-primary) !important;
  }
  /* Green underline on hover - the accent stays reserved for interaction,
     which is the rule the whole theme is built on. */
  header.elementor-location-header .elementor-nav-menu--main
    ul.elementor-nav-menu > li > a.elementor-item:hover,
  header.elementor-location-header .elementor-nav-menu--main
    ul.elementor-nav-menu > li > a.elementor-item.elementor-item-active{
    color:var(--je-on-primary) !important;
    border-bottom-color:var(--je-green) !important;
  }
}

/* ---- search field: readable on the dark bar ---- */
header.elementor-location-header input.e-search-input{
  background:rgba(255,255,255,.10) !important;
  border:1px solid rgba(255,255,255,.28) !important;
  border-radius:8px !important;
  color:var(--je-on-primary) !important;
}
/* .82 rather than .65: the field sits on Soil, and at .65 the placeholder
   fell to roughly 4:1 against it. Placeholders are still text. */
header.elementor-location-header input.e-search-input::placeholder{
  color:rgba(250,244,232,.82) !important;
}
header.elementor-location-header input.e-search-input:hover{
  border-color:rgba(255,255,255,.45) !important;
}
header.elementor-location-header input.e-search-input:focus{
  border-color:var(--je-green) !important;
  background:rgba(255,255,255,.16) !important;
}

/* ---- cart ---- */
header.elementor-location-header .elementor-menu-cart__toggle_button{
  border:1px solid rgba(255,255,255,.28) !important;
  border-radius:8px !important;
  color:var(--je-on-primary) !important;
  fill:var(--je-on-primary) !important;
  background:transparent !important;
}
header.elementor-location-header .elementor-menu-cart__toggle_button:hover{
  border-color:rgba(255,255,255,.45) !important;
}
/* The badge digit is ~9.5px, far below any large-text allowance, so the
   button's dark-on-green pairing (3.83:1) cannot be reused here. The
   deeper green with white measures 5.61:1 and clears AA outright.
   SUPERSEDED by JE CART at the foot of this file - see the note there. */
header.elementor-location-header .elementor-button-icon-qty{
  background:var(--je-green-deep) !important;
  color:#fff !important;
}

/* ---- mega panel: stays light, now cream rather than paper ---- */
@media (min-width:1025px){
  header.elementor-location-header .elementor-nav-menu--main
    li.je-mega > ul.sub-menu{
    background:var(--je-surface) !important;
    border-top:0 !important;
    border-bottom:0 !important;
    box-shadow:0 18px 40px rgba(60,50,20,.22) !important;
  }
  header.elementor-location-header .elementor-nav-menu--main
    li.je-mega > ul.sub-menu > li > a{
    color:var(--je-ochre-text) !important;   /* 10px column heads on Cream; plain ochre is 3.30:1 there */
    border-bottom-color:var(--je-rule) !important;
  }
  header.elementor-location-header .elementor-nav-menu--main
    li.je-mega ul.sub-menu ul.sub-menu a{
    color:var(--je-muted) !important;
  }
  header.elementor-location-header .elementor-nav-menu--main
    li.je-mega > ul.sub-menu > li > ul > li > a{
    color:var(--je-primary) !important;
  }
  header.elementor-location-header .elementor-nav-menu--main
    li.je-mega ul.sub-menu ul.sub-menu a:hover{
    color:var(--je-primary) !important;
  }
  /* Secondary (non-mega) dropdowns get the same cream treatment. */
  header.elementor-location-header .elementor-nav-menu--main
    > ul.elementor-nav-menu > li:not(.je-mega) > ul.sub-menu{
    background:var(--je-surface) !important;
    border:0 !important;
    border-radius:12px !important;
    box-shadow:0 14px 32px rgba(60,50,20,.20) !important;
  }
  header.elementor-location-header .elementor-nav-menu--main
    > ul.elementor-nav-menu > li:not(.je-mega) > ul.sub-menu a{
    color:var(--je-muted) !important;
  }
  header.elementor-location-header .elementor-nav-menu--main
    > ul.elementor-nav-menu > li:not(.je-mega) > ul.sub-menu a:hover{
    background:var(--je-sand) !important;
    color:var(--je-primary) !important;
  }
}

/* ---- mobile: burger + dropdown on the dark bar ---- */
@media (max-width:1024px){
  header.elementor-location-header .elementor-menu-toggle{
    border:1px solid rgba(255,255,255,.28) !important;
    border-radius:8px !important;
    color:var(--je-on-primary) !important;
    background:transparent !important;
  }
  header.elementor-location-header .elementor-menu-toggle:hover{
    border-color:rgba(255,255,255,.45) !important;
  }
  header.elementor-location-header .elementor-menu-toggle.elementor-active{
    background:var(--je-green) !important;
    border-color:var(--je-green) !important;
    color:#fff !important;
  }
  /* Elementor paints the toggle's SVG with its own fill (the widget's
     "toggle colour", green) and that rule outranks fill:currentColor, so
     with the menu open the X was green on the green button - a blank green
     square on Krishna's phone (11 Sep 2026). Force the fill to follow the
     button's text colour in both states. */
  header.elementor-location-header .elementor-menu-toggle svg,
  header.elementor-location-header .elementor-menu-toggle svg path{
    fill:currentColor !important;
  }
  /* The drawer stays light for the same scanning reason as the mega panel. */
  header.elementor-location-header nav.elementor-nav-menu--dropdown{
    background:var(--je-surface) !important;
    border-top:0 !important;
    box-shadow:0 18px 40px rgba(60,50,20,.22) !important;
  }
  header.elementor-location-header nav.elementor-nav-menu--dropdown
    > ul.elementor-nav-menu > li > a.elementor-item{
    color:var(--je-primary) !important;
    border-bottom-color:var(--je-rule) !important;
  }
  header.elementor-location-header nav.elementor-nav-menu--dropdown
    > ul > li > ul.sub-menu > li > a.elementor-sub-item{
    color:var(--je-ochre-text) !important;
  }
  header.elementor-location-header nav.elementor-nav-menu--dropdown
    > ul > li > ul > li > ul.sub-menu > li > a.elementor-sub-item{
    color:var(--je-primary) !important;
  }
  header.elementor-location-header nav.elementor-nav-menu--dropdown
    > ul > li > ul > li > ul > li > ul.sub-menu > li > a.elementor-sub-item{
    color:var(--je-muted) !important;
    border-left-color:var(--je-rule) !important;
  }
  header.elementor-location-header > a.je-mobile-account{
    color:var(--je-on-primary) !important;
  }
}
/* ================= END JE HEADER T ================= */
/* ==========================================================================
   JE BREADCRUMBS — one treatment everywhere
   Category and product pages were running two unrelated styles. Measured:
     category: system sans, 14.45px, #1A202C slate, weight 400
     product:  Montserrat,  16px,    #03AC1A green, weight 600
   Neither matched the Earth & Green palette, and the product version
   coloured the CURRENT page green too - so the one crumb that is not a
   link looked exactly like the ones that are.

   Deliberately NOT scoped to .je-cat-designed: the whole point is that the
   trail looks the same wherever it appears, so this targets the breadcrumb
   component itself and covers product pages, category pages and anything
   else Kadence renders it on.

   Colour choices are contrast-checked against BOTH grounds this appears
   on - Sand on category pages, white on product pages:
     muted-deep on Sand 5.27:1, on white 6.53:1
     primary    on Sand 9.37:1, on white 11.6:1
     green-deep on Sand 4.52:1, on white 5.61:1   (hover)
   ========================================================================== */
nav#kadence-breadcrumbs,
.kadence-breadcrumbs{
  font-family:var(--je-sans) !important;
  /* 15px, not the 13px first tried. 13px was smaller than BOTH of the
     styles it replaced (category 14.45px, product 16px), so unifying them
     also shrank the trail - it read as fine print rather than navigation. */
  font-size:15px !important;
  line-height:1.5 !important;
  margin-bottom:18px !important;
}
nav#kadence-breadcrumbs a,
.kadence-breadcrumbs a{
  color:var(--je-muted-deep) !important;
  font-weight:500 !important;
  /* Underline kept rather than removed on rest: it identifies the links
     without relying on colour alone, which is the accessible default. */
  text-decoration:underline !important;
  text-underline-offset:3px;
  text-decoration-thickness:1px;
}
nav#kadence-breadcrumbs a:hover,
.kadence-breadcrumbs a:hover{
  color:var(--je-green-deep) !important;
}
/* The current page is not a link, so it should not look like one: no
   underline, darker, slightly heavier. */
nav#kadence-breadcrumbs .kadence-bread-current,
.kadence-breadcrumbs .kadence-bread-current{
  color:var(--je-primary) !important;
  font-weight:600 !important;
  text-decoration:none !important;
}
/* Separators recede - they are punctuation, not content. */
nav#kadence-breadcrumbs .bc-delimiter,
.kadence-breadcrumbs .bc-delimiter{
  color:var(--je-rule) !important;
  padding:0 4px;
}
@media (max-width:560px){
  nav#kadence-breadcrumbs,
  .kadence-breadcrumbs{ font-size:13.5px !important; margin-bottom:14px !important; }
}
/* ================= END JE BREADCRUMBS ================= */
/* ==========================================================================
   JE FOOTER — Earth & Green
   The footer was a large flat green fill (#0BA21D - not even the brand
   green) carrying #2D3748 slate text at roughly 3.2:1, under the 4.5:1
   minimum, so it was genuinely hard to read. It also broke the theme's own
   stated rule: "#03AC13 is bright - use it for buttons, links, highlights
   and numbers only, never large backgrounds."

   Now Soil with cream text, matching JE HEADER T. That bookends the page -
   dark top, dark bottom, warm content between - which is what the design
   preview does too.

   Structure is Kadence's footer builder, three rows:
     .site-top-footer-wrap     nav + social
     .site-middle-footer-wrap  three widget columns
     .site-bottom-footer-wrap  copyright
   The widget columns already carry je- classes from earlier work
   (.je-footer-office-title etc.), so the column headings have real hooks
   and do not need to be targeted positionally.

   Every colour here is contrast-checked against Soil:
     cream            10.62:1
     muted-inverse     5.98:1
     ochre-on-dark     5.09:1  (headings)
   Green is deliberately NOT used for footer links: on Soil it is 3.78:1
   and would fail. Links rest at muted-inverse and brighten to cream on
   hover, which passes in both states.
   ========================================================================== */
footer#colophon.site-footer,
footer#colophon .site-footer-row-container,
footer#colophon .site-top-footer-wrap,
footer#colophon .site-middle-footer-wrap,
footer#colophon .site-bottom-footer-wrap{
  background-color:var(--je-primary) !important;
  background-image:none !important;
}
footer#colophon.site-footer{
  color:var(--je-on-primary) !important;
  font-family:var(--je-sans) !important;
}

/* ---- column headings ---- */
footer#colophon .je-footer-office-title,
footer#colophon .je-footer-factory-title,
footer#colophon .je-footer-policies-title{
  font-family:var(--je-sans) !important;
  font-size:12px !important;
  font-weight:700 !important;
  letter-spacing:.14em !important;
  text-transform:uppercase !important;
  color:var(--je-ochre-on-dark) !important;
  margin-bottom:12px !important;
}
/* The widgets put a <br> straight after each title, which doubles the gap
   the margin above already provides. */
footer#colophon .je-footer-office-address br:first-child,
footer#colophon .je-footer-factory-address br:first-child{
  display:none;
}

/* ---- addresses ---- */
footer#colophon .je-footer-office-address,
footer#colophon .je-footer-factory-address{
  font-size:14.5px !important;
  line-height:1.65 !important;
  color:var(--je-muted-inverse) !important;
  max-width:24.4em /* was 38ch */;
}

/* ---- policy list ---- */
footer#colophon .je-footer-policies-list{
  list-style:none !important;
  margin:0 !important;
  padding:0 !important;
}
footer#colophon .je-footer-policies-list li{
  padding:4px 0 !important;
  list-style:none !important;
}

/* ---- links: rest muted, brighten on hover ---- */
footer#colophon a{
  color:var(--je-muted-inverse) !important;
  text-decoration:none !important;
  transition:color .15s ease;
}
footer#colophon a:hover,
footer#colophon a:focus{
  color:var(--je-on-primary) !important;
  text-decoration:underline !important;
  text-underline-offset:3px;
}

/* ---- top row nav ---- */
footer#colophon .footer-navigation ul{
  display:flex !important;
  flex-wrap:wrap !important;
  gap:8px 30px !important;
  justify-content:center;
  margin:0 !important;
  padding:0 !important;
  list-style:none !important;
}
footer#colophon .footer-navigation a{
  font-size:15px !important;
  font-weight:600 !important;
  color:var(--je-on-primary) !important;
}
footer#colophon .footer-navigation a:hover{
  color:var(--je-ochre-on-dark) !important;
}

/* ---- social icons ---- */
footer#colophon .footer-social-inner a,
footer#colophon .footer-social-wrap a{
  color:var(--je-muted-inverse) !important;
  fill:var(--je-muted-inverse) !important;
}
footer#colophon .footer-social-inner a:hover,
footer#colophon .footer-social-wrap a:hover{
  color:var(--je-on-primary) !important;
  fill:var(--je-on-primary) !important;
}

/* ---- separators between rows ---- */
footer#colophon .site-middle-footer-wrap{
  border-top:1px solid rgba(250,244,232,.14) !important;
  border-bottom:1px solid rgba(250,244,232,.14) !important;
}

/* ---- bottom bar ---- */
footer#colophon .site-bottom-footer-wrap,
footer#colophon .site-info{
  font-size:13px !important;
  color:var(--je-muted-inverse) !important;
}

@media (max-width:768px){
  footer#colophon .footer-navigation ul{ gap:6px 20px !important; }
  footer#colophon .je-footer-office-address,
  footer#colophon .je-footer-factory-address{ font-size:14px !important; max-width:none; }
}
/* ================= END JE FOOTER ================= */

/* ================= JE: hide variation swatches on archive/loop cards ================= */
/* Variation Swatches for WooCommerce (Pro) injects a full attribute-swatch
   row - closure, print, size - into every product card wherever WooCommerce
   loops products: shop/category archives, search results, related products.
   Wrapper is div.wvs-archive-variations-wrapper, a sibling AFTER
   .product-action-wrap (the "Select options" button) and containing nothing
   else - no price, no button - so hiding it is a clean removal, not a
   partial one. The card falls back to title / price / "Select options",
   matching the single product page for the actual configuration. */
.wvs-archive-variations-wrapper{
  display: none !important;
}
/* ================= END JE: hide archive swatches ================= */
/* ==========================================================================
   JE PHASE 6 — Category archive design, all 34 categories + shop page
   Markup comes from the "CATEGORY HUB ARCHIVE" snippet. That snippet adds
   body.je-cat-designed only on pages it is configured for, so everything
   here is scoped to that class and cannot leak onto a page that has not
   been opted in. That replaced an earlier approach of naming each slug in
   the CSS, which would have meant 35 hard-coded selectors kept in sync by
   hand with the snippet's config - guaranteed to drift.

   SUPERSEDES JE PHASE 5. The old branding-page block is retired along
   with its snippet; this engine renders that page now.

   Hero photo is the category's own WooCommerce image, so it is set in
   Products > Categories, not here. Pages with no image get
   .je-cat-hero--noimg and lay the hero out full width instead - a
   deliberate fallback, not a broken state.

   REVERT: delete everything from this header to the END OF JE PHASE 6 marker.
   ========================================================================== */

/* ---------- page chrome: ground, title, description, product cards ----------
   Ported from the retired JE PHASE 5 block, which styled these for the
   branding page only. Removing that block reverted every designed page to
   Kadence's defaults - a Montserrat H1 in bright green, a pure-black
   description running the full column width, and unstyled product cards.
   Scoped to body.je-cat-designed so it now covers all 35 pages instead of
   one, and still cannot touch a page that has not been opted in.

   The page ground is the visible fix here. Kadence paints #F7FAFC, a
   blue-tinted white, which reads as cold and slightly grey next to the
   warm cream/sand palette everything else on the page uses. --je-paper is
   the same brightness but warm, so the sections stop looking like they
   were pasted onto the wrong background.

   !important is required here, not decorative: Kadence paints the body
   background from its own global stylesheet and the plain declaration lost
   to it (measured - body still computed #F7FAFC after the first attempt).
   Every other Kadence override in this file carries !important for the
   same reason. */
body.je-cat-designed,
body.je-cat-designed.archive,
body.je-cat-designed.woocommerce-shop{
  background-color:var(--je-ground) !important;
  /* The preview's woven texture: two faint diagonal hatches crossing at
     90 degrees, echoing the weave of the fabric being sold. Kept at 3%
     opacity - visible as a grain when you look for it, invisible when you
     are reading. It is what stops a large flat sand field looking like a
     rendering error on a big monitor. */
  background-image:
    repeating-linear-gradient(45deg, rgba(120,95,50,.03) 0 2px, transparent 2px 9px),
    repeating-linear-gradient(-45deg, rgba(120,95,50,.03) 0 2px, transparent 2px 9px) !important;
}
/* The inner wrappers are transparent by default, but Kadence paints
   .content-bg white on archive pages, which would sit as a hard white slab
   over the warm ground. Cleared so the page reads as one surface. */
body.je-cat-designed .content-container.site-container,
body.je-cat-designed .content-area,
body.je-cat-designed main.site-main{
  background-color:transparent !important;
}

/* Title: display face, ink rather than the theme's green. Green is a brand
   ACCENT - reserved for actions and highlights - so a full headline in it
   competes with the actual buttons instead of leading the page. */
body.je-cat-designed h1.page-title.archive-title{
  font-family:var(--je-serif) !important;
  font-weight:400 !important;   /* Young Serif ships one weight; 700 would fake-bold it */
  font-size:clamp(30px,3.6vw,46px) !important;
  line-height:1.12 !important;
  letter-spacing:0 !important;   /* the serif is drawn tight already; negative tracking muddies it */
  color:var(--je-primary) !important;
  /* 26ch, not 18. At 18 a long category name wrapped to three lines and
     stopped halfway across the column, leaving the right half of the hero
     empty beside it - "Jute Bags for Branding or Promotions" is 36
     characters, and the longest here is 46. 18ch was measured against
     short titles like "Bags" and "Jute Bags", where nothing wrapped and
     the limit never showed itself. 26 keeps a deliberate two-line break
     on the long names without stranding the space. */
  max-width:15.7em /* was 26ch */;
  margin:0 0 14px !important;
}

/* Description: capped near 62 characters. Unstyled it ran the full column
   width, which is far past a comfortable reading measure. */
body.je-cat-designed .archive-description{margin-bottom:0 !important;}
body.je-cat-designed .archive-description p{
  font-family:var(--je-sans) !important;
  font-size:18px !important;
  line-height:1.6 !important;
  color:var(--je-muted-deep) !important;   /* sits on Sand: --je-muted is only 4.18:1 there */
  max-width:39.7em /* was 62ch */;
  margin:0 !important;
}

/* Result count and the sorting select, so the row above the grid does not
   fall back to the theme's own typography mid-page. */
body.je-cat-designed .woocommerce-result-count,
body.je-cat-designed .woocommerce-ordering select{
  font-family:var(--je-mono) !important;
  font-size:12.5px !important;
  color:var(--je-muted-deep) !important;
}

/* ---------- product cards ----------
   :not(.product-category) matters: subcategory tiles are also li.product
   and have their own card treatment further down. Without the exclusion
   these two rule sets fight over the same elements on hub pages. */
body.je-cat-designed ul.products li.product:not(.product-category){
  /* Cream on the sand ground, not white. The layering IS the theme - a
     white card on a near-white page has nothing to lift off. */
  background:var(--je-surface) !important;
  border:0 !important;
  border-radius:12px !important;
  overflow:hidden;
  box-shadow:0 3px 14px rgba(60,50,20,.08);
  transition:box-shadow .18s ease, transform .18s ease;
}
body.je-cat-designed ul.products li.product:not(.product-category):hover{
  box-shadow:0 12px 28px rgba(60,50,20,.16);
  transform:translateY(-3px);
}
body.je-cat-designed ul.products li.product:not(.product-category) a.woocommerce-loop-image-link{
  display:block; aspect-ratio:1/1; overflow:hidden; background:var(--je-sand);
}
body.je-cat-designed ul.products li.product:not(.product-category) a.woocommerce-loop-image-link img{
  width:100% !important; height:100% !important; object-fit:cover;
  transition:transform .4s ease;
}
body.je-cat-designed ul.products li.product:not(.product-category):hover a.woocommerce-loop-image-link img{
  transform:scale(1.05);
}
body.je-cat-designed ul.products li.product:not(.product-category) .product-details{
  padding:15px 15px 17px !important;
}
body.je-cat-designed ul.products li.product:not(.product-category) h2.woocommerce-loop-product__title{
  font-family:var(--je-sans) !important;
  font-weight:600 !important;
  font-size:14px !important;
  line-height:1.4 !important;
  color:var(--je-primary) !important;
  margin:0 0 8px !important;
}
body.je-cat-designed ul.products li.product:not(.product-category) .price{
  font-family:var(--je-sans) !important;
  font-weight:800 !important;
  font-size:15px !important;
  color:var(--je-primary) !important;
}
body.je-cat-designed ul.products li.product:not(.product-category) .price .woocommerce-price-suffix{
  display:block;
  font-family:var(--je-body) !important;
  font-size:11px !important;
  color:var(--je-muted) !important;
}
/* The button reads as a quiet text link, not a second green block. Each
   card already competes for attention with its photo; a grid of 20 filled
   green buttons would drown the page's real CTA. */
body.je-cat-designed ul.products li.product:not(.product-category) a.add_to_cart_button,
body.je-cat-designed ul.products li.product:not(.product-category) a.button{
  font-family:var(--je-sans) !important;
  font-weight:700 !important;
  font-size:14px !important;
  color:var(--je-ochre-text) !important;   /* preview's card link colour, carried down to clear AA on Cream */
  background:transparent !important;
  border:0 !important;
  padding:0 !important;
  margin-top:10px !important;
}

/* ---------- hero ---------- */
.je-cat-hero{
  padding-bottom:40px;
  border-bottom:1px solid var(--je-rule);
  margin-bottom:0;
}
.je-cat-hero__text{display:flex; flex-direction:column; gap:26px; min-width:0;}
.je-cat-hero__text .entry-header{margin:0 !important; padding:0 !important; border:0 !important;}
.je-cat-hero__text .archive-description{margin:14px 0 0 !important;}

.je-cat-facts{display:flex; flex-wrap:wrap; gap:36px;}
.je-cat-fact{font-family:var(--je-mono);}
.je-cat-fact b{display:block; font-family:var(--je-serif); font-size:26px; font-weight:400; color:var(--je-green);}
.je-cat-fact span{font-family:var(--je-sans); font-size:13px; color:var(--je-muted-deep); letter-spacing:.02em;}

.je-cat-cta{display:flex; gap:14px; flex-wrap:wrap;}
.je-cat-cta--center{justify-content:center; margin-top:24px;}
/* 19px, not the 16px the preview used, and the reason is contrast rather
   than taste. The theme's rule is dark text on the green fill, and Soil on
   #03AC13 measures 3.83:1 - short of the 4.5:1 AA wants for normal text,
   though clear of the 3:1 it accepts for large text. WCAG counts bold type
   as large from 18.66px, so 19px/700 makes this pairing genuinely
   compliant instead of nearly compliant. Keeping the theme's look and
   failing the check was not a real option, and white on green is worse
   still at 3.04:1. */
.je-cat-btn{
  font-family:var(--je-sans); font-weight:700; font-size:19px;
  padding:15px 30px; border-radius:8px; text-decoration:none;
  display:inline-flex; align-items:center; justify-content:center; gap:8px;
  transition:transform .15s ease, background .15s ease;
}
/* Dark text on the green fill, per the theme's own stated rule: #03AC13 is
   a bright green and white on it is the weakest pairing available. Soil
   text reads cleanly and keeps the button feeling part of the palette
   rather than a generic web button dropped on top of it. */
.je-cat-btn--primary{background:var(--je-green); color:var(--je-primary); border:none; box-shadow:0 4px 14px rgba(0,0,0,.18);}
.je-cat-btn--primary:hover{background:var(--je-green); color:var(--je-primary); transform:translateY(-2px);}
.je-cat-btn--ghost{background:transparent; border:2px solid var(--je-primary); color:var(--je-primary);}
.je-cat-btn--ghost:hover{background:var(--je-primary); color:var(--je-on-primary); transform:translateY(-2px);}

/* 16px and a deeper, tighter shadow. At 5px the corners read as an
   accident of rendering rather than a decision, and the flatter shadow
   left the photo sitting ON the sand instead of above it. Matches the
   treatment the shop hero already uses, so the two pages agree. */
.je-cat-hero__photo{
  position:relative; border-radius:16px; overflow:hidden; background:var(--je-sand);
  box-shadow:0 22px 48px -22px rgba(36,26,18,.42);
}
.je-cat-hero__photo img{width:100%; height:100%; object-fit:cover; display:block;}
.je-cat-tag{
  position:absolute; left:16px; bottom:16px; max-width:260px;
  background:var(--je-surface); border:0; border-radius:12px;
  padding:14px 17px; font-family:var(--je-sans); font-size:13.5px; line-height:1.45; color:var(--je-primary);
  box-shadow:0 6px 20px rgba(60,50,20,.18);
}
.je-cat-tag span{
  display:block; font-family:var(--je-sans); font-size:11px; font-weight:700;
  letter-spacing:.12em; text-transform:uppercase; color:var(--je-ochre-text); margin-bottom:4px;
}

/* ---------- client strip ---------- */
.je-cat-clients{
  display:flex; align-items:center; gap:24px; flex-wrap:wrap;
  padding:24px 0; border-bottom:1px solid var(--je-rule); margin-bottom:34px;
}
.je-cat-clients__label{
  font-family:var(--je-sans); font-size:12px; font-weight:700;
  letter-spacing:.15em; text-transform:uppercase;
  color:var(--je-muted-deep); white-space:nowrap;
}
.je-cat-clients__names{display:flex; gap:12px; flex-wrap:wrap;}
/* The preview shows client names as bordered chips rather than loose text -
   it reads as a credential list instead of a stray line of words. */
.je-cat-clients__names span{
  font-family:var(--je-sans); font-weight:700; font-size:14px;
  color:var(--je-muted-deep);
  border:1.5px dashed rgba(120,95,50,.45); border-radius:8px;
  padding:11px 18px; background:rgba(255,255,255,.3);
}

/* ---------- trust strip: registrations + Google rating ----------
   Replaced the client-names strip on 31 Aug 2026. The .je-cat-clients
   rules above are now unrendered - kept because the names themselves are
   still wanted and may return somewhere else on the page.

   TEXT, not logos. This was three logo images first and they rendered at
   full page width: the theme forces width:100% on images inside the
   content area, which beat the height set here. Rather than fight that
   with !important, the bar states the full name of each body - readable,
   indexable, and impossible to blow up. The logos still appear on the
   homepage, which is the right place for them.

   One line on desktop, wrapping rather than overflowing below that. It
   is a long line: three full institution names plus a rating is about
   190 characters, so the type is deliberately small and tight. */
.je-cat-trust{
  display:flex; align-items:center; justify-content:space-between;
  gap:14px 26px; flex-wrap:wrap;
  padding:20px 0; border-bottom:1px solid var(--je-rule); margin-bottom:34px;
}
.je-cat-trust__label{
  font-family:var(--je-sans); font-size:11px; font-weight:700;
  letter-spacing:.11em; text-transform:uppercase; color:var(--je-muted);
  white-space:nowrap;
}
.je-cat-trust__bodies{
  display:flex; align-items:center; flex-wrap:wrap;
  gap:6px 0; min-width:0; flex:1 1 auto;
}
.je-cat-trust__body{
  font-family:var(--je-sans); font-size:12.5px; line-height:1.5;
  color:var(--je-primary);
}
/* Separator drawn between items, never after the last one - so removing
   a name from the config cannot leave a stray dot on the page. */
.je-cat-trust__body + .je-cat-trust__body{
  border-left:1px solid var(--je-rule);
  margin-left:13px; padding-left:13px;
}
.je-cat-trust__google{
  display:inline-flex; align-items:center; gap:7px; text-decoration:none;
  white-space:nowrap;
  background:var(--je-white); border:1px solid var(--je-rule);
  border-radius:99px; padding:7px 15px;
  transition:border-color .18s ease, box-shadow .18s ease;
}
.je-cat-trust__google:hover{
  border-color:var(--je-green);
  box-shadow:0 4px 14px rgba(60,50,20,.13);
}
.je-cat-trust__google:focus-visible{outline:2px solid var(--je-green); outline-offset:3px;}
/* Google's own star gold, not the brand green - a review badge painted in
   the site palette stops reading as a third-party credential, which is
   the whole point of showing it. */
.je-cat-trust__stars{color:#F4B400; font-size:15px; line-height:1;}
.je-cat-trust__gtext{
  font-family:var(--je-sans); font-size:12.5px; font-weight:700;
  color:var(--je-muted-deep);
}

@media (max-width:900px){
  .je-cat-trust{gap:12px 18px;}
  .je-cat-trust__label{white-space:normal;}
}
@media (max-width:560px){
  .je-cat-trust{flex-direction:column; align-items:flex-start; gap:12px;}
  .je-cat-trust__bodies{flex-direction:column; align-items:flex-start; gap:5px;}
  /* Stacked, a left rule would sit at the start of each line. */
  .je-cat-trust__body + .je-cat-trust__body{border-left:0; margin-left:0; padding-left:0;}
  .je-cat-trust__google{width:100%; justify-content:center;}
}

/* ---------- shared section heading ---------- */
/* Eyebrows in ochre, not green. The theme reserves green strictly for
   things you can click; using it on labels too made every section shout at
   the same volume as the buttons. */
.je-cat-eyebrow{
  font-family:var(--je-sans); font-size:12px; font-weight:700;
  letter-spacing:.14em; text-transform:uppercase;
  color:var(--je-ochre-text); display:inline-flex; align-items:center; gap:10px; margin-bottom:12px;
}
.je-cat-sec__head h2{
  font-family:var(--je-serif); font-weight:400;
  font-size:clamp(26px,3.2vw,36px); line-height:1.15;
  color:var(--je-primary); margin:0; max-width:13.2em /* was 22ch */;
}

/* ---------- what you get ---------- */
.je-cat-includes{padding:52px 0 8px;}
.je-cat-includes__grid{
  display:grid; grid-template-columns:repeat(4,1fr); gap:1px;
  background:var(--je-rule); border:1px solid var(--je-rule); margin-top:26px;
}
.je-cat-inc{background:var(--je-surface); padding:24px 22px;}
.je-cat-inc h3{font-family:var(--je-sans); font-weight:800; font-size:16px; color:var(--je-primary); margin:0 0 8px;}
.je-cat-inc p{font-family:var(--je-sans); font-size:14.5px; line-height:1.6; color:var(--je-muted); margin:0;}

/* ---------- how it works ---------- */
.je-cat-process{padding:52px 0 8px;}
.je-cat-process__list{display:flex; flex-direction:column; margin-top:26px;}
.je-cat-process__item{
  display:grid; grid-template-columns:70px 1fr; gap:22px;
  padding:20px 0; border-top:1px solid var(--je-rule);
}
.je-cat-process__item:last-child{border-bottom:1px solid var(--je-rule);}
.je-cat-process__num{font-family:var(--je-serif); font-size:28px; color:var(--je-green); opacity:1;}
.je-cat-process__item h3{font-family:var(--je-sans); font-weight:800; font-size:16.5px; color:var(--je-primary); margin:0 0 5px;}
.je-cat-process__item p{font-family:var(--je-sans); font-size:14.5px; color:var(--je-muted-deep); margin:0; max-width:39.7em /* was 62ch */;}

/* ---------- closing band ---------- */
/* The preview's final CTA is a rounded gradient panel running ochre into
   soil, not a flat dark slab. On a sand ground the gradient is what makes
   it read as a deliberate closing statement rather than a footer. */
.je-cat-band{
  background:linear-gradient(135deg, var(--je-ochre), var(--je-primary));
  color:var(--je-on-primary); text-align:center;
  padding:60px 32px; margin:56px 0 0; border-radius:20px;
}
.je-cat-band h2{
  font-family:var(--je-serif); font-weight:400;
  font-size:clamp(26px,3.4vw,38px); line-height:1.15;
  color:var(--je-on-primary); max-width:21.7em /* was 36ch */; margin:0 auto;
}
.je-cat-band p{
  font-family:var(--je-sans); font-size:15.5px; color:var(--je-on-primary); opacity:.85;
  margin:12px auto 0; max-width:30.8em /* was 48ch */;
}

/* ---------- product / subcategory tiles ----------
   Scoped by body.je-cat-designed, which the snippet adds only on
   configured pages - so this cannot touch a page not opted in, and no
   slug list has to be maintained here. */
body.je-cat-designed ul.products li.product-category{
  border:0; border-radius:14px; overflow:hidden;
  background:var(--je-surface);
  box-shadow:0 3px 14px rgba(60,50,20,.08);
  transition:box-shadow .2s ease, transform .2s ease;
}
body.je-cat-designed ul.products li.product-category:hover{
  box-shadow:0 14px 32px rgba(60,50,20,.18);
  transform:translateY(-3px);
}
body.je-cat-designed ul.products li.product-category a{display:block; text-decoration:none;}
body.je-cat-designed ul.products li.product-category img{
  width:100% !important; height:auto !important; aspect-ratio:16/10;
  object-fit:cover; display:block; margin:0 !important;
}
body.je-cat-designed ul.products li.product-category .woocommerce-loop-category__title{
  font-family:var(--je-serif) !important;
  font-size:21px !important; font-weight:400 !important;
  color:var(--je-primary) !important; text-align:left !important;
  padding:20px 24px 24px !important; margin:0 !important; line-height:1.2 !important;
}
/* The theme prints a raw product count after the title. Next to a styled
   heading it reads as a typo rather than as information. */
body.je-cat-designed ul.products li.product-category .woocommerce-loop-category__title mark.count{
  display:none !important;
}

/* Column counts come from body.je-tiles-N, set by the snippet from the
   actual number of subcategories. Explicit counts rather than
   auto-fit/minmax on purpose: auto-fit fits as many columns as will fit
   and then leaves the last row short, which looks like a mistake at 2 or
   3 tiles. Capped at 4 by the snippet, so 10 subcategories wrap 4/4/2. */
body.je-cat-designed.je-tiles-1 ul.products,
body.je-cat-designed.je-tiles-2 ul.products,
body.je-cat-designed.je-tiles-3 ul.products,
body.je-cat-designed.je-tiles-4 ul.products{
  display:grid !important; gap:26px !important; margin:0 !important;
}
body.je-cat-designed.je-tiles-1 ul.products{grid-template-columns:minmax(0,560px) !important;}
body.je-cat-designed.je-tiles-2 ul.products{grid-template-columns:repeat(2,1fr) !important;}
body.je-cat-designed.je-tiles-3 ul.products{grid-template-columns:repeat(3,1fr) !important;}
body.je-cat-designed.je-tiles-4 ul.products{grid-template-columns:repeat(4,1fr) !important;}

/* ---------- hero: desktop ---------- */
@media (min-width:1025px){
  .je-cat-hero{
    display:grid;
    grid-template-columns:minmax(0,1.1fr) minmax(320px,0.9fr);
    gap:clamp(40px,4vw,72px);
    /* stretch, never center, and no aspect-ratio on the photo: the photo
       takes its height from the text column, so the two sides cannot
       disagree. A fixed ratio fixes the photo's height while the text
       height stays fluid, and every mismatch shows up as dead space above
       and below the text - the bug that took several passes to kill on the
       branding page. */
    align-items:stretch;
  }
  .je-cat-hero--noimg{display:block;}
  /* max-width was 480px with margin-left:auto. The photo column is 0.9fr,
     around 780px on a wide screen, so the cap held the photo at 480 and
     the auto margin pinned it right - leaving roughly 300px of its own
     column empty between the text and the picture, which read as a hole
     in the hero rather than as spacing. The photo now fills its column
     and the grid gap is the only space between the two. */
  .je-cat-hero__photo{width:100%; max-width:none; min-height:400px;}

  /* The image must be OUT OF FLOW or it sets the row height instead of
     taking it. In flow at ~780px wide its intrinsic height exceeds the
     text column, grid sizes the row to fit it, and the text column is
     left with dead space below the buttons - which is exactly what
     widening the photo above exposed. height:100% cannot fix that: a
     percentage height against a parent whose height is being derived
     from this very element resolves to auto, so the image falls back to
     its natural proportions and drives the row again.

     Absolutely positioned it contributes no height at all and simply
     fills whatever box the grid hands it. The wrapper already carries
     position:relative and overflow:hidden, which is what makes this
     safe. Same fix the shop hero needed, for the same reason. */
  .je-cat-hero__photo img{
    position:absolute; inset:0;
    width:100%; height:100%; object-fit:cover;
  }

  /* Facts as a ruled band rather than four floating pairs. Across a
     950px column, flex with a 36px gap left them drifting mid-air with
     no relationship to each other; the rules give the row a top and a
     bottom and make it read as a spec block. */
  .je-cat-facts{
    display:grid; grid-template-columns:repeat(4,minmax(0,1fr)); gap:0;
    border-top:1px solid var(--je-rule);
    border-bottom:1px solid var(--je-rule);
  }
  .je-cat-fact{padding:18px 20px 18px 0;}
}

/* ---------- hero: mobile + tablet ---------- */
@media (max-width:1024px){
  .je-cat-hero{display:flex; flex-direction:column; gap:26px; padding-bottom:32px;}
  .je-cat-hero__text{gap:22px;}
  .je-cat-hero__text .archive-description{margin:12px 0 0 !important;}
  .je-cat-facts{gap:20px 28px;}
  .je-cat-fact b{font-size:19px;}
  .je-cat-fact span{font-size:10.5px;}
  .je-cat-hero__photo{width:100%; max-width:440px; margin-inline:auto; aspect-ratio:1/1;}
  .je-cat-cta .je-cat-btn{flex:1 1 180px;}
}

@media (max-width:900px){
  .je-cat-includes__grid{grid-template-columns:repeat(2,1fr);}
  body.je-cat-designed.je-tiles-3 ul.products,
  body.je-cat-designed.je-tiles-4 ul.products{grid-template-columns:repeat(2,1fr) !important;}
}
@media (max-width:560px){
  .je-cat-includes__grid{grid-template-columns:1fr;}
  .je-cat-process__item{grid-template-columns:46px 1fr;}
  .je-cat-band{padding:40px 20px;}
  .je-cat-clients{flex-direction:column; align-items:flex-start; gap:12px;}
  body.je-cat-designed.je-tiles-2 ul.products,
  body.je-cat-designed.je-tiles-3 ul.products,
  body.je-cat-designed.je-tiles-4 ul.products{grid-template-columns:1fr !important;}
}
/* ---------------------------------------------------------------------
   DEPTH PASS - spec table, gallery and FAQ. Added 31 Aug 2026.
   Markup from the same CATEGORY HUB ARCHIVE snippet. Kept inside the
   PHASE 6 block so the REVERT instruction at the top of it still removes
   the whole category design in one cut.
   --------------------------------------------------------------------- */

/* ---------- what we make ---------- */
.je-cat-specs{padding:52px 0 8px;}

/* Wide tables scroll INSIDE this wrapper. Without it the size grid makes
   the whole page scroll sideways on a phone, which is the one layout bug
   that makes a site feel broken rather than cramped. */
.je-cat-table__scroll{
  margin-top:26px;
  overflow-x:auto;
  -webkit-overflow-scrolling:touch;
}
.je-cat-table{
  width:100%; min-width:420px; border-collapse:collapse;
  background:var(--je-surface); border:1px solid var(--je-rule);
  font-family:var(--je-sans); font-size:14.5px;
}
.je-cat-table th,
.je-cat-table td{
  border:1px solid var(--je-rule);
  padding:12px 16px; text-align:left; vertical-align:top;
}
.je-cat-table thead th{
  font-weight:800; font-size:12px; letter-spacing:.1em; text-transform:uppercase;
  color:var(--je-ochre-text); background:var(--je-cream-deep); white-space:nowrap;
}
.je-cat-table tbody th{font-weight:800; color:var(--je-primary); white-space:nowrap;}
.je-cat-table tbody td{color:var(--je-muted-deep);}

/* Wider minimums so these two do not squash their columns before the
   wrapper starts scrolling. */
.je-cat-table--compare{min-width:660px;}
.je-cat-table--dispatch{min-width:330px;}

.je-cat-table__note{
  font-family:var(--je-sans); font-size:13px; line-height:1.55;
  color:var(--je-muted); margin:10px 0 0;
}

/* Same hairline-grid treatment as .je-cat-includes__grid, so the spec
   rows read as part of the same system rather than a new component. */
.je-cat-specs__rows{
  display:grid; grid-template-columns:repeat(2,1fr); gap:1px;
  background:var(--je-rule); border:1px solid var(--je-rule); margin:26px 0 0;
}
.je-cat-specs__row{background:var(--je-surface); padding:20px 22px;}
.je-cat-specs__row dt{
  font-family:var(--je-sans); font-weight:800; font-size:12px;
  letter-spacing:.1em; text-transform:uppercase;
  color:var(--je-ochre-text); margin:0 0 7px;
}
.je-cat-specs__row dd{
  font-family:var(--je-sans); font-size:14.5px; line-height:1.6;
  color:var(--je-muted-deep); margin:0;
}

/* The row count is 5 on juco and the shop page, 6 on jute and canvas.
   An odd count in a 2-column grid leaves a visible empty cell - the same
   auto-fit gap problem already hit once on this site. Spanning the final
   odd row across both columns closes it deterministically, and does
   nothing at all when the count is even. */
.je-cat-specs__row:last-child:nth-child(odd){grid-column:1 / -1;}

/* ---------- work we have done ---------- */
.je-cat-gallery{padding:52px 0 8px;}
.je-cat-gallery__grid{
  display:grid; grid-template-columns:repeat(3,1fr); gap:18px; margin-top:26px;
}
.je-cat-shot{
  margin:0; background:var(--je-surface);
  border:1px solid var(--je-rule); border-radius:14px; overflow:hidden;
}
/* Fixed ratio so a mixed set of phone and camera photographs still lines
   up in a grid instead of stepping raggedly down the page. */
.je-cat-shot img{
  display:block; width:100%; height:auto;
  aspect-ratio:4 / 3; object-fit:cover;
}
.je-cat-shot figcaption{
  font-family:var(--je-sans); font-size:13.5px; line-height:1.5;
  color:var(--je-muted-deep); padding:14px 16px;
}

/* ---------- questions ---------- */
.je-cat-faq{padding:52px 0 8px;}
.je-cat-faq__list{margin-top:26px; border-top:1px solid var(--je-rule);}
.je-cat-faq__item{border-bottom:1px solid var(--je-rule);}

.je-cat-faq__item summary{
  font-family:var(--je-sans); font-weight:800; font-size:16.5px;
  color:var(--je-primary);
  padding:20px 44px 20px 0; cursor:pointer;
  position:relative; list-style:none;
}
/* Both are needed: list-style covers Firefox, the pseudo-element covers
   WebKit. Leave one out and the browser's own triangle sits next to the
   custom +/- marker. */
.je-cat-faq__item summary::-webkit-details-marker{display:none;}

.je-cat-faq__item summary::after{
  content:"+";
  position:absolute; right:6px; top:50%; transform:translateY(-50%);
  font-family:var(--je-serif); font-size:24px; line-height:1;
  color:var(--je-green);
}
.je-cat-faq__item[open] summary::after{content:"\2212";}
.je-cat-faq__item summary:hover{color:var(--je-green-deep);}
.je-cat-faq__item summary:focus-visible{outline:2px solid var(--je-green); outline-offset:3px;}

.je-cat-faq__a{padding:0 44px 22px 0;}
.je-cat-faq__a p{
  font-family:var(--je-sans); font-size:14.5px; line-height:1.7;
  color:var(--je-muted-deep); margin:0 0 12px; max-width:44.9em /* was 70ch */;
}
.je-cat-faq__a p:last-child{margin-bottom:0;}
/* The dispatch table sits inside an answer, where the wrapper's own
   26px top margin would push it away from the sentence introducing it. */
.je-cat-faq__a .je-cat-table__scroll{margin:0 0 14px;}

/* ---------- shop page doors ----------
   /bags/ only. Two lines added inside each subcategory tile, turning it
   from a label into a routing decision.

   Scoped to descendants of the tile rather than to .product-details on
   purpose: the snippet hooks BOTH of WooCommerce's subcategory hooks,
   so depending on which one Kadence's template override still calls,
   these paragraphs land either inside that wrapper or as direct children
   of the <li>. Selecting on the tile covers both landing spots.

   Deliberately no text-align: it inherits from the tile, so the copy
   stays aligned with the category title however the theme sets it. */
body.je-cat-designed li.product-category .je-door__why{
  font-family:var(--je-sans); font-size:14px; line-height:1.6;
  color:var(--je-muted-deep);
  margin:10px 0 0;
}
body.je-cat-designed li.product-category .je-door__spec{
  font-family:var(--je-sans); font-weight:800; font-size:11.5px;
  letter-spacing:.09em; text-transform:uppercase;
  color:var(--je-ochre-text);
  margin:12px 0 0;
}
/* Only needed in the fallback case, where the paragraphs sit as direct
   children of the tile and so miss the wrapper's own side padding. */
body.je-cat-designed li.product-category > .je-door__why,
body.je-cat-designed li.product-category > .je-door__spec{
  padding-inline:18px;
}
body.je-cat-designed li.product-category > .je-door__spec{padding-bottom:18px;}

@media (max-width:900px){
  .je-cat-gallery__grid{grid-template-columns:repeat(2,1fr);}
}
@media (max-width:560px){
  .je-cat-specs__rows{grid-template-columns:1fr;}
  .je-cat-gallery__grid{grid-template-columns:1fr;}
  .je-cat-faq__item summary{font-size:15.5px; padding-right:38px;}
  .je-cat-faq__a{padding-right:0;}
}
/* ==========================================================================
   JE SHOP - /bags/ visual rework. 31 Aug 2026.

   Scoped ENTIRELY to body.woocommerce-shop. The 11 category pages are
   deliberately untouched - each page is being designed on its own terms
   now, so nothing in this block may leak sideways. Every selector here
   starts with body.woocommerce-shop for that reason, including the ones
   where it looks redundant.

   WHAT WAS WRONG. One flat sand surface from header to footer; every
   section at the same width, rhythm and type size; and a hero with no
   image at all, because the shop is not a category and so has no
   thumbnail to render. The page read as a single undifferentiated column
   with nothing for the eye to land on.

   THREE MOVES. Give the hero something to look at (a collage built from
   the fabric categories' own thumbnails). Lift the content sections onto
   paper panels so the page gains edges and rhythm. Raise the type scale,
   which was sized for a narrow column and looks timid at 1440px.
   ========================================================================== */

/* ---------- hero ---------- */
/* The shop hero now takes the ordinary single-photo path - the snippet
   supplies an image, so --noimg never applies here and the hero inherits
   the two-column grid the desktop breakpoint already gives it. */
body.woocommerce-shop .je-cat-hero{
  padding-bottom:56px;
}
body.woocommerce-shop .je-cat-hero__text{gap:30px;}

/* Was inheriting Kadence's archive title at ~32px, which on a 1440px
   canvas reads as a caption rather than a page title. */
body.woocommerce-shop h1.page-title.archive-title{
  font-family:var(--je-serif); font-weight:400;
  font-size:clamp(42px,4.6vw,64px); line-height:1.04;
  letter-spacing:-.015em; color:var(--je-ink);
  margin:0 !important;
}

/* 2x2 rather than the default 4-across row. In a half-width hero column
   four facts side by side gave each about 90px and wrapped every label
   onto three lines. The rules give them the structure the dashes used to
   fake. */
body.woocommerce-shop .je-cat-facts{
  display:grid; grid-template-columns:repeat(2,minmax(0,1fr));
  gap:0; border-top:1px solid var(--je-rule);
}
body.woocommerce-shop .je-cat-fact{
  padding:18px 20px 18px 0; border-bottom:1px solid var(--je-rule);
}
body.woocommerce-shop .je-cat-fact b{font-size:30px; line-height:1.1;}
body.woocommerce-shop .je-cat-fact span{font-size:12.5px;}

/* ---------- hero photo ---------- */
/* One photo, not the three-panel collage this briefly used. The three
   category thumbnails are watermarked promotional graphics with the
   category name baked into the artwork, so tiling them repeated the same
   wordmark three times across the hero. A single image also means the
   shop hero is chosen in the admin like every other hero on the site.

   The radius and shadow that used to be declared here are gone: the base
   rule was raised to these exact values for every hero, and two copies of
   one treatment is how the shop page and the category pages quietly drift
   apart. */

/* ---------- trust strip ---------- */
/* The shop page carries the same registration bar as everywhere else;
   only the spacing changes, because it sits between a taller hero and
   the three doors and needs more room than it does on a category page. */
body.woocommerce-shop .je-cat-trust{padding:26px 0; margin-bottom:38px;}

/* ---------- the doors ---------- */
/* Scoped to body.je-cat-designed, not the shop page. Every fabric hub is
   the same shape as /bags/: two subcategory tiles and no product cards.
   /bags/jute-bags/ shows Customised and Plain, and nothing else - so the
   tiles ARE the page, and they were still rendering as bare Kadence
   cards there while /bags/ had the designed ones. */
body.je-cat-designed ul.products li.product-category{
  border-radius:18px;
  box-shadow:0 4px 18px rgba(60,50,20,.07);
  transition:transform .22s ease, box-shadow .22s ease;
}
body.je-cat-designed ul.products li.product-category:hover{
  transform:translateY(-4px);
  box-shadow:0 16px 38px -14px rgba(60,50,20,.28);
}
body.je-cat-designed li.product-category .product-details{padding:26px 24px 24px;}

/* Serif, and roughly double the previous size. This is the page's primary
   navigation - three doors - and it was set at body weight. */
body.je-cat-designed li.product-category h2.woocommerce-loop-category__title{
  font-family:var(--je-serif); font-weight:400;
  font-size:27px; line-height:1.15; color:var(--je-ink);
  margin:0;
}
/* The count is useful but it is not part of the name. Demoted rather than
   hidden - a buyer deciding between 15 jute and 6 canvas products wants
   to know that. */
body.je-cat-designed li.product-category h2 mark.count{
  background:none; color:var(--je-muted); font-family:var(--je-sans);
  font-size:13px; font-weight:700; vertical-align:middle; margin-left:6px;
}
body.je-cat-designed li.product-category .je-door__why{
  font-size:14.5px; line-height:1.65; margin-top:14px;
}
body.je-cat-designed li.product-category .je-door__spec{
  margin-top:16px; padding-top:14px; border-top:1px solid var(--je-rule);
}
/* Reads as a link without being one - the whole tile is already the
   anchor, so adding a real link inside it would nest anchors. */
body.je-cat-designed li.product-category .je-door__spec::after{
  content:" \2192"; color:var(--je-green); font-size:14px;
}

/* ---------- content sections as panels ---------- */
/* The single highest-impact change on the page. Every section previously
   sat directly on the sand ground with 52px of padding and no edge, so
   nothing separated "what we make" from "why buyers come to us" except a
   heading. On paper panels the page gains rhythm and each section reads
   as a finished thing. */
body.woocommerce-shop .je-cat-specs,
body.woocommerce-shop .je-cat-includes,
body.woocommerce-shop .je-cat-process,
body.woocommerce-shop .je-cat-faq{
  background:var(--je-paper);
  border:1px solid var(--je-rule);
  border-radius:22px;
  padding:46px 44px;
  margin-top:30px;
}
body.woocommerce-shop .je-cat-sec__head h2{
  font-size:clamp(28px,3vw,40px); max-width:15.7em /* was 26ch */;
}

/* The includes grid draws its own hairlines from the ground colour behind
   it. On paper that ground is now white-ish, so the 1px gaps vanished -
   the cells need their own border instead. */
body.woocommerce-shop .je-cat-includes__grid{
  background:var(--je-rule);
  border:1px solid var(--je-rule);
}
body.woocommerce-shop .je-cat-inc{background:var(--je-paper);}
body.woocommerce-shop .je-cat-specs__rows{background:var(--je-rule);}
body.woocommerce-shop .je-cat-specs__row{background:var(--je-paper);}

/* ---------- the comparison table ---------- */
/* Was a full hairline grid, which reads as a spreadsheet. Horizontal rules
   only, generous rows, and a tinted stripe - the difference between data
   and a designed comparison. */
body.woocommerce-shop .je-cat-table{
  border:0; background:transparent; font-size:15px;
}
body.woocommerce-shop .je-cat-table th,
body.woocommerce-shop .je-cat-table td{
  border:0; border-bottom:1px solid var(--je-rule);
  padding:17px 20px;
}
body.woocommerce-shop .je-cat-table thead th{
  background:transparent;
  font-family:var(--je-sans); font-size:13px; font-weight:800;
  letter-spacing:.09em; color:var(--je-ink);
  border-bottom:2px solid var(--je-primary);
  padding-bottom:14px;
}
body.woocommerce-shop .je-cat-table tbody tr:nth-child(even) th,
body.woocommerce-shop .je-cat-table tbody tr:nth-child(even) td{
  background:var(--je-cream);
}
body.woocommerce-shop .je-cat-table tbody th{
  font-size:13px; letter-spacing:.04em; text-transform:uppercase;
  color:var(--je-muted-deep); white-space:normal; min-width:120px;
}
body.woocommerce-shop .je-cat-table tbody td{color:var(--je-primary);}
body.woocommerce-shop .je-cat-table tbody tr:last-child th,
body.woocommerce-shop .je-cat-table tbody tr:last-child td{border-bottom:0;}

/* ---------- process ---------- */
body.woocommerce-shop .je-cat-process__num{font-size:34px;}
body.woocommerce-shop .je-cat-process__item{padding:24px 0;}

/* ---------- closing band ---------- */
body.woocommerce-shop .je-cat-band{padding:76px 40px; margin-top:34px;}

@media (min-width:1025px){
  /* Wider than the 480px cap the single-photo hero uses - a collage needs
     the room, and this hero has no product grid competing with it. */
  body.woocommerce-shop .je-cat-hero{
    grid-template-columns:minmax(0,1fr) minmax(0,1.02fr);
    gap:60px;
    /* stretch, not center. Centred, the photo kept its own height and
       overhung the text column top and bottom, leaving a band of empty
       sand beside it at both ends. Stretched, the two columns start and
       finish on the same lines and the hero reads as one block. */
    align-items:stretch;
  }
  /* Wider than the 480px cap a category hero uses. This page has no
     product grid competing with the hero, so the photo can carry it.

     No height and no aspect-ratio: the box is a grid item, so
     align-items:stretch above already sizes it to the row, and the row is
     sized by the text column. Setting height:100% here is what broke the
     first attempt - a percentage height against a parent whose own height
     is not definite resolves to auto, the image fell back to its natural
     square proportions, and it drove the row height instead of following
     it. The photo then ran far below the buttons. */
  body.woocommerce-shop .je-cat-hero__photo{
    max-width:none; width:100%;
    aspect-ratio:auto; align-self:stretch;
    /* A floor, not a height. The text column is comfortably taller than
       this, so it never binds - it exists only so the photo cannot
       collapse to nothing if the hero copy is ever cut right back. */
    min-height:360px;
  }
  /* The out-of-flow image rule that lived here now sits in the base
     desktop block: the category heroes need it for the same reason, so
     it is declared once rather than fixed twice and wrong once. */
  /* Still painted above the image: it comes after it in the DOM, but say
     so explicitly rather than relying on that. */
  body.woocommerce-shop .je-cat-hero__photo .je-cat-tag{z-index:2;}
}

@media (max-width:1024px){
  body.woocommerce-shop .je-cat-specs,
  body.woocommerce-shop .je-cat-includes,
  body.woocommerce-shop .je-cat-process,
  body.woocommerce-shop .je-cat-faq{padding:36px 28px;}
}

@media (max-width:560px){
  body.woocommerce-shop .je-cat-facts{grid-template-columns:1fr;}
  body.woocommerce-shop .je-cat-hero__photo{aspect-ratio:4 / 3;}
  body.woocommerce-shop .je-cat-specs,
  body.woocommerce-shop .je-cat-includes,
  body.woocommerce-shop .je-cat-process,
  body.woocommerce-shop .je-cat-faq{
    padding:30px 20px; border-radius:16px;
  }
  body.woocommerce-shop .je-cat-band{padding:48px 22px;}
}
/* ================= END JE SHOP ================= */
/* ================= END OF JE PHASE 6 ================= */
/* ==========================================================================
   JE CART — header control + side panel
   Everything cart-related, kept in one block at the foot of the file.

   It sits LAST on purpose, and two rules here depend on that: the badge
   and the icon both re-declare properties JE HEADER T already sets, at
   equal specificity, so they win on document order alone. Moving this
   block above JE HEADER T silently reverts both. That is the same
   additive-override convention the Phase 3 corrections use rather than
   editing the earlier rule in place.

   ---- 1. the glyph was invisible ----
   JE HEADER T sets color/fill on the BUTTON, but Elementor paints the
   cart glyph from its own rule on the icon element,

     .elementor-menu-cart__toggle .elementor-button-icon{
       color:var(--toggle-button-icon-color,#69727d); }

   so the button's colour never reached it. Measured live, the glyph was
   still that default slate #69727D, which on the Soil header is 2.38:1 -
   effectively invisible, and the reported symptom was not being able to
   find the cart at all. Naming the icon element directly takes the
   rendered SVG to cream at 10.61:1. The glyph is an inline
   `svg.e-font-icon-svg` inheriting currentColor, so `color` is what
   actually moves it; `fill` is kept for the older icon-font markup
   Elementor still emits on some sites.

   ---- 2. the count badge ----
   Shape first, because that is what read as clumsy: it was a FIXED 17px
   circle with a 9.5px digit, which fits "5" and barely fits "50". This
   store's quantities are bulk - the live cart was showing 1000 - and four
   digits in a 17px circle either overflow or squash together. Now a pill:
   fixed height, width:auto, side padding. Measured across the real range:
   18px at "5", 23px at "50", 35px at "1000", 41px at "12000", no overflow
   at any of them, still a circle at one digit.
   Colour second. Green is the site's action colour and a count is not an
   action, so the badge was borrowing emphasis it should not have. White
   is 11.62:1 on the header and puts the digits at 17.05:1. The Soil ring
   stops the pill merging into the glyph where they overlap.

   ---- 3. the panel's option list ----
   Elementor lays it out as

     .elementor-menu-cart__product .variation{
       display:grid; grid-template-columns:max-content auto; }

   and max-content sizes the label column to the LONGEST label in the
   list. Here that is "Single Color Screen Print:" at 167px inside a 310px
   box, so every value is left about 70px no matter how short its own
   label is. Measured on the live panel: all six values exactly 70px wide,
   "L- 16x14 Inches" wrapping to two lines, an uploaded filename to 134px
   of stacked fragments. That is the "unable to view clearly" report.

   The trap is that it looks like clipping and is not - a sweep for
   scrollWidth greater than clientWidth across the whole panel returned
   zero elements. Nothing overflows; the values are simply allotted a
   column too narrow to sit on one line. Chasing it as an overflow, width
   or colour problem leads nowhere.

   Stacking each pair removes the shared column entirely, so no label can
   starve a value again however long it gets, and it scales to however
   many Barn2 option fields a product carries (this one has six).
   Re-measured after: every value 156px on one line, filename block down
   from 134px to 49px.

   The float:none/clear:both resets are belt-and-braces - WooCommerce
   floats this same dl.variation on other surfaces, so they keep the
   block correct if Elementor's grid rule is ever dropped.

   Scoped to the menu cart throughout. dl.variation is also emitted on
   the cart page, the checkout review and order emails, where the layout
   has room to work and is not ours to change.
   ========================================================================== */

/* ---- header: glyph ---- */
header.elementor-location-header .elementor-menu-cart__toggle_button i,
header.elementor-location-header .elementor-menu-cart__toggle_button svg,
header.elementor-location-header .elementor-menu-cart__toggle_button .elementor-button-icon{
  color:var(--je-on-primary) !important;
  fill:var(--je-on-primary) !important;
}

/* ---- header: count badge ---- */
header.elementor-location-header .elementor-button-icon-qty{
  background:var(--je-white) !important;
  color:var(--je-ink) !important;
  font-family:var(--je-sans) !important;
  font-size:10.5px !important;
  font-weight:700 !important;
  letter-spacing:0 !important;
  min-width:18px !important;
  width:auto !important;
  height:18px !important;
  line-height:18px !important;
  padding:0 5px !important;
  border-radius:9px !important;
  top:-7px !important;
  right:-7px !important;
  box-shadow:0 0 0 2px var(--je-primary) !important;
}

/* ---- panel shell ----
   Paper, not Cream, deliberately: the panel sits ON TOP of the page, and
   on category and product pages the ground is already Sand. Cream against
   Sand is too close to read as a separate layer - the panel would look
   like a torn piece of the page rather than a surface above it. Paper is
   the lightest ground in the palette and separates from both. */
.elementor-menu-cart__main{
  font-family:var(--je-sans) !important;
  color:var(--je-ink) !important;
  background:var(--je-paper) !important;
  border-left:1px solid var(--je-rule) !important;
}
.elementor-menu-cart__main .elementor-menu-cart__close-button{
  color:var(--je-muted-deep) !important;
  fill:var(--je-muted-deep) !important;
}
.elementor-menu-cart__main .elementor-menu-cart__close-button:hover{
  color:var(--je-primary) !important;
  fill:var(--je-primary) !important;
}

/* Row separator - the panel had none, so with six option lines per item a
   second item would run straight into the first. */
.elementor-menu-cart__product{
  border-bottom:1px solid var(--je-rule) !important;
  padding-bottom:16px !important;
  margin-bottom:16px !important;
}

/* ---- line item name ---- */
.elementor-menu-cart__product .elementor-menu-cart__product-name a{
  font-family:var(--je-sans) !important;
  font-size:14px !important;
  font-weight:700 !important;
  line-height:1.35 !important;
  color:var(--je-primary) !important;
  text-decoration:none !important;
}

/* ---- option list: Elementor's two-column grid out, stacked pairs in ---- */
.elementor-menu-cart__product dl.variation{
  display:block !important;
  margin:10px 0 0 !important;
  padding:0 !important;
}
.elementor-menu-cart__product dl.variation dt,
.elementor-menu-cart__product dl.variation dd{
  float:none !important;
  clear:both !important;
  display:block !important;
  width:auto !important;
  max-width:none !important;
  margin:0 !important;
  padding:0 !important;
}
.elementor-menu-cart__product dl.variation dt{
  font-size:10.5px !important;
  font-weight:700 !important;
  letter-spacing:.10em !important;
  text-transform:uppercase !important;
  color:var(--je-muted-deep) !important;
  margin-top:9px !important;
}
.elementor-menu-cart__product dl.variation dd{
  font-size:13.5px !important;
  line-height:1.45 !important;
  color:var(--je-ink) !important;
}
.elementor-menu-cart__product dl.variation dd p{
  margin:0 !important;
  padding:0 !important;
}

/* ---- uploaded file: thumbnail beside a wrapping filename ----
   Barn2 emits a 120px-wide img and the filename as one unbroken token, so
   it needs both an explicit thumbnail size and break-word - otherwise the
   filename alone re-creates the single-character column this block exists
   to remove. */
.elementor-menu-cart__product ul.file_upload-meta{
  margin:0 !important;
  padding:0 !important;
  list-style:none !important;
}
.elementor-menu-cart__product .file_upload-meta-item > a{
  display:flex !important;
  align-items:center !important;
  gap:9px !important;
  text-decoration:none !important;
}
.elementor-menu-cart__product img.file_upload-meta-img{
  width:34px !important;
  height:34px !important;
  object-fit:cover !important;
  flex:0 0 auto !important;
  border:1px solid var(--je-rule) !important;
  border-radius:4px !important;
}
.elementor-menu-cart__product .file_upload-meta-label{
  font-size:12px !important;
  line-height:1.35 !important;
  color:var(--je-muted-deep) !important;
  overflow-wrap:anywhere !important;
  word-break:break-word !important;
}

/* ---- edit options link ---- */
.elementor-menu-cart__product .wpo-edit-options-link{
  font-size:12px !important;
  font-weight:700 !important;
  color:var(--je-ochre-text) !important;
  text-decoration:none !important;
}
.elementor-menu-cart__product .wpo-edit-options-link:hover{
  color:var(--je-primary) !important;
  text-decoration:underline !important;
}

/* ---- quantity x price ---- */
.elementor-menu-cart__product .elementor-menu-cart__product-price{
  font-size:13.5px !important;
  color:var(--je-primary) !important;
  margin-top:10px !important;
}

/* ---- subtotal ---- */
.elementor-menu-cart__main .elementor-menu-cart__subtotal{
  font-family:var(--je-sans) !important;
  color:var(--je-primary) !important;
  font-size:16px !important;
  border-top:1px solid var(--je-rule) !important;
  padding-top:14px !important;
}

/* ---- footer buttons ----
   Checkout is the one action on this panel, so it takes the green and
   View cart steps back to an outline. Dark text on the green fill, per
   the site rule - #03AC13 is bright and white on it is the weakest
   pairing available. */
.elementor-menu-cart__footer-buttons a.elementor-button{
  font-family:var(--je-sans) !important;
  font-weight:700 !important;
  font-size:14px !important;
  border-radius:8px !important;
  padding:13px 18px !important;
}
.elementor-menu-cart__footer-buttons a.elementor-button--checkout{
  background:var(--je-green) !important;
  color:var(--je-primary) !important;
  border:1px solid var(--je-green) !important;
}
.elementor-menu-cart__footer-buttons a.elementor-button--checkout:hover{
  background:var(--je-green-deep) !important;
  border-color:var(--je-green-deep) !important;
  color:var(--je-white) !important;
}
.elementor-menu-cart__footer-buttons a.elementor-button--view-cart{
  background:transparent !important;
  color:var(--je-primary) !important;
  border:1px solid var(--je-rule) !important;
}
.elementor-menu-cart__footer-buttons a.elementor-button--view-cart:hover{
  background:var(--je-surface) !important;
  border-color:var(--je-muted) !important;
  color:var(--je-primary) !important;
}

/* ---- the WhatsApp bubble collides with Checkout ----
   Joinchat is fixed at the bottom-right, exactly where the panel's
   Checkout button lands, so the bubble sits over the primary action.
   Hidden only while the panel is open; it returns on close.

   visibility:hidden is doing the real work here and must stay. opacity
   and pointer-events alone hide the button from sight and from the mouse
   but leave it in the tab order - measured: focusable with those two
   alone, not focusable once visibility:hidden is added. Without it a
   keyboard user tabbing through the open panel lands on an invisible
   control and can still fire it. */
body:has(.elementor-widget-woocommerce-menu-cart.elementor-menu-cart--shown) .joinchat{
  visibility:hidden !important;
  opacity:0 !important;
  pointer-events:none !important;
}

/* ---- the add-to-cart banner is redundant once the panel auto-opens ----
   The side panel now opens by itself on add-to-cart (the Code block in
   Elementor > Custom Elements), and it already shows the line item, the
   options, the subtotal and a Checkout button. The green
   "... have been added to your cart / View cart" banner repeats all of
   that from behind the panel.

   HIDDEN WITH CSS, NOT REMOVED - and that is load-bearing. The auto-open
   script decides whether to fire by READING this notice's text on page
   load, because the product pages reload rather than adding by AJAX.
   display:none keeps the element in the DOM and textContent still
   resolves, so the trigger is unaffected. If the notice is ever
   suppressed server-side instead (a wc_add_notice filter, or a template
   edit), the auto-open loses its only trigger on the reload path and
   stops working with nothing visibly wrong. Change one, check the other.

   Scoped to single-product on purpose: .woocommerce-message also carries
   "Cart updated", coupon and login messages on the cart and account
   pages, and those must stay visible. */
body.single-product .woocommerce-message{
  display:none !important;
}

/* ---- panel width ----
   Kept as its own rule at the foot of the block rather than folded into
   the .elementor-menu-cart__main shell rule above. Same selector, later in
   the file, so it wins on order - and it means the width can be tuned or
   removed without editing a rule that also carries the panel's colours.

   Elementor ships a flat width:350px, which is narrow for this cart: the
   line items carry six Barn2 option rows plus a file thumbnail, and that
   350px is what forced the long values to wrap in the first place.

   clamp rather than a bare 30vw, because a pure viewport unit fails at
   both ends - 30vw is only 230px on a tablet, NARROWER than the default it
   replaces, and 768px on a 2560px monitor, wide enough to read as a second
   page. The floor keeps it usable on small screens, the ceiling keeps it a
   panel. Elementor's max-width:100% is preserved below the floor, so a
   375px phone gets full width rather than an overflow.

   Resolved: 1920 -> 576px (30%), 1440 -> 432px (30%), 1280 -> 400px (31%),
   1024 -> 400px (39%), 768 -> 400px (52%), below ~400px -> full width.

   MIN-WIDTH IS NOT A DUPLICATE - do not delete it as one. `width` alone
   does nothing on this element: measured as a stylesheet rule with
   !important AND as an inline !important style, the box stayed at 350px,
   while `height` set the same way applied immediately - so it is the width
   property specifically being disregarded, not the element ignoring
   styles. min-width to the same value DOES take effect (the used width
   followed it and the computed `left` recalculated to match), so min-width
   is what actually widens the panel. Both are declared in case whatever is
   overriding `width` changes in a future Elementor release; they resolve
   to the same value, so the panel cannot end up two different widths.

   The open/close animation is translateX(100%) - a percentage of the
   element's own width - so it keeps working at whatever width is set. */
.elementor-menu-cart__main{
  width:clamp(400px, 30vw, 600px) !important;
  min-width:clamp(400px, 30vw, 600px) !important;
  max-width:100% !important;
}
/* ================= END JE CART ================= */

/* ==========================================================================
   JE MOBILE FIXES — swatch tooltip, duplicate Required, dropzone width
   Three defects reported from a phone on 29 Aug 2026 and reproduced at
   375px. All three are plugin output colliding with the Phase 3 order
   desk, none is the price ladder or the chip shortening - both of those
   were checked first and are correct.

   Loads LAST so these win on document order over the Phase 3 Barn2 block
   they adjust, per the same additive convention used throughout.
   ========================================================================== */

/* ---- 1. Variation Swatches tooltip ----
   The reported "overlapping text" was NOT a broken chip. Measured on the
   live page: every chip shortens correctly (the XS chip carries
   data-je="XS" and renders "XS" over "10x8x5 in"). The overlap is the
   swatch plugin's tooltip, which is a PSEUDO-ELEMENT on the li, not an
   appended node:

     li::before  content:"XS- 10x8x5 Inches "   position:absolute
     li::after   content:" "                     (the arrow)

   Enabled by the wvs-tooltip body class, and wvs-mobile means it fires on
   touch - so on a phone it pops the RAW attribute value across its
   neighbours, which is precisely the string the chip shortening exists to
   replace. It is also pure redundancy here: the chip's own sub-line
   already shows those dimensions.

   Safe to remove both pseudo-elements: nothing in this stylesheet uses
   ::before/::after on these li elements - the segmented control draws its
   dividers with border-right, and the sub-line is a real span
   (.je-chip__sub) inside the button.

   NOTE the li also carries title="XS- 10x8x5 Inches", which CSS cannot
   remove. That produces a native browser tooltip on DESKTOP hover only -
   it does not fire on touch, so it is not part of this bug, and it is
   left in place because it is a useful accessible-name fallback.

   SCOPED TO THE MOBILE BREAKPOINT ON PURPOSE - an earlier version of
   this rule was unscoped and removed the tooltip from every swatch at
   every width, which is far wider than the defect being fixed.

   The pseudo-element is HOVER/TAP triggered, not always painted:
   getComputedStyle reports content:none on every list until the pointer
   is actually over a chip, and it only measured as
   "XXS- 6x8x4 Inches" once, on a probe taken while the pointer happened
   to rest on that chip. That is exactly why it is a touch problem and
   not a desktop one - with a mouse it appears on hover and vanishes on
   leave, sitting above a chip with room around it; on a phone the same
   hover state latches on tap and there is no "leave", so the raw string
   stays parked across its neighbours. Desktop keeps the plugin's
   behaviour untouched.

   Keyed on the width rather than the plugin's own body.wvs-mobile flag:
   that class is set from touch detection, which is also true of
   touchscreen laptops and of an emulated viewport, so it does not
   reliably mean "small screen". 1024px is the breakpoint the header
   blocks already use for the desktop/mobile split.

   All attributes, not only size: on touch the latching applies to the
   closure and print rows too. Their values are short enough that nobody
   has reported it, but the failure mode is identical and excluding them
   would be arbitrary. */
@media (max-width:1024px){
  body.single-product ul.single-product-variable-items li.variable-item::before,
  body.single-product ul.single-product-variable-items li.variable-item::after{
    content:none !important;
    display:none !important;
  }
}

/* ---- 2. "Required" printed twice on Upload Your File ----
   Measured: that field contains TWO .wpo-field-required-symbol elements -
   one inside p.wpo-option-name (the heading, correct) and a second loose
   one with no class on its parent. NEED IT BY and Color carry one each,
   which is why only the upload field showed it doubled.

   The duplicate element is Barn2's; what made it VISIBLE is our own rule
   turning every such symbol into the word "Required" via ::after. So the
   fix belongs here, not in the plugin.

   Hide-all-then-restore rather than trying to name the stray one: its
   parent carries no class, so any selector describing it would be a guess
   about markup we do not control. Restoring only the heading copy is
   deterministic wherever the duplicate happens to sit. display:none also
   suppresses that element's ::after, so no second "Required" is painted. */
body.single-product .wpo-field .wpo-field-required-symbol{
  display:none !important;
}
body.single-product .wpo-field p.wpo-option-name .wpo-field-required-symbol{
  display:inline !important;
}

/* ---- 3. File upload dropzone overflowed its column ----
   Measured at 375px: the dropzone computed to a FIXED width:320px inside
   a 279px form - 62px past the card's right edge. It did not scroll the
   page (scrollWidth == clientWidth == 375), so it was being clipped,
   which is why it read as running off the card rather than as an
   overflow.

   The Phase 3 Barn2 block styles this element's padding, background and
   border but never constrained its width, so Dropzone's own hardcoded
   size won. box-sizing is restated because the padding above is set in
   px and must stay inside the 100%.

   MIN-WIDTH IS THE ONE THAT ACTUALLY MATTERS - do not drop it as
   redundant. Measured: the element computes min-width:320px, and the
   first attempt at this fix set only width:100% !important and changed
   nothing, because a min-width floors the box whatever width says. The
   element already had max-width:100% and was still 320px wide, since
   min-width beats max-width per spec. Same trap as the cart panel block
   at the end of this file, in the opposite direction: there min-width is
   what widens the box, here it is what refuses to let it shrink. */
body.single-product .wpo-file-dropzone{
  min-width:0 !important;
  width:100% !important;
  max-width:100% !important;
  box-sizing:border-box !important;
}
/* ---- 4. size chips overflowed their own columns on phones ----
   The reported clipped dimensions ("4x12x5" where the term says
   "14x12x5") were not a text problem. Measured at 360px on a 6-size Juco
   product:

     li  (one column)  72px    <- flex: 0 0 calc(33.333% - 1px) of a 222px list
     span min-width    88px    <- 16px WIDER than the column holding it
     sub-line text     80px    <- against ~46px of content box after padding

   So each chip's inner span was laid out 16px wider than its own cell and
   the dimension line ran under its neighbours. The list carries
   overflow:hidden, so the outer columns lost characters to the clip -
   which reads as a truncation bug and is actually an overflow one.

   min-width:88px is not wrong in itself; it was written for the canvas
   M / L / XL row, where the list sizes to its content and a wider floor
   gives a comfortable tap target. It only misbehaves once the 4+-chip
   rule forces fixed 33.333% columns, which is a layout the min-width
   predates.

   Dropping to TWO columns below 520px rather than shrinking type: 6
   chips wrap 2x3 evenly, and at 109px per column the longest sub-line
   (80px) fits with room to spare. Squeezing three columns would have
   needed roughly a 10px mono face to fit, which is below the size the
   rest of this page treats as legible. min-width:0 is required as well -
   without it the 88px floor simply re-creates the same overflow in a
   wider column.

   The divider moves with the column count: :nth-child(n+4) marks row two
   of a 3-column grid, :nth-child(n+3) does the same job for 2 columns. */
@media (max-width:520px){
  body.single-product ul[data-attribute_name^="attribute_size"]:has(li.variable-item:nth-child(4))
    li.variable-item.button-variable-item{
    flex:0 0 calc(50% - 1px) !important;
  }
  body.single-product ul[data-attribute_name^="attribute_size"]:has(li.variable-item:nth-child(4))
    li.variable-item.button-variable-item .variable-item-span-button{
    min-width:0 !important;
    padding:10px 8px !important;
  }
  body.single-product ul[data-attribute_name^="attribute_size"]:has(li.variable-item:nth-child(4))
    li.variable-item.button-variable-item:nth-child(n+4){
    border-top:0 !important;
  }
  body.single-product ul[data-attribute_name^="attribute_size"]:has(li.variable-item:nth-child(4))
    li.variable-item.button-variable-item:nth-child(n+3){
    border-top:1px solid var(--je-rule) !important;
  }

  /* The right edge moves with the column count too. At two columns item 3
     is back in the LEFT column and needs its divider returned, while
     items 2, 4 and 6 are now the edge and must lose theirs. Declared in
     this order on purpose: item 6 matches both, and the later rule wins
     at equal specificity - which is the answer we want, since it is also
     :last-child. */
  body.single-product ul[data-attribute_name^="attribute_size"]:has(li.variable-item:nth-child(4))
    li.variable-item.button-variable-item:nth-child(3n){
    border-right:1px solid var(--je-rule) !important;
  }
  body.single-product ul[data-attribute_name^="attribute_size"]:has(li.variable-item:nth-child(4))
    li.variable-item.button-variable-item:nth-child(2n){
    border-right:0 !important;
  }
}
/* ================= END JE MOBILE FIXES ================= */

/* ==========================================================================
   JE HOME - the rebuilt homepage, September 2026.

   Markup lives in Elementor HTML widgets, one per section:
   elementor/home-2026-09.html in the repo. Preview:
   https://claude.ai/code/artifact/54750a30-4753-42e1-a1af-872496f86229

   Everything is prefixed .je-h so it cannot collide with the ~4,900 lines
   above it, and every colour and face comes from the --je-* tokens declared
   in JE TOKENS at the top of this file. No new palette: the homepage is the
   same design system as the category and product pages, which is the whole
   point of it not looking like a different site.

   PLACED LAST, deliberately, and this does NOT disturb the JE CART rule.
   JE CART has to sit after JE HEADER T because the two re-declare the same
   badge and glyph properties at equal specificity, and document order decides
   the winner. Nothing in this block touches the header or the cart, so
   appending after it changes no outcome - and being last means Elementor's
   own container styles cannot quietly out-order these rules.

   Each section paints its own background and vertical padding. The
   Elementor container holding it exists only to hold it, so the rules just
   below .je-h-wrap zero every container that has a block inside - measured
   live on 8 Sep 2026, the first build left 10-40px of page-coloured gap
   between bands wherever a container kept Elementor's default padding or a
   nested child container. Enforcing it here means the bands stay flush no
   matter how the containers were set by hand.

   REVERT: delete from this header to the END JE HOME marker.
   ========================================================================== */

.je-h{
  font-family:var(--je-sans);
  font-size:16px;
  line-height:1.6;
  color:var(--je-soil);
  background:var(--je-paper);
  padding:64px 0;
}
.je-h *{box-sizing:border-box;}
.je-h img{max-width:100%;display:block;height:auto;}
/* Same 1880px measure as .content-container.site-container (JE SITE block
   at the top of this file), so the homepage lines up with the header, the
   category pages and the footer instead of sitting in a narrower column.
   Krishna, 8 Sep 2026: "not full width as we set?" - it was 1120px.
   Reading measures are capped per element below, not here: a 1880px band
   is fine, an 1880px paragraph is not. */
.je-h-wrap{max-width:1880px;margin:0 auto;padding:0 22px;}
.je-h-door p{max-width:39.7em /* was 62ch */;}
.je-h-fab p{max-width:30.8em /* was 48ch */;}
.je-h-startcol p{max-width:33.3em /* was 52ch */;}
.je-h-define p:not(.je-h-eyebrow){max-width:51.3em /* was 80ch */;}
.je-h-promise{max-width:50em /* was 78ch */;}
.je-h-proof{max-width:44.9em /* was 70ch */;}
/* Inline text links carry an underline as well as the colour - Lighthouse
   flagged "links rely on colour to be distinguishable" (8 Sep 2026), and a
   colour-blind buyer should still find the WhatsApp link in a sentence.
   Buttons and tiles carry a class and are left alone. */
.je-h a:not([class]){text-decoration:underline;text-underline-offset:3px;text-decoration-thickness:1px;}

/* The container is a holder, nothing more. Elementor gives every container
   10px padding and a 20px element gap by default, and a nested child
   container doubles it; each shows up as a stripe of page background between
   two bands. :has() is supported in every current browser; an old one just
   keeps the gap. */
.e-con:has(.je-h),
.e-con-inner:has(.je-h),
.elementor-widget-html:has(.je-h){
  padding:0 !important;
  margin:0 !important;
  min-height:0 !important;
  gap:0 !important;
}
/* A "Boxed" container wraps its widget in .e-con-inner, capped at
   Elementor's content width (1140px) and centred by margin:auto. The rule
   above zeroes that margin, which on 8 Sep 2026 left seven bands 1140px
   wide and pinned to the left edge on any screen wider than that - the
   section paints its background only as wide as the box it sits in. Let the
   inner wrapper span the page; .je-h-wrap does the centring. Measured live
   at 1920px: every band 0 to 1905, content centred at 393. */
.e-con-inner:has(.je-h){
  max-width:none !important;
  width:100% !important;
}

/* Band backgrounds. The alternation is what gives the page rhythm - without
   it the whole homepage is one flat field and the eye has nowhere to rest,
   which was the single biggest complaint about the category pages before
   they were panelled. */
.je-h-band-cream{background:var(--je-cream);}
.je-h-band-sand{background:var(--je-sand);}
.je-h-soonband{padding:38px 0;}

/* ---------- shared type ---------- */
.je-h-eyebrow{
  font-family:var(--je-mono);font-size:11px;letter-spacing:.13em;
  text-transform:uppercase;color:var(--je-ochre-text);margin:0 0 12px !important;
}
.je-h-eyebrow--tight{margin-bottom:6px !important;}
.je-h h2{
  font-family:var(--je-serif) !important;font-weight:400 !important;
  font-size:clamp(25px,3.4vw,34px) !important;line-height:1.14 !important;
  color:var(--je-ink) !important;margin:0 0 8px !important;text-wrap:balance;
}
.je-h h3{
  font-family:var(--je-sans) !important;font-weight:800 !important;
  font-size:17px !important;color:var(--je-ink) !important;margin:0 0 6px !important;
}
.je-h p{margin:0 0 14px;}
.je-h a{color:var(--je-green-deep);}
.je-h a:focus-visible,.je-h .je-h-btn:focus-visible{
  outline:2px solid var(--je-green);outline-offset:3px;
}
.je-h-lede{max-width:42.3em /* was 66ch */;}
.je-h-fine{font-size:14px;color:var(--je-muted-deep);}

/* ---------- buttons ---------- */
.je-h-btn{
  display:inline-block;font-weight:800;font-size:15px;padding:14px 24px;
  border-radius:8px;text-decoration:none;border:1.5px solid transparent;
}
/* White at weight 800 on the green fill, for the same contrast reason the
   category CTAs carry it: Soil on #03AC13 measures 3.83:1, short of the
   4.5:1 AA wants for normal text. */
.je-h-btn--primary{background:var(--je-green);color:var(--je-white) !important;border-color:var(--je-green);}
.je-h-btn--ghost{background:transparent;color:var(--je-ink) !important;border-color:var(--je-ink);}

/* ---------- hero ---------- */
.je-h-hero{padding:60px 0 56px;}
.je-h-hero .je-h-wrap{
  display:grid;grid-template-columns:minmax(0,1.02fr) minmax(0,1fr);
  gap:clamp(28px,4vw,60px);align-items:center;
}
.je-h-hero h1{
  font-family:var(--je-serif) !important;font-weight:400 !important;
  font-size:clamp(31px,4.4vw,50px) !important;line-height:1.06 !important;
  letter-spacing:-.01em;color:var(--je-ink) !important;margin:0 0 18px !important;
  text-wrap:balance;
}
.je-h-sub{font-size:17px;line-height:1.6;max-width:33.3em /* was 52ch */;margin:0 0 24px;}
.je-h-cta{display:flex;gap:12px;flex-wrap:wrap;margin-bottom:22px;}
.je-h-proof{
  font-size:13.5px;color:var(--je-muted-deep);line-height:1.75;
  border-top:1px solid var(--je-rule);padding-top:16px;margin:0;
}
/* aspect-ratio on the frame, object-fit on the image: the photo is cropped to
   the frame rather than the frame growing to the photo, so a replacement
   image of any proportion cannot change the hero height. */
.je-h-shot{
  position:relative;margin:0;border-radius:16px;overflow:hidden;
  background:var(--je-cream-deep);aspect-ratio:4/3;
  box-shadow:0 22px 48px -22px rgba(36,26,18,.42);
}
.je-h-shot img{width:100%;height:100%;object-fit:cover;}
.je-h-shot figcaption{
  position:absolute;left:12px;bottom:12px;background:rgba(36,26,18,.72);
  color:var(--je-white);font-family:var(--je-mono);font-size:10px;
  letter-spacing:.1em;text-transform:uppercase;padding:6px 11px;border-radius:999px;
}

/* ---------- two doors ---------- */
.je-h-doors{display:grid;grid-template-columns:2fr 1fr;gap:20px;margin-top:30px;}
.je-h-door{
  background:var(--je-paper);border:1px solid var(--je-rule);border-radius:16px;
  padding:26px 26px 24px;display:flex;flex-direction:column;
}
.je-h-door--main{background:var(--je-cream);}
/* The rules block is the whole point of the doors: a business buyer must
   never read the event minimum as his, so each card states its own. */
.je-h-rules{
  font-family:var(--je-mono);font-size:12.5px;color:var(--je-ochre-text);
  border-top:1px solid var(--je-rule);border-bottom:1px solid var(--je-rule);
  padding:12px 0;margin:16px 0;
}
.je-h-rules span{display:block;}
.je-h-door .je-h-btn{margin-top:auto;align-self:flex-start;}
.je-h-after{font-size:13.5px;color:var(--je-muted-deep);margin:12px 0 0;}

/* ---------- price and dispatch tables ---------- */
/* Two explicit columns rather than auto-fit: two cards in an auto-fit track
   sit alone on a row at some widths, which reads as a layout fault. */
.je-h-tables{display:grid;grid-template-columns:1fr 1fr;gap:18px;margin-top:26px;max-width:800px;}
.je-h-tbl{background:var(--je-paper);border:1px solid var(--je-rule);border-radius:14px;overflow:hidden;}
.je-h-tbl h3{
  font-family:var(--je-mono) !important;font-size:11px !important;
  letter-spacing:.11em;text-transform:uppercase;color:var(--je-ochre-text) !important;
  font-weight:500 !important;padding:14px 18px 0;margin:0 !important;
}
.je-h-tbl__sub{font-size:13px;color:var(--je-muted-deep);padding:4px 18px 12px;margin:0;}
.je-h-tbl table{border-collapse:collapse;width:100%;font-size:14.5px;}
.je-h-tbl td{padding:9px 18px;border-top:1px solid var(--je-rule);vertical-align:top;}
.je-h-tbl td:first-child{
  font-variant-numeric:tabular-nums;color:var(--je-ink);font-weight:600;white-space:nowrap;
}
.je-h-tbl td:last-child{text-align:right;}
.je-h-tbl tr:last-child td{color:var(--je-muted-deep);}

/* The definition block is the one dark object on the page. It earns that:
   dispatch-versus-delivery is the distinction the whole site now turns on,
   and it should not read as another paragraph. */
.je-h-define{
  background:var(--je-ink);color:var(--je-cream);border-radius:14px;
  padding:26px 28px;margin:22px 0 0;
}
.je-h-define .je-h-eyebrow{color:var(--je-ochre-on-dark);margin-bottom:10px !important;}
/* :not(): the eyebrow is a <p> in the same box and must keep its DM Mono
   face; without it this rule outweighs .je-h-eyebrow and sets the eyebrow
   in serif capitals (measured live, 8 Sep 2026). */
.je-h-define p:not(.je-h-eyebrow){
  font-family:var(--je-serif);font-size:18px;line-height:1.5;margin:0;color:var(--je-cream);
}
.je-h-terms{
  display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));
  gap:10px 26px;margin-top:22px;font-size:14px;color:var(--je-muted-deep);
}

/* ---------- three fabrics ---------- */
.je-h-fabrics{display:grid;grid-template-columns:repeat(3,1fr);gap:20px;margin-top:28px;}
.je-h-fab{
  background:var(--je-paper);border:1px solid var(--je-rule);border-radius:14px;
  overflow:hidden;text-decoration:none;color:inherit;display:block;
  transition:transform .22s ease,box-shadow .22s ease;
}
.je-h-fab:hover{transform:translateY(-4px);box-shadow:0 16px 38px -14px rgba(60,50,20,.28);}
.je-h-fab img{aspect-ratio:1/1;object-fit:cover;width:100%;}
.je-h-fab__body{padding:18px 20px 20px;}
.je-h-fab__name{
  font-family:var(--je-mono);font-size:11.5px;letter-spacing:.13em;
  text-transform:uppercase;color:var(--je-ochre-text);margin:0 0 8px;
}
.je-h-fab p{font-size:14.5px;line-height:1.55;margin:0;color:var(--je-soil);}
.je-h-fab__go{color:var(--je-green-deep);font-weight:700;font-size:14px;margin-top:12px;display:block;}
.je-h-fabnote{font-size:14.5px;color:var(--je-muted-deep);margin:20px 0 0;text-align:center;}

/* ---------- how an order runs ---------- */
/* Numbered because it IS a sequence - each step depends on the one before,
   and the buyer is being told when money changes hands relative to approval. */
.je-h-run{list-style:none;padding:0;margin:26px 0 0;counter-reset:jehstep;}
.je-h-run li{
  counter-increment:jehstep;display:grid;grid-template-columns:52px 1fr;gap:18px;
  padding:20px 0;border-top:1px solid var(--je-rule);
}
.je-h-run li:last-child{border-bottom:1px solid var(--je-rule);}
.je-h-run li::before{
  content:counter(jehstep);font-family:var(--je-serif);font-size:26px;
  color:var(--je-green);line-height:1;
}
.je-h-run b{display:block;color:var(--je-ink);font-size:16.5px;margin-bottom:4px;}
.je-h-run p{margin:0;font-size:15px;max-width:42.3em /* was 66ch */;}
.je-h-runlink{margin-top:20px;font-weight:700;}

/* ---------- made here ---------- */
.je-h-addr{max-width:42.3em /* was 66ch */;font-size:14.5px;color:var(--je-muted-deep);}
/* Hairline grid drawn from the container background showing through 1px
   gaps - the same construction as the category "what you get" grid, so the
   two pages read as one system. */
.je-h-facts{
  display:grid;grid-template-columns:repeat(auto-fit,minmax(128px,1fr));
  gap:1px;background:var(--je-rule);border:1px solid var(--je-rule);margin:26px 0;
}
.je-h-fact{background:var(--je-cream);padding:18px 16px;}
.je-h-fact b{
  display:block;font-family:var(--je-serif);font-weight:400;font-size:27px;
  color:var(--je-green);line-height:1.1;
}
.je-h-fact span{
  font-family:var(--je-mono);font-size:10.5px;letter-spacing:.09em;
  text-transform:uppercase;color:var(--je-muted-deep);
}
.je-h-cred{font-size:14.5px;line-height:1.9;margin:0 0 6px;}
.je-h-cred b{
  font-family:var(--je-mono);font-size:10.5px;letter-spacing:.11em;
  text-transform:uppercase;color:var(--je-ochre-text);display:block;
  font-weight:500;margin-bottom:2px;
}
.je-h-reviews{
  display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));
  gap:16px;margin:26px 0 14px;
}
.je-h-rev{
  background:var(--je-cream);border:1px solid var(--je-rule);border-radius:12px;
  padding:18px 20px;font-size:14.5px;
}
.je-h-rev p{margin:8px 0 0;}
.je-h-stars{color:#E8A317;letter-spacing:2px;font-size:13px;}
.je-h-who{font-family:var(--je-mono);font-size:11px;color:var(--je-muted-deep);margin-top:10px;display:block;}
.je-h-promise{
  background:var(--je-paper);border:1px solid var(--je-rule);
  border-left:4px solid var(--je-green);border-radius:12px;padding:22px 26px;
  margin:26px 0 14px;font-family:var(--je-serif);font-size:18px;line-height:1.5;
  color:var(--je-ink);
}

/* ---------- coming soon, and the close ---------- */
.je-h-soon{font-size:15px;color:var(--je-muted-deep);max-width:50em /* was 78ch */;margin:0;}
.je-h-soon b{color:var(--je-ink);}
.je-h-start{display:grid;grid-template-columns:1fr 1fr;gap:20px;margin-top:28px;}
.je-h-startcol{
  background:var(--je-paper);border:1px solid var(--je-rule);border-radius:14px;padding:24px 26px;
}
.je-h-startcol p{font-size:14.5px;color:var(--je-soil);}
.je-h-closing{text-align:center;font-size:14.5px;color:var(--je-muted-deep);margin:22px 0 0;}

/* ---------- responsive ---------- */
@media (max-width:900px){
  .je-h{padding:48px 0;}
  .je-h-hero{padding:40px 0 44px;}
  .je-h-hero .je-h-wrap{grid-template-columns:1fr;}
  /* Photo first on a phone: the hero job is to prove this is a factory that
     prints logos, and the picture does that faster than the headline. */
  .je-h-hero .je-h-shot{order:-1;}
  .je-h-doors,.je-h-fabrics,.je-h-start{grid-template-columns:1fr;}
}
@media (max-width:760px){
  .je-h-tables{grid-template-columns:1fr;}
}
@media (prefers-reduced-motion:reduce){
  .je-h-fab{transition:none;}
  .je-h-fab:hover{transform:none;}
}
/* ---------- composition for wide screens ----------
   Measured on the first live build (8 Sep 2026, 1920px): five of the eight
   bands were a reading-width column on the left and empty on the right,
   because the container had been widened to 1880px while every paragraph,
   table and list kept its reading cap. A wide band is only right when the
   content is composed to fill it. So: the column comes in to 1440px,
   centred (240px margins on a 1920 screen), and each sparse band is laid
   out in columns that use the width. Copy and markup are unchanged; this
   is layout only. Rules below override the single-column rules above by
   coming later at equal or higher specificity. */

.je-h-wrap{max-width:1440px;padding:0 24px;}

/* Hero: two equal columns, the photo as tall as the text column. */
.je-h-hero .je-h-wrap{grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:clamp(32px,4vw,64px);}
.je-h-hero h1{font-size:clamp(31px,3.6vw,58px) !important;}
.je-h-sub{max-width:38.5em /* was 60ch */;}
.je-h-proof{max-width:none;}

/* Doors: two equal cards. */
.je-h-doors{grid-template-columns:1fr 1fr;gap:24px;}

/* Price and dispatch: the two tables on the left two-thirds, the dark
   definition box on the right third, terms across the bottom. */
.je-h-band-sand .je-h-wrap{
  display:grid;grid-template-columns:repeat(3,minmax(0,1fr));
  column-gap:24px;row-gap:0;align-items:stretch;
}
.je-h-band-sand .je-h-wrap > *{grid-column:1/-1;}
.je-h-band-sand .je-h-tables{grid-column:1/3;max-width:none;margin-top:26px;}
.je-h-band-sand .je-h-define{grid-column:3;margin-top:26px;display:flex;flex-direction:column;justify-content:center;}
.je-h-band-sand .je-h-terms{margin-top:22px;}

/* How an order runs: five cards across, the number on top. */
.je-h-run{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:20px;margin-top:28px;}
.je-h-run li{
  display:block;padding:22px 20px 20px;border:1px solid var(--je-rule);border-radius:14px;
  background:var(--je-paper);
}
.je-h-run li:last-child{border-bottom:1px solid var(--je-rule);}
.je-h-run li::before{display:block;margin-bottom:12px;}
.je-h-run p{max-width:none;}

/* Made here: text on the left, the five facts stacked on the right. */
.je-h:has(.je-h-facts) .je-h-wrap{
  display:grid;grid-template-columns:minmax(0,1.25fr) minmax(0,1fr);
  column-gap:56px;row-gap:0;align-items:start;
}
.je-h:has(.je-h-facts) .je-h-wrap > *{grid-column:1/-1;}
.je-h:has(.je-h-facts) .je-h-lede{grid-column:1;grid-row:3;}
.je-h:has(.je-h-facts) .je-h-addr{grid-column:1;grid-row:4;}
.je-h:has(.je-h-facts) .je-h-cred{grid-column:1;grid-row:5;}
.je-h:has(.je-h-facts) .je-h-cred + .je-h-cred{grid-row:6;}
.je-h:has(.je-h-facts) .je-h-wrap .je-h-facts{grid-column:2;grid-row:3/7;grid-template-columns:1fr;gap:1px;margin:0;align-self:start;}
.je-h-fact{display:flex;align-items:baseline;gap:16px;padding:14px 18px;}
.je-h-fact b{min-width:96px;font-size:26px;}
.je-h-fact span{font-size:13.5px;}
.je-h:has(.je-h-facts) .je-h-reviews{margin-top:28px;}
.je-h:has(.je-h-facts) .je-h-promise{max-width:none;}

/* Coming soon: the two offers as two cards, side by side. */
.je-h-soonband .je-h-wrap{display:grid;grid-template-columns:1fr 1fr;gap:12px 24px;}
.je-h-soonband .je-h-eyebrow,.je-h-soonband .je-h-after{grid-column:1/-1;}
.je-h-soonband .je-h-cred{
  background:var(--je-paper);border:1px solid var(--je-rule);border-radius:12px;
  padding:16px 20px;margin:0;line-height:1.6;
}
.je-h-soonband .je-h-cred b{margin-bottom:6px;}

@media (max-width:1180px){
  .je-h-run{grid-template-columns:repeat(3,minmax(0,1fr));}
  .je-h-band-sand .je-h-wrap{grid-template-columns:1fr;}
  .je-h-band-sand .je-h-tables,.je-h-band-sand .je-h-define{grid-column:1/-1;}
}
@media (max-width:900px){
  /* The composition rules above come AFTER the phone rules earlier in this
     block and win on order, so the phone collapse has to be restated here.
     Missed on 8 Sep: the hero and the two doors stayed in two columns on a
     375px phone, text crushed into the right half. */
  .je-h-hero .je-h-wrap{grid-template-columns:1fr;gap:24px;}
  .je-h-hero h1{font-size:clamp(30px,8.6vw,40px) !important;}
  .je-h-doors{grid-template-columns:1fr;}
  .je-h-run{grid-template-columns:1fr;}
  .je-h:has(.je-h-facts) .je-h-wrap{display:block;}
  .je-h-facts{margin:26px 0;}
  .je-h-soonband .je-h-wrap{grid-template-columns:1fr;}
}
/* ================= END JE HOME ================= */
/* ==========================================================================
   JE DISPATCH - the dispatch window under the price ladder, September 2026.

   Markup comes from the DISPATCH WINDOW snippet (snippets/dispatch-window.php)
   and sits directly after .je-ladder inside form.cart. Same frame as the
   ladder - cream panel, hairline rule, 3px radius - so the two read as one
   order desk. Every rule is scoped to body.single-product .je-dispatch.

   REVERT: delete from this header to the END JE DISPATCH marker.
   ========================================================================== */
body.single-product .je-dispatch{
  margin:0 0 18px;
  padding:16px 18px 14px;
  background:var(--je-cream);
  border:1px solid var(--je-rule);
  border-radius:3px;
  width:100%;
  clear:both;
}
body.single-product .je-dispatch__head{
  display:flex;
  justify-content:space-between;
  align-items:baseline;
  gap:12px;
  margin-bottom:8px;
}
body.single-product .je-dispatch__lbl,
body.single-product .je-dispatch__band{
  font-family:var(--je-mono);
  font-size:10.5px;
  letter-spacing:.13em;
  text-transform:uppercase;
}
body.single-product .je-dispatch__lbl{ color:var(--je-muted); }
body.single-product .je-dispatch__band{ color:var(--je-green-deep); }

body.single-product .je-dispatch__main{
  margin:0;
  font-family:var(--je-display);
  font-size:19px;
  line-height:1.3;
  color:var(--je-ink);
}
body.single-product .je-dispatch__main b{ font-weight:400; color:var(--je-green-deep); }

body.single-product .je-dispatch__date,
body.single-product .je-dispatch__eta,
body.single-product .je-dispatch__note{
  margin:8px 0 0;
  font-family:var(--je-body);
  font-size:13.5px;
  line-height:1.5;
  color:var(--je-soil);
}
body.single-product .je-dispatch__date b,
body.single-product .je-dispatch__eta b{ font-weight:600; color:var(--je-ink); white-space:nowrap; }

body.single-product .je-dispatch__route{
  display:flex;
  align-items:center;
  gap:12px;
  flex-wrap:wrap;
  margin-top:14px;
  padding-top:12px;
  border-top:1px solid var(--je-rule);
}
body.single-product .je-dispatch__route label{
  margin:0;
  font-family:var(--je-mono);
  font-size:10.5px;
  letter-spacing:.13em;
  text-transform:uppercase;
  color:var(--je-muted);
}
body.single-product .je-dispatch__route select{
  flex:1 1 200px;
  max-width:100%;
  margin:0;
  padding:9px 36px 9px 12px;
  font-family:var(--je-body);
  font-size:14px;
  color:var(--je-ink);
  background:var(--je-paper);
  border:1px solid var(--je-rule);
  border-radius:3px;
  text-overflow:ellipsis;
}
body.single-product .je-dispatch__route select:focus{
  outline:2px solid var(--je-green);
  outline-offset:1px;
}

body.single-product .je-dispatch__all{ margin-top:10px; }
body.single-product .je-dispatch__all summary{
  cursor:pointer;
  font-family:var(--je-body);
  font-size:12.5px;
  color:var(--je-ochre-text);
  text-decoration:underline;
  text-underline-offset:3px;
  list-style:none;
}
body.single-product .je-dispatch__all summary::-webkit-details-marker{ display:none; }
body.single-product .je-dispatch__all table{
  width:100%;
  margin:8px 0 0;
  border-collapse:collapse;
  font-family:var(--je-body);
  font-size:12.5px;
  line-height:1.4;
  color:var(--je-soil);
}
body.single-product .je-dispatch__all td{
  padding:6px 0;
  border:0;
  border-top:1px solid var(--je-rule);
  background:transparent;
  vertical-align:top;
}
body.single-product .je-dispatch__all td:last-child{
  width:34%;
  padding-left:12px;
  text-align:right;
  white-space:nowrap;
  color:var(--je-ink);
  font-weight:600;
}

/* The one-line note that opens the transit table (a colspan cell, so it is
   both first and last child and would otherwise inherit the right-aligned
   bold nowrap of the days column). */
body.single-product .je-dispatch__all td.je-dispatch__allnote{
  width:auto;padding-left:0;text-align:left;white-space:normal;
  font-weight:400;color:var(--je-muted-deep);border-top:0;
}
body.single-product .je-dispatch__note{
  margin-top:12px;
  padding-top:10px;
  border-top:1px solid var(--je-rule);
  font-size:12.5px;
  color:var(--je-muted-deep);
}

@media (max-width:520px){
  body.single-product .je-dispatch{ padding:14px; }
  body.single-product .je-dispatch__main{ font-size:17px; }
  body.single-product .je-dispatch__date,
  body.single-product .je-dispatch__eta{ font-size:12.5px; }
  body.single-product .je-dispatch__all td:last-child{ width:40%; }
}
/* ================= END JE DISPATCH ================= */
/* ==========================================================================
   JE HIW - the rebuilt How It Works page, September 2026.

   Markup lives in five Elementor HTML widgets on page 8833:
   elementor/how-it-works-2026-09.html in the repo. Copy comes from
   docs/juteearth-rebuild-plan.html section 04; the dispatch and transit
   figures are the DISPATCH WINDOW snippet's, so a band that changes there
   changes in those widgets too.

   Everything is prefixed .je-w and every rule here STARTS with .je-w, so
   nothing can reach another page. Colours and faces come from the --je-*
   tokens in JE TOKENS at the top of this file; no new palette, same type
   scale as JE HOME, so the two pages read as one site.

   Specificity instead of !important. Elementor's kit styles headings,
   paragraphs and links as .elementor-kit-NNN h2 / p / a, which is one class
   plus one element. Element rules here are written .je-w .je-w-wrap h2 (two
   classes) and every class rule is prefixed with .je-w as well, so they win
   on weight alone, in any stylesheet order. Buttons sit inside .je-w-cta and are named through
   it so the kit's a:hover cannot recolour them. The ONLY !important is on
   the container-zeroing rules, exactly as in JE HOME.

   Sits LAST, after JE DISPATCH, at the end of the file. Nothing here
   touches the header or the cart, so JE CART's document-order rule is
   undisturbed.

   REVERT: delete from this header to the END JE HIW marker.
   ========================================================================== */

.je-w{
  font-family:var(--je-sans);font-size:16px;line-height:1.6;
  color:var(--je-soil);background:var(--je-paper);padding:64px 0;
}
.je-w *{box-sizing:border-box;}
/* Same 1880px measure as .je-h-wrap and .content-container.site-container.
   Reading measures are capped per element below, never here. */
.je-w .je-w-wrap{max-width:1880px;margin:0 auto;padding:0 22px;}

/* The container is a holder, nothing more. Elementor gives every container
   10px padding and a 20px gap by default, each a stripe of page background
   between two bands; a Boxed container also caps its inner wrapper at 1140px
   and pins it left once its margin is zeroed. Same fix as JE HOME. */
.e-con:has(.je-w),
.e-con-inner:has(.je-w),
.elementor-widget-html:has(.je-w){
  padding:0 !important;margin:0 !important;min-height:0 !important;gap:0 !important;
}
.e-con-inner:has(.je-w){max-width:none !important;width:100% !important;}

/* Bands: paper, cream, sand, paper, cream. */
.je-w.je-w-band-cream{background:var(--je-cream);}
.je-w.je-w-band-sand{background:var(--je-sand);}

/* ---------- shared type ---------- */
.je-w .je-w-eyebrow{
  font-family:var(--je-mono);font-size:11px;letter-spacing:.13em;
  text-transform:uppercase;color:var(--je-ochre-text);margin:0 0 12px;
}
.je-w .je-w-wrap h1{
  font-family:var(--je-serif);font-weight:400;font-size:clamp(31px,4.4vw,50px);
  line-height:1.06;letter-spacing:-.01em;color:var(--je-ink);margin:0 0 18px;
  text-wrap:balance;
}
.je-w .je-w-wrap h2{
  font-family:var(--je-serif);font-weight:400;font-size:clamp(25px,3.4vw,34px);
  line-height:1.14;color:var(--je-ink);margin:0 0 8px;text-wrap:balance;
}
.je-w .je-w-wrap h3{
  font-family:var(--je-sans);font-weight:800;font-size:17px;line-height:1.3;
  color:var(--je-ink);margin:0 0 6px;
}
/* No underline, as on the homepage (.je-h a): green-deep alone marks an
   inline link on both pages. Elementor's own .elementor a already removes
   the underline; stated here so the page does not depend on that. */
.je-w .je-w-wrap a{color:var(--je-green-deep);text-decoration:none;}
.je-w .je-w-wrap a:not([class]){text-decoration:underline;text-underline-offset:3px;text-decoration-thickness:1px;}
.je-w .je-w-wrap a:hover{color:var(--je-green-deep);}
.je-w .je-w-wrap a:focus-visible{outline:2px solid var(--je-green);outline-offset:3px;}
.je-w .je-w-lede{max-width:42.3em /* was 66ch */;margin:0 0 14px;color:var(--je-soil);}
.je-w .je-w-fine{font-size:14px;color:var(--je-muted-deep);margin:18px 0 0;max-width:44.9em /* was 70ch */;}

/* ---------- buttons ---------- */
.je-w .je-w-cta{display:flex;gap:12px;flex-wrap:wrap;}
.je-w .je-w-cta--centre{justify-content:center;}
.je-w .je-w-cta .je-w-btn{
  display:inline-block;font-weight:800;font-size:15px;line-height:1.2;
  padding:14px 24px;border-radius:8px;text-decoration:none;
  border:1.5px solid transparent;
}
/* White on the green fill: Soil on #03AC13 is 3.83:1, short of AA. */
.je-w .je-w-cta .je-w-btn--primary,
.je-w .je-w-cta .je-w-btn--primary:hover{
  background:var(--je-green);color:var(--je-white);border-color:var(--je-green);
}
.je-w .je-w-cta .je-w-btn--primary:hover{background:var(--je-green-deep);border-color:var(--je-green-deep);}
.je-w .je-w-cta .je-w-btn--ghost,
.je-w .je-w-cta .je-w-btn--ghost:hover{
  background:transparent;color:var(--je-ink);border-color:var(--je-ink);
}
.je-w .je-w-cta .je-w-btn:focus-visible{outline:2px solid var(--je-green);outline-offset:3px;}

/* ---------- block 1: hero ---------- */
.je-w.je-w-hero{padding:60px 0 56px;}
.je-w .je-w-hero__lede{font-size:18px;line-height:1.55;max-width:33.3em /* was 52ch */;margin:0 0 14px;color:var(--je-ink);}
.je-w .je-w-hero__p{max-width:42.3em /* was 66ch */;margin:0 0 24px;color:var(--je-soil);}

/* ---------- block 2: the six steps ----------
   Numbered because it IS a sequence; the numbers are drawn like .je-h-run's
   so the homepage summary and this page look like the same list. */
.je-w .je-w-steps{list-style:none;padding:0;margin:26px 0 0;counter-reset:jewstep;}
.je-w .je-w-steps li{
  counter-increment:jewstep;display:grid;grid-template-columns:52px 1fr;gap:18px;
  padding:20px 0;margin:0;border-top:1px solid var(--je-rule);
}
.je-w .je-w-steps li:last-child{border-bottom:1px solid var(--je-rule);}
.je-w .je-w-steps li::before{
  content:counter(jewstep);font-family:var(--je-serif);font-size:26px;
  color:var(--je-green);line-height:1;padding-top:2px;
}
.je-w .je-w-step__body{font-size:15px;margin:0 0 10px;max-width:42.3em /* was 66ch */;color:var(--je-soil);}
/* The Who / When line: mono keys, sans values, one line where it fits. */
.je-w .je-w-step__meta{font-size:13.5px;color:var(--je-muted-deep);margin:0;max-width:42.3em /* was 66ch */;}
.je-w .je-w-step__meta span{
  font-family:var(--je-mono);font-size:10.5px;letter-spacing:.11em;
  text-transform:uppercase;color:var(--je-ochre-text);margin-right:6px;
}
.je-w .je-w-step__meta span:not(:first-child){margin-left:12px;}

/* ---------- block 3: dispatch and transit tables ----------
   Two explicit columns, not auto-fit: two cards in an auto-fit track sit
   alone on a row at some widths, which reads as a layout fault. */
.je-w .je-w-tables{display:grid;grid-template-columns:1fr 1fr;gap:18px;margin-top:26px;max-width:980px;}
.je-w .je-w-tbl{background:var(--je-paper);border:1px solid var(--je-rule);border-radius:14px;overflow:hidden;}
.je-w .je-w-tbl h3{
  font-family:var(--je-mono);font-size:11px;font-weight:500;letter-spacing:.11em;
  text-transform:uppercase;color:var(--je-ochre-text);padding:14px 18px 0;margin:0;
}
.je-w .je-w-tbl__sub{font-size:13px;color:var(--je-muted-deep);padding:4px 18px 12px;margin:0;}
.je-w .je-w-tbl table{border-collapse:collapse;width:100%;font-size:14.5px;margin:0;border:0;}
.je-w .je-w-tbl td{
  padding:9px 18px;border:0;border-top:1px solid var(--je-rule);
  vertical-align:top;background:transparent;
}
/* The destination column wraps (one label names eleven places); the days
   column never does, so a figure cannot break across two lines. */
.je-w .je-w-tbl td:first-child{color:var(--je-ink);font-weight:600;font-variant-numeric:tabular-nums;}
.je-w .je-w-tbl td:last-child{text-align:right;white-space:nowrap;padding-left:0;}
.je-w .je-w-tbl .je-w-tbl__ask td{color:var(--je-muted-deep);}

/* ---------- block 4: dispatch and delivery, defined ----------
   The one dark object on the page, built like .je-h-define: this is the
   distinction the whole site turns on, and it should not read as another
   paragraph. */
.je-w .je-w-define{
  background:var(--je-ink);color:var(--je-cream);border-radius:14px;
  padding:26px 28px;max-width:900px;
}
.je-w .je-w-define .je-w-eyebrow{color:var(--je-ochre-on-dark);margin-bottom:10px;}
.je-w .je-w-wrap .je-w-define h2{color:var(--je-cream);font-size:clamp(22px,2.6vw,28px);margin:0 0 16px;}
/* :not(): the eyebrow is a <p> in the same box and must keep its DM Mono
   face; without it this rule (two classes and an element) outweighs
   .je-w .je-w-eyebrow and sets the eyebrow in serif capitals. */
.je-w .je-w-define p:not(.je-w-eyebrow){
  font-family:var(--je-serif);font-size:18px;line-height:1.5;
  color:var(--je-cream);margin:0 0 14px;max-width:43.3em /* was 72ch */;
}
.je-w .je-w-define p:last-child{margin-bottom:0;}
.je-w .je-w-define p.je-w-define__eg{
  border-top:1px solid var(--je-muted);padding-top:14px;color:var(--je-ochre-on-dark);
}

/* ---------- block 5: the close ---------- */
.je-w.je-w-close{padding:56px 0;}
.je-w .je-w-closing{text-align:center;font-size:14.5px;color:var(--je-muted-deep);margin:22px 0 0;}

/* ---------- responsive ---------- */
@media (max-width:900px){
  .je-w{padding:48px 0;}
  .je-w.je-w-hero{padding:40px 0 44px;}
  .je-w .je-w-steps li{grid-template-columns:40px 1fr;gap:12px;padding:18px 0;}
  .je-w .je-w-steps li::before{font-size:22px;}
  .je-w .je-w-define{padding:24px 22px;}
  .je-w.je-w-close{padding:48px 0;}
}
@media (max-width:760px){
  .je-w .je-w-tables{grid-template-columns:1fr;}
  .je-w .je-w-tbl td:last-child{white-space:normal;}
}
/* ---------- composition for wide screens ----------
   Same reasoning as JE HOME's composition section: 1440px column, and the
   sparse bands composed in columns. Layout only; copy and markup unchanged. */

.je-w .je-w-wrap{max-width:1440px;padding:0 24px;}

/* Hero: intro on the left, buttons on the right, vertically centred. */
.je-w.je-w-hero .je-w-wrap{display:grid;grid-template-columns:minmax(0,1.4fr) minmax(0,1fr);column-gap:48px;align-items:center;}
.je-w.je-w-hero .je-w-wrap > *{grid-column:1;}
.je-w.je-w-hero .je-w-cta{grid-column:2;grid-row:1/4;justify-content:flex-start;flex-direction:column;align-items:flex-start;}
.je-w.je-w-hero .je-w-cta .je-w-btn{min-width:240px;text-align:center;}
.je-w .je-w-hero__p{margin-bottom:0;}

/* Six steps: three cards across, two rows. */
.je-w .je-w-steps{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:20px;}
.je-w .je-w-steps li{
  display:block;padding:22px 22px 20px;border:1px solid var(--je-rule);border-radius:14px;
  background:var(--je-paper);
}
.je-w .je-w-steps li:last-child{border-bottom:1px solid var(--je-rule);}
.je-w .je-w-steps li::before{display:block;margin-bottom:12px;}
.je-w .je-w-step__body,.je-w .je-w-step__meta{max-width:none;}

/* Tables fill the column. */
.je-w .je-w-tables{max-width:none;gap:24px;}

/* Definition box: heading on the left, the four paragraphs on the right. */
.je-w .je-w-define{
  max-width:none;display:grid;grid-template-columns:minmax(0,.9fr) minmax(0,1.6fr);
  column-gap:48px;grid-auto-flow:dense;padding:34px 36px;
}
.je-w .je-w-define > .je-w-eyebrow,.je-w .je-w-wrap .je-w-define h2{grid-column:1;}
.je-w .je-w-define > p:not(.je-w-eyebrow){grid-column:2;max-width:none;}

@media (max-width:1180px){
  .je-w .je-w-steps{grid-template-columns:repeat(2,minmax(0,1fr));}
}
@media (max-width:900px){
  .je-w.je-w-hero .je-w-wrap{display:block;}
  .je-w .je-w-hero__p{margin-bottom:24px;}
  .je-w.je-w-hero .je-w-cta{flex-direction:row;}
  .je-w .je-w-steps{grid-template-columns:1fr;}
  .je-w .je-w-define{display:block;padding:24px 22px;}
}

/* Page 8833 sits on Kadence's default page template, whose content wrapper
   the JE SITE block caps at 1880px with ~31px side padding - measured live
   on 9 Sep 2026 that left every band 43-1862 on a 1920 screen (a white
   gutter each side) and 24px short on a phone. Setting the page to
   Elementor Full Width removes the wrapper, but it also re-saves the page
   from Elementor, which overwrites Yoast; so the wrapper is opened up here
   instead, only on pages that carry a je-w block. Nothing else in the
   chain adds width: measured, every other ancestor is 0/0/none. */
body:has(.je-w) .content-container.site-container{max-width:none !important;padding-inline:0 !important;}
/* ================= END JE HIW ================= */
/* ==========================================================================
   JE MOBILE PASS 2 - phone audit of every page, 9 Sep 2026.

   Measured on a 375px phone, page by page, after Krishna asked for every
   page to be checked ("its looking too worst"). Homepage and How It Works
   were already right. What was not, and what each rule below fixes:

   PRODUCT PAGES - the content column was 279px of 375 (26% of the screen
   lost), because three paddings nest: the Kadence container (24px a side),
   the product .entry wrapper (24px), and our order-desk form.cart (20px).
   The price ladder and the dispatch window were 237px wide. Now: 14 + 0 +
   14, so the ladder is 319px.

   CATEGORY PAGES - the four hero facts wrapped as 2 + 1 + 1 (flex-wrap with
   a 28px gap and an 11-word caption on the last one). Now a 2x2 grid.
   Container padding 24 -> 16 for a little more room; the bands there have
   no background, so full-bleed is not a visible question.

   CUSTOM PRINTING (Elementor page 13161) - every widget carries a 53/50px
   desktop padding that Elementor also applies on phones, so the h1 was
   204px wide, starting 87px in. Zeroed under 768px.

   Scoped to body.single-product, body.je-cat-designed, body.page-id-13161.
   Placed last; touches nothing the JE CART order rule depends on.
   REVERT: delete from this header to the END JE MOBILE PASS 2 marker.
   ========================================================================== */
@media (max-width:600px){
  body.single-product .content-container.site-container{padding-inline:14px !important;}
  body.single-product #main > .product.entry{padding-inline:0 !important;}
  body.single-product .summary form.cart{padding:14px !important;}
  body.single-product .je-ladder,
  body.single-product .je-dispatch{padding:14px 12px;}

  body.je-cat-designed .content-container.site-container{padding-inline:16px !important;}
  .je-cat-facts{display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:18px 16px;}
  .je-cat-fact b{font-size:21px;}
  .je-cat-fact span{font-size:11px; display:block; margin-top:2px;}
}
@media (max-width:767px){
  body.page-id-13161 .elementor-widget{padding-left:0 !important; padding-right:0 !important;}
}
/* ================= END JE MOBILE PASS 2 ================= */
/* ==========================================================================
   JE SAMPLE - "Order type" in the order desk: Bulk order / Printed sample
   Rs 800 / Plain sample Rs 200 (12 Sep 2026; replaces the separate-page
   sample panel of 11 Sep).

   Markup comes from the SAMPLE ORDER snippet (snippets/sample-order.php).
   The panel sits directly after .je-dispatch inside form.cart. Choosing a
   sample puts a mode class on form.cart: je-mode-sample (any sample),
   je-mode-printed, je-mode-plain. The rules at the end hide what a sample
   does not need: quantity, ladder and dispatch window for any sample; the
   mockup strip and the Barn2 upload field (tagged je-file-field by the
   snippet) for a plain sample. Same order-desk frame as the ladder.

   REVERT: delete from this header to the END JE SAMPLE marker.
   ========================================================================== */
body.single-product .je-sample{
  margin:0 0 18px;
  padding:16px 18px 14px;
  background:var(--je-paper);
  border:1px solid var(--je-rule);
  border-radius:3px;
  width:100%;
  clear:both;
}
body.single-product .je-sample__head{
  display:flex;
  justify-content:space-between;
  align-items:baseline;
  gap:12px;
  margin-bottom:12px;
}
body.single-product .je-sample__lbl,
body.single-product .je-sample__band{
  font-family:var(--je-mono);
  font-size:10.5px;
  letter-spacing:.13em;
  text-transform:uppercase;
}
body.single-product .je-sample__lbl{ color:var(--je-muted); }
body.single-product .je-sample__band{ color:var(--je-ochre-text); }

body.single-product .je-sample__grid{
  display:grid;
  grid-template-columns:1fr; /* one row per order type: the desk is too narrow for three tiles */
  gap:8px;
}
body.single-product .je-sample__opt{
  display:grid;
  grid-template-columns:1fr auto;
  grid-template-areas:"name price" "note note";
  align-items:baseline;
  gap:2px 10px;
  margin:0;
  padding:12px 14px;
  min-height:0;
  text-align:left;
  background:var(--je-cream);
  border:1px solid var(--je-rule);
  border-radius:3px;
  box-shadow:none;
  color:var(--je-ink);
  cursor:pointer;
  transition:border-color .15s ease, background .15s ease, box-shadow .15s ease;
}
body.single-product .je-sample__opt:hover,
body.single-product .je-sample__opt:focus-visible{
  border-color:var(--je-green-deep);
  background:var(--je-paper);
  outline:none;
}
body.single-product .je-sample__opt.is-on{
  border-color:var(--je-green-deep);
  background:var(--je-paper);
  box-shadow:inset 0 0 0 1px var(--je-green-deep);
}
body.single-product .je-sample__opt b{
  grid-area:name;
  font-family:var(--je-display);
  font-weight:400;
  font-size:15.5px;
  line-height:1.25;
}
body.single-product .je-sample__price{
  grid-area:price;
  font-family:var(--je-mono);
  font-size:13.5px;
  color:var(--je-green-deep);
  white-space:nowrap;
}
body.single-product .je-sample__note{
  grid-area:note;
  margin-top:4px;
  font-family:var(--je-body);
  font-size:12.5px;
  line-height:1.45;
  color:var(--je-soil);
}
/* The sample readout reuses the dispatch-window text classes, inside a cream box. */
body.single-product .je-sample__readout{
  margin-top:12px;
  padding:14px 16px 12px;
  background:var(--je-cream);
  border:1px solid var(--je-rule);
  border-radius:3px;
}
body.single-product .je-sample__readout .je-dispatch__head{ display:flex; justify-content:space-between; align-items:baseline; gap:12px; margin-bottom:8px; }
body.single-product .je-sample__readout .je-dispatch__lbl,
body.single-product .je-sample__readout .je-dispatch__band{ font-family:var(--je-mono); font-size:10.5px; letter-spacing:.13em; text-transform:uppercase; }
body.single-product .je-sample__readout .je-dispatch__lbl{ color:var(--je-muted); }
body.single-product .je-sample__readout .je-dispatch__band{ color:var(--je-ochre-text); }
body.single-product .je-sample__readout .je-dispatch__main{ margin:0; font-family:var(--je-display); font-size:18px; line-height:1.3; color:var(--je-ink); }
body.single-product .je-sample__readout .je-dispatch__main b{ font-weight:400; color:var(--je-green-deep); }
body.single-product .je-sample__readout .je-dispatch__date,
body.single-product .je-sample__readout .je-dispatch__eta{ margin:8px 0 0; font-family:var(--je-body); font-size:13.5px; line-height:1.5; color:var(--je-soil); }
body.single-product .je-sample__readout .je-dispatch__date b{ font-weight:600; color:var(--je-ink); }
body.single-product .je-sample__msg{
  margin:10px 0 0;
  font-family:var(--je-body);
  font-size:13px;
  color:var(--je-green-deep);
}
body.single-product .je-sample__msg:empty{ display:none; }
body.single-product .je-sample__msg.is-bad{ color:#9b2c1f; }
body.single-product .je-sample__fine{
  margin:12px 0 0;
  padding-top:10px;
  border-top:1px solid var(--je-rule);
  font-family:var(--je-body);
  font-size:12.5px;
  line-height:1.5;
  color:var(--je-muted-deep);
}
body.single-product .je-sample [hidden]{ display:none !important; }

/* Mode rules: what a sample order does not need. */
body.single-product form.cart.je-mode-sample .quantity,
body.single-product form.cart.je-mode-sample .je-qty,
body.single-product form.cart.je-mode-sample .je-ladder,
body.single-product form.cart.je-mode-sample .je-dispatch:not(.je-dispatch--sample){ display:none !important; }
body.single-product form.cart.je-mode-plain .je-mock--strip,
body.single-product form.cart.je-mode-plain .wpo-field.je-file-field{ display:none !important; }

/* Sample product pages, if opened directly (no ordering there). */
body.single-product .je-dispatch--sample{ margin-top:4px; }
body.single-product .je-dispatch--sample .je-dispatch__band{ color:var(--je-ochre-text); }

/* Credit code on the thank-you page. */
.je-sample-credit{
  margin:18px 0;
  padding:14px 18px;
  background:var(--je-cream);
  border:1px solid var(--je-rule);
  border-left:3px solid var(--je-green-deep);
  border-radius:3px;
  font-family:var(--je-body);
  font-size:15px;
  line-height:1.5;
  color:var(--je-ink);
}
.je-sample-credit p{ margin:0; }

@media (max-width:640px){
  body.single-product .je-sample{ padding:14px 12px; }
  body.single-product .je-sample__opt b{ font-size:15px; }
  body.single-product .je-sample__readout .je-dispatch__main{ font-size:16.5px; }
}
/* ================= END JE SAMPLE ================= */
/* ==========================================================================
   JE MOCKUP - "See your logo on this bag", the instant mockup widget under
   the product gallery, 11 Sep 2026.

   Markup comes from the INSTANT MOCKUP snippet (snippets/instant-mockup.php)
   and is inserted directly after .woo-variation-product-gallery, so it sits
   under the photos on desktop and between photos and the order desk on a
   phone. The canvas keeps the photo's 4:5 ratio. Same order-desk frame.

   REVERT: delete from this header to the END JE MOCKUP marker.
   ========================================================================== */
body.single-product .je-mock{
  margin:18px 0 0;
  padding:16px 18px 14px;
  background:var(--je-cream);
  border:1px solid var(--je-rule);
  border-radius:3px;
  clear:both;
}
body.single-product .je-mock__head{
  display:flex;
  justify-content:space-between;
  align-items:baseline;
  gap:12px;
  margin-bottom:12px;
}
body.single-product .je-mock__lbl,
body.single-product .je-mock__band{
  font-family:var(--je-mono);
  font-size:10.5px;
  letter-spacing:.13em;
  text-transform:uppercase;
}
body.single-product .je-mock__lbl{ color:var(--je-muted); }
body.single-product .je-mock__band{ color:var(--je-green-deep); }

body.single-product .je-mock__stage{
  position:relative;
  background:var(--je-paper);
  border:1px solid var(--je-rule);
  border-radius:3px;
  overflow:hidden;
}
body.single-product .je-mock__canvas{
  display:block;
  width:100%;
  height:auto;
  touch-action:none;
  cursor:default;
}
body.single-product .je-mock.has-logo .je-mock__canvas{ cursor:grab; }
body.single-product .je-mock.has-logo .je-mock__canvas:active{ cursor:grabbing; }

/* The picker sits over the photo until a logo is chosen, then shrinks to a corner chip. */
body.single-product .je-mock__pick{
  position:absolute;
  inset:0;
  display:flex;
  flex-direction:column;
  align-items:center;
  justify-content:center;
  gap:10px;
  padding:24px;
  margin:0;
  text-align:center;
  background:rgba(253,251,246,.72);
  cursor:pointer;
}
body.single-product .je-mock__pickbtn{
  display:inline-block;
  padding:12px 22px;
  background:var(--je-green-deep);
  color:#fff;
  font-family:var(--je-body);
  font-weight:600;
  font-size:15px;
  border-radius:3px;
  box-shadow:0 2px 6px rgba(36,26,18,.18);
}
body.single-product .je-mock__pick:hover .je-mock__pickbtn{ background:var(--je-green); }
body.single-product .je-mock__pickhint{
  max-width:300px;
  font-family:var(--je-body);
  font-size:12.5px;
  line-height:1.45;
  color:var(--je-soil);
}
body.single-product .je-mock__pick.is-set{
  inset:auto 10px 10px auto;
  padding:0;
  background:transparent;
}
body.single-product .je-mock__pick.is-set .je-mock__pickbtn{ padding:7px 12px; font-size:12.5px; }
body.single-product .je-mock__pick.is-set .je-mock__pickhint{ display:none; }

body.single-product .je-mock__tools{
  display:flex;
  flex-wrap:wrap;
  align-items:center;
  gap:10px 18px;
  margin-top:12px;
  font-family:var(--je-body);
  font-size:13px;
  color:var(--je-soil);
}
body.single-product .je-mock__tools label{ display:flex; align-items:center; gap:8px; margin:0; font-weight:400; }
body.single-product .je-mock__range input{ width:140px; accent-color:var(--je-green-deep); }
body.single-product .je-mock__check input{ accent-color:var(--je-green-deep); margin:0; }
body.single-product .je-mock__drag{ color:var(--je-muted-deep); font-size:12.5px; }

body.single-product .je-mock__acts{
  display:flex;
  flex-wrap:wrap;
  gap:8px;
  margin-top:12px;
  padding-top:12px;
  border-top:1px solid var(--je-rule);
}
body.single-product .je-mock__act{
  display:inline-block;
  padding:9px 14px;
  font-family:var(--je-body);
  font-size:13.5px;
  font-weight:600;
  line-height:1.2;
  color:var(--je-ink);
  background:var(--je-paper);
  border:1px solid var(--je-rule);
  border-radius:3px;
  text-decoration:none !important;
  cursor:pointer;
}
body.single-product .je-mock__act:hover{ border-color:var(--je-green-deep); color:var(--je-green-deep); }
body.single-product .je-mock__act--sample{ background:var(--je-green-deep); border-color:var(--je-green-deep); color:#fff; }
body.single-product .je-mock__act--sample:hover{ background:var(--je-green); color:#fff; }
body.single-product .je-mock__act--reset{ font-weight:400; color:var(--je-muted-deep); }
body.single-product .je-mock__msg{
  flex-basis:100%;
  margin:4px 0 0;
  font-family:var(--je-body);
  font-size:13px;
  color:var(--je-green-deep);
}
body.single-product .je-mock__msg:empty{ display:none; }
body.single-product .je-mock__msg.is-bad{ color:#9b2c1f; }
body.single-product .je-mock__fine{
  margin:12px 0 0;
  padding-top:10px;
  border-top:1px solid var(--je-rule);
  font-family:var(--je-body);
  font-size:12px;
  line-height:1.5;
  color:var(--je-muted-deep);
}

@media (max-width:600px){
  body.single-product .je-mock{ margin:12px 0 18px; padding:14px 12px; }
  body.single-product .je-mock__range input{ width:110px; }
  body.single-product .je-mock__act{ flex:1 1 calc(50% - 4px); text-align:center; }
}
/* JE MOCKUP, ink rule (11 Sep, later): one-colour print. Verdict strip,
   ink swatches, and the row under them. Placed before END JE MOCKUP. */
body.single-product .je-mock__verdict{
  margin-top:12px;
  padding:10px 12px;
  font-family:var(--je-body);
  font-size:13.5px;
  line-height:1.5;
  color:var(--je-ink);
  background:var(--je-paper);
  border:1px solid var(--je-rule);
  border-left:3px solid var(--je-green-deep);
  border-radius:3px;
}
body.single-product .je-mock__verdict[data-verdict="multi"]{ border-left-color:var(--je-ochre-on-dark); }
body.single-product .je-mock__verdict b{ font-weight:600; }
body.single-product .je-mock__inks{
  display:flex;
  flex-wrap:wrap;
  gap:8px;
  width:100%;
}
body.single-product .je-mock__ink{
  width:28px;
  height:28px;
  padding:0;
  margin:0;
  min-height:0;
  border:2px solid var(--je-paper);
  border-radius:50%;
  background:var(--ink);
  box-shadow:0 0 0 1px var(--je-rule);
  cursor:pointer;
  transition:transform .12s ease, box-shadow .12s ease;
}
body.single-product .je-mock__ink:hover{ transform:scale(1.08); }
body.single-product .je-mock__ink.is-on{ box-shadow:0 0 0 2px var(--je-green-deep); transform:scale(1.12); }
body.single-product .je-mock__ink:focus-visible{ outline:2px solid var(--je-green); outline-offset:2px; }
body.single-product .je-mock__row{
  display:flex;
  flex-wrap:wrap;
  align-items:center;
  gap:10px 18px;
  width:100%;
}
body.single-product .je-mock__inkname{
  font-family:var(--je-mono);
  font-size:11px;
  letter-spacing:.1em;
  text-transform:uppercase;
  color:var(--je-green-deep);
  min-width:130px;
}
body.single-product .je-mock__act--wa{ background:var(--je-green-deep); border-color:var(--je-green-deep); color:#fff; }
body.single-product .je-mock__act--wa:hover{ background:var(--je-green); color:#fff; }
/* The panel toggles parts with the hidden attribute; the display rules
   above would otherwise override it. */
body.single-product .je-mock [hidden]{ display:none !important; }
/* JE MOCKUP, closed strip (12 Sep): the panel opens only once a logo is
   chosen or the band is clicked, so the page does not carry a second
   750px photo under the gallery. Closed = head + one row. */
body.single-product .je-mock__band{
  padding:0;
  margin:0;
  min-height:0;
  background:none;
  border:0;
  box-shadow:none;
  cursor:pointer;
  text-decoration:underline;
  text-underline-offset:3px;
  text-decoration-color:var(--je-rule);
}
body.single-product .je-mock__band:hover{ text-decoration-color:var(--je-green-deep); }
body.single-product .je-mock__start{
  display:flex;
  flex-wrap:wrap;
  align-items:center;
  gap:12px 16px;
}
body.single-product .je-mock__startbtn{
  display:inline-block;
  margin:0;
  padding:11px 20px;
  background:var(--je-green-deep);
  color:#fff;
  font-family:var(--je-body);
  font-weight:600;
  font-size:14.5px;
  line-height:1.2;
  border-radius:3px;
  cursor:pointer;
  white-space:nowrap;
}
body.single-product .je-mock__startbtn:hover{ background:var(--je-green); }
body.single-product .je-mock__starthint{
  flex:1 1 220px;
  font-family:var(--je-body);
  font-size:12.5px;
  line-height:1.45;
  color:var(--je-soil);
}
body.single-product .je-mock:not(.is-open) .je-mock__stage,
body.single-product .je-mock:not(.is-open) .je-mock__verdict,
body.single-product .je-mock:not(.is-open) .je-mock__tools,
body.single-product .je-mock:not(.is-open) .je-mock__acts,
body.single-product .je-mock:not(.is-open) .je-mock__fine{ display:none; }
body.single-product .je-mock.is-open .je-mock__start{ display:none; }
body.single-product .je-mock.is-open .je-mock__head{ margin-bottom:12px; }
body.single-product .je-mock:not(.is-open) .je-mock__head{ margin-bottom:10px; }
body.single-product .je-mock__act--close{ font-weight:400; color:var(--je-muted-deep); }
/* JE MOCKUP, split (12 Sep): the strip lives in the order desk, above the
   Barn2 upload; the panel replaces the product gallery while open, so
   nothing sits under the photos. */
body.single-product .summary form.cart .je-mock--strip{ margin:0 0 18px; width:100%; clear:both; }
body.single-product .je-mock--panel{ margin:0 0 18px; }
body.single-product .je-mock--panel:not(.is-open){ display:none; }
body.single-product .woo-variation-product-gallery.je-mock-hidden,
body.single-product .woocommerce-product-gallery.je-mock-hidden{ display:none !important; }
/* ================= END JE MOCKUP ================= */
/* ==========================================================================
   JE DESK STEPS - the order desk as a numbered, stepped form, 12 Sep 2026.

   Markup: the ORDER DESK STEPS snippet (snippets/order-desk-steps.php)
   inserts a .je-step__n pill at the front of each step's heading and lifts
   the Barn2 colour field into .je-colour-host after the size row. The
   numbers are CSS counters, so a step hidden by a sample mode drops out
   and the rest renumber. Chip lists other than size stretch to the full
   row (Apple-style option rows), which also removes the empty right half
   of the Closure and Print rows.

   REVERT: delete from this header to the END JE DESK STEPS marker.
   ========================================================================== */
body.single-product form.cart.je-desk-steps{ counter-reset:je-step; }
body.single-product .je-step__n{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  width:20px;
  height:20px;
  margin-right:8px;
  border-radius:50%;
  background:var(--je-ink);
  color:var(--je-cream);
  font-family:var(--je-mono);
  font-size:10px;
  letter-spacing:0;
  line-height:1;
  vertical-align:middle;
  flex:0 0 20px;
}
body.single-product .je-step__n::before{ counter-increment:je-step; content:counter(je-step); }
body.single-product .je-sample__lbl,
body.single-product .je-opt__lbl,
body.single-product .je-qty__lbl,
body.single-product .je-mock__lbl{ display:inline-flex; align-items:center; }
body.single-product .je-colour-host p.wpo-option-name .je-step__n,
body.single-product .wpo-field-file_upload p.wpo-option-name .je-step__n{ margin-right:10px; }

/* Step 5, colour: lifted after the size row; same rhythm as the rows above. */
body.single-product .je-colour-host{ margin:0 0 22px; padding:0; }
body.single-product .je-colour-host .wpo-field{ margin:0; }

/* Option rows fill the width. Size keeps its own grid; closure and print
   sides stretch their one or two chips across the row. */
body.single-product ul.single-product-variable-items:not([data-attribute_name^="attribute_size"]){
  display:flex;
  width:100%;
}
body.single-product ul.single-product-variable-items:not([data-attribute_name^="attribute_size"]) li.variable-item{
  flex:1 1 0;
  min-width:0;
}
body.single-product ul.single-product-variable-items:not([data-attribute_name^="attribute_size"]) li.variable-item .variable-item-span,
body.single-product ul.single-product-variable-items:not([data-attribute_name^="attribute_size"]) li.variable-item .variable-item-span-button{
  display:block;
  text-align:center;
}

/* Breathing room between steps: the order-type panel first, then the rows. */
body.single-product form.cart .je-sample{ margin-bottom:22px; }
/* ================= END JE DESK STEPS ================= */
/* ==========================================================================
   JE POLISH - Lighthouse pass, 13 Sep 2026 (26 runs, 13 pages x 2 devices).

   1. FONT FALLBACKS. Every "Web font loaded" layout shift in the report
      (cart footer 0.23, How It Works 0.21, product rows, homepage h1) is the
      page re-flowing when Young Serif / Figtree / DM Mono arrive and replace
      the system font. Each fallback below is a system face scaled to the
      web font's average text width and given the web font's own vertical
      metrics (numbers read from the font files, second pass 13 Sep 2026:
      Young Serif = 114.8% of Georgia, Figtree = 101.5% of Arial, DM Mono =
      Courier New; Montserrat and Poppins for the theme's own headings and
      buttons), so text keeps its width AND its line height before and
      after the swap. The token stacks list them second; the theme stacks
      are re-declared in JE POLISH 2 TOP near the top of the file.
   2. CONTRAST. The brand green #03AC13 gives 3.0:1 against white, below the
      4.5:1 the audit requires for text and for white text on a green
      button. The token is now #027D0E (5.3:1 on white, 4.9:1 on cream):
      same hue, one step deeper. Theme and blog-post literals that bypass
      the token are overridden below.
   3. IMAGE SIZES. About Us and My Jute Cute Story images carry no width or
      height, so the page jumps when they load. Their real ratios are
      declared here.
   4. Small fixes: swatch image box, breadcrumb underlines in posts, the
      muted WhatsApp link, the custom-printing CTA heading (now an h2).

   REVERT: delete from this header to the END JE POLISH marker and put
   --je-green back to #03AC13 in the token block.
   ========================================================================== */
/* Fallback faces. size-adjust matches the web font's average English
   text width to the system face; the overrides copy the web font's own
   ascent, descent and line gap (read from the font files with fontTools,
   13 Sep 2026), divided by size-adjust as Chrome applies them. Bold text
   gets a bold system face with its own numbers, so headings do not swap
   from a synthetic-bold Arial. */
@font-face{ font-family:"Young Serif Fallback"; src:local("Georgia"); size-adjust:114.8%; ascent-override:91.1%; descent-override:31.9%; line-gap-override:0%; }
@font-face{ font-family:"Figtree Fallback"; src:local("Arial"); font-weight:100 500; size-adjust:101.5%; ascent-override:93.6%; descent-override:24.6%; line-gap-override:0%; }
@font-face{ font-family:"Figtree Fallback"; src:local("Arial Bold"), local("Arial-BoldMT"); font-weight:600 900; size-adjust:96.6%; ascent-override:98.4%; descent-override:25.9%; line-gap-override:0%; }
@font-face{ font-family:"DM Mono Fallback"; src:local("Courier New"); size-adjust:100%; ascent-override:99.2%; descent-override:31%; line-gap-override:0%; }
@font-face{ font-family:"Montserrat Fallback"; src:local("Arial"); font-weight:100 500; size-adjust:114.5%; ascent-override:84.5%; descent-override:21.9%; line-gap-override:0%; }
@font-face{ font-family:"Montserrat Fallback"; src:local("Arial Bold"), local("Arial-BoldMT"); font-weight:600 900; size-adjust:110.2%; ascent-override:87.9%; descent-override:22.8%; line-gap-override:0%; }
@font-face{ font-family:"Poppins Fallback"; src:local("Arial"); font-weight:100 500; size-adjust:114.1%; ascent-override:92%; descent-override:30.7%; line-gap-override:8.8%; }
@font-face{ font-family:"Poppins Fallback"; src:local("Arial Bold"), local("Arial-BoldMT"); font-weight:600 900; size-adjust:107.1%; ascent-override:98%; descent-override:32.7%; line-gap-override:9.3%; }

/* Theme literals: Kadence paints the sale badge, loop titles and archive
   buttons with its palette green (#03ac1a), which fails the same way. */
body.single-product span.onsale,
body.archive span.onsale,
ul.products li.product span.onsale{ background:var(--je-green) !important; color:#fff !important; }
ul.products li.product h2.woocommerce-loop-product__title,
ul.products li.product .woocommerce-loop-product__title a{ color:var(--je-ink) !important; }
ul.products li.product .product-action-wrap .button,
ul.products li.product .product-action-wrap a.button{ background:var(--je-green) !important; border-color:var(--je-green) !important; color:#fff !important; }

/* Blog: post-content styles use the literal green; the category chips and
   breadcrumb too. */
body.single-post .quick-answer-label,
body.single-post .stat-num,
body.single-post .mfr-note-tag,
body.single-post cite,
body.single-post .fact-number-circle,
body.single-post .author-role,
body.single-post .entry-content a:not(.cta-btn):not(.button){ color:var(--je-green) !important; }
body.single-post .fact-number,
body.single-post th,
body.single-post a.cta-btn{ background:var(--je-green) !important; color:#fff !important; }
body.single-post .breadcrumb nav{ color:#5c5c5c !important; }
body.single-post .breadcrumb nav a{ color:var(--je-green) !important; text-decoration:underline !important; text-underline-offset:3px; }
.entry-taxonomies .category-links a.category-link-posts,
body.blog .category-links a{ color:var(--je-green) !important; }

/* Pages with their own inline styles: About Us, Custom Printing, Story. */
.je-about-full .je-text a,
.je-cat-process__num,
.je-fact b,
h3.jjs-subheading{ color:var(--je-green) !important; }
.je-page a.je-btn{ background:var(--je-green) !important; color:#fff !important; }

/* Muted links in the order desk: #A39789 gave 2.9:1. */
body.single-product form.cart a.je-wa{ color:var(--je-muted-deep) !important; }

/* Image boxes declared before the file arrives (About Us, Story). */
.je-about-full .je-hero img{ aspect-ratio:1681/335; width:100%; height:auto; }
.je-about-full .je-image img{ aspect-ratio:811/733; width:100%; height:auto; }
.je-about-full .je-mascot img{ aspect-ratio:3375/4219; width:100%; height:auto; }
.jjs-col-img img{ width:100%; height:auto; object-fit:cover; }
.jjs-col-img img[src*="My-Journey-Begins-in-Nature"],
.jjs-col-img img[src*="Transforming-from-Plant"]{ aspect-ratio:3/2; }
.jjs-col-img img[src*="Crafting-Sustainable-Elegance"],
.jjs-col-img img[src*="Why-Im-the-Eco-Star-4"]{ aspect-ratio:1/1; }
.jjs-col-img img[src*="Why-Im-the-Eco-Star.png"],
.jjs-col-img img[src*="Why-Im-the-Eco-Star-2"]{ aspect-ratio:2/3; }
/* Swatch thumbnails (hidden behind the text chip) keep a fixed box. */
body.single-product .variable-item-image{ width:100px; height:100px; }

/* Custom Printing CTA heading is an h2 now (SITE POLISH promotes it). */
.je-page .je-cta h2{ font-family:var(--je-display); font-weight:400; font-size:26px; line-height:1.25; margin:0 0 10px; color:var(--je-ink); }
/* Kadence paints the main add-to-cart button with its palette green too. */
body.single-product form.cart button.single_add_to_cart_button{ background:var(--je-green) !important; border-color:var(--je-green) !important; color:#fff !important; }
/* After-run fixes, 13 Sep 02:30. */
.je-cat-cta a.je-cat-btn, a.je-cat-btn{ color:#fff !important; }
.je-about-full .je-hero-overlay{ background:rgba(36,26,18,.58) !important; }
.jjs-section a, .jjs-para a{ color:var(--je-green) !important; }
body.single-product .product_meta a,
body.single-product .product_meta{ color:var(--je-muted-deep) !important; }
body.single-product .woocommerce-tabs ul.tabs li a{ color:var(--je-soil) !important; }
/* The homepage shot: its box is known before the image arrives (960x720). */
.je-h-shot{ aspect-ratio:4/3; }
/* ================= END JE POLISH ================= */
/* ==========================================================================
   JE POLISH 2 - 13 Sep 2026, second Lighthouse pass (order desk and the
   WhatsApp tooltip). The theme font stacks of this pass sit near the top
   of the file (JE POLISH 2 TOP).

   1. CLOSURE CHIPS FROM THE FIRST PAINT. The ladder snippet used to turn
      the plugin's 100px image swatches (Open Top, Zip...) into text chips
      with inline styles after the page had painted: a 0.07 layout shift
      on every product page. The same chip is now drawn here, before any
      script runs; the snippet sees li::after carrying the value and
      leaves the row alone. Browsers without :has() (2022 and older) keep
      the old script path, unchanged.
   2. WHATSAPP TOOLTIP. Joinchat's "Need Help" bubble is white; the plugin
      leaves its text a pale grey (1.2:1). Ink on white.

   REVERT: delete from this header to the END JE POLISH 2 marker.
   ========================================================================== */
body.single-product ul.single-product-variable-items[data-attribute_name^="attribute_closure"] li.variable-item.image-variable-item{
  display:flex !important; align-items:center !important; justify-content:center !important; flex-shrink:0 !important;
  border:1px solid var(--je-rule) !important; border-radius:2px !important; margin:0 !important; background:#fff !important;
  box-shadow:none !important; height:auto !important; min-height:0 !important; width:auto !important; min-width:90px !important;
  padding:11px 20px !important; cursor:pointer !important;
}
body.single-product ul.single-product-variable-items[data-attribute_name^="attribute_closure"] li.variable-item.image-variable-item .variable-item-contents{ display:none !important; }
body.single-product ul.single-product-variable-items[data-attribute_name^="attribute_closure"] li.variable-item.image-variable-item:not(:has(.je-image-swatch-text))::after{
  content:attr(data-value) !important; display:block !important; position:static !important; inset:auto !important; transform:none !important;
  width:auto !important; height:auto !important; margin:0 !important; padding:0 !important; border:0 !important; background:none !important;
  box-shadow:none !important; opacity:1 !important; visibility:visible !important; pointer-events:none;
  font-size:14px !important; line-height:normal !important; font-family:inherit !important; font-weight:400 !important; white-space:nowrap !important; color:var(--je-ink) !important;
}
body.single-product ul.single-product-variable-items[data-attribute_name^="attribute_closure"] li.variable-item.image-variable-item.selected,
body.single-product ul.single-product-variable-items[data-attribute_name^="attribute_closure"] li.variable-item.image-variable-item[aria-checked="true"]{ border-color:var(--je-ink) !important; background:var(--je-ink) !important; }
body.single-product ul.single-product-variable-items[data-attribute_name^="attribute_closure"] li.variable-item.image-variable-item.selected::after,
body.single-product ul.single-product-variable-items[data-attribute_name^="attribute_closure"] li.variable-item.image-variable-item[aria-checked="true"]::after{ color:#fff !important; }

.joinchat .joinchat__tooltip, .joinchat .joinchat__tooltip div{ color:var(--je-ink) !important; }
/* ================= END JE POLISH 2 ================= */
