/**
 * Ratlam's Heritage — custom styles
 *
 * Single source of truth for all custom CSS on this site.
 *
 * Why here and not elsewhere:
 *   - Elementor Free has no per-widget/section Custom CSS panel.
 *   - Elementor Free has no WooCommerce Builder, so shop/product/cart/checkout
 *     can only be restyled from this file (or via template overrides).
 *   - Customizer "Additional CSS" lives in the database and does NOT deploy
 *     with the theme files, so it is not usable as the primary home.
 *
 * The Header rules below were migrated out of Customizer → Additional CSS
 * (custom_css post ID 9) on 2026-08-17. Rule order is preserved exactly as it
 * was there, because several rules rely on source order to resolve. Do not
 * reorder or merge them without checking the header on: home, an inner page,
 * the blog, and the shop.
 *
 * Keep sections in the order below. Add new sections rather than appending
 * loose rules at the bottom.
 */

/* ==========================================================================
   Global / variables
   ==========================================================================
 * Palette is anchored to the physical packaging (dark brown + gold), so the
 * site and the pouch stay in the same family.
 *
 * The one cool value, --rh-seal, is lifted from the green veg mark printed on
 * the pack. Everything else is warm; without a cool anchor nothing has anything
 * to push against. It carries verification meaning only — GI seal, in stock,
 * pincode serviceable — never decoration.
 *
 * --rh-ghee is a LINE colour. Gold is used for rules, seals and underscores,
 * never as a full-section background wash; that is what made the previous
 * design read as undifferentiated.
 */

:root {
  --rh-ink:    #2a1810;  /* pouch brown, near-black — primary dark surface */
  --rh-sev:    #c9761b;  /* the colour of fried sev — accents, active states */
  --rh-ghee:   #e8b23a;  /* gold — rules and seals only */
  --rh-paper:  #f4ede0;  /* warm off-white reading surface */
  --rh-laung:  #6b3410;  /* clove brown — secondary text */
  --rh-seal:   #1e5b4f;  /* verification green, from the pack's veg mark */

  --rh-rule:   rgba(42, 24, 16, 0.14);
  --rh-sunk:   rgba(42, 24, 16, 0.05);

  --rh-display: "Fraunces", Georgia, "Times New Roman", serif;
  --rh-body:    "Instrument Sans", system-ui, -apple-system, "Segoe UI", sans-serif;
  --rh-mono:    "IBM Plex Mono", ui-monospace, "SFMono-Regular", Menlo, monospace;
  --rh-deva:    "Halant", "Noto Sans Devanagari", serif;

  --rh-gap:     clamp(1.5rem, 4vw, 3.5rem);

  /* Announcement bar height. Referenced by the sticky-header offset, which has to
   * match it exactly — see the Sticky header block. */
  --rh-bar-h:   2.25rem;

  /* The content measure the design is drawn to. Astra's own container width is
   * set in the Customizer and so lives in the database; this keeps the sections
   * built in this file aligned to each other regardless of that setting.
   *
   * Raised from the mockup's 1200px: the comp was drawn at a 1600px preview, and
   * on a real 1920px display 1200px left the page looking inset and the cart's
   * summary column too narrow for live courier labels. */
  --rh-measure: 1320px;

  /* A semicircular arch on short piers — the arcade from the wordmark.
   * Used on product images and on the forthcoming placeholder. */
  --rh-arch:    50% 50% 6px 6px / 38% 38% 6px 6px;

  /* Paper grain. Heritage reads as texture and impression, not as gradient —
   * this replaces the gold washes with something closer to printed stock. */
  --rh-grain: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Cfilter id='g'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='180' height='180' filter='url(%23g)' opacity='0.055'/%3E%3C/svg%3E");
}


/* ==========================================================================
   Page surface
   ==========================================================================
 * Two lines that fix one reported symptom: a band of a *different* cream sitting
 * between the header and the breadcrumb on /shop/.
 *
 * What was happening: Astra sets `#primary { margin: 4em 0 }`, and `#content` —
 * the element that carries the paper background — has no padding or border of its
 * own, so that 58px top margin **collapsed straight out of it** and pushed the
 * whole paper block down the page. The strip it left behind was showing `body`,
 * which the Customizer had set to #fef9e1, a yellower cream than --rh-paper.
 *
 * `display: flow-root` establishes a block formatting context, which is what stops
 * a child's margin escaping. The 58px of air is unchanged — it is simply inside
 * the paper now instead of above it. The body colour is corrected as well, so the
 * overscroll area and any future gap match rather than announcing themselves.
 */

/* `!important` because Elementor writes a per-page background into its own
 * stylesheet — `body.elementor-page-15:not(…)` at specificity (0,3,1), from a
 * setting that lives in the database. /about/ and /contact/ therefore came out
 * white while /shop/ took the paper. Those two pages already discard Elementor's
 * layout (see astra_child_plain_content()); its leftover page background is part
 * of what is being discarded. */
body {
  background-color: var(--rh-paper) !important;
}

.site-content {
  display: flow-root;
}


/* ==========================================================================
   Header
   ========================================================================== */

/* --- Primary navigation colours ------------------------------------------
 * REMOVED 2026-08-17. Seven rules migrated from Customizer → Additional CSS
 * previously lived here, keyed on body:not(.woocommerce-page), body.home,
 * body.blog and body:not(.home), each with !important. They overlapped by
 * design ("partly superseded by" was in the original comment), hardcoded
 * #ffffff / #1a1a1a / #f0a500 — none of which is in the palette — and could
 * only be reasoned about by reading all seven together.
 *
 * They are replaced by the .rh-header--ink / .rh-header--paper pair further
 * down, which turns the whole thing into one axis: which surface the header sits
 * on. See inc/header.php for where that class is set.
 *
 * Kept in the git-less deployment record on purpose — if the nav colour looks
 * wrong on the blog archive specifically, that is the case the old
 * body.blog rule handled and the variant class now has to cover.
 * -------------------------------------------------------------------------- */


/* --- Full-width header HTML block ---------------------------------------- */

/* Full-width announcement slot.
 *
 * This previously used `width: 100vw` with `margin-left: calc(-50vw + 50%)` to
 * break out of the site container. That was never needed —
 * .site-header-above-section-center is already the full viewport width — and
 * 100vw includes the scrollbar, so the bar sat 8px left of the viewport and
 * bled off the right edge. Plain 100% is exact.
 *
 * The children also need to be told to fill: .ast-builder-layout-element is a
 * flex container, so its block children shrink-to-fit their content (which left
 * the bar 974px wide inside a full-width slot). `min-width: 0` keeps them
 * shrinkable too — without it a flex item refuses to go below its content width
 * and inflates the header, which is what put the whole page into horizontal
 * overflow back when this slot held a `width: max-content` marquee. */
.ast-header-html-1 {
  width: 100% !important;
  max-width: 100% !important;
  margin-left: 0 !important;
  padding: 0 !important;
}

.ast-header-html-1,
.ast-header-html-1 .ast-builder-html-element,
.ast-header-html-1 .ast-header-html {
  min-width: 0;
  max-width: 100%;
}

.ast-header-html-1 .ast-builder-html-element,
.ast-header-html-1 .ast-header-html {
  flex: 1 1 auto;
  width: 100%;
}

/* Astra's above-header wrap has a Customizer-set height (50px here) and is a
 * CSS grid whose auto-sized track is centred, so the 34px bar sat with an 8px
 * cream sliver above and below — which reads as a mistake on a dark full-bleed
 * bar. Rather than fight the grid's alignment (and re-break it whenever that
 * Customizer height changes), the wrap carries the same ink: leftover row space
 * is then indistinguishable from the bar. */
.ast-above-header-wrap,
.ast-above-header-bar {
  background-color: var(--rh-ink) !important;
  background-image: none !important;
}

.ast-above-header-bar {
  padding: 0 !important;
}

/* min-height is the real fix for the sliver described above.
 *
 * .site-above-header-wrap is a grid carrying Astra's Customizer "height" setting
 * — 50px here — while the bar inside it is 36px. That mismatch left 14px of dead
 * row, which the ink background above only *hid*. Zeroing it makes the strip as
 * tall as its content and takes 14px off every page's header, which is 14px of
 * viewport back above the fold. The ink on the wrap stays as belt-and-braces in
 * case that Customizer value changes again. */
.site-above-header-wrap {
  padding: 0 !important;
  min-height: 0 !important;
  max-width: 100% !important;
}


/* --- Sticky header -------------------------------------------------------
 * Astra's own sticky header is a Pro addon; the free theme ships the
 * .ast-header-sticked classes but none of the behaviour. Six lines of position:
 * sticky is the whole feature, so it is implemented here rather than treated as a
 * missing capability.
 *
 * The announcement bar is deliberately NOT sticky. It carries a one-time message
 * — read once, then it is spent — whereas the nav and the cart total are
 * persistent utility. Pinning both would cost 100px of every screen for the sake
 * of a line someone has already read.
 *
 * The sticky element must be #masthead itself, NOT the inner
 * .ast-main-header-wrap. A sticky box only travels within its parent's padding
 * box, and the masthead is ~104px tall — so sticking the inner wrap pinned it for
 * 104px of scroll and then let it leave with the header. Measured navTop: -861 at
 * scrollTop 900, i.e. no stickiness at all.
 *
 * Instead the masthead sticks, offset upward by exactly the announcement bar's
 * height. The bar is parked just above the viewport once scrolled — spent, out of
 * the way, and back when you scroll up — while the nav bar lands at y=0.
 *
 * That is why --rh-bar-h exists and why .rh-bar's height is pinned to it rather
 * than left to its content: the offset and the bar have to agree exactly, or the
 * nav bar sits a few pixels off the top edge.
 *
 * One selector covers desktop and mobile — Astra renders both variants inside
 * this masthead.
 *
 * z-index 99 sits above page content but below Astra's mobile off-canvas menu
 * (1000+), so an open menu is not trapped behind the header.
 * ------------------------------------------------------------------------- */

#masthead {
  position: sticky;
  top: calc(-1 * var(--rh-bar-h));
  z-index: 99;
}

/* Shrink slightly once pinned, and cast a shadow.
 *
 * The shadow is what tells you the bar is floating over content rather than
 * sitting in the page; without it an opaque header reads as a hard crop. The logo
 * also gives back a few pixels. .rh-stuck is set by assets/js/header.js. */
.rh-stuck #masthead {
  box-shadow: 0 6px 24px rgba(42, 24, 16, 0.28);
}

.rh-stuck .ast-primary-header-bar .site-primary-header-wrap {
  padding-top: 0.35rem !important;
  padding-bottom: 0.35rem !important;
}

.rh-stuck .ast-primary-header-bar .custom-logo {
  height: clamp(2.2rem, 3.4vw, 2.9rem);
}

/* Only the shrink animates. The shadow is instant so the pin reads as immediate,
 * while the logo easing keeps it from snapping. */
.ast-primary-header-bar .custom-logo,
.ast-primary-header-bar .site-primary-header-wrap {
  transition: height 0.22s ease, padding 0.22s ease;
}

@media (prefers-reduced-motion: reduce) {

  .ast-primary-header-bar .custom-logo,
  .ast-primary-header-bar .site-primary-header-wrap {
    transition: none;
  }
}


/* --- Announcement bar ----------------------------------------------------
 * Markup comes from inc/announcement-bar.php, injected into Astra's HTML-1
 * slot — see that file for why it is not stored in the Customizer.
 *
 * Static on desktop. The previous marquee moved constantly while carrying the
 * least urgent information on the page, and none of the comparable brands
 * scrolls theirs. Below 768px the four messages cannot share a line, so they
 * crossfade instead — a calmer device than scrolling, and one that degrades to
 * a single static message under prefers-reduced-motion.
 *
 * The old navy #1a1a2e was the only cold value in an otherwise warm palette;
 * this uses --rh-ink so the bar belongs to the same system as everything else.
 * -------------------------------------------------------------------------- */

.rh-bar {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  max-width: 100%;
  min-width: 0;
  /* Fixed, not min-height: the sticky-header offset is -1 * this value, so any
   * drift here shows up as the nav bar sitting off the top edge. */
  height: var(--rh-bar-h);
  padding: 0 1.25rem;
  background-color: var(--rh-ink);
  overflow: hidden;
}

/* One message at a time, at every width.
 *
 * Four competing lines get skimmed as a texture; a single line gets read. The
 * items are absolutely stacked so the bar height never changes as messages of
 * different lengths swap — a rotating bar that reflows would push the whole page
 * down four times a minute. */
.rh-bar__list {
  position: relative;
  display: block;
  width: 100%;
  height: 1.4em;
  margin: 0;
  padding: 0;
  list-style: none;
}

.rh-bar__item {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  margin: 0;
  font-family: var(--rh-mono);
  font-size: 0.68rem;
  font-weight: 400;
  letter-spacing: 0.14em;
  line-height: 1.4;
  text-transform: uppercase;
  color: var(--rh-paper);
  text-align: center;
  opacity: 0;
  animation: rh-bar-cycle 18s infinite both;
}

.rh-bar__item:nth-child(1) { animation-delay: 0s; }
.rh-bar__item:nth-child(2) { animation-delay: 4.5s; }
.rh-bar__item:nth-child(3) { animation-delay: 9s; }
.rh-bar__item:nth-child(4) { animation-delay: 13.5s; }

/* Hold on hover or keyboard focus. Auto-advancing content that cannot be
 * stopped fails WCAG 2.2.2, and on a shop it is simply rude to move the
 * shipping threshold out from under someone mid-read. */
.rh-bar:hover .rh-bar__item,
.rh-bar:focus-within .rh-bar__item {
  animation-play-state: paused;
}

/* Four items at 25% of an 18s cycle each, run SEQUENTIALLY: each message is fully
 * out before the next starts in.
 *
 * A true crossfade is wrong here. Overlapping images blend; overlapping text at
 * 50/50 just reads as a smudge — measured at 0.49 opacity on the outgoing line
 * for ~0.44s of every cycle when the windows overlapped. Ending the fade-out at
 * 24% and starting the next at 25% leaves a 0.18s beat: imperceptible as a gap,
 * and each message is legible for its whole turn. */
@keyframes rh-bar-cycle {
  0%          { opacity: 0; transform: translateY(0.22em); }
  1.5%, 23%   { opacity: 1; transform: none; }
  24.5%, 100% { opacity: 0; transform: translateY(-0.22em); }
}

@media (max-width: 767px) {

  .rh-bar {
    padding: 0 1rem;
  }

  .rh-bar__item {
    font-size: 0.64rem;
    letter-spacing: 0.1em;
  }
}

/* No motion: hold the first message — the shipping threshold — and drop the
 * rest rather than cycling them. */
@media (prefers-reduced-motion: reduce) {

  .rh-bar__item {
    animation: none;
    opacity: 0;
  }

  .rh-bar__item:first-child {
    opacity: 1;
    transform: none;
  }
}


/* --- Primary header bar --------------------------------------------------
 * Two variants, switched by a body class set in inc/header.php:
 *
 *   .rh-header--ink    front page — the hero below it is a dark full-bleed
 *                      section, so a paper header would read as a separate bar
 *                      sitting on top of the design instead of part of it.
 *   .rh-header--paper  everywhere else, which all open on paper.
 *
 * Astra's own transparent-header handling already puts the front-page masthead
 * over the hero; these rules give it a surface and a border so it stops being
 * transparent, which is what made the old logo/nav float unanchored.
 * ------------------------------------------------------------------------- */

.rh-header--ink .ast-primary-header-bar {
  background-color: var(--rh-ink);
  border-bottom: 1px solid rgba(232, 178, 58, 0.22);
}

.rh-header--paper .ast-primary-header-bar {
  background-color: var(--rh-paper);
  border-bottom: 1px solid var(--rh-rule);
}

/* Header height.
 *
 * Astra's own padding put the nav bar at 105px, which with the 50px announcement
 * wrap made a 155px header — on a 1080px-tall laptop that is 14% of the viewport
 * spent before the page begins, and it is why the header read as one heavy slab
 * rather than a bar. !important is needed because Astra sets this padding as
 * inline dynamic CSS from the Customizer.
 *
 * Together with the min-height fix above this brings the header to ~108px. */
/* Astra pads BOTH the outer bar and the inner wrap, and they nest — so setting
 * the same value on both applied it twice (45px of padding around a 49px content
 * row). The outer is zeroed and the inner carries the whole gap. */
.ast-primary-header-bar.main-header-bar {
  padding-top: 0 !important;
  padding-bottom: 0 !important;
  min-height: 0 !important;
}

/* Padding is the lever for header height, NOT logo size.
 *
 * The first attempt at a shorter header shrank the logo to 44px, which just made
 * the wordmark small — it is a wide horizontal lockup, so height is the only
 * thing giving it presence. Trimming the padding instead buys the same vertical
 * space and lets the logo grow: 56px mark inside a ~72px bar, against the
 * original 52px mark inside a 105px bar. Bigger logo, shorter header. */
.ast-primary-header-bar .site-primary-header-wrap {
  padding-top: 0.5rem !important;
  padding-bottom: 0.5rem !important;
  min-height: 0 !important;
}

.ast-primary-header-bar .custom-logo {
  height: clamp(2.75rem, 4.4vw, 4rem);
  width: auto;
  max-height: none;
}

/* --- Primary navigation --------------------------------------------------
 * Replaces the seven inherited Customizer rules removed above.
 *
 * !important is still needed here: Astra prints its nav colours as dynamic CSS
 * inline in the document head, which an external stylesheet cannot outrank on
 * specificity or order. This is the one place in this file where !important is
 * load-bearing rather than inherited.
 * ------------------------------------------------------------------------- */

.rh-header--ink #ast-hf-menu-1 > li > .menu-link,
.rh-header--ink .ast-nav-menu > li > .menu-link {
  color: var(--rh-paper) !important;
}

.rh-header--paper #ast-hf-menu-1 > li > .menu-link,
.rh-header--paper .ast-nav-menu > li > .menu-link {
  color: var(--rh-ink) !important;
}

.rh-header--ink #ast-hf-menu-1 > li > .menu-link:hover,
.rh-header--ink #ast-hf-menu-1 > .current-menu-item > .menu-link,
.rh-header--ink #ast-hf-menu-1 > .current_page_item > .menu-link {
  color: var(--rh-ghee) !important;
}

.rh-header--paper #ast-hf-menu-1 > li > .menu-link:hover,
.rh-header--paper #ast-hf-menu-1 > .current-menu-item > .menu-link,
.rh-header--paper #ast-hf-menu-1 > .current_page_item > .menu-link {
  color: var(--rh-sev) !important;
}

#ast-hf-menu-1 > li > .menu-link {
  font-family: var(--rh-body);
  font-size: 0.9rem;
  font-weight: 500;
  letter-spacing: 0.01em;
}

/* --- Utility link (Track order) ------------------------------------------
 * Rendered by inc/header.php into the slot Astra's account menu used to hold.
 * Mono uppercase, deliberately quieter than the nav: it is a returning-customer
 * errand, not a browsing destination.
 * ------------------------------------------------------------------------- */

.rh-utility__link {
  display: inline-block;
  padding: 0.5rem 0;
  font-family: var(--rh-mono);
  font-size: 0.66rem;
  letter-spacing: 0.13em;
  text-transform: uppercase;
  text-decoration: none;
  white-space: nowrap;
  transition: color 0.2s ease;
}

.rh-header--ink .rh-utility__link { color: rgba(244, 237, 224, 0.62); }
.rh-header--paper .rh-utility__link { color: var(--rh-laung); }

.rh-header--ink .rh-utility__link:hover,
.rh-header--ink .rh-utility__link:focus-visible { color: var(--rh-ghee); }

.rh-header--paper .rh-utility__link:hover,
.rh-header--paper .rh-utility__link:focus-visible { color: var(--rh-sev); }

/* --- Cart chip -----------------------------------------------------------
 * Astra's cart is a basket glyph plus a count bubble. This makes it a bordered
 * chip reading "CART ₹340", because the rupee figure is the number that decides
 * whether the basket has cleared the ₹400 free-shipping threshold — a count
 * does not. The glyph is hidden rather than removed so Astra's flyout, which
 * binds to the same anchor, keeps working.
 * ------------------------------------------------------------------------- */

.ast-header-woo-cart .astra-icon,
.ast-header-woo-cart .ast-cart-menu-wrap {
  display: none !important;
}

.ast-header-woo-cart .ast-site-header-cart .cart-container {
  display: inline-flex;
  flex: none;
  align-items: center;
  white-space: nowrap;
  padding: 0.55rem 1rem;
  border: 1px solid transparent;
  border-radius: 4px;
  text-decoration: none;
  transition: background-color 0.2s ease, border-color 0.2s ease;
}

/* nowrap is essential, not cosmetic. Between roughly 950px and 1100px the header's
 * right cluster gets squeezed and the chip wrapped one character per line — "CART
 * ₹199" rendered as a vertical column of letters. The chip must never wrap. */
.ast-header-woo-cart .ast-woo-header-cart-info-wrap {
  display: inline-flex;
  align-items: baseline;
  gap: 0.5rem;
  white-space: nowrap;
  padding: 0 !important;
  font-family: var(--rh-mono);
  font-size: 0.7rem;
  font-weight: 400 !important;
  letter-spacing: 0.08em;
  line-height: 1.2 !important;
}

.ast-woo-header-cart-title {
  text-transform: uppercase;
}

/* WooCommerce wraps the amount in its own spans; the price and the symbol both
 * need the colour, so target the wrapper and let it inherit. */
.ast-woo-header-cart-total,
.ast-woo-header-cart-total .amount,
.ast-woo-header-cart-total .woocommerce-Price-currencySymbol {
  color: inherit;
  font-family: var(--rh-mono);
}

/* Ink header: outlined chip, gold label, paper figure. */
.rh-header--ink .ast-header-woo-cart .cart-container {
  border-color: rgba(232, 178, 58, 0.45);
}

.rh-header--ink .ast-woo-header-cart-title { color: var(--rh-ghee); }
.rh-header--ink .ast-woo-header-cart-total { color: var(--rh-paper); }

.rh-header--ink .ast-header-woo-cart .cart-container:hover,
.rh-header--ink .ast-header-woo-cart .cart-container:focus-visible {
  background-color: rgba(232, 178, 58, 0.12);
  border-color: var(--rh-ghee);
}

/* Paper header: solid ink chip. Inverted rather than outlined, because on paper
 * an outlined chip is the same weight as the nav beside it and stops reading as
 * the one action in the header. */
.rh-header--paper .ast-header-woo-cart .cart-container {
  background-color: var(--rh-ink);
  border-color: var(--rh-ink);
}

.rh-header--paper .ast-woo-header-cart-title { color: var(--rh-ghee); }
.rh-header--paper .ast-woo-header-cart-total { color: var(--rh-paper); }

.rh-header--paper .ast-header-woo-cart .cart-container:hover,
.rh-header--paper .ast-header-woo-cart .cart-container:focus-visible {
  background-color: var(--rh-sev);
  border-color: var(--rh-sev);
}

.rh-header--paper .ast-header-woo-cart .cart-container:hover .ast-woo-header-cart-title {
  color: var(--rh-paper);
}

.ast-header-woo-cart .cart-container:focus-visible {
  outline: 2px solid var(--rh-sev);
  outline-offset: 2px;
}

/* Right-hand cluster: the utility link and the cart chip read as one group.
 *
 * The cart chip is forced last. Astra emits the components in the order they sit
 * in `header-desktop-items` (woo-cart, then account — and the Track order link
 * replaces account), which puts the chip before the link. The chip is the
 * primary action and belongs at the outside edge, so `order` reverses the pair
 * without a Customizer change. */
.site-header-primary-section-right {
  gap: 1rem;
  flex: none;
}

/* The nav is what should give way when the header runs out of room, not the cart. */
.ast-primary-header-bar .site-header-primary-section-center {
  min-width: 0;
}

.site-header-primary-section-right .ast-header-woo-cart {
  order: 2;
}

/* --- Mobile header -------------------------------------------------------
 * The mobile menu trigger came through as a solid #f0a500 square — the last of
 * the old orange, and the loudest thing on the page at 390px. Outlined gold on
 * ink instead: it is a control, not a call to action.
 *
 * Astra prints the trigger's colours as inline dynamic CSS, hence !important —
 * the same constraint as the nav links.
 * ------------------------------------------------------------------------- */

.ast-mobile-header-wrap .ast-button-wrap .menu-toggle,
.ast-mobile-header-wrap .ast-button-wrap .menu-toggle.ast-mobile-menu-trigger-fill,
.ast-mobile-header-wrap .ast-button-wrap .menu-toggle.ast-mobile-menu-trigger-minimal {
  display: flex;
  align-items: center;
  /* Astra leaves the button at `justify-content: normal`, so the 20px icon sits
   * hard against the left edge of the 44px tap target and the three bars read as
   * off-centre inside their gold box. This is the "menu bar not aligned" report. */
  justify-content: center;
  min-width: 2.75rem;
  min-height: 2.75rem;
  padding: 0;
  border-radius: 4px !important;
  background-color: transparent !important;
}

/* The icon span is a flex item; without this it can still be nudged by Astra's
 * `svg-baseline` vertical-align. */
.ast-mobile-header-wrap .ast-button-wrap .menu-toggle .mobile-menu-toggle-icon {
  display: flex;
  align-items: center;
  justify-content: center;
}

/* --- Mobile header: the same ink/paper pair as the desktop one -----------
 *
 * This block used to paint the mobile header ink on EVERY template, with a
 * comment claiming that was fine because "the dark logo is the one Astra serves".
 * That sentence was the bug. `astra_child_ink_header_logo()` swaps in the light
 * logo only when the header is ink, and it decides that from `is_front_page()` —
 * so on /shop/, /cart/, every article and every policy page, the mobile header
 * was ink while the logo served was the DARK one. A dark wordmark on a dark brown
 * bar is invisible, which is exactly what was reported.
 *
 * CSS cannot pick a different image, so the surface has to follow the logo rather
 * than the other way round. The mobile header now honours the same
 * `.rh-header--ink` / `.rh-header--paper` body class as the desktop header, which
 * removes the special case entirely: ink plus light logo on the front page, paper
 * plus dark logo everywhere else.
 *
 * The colour goes on the *wrap*, not on `.ast-primary-header-bar`. Astra insets
 * that bar by its own horizontal padding (measured 339px inside a 375px
 * viewport), so colouring the bar alone left an 18px sliver down each edge. Same
 * shape of problem as the above-header wrap further up this file: colour the
 * container, let the inner padding inset only the content.
 * ------------------------------------------------------------------------- */

.rh-header--ink .ast-mobile-header-wrap,
.rh-header--ink .ast-mobile-header-wrap .ast-main-header-wrap {
  background-color: var(--rh-ink);
}

.rh-header--paper .ast-mobile-header-wrap,
.rh-header--paper .ast-mobile-header-wrap .ast-main-header-wrap {
  background-color: var(--rh-paper);
}

.rh-header--ink .ast-mobile-header-wrap .ast-main-header-wrap {
  border-bottom: 1px solid rgba(232, 178, 58, 0.22);
}

.rh-header--paper .ast-mobile-header-wrap .ast-main-header-wrap {
  border-bottom: 1px solid var(--rh-rule);
}

.ast-mobile-header-wrap .ast-primary-header-bar,
.ast-mobile-header-wrap .ast-below-header-bar {
  background-color: transparent !important;
  border-bottom: 0;
}

/* The trigger follows the surface. Astra prints its colours as inline dynamic
 * CSS, hence !important — the same constraint as the nav links. */
.rh-header--ink .ast-mobile-header-wrap .ast-button-wrap .menu-toggle {
  border: 1px solid rgba(232, 178, 58, 0.45) !important;
  color: var(--rh-ghee) !important;
}

.rh-header--ink .ast-mobile-header-wrap .ast-button-wrap .menu-toggle .ast-mobile-svg {
  fill: var(--rh-ghee);
}

.rh-header--paper .ast-mobile-header-wrap .ast-button-wrap .menu-toggle {
  border: 1px solid rgba(42, 24, 16, 0.25) !important;
  color: var(--rh-ink) !important;
}

.rh-header--paper .ast-mobile-header-wrap .ast-button-wrap .menu-toggle .ast-mobile-svg {
  fill: var(--rh-ink);
}

/* --- Mobile logo: let the aspect ratio survive --------------------------
 *
 * Astra emits, at the mobile breakpoint,
 * `.ast-header-break-point .site-branding img { max-width: 100px; width: 100px }`
 * — a FIXED width. Against the fixed height this file sets for the desktop bar
 * that produced a squashed wordmark: the file is 130×74, so 100px wide needs 57px
 * of height, and it was being forced into 44px. That is the "logo compressed by
 * the header height" that was reported, and it is a distortion rather than a crop.
 *
 * Width is released to `auto` so the height drives, and `object-fit: contain`
 * guards the ratio in case a future Astra rule pins both dimensions again. */
.ast-header-break-point .site-branding img,
.ast-header-break-point .custom-logo-link img,
.ast-mobile-header-wrap .custom-logo {
  width: auto !important;
  max-width: 60vw !important;
  /* px, not rem, and deliberately so: Astra's responsive typography sets the
   * root font-size to 14.592px at this breakpoint, so `2.75rem` was quietly
   * resolving to 40px rather than the 44px it reads as. Header furniture is one
   * of the few places where the intended pixel size is the point. */
  height: 48px;
  object-fit: contain;
}

/* A taller bar than Astra's default. The bar was content-height — 40px, exactly
 * the logo — so the wordmark's arcade and the "HERITAGE" line under it were both
 * rendering under 6px tall, legible only if you already knew what it said. 68px
 * gives the 48px logo 10px of air top and bottom.
 *
 * `!important` because Astra's dynamic CSS prints `min-height: 0` for the mobile
 * bar and wins on specificity. */
.ast-mobile-header-wrap .ast-primary-header-bar {
  min-height: 68px !important;
}

/* Logo and trigger on one baseline. With the ratio fixed the bar is only as tall
 * as its contents, so both items centre rather than the taller one setting the
 * height and the shorter one floating. */
.ast-mobile-header-wrap .ast-primary-header-bar .site-primary-header-wrap {
  align-items: center;
}

/* `margin: 0` is the whole fix for "the logo and the menu button are not on the
 * same line", and it is worth writing down because it looks like an alignment
 * problem and is not.
 *
 * Astra ships `.site-branding { margin-bottom: 5px }`. In a flex row, alignment
 * centres the *margin box*, so a 40px logo carrying 5px of bottom margin makes a
 * 45px line and then sits at the top of it, while the trigger — which has no
 * margin — centres in the same 45px. The logo ended up 2.5px high. Every
 * `align-items: center` in the chain was already correct and none of them could
 * fix it; only removing the margin can. */
.ast-mobile-header-wrap .site-branding,
.ast-mobile-header-wrap .ast-site-identity {
  display: flex;
  align-items: center;
  margin: 0;
  padding: 0;
}


/* ==========================================================================
   Footer
   ==========================================================================
 * Markup comes from inc/footer.php, which REPLACES Astra's footer builder
 * output rather than restyling it — see that file for why (short version:
 * Astra's footer content lives in widgets, and widgets live in the database, so
 * they would not deploy with the theme).
 *
 * Consequence for anyone reading this later: Appearance → Customize → Footer
 * Builder no longer affects the front end.
 */

.rh-footer {
  background-color: var(--rh-ink);
  background-image: var(--rh-grain);
  background-repeat: repeat;
  color: var(--rh-paper);
}

/* --- Arcade frieze -------------------------------------------------------
 * The arcade from the wordmark, run as a repeating band across the top of the
 * footer.
 *
 * One repeating background tile, not the 18–26 inline <svg> elements the mockup
 * drew per instance: it costs nothing in the DOM and fills any width without
 * counting arches. The gold is baked into the data URI because a URL-encoded SVG
 * cannot read a CSS custom property — so if --rh-ghee ever changes, this hex has
 * to be changed with it (%23e8b23a is #e8b23a).
 * ------------------------------------------------------------------------- */

.rh-frieze {
  height: 2.5rem;
  border-bottom: 1px solid rgba(232, 178, 58, 0.28);
  background-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2244%22%20height%3D%2240%22%20viewBox%3D%220%200%2044%2040%22%3E%3Cpath%20d%3D%22M4%2040%20L4%2021%20A18%2018%200%200%201%2040%2021%20L40%2040%22%20fill%3D%22none%22%20stroke%3D%22%23e8b23a%22%20stroke-width%3D%221%22%20opacity%3D%220.3%22%2F%3E%3C%2Fsvg%3E");
  background-repeat: repeat-x;
  background-position: center bottom;
}

.rh-footer__inner {
  display: grid;
  grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1.1fr);
  gap: 2.75rem;
  max-width: var(--rh-measure, 1200px);
  margin: 0 auto;
  padding: 3.4rem 2.5rem 2.5rem;
}

/* `.rh-footer .rh-footer__logo`, not `.rh-footer__logo`, and the extra class is
 * load-bearing: WooCommerce ships `.woocommerce-page img { height: auto;
 * max-width: 100% }`, which outranks a single class. On /shop/, /cart/ and every
 * product page — and nowhere else — the footer wordmark was ignoring its 3.6rem
 * height and rendering at the full 339px column width, 203px tall. That is the
 * footer that was reported as "not proper"; the same footer on /about/ looked
 * correct, which is what made it confusing. */
.rh-footer .rh-footer__logo {
  display: block;
  width: auto;
  height: 3.6rem;
  max-width: 100%;
}

.rh-footer__wordmark {
  margin: 0;
  font-family: var(--rh-display);
  font-weight: 600;
  font-size: 1.4rem;
  color: var(--rh-paper);
}

.rh-footer__blurb {
  max-width: 19rem;
  margin: 1.15rem 0 0;
  font-family: var(--rh-body);
  font-size: 0.9rem;
  line-height: 1.6;
  color: rgba(244, 237, 224, 0.55);
  text-wrap: pretty;
}

/* The record line — FSSAI and the address. Mono, because this is the pack's
 * voice: printed fact, not copy. overflow-wrap guards the email on narrow
 * columns. */
.rh-footer__record {
  margin: 1rem 0 0;
  font-family: var(--rh-mono);
  font-size: 0.62rem;
  line-height: 1.9;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  overflow-wrap: anywhere;
  color: rgba(232, 178, 58, 0.72);
}

.rh-footer__record a {
  color: inherit;
  text-decoration: none;
}

.rh-footer__record a:hover {
  color: var(--rh-ghee);
}

.rh-footer__heading {
  margin: 0 0 1rem;
  font-family: var(--rh-mono);
  font-size: 0.62rem;
  font-weight: 500;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--rh-ghee);
}

.rh-footer__links {
  display: flex;
  flex-direction: column;
  gap: 0.7rem;
  margin: 0;
  padding: 0;
  list-style: none;
}

.rh-footer__links a {
  font-family: var(--rh-body);
  font-size: 0.9rem;
  line-height: 1.4;
  text-decoration: none;
  color: rgba(244, 237, 224, 0.7);
  transition: color 0.2s ease;
}

.rh-footer__links a:hover,
.rh-footer__links a:focus-visible {
  color: var(--rh-ghee);
}

.rh-footer__place {
  margin: 0;
  font-family: var(--rh-display);
  font-weight: 600;
  font-size: 1.35rem;
  line-height: 1.2;
  color: var(--rh-paper);
}

.rh-footer__social {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.625rem;
  margin: 1.25rem 0 0;
  padding: 0;
  list-style: none;
}

.rh-footer__social a {
  display: flex;
  align-items: center;
  justify-content: center;
  min-width: 2.375rem;
  min-height: 2.375rem;
  border: 1px solid rgba(232, 178, 58, 0.35);
  border-radius: 4px;
  font-family: var(--rh-mono);
  font-size: 0.72rem;
  letter-spacing: 0.06em;
  text-decoration: none;
  color: var(--rh-ghee);
  transition: background-color 0.2s ease, border-color 0.2s ease;
}

.rh-footer__social a:hover,
.rh-footer__social a:focus-visible {
  background-color: rgba(232, 178, 58, 0.14);
  border-color: var(--rh-ghee);
}

.rh-footer__social-text a {
  padding: 0 0.9rem;
  text-transform: uppercase;
}

/* --- Base bar ------------------------------------------------------------ */

.rh-footer__base {
  border-top: 1px solid rgba(232, 178, 58, 0.18);
}

.rh-footer__base-inner {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  gap: 0.75rem 1.5rem;
  max-width: var(--rh-measure, 1200px);
  margin: 0 auto;
  padding: 1.15rem 2.5rem;
  font-family: var(--rh-mono);
  font-size: 0.62rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: rgba(244, 237, 224, 0.4);
}

/* --- Footer responsive --------------------------------------------------- */

@media (max-width: 992px) {

  /* Brand column spans, link columns pair up — four narrow columns turn the
   * link labels into two-line wraps well before this width. */
  .rh-footer__inner {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 2.25rem;
  }

  .rh-footer__col--brand {
    grid-column: 1 / -1;
  }
}

@media (max-width: 600px) {

  /* Two columns, not one. Collapsing all four slots to a single column made the
   * footer 878px tall on a 390px screen — four headings and eleven links in one
   * unbroken vertical run, which is what "make it better" was about. The two link
   * lists are four short items each and sit side by side comfortably at 160px;
   * the brand block and the origin block span. Same footer, 40% shorter. */
  .rh-footer__inner {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 2rem 1.25rem;
    padding: 2.25rem 1.25rem 1.75rem;
  }

  .rh-footer__col--brand,
  .rh-footer__col--origin {
    grid-column: 1 / -1;
  }

  /* The wordmark is a lockup — arcade over Devanagari over "HERITAGE" — so it
   * needs real height to stay readable. 3.6rem resolves against Astra's 14.592px
   * mobile root, i.e. 52px, and the arcade closes up. Fixed px, for the same
   * reason as the header logo. */
  .rh-footer .rh-footer__logo {
    height: 74px;
  }

  .rh-footer__blurb {
    max-width: none;
    margin-top: 0.9rem;
  }

  /* A rule under the brand block, so the two link columns read as a new band
   * rather than as more of the same list. */
  .rh-footer__col--brand {
    padding-bottom: 1.5rem;
    border-bottom: 1px solid rgba(232, 178, 58, 0.16);
  }

  /* The origin block gets its own rule above it, matching the one under the brand
   * block, so the footer reads as three bands rather than one long column.
   *
   * "Ratlam, / Madhya Pradesh" and the IG / X / Contact row deliberately stay
   * stacked. Side by side they measure 159px + 164px + a gap against 339px of
   * column — it fits by four pixels, which is not a layout, it is a coincidence
   * waiting for a longer place name or a wider system font. */
  .rh-footer__col--origin {
    padding-top: 1.25rem;
    border-top: 1px solid rgba(232, 178, 58, 0.16);
  }

  .rh-footer__social {
    margin-top: 0.9rem;
  }

  .rh-footer__base-inner {
    padding: 1rem 1.25rem;
  }

  .rh-frieze {
    height: 1.75rem;
  }
}

@media (prefers-reduced-motion: reduce) {

  .rh-footer__links a,
  .rh-footer__social a,
  .rh-footer__record a,
  .rh-utility__link,
  .ast-header-woo-cart .ast-site-header-cart .cart-container {
    transition: none;
  }
}


/* ==========================================================================
   Home page — Direction A
   ==========================================================================
 * Markup comes from inc/home.php via page-templates/home-a.php.
 *
 * The page is a sequence of full-bleed bands that alternate ink and paper, so
 * every section owns its own background and re-establishes the measure inside
 * itself (--rh-measure). That is why nothing here sits in Astra's .ast-container:
 * an inset ink band stops being a band.
 *
 * Type sizes use clamp() with the mockup's desktop value as the maximum, so the
 * design is exact at ~1200px and degrades continuously below it rather than
 * stepping at breakpoints.
 */

.rh-home {
  background-color: var(--rh-paper);
}

/* --- Shared home primitives ---------------------------------------------- */

.rh-eyebrow {
  margin: 0 0 0.75rem;
  font-family: var(--rh-mono);
  font-size: 0.69rem;
  font-weight: 500;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: var(--rh-sev);
}

.rh-eyebrow--gold {
  color: var(--rh-ghee);
}

.rh-h2 {
  margin: 0;
  font-family: var(--rh-display);
  font-optical-sizing: auto;
  font-weight: 600;
  font-size: clamp(2rem, 4.2vw, 3.125rem);
  line-height: 1.02;
  letter-spacing: -0.02em;
  color: var(--rh-ink);
  text-wrap: pretty;
}

.rh-h2--paper {
  color: var(--rh-paper);
}

/* Buttons. Gold = the one primary action per band; ghost = the secondary.
 * Never two golds in one band, which is what made the old orange "Shop Now"
 * buttons stop meaning anything. */
.rh-btn {
  display: inline-block;
  padding: 0.95rem 1.9rem;
  border: 1px solid transparent;
  border-radius: 4px;
  font-family: var(--rh-body);
  font-size: 0.9rem;
  font-weight: 600;
  letter-spacing: 0.03em;
  line-height: 1.2;
  text-align: center;
  text-decoration: none;
  cursor: pointer;
  transition: background-color 0.2s ease, border-color 0.2s ease, color 0.2s ease, transform 0.2s ease;
}

.rh-btn:hover,
.rh-btn:focus-visible {
  transform: translateY(-1px);
}

.rh-btn--gold {
  background-color: var(--rh-ghee);
  border-color: var(--rh-ghee);
  color: var(--rh-ink);
}

.rh-btn--gold:hover,
.rh-btn--gold:focus-visible {
  background-color: var(--rh-sev);
  border-color: var(--rh-sev);
  color: var(--rh-paper);
}

/* --- .rh-btn inside a .woocommerce wrapper -------------------------------
 *
 * WooCommerce ships `.woocommerce button.button` — specificity (0,2,1) — which
 * outranks `.rh-btn` and `.rh-btn--gold` at (0,1,0). Any theme button rendered
 * inside a WooCommerce wrapper therefore came out in Astra's global colour
 * (#e98c00) in Open Sans at 12.7px, regardless of the classes on it. The verify
 * screen's "Show my order" button carried `rh-btn rh-btn--gold` and rendered
 * bright orange.
 *
 * Third time this exact trap has been hit in this file — see the footer logo and
 * the article surface. `.woocommerce` + element + class is (0,2,1) and ties;
 * doubling the class makes it (0,3,1) and settles it.
 * ------------------------------------------------------------------------- */

.woocommerce button.rh-btn.rh-btn,
.woocommerce a.rh-btn.rh-btn,
.woocommerce input.rh-btn.rh-btn {
  padding: 0.95rem 1.9rem;
  border: 1px solid transparent;
  border-radius: 4px;
  font-family: var(--rh-body);
  font-size: 0.9rem;
  font-weight: 600;
  letter-spacing: 0.03em;
  line-height: 1.2;
  text-align: center;
  text-transform: none;
}

.woocommerce button.rh-btn.rh-btn--gold,
.woocommerce a.rh-btn.rh-btn--gold,
.woocommerce input.rh-btn.rh-btn--gold {
  background-color: var(--rh-ghee);
  border-color: var(--rh-ghee);
  color: var(--rh-ink);
}

.woocommerce button.rh-btn.rh-btn--gold:hover,
.woocommerce button.rh-btn.rh-btn--gold:focus-visible,
.woocommerce a.rh-btn.rh-btn--gold:hover,
.woocommerce a.rh-btn.rh-btn--gold:focus-visible,
.woocommerce input.rh-btn.rh-btn--gold:hover,
.woocommerce input.rh-btn.rh-btn--gold:focus-visible {
  background-color: var(--rh-sev);
  border-color: var(--rh-sev);
  color: var(--rh-paper);
}

.woocommerce button.rh-btn.rh-btn--ghost-ink,
.woocommerce a.rh-btn.rh-btn--ghost-ink,
.woocommerce input.rh-btn.rh-btn--ghost-ink {
  background-color: transparent;
  border-color: var(--rh-ink);
  color: var(--rh-ink);
}

.woocommerce button.rh-btn.rh-btn--ghost-ink:hover,
.woocommerce a.rh-btn.rh-btn--ghost-ink:hover,
.woocommerce input.rh-btn.rh-btn--ghost-ink:hover {
  background-color: var(--rh-ink);
  color: var(--rh-paper);
}

.rh-btn--ghost-paper {
  border-color: rgba(244, 237, 224, 0.3);
  color: var(--rh-paper);
}

.rh-btn--ghost-paper:hover,
.rh-btn--ghost-paper:focus-visible {
  border-color: var(--rh-ghee);
  color: var(--rh-ghee);
}

.rh-btn--ghost-ink {
  border-color: var(--rh-ink);
  color: var(--rh-ink);
}

.rh-btn--ghost-ink:hover,
.rh-btn--ghost-ink:focus-visible {
  background-color: var(--rh-ink);
  color: var(--rh-paper);
}

/* Underlined mono link — the "read more" voice. */
.rh-link {
  display: inline-block;
  margin-top: 1.5rem;
  padding-bottom: 3px;
  border-bottom: 1px solid var(--rh-rule);
  font-family: var(--rh-mono);
  font-size: 0.69rem;
  letter-spacing: 0.15em;
  text-transform: uppercase;
  text-decoration: none;
  color: var(--rh-laung);
  transition: color 0.2s ease, border-color 0.2s ease;
}

.rh-link:hover,
.rh-link:focus-visible {
  color: var(--rh-ink);
  border-color: var(--rh-ink);
}

.rh-link--gold {
  border-bottom-color: rgba(232, 178, 58, 0.4);
  color: var(--rh-ghee);
}

.rh-link--gold:hover,
.rh-link--gold:focus-visible {
  color: var(--rh-ghee);
  border-bottom-color: var(--rh-ghee);
}

/* Section heading pair: text left, origin mark or dek right. */
.rh-section__head {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: end;
  column-gap: var(--rh-gap);
}

.rh-section__head--split {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  justify-content: space-between;
  gap: 1.25rem;
}

.rh-section__mark {
  justify-self: end;
}

.rh-section__dek {
  max-width: 26rem;
  margin: 0;
  font-family: var(--rh-body);
  font-size: 0.97rem;
  line-height: 1.6;
  color: var(--rh-laung);
  text-wrap: pretty;
}

/* --- Hero ---------------------------------------------------------------- */

.rh-hero {
  position: relative;
  background-color: var(--rh-ink);
  background-image: var(--rh-grain);
  background-repeat: repeat;
  overflow: hidden;
}

.rh-hero__inner {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 0.92fr);
  align-items: center;
  gap: 2.5rem;
  max-width: var(--rh-measure);
  margin: 0 auto;
  padding: 4.5rem 2.5rem 0;
}

.rh-hero__text {
  padding-bottom: 4.5rem;
}

.rh-hero .rh-eyebrow {
  margin-bottom: 1.375rem;
  letter-spacing: 0.26em;
}

.rh-hero__title {
  margin: 0;
  font-family: var(--rh-display);
  font-optical-sizing: auto;
  font-weight: 600;
  font-size: clamp(2.6rem, 6vw, 4.625rem);
  line-height: 0.95;
  letter-spacing: -0.025em;
  color: var(--rh-paper);
  text-wrap: pretty;
}

.rh-hero__deva {
  margin: 0.875rem 0 0;
  font-family: var(--rh-deva);
  font-size: clamp(1.25rem, 2.2vw, 1.625rem);
  font-weight: 500;
  line-height: 1.3;
  color: var(--rh-ghee);
}

.rh-hero__body {
  max-width: 34rem;
  margin: 1.375rem 0 0;
  font-family: var(--rh-body);
  font-size: clamp(1rem, 1.4vw, 1.09rem);
  line-height: 1.6;
  color: rgba(244, 237, 224, 0.72);
  text-wrap: pretty;
}

.rh-hero__actions {
  display: flex;
  flex-wrap: wrap;
  gap: 0.75rem;
  margin-top: 2rem;
}

.rh-hero__media {
  position: relative;
  align-self: end;
}

/* A drop-shadow filter, not a box-shadow: the pack shot is a transparent PNG
 * cut-out, so the shadow has to follow the pouches rather than a rectangle. */
.rh-hero__img {
  display: block;
  width: 100%;
  height: auto;
  filter: drop-shadow(0 26px 46px rgba(0, 0, 0, 0.55));
}

.rh-hero__proof {
  border-top: 1px solid rgba(232, 178, 58, 0.4);
  border-bottom: 1px solid rgba(232, 178, 58, 0.4);
}

.rh-hero__proof-inner {
  max-width: var(--rh-measure);
  margin: 0 auto;
  padding: 0 2.5rem;
}

/* Proof strip, ink variant. Same device as the shop lead.
 *
 * Doubled class (.rh-proof.rh-proof--ink) is deliberate and load-bearing. The
 * base .rh-proof lives in the Shop section, which comes AFTER this one in the
 * file, so at equal specificity the base rule won on source order — and its
 * colour is --rh-laung, a dark brown, which on ink rendered the whole rail as
 * near-invisible dark-on-dark. It also re-applied the gold top and bottom borders
 * that this variant is meant to drop, doubling them against .rh-hero__proof's own
 * rules.
 *
 * Doubling the class rather than moving the rule keeps each section's styles in
 * its own section, which is the organising rule for this file.
 *
 * The seal's double ring switches its inner colour to the surface it sits on, or
 * it reads as a cream dot with a green halo. */
.rh-proof.rh-proof--ink {
  margin: 0;
  border-top: 0;
  border-bottom: 0;
  color: rgba(244, 237, 224, 0.78);
}

.rh-proof.rh-proof--ink .rh-proof__seal {
  box-shadow: 0 0 0 2px var(--rh-ink), 0 0 0 3px var(--rh-seal);
}

/* The separator hairlines have to lift on ink too — at 0.14-alpha ink they were
 * invisible, so the items ran together as one string. */
.rh-proof.rh-proof--ink .rh-proof__item + .rh-proof__item::before {
  background-color: rgba(232, 178, 58, 0.75);
}

/* --- The range ----------------------------------------------------------- */

.rh-range {
  max-width: var(--rh-measure);
  margin: 0 auto;
  padding: 4.5rem 2.5rem 3.5rem;
}

/* The product bands are the shop's specimen rows, rendered from the same
 * template. On the home page there is no .woocommerce body class, so Astra's
 * product grid never applies and only the list reset is needed. */
.rh-products {
  display: block;
  margin: 0;
  padding: 0;
  list-style: none;
}

.rh-products > li.product {
  width: 100%;
  max-width: none;
  margin: 0;
  float: none;
}

/* --- Ink band (ledger) --------------------------------------------------- */

.rh-band--ink {
  background-color: var(--rh-ink);
  background-image: var(--rh-grain);
  background-repeat: repeat;
}

.rh-band__inner {
  max-width: var(--rh-measure);
  margin: 0 auto;
  padding: 4.5rem 2.5rem;
}

.rh-ledger-layout {
  display: grid;
  grid-template-columns: minmax(0, 0.85fr) minmax(0, 1.15fr);
  align-items: start;
  gap: var(--rh-gap);
}

.rh-band__body {
  margin: 1.25rem 0 0;
  font-family: var(--rh-body);
  font-size: 1rem;
  line-height: 1.65;
  color: rgba(244, 237, 224, 0.66);
  text-wrap: pretty;
}

/* --- The spec ledger ----------------------------------------------------
 * The mockup's central new device, reused for nutrition, receipts, order
 * summaries and shipment status. A real <table>: three columns of comparable
 * values is tabular data, and a screen reader should be able to announce the row
 * header with each cell.
 * ------------------------------------------------------------------------- */

.rh-ledger {
  width: 100%;
  margin: 0;
  border: 0;
  border-top: 1px solid var(--rh-ghee);
  border-bottom: 1px solid var(--rh-ghee);
  border-collapse: collapse;
  table-layout: fixed;
}

.rh-ledger th,
.rh-ledger td {
  padding: 0.85rem 1.25rem 0.85rem 0;
  border: 0;
  text-align: left;
  vertical-align: top;
  word-break: break-word;
}

.rh-ledger thead th {
  padding-top: 0.75rem;
  padding-bottom: 0.75rem;
  font-family: var(--rh-mono);
  font-size: 0.62rem;
  font-weight: 500;
  letter-spacing: 0.16em;
  text-transform: uppercase;
}

.rh-ledger tbody th {
  font-family: var(--rh-mono);
  font-size: 0.69rem;
  font-weight: 400;
  letter-spacing: 0.1em;
  text-transform: uppercase;
}

.rh-ledger tbody td {
  font-family: var(--rh-body);
  font-size: 0.9rem;
  line-height: 1.45;
}

/* Column 1 is narrower than the two value columns it labels. */
.rh-ledger thead th:first-child,
.rh-ledger tbody th {
  width: 30%;
}

/* Ink variant. "Ours" is the only column at full contrast — the comparison is
 * the argument, so the competing column is deliberately quieter rather than
 * equally weighted. */
.rh-ledger--ink thead tr {
  border-bottom: 1px solid rgba(232, 178, 58, 0.22);
}

.rh-ledger--ink tbody tr {
  border-bottom: 1px solid rgba(244, 237, 224, 0.09);
}

.rh-ledger--ink tbody tr:last-child {
  border-bottom: 0;
}

.rh-ledger--ink thead th,
.rh-ledger--ink tbody th {
  color: rgba(244, 237, 224, 0.42);
}

.rh-ledger--ink tbody td {
  color: rgba(244, 237, 224, 0.42);
}

.rh-ledger--ink thead th.rh-ledger__ours {
  color: var(--rh-ghee);
}

.rh-ledger--ink tbody td.rh-ledger__ours {
  color: var(--rh-paper);
}

/* --- Our roots ----------------------------------------------------------- */

.rh-roots__inner {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  align-items: center;
  gap: var(--rh-gap);
  max-width: var(--rh-measure);
  margin: 0 auto;
  padding: 4.5rem 2.5rem;
}

/* A flatter arch than the product windows — the pier-to-span ratio has to change
 * with the aspect ratio or a landscape image reads as a dome. */
.rh-roots__media {
  position: relative;
  margin: 0;
  border-radius: 50% 50% 6px 6px / 30% 30% 6px 6px;
  overflow: hidden;
  background-color: var(--rh-ink);
}

/* The source photograph is a cut-out on black. `screen` drops that black out
 * against the ink panel behind it, which is the difference between cloves
 * floating on the surface and a grey rectangle containing cloves. */
.rh-roots__img {
  display: block;
  width: 100%;
  height: auto;
  mix-blend-mode: screen;
  opacity: 0.9;
}

.rh-roots__caption {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  padding: 1.1rem 1.4rem;
  font-family: var(--rh-mono);
  font-size: 0.62rem;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--rh-ghee);
}

.rh-roots__body {
  margin: 1.25rem 0 0;
  font-family: var(--rh-body);
  font-size: clamp(0.97rem, 1.3vw, 1.03rem);
  line-height: 1.65;
  color: var(--rh-laung);
  text-wrap: pretty;
}

.rh-roots__body + .rh-btn {
  margin-top: 1.5rem;
}

/* --- Gifting ------------------------------------------------------------- */

.rh-gifting {
  border-top: 1px solid var(--rh-rule);
}

.rh-gifting__inner {
  max-width: var(--rh-measure);
  margin: 0 auto;
  padding: 4.4rem 2.5rem;
}

.rh-gifts {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 1.375rem;
  margin-top: 2.4rem;
}

.rh-gift {
  display: flex;
  flex-direction: column;
  background-color: var(--rh-ink);
  background-image: var(--rh-grain);
  background-repeat: repeat;
  border-radius: 6px;
  overflow: hidden;
}

/* The frieze again, at card scale. */
.rh-frieze--card {
  height: 2.125rem;
  border-bottom: 1px solid rgba(232, 178, 58, 0.3);
  background-size: 34px 32px;
}

.rh-gift__body {
  flex: 1;
  padding: 1.6rem 1.5rem 1.75rem;
}

.rh-gift__name {
  margin: 0.6rem 0 0;
  font-family: var(--rh-display);
  font-weight: 600;
  font-size: 1.55rem;
  line-height: 1.12;
  color: var(--rh-paper);
}

.rh-gift__desc {
  margin: 0.625rem 0 0;
  font-family: var(--rh-body);
  font-size: 0.9rem;
  line-height: 1.55;
  color: rgba(244, 237, 224, 0.6);
  text-wrap: pretty;
}

.rh-gift__meta {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 0.4rem 0.625rem;
  margin: 1.1rem 0 0;
}

.rh-gift__price,
.rh-gift__price .amount {
  font-family: var(--rh-mono);
  font-size: 1.1rem;
  color: var(--rh-ghee);
}

.rh-gift__weight {
  font-family: var(--rh-mono);
  font-size: 0.62rem;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: rgba(244, 237, 224, 0.4);
}

.rh-gift .rh-link {
  margin-top: 1.1rem;
}

/* --- Reviews ------------------------------------------------------------- */

.rh-reviews {
  background-color: var(--rh-sunk);
  border-top: 1px solid var(--rh-rule);
}

.rh-reviews__inner {
  max-width: var(--rh-measure);
  margin: 0 auto;
  padding: 4.4rem 2.5rem;
}

.rh-reviews .rh-eyebrow {
  margin-bottom: 1.875rem;
}

.rh-reviews__grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 1.375rem;
}

/* Gold rule on top, not a card border: the quote is a pulled excerpt, and a full
 * border would make it a tile competing with the product bands above. */
/* font-style is reset: a <blockquote> inherits italics from Astra's typography,
 * and Fraunces at 400 is already a distinct enough voice from the body sans.
 * Italicising it on top made the quotes read as an aside rather than as the
 * customer's own words. */
.rh-review {
  margin: 0;
  padding: 1.875rem 2rem;
  background-color: var(--rh-paper);
  border-top: 2px solid var(--rh-ghee);
  font-style: normal;
}

.rh-review__quote,
.rh-review__who,
.rh-review__stars {
  font-style: normal;
}

.rh-review__stars {
  display: flex;
  align-items: baseline;
  gap: 0.75rem;
  margin: 0;
  font-family: var(--rh-mono);
  font-size: 0.69rem;
  letter-spacing: 0.18em;
  color: var(--rh-sev);
}

.rh-review__quote {
  margin: 1rem 0 0;
  font-family: var(--rh-display);
  font-optical-sizing: auto;
  font-weight: 400;
  font-size: clamp(1.05rem, 1.7vw, 1.25rem);
  line-height: 1.45;
  color: var(--rh-ink);
  text-wrap: pretty;
}

.rh-review__who {
  margin-top: 1.125rem;
  font-family: var(--rh-mono);
  font-size: 0.66rem;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--rh-laung);
}

/* --- Home responsive ----------------------------------------------------- */

@media (max-width: 992px) {

  .rh-gifts {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }

  .rh-ledger-layout {
    grid-template-columns: minmax(0, 1fr);
    row-gap: 2rem;
  }
}

@media (max-width: 900px) {

  /* Hero stacks with the image second — the headline is what has to be above
   * the fold, and a pack shot pushed to the top would bury it. */
  .rh-hero__inner {
    grid-template-columns: minmax(0, 1fr);
    padding: 3rem 1.5rem 0;
    gap: 1.5rem;
  }

  .rh-hero__text {
    padding-bottom: 0;
  }

  .rh-hero__media {
    max-width: 26rem;
    margin: 0 auto -0.5rem;
  }

  .rh-hero__proof-inner,
  .rh-range,
  .rh-band__inner,
  .rh-roots__inner,
  .rh-gifting__inner,
  .rh-reviews__inner {
    padding-left: 1.5rem;
    padding-right: 1.5rem;
  }

  .rh-roots__inner {
    grid-template-columns: minmax(0, 1fr);
  }

  .rh-section__head {
    grid-template-columns: minmax(0, 1fr);
    row-gap: 1.5rem;
  }

  .rh-section__mark {
    justify-self: start;
  }

  .rh-reviews__grid {
    grid-template-columns: minmax(0, 1fr);
  }
}

@media (max-width: 600px) {

  .rh-gifts {
    grid-template-columns: minmax(0, 1fr);
  }

  .rh-hero__actions .rh-btn {
    flex: 1 1 100%;
  }

  /* The ledger's three columns cannot survive a phone. Each row becomes a
   * stacked block: attribute, ours, theirs — which is how the mockup's own
   * mobile screen handled it (as an accordion). Kept as a table so the semantics
   * and the reading order both hold. */
  .rh-ledger,
  .rh-ledger thead,
  .rh-ledger tbody,
  .rh-ledger tr,
  .rh-ledger th,
  .rh-ledger td {
    display: block;
    width: auto;
  }

  .rh-ledger thead {
    display: none;
  }

  .rh-ledger tbody tr {
    padding: 0.9rem 0;
  }

  .rh-ledger tbody th,
  .rh-ledger tbody td {
    width: auto;
    padding: 0;
  }

  .rh-ledger tbody td {
    margin-top: 0.35rem;
  }

  /* The 4.5rem indent makes room for the ::before row label below, and ONLY the
   * ink ledger has one. It was applied to every ledger, so the two-column paper
   * ledgers on /about/ and /contact/ pushed their values 65px right against
   * nothing at all — label hard left, value floating in the middle of the row,
   * which is the misalignment that was reported. */
  .rh-ledger--ink tbody td {
    padding-left: 4.5rem;
    position: relative;
  }

  /* Row labels, since the column headers are gone. */
  .rh-ledger--ink tbody td::before {
    content: "Ratlami";
    position: absolute;
    left: 0;
    top: 0.15rem;
    font-family: var(--rh-mono);
    font-size: 0.56rem;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: var(--rh-ghee);
  }

  .rh-ledger--ink tbody td:last-child::before {
    content: "Ordinary";
    color: rgba(244, 237, 224, 0.34);
  }
}

@media (prefers-reduced-motion: reduce) {

  .rh-btn,
  .rh-link {
    transition: none;
  }

  .rh-btn:hover,
  .rh-btn:focus-visible {
    transform: none;
  }
}


/* ==========================================================================
   Shop page (WooCommerce archive)
   ==========================================================================
 * Products render as full-width "specimen" bands, not a card grid: with two or
 * three SKUs a grid reads as an unfinished template. Markup comes from
 * woocommerce/content-product.php and inc/woocommerce-shop.php.
 */

.woocommerce.archive .site-content,
.woocommerce-page.archive .site-content {
  background-color: var(--rh-paper);
  background-image: var(--rh-grain);
  background-repeat: repeat;
}

/* --- Lead ---------------------------------------------------------------- */

.rh-lead {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: center;
  column-gap: var(--rh-gap);
  padding: clamp(2rem, 6vw, 4.5rem) 0 0;
}

.rh-lead__text {
  max-width: 40rem;
}

.rh-lead__deva {
  margin: 0.35rem 0 0;
  font-family: var(--rh-deva);
  font-size: clamp(1.15rem, 2.2vw, 1.5rem);
  font-weight: 400;
  line-height: 1.3;
  color: var(--rh-sev);
}

/* --- Origin mark (the signature) -----------------------------------------
 * A struck mark, not a rubber stamp: plain geometry, plainly typeset, no
 * distressing. Ours — deliberately not the official GI logo, whose use is
 * restricted to registered proprietors.
 */

.rh-lead__mark {
  justify-self: end;
}

.rh-mark {
  display: block;
  width: clamp(6rem, 11vw, 8.5rem);
  height: auto;
}

.rh-mark__rule,
.rh-mark__hair {
  fill: none;
  stroke: var(--rh-ghee);
}

.rh-mark__rule { stroke-width: 1.2; }
.rh-mark__hair { stroke-width: 0.5; }

.rh-mark__text {
  font-family: var(--rh-mono);
  font-size: 6.4px;
  font-weight: 500;
  letter-spacing: 1.7px;
  fill: var(--rh-laung);
}

.rh-mark__arch path {
  fill: none;
  stroke: var(--rh-ink);
  stroke-width: 2;
  stroke-linecap: square;
}

.rh-mark__base {
  fill: none;
  stroke: var(--rh-ghee);
  stroke-width: 1.6;
  stroke-linecap: square;
}

.rh-lead__title {
  margin: 0;
  font-family: var(--rh-display);
  font-optical-sizing: auto;
  font-weight: 600;
  font-size: clamp(2.75rem, 7vw, 4.5rem);
  line-height: 0.98;
  letter-spacing: -0.02em;
  color: var(--rh-ink);
}

.rh-lead__thesis {
  margin: 0.75rem 0 0;
  font-family: var(--rh-body);
  font-size: clamp(1.05rem, 2vw, 1.3rem);
  line-height: 1.45;
  color: var(--rh-laung);
}

/* --- Proof strip (the signature) ----------------------------------------- */

.rh-proof {
  grid-column: 1 / -1;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.5rem 1.25rem;
  margin: clamp(1.5rem, 4vw, 2.5rem) 0 0;
  padding: 0.7rem 0;
  border-top: 1px solid var(--rh-ghee);
  border-bottom: 1px solid var(--rh-ghee);
  font-family: var(--rh-mono);
  font-size: 0.72rem;
  font-weight: 500;
  letter-spacing: 0.13em;
  text-transform: uppercase;
  color: var(--rh-laung);
}

.rh-proof__seal {
  width: 0.62rem;
  height: 0.62rem;
  flex: none;
  border-radius: 50%;
  background-color: var(--rh-seal);
  box-shadow: 0 0 0 2px var(--rh-paper), 0 0 0 3px var(--rh-seal);
}

.rh-proof__item + .rh-proof__item {
  position: relative;
  padding-left: 1.25rem;
}

.rh-proof__item + .rh-proof__item::before {
  content: "";
  position: absolute;
  left: 0;
  top: 50%;
  width: 0.3rem;
  height: 1px;
  background-color: var(--rh-ghee);
}

/* --- Specimen band ------------------------------------------------------- */

/* Unwind Astra's product grid — these are rows, not cards.
 *
 * Astra ships its grid in woocommerce-grid.min.css, a separate handle that can
 * enqueue after custom.css, so load order cannot be relied on. The
 * [class*="columns-"] attribute selector outranks Astra's `.woocommerce
 * ul.products` regardless of order, and matches whatever column count the
 * customizer is set to. */
.woocommerce ul.products[class*="columns-"],
.woocommerce-page ul.products[class*="columns-"] {
  display: block;
  margin: 0;
  padding: 0;
}

.woocommerce ul.products[class*="columns-"] li.product.rh-specimen,
.woocommerce-page ul.products[class*="columns-"] li.product.rh-specimen,
.rh-specimen {
  display: grid;
  grid-template-columns: minmax(0, 22rem) minmax(0, 1fr);
  gap: var(--rh-gap);
  align-items: center;
  width: 100%;
  max-width: none;
  margin: 0;
  padding: clamp(2rem, 5vw, 3.5rem) 0;
  border-bottom: 1px solid var(--rh-rule);
  float: none;
  clear: both;
  list-style: none;
  text-align: left; /* Astra centres loop items */
}

/* Astra centres every descendant of a loop item. */
.woocommerce ul.products[class*="columns-"] li.product.rh-specimen .rh-specimen__body,
.rh-specimen__body {
  text-align: left;
}

.rh-specimen::before,
.rh-specimen::after {
  content: none;
}

/* Arch frame — the arcade lifted out of the wordmark and used as a window.
 * The image is cropped to the arch; a gold hairline sits outside it like a
 * moulding. Derived from their own logo, which is what keeps it from reading
 * as generic "Indian restaurant" ornament. */

.rh-specimen__media {
  position: relative;
  padding: 0.85rem;
}

.rh-specimen__media::before {
  content: "";
  position: absolute;
  inset: 0;
  border: 1px solid var(--rh-ghee);
  border-radius: var(--rh-arch);
  pointer-events: none;
}

.rh-specimen__media-link {
  display: block;
  border-radius: var(--rh-arch);
  overflow: hidden;
  background-color: var(--rh-sunk);
}

.rh-specimen__media img {
  display: block;
  width: 100%;
  height: auto;
  margin: 0;
  transition: transform 0.5s cubic-bezier(0.2, 0.7, 0.3, 1);
}

.rh-specimen:hover .rh-specimen__media img {
  transform: scale(1.03);
}

.rh-specimen__eyebrow {
  margin: 0 0 0.6rem;
  font-family: var(--rh-mono);
  font-size: 0.72rem;
  font-weight: 500;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--rh-sev);
}

/* Astra sets global heading faces with high specificity — match it here. */
.woocommerce ul.products li.product .rh-specimen__title,
.rh-specimen__title {
  margin: 0;
  font-family: var(--rh-display);
  font-optical-sizing: auto;
  font-weight: 600;
  font-size: clamp(1.75rem, 3.4vw, 2.6rem);
  line-height: 1.06;
  letter-spacing: -0.015em;
  color: var(--rh-ink);
}

.rh-specimen__title a {
  color: inherit;
  text-decoration: none;
  background-image: linear-gradient(var(--rh-ghee), var(--rh-ghee));
  background-repeat: no-repeat;
  background-position: 0 100%;
  background-size: 0 2px;
  transition: background-size 0.35s ease;
}

.rh-specimen__title a:hover,
.rh-specimen__title a:focus-visible {
  color: var(--rh-ink);
  background-size: 100% 2px;
}

.rh-specimen__deva {
  margin: 0.4rem 0 0;
  font-family: var(--rh-deva);
  font-size: 1.15rem;
  font-weight: 400;
  line-height: 1.35;
  color: var(--rh-sev);
}

.rh-specimen__note {
  max-width: 34rem;
  margin: 0.85rem 0 0;
  font-family: var(--rh-body);
  font-size: 1rem;
  line-height: 1.6;
  color: var(--rh-laung);
}

.rh-specimen__note p {
  margin: 0;
}

.rh-specimen__note p + p {
  margin-top: 0.5rem;
}

/* --- Spice meter --------------------------------------------------------- */

.rh-spice {
  display: flex;
  align-items: center;
  gap: 0.7rem;
  margin: 1.15rem 0 0;
  font-family: var(--rh-mono);
  font-size: 0.72rem;
  letter-spacing: 0.13em;
  text-transform: uppercase;
  color: var(--rh-laung);
}

.rh-spice__scale {
  display: inline-flex;
  gap: 3px;
}

.rh-spice__pip {
  width: 0.55rem;
  height: 0.55rem;
  border: 1px solid var(--rh-rule);
  background-color: transparent;
}

.rh-spice__pip.is-on {
  border-color: var(--rh-sev);
  background-color: var(--rh-sev);
}

.rh-spice__value {
  color: var(--rh-ink);
  font-weight: 500;
}

/* --- Size picker --------------------------------------------------------- */

.rh-sizes {
  margin: 1.6rem 0 0;
}

.rh-sizes__set {
  display: flex;
  flex-wrap: wrap;
  gap: 0.6rem;
  margin: 0;
  padding: 0;
  border: 0;
}

.rh-size {
  position: relative;
  display: flex;
  flex-direction: column;
  gap: 0.15rem;
  min-width: 6.25rem;
  padding: 0.7rem 1rem 0.75rem;
  border: 1px solid var(--rh-rule);
  border-radius: 4px;
  cursor: pointer;
  transition: border-color 0.2s ease, background-color 0.2s ease, color 0.2s ease;
}

.rh-size__input {
  position: absolute;
  opacity: 0;
  width: 1px;
  height: 1px;
  margin: 0;
}

.rh-size__weight {
  font-family: var(--rh-body);
  font-size: 0.95rem;
  font-weight: 500;
  color: var(--rh-ink);
}

.rh-size__price {
  font-family: var(--rh-mono);
  font-size: 0.85rem;
  color: var(--rh-laung);
}

.rh-size:hover {
  border-color: var(--rh-ink);
}

/* Selected: inverted, with a gold marker. */
.rh-size:has(.rh-size__input:checked) {
  background-color: var(--rh-ink);
  border-color: var(--rh-ink);
}

.rh-size:has(.rh-size__input:checked) .rh-size__weight {
  color: var(--rh-paper);
}

.rh-size:has(.rh-size__input:checked) .rh-size__price {
  color: var(--rh-ghee);
}

.rh-size:has(.rh-size__input:focus-visible) {
  outline: 2px solid var(--rh-sev);
  outline-offset: 2px;
}

.rh-size.is-out {
  opacity: 0.45;
  cursor: not-allowed;
}

.rh-size__flag {
  font-family: var(--rh-mono);
  font-size: 0.62rem;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--rh-laung);
}

/* --- Add to cart --------------------------------------------------------- */

/* text-transform is reset explicitly: Astra's button styling uppercases WooCommerce
 * buttons from the Customizer, and the design sets this one in sentence case —
 * "Add to cart" beside a price reads as an instruction, "ADD TO CART" as a
 * banner. */
.woocommerce a.rh-add,
.woocommerce button.rh-add,
.rh-add {
  display: inline-block;
  margin: 1.25rem 0 0;
  padding: 0.9rem 2.1rem;
  border: 0;
  border-radius: 4px;
  background-color: var(--rh-ink);
  color: var(--rh-paper);
  font-family: var(--rh-body);
  font-size: 0.9rem;
  font-weight: 600;
  letter-spacing: 0.04em;
  line-height: 1;
  text-transform: none;
  text-decoration: none;
  cursor: pointer;
  transition: background-color 0.2s ease, transform 0.2s ease;
}

.woocommerce a.rh-add:hover,
.woocommerce button.rh-add:hover,
.rh-add:hover,
.rh-add:focus-visible {
  background-color: var(--rh-sev);
  color: var(--rh-paper);
  transform: translateY(-1px);
}

/* --- Forthcoming specimen ------------------------------------------------ */

.rh-specimen--forthcoming {
  border-bottom: 0;
}

.rh-specimen--forthcoming .rh-specimen__eyebrow,
.rh-specimen--forthcoming .rh-specimen__title {
  color: var(--rh-laung);
  opacity: 0.75;
}

.rh-specimen__placeholder {
  aspect-ratio: 1 / 1;
  border: 1px dashed var(--rh-ghee);
  border-radius: var(--rh-arch);
  background-color: var(--rh-sunk);
}

.rh-specimen--forthcoming .rh-specimen__media::before {
  border-style: dashed;
  opacity: 0.6;
}

.rh-forthcoming {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  margin: 1.25rem 0 0;
  padding: 0.45rem 0.9rem;
  border: 1px solid var(--rh-rule);
  border-radius: 999px;
  font-family: var(--rh-mono);
  font-size: 0.68rem;
  letter-spacing: 0.15em;
  text-transform: uppercase;
  color: var(--rh-laung);
}

/* --- Responsive ---------------------------------------------------------- */

@media (max-width: 900px) {

  .rh-lead {
    grid-template-columns: minmax(0, 1fr);
    row-gap: 1.5rem;
  }

  .rh-lead__mark {
    justify-self: start;
  }
}

@media (max-width: 768px) {

  /* The `[class*="columns-"]` variants have to be repeated here, and this was a
   * live bug rather than a precaution.
   *
   * The base rule further up is
   * `.woocommerce ul.products[class*="columns-"] li.product.rh-specimen` — five
   * class-level selectors — while this override was three, so the desktop
   * `22rem | 1fr` grid survived the media query. On a 375px screen the media track
   * took 269px and the text track collapsed to 0, putting the product name and the
   * spice meter outside the viewport: the shop archive scrolled sideways to 552px
   * and the names rendered at zero width. Measured, not theorised.
   *
   * It affected the shop archive all along and only became visible when related
   * products started using the same specimen. */
  .woocommerce ul.products[class*="columns-"] li.product.rh-specimen,
  .woocommerce-page ul.products[class*="columns-"] li.product.rh-specimen,
  .woocommerce ul.products li.product.rh-specimen,
  .rh-specimen {
    grid-template-columns: minmax(0, 1fr);
    gap: 1.5rem;
    align-items: start;
  }

  .rh-specimen__media {
    max-width: 15rem;
  }

  .rh-size {
    flex: 1 1 5.5rem;
    min-width: 0;
  }

  .rh-add {
    width: 100%;
    text-align: center;
  }
}

@media (prefers-reduced-motion: reduce) {

  .rh-specimen__media img,
  .rh-specimen__title a,
  .rh-add {
    transition: none;
  }

  .rh-specimen:hover .rh-specimen__media img {
    transform: none;
  }
}


/* ==========================================================================
   Single product page
   ==========================================================================
 * Markup from inc/woocommerce-product.php. WooCommerce's own add-to-cart form is
 * NOT overridden — the size chips are injected into it and its <select> is hidden
 * here, so WooCommerce's variation script keeps handling price, stock and
 * variation_id. See that file's header for why.
 */

.single-product .site-content {
  background-color: var(--rh-paper);
  background-image: var(--rh-grain);
  background-repeat: repeat;
}

/* Astra centres single-product text by default (desktop-align-center on the
 * article). The design is left-aligned throughout. */
.single-product .ast-article-single,
.single-product .entry-summary,
.single-product .summary {
  text-align: left;
}

/* --- Breadcrumb ---------------------------------------------------------- */

.rh-crumbs {
  border-bottom: 1px solid var(--rh-rule);
}

.rh-crumbs__inner {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.5rem;
  max-width: var(--rh-measure);
  margin: 0 auto;
  padding: 0.85rem 2.5rem;
  font-family: var(--rh-mono);
  font-size: 0.66rem;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--rh-laung);
}

.rh-crumbs__inner a {
  color: var(--rh-laung);
  text-decoration: none;
}

.rh-crumbs__inner a:hover {
  color: var(--rh-ink);
}

.rh-crumbs__sep {
  color: var(--rh-ghee);
}

/* --- Two-column layout ---------------------------------------------------
 * WooCommerce's default single-product markup floats .images and .summary. The
 * floats are unwound into a grid; align-items: start keeps the summary column from
 * stretching to the gallery's height and centring its content in the gap.
 * ------------------------------------------------------------------------- */

.single-product div.product {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 0.92fr);
  align-items: start;
  column-gap: var(--rh-gap);
  max-width: var(--rh-measure);
  margin: 0 auto;
  padding: clamp(1.75rem, 4vw, 3.25rem) 2.5rem 0;
}

.single-product div.product::before,
.single-product div.product::after {
  content: none;
}

/* Unwind WooCommerce's floated two-column layout.
 *
 * This needs !important, which is worth justifying since the rest of this file
 * avoids it. The shipped rule is
 * `.woocommerce #content div.product div.summary { float: right; width: 48% }`
 * with `width` declared **!important**, so no selector can outrank it — verified
 * by testing: `width: auto` lost at equal specificity and in later source order,
 * while `width: auto !important` resolved the column to its full 510px track.
 *
 * Symptom it fixes: the summary rendered 235px inside a 510px grid track (48% of
 * the old float context), wrapping the lead paragraph after three words.
 *
 * The #content variants are kept in the list because Astra's container carries
 * id="content" and dropping to class-only selectors would lose to the ID if the
 * !important is ever removed upstream. */
.woocommerce #content div.product .rh-gallery,
.woocommerce #content div.product div.summary,
.woocommerce-page #content div.product div.summary,
.woocommerce div.product .rh-gallery,
.woocommerce div.product div.summary,
.woocommerce-page div.product div.summary {
  float: none !important;
  width: auto !important;
  max-width: none;
  margin: 0;
}

/* Everything hooked to `woocommerce_after_single_product_summary` is a child of
 * this grid, so each piece has to be told to span both columns. Without it they
 * auto-place into row 2: the tabs landed in the 554px gallery column and Related
 * products in the 510px summary column, which wrapped "Ratlami Lasan Sev" over
 * three lines in a 150px card. */
.single-product div.product .rh-nutrition,
.single-product div.product .woocommerce-tabs,
.single-product div.product .up-sells,
.single-product div.product .related {
  grid-column: 1 / -1;
}

/* --- Gallery ------------------------------------------------------------- */

.rh-gallery__frame {
  position: relative;
  padding: 1rem;
}

/* The offset gold hairline — a moulding outside the arch, the same device as the
 * shop specimen bands. */
.rh-gallery__frame::before {
  content: "";
  position: absolute;
  inset: 0;
  border: 1px solid var(--rh-ghee);
  border-radius: var(--rh-arch);
  pointer-events: none;
}

.rh-gallery__stage {
  border-radius: var(--rh-arch);
  overflow: hidden;
  background-color: var(--rh-sunk);
}

.rh-gallery__img {
  display: block;
  width: 100%;
  height: auto;
}

.rh-gallery__thumbs {
  display: flex;
  flex-wrap: wrap;
  gap: 0.625rem;
  margin-top: 0.875rem;
}

.rh-gallery__thumb {
  width: 4.875rem;
  height: 4.875rem;
  padding: 0;
  border: 1px solid var(--rh-rule);
  border-radius: 4px;
  overflow: hidden;
  background-color: var(--rh-sunk);
  cursor: pointer;
  transition: border-color 0.2s ease;
}

.rh-gallery__thumb img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.rh-gallery__thumb:hover,
.rh-gallery__thumb:focus-visible {
  border-color: var(--rh-laung);
}

.rh-gallery__thumb.is-active {
  border-color: var(--rh-ink);
}

/* --- Summary column ------------------------------------------------------ */

.rh-product__eyebrow {
  margin: 0 0 0.6rem;
  font-family: var(--rh-mono);
  font-size: 0.72rem;
  font-weight: 500;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--rh-sev);
}

.single-product .rh-product__title {
  margin: 0;
  font-family: var(--rh-display);
  font-optical-sizing: auto;
  font-weight: 600;
  font-size: clamp(2rem, 4vw, 3.125rem);
  line-height: 1.02;
  letter-spacing: -0.02em;
  color: var(--rh-ink);
  text-wrap: pretty;
}

.rh-product__deva {
  margin: 0.4rem 0 0;
  font-family: var(--rh-deva);
  font-size: clamp(1.2rem, 2vw, 1.5rem);
  font-weight: 400;
  line-height: 1.35;
  color: var(--rh-sev);
}

.rh-product__lead {
  max-width: 32rem;
  margin: 1.1rem 0 0;
  font-family: var(--rh-body);
  font-size: clamp(1rem, 1.4vw, 1.06rem);
  line-height: 1.62;
  color: var(--rh-laung);
  text-wrap: pretty;
}

.single-product .rh-spice {
  margin-top: 1.5rem;
}

/* --- WooCommerce form, restyled -----------------------------------------
 * The native select table is hidden rather than removed: WooCommerce's script
 * reads and writes it, and the chips are only a facade over it.
 *
 * The fallback: a product with more than one variation attribute gets no chips
 * (see astra_child_product_size_chips), so the table has to come back or the
 * product becomes unbuyable. `.rh-sizes--single` is only present when chips
 * rendered, so the sibling selector below keys the hiding to that.
 * ------------------------------------------------------------------------- */

/* `width`/`height` need !important, and this one is worth spelling out because the
 * bug it fixes was invisible.
 *
 * The clip-path hid the table from sight, so it looked handled — but the computed
 * width stayed 1200px, and an absolutely positioned 1200px box starting at x=811
 * extends the document's scrollable area. Measured: `scrollWidth` 2010 against a
 * 1521px viewport, i.e. the whole site scrolled ~490px sideways on every product
 * page. Nothing was visible out there; the page just scrolled.
 *
 * The plain `width: 1px` was losing in the cascade — verified by testing rather
 * than assumed: with the declaration as-is the computed width was 1200px, and
 * re-applying the identical value with !important resolved it to 1px and dropped
 * scrollWidth to exactly the viewport. `table-layout: fixed` and dropping the
 * nowrap were tried first and changed nothing. */
.single-product .variations_form .rh-sizes--single ~ .variations,
.single-product .variations_form .rh-sizes--single ~ .woocommerce-variation-add-to-cart .variations {
  position: absolute !important;
  width: 1px !important;
  height: 1px !important;
  overflow: hidden;
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  white-space: nowrap;
}

.single-product .variations_form {
  margin: 1.8rem 0 0;
  padding-top: 1.5rem;
  border-top: 1px solid var(--rh-rule);
}

/* The product page's fieldset wraps a legend AND a .rh-sizes__row, unlike the
 * shop's which holds the labels directly. It has to be display: block here —
 * inheriting the shop's `display: flex` made .rh-sizes__row a shrink-to-fit flex
 * item, so it sized to something narrower than the column and the chips wrapped
 * 2 + 1 with space still free to the right. */
.rh-sizes--single .rh-sizes__set {
  display: block;
  margin: 0;
  padding: 0;
  border: 0;
}

.rh-sizes__legend {
  display: block;
  margin: 0 0 0.8rem;
  padding: 0;
  font-family: var(--rh-mono);
  font-size: 0.66rem;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--rh-laung);
}

.rh-sizes__row {
  display: flex;
  flex-wrap: wrap;
  gap: 0.6rem;
  width: 100%;
}

/* Chips on this page are a size up from the shop's — this is the decision screen,
 * and they are the primary control on it. */
.single-product .rh-size {
  min-width: 7.5rem;
  padding: 0.85rem 1.2rem 0.9rem;
}

.single-product .rh-size__weight {
  font-size: 1.05rem;
}

/* WooCommerce's own price block. Kept visible — it is the authoritative price and
 * it updates from the variation script; the button label mirrors it. */
.single-product .woocommerce-variation-price {
  margin: 1.25rem 0 0;
}

.single-product .woocommerce-variation-price .price,
.single-product .woocommerce-variation-price .amount {
  font-family: var(--rh-display);
  font-optical-sizing: auto;
  font-weight: 600;
  font-size: 1.9rem;
  line-height: 1;
  color: var(--rh-ink);
}

/* The struck-through regular price. Every variation here is permanently on sale
 * against a price nobody is charged, so it is dimmed hard rather than shown as a
 * saving — see CHANGES.md, this is a merchandising decision for the user. */
.single-product .woocommerce-variation-price del,
.single-product .woocommerce-variation-price del .amount {
  font-family: var(--rh-mono);
  font-size: 0.95rem;
  font-weight: 400;
  color: rgba(107, 52, 16, 0.5);
}

.single-product .woocommerce-variation-availability p {
  margin: 0.5rem 0 0;
  font-family: var(--rh-mono);
  font-size: 0.66rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--rh-seal);
}

/* --- Quantity + add to cart ---------------------------------------------- */

.single-product .woocommerce-variation-add-to-cart,
.single-product form.cart:not(.variations_form) {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.75rem;
  margin: 1.5rem 0 0;
}

.single-product .quantity {
  display: flex;
  align-items: center;
  margin: 0;
  border: 1px solid rgba(42, 24, 16, 0.2);
  border-radius: 4px;
  overflow: hidden;
}

.single-product .quantity input.qty {
  width: 3.25rem;
  height: 3.125rem;
  padding: 0;
  border: 0;
  background: transparent;
  font-family: var(--rh-mono);
  font-size: 0.95rem;
  text-align: center;
  color: var(--rh-ink);
}

/* The native spinner is inconsistent across browsers and tiny on touch; the
 * field is wide enough to type into and Woo validates the value. */
.single-product .quantity input.qty::-webkit-outer-spin-button,
.single-product .quantity input.qty::-webkit-inner-spin-button {
  -webkit-appearance: none;
  appearance: none;
  margin: 0;
}

.single-product .quantity input.qty {
  -moz-appearance: textfield;
  appearance: textfield;
}

/* The add-to-cart button carries `.button.alt`, which Astra colours from the
 * Customizer's global button settings as inline dynamic CSS in <head> — measured
 * rgb(233,140,0), the old orange, uppercased. Inline theme CSS cannot be outranked
 * by an external stylesheet on specificity, so !important is required here for the
 * same reason as the nav links. */
.woocommerce div.product form.cart .single_add_to_cart_button,
.woocommerce div.product form.cart .single_add_to_cart_button.alt,
.single-product .single_add_to_cart_button {
  flex: 1 1 14rem;
  min-height: 3.125rem;
  padding: 0 1.75rem;
  border: 0 !important;
  border-radius: 4px !important;
  background-color: var(--rh-ink) !important;
  color: var(--rh-paper) !important;
  font-family: var(--rh-body);
  font-size: 0.95rem;
  font-weight: 600;
  letter-spacing: 0.03em;
  text-transform: none !important;
  cursor: pointer;
  transition: background-color 0.2s ease;
}

.woocommerce div.product form.cart .single_add_to_cart_button:hover,
.woocommerce div.product form.cart .single_add_to_cart_button.alt:hover,
.single-product .single_add_to_cart_button:hover,
.single-product .single_add_to_cart_button:focus-visible {
  background-color: var(--rh-sev) !important;
  color: var(--rh-paper) !important;
}

/* --- Shiprocket pincode check -------------------------------------------
 * The plugin outputs a bare <input> and <button> with an inline onclick and no
 * classes, styled by Astra's global button colours — so it arrived as an orange
 * "CHECK PINCODE" block directly under the ink add-to-cart, reading as a second,
 * competing primary action.
 *
 * Restyled as a secondary control: outlined, ink text, same height as the field.
 * Selected by id because that is the only handle the plugin gives.
 * ------------------------------------------------------------------------- */

#shiprocket_pincode_check {
  flex: 1 1 10rem;
  min-width: 0;
  height: 2.875rem;
  padding: 0 0.9rem;
  border: 1px solid rgba(42, 24, 16, 0.2);
  border-radius: 4px;
  background-color: var(--rh-paper);
  font-family: var(--rh-mono);
  font-size: 0.9rem;
  color: var(--rh-ink);
}

#shiprocket_pincode_check::placeholder {
  color: rgba(107, 52, 16, 0.55);
}

#check_pincode {
  flex: none;
  height: 2.875rem;
  padding: 0 1.25rem;
  border: 1px solid var(--rh-ink) !important;
  border-radius: 4px !important;
  background-color: transparent !important;
  font-family: var(--rh-body);
  font-size: 0.85rem;
  font-weight: 600;
  letter-spacing: 0.02em;
  text-transform: none !important;
  color: var(--rh-ink) !important;
  cursor: pointer;
}

#check_pincode:hover,
#check_pincode:focus-visible {
  background-color: var(--rh-ink) !important;
  color: var(--rh-paper) !important;
}

/* The plugin wraps both in a bare <div> with no class — the :has() keeps this
 * scoped to that wrapper rather than styling every div in the summary. */
.single-product div.summary div:has(> #shiprocket_pincode_check) {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.5rem;
  margin-top: 1.1rem;
}

/* WooCommerce disables the button until a variation resolves. It has to *look*
 * disabled or the page reads as broken. */
.single-product .single_add_to_cart_button.disabled,
.single-product .single_add_to_cart_button:disabled {
  opacity: 0.4;
  cursor: not-allowed;
}

/* "Clear" — needed for accessibility but not a design element. */
.single-product .reset_variations {
  display: inline-block;
  margin-top: 0.5rem;
  font-family: var(--rh-mono);
  font-size: 0.62rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--rh-laung);
}

/* --- Assurance line ------------------------------------------------------ */

/* Block, not flex.
 *
 * As a wrapping flex row the seal became its own flex item, and once the text
 * wrapped to two lines the dot was left stranded alone on the first line. Inline
 * block keeps it attached to the first word, which is what a bullet should do. */
.rh-assurance {
  display: block;
  margin: 0.9rem 0 0;
  font-family: var(--rh-mono);
  font-size: 0.66rem;
  line-height: 1.7;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--rh-seal);
}

.rh-assurance__seal {
  display: inline-block;
  width: 0.5rem;
  height: 0.5rem;
  margin-right: 0.45rem;
  vertical-align: 0.05em;
  border-radius: 50%;
  background-color: var(--rh-seal);
}

/* --- Spec ledger, paper variant ----------------------------------------- */

.rh-product__spec {
  margin: 2.2rem 0 0;
}

.rh-ledger__caption {
  margin: 0;
  padding: 0.75rem 0;
  border-top: 1px solid var(--rh-ghee);
  border-bottom: 1px solid var(--rh-rule);
  font-family: var(--rh-mono);
  font-size: 0.62rem;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--rh-sev);
}

.rh-ledger--paper {
  border-top: 0;
  border-bottom: 1px solid var(--rh-ghee);
}

/* The caption already draws the top rule, so the table must not draw a second. */
.rh-ledger__caption + .rh-ledger--paper {
  border-top: 0;
}

.rh-ledger--paper tbody tr {
  border-bottom: 1px solid rgba(42, 24, 16, 0.09);
}

.rh-ledger--paper tbody tr:last-child {
  border-bottom: 0;
}

.rh-ledger--paper tbody th {
  width: 9.5rem;
  color: var(--rh-laung);
}

.rh-ledger--paper tbody td {
  color: var(--rh-ink);
  overflow-wrap: anywhere;
}

/* Figures right-align in mono so the decimal positions line up down the column —
 * the whole point of setting a nutrition panel in a monospaced face. */
.rh-ledger--figures tbody th {
  width: auto;
  font-family: var(--rh-body);
  font-size: 0.95rem;
  letter-spacing: 0;
  text-transform: none;
  color: var(--rh-ink);
}

.rh-ledger--figures tbody td {
  padding-right: 0;
  font-family: var(--rh-mono);
  font-size: 0.9rem;
  text-align: right;
  color: var(--rh-laung);
}

/* --- Nutrition ---------------------------------------------------------- */

.rh-nutrition {
  margin-top: clamp(2.5rem, 5vw, 4.4rem);
  border-top: 1px solid var(--rh-rule);
}

.rh-nutrition__inner {
  display: grid;
  grid-template-columns: minmax(0, 0.8fr) minmax(0, 1.2fr);
  align-items: start;
  gap: var(--rh-gap);
  padding: clamp(2.25rem, 4vw, 3.25rem) 0 0;
}

.rh-h2--small {
  font-size: clamp(1.6rem, 3vw, 2.25rem);
}

.rh-nutrition__body {
  margin: 1rem 0 0;
  font-family: var(--rh-body);
  font-size: 0.97rem;
  line-height: 1.6;
  color: var(--rh-laung);
  text-wrap: pretty;
}

/* --- Product tabs, reviews and related products ---------------------------
 * Description, Additional information and Reviews, plus the related-products
 * row. These are WooCommerce's own — `woocommerce_output_product_data_tabs` and
 * `woocommerce_output_related_products`, both left hooked in
 * inc/woocommerce-product.php — restyled rather than replaced, so the
 * `woocommerce_product_tabs` filter keeps working for any plugin that registers a
 * tab.
 *
 * Astra styles this area with three-class selectors plus its own dynamic <head>
 * CSS (which is where the orange active-tab marker came from), so the selectors
 * below are deliberately deep and !important appears only on the properties Astra
 * paints inline.
 * ------------------------------------------------------------------------- */

.single-product div.product .woocommerce-tabs {
  margin: clamp(2.5rem, 5vw, 3.75rem) 0 0;
  padding-top: clamp(1.75rem, 4vw, 2.5rem);
  border-top: 1px solid var(--rh-rule);
}

/* --- The tab strip ------------------------------------------------------- */

.single-product div.product .woocommerce-tabs ul.tabs {
  display: flex;
  flex-wrap: wrap;
  gap: 0 clamp(1.25rem, 3vw, 2.25rem);
  margin: 0 0 clamp(1.5rem, 3vw, 2rem);
  padding: 0;
  list-style: none;
  border-bottom: 1px solid var(--rh-rule);
  overflow: visible;
}

.single-product div.product .woocommerce-tabs ul.tabs li {
  position: relative;
  margin: 0;
  padding: 0;
  border: 0;
  border-radius: 0;
  background: transparent;
  box-shadow: none;
}

/* WooCommerce draws little curled corners on the tabs with ::before and ::after,
 * and Astra recolours the active one from the Customizer. Both are turned off
 * here and the active state redrawn as a rule on the strip's own bottom edge. */
.single-product div.product .woocommerce-tabs ul.tabs li::before,
.single-product div.product .woocommerce-tabs ul.tabs li::after {
  content: none !important;
  display: none !important;
}

.single-product div.product .woocommerce-tabs ul.tabs li a {
  display: block;
  padding: 0 0 0.7rem;
  font-family: var(--rh-mono);
  font-size: 0.68rem;
  font-weight: 500;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--rh-laung) !important;
  text-decoration: none;
  text-shadow: none;
}

.single-product div.product .woocommerce-tabs ul.tabs li a:hover {
  color: var(--rh-ink) !important;
}

.single-product div.product .woocommerce-tabs ul.tabs li.active a {
  color: var(--rh-ink) !important;
}

/* The gold underline sits ON the strip's bottom border — 2px tall over a 1px
 * rule, offset by its own height so it covers the rule rather than floating
 * under it. */
.single-product div.product .woocommerce-tabs ul.tabs li.active a::after {
  content: "";
  position: absolute;
  right: 0;
  bottom: -1px;
  left: 0;
  height: 2px;
  background-color: var(--rh-ghee);
}

/* --- Panels -------------------------------------------------------------- */

.single-product div.product .woocommerce-tabs .panel {
  margin: 0;
  padding: 0;
  border: 0;
  box-shadow: none;
  background: transparent;
}

/* Headings inside a panel.
 *
 * WooCommerce normally prints an <h2> repeating the tab label at the top of each
 * panel, and a first version of this block hid it. Checked on this install and
 * Astra suppresses those already — every panel starts with content — so the rule
 * was doing nothing except waiting to hide a real heading the day someone put one
 * first. Removed, and the client's own sub-headings styled instead.
 *
 * The Laung Sev description carries four `<h2>`s ("Flavor Experience",
 * "Ingredients", "Storage" …) which were inheriting the 34px page-title size and
 * running the full 1120px panel width. They are section headings inside a tab, so
 * they are sized and measured as such. */
.single-product div.product .woocommerce-tabs .panel h2,
.single-product div.product .woocommerce-tabs .panel h3 {
  max-width: 42rem;
  margin: clamp(1.5rem, 3vw, 2rem) 0 0.7rem;
  font-family: var(--rh-display);
  font-optical-sizing: auto;
  font-weight: 600;
  font-size: clamp(1.15rem, 2vw, 1.375rem);
  line-height: 1.15;
  letter-spacing: -0.015em;
  color: var(--rh-ink);
  text-wrap: pretty;
}

.single-product div.product .woocommerce-tabs .panel h4,
.single-product div.product .woocommerce-tabs .panel h5,
.single-product div.product .woocommerce-tabs .panel h6 {
  max-width: 42rem;
  margin: 1.25rem 0 0.5rem;
  font-family: var(--rh-body);
  font-weight: 600;
  font-size: 1.02rem;
  letter-spacing: 0;
  color: var(--rh-ink);
}

.single-product div.product .woocommerce-tabs .panel > *:first-child {
  margin-top: 0;
}

/* Prose measure. The panel spans the full 1064px content width; body copy at that
 * width is about 165 characters a line. Capped where the eye can still find the
 * next line — the same reasoning as the editorial measure, a little narrower
 * because this copy is read standing up, deciding. */
.single-product div.product .woocommerce-tabs .panel p,
.single-product div.product .woocommerce-tabs .panel ul,
.single-product div.product .woocommerce-tabs .panel ol {
  max-width: 42rem;
  font-family: var(--rh-body);
  font-size: clamp(1rem, 1.4vw, 1.06rem);
  line-height: 1.65;
  color: var(--rh-laung);
}

.single-product div.product .woocommerce-tabs .panel p {
  margin: 0 0 1rem;
}

.single-product div.product .woocommerce-tabs .panel p:last-child {
  margin-bottom: 0;
}

.single-product div.product .woocommerce-tabs .panel ul,
.single-product div.product .woocommerce-tabs .panel ol {
  margin: 0 0 1rem;
  padding-left: 1.25rem;
}

.single-product div.product .woocommerce-tabs .panel li + li {
  margin-top: 0.35rem;
}

.single-product div.product .woocommerce-tabs .panel strong,
.single-product div.product .woocommerce-tabs .panel b {
  font-weight: 600;
  color: var(--rh-ink);
}

.single-product div.product .woocommerce-tabs .panel a {
  color: var(--rh-ink);
  text-decoration: underline;
  text-decoration-color: rgba(201, 118, 27, 0.5);
  text-underline-offset: 0.18em;
}

.single-product div.product .woocommerce-tabs .panel a:hover {
  color: var(--rh-sev);
}

/* --- Additional information --------------------------------------------- */

/* WooCommerce's attribute table, given the same ledger treatment as the
 * specification block in the summary, so the two read as the same object. */
.single-product div.product .woocommerce-product-attributes {
  width: auto;
  min-width: min(100%, 26rem);
  border-collapse: collapse;
  border: 0;
}

.single-product div.product .woocommerce-product-attributes th,
.single-product div.product .woocommerce-product-attributes td {
  padding: 0.6rem 0;
  border: 0;
  border-bottom: 1px solid var(--rh-rule);
  background: transparent;
  text-align: left;
  vertical-align: baseline;
}

.single-product div.product .woocommerce-product-attributes th {
  width: 40%;
  font-family: var(--rh-mono);
  font-size: 0.62rem;
  font-weight: 500;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--rh-laung);
}

.single-product div.product .woocommerce-product-attributes td,
.single-product div.product .woocommerce-product-attributes td p {
  margin: 0;
  max-width: none;
  font-family: var(--rh-body);
  font-size: 0.95rem;
  color: var(--rh-ink);
}

/* --- Reviews ------------------------------------------------------------ */

/* Astra sets this one `display: none` — the "1 review for <product>" heading. The
 * rule is kept because the tab label already carries the count, so if that changes
 * upstream the heading arrives styled rather than at page-title size. */
.single-product div.product #reviews #comments > h2 {
  margin: 0 0 1.25rem;
  font-family: var(--rh-mono);
  font-size: 0.66rem;
  font-weight: 500;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--rh-sev);
}

.single-product div.product #reviews ol.commentlist {
  margin: 0 0 clamp(1.75rem, 4vw, 2.5rem);
  padding: 0;
  list-style: none;
  border-top: 1px solid var(--rh-rule);
}

.single-product div.product #reviews ol.commentlist li {
  margin: 0;
  padding: 1.15rem 0;
  border-bottom: 1px solid var(--rh-rule);
}

/* The stock layout floats a 60px avatar and indents the text around it. Gravatar
 * images do not resolve for most customers of an Indian D2C store, so the avatar
 * is dropped and the space given back to the review. */
.single-product div.product #reviews ol.commentlist li img.avatar {
  display: none;
}

/* Hiding the avatar is not enough on its own: WooCommerce reserves the gutter on
 * the text instead, `margin-left: 50px` plus 25px of horizontal padding, so the
 * review stayed indented 50px with nothing in the space.
 *
 * `#comments` is in the selector because Astra's rule is
 * `.woocommerce-js #reviews #comments ol.commentlist li .comment-text` — TWO ids.
 * A single-id override lost, and lost silently: the rule applied everything except
 * the margin it existed to remove. */
.single-product div.product #reviews #comments ol.commentlist .comment_container,
.single-product div.product #reviews #comments ol.commentlist .comment-text {
  margin: 0;
  padding: 0;
  border: 0;
  border-radius: 0;
  background: transparent;
}

/* Astra frames the review form — `.woocommerce-js #reviews #review_form` with a
 * 1px border and 1.67em of padding — which drew a grey box round "Add a review"
 * inside a panel that is already delimited by its own top rule. */
.single-product div.product #reviews #review_form,
.single-product div.product #reviews #respond {
  margin: 0;
  padding: 0;
  border: 0;
  background: transparent;
}

.single-product div.product #reviews .comment-text .meta {
  margin: 0 0 0.45rem;
  font-family: var(--rh-mono);
  font-size: 0.62rem;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--rh-laung);
}

.single-product div.product #reviews .comment-text .meta strong {
  font-weight: 500;
  color: var(--rh-ink);
}

.single-product div.product #reviews .comment-text .description p {
  max-width: 42rem;
  margin: 0 0 0.6rem;
  font-family: var(--rh-body);
  font-size: 1rem;
  line-height: 1.6;
  color: var(--rh-laung);
}

/* Astra colours the stars from the Customizer as inline <head> CSS, so gold needs
 * !important here — the same constraint as the nav links and the cart buttons. */
.single-product div.product .star-rating,
.single-product div.product .star-rating::before,
.single-product div.product .comment-form-rating .stars a {
  color: var(--rh-ghee) !important;
}

.single-product div.product #reviews #review_form_wrapper {
  padding-top: clamp(1.25rem, 3vw, 1.75rem);
  border-top: 1px solid var(--rh-rule);
}

.single-product div.product #reviews #reply-title {
  display: block;
  margin: 0 0 1rem;
  font-family: var(--rh-display);
  font-optical-sizing: auto;
  font-weight: 600;
  font-size: clamp(1.2rem, 2.2vw, 1.5rem);
  letter-spacing: -0.015em;
  color: var(--rh-ink);
}

.single-product div.product #reviews .comment-form {
  max-width: 42rem;
}

.single-product div.product #reviews .comment-form label {
  display: block;
  margin-bottom: 0.4rem;
  font-family: var(--rh-mono);
  font-size: 0.62rem;
  font-weight: 500;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--rh-laung);
}

.single-product div.product #reviews .comment-form input[type="text"],
.single-product div.product #reviews .comment-form input[type="email"],
.single-product div.product #reviews .comment-form textarea {
  width: 100%;
  padding: 0.7rem 0.85rem;
  border: 1px solid var(--rh-rule);
  border-radius: 3px;
  background-color: rgba(244, 237, 224, 0.6);
  font-family: var(--rh-body);
  font-size: 0.95rem;
  color: var(--rh-ink);
}

.single-product div.product #reviews .comment-form input:focus,
.single-product div.product #reviews .comment-form textarea:focus {
  outline: 0;
  border-color: var(--rh-ghee);
}

.single-product div.product #reviews .comment-form .form-submit input[type="submit"] {
  padding: 0.8rem 1.6rem !important;
  border: 1px solid var(--rh-ghee) !important;
  border-radius: 4px !important;
  background-color: var(--rh-ghee) !important;
  font-family: var(--rh-body) !important;
  font-size: 0.9rem !important;
  font-weight: 600 !important;
  text-transform: none !important;
  color: var(--rh-ink) !important;
}

.single-product div.product #reviews .comment-form .form-submit input[type="submit"]:hover {
  border-color: var(--rh-sev) !important;
  background-color: var(--rh-sev) !important;
  color: var(--rh-paper) !important;
}

.single-product div.product #reviews .woocommerce-noreviews,
.single-product div.product #reviews .comment-notes,
.single-product div.product #reviews .comment-form-cookies-consent label {
  font-family: var(--rh-body);
  font-size: 0.92rem;
  letter-spacing: 0;
  text-transform: none;
  color: var(--rh-laung);
}

/* --- Related products --------------------------------------------------- */

/* The items come from woocommerce/content-product.php, so they arrive as the same
 * `.rh-specimen` used on the shop archive and the home range — and that is a
 * FULL-WIDTH horizontal row (22rem of arch-cropped image beside the name, price
 * and note), not a card.
 *
 * A first version here imposed `repeat(auto-fit, minmax(15rem, 18rem))` on
 * `ul.products`, which forced the specimen into a 288px track. Its inner
 * `22rem | 1fr` grid then resolved to `232px 0px` and the entire text column —
 * name, Devanagari, price — rendered at zero width, spilling out of the right
 * edge of the item. So no grid is declared here at all: the shop archive's own
 * `ul.products[class*="columns-"]` rules already lay these out correctly, and the
 * related list carries `columns-4`, so it matches them.
 *
 * Worth being straight about the value: with two products in the catalogue this
 * can only ever show the other one. Kept because it is still a reasonable next
 * step from a product page, and one full-width specimen reads as deliberate in a
 * way that one card in a four-column grid does not.
 *
 * Only the section around the list needs styling. */
.single-product div.product .related,
.single-product div.product .up-sells {
  margin: clamp(2.5rem, 5vw, 3.75rem) 0 0;
  padding-top: clamp(1.75rem, 4vw, 2.5rem);
  border-top: 1px solid var(--rh-rule);
}

.single-product div.product .related > h2,
.single-product div.product .up-sells > h2 {
  margin: 0 0 clamp(1.25rem, 3vw, 1.75rem);
  font-family: var(--rh-mono);
  font-size: 0.66rem;
  font-weight: 500;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--rh-sev);
}

.single-product div.product .related ul.products,
.single-product div.product .up-sells ul.products {
  margin: 0;
  padding: 0;
  list-style: none;
}

/* The last specimen in the list has the section's own spacing below it, so its
 * bottom rule would double up with the footer's top edge. */
.single-product div.product .related ul.products li.product:last-child,
.single-product div.product .up-sells ul.products li.product:last-child {
  border-bottom: 0;
  padding-bottom: 0;
}

/* --- Tabs and related, narrow viewports -------------------------------- */

@media (max-width: 600px) {

  /* Three mono labels at 0.68rem do fit on one line at 375px, but only just — and
   * a plugin adding a fourth tab would break them onto two rows with the gold
   * underline stranded. Scrolling keeps the strip a single row whatever is in it. */
  .single-product div.product .woocommerce-tabs ul.tabs {
    flex-wrap: nowrap;
    overflow-x: auto;
    scrollbar-width: none;
  }

  .single-product div.product .woocommerce-tabs ul.tabs::-webkit-scrollbar {
    display: none;
  }

  .single-product div.product .woocommerce-tabs ul.tabs li {
    flex: none;
  }

  .single-product div.product .woocommerce-tabs ul.tabs li a {
    white-space: nowrap;
  }
}


/* --- Product responsive -------------------------------------------------- */

@media (max-width: 900px) {

  .single-product div.product {
    grid-template-columns: minmax(0, 1fr);
    row-gap: 2rem;
    padding-left: 1.5rem;
    padding-right: 1.5rem;
  }

  .rh-crumbs__inner {
    padding-left: 1.5rem;
    padding-right: 1.5rem;
  }

  .rh-gallery {
    max-width: 26rem;
  }

  .rh-nutrition__inner {
    grid-template-columns: minmax(0, 1fr);
    row-gap: 1.5rem;
  }
}

@media (max-width: 600px) {

  /* Three sizes on one line.
   *
   * flex-basis has to be small enough that the three bases plus gaps fit the line
   * BEFORE shrinking — a wrap container breaks the line when the bases overflow
   * rather than shrinking the items, so 6rem bases (3 × 96px + gaps > 291px
   * available) wrapped to 2 + 1. min-width has to be overridden too: the
   * desktop rule sets 7.5rem, which would pin them wide regardless of basis. */
  .single-product .rh-size {
    flex: 1 1 4rem;
    min-width: 0;
    padding: 0.7rem 0.75rem 0.75rem;
  }

  .single-product .rh-size__weight {
    font-size: 0.95rem;
  }

  .single-product .single_add_to_cart_button {
    flex: 1 1 100%;
  }

  .rh-gallery__thumb {
    width: 4rem;
    height: 4rem;
  }

  /* The spec ledger's two columns are already narrow; stacking beats a 5rem
   * label column wrapping every value. */
  .rh-ledger--paper tbody th {
    width: 7rem;
  }
}

@media (prefers-reduced-motion: reduce) {

  .rh-gallery__thumb,
  .single-product .single_add_to_cart_button {
    transition: none;
  }
}


/* ==========================================================================
   Editorial — Story, Journal, article, Contact
   ==========================================================================
 * Templates: page-templates/story.php, page-templates/contact.php, home.php,
 * single.php. Shared helpers in inc/editorial.php.
 *
 * These pages render the site's OWN content (the_content()) inside the design's
 * chrome, so .rh-prose has to style whatever the editor produces — headings,
 * lists, blockquotes, tables, images — rather than a known set of blocks.
 */

.rh-editorial {
  background-color: var(--rh-paper);
  background-image: var(--rh-grain);
  background-repeat: repeat;
}

/* Belt-and-braces for the boxed container.
 *
 * inc/editorial.php filters Astra's layout option to `plain-container` on these
 * templates, which is the real fix. These rules cover the case where that option
 * is read from somewhere the filter does not reach (a page-level override in the
 * post meta, for instance) — without them the ink bands render as floating
 * rectangles inside a cream card, which is how this first appeared.
 *
 * The full-bleed bands need the wrappers to have no padding of their own, so the
 * gutters are all managed inside each section instead. */
.ast-separate-container .rh-editorial,
.ast-separate-container .rh-home,
.ast-plain-container .rh-editorial,
.ast-plain-container .rh-home {
  background-color: var(--rh-paper);
}

.ast-separate-container #content .ast-container:has(.rh-editorial),
.ast-separate-container #content .ast-container:has(.rh-home) {
  max-width: none;
  padding: 0;
}

/* Astra's boxed layout also gives #primary a 64px top margin, to float the white
 * card away from the header. With the card gone that margin is a gap showing the
 * body background — measured as a 64px pale band under the header. Zeroed, and the
 * body is given the paper ground as well so no gap anywhere can reveal Astra's
 * content colour. */
.ast-separate-container #primary:is(.rh-editorial, .rh-home),
.ast-plain-container #primary:is(.rh-editorial, .rh-home) {
  margin-top: 0;
  margin-bottom: 0;
  padding-top: 0;
  padding-bottom: 0;
}

body:has(.rh-editorial),
body:has(.rh-home) {
  background-color: var(--rh-paper);
}

.rh-editorial .ast-article-post,
.rh-editorial .ast-article-single,
.rh-editorial article.post {
  padding: 0;
  border: 0;
  background: transparent;
  box-shadow: none;
}

/* --- The two templates the block above missed -----------------------------
 *
 * `.rh-editorial` and `.rh-home` were given the paper ground; the single-post
 * template and the policy/FAQ document template were not, because their article
 * elements (`.rh-article`, `.rh-document__article`) are not wrapped in either.
 * Both templates run under `ast-separate-container`, whose card Astra paints
 * `--ast-global-color-5` — white.
 *
 * The result, found by looking rather than by measuring: every blog post, every
 * policy document, the FAQ and the order-tracking page rendered as a **white
 * sheet** on a paper site.
 * Nothing else on the site is white. It is unmistakable next to the header, and
 * it survived this long because a white reading surface looks deliberate until
 * you scroll up to the paper masthead sitting directly above it.
 *
 * The grain comes with it, for the same reason it is on .rh-editorial: a flat
 * fill next to a grained one reads as a different colour even when it is not.
 * ------------------------------------------------------------------------- */
/* Both classes in the selector, and `:not(.ast-related-post)` carried over from
 * Astra's own rule, purely to win specificity: Astra writes
 * `.ast-separate-container .ast-article-single:not(.ast-related-post)` at (0,3,0),
 * and a two-class selector at (0,2,0) loses to it silently. */
.ast-separate-container .ast-article-single:not(.ast-related-post).rh-article,
.ast-separate-container .ast-article-single:not(.ast-related-post).rh-document__article,
.ast-separate-container .ast-article-single:not(.ast-related-post).rh-track__article {
  background-color: var(--rh-paper);
  background-image: var(--rh-grain);
  background-repeat: repeat;
}

/* The comment form was the same white card, nested inside the article's. With
 * both on paper the form would have no edge at all, so it gets the site's own
 * divider instead of a panel — a hairline rule, the way every other section
 * break on the site is drawn. */
.ast-separate-container .comments-area .comment-respond {
  background-color: transparent;
  border-top: 1px solid var(--rh-rule);
}

/* --- Prose ---------------------------------------------------------------
 * A grid, not a max-width container.
 *
 * Body copy sits in a ~34rem column — about 70 characters, the range where the
 * eye reliably finds the next line. Images, tables and pull-quotes are then given
 * `grid-column: wide` and step out past the text without needing wrapper markup,
 * which matters because the markup comes out of the editor and cannot be wrapped.
 * ------------------------------------------------------------------------- */

/* Text column widened, and made fluid rather than fixed.
 *
 * It was 34rem — about 70 characters, the classic readability optimum — but on a
 * 1920px display that read as a narrow ribbon in a field of empty page, which is
 * what was reported. A fixed 42rem fixed it at 1536px and still looked inset at
 * 1920px, so the column now grows with the viewport:
 *
 *   clamp(34rem, 44vw, 48rem)   →  1280px: 563px   1536px: 676px   1920px: 768px
 *
 * Worth stating the trade-off plainly: 48rem at this body size is roughly 95
 * characters, past the 70–85 range where the eye most reliably finds the next
 * line. It is wider on purpose. Lower the 48rem cap if long articles start feeling
 * tiring to read. The `wide` gutters grow with it so images and tables still step
 * out visibly. */
.rh-prose {
  display: grid;
  grid-template-columns:
    minmax(1.25rem, 1fr)
    [wide-start] minmax(0, 9rem)
    [text-start] minmax(0, clamp(34rem, 44vw, 48rem)) [text-end]
    minmax(0, 9rem) [wide-end]
    minmax(1.25rem, 1fr);
  row-gap: 1.15rem;
}

.rh-prose > * {
  grid-column: text;
  margin: 0;
}

.rh-prose > p {
  font-family: var(--rh-body);
  font-size: clamp(1.02rem, 1.5vw, 1.1rem);
  line-height: 1.72;
  color: var(--rh-ink);
  text-wrap: pretty;
}

.rh-prose > h2 {
  margin: 1.4rem 0 0;
  font-family: var(--rh-display);
  font-optical-sizing: auto;
  font-weight: 600;
  font-size: clamp(1.5rem, 2.6vw, 1.9rem);
  line-height: 1.15;
  letter-spacing: -0.02em;
  color: var(--rh-ink);
  text-wrap: pretty;
}

.rh-prose > h3 {
  margin: 1rem 0 0;
  font-family: var(--rh-body);
  font-size: 1.15rem;
  font-weight: 600;
  line-height: 1.3;
  color: var(--rh-ink);
}

/* The editor's content on this site opens with an <h1> (it was written as page
 * copy, not as a block template). The template already prints the real page
 * title, so a second h1 in the prose is demoted visually — it stays an h1 in the
 * markup because rewriting the client's content is not this file's job. */
.rh-prose > h1 {
  margin: 1.4rem 0 0;
  font-family: var(--rh-display);
  font-weight: 600;
  font-size: clamp(1.5rem, 2.6vw, 1.9rem);
  line-height: 1.15;
  letter-spacing: -0.02em;
  color: var(--rh-ink);
}

.rh-prose > ul,
.rh-prose > ol {
  padding-left: 1.25rem;
  font-family: var(--rh-body);
  font-size: 1.02rem;
  line-height: 1.7;
  color: var(--rh-ink);
}

.rh-prose > ul li + li,
.rh-prose > ol li + li {
  margin-top: 0.4rem;
}

.rh-prose a {
  color: var(--rh-sev);
  text-decoration: underline;
  text-decoration-thickness: 1px;
  text-underline-offset: 0.2em;
}

.rh-prose a:hover {
  color: var(--rh-ink);
}

.rh-prose strong {
  font-weight: 600;
  color: var(--rh-ink);
}

/* --- Stat row ------------------------------------------------------------
 * Built by astra_child_maybe_stat_row() from a counter widget Elementor's
 * fallback had flattened into a <br> run — see inc/editorial.php for the parse
 * and for why it is deliberately hard to trigger.
 *
 * Three across at every width. The figures are short (100+, 100+, 1) and the
 * labels are two or three words, so a 115px column at 390px takes a two-line
 * label and still reads as a row of three rather than a list of nine lines,
 * which is what it was rendering as.
 * ------------------------------------------------------------------------- */

.rh-prose > .rh-stats {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 0.75rem;
  margin: 1.5rem 0 1rem;
  padding: 1.25rem 0;
  border-top: 1px solid var(--rh-rule);
  border-bottom: 1px solid var(--rh-rule);
  list-style: none;
}

/* The selector is over-qualified on purpose: this resets
 * `.rh-prose > ul li + li { margin-top: 0.4rem }`, which was pushing the second
 * and third stats 6px below the first — three figures that should sit on one
 * line, stepped. A bare `.rh-stats__item` loses that on specificity. */
.rh-prose > .rh-stats .rh-stats__item,
.rh-stats__item {
  display: flex;
  flex-direction: column;
  gap: 0.3rem;
  margin: 0;
  text-align: center;
}

/* The figure is the only thing on these pages set in the display face at this
 * size, which is the point — it is the one number the section exists to show. */
.rh-stats__figure {
  font-family: var(--rh-display);
  font-optical-sizing: auto;
  font-weight: 600;
  font-size: clamp(1.5rem, 6vw, 2.1rem);
  line-height: 1;
  letter-spacing: -0.02em;
  color: var(--rh-ink);
  font-variant-numeric: lining-nums tabular-nums;
}

.rh-stats__label {
  font-family: var(--rh-mono);
  font-size: 0.6rem;
  line-height: 1.5;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: rgba(42, 24, 16, 0.6);
  text-wrap: balance;
}

/* Pull-quote — gold rule on the left, the same weight as the review cards' top
 * rule so the two read as one family. */
.rh-prose > blockquote {
  padding: 1.25rem 1.5rem;
  border-left: 2px solid var(--rh-ghee);
  background-color: var(--rh-sunk);
  font-style: normal;
}

.rh-prose > blockquote p {
  margin: 0;
  font-family: var(--rh-display);
  font-optical-sizing: auto;
  font-weight: 400;
  font-size: clamp(1.1rem, 1.9vw, 1.35rem);
  line-height: 1.45;
  color: var(--rh-ink);
  text-wrap: pretty;
}

/* Images and tables break wider than the text column. */
.rh-prose > figure,
.rh-prose > img,
.rh-prose > table,
.rh-prose > .wp-block-table {
  grid-column: wide;
}

.rh-prose img {
  display: block;
  max-width: 100%;
  height: auto;
  border-radius: 6px;
}

.rh-prose > table,
.rh-prose > .wp-block-table table {
  width: 100%;
  border-collapse: collapse;
  border-top: 1px solid var(--rh-ghee);
  border-bottom: 1px solid var(--rh-ghee);
  font-family: var(--rh-body);
  font-size: 0.95rem;
}

.rh-prose th,
.rh-prose td {
  padding: 0.75rem 1rem 0.75rem 0;
  border-bottom: 1px solid rgba(42, 24, 16, 0.09);
  text-align: left;
  vertical-align: top;
}

.rh-prose thead th {
  font-family: var(--rh-mono);
  font-size: 0.62rem;
  font-weight: 500;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--rh-laung);
}

/* Any table wide enough to overflow scrolls in its own box rather than pushing
 * the page sideways — content tables come from the editor and cannot be assumed
 * to fit. */
.rh-prose > .wp-block-table {
  overflow-x: auto;
}

/* Drop cap. :first-of-type rather than a class, so the editor cannot lose it by
 * reordering blocks. float, not initial-letter — initial-letter still has no
 * support in Firefox. */
.rh-prose--dropcap > p:first-of-type::first-letter {
  float: left;
  margin: 0.34em 0.12em 0 0;
  font-family: var(--rh-display);
  font-weight: 600;
  font-size: 3.9em;
  line-height: 0.62;
  color: var(--rh-sev);
}

/* --- Story --------------------------------------------------------------- */

.rh-story__head {
  max-width: 60rem;
  margin: 0 auto;
  padding: clamp(2.25rem, 5vw, 4rem) 2.5rem 0;
}

.rh-story__title {
  margin: 0.5rem 0 0;
  font-family: var(--rh-display);
  font-optical-sizing: auto;
  font-weight: 600;
  font-size: clamp(2.2rem, 5vw, 3.5rem);
  line-height: 1.02;
  letter-spacing: -0.025em;
  color: var(--rh-ink);
  text-wrap: pretty;
}

.rh-story__figure {
  max-width: var(--rh-measure);
  margin: clamp(1.75rem, 4vw, 2.75rem) auto 0;
  padding: 0 2.5rem;
}

/* A much flatter arch than the product windows — 18% instead of 38%. The
 * pier-to-span ratio has to fall as the image gets wider or a landscape crop
 * reads as a dome. */
.rh-story__figure-frame {
  border-radius: 50% 50% 8px 8px / 18% 18% 8px 8px;
  overflow: hidden;
  background-color: var(--rh-ink);
}

.rh-story__img {
  display: block;
  width: 100%;
  height: auto;
}

.rh-story__caption {
  margin: 0.75rem 0 0;
  font-family: var(--rh-mono);
  font-size: 0.62rem;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--rh-laung);
}

.rh-story .rh-prose {
  margin-top: clamp(2rem, 4vw, 3.25rem);
}

/* --- Commitments --------------------------------------------------------- */

.rh-commitments {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1.15fr);
  align-items: start;
  gap: var(--rh-gap);
  max-width: var(--rh-measure);
  margin: clamp(2.5rem, 5vw, 4rem) auto 0;
  padding: 0 2.5rem clamp(2.5rem, 5vw, 3.75rem);
}

.rh-commitments__media {
  border-radius: 50% 50% 6px 6px / 30% 30% 6px 6px;
  overflow: hidden;
  background-color: var(--rh-ink);
}

.rh-commitments .rh-ledger {
  margin-top: 1.25rem;
}

/* --- Ink call-to-action band -------------------------------------------- */

.rh-cta__inner {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 1.5rem;
  max-width: var(--rh-measure);
  margin: 0 auto;
  padding: clamp(2.5rem, 5vw, 3.5rem) 2.5rem;
}

.rh-cta__title {
  max-width: 26rem;
  margin: 0;
  font-size: clamp(1.6rem, 3.2vw, 2.375rem);
}

/* --- Journal index ------------------------------------------------------- */

.rh-journal__head {
  max-width: var(--rh-measure);
  margin: 0 auto;
  padding: clamp(2.25rem, 5vw, 3.625rem) 2.5rem 0;
}

.rh-journal__title {
  margin: 0.5rem 0 0;
  font-family: var(--rh-display);
  font-optical-sizing: auto;
  font-weight: 600;
  font-size: clamp(2.2rem, 5vw, 3.5rem);
  line-height: 1;
  letter-spacing: -0.025em;
  color: var(--rh-ink);
}

.rh-journal__dek {
  max-width: 34rem;
  margin: 0.875rem 0 0;
  font-family: var(--rh-body);
  font-size: clamp(1rem, 1.5vw, 1.06rem);
  line-height: 1.6;
  color: var(--rh-laung);
  text-wrap: pretty;
}

.rh-journal {
  max-width: var(--rh-measure);
  margin: 0 auto;
  padding: clamp(1.75rem, 3vw, 2.5rem) 2.5rem clamp(2.75rem, 5vw, 4.375rem);
}

/* --- Featured row ------------------------------------------------------- */

.rh-feature {
  border-top: 1px solid var(--rh-ghee);
  border-bottom: 1px solid var(--rh-rule);
}

.rh-feature__link {
  display: grid;
  grid-template-columns: minmax(0, 1.25fr) minmax(0, 1fr);
  align-items: center;
  gap: var(--rh-gap);
  padding: clamp(1.5rem, 3vw, 2.125rem) 0;
  text-decoration: none;
}

.rh-feature__media {
  border-radius: 6px;
  overflow: hidden;
  background-color: var(--rh-sunk);
}

.rh-feature__img,
.rh-card__img {
  display: block;
  width: 100%;
  height: auto;
  transition: transform 0.5s cubic-bezier(0.2, 0.7, 0.3, 1);
}

.rh-feature__link:hover .rh-feature__img,
.rh-card__link:hover .rh-card__img {
  transform: scale(1.03);
}

.rh-feature__title {
  margin: 0.75rem 0 0;
  font-family: var(--rh-display);
  font-optical-sizing: auto;
  font-weight: 600;
  font-size: clamp(1.65rem, 3.2vw, 2.375rem);
  line-height: 1.06;
  letter-spacing: -0.02em;
  color: var(--rh-ink);
  text-wrap: pretty;
}

.rh-feature__dek {
  margin: 0.875rem 0 0;
  font-family: var(--rh-body);
  font-size: 1rem;
  line-height: 1.6;
  color: var(--rh-laung);
  text-wrap: pretty;
}

.rh-feature .rh-link {
  color: var(--rh-ink);
  border-bottom-color: rgba(42, 24, 16, 0.25);
}

/* --- Post cards --------------------------------------------------------- */

.rh-journal__grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: clamp(1.5rem, 3vw, 1.875rem);
  padding: clamp(1.75rem, 3.5vw, 2.75rem) 0 0;
}

.rh-card__link {
  display: flex;
  flex-direction: column;
  gap: 0.875rem;
  height: 100%;
  text-decoration: none;
}

.rh-card__media {
  border-radius: 5px;
  overflow: hidden;
  background-color: var(--rh-sunk);
}

.rh-card__meta {
  margin: 0;
  font-family: var(--rh-mono);
  font-size: 0.6rem;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--rh-sev);
}

.rh-card__title {
  margin: 0.5rem 0 0;
  font-family: var(--rh-display);
  font-weight: 600;
  font-size: 1.375rem;
  line-height: 1.15;
  letter-spacing: -0.01em;
  color: var(--rh-ink);
  text-wrap: pretty;
}

.rh-card__dek {
  margin: 0.5rem 0 0;
  font-family: var(--rh-body);
  font-size: 0.9rem;
  line-height: 1.55;
  color: var(--rh-laung);
  text-wrap: pretty;
}

/* Row variant — used for "Read next" under an article. */
.rh-card--row .rh-card__link {
  display: grid;
  grid-template-columns: 7.375rem minmax(0, 1fr);
  align-items: center;
  gap: 1.125rem;
}

.rh-card--row .rh-card__media {
  border-radius: 4px;
}

.rh-card--row .rh-card__title {
  font-size: 1.25rem;
}

.rh-card--row .rh-card__dek {
  display: none;
}

/* --- Pagination --------------------------------------------------------- */

.rh-editorial .navigation.pagination {
  max-width: var(--rh-measure);
  margin: 0 auto;
  padding: 0 2.5rem clamp(2.5rem, 5vw, 4rem);
}

.rh-editorial .nav-links {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.5rem;
}

.rh-editorial .page-numbers {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 2.5rem;
  min-height: 2.5rem;
  padding: 0 0.75rem;
  border: 1px solid var(--rh-rule);
  border-radius: 4px;
  font-family: var(--rh-mono);
  font-size: 0.72rem;
  letter-spacing: 0.08em;
  text-decoration: none;
  color: var(--rh-laung);
}

.rh-editorial .page-numbers.current,
.rh-editorial .page-numbers:hover {
  background-color: var(--rh-ink);
  border-color: var(--rh-ink);
  color: var(--rh-paper);
}

/* --- Article ------------------------------------------------------------ */

.rh-crumbs--article {
  border-bottom: 0;
}

.rh-article__head {
  max-width: 56rem;
  margin: 0 auto;
  padding: 0 2.5rem;
}

.rh-article__meta {
  margin: 0;
  font-family: var(--rh-mono);
  font-size: 0.66rem;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--rh-sev);
}

.rh-article__title {
  margin: 1rem 0 0;
  font-family: var(--rh-display);
  font-optical-sizing: auto;
  font-weight: 600;
  font-size: clamp(2.1rem, 4.6vw, 3.375rem);
  line-height: 1.02;
  letter-spacing: -0.025em;
  color: var(--rh-ink);
  text-wrap: pretty;
}

.rh-article__dek {
  margin: 1.125rem 0 0;
  font-family: var(--rh-body);
  font-size: clamp(1.08rem, 1.8vw, 1.22rem);
  line-height: 1.55;
  color: var(--rh-laung);
  text-wrap: pretty;
}

.rh-article__figure {
  max-width: 70rem;
  margin: clamp(1.75rem, 4vw, 2.375rem) auto 0;
  padding: 0 2.5rem;
}

.rh-article__img {
  display: block;
  width: 100%;
  height: auto;
  border-radius: 6px;
}

.rh-article .rh-prose {
  margin-top: clamp(1.75rem, 4vw, 2.75rem);
}

/* --- Read next ---------------------------------------------------------- */

.rh-related {
  max-width: var(--rh-measure);
  margin: clamp(2.5rem, 5vw, 3.5rem) auto 0;
  padding: clamp(2rem, 4vw, 2.5rem) 2.5rem clamp(2.5rem, 5vw, 4rem);
  border-top: 1px solid var(--rh-rule);
}

.rh-related__grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 1.625rem;
  margin-top: 1.25rem;
}

/* --- Contact ------------------------------------------------------------ */

.rh-contact__head {
  max-width: var(--rh-measure);
  margin: 0 auto;
  padding: clamp(2.25rem, 5vw, 3.625rem) 2.5rem 0;
}

.rh-contact__dek {
  max-width: 32rem;
  margin: 0.875rem 0 0;
  font-family: var(--rh-body);
  font-size: clamp(1rem, 1.5vw, 1.06rem);
  line-height: 1.6;
  color: var(--rh-laung);
  text-wrap: pretty;
}

.rh-contact__body {
  display: grid;
  grid-template-columns: minmax(0, 1.2fr) minmax(0, 1fr);
  align-items: start;
  gap: clamp(2rem, 4vw, 3.25rem);
  max-width: var(--rh-measure);
  margin: 0 auto;
  padding: clamp(1.75rem, 4vw, 2.75rem) 2.5rem clamp(2.5rem, 5vw, 4rem);
}

/* Inside the two-column body the prose has its own narrow column already, so it
 * drops the outer grid and becomes a plain flow. */
.rh-contact__body .rh-prose {
  display: block;
}

.rh-contact__body .rh-prose > * {
  margin: 0 0 1.15rem;
}

.rh-contact__body .rh-prose > *:last-child {
  margin-bottom: 0;
}

.rh-place {
  margin-top: 1.5rem;
  border-radius: 6px;
  overflow: hidden;
  background-color: var(--rh-ink);
  background-image: var(--rh-grain);
  background-repeat: repeat;
}

.rh-place__body {
  padding: 1.6rem 1.5rem 1.75rem;
}

.rh-place__name {
  margin: 0.75rem 0 0;
  font-family: var(--rh-display);
  font-weight: 600;
  font-size: 1.55rem;
  line-height: 1.15;
  color: var(--rh-paper);
}

.rh-place__note {
  margin: 0.75rem 0 0;
  font-family: var(--rh-body);
  font-size: 0.9rem;
  line-height: 1.55;
  color: rgba(244, 237, 224, 0.6);
  text-wrap: pretty;
}

/* --- Editorial responsive ---------------------------------------------- */

@media (max-width: 992px) {

  .rh-journal__grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

@media (max-width: 900px) {

  .rh-feature__link,
  .rh-commitments,
  .rh-contact__body,
  .rh-related__grid {
    grid-template-columns: minmax(0, 1fr);
  }

  .rh-story__head,
  .rh-story__figure,
  .rh-commitments,
  .rh-journal__head,
  .rh-journal,
  .rh-article__head,
  .rh-article__figure,
  .rh-related,
  .rh-contact__head,
  .rh-contact__body,
  .rh-cta__inner,
  .rh-crumbs__inner,
  .rh-editorial .navigation.pagination {
    padding-left: 1.5rem;
    padding-right: 1.5rem;
  }

  .rh-commitments__media {
    max-width: 22rem;
  }

  /* The prose grid's gutters shrink so the text column keeps its measure rather
   * than the padding eating it. */
  .rh-prose {
    grid-template-columns:
      minmax(1.5rem, 1fr)
      [wide-start] minmax(0, 0.5rem)
      [text-start] minmax(0, 42rem) [text-end]
      minmax(0, 0.5rem) [wide-end]
      minmax(1.5rem, 1fr);
  }
}

@media (max-width: 600px) {

  .rh-journal__grid {
    grid-template-columns: minmax(0, 1fr);
  }

  .rh-card--row .rh-card__link {
    grid-template-columns: 5rem minmax(0, 1fr);
    gap: 0.875rem;
  }

  .rh-cta__inner .rh-btn {
    width: 100%;
    text-align: center;
  }

  /* A drop cap at phone widths eats a third of the first line's measure. */
  .rh-prose--dropcap > p:first-of-type::first-letter {
    font-size: 3.1em;
  }
}

@media (prefers-reduced-motion: reduce) {

  .rh-feature__img,
  .rh-card__img {
    transition: none;
  }

  .rh-feature__link:hover .rh-feature__img,
  .rh-card__link:hover .rh-card__img {
    transform: none;
  }
}


/* --- Article tags -------------------------------------------------------
 * inc/editorial.php → astra_child_post_tags(), printed under the article prose.
 * Every post carries four or five tags and none of them were rendered anywhere.
 * ------------------------------------------------------------------------- */

.rh-tags {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 0.5rem 0.85rem;
  max-width: 48rem;
  margin: clamp(2rem, 4vw, 2.75rem) auto 0;
  padding: 1.1rem 2.5rem 0;
  border-top: 1px solid var(--rh-rule);
}

.rh-tags__label {
  flex: none;
  font-family: var(--rh-mono);
  font-size: 0.62rem;
  font-weight: 500;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--rh-laung);
}

.rh-tags__list {
  display: flex;
  flex-wrap: wrap;
  gap: 0.4rem 0.5rem;
}

/* Outlined rather than filled: these are keyword tags, five to a post, and five
 * filled chips under an article would out-shout the "Read next" cards below. */
.rh-tags__tag {
  padding: 0.28rem 0.6rem;
  border: 1px solid var(--rh-rule);
  border-radius: 3px;
  font-family: var(--rh-body);
  font-size: 0.8rem;
  line-height: 1.2;
  color: var(--rh-laung);
  text-decoration: none;
}

.rh-tags__tag:hover {
  border-color: var(--rh-ghee);
  background-color: rgba(232, 178, 58, 0.12);
  color: var(--rh-ink);
}


/* --- Comments -----------------------------------------------------------
 * single.php calls comments_template(), which loads Astra's comments.php.
 * Astra's markup is styled here rather than replaced — writing a comment walker
 * to change typography would be a lot of template to own for no structural gain.
 *
 * RE-SCOPED 2026-08-23, after seeing this render for the first time. Everything
 * below used to be prefixed `.rh-editorial`, and matched **nothing**. The block's
 * own comment admitted the risk — "most of these selectors are styling markup
 * that has never rendered on this site... then checked against the real output" —
 * and the checking never happened, because the Chrome bridge was down that
 * session.
 *
 * A single post's article is `.rh-article`. `.rh-editorial` is the "Read next"
 * band further down the page, and nothing in the comments area was ever a
 * descendant of it. The scope is now `.comments-area`, WordPress's own wrapper,
 * which — checked on every template — appears on posts only: product reviews live
 * in `#reviews`, outside it, and keep the separate styling they already have.
 *
 * The class names also needed work; see the Astra-walker block that follows.
 * ------------------------------------------------------------------------- */

.comments-area {
  max-width: 48rem;
  margin: clamp(2.5rem, 5vw, 3.5rem) auto 0;
  padding: clamp(1.75rem, 4vw, 2.5rem) 2.5rem 0;
  border-top: 1px solid var(--rh-rule);
}

.comments-area .comments-title,
.comments-area .comment-reply-title {
  margin: 0 0 1.25rem;
  font-family: var(--rh-display);
  font-optical-sizing: auto;
  font-weight: 600;
  font-size: clamp(1.3rem, 2.4vw, 1.625rem);
  line-height: 1.1;
  letter-spacing: -0.015em;
  color: var(--rh-ink);
}

.comments-area .comment-list {
  margin: 0 0 clamp(1.75rem, 4vw, 2.5rem);
  padding: 0;
  list-style: none;
  border-top: 1px solid var(--rh-rule);
}

.comments-area .comment-list li.comment,
.comments-area .comment-list li.pingback {
  margin: 0;
  padding: 1.15rem 0;
  border-bottom: 1px solid var(--rh-rule);
  list-style: none;
}

/* Threaded replies step in once and stop. Deeper indents on a 375px screen leave
 * the fifth reply a column of two words. */
.comments-area .comment-list .children {
  margin: 1rem 0 0 1.25rem;
  padding: 0 0 0 1.25rem;
  border-left: 2px solid rgba(232, 178, 58, 0.35);
  list-style: none;
}

.comments-area .comment-list .children li.comment {
  border-bottom: 0;
  padding-bottom: 0;
}

.comments-area .comment-list .children .children {
  margin-left: 0;
  padding-left: 1rem;
}

/* Gravatars do not resolve for most customers of an Indian D2C store — the same
 * call as the product reviews, and for the same reason. */
.comments-area .comment-list .avatar {
  display: none;
}

.comments-area .comment-meta,
.comments-area .comment-author,
.comments-area .comment-metadata {
  margin: 0;
  font-family: var(--rh-mono);
  font-size: 0.62rem;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--rh-laung);
}

.comments-area .comment-author .fn,
.comments-area .comment-author b {
  font-style: normal;
  font-weight: 500;
  color: var(--rh-ink);
}

.comments-area .comment-metadata a,
.comments-area .comment-meta a {
  color: var(--rh-laung);
  text-decoration: none;
}

.comments-area .comment-metadata a:hover {
  color: var(--rh-sev);
}

.comments-area .comment-content {
  margin-top: 0.5rem;
}

.comments-area .comment-content p {
  margin: 0 0 0.6rem;
  font-family: var(--rh-body);
  font-size: 1rem;
  line-height: 1.6;
  color: var(--rh-laung);
}

.comments-area .comment-content p:last-child {
  margin-bottom: 0;
}

.comments-area .comment-content a {
  color: var(--rh-ink);
  text-decoration: underline;
  text-decoration-color: rgba(201, 118, 27, 0.5);
  text-underline-offset: 0.18em;
}

.comments-area .reply {
  margin-top: 0.6rem;
}

.comments-area .comment-reply-link,
.comments-area .comment-edit-link {
  font-family: var(--rh-mono);
  font-size: 0.6rem;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--rh-laung);
  text-decoration: none;
  border-bottom: 1px solid rgba(107, 52, 16, 0.35);
}

.comments-area .comment-reply-link:hover {
  color: var(--rh-sev);
  border-bottom-color: var(--rh-sev);
}

.comments-area .comment-awaiting-moderation {
  display: block;
  margin-top: 0.4rem;
  font-family: var(--rh-mono);
  font-size: 0.6rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--rh-sev);
}

/* --- The Astra comment walker --------------------------------------------
 *
 * Astra does not use WordPress's default comment walker, so none of the class
 * names the block above is written against appear in the output. Its names, and
 * what they correspond to:
 *
 *   .comment-list      →  .ast-comment-list        the <ol>
 *   .comment-meta      →  .ast-comment-meta        the author/date header
 *   .comment-author    →  .ast-comment-author      (same element, second class)
 *   .comment-author .fn →  .ast-comment-cite-wrap cite
 *   .comment-metadata  →  .ast-comment-time        wrapping span.timendate
 *   .comment-content   →  .ast-comment-content
 *   .reply             →  .ast-reply-link          inside .ast-comment-edit-reply-wrap
 *
 * Both sets are styled: if Astra's walker is ever swapped for core's, the page
 * keeps its typography instead of silently reverting to Open Sans and #fd9800.
 * ------------------------------------------------------------------------- */

.comments-area .ast-comment-list {
  margin: 0 0 clamp(1.75rem, 4vw, 2.5rem);
  padding: 0;
  list-style: none;
  border-top: 1px solid var(--rh-rule);
}

.comments-area .ast-comment-list li.comment {
  margin: 0;
  padding: 1.15rem 0;
  border-bottom: 1px solid var(--rh-rule);
  list-style: none;
  background: none;
}

.comments-area .ast-comment-list .children {
  margin: 1rem 0 0 1.25rem;
  padding: 0 0 0 1.25rem;
  border-left: 2px solid rgba(232, 178, 58, 0.35);
  list-style: none;
}

.comments-area .ast-comment-list .children li.comment {
  padding-bottom: 0;
  border-bottom: 0;
}

.comments-area .ast-comment {
  padding: 0;
  border: 0;
  background: none;
}

/* Gravatars do not resolve for most customers of an Indian D2C store — the same
 * call as the product reviews, and for the same reason. Unresolved ones render
 * as the grey mystery-person silhouette, which is worse than no avatar. */
.comments-area .ast-comment-avatar-wrap {
  display: none;
}

.comments-area .ast-comment-info {
  display: block;
  margin-bottom: 0.5rem;
}

.comments-area .ast-comment-meta,
.comments-area .ast-comment-author,
.comments-area .ast-comment-time,
.comments-area .ast-comment-time .timendate {
  margin: 0;
  padding: 0;
  font-family: var(--rh-mono);
  font-size: 0.62rem;
  font-weight: 400;
  line-height: 1.7;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--rh-laung);
}

.comments-area .ast-comment-cite-wrap cite,
.comments-area .ast-comment-cite-wrap cite a {
  font-style: normal;
  font-weight: 500;
  font-size: 0.62rem;
  letter-spacing: 0.14em;
  color: var(--rh-ink);
  text-decoration: none;
}

.comments-area .ast-comment-time a {
  color: var(--rh-laung);
  text-decoration: none;
}

.comments-area .ast-comment-content {
  margin: 0;
  padding: 0;
  background: none;
}

.comments-area .ast-comment-content > p {
  margin: 0 0 0.6rem;
  font-family: var(--rh-body);
  font-size: 1rem;
  line-height: 1.6;
  color: var(--rh-laung);
}

.comments-area .ast-comment-content > p:last-of-type {
  margin-bottom: 0;
}

.comments-area .ast-comment-edit-reply-wrap {
  margin-top: 0.6rem;
  text-align: left;
}

/* The reply link measured 32x12 as Astra ships it — a third of the 32px minimum
 * this project holds itself to, and the same class of defect as the cart's 40x13
 * remove "x". Padding it out to a 32px row costs nothing here because the link
 * sits alone on its own line.
 *
 * `32px`, not `2rem` — caught by measuring, which is the third time this trap has
 * bitten in this file: Astra's mobile root font-size is 14.592px, so `2rem` is
 * 29px and the fix would have quietly landed 3px short of the bar it exists to
 * clear. */
.comments-area .ast-reply-link,
.comments-area .ast-comment-edit-reply-wrap .comment-reply-link,
.comments-area .ast-comment-edit-reply-wrap .comment-edit-link {
  display: inline-flex;
  align-items: center;
  min-height: 32px;
  padding: 0 0.1rem;
  font-family: var(--rh-mono);
  font-size: 0.6rem;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--rh-laung);
  text-decoration: none;
}

.comments-area .ast-comment-edit-reply-wrap a {
  border-bottom: 1px solid rgba(107, 52, 16, 0.35);
  color: var(--rh-laung);
  text-decoration: none;
}

.comments-area .ast-comment-edit-reply-wrap a:hover,
.comments-area .ast-comment-edit-reply-wrap a:focus-visible {
  border-bottom-color: var(--rh-sev);
  color: var(--rh-sev);
}


/* --- Comment form ------------------------------------------------------- */

.comments-area .comment-respond {
  padding-top: clamp(1.25rem, 3vw, 1.75rem);
  border-top: 1px solid var(--rh-rule);
}

/* Astra prints the reply title with a "Cancel reply" link inside it. */
.comments-area #cancel-comment-reply-link {
  margin-left: 0.75rem;
  font-family: var(--rh-mono);
  font-size: 0.6rem;
  font-weight: 400;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--rh-laung);
}

.comments-area .comment-form {
  display: grid;
  gap: 0.9rem;
}

.comments-area .comment-notes,
.comments-area .comment-form-cookies-consent label,
.comments-area .form-submit + p,
.comments-area .logged-in-as {
  margin: 0;
  font-family: var(--rh-body);
  font-size: 0.9rem;
  line-height: 1.5;
  color: var(--rh-laung);
}

.comments-area .comment-form p {
  margin: 0;
}

.comments-area .comment-form label {
  display: block;
  margin-bottom: 0.35rem;
  font-family: var(--rh-mono);
  font-size: 0.62rem;
  font-weight: 500;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--rh-laung);
}

.comments-area .comment-form .required {
  color: var(--rh-sev);
}

.comments-area .comment-form input[type="text"],
.comments-area .comment-form input[type="email"],
.comments-area .comment-form input[type="url"],
.comments-area .comment-form textarea {
  width: 100%;
  padding: 0.7rem 0.85rem;
  border: 1px solid var(--rh-rule);
  border-radius: 3px;
  background-color: rgba(244, 237, 224, 0.6);
  font-family: var(--rh-body);
  font-size: 0.95rem;
  color: var(--rh-ink);
}

.comments-area .comment-form textarea {
  min-height: 8rem;
  resize: vertical;
}

.comments-area .comment-form input:focus,
.comments-area .comment-form textarea:focus {
  outline: 0;
  border-color: var(--rh-ghee);
}

/* Name and email side by side above the comment box, which is the order the form
 * is emitted in, so no reordering is needed — only the columns. */
.comments-area .comment-form-author,
.comments-area .comment-form-email {
  display: inline-block;
  width: calc(50% - 0.45rem);
  vertical-align: top;
}

.comments-area .comment-form-author {
  margin-right: 0.85rem !important;
}

.comments-area .comment-form-cookies-consent {
  display: flex;
  align-items: center;
  gap: 0.55rem;
}

/* Chrome paints the native checkbox glyph outside its layout box, so
 * `appearance: none` is the only way to replace it — the same lesson as the
 * checkout's shipping radios and the "remember me" box. */
.comments-area .comment-form-cookies-consent input[type="checkbox"] {
  -webkit-appearance: none !important;
  appearance: none !important;
  flex: none;
  width: 1rem;
  height: 1rem;
  margin: 0;
  border: 1px solid rgba(42, 24, 16, 0.3);
  border-radius: 2px;
  background-color: transparent;
  cursor: pointer;
}

.comments-area .comment-form-cookies-consent input[type="checkbox"]:checked {
  border-color: var(--rh-ghee);
  background-color: var(--rh-ghee);
  box-shadow: inset 0 0 0 2px var(--rh-paper);
}

.comments-area .comment-form-cookies-consent label {
  margin: 0;
  font-family: var(--rh-body);
  font-size: 0.85rem;
  letter-spacing: 0;
  text-transform: none;
}

/* Astra colours submit buttons from the Customizer as inline <head> CSS, hence
 * !important — the same constraint as the nav links and the cart buttons. */
.comments-area .comment-form .form-submit input[type="submit"] {
  justify-self: start;
  padding: 0.8rem 1.6rem !important;
  border: 1px solid var(--rh-ghee) !important;
  border-radius: 4px !important;
  background-color: var(--rh-ghee) !important;
  font-family: var(--rh-body) !important;
  font-size: 0.9rem !important;
  font-weight: 600 !important;
  letter-spacing: 0.02em !important;
  text-transform: none !important;
  color: var(--rh-ink) !important;
}

.comments-area .comment-form .form-submit input[type="submit"]:hover {
  border-color: var(--rh-sev) !important;
  background-color: var(--rh-sev) !important;
  color: var(--rh-paper) !important;
}

.comments-area .no-comments,
.comments-area .navigation {
  font-family: var(--rh-body);
  font-size: 0.92rem;
  color: var(--rh-laung);
}

@media (max-width: 600px) {

  .rh-tags,
  .comments-area {
    padding-left: 1.5rem;
    padding-right: 1.5rem;
  }

  /* Two 50% fields at 375px leave room for about eight characters each. */
  .comments-area .comment-form-author,
  .comments-area .comment-form-email {
    display: block;
    width: 100%;
  }

  .comments-area .comment-form-author {
    margin-right: 0 !important;
    margin-bottom: 0.9rem !important;
  }
}


/* ==========================================================================
   Information pages — policies, terms, FAQ
   ==========================================================================
 * Templates: page.php. Helpers in inc/pages.php.
 *
 * These were the last screens left in stock Astra — a boxed cream card with
 * Astra's default type. They share the editorial ground (.rh-editorial handles
 * the paper background and unpicks Astra's container) but not the article
 * treatment: a reference document wants a stated revision date and a route to
 * the sibling document, not a reading time and a "read next".
 *
 * The FAQ gets its own two-column layout because its content is genuinely
 * structured — six sections, twenty-six questions — and one long prose column throws
 * that structure away.
 */

/* --- Document head ------------------------------------------------------- */

/* The head is laid out on the same grid as the prose below it, with every child
 * in the `text` column, so the eyebrow, the title, the revision rule and the body
 * copy all share one left edge.
 *
 * A first version set the head to a plain centred 56rem — the article template's
 * measure — and the title then started about 100px left of the first paragraph,
 * because a centred 56rem box and a centred 40vw column do not share an edge at
 * any viewport width. Matching the grid is the only version that stays aligned as
 * the column flexes. */
.rh-document__head {
  display: grid;
  grid-template-columns:
    minmax(1.25rem, 1fr)
    [wide-start] minmax(0, 7rem)
    [text-start] minmax(0, clamp(34rem, 40vw, 44rem)) [text-end]
    minmax(0, 7rem) [wide-end]
    minmax(1.25rem, 1fr);
  padding: clamp(2.25rem, 5vw, 3.75rem) 0 0;
}

.rh-document__head > * {
  grid-column: text;
}

.rh-document__kind {
  margin: 0;
  font-family: var(--rh-mono);
  font-size: 0.66rem;
  font-weight: 500;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: var(--rh-sev);
}

.rh-document__title {
  margin: 0.85rem 0 0;
  font-family: var(--rh-display);
  font-optical-sizing: auto;
  font-weight: 600;
  font-size: clamp(2rem, 4.4vw, 3.125rem);
  line-height: 1.03;
  letter-spacing: -0.025em;
  color: var(--rh-ink);
  text-wrap: pretty;
}

/* The revision date as a stamped ledger line rather than a sentence — it is a
 * fact about the document, and the mono/gold-rule pairing is the same device the
 * product specification and the home comparison use. */
.rh-document__updated {
  display: flex;
  align-items: baseline;
  gap: 0.75rem;
  margin: clamp(1.25rem, 3vw, 1.75rem) 0 0;
  padding-top: 0.85rem;
  border-top: 1px solid var(--rh-rule);
  font-family: var(--rh-mono);
  font-size: 0.7rem;
  letter-spacing: 0.1em;
}

.rh-document__updated-label {
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--rh-laung);
}

.rh-document__updated-value {
  color: var(--rh-ink);
}

/* --- Document prose ------------------------------------------------------ */

/* A little narrower than the article measure. Legal copy is dense, heavily
 * subdivided and read in fragments — someone scanning for the refund window is
 * hunting a heading, not settling into a long read — and a shorter line makes the
 * heading hierarchy easier to see. */
.rh-prose--document {
  grid-template-columns:
    minmax(1.25rem, 1fr)
    [wide-start] minmax(0, 7rem)
    [text-start] minmax(0, clamp(34rem, 40vw, 44rem)) [text-end]
    minmax(0, 7rem) [wide-end]
    minmax(1.25rem, 1fr);
}

.rh-document .rh-prose {
  margin-top: clamp(1.75rem, 4vw, 2.5rem);
  padding-bottom: clamp(2.5rem, 5vw, 3.5rem);
}

/* Section headings in a document carry more weight than in an article, because
 * they are the navigation. A gold rule above each one turns the page into a
 * visible sequence of clauses. */
.rh-prose--document > h2 {
  margin-top: clamp(2rem, 4vw, 2.75rem);
  padding-top: 1.1rem;
  border-top: 1px solid rgba(232, 178, 58, 0.55);
  font-size: clamp(1.3rem, 2.4vw, 1.6rem);
}

.rh-prose--document > h3 {
  margin-top: 1.5rem;
  font-family: var(--rh-body);
  font-weight: 600;
  font-size: 1.02rem;
  letter-spacing: 0;
  color: var(--rh-ink);
}

.rh-prose--document > h2:first-child,
.rh-prose--document > h3:first-child {
  margin-top: 0;
}

/* --- FAQ ----------------------------------------------------------------- */

/* The FAQ page runs on ONE grid, shared by the head, the intro and the
 * question list, so the title, the standfirst and the first question all sit on
 * the same left edge with the section index in the column beside them.
 *
 * This replaced a version where the head used the prose grid (a centred text
 * column) and the list used its own measure-wide two-column grid. They happened
 * to line up at 1536px and nowhere else — 44px out at 1920, 32px at 1280 — because
 * a centred column and an offset one only ever coincide by accident. Sharing the
 * grid makes the alignment structural instead of coincidental. */
.rh-document--faq .rh-document__head,
.rh-document--faq .rh-faq__intro,
.rh-faq {
  display: grid;
  grid-template-columns: minmax(0, 15rem) minmax(0, 1fr);
  column-gap: clamp(2rem, 5vw, 4.5rem);
  max-width: var(--rh-measure);
  margin-left: auto;
  margin-right: auto;
  padding-left: 2.5rem;
  padding-right: 2.5rem;
}

/* Both of these override a `grid-column: text` inherited from .rh-prose > *,
 * whose named line does not exist on this grid. */
.rh-document--faq .rh-document__head > *,
.rh-document--faq .rh-faq__intro > * {
  grid-column: 2;
}

.rh-document--faq .rh-faq__intro {
  row-gap: 1.15rem;
  margin-top: clamp(1.5rem, 3vw, 2rem);
  padding-bottom: 0;
}

.rh-faq {
  padding-top: clamp(1.75rem, 4vw, 2.75rem);
  padding-bottom: clamp(2.5rem, 5vw, 4rem);
}

.rh-faq__index {
  grid-column: 1;
}

.rh-faq__body {
  grid-column: 2;
}

/* The index tracks the reader down twenty-six questions. `top` clears the sticky
 * header: #masthead is sticky at a negative offset equal to the announcement bar,
 * so what remains pinned is the nav row — 4.5rem of it plus a little air. */
.rh-faq__index {
  position: sticky;
  top: 6.5rem;
  align-self: start;
}

.rh-faq__index-list {
  margin: 0;
  padding: 0;
  list-style: none;
  border-top: 1px solid var(--rh-rule);
}

.rh-faq__index-list li {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 0.75rem;
  padding: 0.6rem 0;
  border-bottom: 1px solid var(--rh-rule);
}

.rh-faq__index-list a {
  font-family: var(--rh-body);
  font-size: 0.9rem;
  font-weight: 500;
  line-height: 1.3;
  color: var(--rh-ink);
  text-decoration: none;
}

.rh-faq__index-list a:hover {
  color: var(--rh-sev);
}

.rh-faq__count {
  flex: none;
  font-family: var(--rh-mono);
  font-size: 0.62rem;
  letter-spacing: 0.08em;
  color: var(--rh-laung);
}

/* Anchor jumps have to clear the sticky header too, or the section title lands
 * underneath it. */
.rh-faq__section {
  scroll-margin-top: 6.5rem;
}

.rh-faq__section + .rh-faq__section {
  margin-top: clamp(2.5rem, 5vw, 3.75rem);
}

.rh-faq__num {
  margin: 0;
  font-family: var(--rh-mono);
  font-size: 0.66rem;
  font-weight: 500;
  letter-spacing: 0.24em;
  color: var(--rh-ghee);
}

.rh-faq__section-title {
  margin: 0.4rem 0 0;
  font-family: var(--rh-display);
  font-optical-sizing: auto;
  font-weight: 600;
  font-size: clamp(1.4rem, 2.6vw, 1.875rem);
  line-height: 1.1;
  letter-spacing: -0.015em;
  color: var(--rh-ink);
}

/* The body column is ~950px at 1536px wide, which is fine for a question — they
 * are one line — and far too wide for an answer: 140-odd characters, well past the
 * point where the eye loses the start of the next line. So the prose inside it is
 * capped while the question rows keep the full column, which also gives the open/
 * closed control somewhere to sit at the right-hand end. */
.rh-faq__lead,
.rh-faq__a,
.rh-document--faq .rh-faq__intro > * {
  max-width: 42rem;
}

.rh-faq__lead {
  margin: 0.75rem 0 0;
  font-family: var(--rh-body);
  font-size: 1rem;
  line-height: 1.6;
  color: var(--rh-laung);
}

.rh-faq__lead p {
  margin: 0 0 0.5rem;
}

.rh-faq__list {
  margin-top: 1.15rem;
  border-top: 1px solid var(--rh-rule);
}

.rh-faq__item {
  border-bottom: 1px solid var(--rh-rule);
}

/* <details> rather than a scripted accordion: keyboard accessible and announced
 * without any JavaScript, degrades to open content if the CSS fails, and the
 * answers stay in the DOM so they are still indexed. Both marker selectors are
 * needed — the pseudo-element is the standard, the WebKit one still ships. */
.rh-faq__q {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 1.5rem;
  align-items: center;
  gap: 1rem;
  padding: 0.95rem 0;
  cursor: pointer;
  list-style: none;
}

.rh-faq__q::-webkit-details-marker {
  display: none;
}

.rh-faq__q::marker {
  content: "";
}

.rh-faq__q:hover .rh-faq__q-text {
  color: var(--rh-sev);
}

.rh-faq__q-text {
  font-family: var(--rh-body);
  font-size: clamp(0.98rem, 1.5vw, 1.06rem);
  font-weight: 600;
  line-height: 1.4;
  color: var(--rh-ink);
  text-wrap: pretty;
}

/* A plus that loses its upright when the answer opens. Drawn from two bars so
 * there is no glyph to go missing and no font dependency. */
.rh-faq__mark {
  position: relative;
  width: 1.5rem;
  height: 1.5rem;
  border: 1px solid rgba(42, 24, 16, 0.2);
  border-radius: 3px;
}

.rh-faq__mark::before,
.rh-faq__mark::after {
  content: "";
  position: absolute;
  top: 50%;
  left: 50%;
  width: 0.6rem;
  height: 1px;
  background-color: var(--rh-laung);
  transform: translate(-50%, -50%);
}

.rh-faq__mark::after {
  transform: translate(-50%, -50%) rotate(90deg);
  transition: opacity 0.15s ease;
}

.rh-faq__item[open] .rh-faq__mark {
  border-color: var(--rh-ghee);
  background-color: rgba(232, 178, 58, 0.16);
}

.rh-faq__item[open] .rh-faq__mark::after {
  opacity: 0;
}

.rh-faq__item[open] .rh-faq__q-text {
  color: var(--rh-sev);
}

.rh-faq__a {
  padding: 0 3rem 1.25rem 0;
}

.rh-faq__a p,
.rh-faq__a li {
  font-family: var(--rh-body);
  font-size: 1rem;
  line-height: 1.65;
  color: var(--rh-laung);
}

.rh-faq__a p {
  margin: 0 0 0.7rem;
}

.rh-faq__a p:last-child {
  margin-bottom: 0;
}

.rh-faq__a ul,
.rh-faq__a ol {
  margin: 0 0 0.7rem;
  padding-left: 1.2rem;
}

.rh-faq__a a {
  color: var(--rh-ink);
  text-decoration: underline;
  text-decoration-color: rgba(201, 118, 27, 0.5);
  text-underline-offset: 0.18em;
}

.rh-faq__a a:hover {
  color: var(--rh-sev);
}

.rh-faq__a strong {
  font-weight: 600;
  color: var(--rh-ink);
}

/* --- Documents, narrow viewports ---------------------------------------- */

/* The section index goes above the questions rather than beside them. It stays
 * useful there — six links and their counts, then the sections themselves — and it
 * is a much better outcome than a 15rem column squeezing the answers. */
@media (max-width: 900px) {

  /* The gutter collapse the editorial section already applies to .rh-prose.
   * It has to be repeated here: `.rh-prose--document` is a single class, the same
   * specificity as the `.rh-prose` rule inside that media query, and it is
   * declared later in the file — so it was winning and re-inflating the 7rem
   * gutters at phone widths. Measured before this rule, the privacy policy's text
   * column was 134px wide inset 120px on a 390px screen: grid distributes surplus
   * space equally across tracks, so two empty gutters were taking 102px each while
   * the paragraph they surround got 134px. The document head shares the template
   * and so shares the fix. */
  .rh-prose--document,
  .rh-document__head {
    grid-template-columns:
      minmax(1.5rem, 1fr)
      [wide-start] minmax(0, 0.5rem)
      [text-start] minmax(0, 42rem) [text-end]
      minmax(0, 0.5rem) [wide-end]
      minmax(1.5rem, 1fr);
  }

  .rh-document--faq .rh-document__head,
  .rh-document--faq .rh-faq__intro,
  .rh-faq {
    grid-template-columns: minmax(0, 1fr);
  }

  .rh-document--faq .rh-document__head > *,
  .rh-document--faq .rh-faq__intro > *,
  .rh-faq__index,
  .rh-faq__body {
    grid-column: 1;
  }

  .rh-faq__index {
    position: static;
    margin-bottom: clamp(1.75rem, 5vw, 2.5rem);
  }

  .rh-faq__index-list {
    columns: 2;
    column-gap: 1.5rem;
  }

  .rh-faq__index-list li {
    break-inside: avoid;
  }
}

@media (max-width: 600px) {

  /* Only the padding-inset blocks. The plain document head is a grid whose own
   * 1.25rem gutter already matches .rh-prose — adding padding on top of it would
   * inset the title further than the body copy it is meant to line up with. */
  .rh-document--faq .rh-document__head,
  .rh-document--faq .rh-faq__intro,
  .rh-faq,
  .rh-docs {
    padding-left: 1.25rem;
    padding-right: 1.25rem;
  }

  .rh-faq__index-list {
    columns: 1;
  }

  /* The answer needs the room more than the control needs the margin. */
  .rh-faq__a {
    padding-right: 0;
  }

  .rh-document__updated {
    flex-wrap: wrap;
    gap: 0.25rem 0.75rem;
  }
}


/* --- Also on file ------------------------------------------------------- */

/* Nobody arrives at a refund policy on purpose — they wanted shipping, or
 * returns, or the FAQ, and took the nearest footer link. So each document names
 * its siblings. This is why the policy pages do not close with the shop band:
 * "Shop the range" at the foot of a contract is a sales push. */
.rh-docs {
  max-width: var(--rh-measure);
  margin: 0 auto;
  padding: clamp(2rem, 4vw, 2.75rem) 2.5rem clamp(2.75rem, 5vw, 4rem);
  border-top: 1px solid var(--rh-rule);
}

.rh-docs__list {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(13rem, 1fr));
  gap: 1px;
  margin: 0;
  padding: 0;
  list-style: none;
  background-color: var(--rh-rule);
  border: 1px solid var(--rh-rule);
}

.rh-docs__item {
  margin: 0;
  background-color: var(--rh-paper);
}

.rh-docs__link {
  display: block;
  height: 100%;
  padding: 1.1rem 1.25rem;
  text-decoration: none;
  transition: background-color 0.15s ease;
}

.rh-docs__link:hover {
  background-color: var(--rh-sunk);
}

.rh-docs__kind {
  display: block;
  font-family: var(--rh-mono);
  font-size: 0.6rem;
  font-weight: 500;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--rh-sev);
}

.rh-docs__title {
  display: block;
  margin-top: 0.4rem;
  font-family: var(--rh-body);
  font-size: 0.98rem;
  font-weight: 600;
  line-height: 1.3;
  color: var(--rh-ink);
  text-wrap: pretty;
}

.rh-docs__link:hover .rh-docs__title {
  color: var(--rh-sev);
}


/* ==========================================================================
   Cart & checkout
   ==========================================================================
 * Markup from woocommerce/cart/*.php and inc/woocommerce-cart.php.
 *
 * cart.php and cart-totals.php are overridden (not restyled) because WooCommerce
 * renders both as tables and the design needs regrouped blocks. cart-shipping.php
 * is overridden for a harder reason: it emits tr/th/td, which an HTML parser
 * DISCARDS outside a table — the shipping row came through as loose unstyled text.
 */

.woocommerce-cart .site-content,
.woocommerce-checkout .site-content {
  background-color: var(--rh-paper);
  background-image: var(--rh-grain);
  background-repeat: repeat;
}

/* Astra centres WooCommerce page text; the design is left-aligned throughout. */
.woocommerce-cart .entry-content,
.woocommerce-checkout .entry-content,
.woocommerce-cart .ast-article-single,
.woocommerce-checkout .ast-article-single {
  text-align: left;
}

/* --- Cart shell ---------------------------------------------------------- */

.rh-cart {
  max-width: var(--rh-measure);
  margin: 0 auto;
  padding: clamp(1.75rem, 4vw, 3.375rem) 2.5rem clamp(2.5rem, 5vw, 5rem);
}

.rh-cart__head {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 0.5rem 1rem;
}

.woocommerce .rh-cart__title,
.rh-cart__title {
  margin: 0;
  font-family: var(--rh-display);
  font-optical-sizing: auto;
  font-weight: 600;
  font-size: clamp(2rem, 4.4vw, 3.125rem);
  line-height: 1;
  letter-spacing: -0.02em;
  color: var(--rh-ink);
}

.rh-cart__count {
  margin: 0;
  font-family: var(--rh-mono);
  font-size: 0.69rem;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--rh-sev);
}

/* 1.4fr / 1fr rather than 1.55 / 1: live Shiprocket rates put five courier names
 * with delivery dates in the summary, and the narrower column wrapped every one of
 * them onto three lines. */
.rh-cart__body {
  display: grid;
  grid-template-columns: minmax(0, 1.4fr) minmax(0, 22rem);
  align-items: start;
  gap: clamp(1.75rem, 4vw, 3rem);
  margin-top: clamp(1.5rem, 3vw, 2.125rem);
}

/* --- Cart lines ---------------------------------------------------------- */

.rh-cart__lines {
  border-top: 1px solid var(--rh-ghee);
}

.rh-line {
  display: grid;
  grid-template-columns: 6rem minmax(0, 1fr) auto;
  align-items: center;
  gap: 1.375rem;
  padding: 1.375rem 0;
  border-bottom: 1px solid var(--rh-rule);
}

/* The arch at thumbnail scale — flatter piers than the product windows, because
 * a tall arch reads as a keyhole at 96px. */
.rh-line__media {
  border-radius: 50% 50% 4px 4px / 38% 38% 4px 4px;
  overflow: hidden;
  background-color: var(--rh-sunk);
}

.rh-line__media img {
  display: block;
  width: 100%;
  height: auto;
}

.woocommerce .rh-line__name,
.rh-line__name {
  margin: 0;
  font-family: var(--rh-display);
  font-weight: 600;
  font-size: 1.35rem;
  line-height: 1.15;
  color: var(--rh-ink);
}

.rh-line__name a {
  color: inherit;
  text-decoration: none;
}

.rh-line__name a:hover {
  color: var(--rh-sev);
}

.rh-line__deva {
  margin: 0.2rem 0 0;
  font-family: var(--rh-deva);
  font-size: 0.95rem;
  color: var(--rh-sev);
}

/* WooCommerce prints the chosen variation as a dl.variation. Flattened to one
 * inline line so "Weight: 500g" sits beside the unit price instead of stacking
 * two definition rows. */
.rh-line__meta {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 0.35rem 0.75rem;
  margin-top: 0.55rem;
  font-family: var(--rh-mono);
  font-size: 0.66rem;
  letter-spacing: 0.13em;
  text-transform: uppercase;
  color: var(--rh-laung);
}

.rh-line__meta .variation {
  display: flex;
  flex-wrap: wrap;
  gap: 0.25rem 0.5rem;
  margin: 0;
}

.rh-line__meta .variation dt,
.rh-line__meta .variation dd {
  margin: 0;
  font-weight: 400;
}

.rh-line__meta .variation dt {
  opacity: 0.7;
}

.rh-line__meta .variation p {
  margin: 0;
}

.rh-line__unit .amount {
  font-family: var(--rh-mono);
  color: var(--rh-laung);
}

.rh-line__controls {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.875rem;
  margin-top: 0.75rem;
}

.rh-line__qty .quantity {
  display: flex;
  align-items: center;
  margin: 0;
  border: 1px solid rgba(42, 24, 16, 0.2);
  border-radius: 4px;
  overflow: hidden;
}

.woocommerce .rh-line__qty input.qty,
.rh-line__qty input.qty {
  width: 3rem;
  height: 2.375rem;
  padding: 0;
  border: 0;
  background: transparent;
  font-family: var(--rh-mono);
  font-size: 0.9rem;
  text-align: center;
  color: var(--rh-ink);
}

.rh-line__qty input.qty::-webkit-outer-spin-button,
.rh-line__qty input.qty::-webkit-inner-spin-button {
  -webkit-appearance: none;
  appearance: none;
  margin: 0;
}

/* WooCommerce's remove control is a bare multiplication sign styled by Astra as a
 * circular icon button. The template prints the word "Remove" instead, so that
 * icon styling has to be unwound. */
.woocommerce .rh-line__remove a.remove,
.rh-line__remove a.remove {
  display: inline-block;
  width: auto;
  height: auto;
  padding: 0;
  border: 0;
  border-bottom: 1px solid rgba(42, 24, 16, 0.25);
  border-radius: 0;
  background: transparent !important;
  font-family: var(--rh-mono);
  font-size: 0.62rem;
  font-weight: 400;
  line-height: 1.4;
  letter-spacing: 0.13em;
  text-transform: uppercase;
  text-decoration: none;
  color: var(--rh-laung) !important;
}

.woocommerce .rh-line__remove a.remove:hover,
.woocommerce .rh-line__remove a.remove:focus,
.woocommerce .rh-line__remove a.remove:focus-visible,
.rh-line__remove a.remove:hover,
.rh-line__remove a.remove:focus,
.rh-line__remove a.remove:focus-visible {
  color: var(--rh-ink) !important;
  border-bottom-color: var(--rh-ink);
}

/* Belt-and-braces against the oval ring reported around "Remove".
 *
 * WooCommerce styles a.remove as a 1em circular icon button
 * (`border-radius: 100%; width: 1em; height: 1em`) because by default its content
 * is a single multiplication sign. This template prints the word instead, so every
 * property that can draw a ring is reset — including on the hover and focus states,
 * and on the pseudo-elements, since a live measurement of the resting state showed
 * no border at all, which points at a hover or focus artefact rather than the base
 * rule.
 *
 * The visible affordance is the bottom rule only. A real keyboard focus ring is
 * re-added below, because removing focus visibility would be worse than the bug. */
.woocommerce .rh-line__remove a.remove,
.woocommerce .rh-line__remove a.remove:hover,
.woocommerce .rh-line__remove a.remove:focus,
.rh-line__remove a.remove,
.rh-line__remove a.remove:hover,
.rh-line__remove a.remove:focus {
  width: auto !important;
  height: auto !important;
  min-width: 0 !important;
  min-height: 0 !important;
  line-height: 1.4 !important;
  border-top: 0 !important;
  border-right: 0 !important;
  border-left: 0 !important;
  border-radius: 0 !important;
  box-shadow: none !important;
  outline: none;
  background-image: none !important;
}

.rh-line__remove a.remove::before,
.rh-line__remove a.remove::after {
  content: none !important;
}

/* Keyboard focus stays visible — just as a proper ring, not an accidental one. */
.rh-line__remove a.remove:focus-visible {
  outline: 2px solid var(--rh-sev) !important;
  outline-offset: 2px;
}

.rh-line__total,
.rh-line__total .amount {
  font-family: var(--rh-mono);
  font-size: 1.1rem;
  color: var(--rh-ink);
  white-space: nowrap;
}

/* --- Coupon and update -------------------------------------------------- */

.rh-cart__actions {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  justify-content: space-between;
  gap: 1rem;
  padding: 1.5rem 0 0;
}

.rh-coupon {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.5rem;
}

.rh-coupon__label {
  flex: 1 1 100%;
  font-family: var(--rh-mono);
  font-size: 0.6rem;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--rh-laung);
}

.woocommerce .rh-coupon input.input-text,
.rh-coupon input.input-text {
  width: 10rem;
  height: 2.75rem;
  margin: 0;
  padding: 0 0.9rem;
  border: 1px solid rgba(42, 24, 16, 0.2);
  border-radius: 4px;
  background-color: var(--rh-paper);
  font-family: var(--rh-mono);
  font-size: 0.85rem;
  color: var(--rh-ink);
}

.rh-coupon .rh-btn {
  padding: 0.8rem 1.4rem;
}

/* Update cart is secondary — quiet until a quantity actually changes. */
.woocommerce .rh-cart__update,
.rh-cart__update {
  padding: 0.8rem 1.4rem;
  border: 1px solid var(--rh-rule) !important;
  border-radius: 4px !important;
  background-color: transparent !important;
  font-family: var(--rh-mono);
  font-size: 0.62rem;
  font-weight: 400;
  letter-spacing: 0.14em;
  text-transform: uppercase !important;
  color: var(--rh-laung) !important;
  cursor: pointer;
}

.woocommerce .rh-cart__update:hover,
.rh-cart__update:hover {
  border-color: var(--rh-ink) !important;
  color: var(--rh-ink) !important;
}

.rh-cart__back {
  margin-top: 1.5rem;
}

/* --- Empty cart --------------------------------------------------------- */

.rh-empty {
  margin-top: clamp(1.5rem, 3vw, 2.125rem);
  padding: clamp(2.25rem, 5vw, 3.5rem) 2.5rem;
  border: 1px dashed rgba(42, 24, 16, 0.24);
  border-radius: 6px;
  text-align: center;
}

.rh-empty__title {
  margin: 0;
  font-family: var(--rh-display);
  font-weight: 600;
  font-size: clamp(1.35rem, 2.6vw, 1.625rem);
  color: var(--rh-ink);
}

.rh-empty__body {
  max-width: 26rem;
  margin: 0.75rem auto 0;
  font-family: var(--rh-body);
  font-size: 0.97rem;
  line-height: 1.6;
  color: var(--rh-laung);
  text-wrap: pretty;
}

.rh-empty .rh-btn {
  margin-top: 1.4rem;
}

/* --- Ink summary panel -------------------------------------------------- */

/* Unwind WooCommerce's floated cart-totals column.
 *
 * `.woocommerce .cart-collaterals .cart_totals { float: right; width: 48% }` —
 * the panel rendered 169px inside its 352px grid track (48% of it, exactly), which
 * squeezed the shipping method rows to 127px and wrapped every courier name. Third
 * time this float pattern has appeared: the product summary, the checkout columns,
 * and now this. The shipped declarations win, so !important is required. */
.woocommerce .cart-collaterals,
.woocommerce-page .cart-collaterals,
.woocommerce .cart-collaterals .cart_totals,
.woocommerce-page .cart-collaterals .cart_totals,
.rh-cart__aside,
.rh-summary {
  float: none !important;
  width: 100% !important;
  max-width: none !important;
}

.rh-summary {
  padding: 1.875rem 1.75rem 2rem;
  border-radius: 6px;
  background-color: var(--rh-ink);
  background-image: var(--rh-grain);
  background-repeat: repeat;
}

.rh-summary__caption {
  margin: 0 0 1.25rem;
  font-family: var(--rh-mono);
  font-size: 0.62rem;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--rh-ghee);
}

.rh-summary__rows {
  border-top: 1px solid rgba(232, 178, 58, 0.4);
}

.rh-summary__row {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 1rem;
  padding: 0.75rem 0;
  border-bottom: 1px solid rgba(244, 237, 224, 0.1);
}

.rh-summary__key {
  font-family: var(--rh-body);
  font-size: 0.9rem;
  color: rgba(244, 237, 224, 0.62);
}

.rh-summary__val,
.rh-summary__val .amount,
.rh-summary__val .woocommerce-Price-amount {
  font-family: var(--rh-mono);
  font-size: 0.9rem;
  text-align: right;
  color: var(--rh-paper);
}

.rh-summary__val .includes_tax,
.rh-summary__val small {
  display: block;
  font-size: 0.62rem;
  color: rgba(244, 237, 224, 0.4);
}

.rh-summary__row--total {
  padding: 1rem 0 0;
  border-bottom: 0;
}

.rh-summary__row--total .rh-summary__key {
  font-family: var(--rh-mono);
  font-size: 0.66rem;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--rh-ghee);
}

.rh-summary__total,
.rh-summary__total .amount,
.rh-summary__total .woocommerce-Price-amount {
  font-family: var(--rh-display);
  font-optical-sizing: auto;
  font-weight: 600;
  font-size: 1.875rem;
  line-height: 1;
  color: var(--rh-paper);
}

/* --- Shipping method chooser -------------------------------------------
 * Rewritten after seeing live Shiprocket rates. The mockup assumed one shipping
 * line ("Shipping — Free"); the real integration returns five to ten courier
 * options with names and delivery dates ("Shadowfax Surface ( Delivery By Aug 23,
 * 2026): ₹103.36"). Right-aligned mono text of that length wrapped to three lines
 * per option inside a 200px column, and the summary panel became an unreadable
 * wall.
 *
 * So the shipping row breaks out of the two-column summary layout and becomes a
 * full-width stacked list: radio, then label, with the price allowed to sit inside
 * the label where WooCommerce puts it.
 * ----------------------------------------------------------------------- */

.rh-summary__row.woocommerce-shipping-totals {
  display: block;
}

.rh-summary__row.woocommerce-shipping-totals .rh-summary__key {
  display: block;
  margin-bottom: 0.5rem;
}

.rh-summary__row.woocommerce-shipping-totals .rh-summary__val {
  display: block;
  text-align: left;
}

.rh-methods {
  margin: 0;
  padding: 0;
  list-style: none;
  text-align: left;
}

/* The radio is absolutely positioned, not a grid or flex child.
 *
 * WooCommerce/Astra position `#shipping_method li input` themselves, and whichever
 * of them wins, the radio was landing on top of the first character of the label —
 * "Shadowfax" rendered as "hadowfax" with the dot over the S. Pinning it explicitly
 * and padding the row to clear it is deterministic and cannot be out-specified. */
/* Everything lives INSIDE the label. Sixth approach, and the last, because it
 * removes the thing that kept failing rather than working around it.
 *
 * The previous five all tried to place the control and the label as siblings in the
 * <li> — as grid cells, as a flex row, with the input absolutely positioned, and
 * finally as a pseudo-element in an explicit grid column. Every one of them reported
 * correct geometry (`grid-template-columns: 16px 252.4px`, `column-gap: 20px`,
 * input in column 1, label in column 2, getBoundingClientRect() agreeing) and every
 * one of them still painted the control flush against the first character of the
 * courier name.
 *
 * Whatever the cause, it is in the coordination between those two siblings. So there
 * is no coordination now: the <li> is a plain block, the native input is visually
 * hidden, and the label is a three-column grid that draws its own control in column
 * one. One element positions everything, and there is no sibling left to disagree
 * with.
 *
 * The input stays in the DOM, focusable and in the accessibility tree — the standard
 * visually-hidden pattern, not display: none. The label carries `for`, so clicking
 * still checks the radio and WooCommerce's AJAX still sees a real change event. */
.rh-methods li {
  display: block;
  padding: 0;
}

.rh-methods li + li {
  margin-top: 0.6rem;
  padding-top: 0.6rem;
  border-top: 1px solid rgba(244, 237, 224, 0.08);
}

/* Visually hidden, still focusable.
 *
 * `appearance: none` is the load-bearing declaration, and it is what the previous
 * five attempts were missing. Chrome paints a native radio's glyph from the control
 * itself, and it does NOT respect `clip`, `clip-path` or a 1px box for that paint —
 * so the input kept drawing a 13px circle roughly 20px right of its own layout box,
 * which is exactly the offset that made every measurement disagree with every
 * screenshot. getBoundingClientRect() was right all along; the native widget simply
 * was not painting where its box was.
 *
 * `appearance: none` removes the native rendering entirely, leaving the label's
 * ::before as the only visible control. opacity: 0 covers any residual paint. */
.rh-methods input[type="radio"] {
  -webkit-appearance: none !important;
  appearance: none !important;
  opacity: 0 !important;
  position: absolute !important;
  width: 1px !important;
  height: 1px !important;
  margin: 0 !important;
  padding: 0 !important;
  border: 0 !important;
  background: none !important;
  pointer-events: none;
}

/* Label parts come from astra_child_shipping_method_label(): courier name, price,
 * and the delivery estimate. Column 1 is the control the label draws itself. */
/* Spacing note, because the two gaps in this row want different values.
 *
 * `column-gap` applies between EVERY column, so widening it to separate the control
 * from the courier name also pushed the price away from the name. Instead the first
 * track is wider than the control that sits in it (2.25rem track, 1rem ring,
 * `justify-self: start`), which buys ~1.25rem of clear space on the control side
 * while the name-to-price gap stays at a normal 0.75rem.
 *
 * To tune the distance from the ring to the courier name, change the FIRST track
 * value below — not `column-gap`. */
.rh-methods label {
  display: grid !important;
  grid-template-columns: 2.25rem minmax(0, 1fr) auto;
  align-items: baseline;
  column-gap: 0.75rem;
  cursor: pointer;
}

.rh-methods label::before {
  content: "";
  grid-column: 1;
  grid-row: 1;
  align-self: center;
  /* Sits at the start of its wider track — the remaining track width is the gap. */
  justify-self: start;
  width: 1rem;
  height: 1rem;
  border: 1px solid rgba(232, 178, 58, 0.5);
  border-radius: 50%;
  background-color: transparent;
  transition: background-color 0.15s ease, border-color 0.15s ease;
}

/* Checked: gold ring, ink gap drawn with an inset shadow, gold centre. No extra
 * element needed. */
.rh-methods li:has(input[type="radio"]:checked) label::before {
  border-color: var(--rh-ghee);
  background-color: var(--rh-ghee);
  box-shadow: inset 0 0 0 3px var(--rh-ink);
}

.rh-methods label:hover::before {
  border-color: var(--rh-ghee);
}

/* Focus has to stay visible now the input itself is hidden. */
.rh-methods li:has(input[type="radio"]:focus-visible) label::before {
  outline: 2px solid var(--rh-sev);
  outline-offset: 2px;
}

/* WooCommerce renders a single available method as a hidden input — nothing to
 * choose, so drop the control and give the text the full row. */
.rh-methods li:only-child:not(:has(input[type="radio"])) label {
  grid-template-columns: minmax(0, 1fr) auto;
}

/* The estimate line aligns with the courier name, not the control. */
.rh-methods li:only-child:not(:has(input[type="radio"])) .rh-method__eta {
  grid-column: 1 / -1;
}

.rh-methods li:only-child:not(:has(input[type="radio"])) label::before {
  display: none;
}

.rh-method__name {
  grid-column: 2;
  font-family: var(--rh-body);
  font-size: 0.85rem;
  line-height: 1.35;
  color: rgba(244, 237, 224, 0.82);
}

.rh-method__price {
  grid-column: 3;
}

.rh-method__price,
.rh-method__price .amount {
  font-family: var(--rh-mono);
  font-size: 0.85rem;
  white-space: nowrap;
  color: var(--rh-ghee);
}

.rh-method__free {
  color: #7bbfae;
}

.rh-method__eta {
  grid-column: 2 / -1;
  margin-top: 0.1rem;
  font-family: var(--rh-mono);
  font-size: 0.6rem;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: rgba(244, 237, 224, 0.42);
}

.woocommerce-shipping-destination {
  margin: 0.5rem 0 0;
  font-family: var(--rh-mono);
  font-size: 0.6rem;
  line-height: 1.6;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  text-align: right;
  color: rgba(244, 237, 224, 0.42);
}

.woocommerce-shipping-destination strong {
  font-weight: 400;
  color: rgba(244, 237, 224, 0.7);
}

/* --- The free-shipping nudge -------------------------------------------- */

.rh-summary__note {
  margin: 1.125rem 0 0;
  padding: 0.7rem 0.875rem;
  border: 1px solid rgba(232, 178, 58, 0.3);
  border-radius: 4px;
  font-family: var(--rh-mono);
  font-size: 0.62rem;
  line-height: 1.6;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--rh-ghee);
}

/* Threshold met — switch to the verification colour the seal dot and the in-stock
 * line use. Tinted, because --rh-seal at full strength is unreadable on ink. */
.rh-summary__note.is-met {
  border-color: rgba(30, 91, 79, 0.55);
  background-color: rgba(30, 91, 79, 0.18);
  color: #7bbfae;
}

.rh-summary__cta {
  margin-top: 1.25rem;
}

.rh-checkout-button {
  display: block;
  width: 100%;
  text-align: center;
}

.rh-summary__pay {
  margin: 0.875rem 0 0;
  font-family: var(--rh-mono);
  font-size: 0.6rem;
  line-height: 1.8;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: rgba(244, 237, 224, 0.4);
}

/* --- Checkout -----------------------------------------------------------
 * A VISUAL pass only. Every WooCommerce field is intact — see
 * inc/woocommerce-cart.php for why the mockup's four-field form is not
 * implemented: Shiprocket needs city, state and postcode as separate fields to
 * rate a shipment, and COD is restricted to the Shiprocket method.
 * ------------------------------------------------------------------------- */

.rh-checkout__head {
  max-width: var(--rh-measure);
  margin: 0 auto;
  padding: clamp(1.75rem, 4vw, 3.375rem) 2.5rem 0;
}

.rh-checkout__dek {
  max-width: 34rem;
  margin: 0.75rem 0 0;
  font-family: var(--rh-body);
  font-size: 1rem;
  line-height: 1.6;
  color: var(--rh-laung);
}

.woocommerce-checkout form.checkout {
  display: grid;
  grid-template-columns: minmax(0, 1.55fr) minmax(0, 1fr);
  align-items: start;
  gap: clamp(1.75rem, 4vw, 3rem);
  max-width: var(--rh-measure);
  margin: 0 auto;
  padding: clamp(1.5rem, 3vw, 2.375rem) 2.5rem clamp(2.5rem, 5vw, 5rem);
}

/* Unwind WooCommerce's floated checkout columns.
 *
 * The grid on form.checkout already provides the two columns, but WooCommerce
 * still floats #customer_details and #order_review at ~47% each — measured 358px
 * inside a 652px grid track, and the order review at 261px inside 420px. Same
 * situation as the product summary: the shipped declarations win, so !important is
 * required rather than preferred.
 *
 * .col-1 and .col-2 (Billing details / Additional information) are unwound too, so
 * they stack full-width down the left column instead of splitting it again. */
.woocommerce-checkout #customer_details,
.woocommerce-checkout #customer_details .col-1,
.woocommerce-checkout #customer_details .col-2,
.woocommerce-checkout .col2-set,
.woocommerce-checkout #order_review,
.woocommerce-checkout #order_review_heading {
  width: 100% !important;
  max-width: none !important;
  float: none !important;
  margin-left: 0;
  margin-right: 0;
}

.woocommerce-checkout #customer_details .col-2 {
  margin-top: 2rem;
}

/* Explicit grid placement.
 *
 * form.checkout has THREE children — #customer_details, #order_review_heading and
 * #order_review — in a two-column grid, so auto-placement put the heading in
 * column 2 and wrapped the review back into column 1 (measured 652px in a 420px
 * track). The details column spans both rows; the heading and the review stack in
 * column 2. */
.woocommerce-checkout #customer_details {
  grid-column: 1;
  grid-row: 1 / span 2;
}

.woocommerce-checkout #order_review_heading {
  grid-column: 2;
  grid-row: 1;
}

.woocommerce-checkout #order_review {
  grid-column: 2;
  grid-row: 2;
}

/* The order review sticks while the address fields scroll — on a long checkout the
 * total is the thing a buyer keeps glancing back at. The offset clears the sticky
 * header plus the announcement bar. */
.woocommerce-checkout #order_review {
  position: sticky;
  top: calc(5.5rem + var(--rh-bar-h));
  width: auto;
  float: none;
}

.woocommerce-checkout #order_review_heading {
  margin: 0 0 0.75rem;
  font-family: var(--rh-mono);
  font-size: 0.62rem;
  font-weight: 500;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--rh-sev);
}

/* Section headings: "Billing details", "Additional information". */
.woocommerce-checkout form.checkout h3 {
  margin: 0 0 1rem;
  padding-bottom: 0.6rem;
  border-bottom: 1px solid var(--rh-ghee);
  font-family: var(--rh-mono);
  font-size: 0.62rem;
  font-weight: 500;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--rh-sev);
}

.woocommerce-checkout .woocommerce-additional-fields {
  margin-top: 2rem;
}

/* --- Checkout fields ---------------------------------------------------- */

.woocommerce form .form-row {
  margin: 0 0 0.875rem;
  padding: 0;
}

.woocommerce form .form-row label {
  display: block;
  margin-bottom: 0.35rem;
  font-family: var(--rh-mono);
  font-size: 0.6rem;
  font-weight: 400;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--rh-laung);
}

.woocommerce form .form-row .required {
  color: var(--rh-sev);
  text-decoration: none;
}

.woocommerce form .form-row input.input-text,
.woocommerce form .form-row textarea,
.woocommerce form .form-row select,
.woocommerce-checkout .select2-container .select2-selection--single {
  width: 100%;
  height: 3rem;
  padding: 0 0.875rem;
  border: 1px solid rgba(42, 24, 16, 0.2);
  border-radius: 4px;
  background-color: var(--rh-paper);
  box-shadow: none;
  font-family: var(--rh-body);
  /* 16px minimum. iOS Safari zooms the viewport on focus for anything smaller,
   * which on a checkout throws the layout sideways mid-typing. */
  font-size: 1rem;
  line-height: 1.4;
  color: var(--rh-ink);
}

.woocommerce form .form-row textarea {
  height: auto;
  min-height: 5.5rem;
  padding: 0.75rem 0.875rem;
  line-height: 1.5;
  resize: vertical;
}

.woocommerce form .form-row input.input-text:focus,
.woocommerce form .form-row textarea:focus,
.woocommerce form .form-row select:focus {
  border-color: var(--rh-ink);
  outline: 2px solid var(--rh-sev);
  outline-offset: 1px;
}

/* Phone and postcode are figures, so they take the mono face. */
#billing_phone,
#billing_postcode,
#shipping_postcode {
  font-family: var(--rh-mono) !important;
}

.woocommerce-checkout .select2-container .select2-selection--single {
  display: flex;
  align-items: center;
}

.woocommerce-checkout .select2-container--default .select2-selection--single .select2-selection__rendered {
  padding: 0;
  line-height: inherit;
  color: var(--rh-ink);
}

.woocommerce-checkout .select2-container--default .select2-selection--single .select2-selection__arrow {
  height: 100%;
}

/* --- Payment methods as cards ------------------------------------------ */

.woocommerce-checkout #payment {
  border-radius: 0;
  background: transparent;
}

.woocommerce-checkout #payment ul.payment_methods {
  display: flex;
  flex-direction: column;
  gap: 0.55rem;
  margin: 0;
  padding: 0;
  border: 0;
  list-style: none;
}

.woocommerce-checkout #payment ul.payment_methods li {
  margin: 0;
  padding: 0.75rem 0.875rem;
  border: 1px solid var(--rh-rule);
  border-radius: 4px;
  background-color: transparent;
  transition: border-color 0.2s ease, background-color 0.2s ease;
}

/* :has() gives the selected card its state with no JS — the radio is inside the
 * li, so the parent can react to it. */
.woocommerce-checkout #payment ul.payment_methods li:has(input.input-radio:checked) {
  border-color: var(--rh-ink);
  background-color: var(--rh-sunk);
}

.woocommerce-checkout #payment ul.payment_methods li label {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  font-family: var(--rh-body);
  font-size: 0.97rem;
  font-weight: 600;
  color: var(--rh-ink);
  cursor: pointer;
}

.woocommerce-checkout #payment ul.payment_methods li img {
  max-height: 1.5rem;
  width: auto;
  margin: 0;
}

.woocommerce-checkout #payment div.payment_box {
  margin: 0.625rem 0 0;
  padding: 0.75rem 0.875rem;
  border-radius: 4px;
  background-color: var(--rh-sunk);
  font-family: var(--rh-body);
  font-size: 0.9rem;
  line-height: 1.55;
  color: var(--rh-laung);
}

/* WooCommerce draws a CSS triangle pointing at a background this design does not
 * have. */
.woocommerce-checkout #payment div.payment_box::before {
  display: none;
}

.woocommerce-checkout #payment .place-order {
  margin: 0;
  padding: 1.25rem 0 0;
}

.woocommerce-checkout #place_order,
.woocommerce #payment #place_order {
  width: 100%;
  min-height: 3.25rem;
  padding: 0 1.5rem;
  border: 0 !important;
  border-radius: 4px !important;
  background-color: var(--rh-ghee) !important;
  font-family: var(--rh-body);
  font-size: 1rem;
  font-weight: 600;
  letter-spacing: 0.03em;
  text-transform: none !important;
  color: var(--rh-ink) !important;
  cursor: pointer;
}

.woocommerce-checkout #place_order:hover,
.woocommerce #payment #place_order:hover {
  background-color: var(--rh-sev) !important;
  color: var(--rh-paper) !important;
}

.woocommerce-checkout .woocommerce-terms-and-conditions-wrapper {
  margin-bottom: 0.75rem;
  font-family: var(--rh-body);
  font-size: 0.85rem;
  color: var(--rh-laung);
}

/* --- Checkout order-review table --------------------------------------- */

/* This one IS restyled rather than overridden — it is already a two-column
 * key/value table, which is what the design wants. Only the skin changes. */
.woocommerce-checkout #order_review table.shop_table {
  border: 0;
  border-collapse: collapse;
  border-radius: 6px;
  overflow: hidden;
  background-color: var(--rh-ink);
  background-image: var(--rh-grain);
}

.woocommerce-checkout #order_review table.shop_table th,
.woocommerce-checkout #order_review table.shop_table td {
  padding: 0.75rem 1.25rem;
  border: 0;
  border-bottom: 1px solid rgba(244, 237, 224, 0.1);
  font-family: var(--rh-body);
  font-size: 0.9rem;
  color: rgba(244, 237, 224, 0.72);
}

.woocommerce-checkout #order_review table.shop_table thead th {
  font-family: var(--rh-mono);
  font-size: 0.6rem;
  font-weight: 500;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--rh-ghee);
}

.woocommerce-checkout #order_review table.shop_table td.product-total,
.woocommerce-checkout #order_review table.shop_table td .amount {
  font-family: var(--rh-mono);
  color: var(--rh-paper);
}

.woocommerce-checkout #order_review table.shop_table tfoot th {
  font-family: var(--rh-mono);
  font-size: 0.66rem;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: rgba(244, 237, 224, 0.62);
}

.woocommerce-checkout #order_review table.shop_table tfoot .order-total th,
.woocommerce-checkout #order_review table.shop_table tfoot .order-total td .amount {
  color: var(--rh-ghee);
}

.woocommerce-checkout #order_review table.shop_table tfoot .order-total td .amount {
  font-family: var(--rh-display);
  font-weight: 600;
  font-size: 1.5rem;
}

.woocommerce-checkout #order_review table.shop_table .variation {
  margin: 0.25rem 0 0;
  font-family: var(--rh-mono);
  font-size: 0.62rem;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: rgba(244, 237, 224, 0.42);
}

.woocommerce-checkout #order_review table.shop_table .variation dt,
.woocommerce-checkout #order_review table.shop_table .variation dd {
  display: inline;
  margin: 0;
  font-weight: 400;
}

/* The shipping row is a single colspan cell — see cart/cart-shipping.php for why.
 * The label and the method list stack inside it, full width. */
.woocommerce-checkout #order_review table.shop_table tr.shipping > td {
  padding-top: 0.75rem;
  padding-bottom: 0.9rem;
}

.rh-summary__key--stacked {
  display: block;
  /* The review table right-aligns its second column, and the label inherited that
   * — so "SHIPMENT" sat over on the right, away from the list it introduces. */
  text-align: left;
  margin-bottom: 0.5rem;
  font-family: var(--rh-mono);
  font-size: 0.66rem;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: rgba(244, 237, 224, 0.62);
}

.rh-summary__val--stacked {
  display: block;
}

/* A little more air between name and price here than in the cart, since the review
 * panel is narrower. */
.woocommerce-checkout #order_review .rh-methods label {
  column-gap: 1rem;
}

/* The generic review-table rule paints every `.amount` in paper; the courier price
 * is a figure being compared against four others, so it keeps the gold accent it has
 * on the cart. */
.woocommerce-checkout #order_review table.shop_table .rh-method__price,
.woocommerce-checkout #order_review table.shop_table .rh-method__price .amount,
.woocommerce-checkout #order_review table.shop_table .rh-method__price .woocommerce-Price-amount {
  color: var(--rh-ghee);
}

.woocommerce-checkout #order_review table.shop_table .rh-method__free {
  color: #7bbfae;
}

.woocommerce-checkout #order_review table.shop_table .product-quantity {
  font-family: var(--rh-mono);
  color: rgba(244, 237, 224, 0.5);
}

/* --- Notices ------------------------------------------------------------ */

.woocommerce-message,
.woocommerce-info,
.woocommerce-error {
  margin: 0 0 1.25rem;
  padding: 0.875rem 1.125rem;
  border: 1px solid var(--rh-rule);
  border-top: 2px solid var(--rh-ghee);
  border-radius: 4px;
  background-color: var(--rh-sunk);
  font-family: var(--rh-body);
  font-size: 0.95rem;
  line-height: 1.55;
  color: var(--rh-ink);
}

.woocommerce-message::before,
.woocommerce-info::before,
.woocommerce-error::before {
  display: none;
}

.woocommerce-error {
  border-top-color: #a4341b;
}

.woocommerce-message .button,
.woocommerce-info .button {
  float: none;
  margin-left: 0.75rem;
  padding: 0.5rem 1rem;
  border-radius: 4px;
  background-color: var(--rh-ink) !important;
  font-family: var(--rh-mono);
  font-size: 0.6rem;
  letter-spacing: 0.12em;
  text-transform: uppercase !important;
  color: var(--rh-paper) !important;
}

/* --- Cart and checkout responsive -------------------------------------- */

/* 1024px, not 900px. At ~980px the two-column cart left the product name wrapping
 * to three lines in a narrow middle column while the summary sat beside it. The
 * shop-flow pages need to stack earlier than the editorial ones. */
@media (max-width: 1024px) {

  .rh-cart,
  .rh-checkout__head,
  .woocommerce-checkout form.checkout {
    padding-left: 1.5rem;
    padding-right: 1.5rem;
  }

  .rh-cart__body,
  .woocommerce-checkout form.checkout {
    grid-template-columns: minmax(0, 1fr);
  }

  /* Sticky is wrong once the columns stack — it would pin the summary over the
   * fields being filled in. The explicit grid placement has to be released too,
   * or the two columns stay side by side in a single-column grid. */
  .woocommerce-checkout #order_review {
    position: static;
  }

  .woocommerce-checkout #customer_details,
  .woocommerce-checkout #order_review_heading,
  .woocommerce-checkout #order_review {
    grid-column: 1;
    grid-row: auto;
  }

  /* Summary first on a phone: the total is what a buyer confirms before
   * scrolling into a form. */
  .rh-cart__aside {
    order: -1;
  }
}

@media (max-width: 600px) {

  .rh-line {
    grid-template-columns: 4.5rem minmax(0, 1fr);
    align-items: start;
    gap: 1rem;
  }

  /* The line total drops under the controls rather than taking a third column
   * that would squeeze the product name to two words. */
  .rh-line__total {
    grid-column: 2;
    margin-top: 0.5rem;
  }

  .rh-cart__actions {
    flex-direction: column;
    align-items: stretch;
  }

  .rh-coupon input.input-text {
    flex: 1 1 auto;
    width: auto;
  }
}

@media (prefers-reduced-motion: reduce) {

  .woocommerce-checkout #payment ul.payment_methods li {
    transition: none;
  }
}



/* ==========================================================================
   Order received & tracking
   ==========================================================================
 * Markup from woocommerce/checkout/thankyou.php and
 * page-templates/tracking.php.
 */

/* --- Order received ----------------------------------------------------- */

.rh-thanks__hero {
  background-color: var(--rh-ink);
  background-image: var(--rh-grain);
  background-repeat: repeat;
}

.rh-thanks__hero-inner {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  /* align-content, not align-items: the mark spans all four text rows, so the
   * implicit rows stretched to share its height and opened a gap between the body
   * paragraph and the order number. `start` packs the rows and lets the mark be
   * the tall one. */
  align-content: start;
  align-items: start;
  gap: 0 clamp(1.5rem, 4vw, 3rem);
  max-width: var(--rh-measure);
  margin: 0 auto;
  padding: clamp(2.5rem, 5vw, 4.375rem) 2.5rem;
}

.rh-thanks__mark {
  grid-column: 2;
  grid-row: 1 / span 4;
  justify-self: end;
}

/* The mark is drawn for a paper ground — its arcade strokes are ink. On the ink
 * hero those piers vanish, so they are lifted to paper here. */
.rh-thanks__mark .rh-mark__arch path {
  stroke: var(--rh-paper);
}

.rh-thanks__mark .rh-mark__text {
  fill: var(--rh-ghee);
}

.rh-thanks__flag {
  grid-column: 1;
  display: flex;
  align-items: center;
  gap: 0.5rem;
  margin: 0;
  font-family: var(--rh-mono);
  font-size: 0.66rem;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: #7bbfae;
}

.rh-thanks__seal {
  width: 0.5rem;
  height: 0.5rem;
  flex: none;
  border-radius: 50%;
  background-color: var(--rh-seal);
  box-shadow: 0 0 0 2px var(--rh-ink), 0 0 0 3px var(--rh-seal);
}

.rh-thanks__flag--failed {
  color: #e0836a;
}

.woocommerce .rh-thanks__title,
.rh-thanks__title {
  grid-column: 1;
  margin: 0.875rem 0 0;
  padding: 0;
  border: 0;
  font-family: var(--rh-display);
  font-optical-sizing: auto;
  font-weight: 600;
  font-size: clamp(2rem, 4.6vw, 3.5rem);
  line-height: 1;
  letter-spacing: -0.025em;
  color: var(--rh-paper);
  text-wrap: pretty;
}

/* WooCommerce's notice classes carry a tick icon and a tinted background; the
 * heading is the confirmation here, so both are removed. */
.woocommerce .rh-thanks__title.woocommerce-notice::before,
.rh-thanks__title.woocommerce-notice::before {
  display: none;
}

.rh-thanks__body {
  grid-column: 1;
  max-width: 32rem;
  margin: 1rem 0 0;
  font-family: var(--rh-body);
  font-size: clamp(1rem, 1.5vw, 1.06rem);
  line-height: 1.6;
  color: rgba(244, 237, 224, 0.66);
  text-wrap: pretty;
}

.rh-thanks__ref {
  grid-column: 1;
  margin: 1rem 0 0;
  font-family: var(--rh-mono);
  font-size: 0.72rem;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--rh-ghee);
}

.rh-thanks__actions {
  grid-column: 1;
  display: flex;
  flex-wrap: wrap;
  gap: 0.75rem;
  margin: 1.5rem 0 0;
}

.rh-thanks__body-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  align-items: start;
  gap: clamp(2rem, 4vw, 3rem);
  max-width: var(--rh-measure);
  margin: 0 auto;
  padding: clamp(2rem, 4vw, 2.75rem) 2.5rem clamp(2.5rem, 5vw, 5rem);
}

/* Explicit placement, because auto-placement left a 388px hole in the page.
 *
 * The three children are the Receipt ledger (281px), the itemised receipt
 * (669px) and What happens next (448px). Auto-placed into a two-column grid they
 * land 1-2-3, so row one is as tall as the *tallest* of the first two — 669px —
 * and the 281px ledger sat above 388px of nothing before What happens next began
 * on row two. That empty half-screen is what the page looked broken by.
 *
 * The receipt is instead told to span both rows of column two, and the two short
 * blocks stack up column one against it. Nothing is fixed-height: if the receipt
 * ever grows past the two rows beside it, the rows stretch to match. */
.rh-thanks__body-grid > .rh-thanks__receipt {
  grid-column: 1;
  grid-row: 1;
}

.rh-thanks__body-grid > .rh-thanks__next {
  grid-column: 1;
  grid-row: 2;
}

.rh-thanks__body-grid > .rh-receipt {
  grid-column: 2;
  grid-row: 1 / span 2;
  margin-top: 0;
}

/* WooCommerce's order-overview list is replaced by the ledger; the class stays on
 * the wrapper for plugin compatibility, so its list styling has to be reset. */
.rh-thanks__receipt ul.woocommerce-order-overview {
  margin: 0;
  padding: 0;
  border: 0;
  list-style: none;
}

/* --- Step timeline ------------------------------------------------------ */

.rh-steps {
  margin: 1.25rem 0 0;
  padding: 0;
  list-style: none;
  counter-reset: none;
}

.rh-step {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
  align-items: start;
  gap: 0.875rem;
  padding: 0.875rem 0;
  border-bottom: 1px solid rgba(42, 24, 16, 0.09);
}

.rh-step:last-child {
  border-bottom: 0;
}

.rh-step__dot {
  width: 0.7rem;
  height: 0.7rem;
  margin-top: 0.3rem;
  border: 1px solid rgba(42, 24, 16, 0.28);
  border-radius: 50%;
  background-color: transparent;
}

/* Only the completed step is filled. A timeline where every dot looks the same
 * tells the reader nothing about where their parcel is. */
.rh-step.is-done .rh-step__dot {
  border-color: var(--rh-seal);
  background-color: var(--rh-seal);
  box-shadow: 0 0 0 3px rgba(30, 91, 79, 0.14);
}

.rh-step__name {
  display: block;
  font-family: var(--rh-body);
  font-size: 0.97rem;
  font-weight: 600;
  color: var(--rh-ink);
}

.rh-step__when {
  display: block;
  margin-top: 0.15rem;
  font-family: var(--rh-mono);
  font-size: 0.62rem;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--rh-laung);
}

.rh-thanks__next .rh-thanks__actions {
  grid-column: auto;
  margin-top: 1.5rem;
}

/* --- Track order ------------------------------------------------------- */

.rh-track__head {
  max-width: var(--rh-measure);
  margin: 0 auto;
  padding: clamp(2.25rem, 5vw, 3.625rem) 2.5rem 0;
}

.rh-track__dek {
  max-width: 32rem;
  margin: 0.875rem 0 0;
  font-family: var(--rh-body);
  font-size: clamp(1rem, 1.5vw, 1.06rem);
  line-height: 1.6;
  color: var(--rh-laung);
  text-wrap: pretty;
}

.rh-track__body {
  display: grid;
  grid-template-columns: minmax(0, 1.2fr) minmax(0, 1fr);
  align-items: start;
  gap: clamp(2rem, 4vw, 3.25rem);
  max-width: var(--rh-measure);
  margin: 0 auto;
  padding: clamp(1.75rem, 4vw, 2.75rem) 2.5rem clamp(2.5rem, 5vw, 4.375rem);
}

/* WooCommerce's tracking form — a plain form with two fields and a button. */
.woocommerce form.woocommerce-form-track-order,
.rh-track__form form {
  margin: 0;
}

.rh-track__form p {
  margin: 0 0 0.875rem;
  font-family: var(--rh-body);
  font-size: 0.97rem;
  line-height: 1.6;
  color: var(--rh-laung);
}

.rh-track__form label {
  display: block;
  margin-bottom: 0.35rem;
  font-family: var(--rh-mono);
  font-size: 0.6rem;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--rh-laung);
}

.woocommerce .rh-track__form input.input-text,
.rh-track__form input[type="text"],
.rh-track__form input[type="email"] {
  width: 100%;
  height: 3rem;
  padding: 0 0.875rem;
  border: 1px solid rgba(42, 24, 16, 0.2);
  border-radius: 4px;
  background-color: var(--rh-paper);
  font-family: var(--rh-mono);
  /* 16px minimum so iOS Safari does not zoom the viewport on focus. */
  font-size: 1rem;
  color: var(--rh-ink);
}

.woocommerce .rh-track__form button,
.rh-track__form button[type="submit"] {
  min-height: 3.125rem;
  margin-top: 0.5rem;
  padding: 0 1.75rem;
  border: 0 !important;
  border-radius: 4px !important;
  background-color: var(--rh-ink) !important;
  font-family: var(--rh-body);
  font-size: 0.95rem;
  font-weight: 600;
  letter-spacing: 0.03em;
  text-transform: none !important;
  color: var(--rh-paper) !important;
  cursor: pointer;
}

.woocommerce .rh-track__form button:hover,
.rh-track__form button[type="submit"]:hover {
  background-color: var(--rh-sev) !important;
}

/* A resolved order prints WooCommerce's order-details table. Same skin as the
 * checkout review, so a tracked order looks like the receipt it is. */
.rh-track__form table.shop_table,
.rh-track__form table.woocommerce-table--order-details {
  width: 100%;
  margin-top: 1.5rem;
  border: 0;
  border-top: 1px solid var(--rh-ghee);
  border-bottom: 1px solid var(--rh-ghee);
  border-collapse: collapse;
  border-radius: 0;
  background: transparent;
}

.rh-track__form table.shop_table th,
.rh-track__form table.shop_table td {
  padding: 0.75rem 1rem 0.75rem 0;
  border: 0;
  border-bottom: 1px solid rgba(42, 24, 16, 0.09);
  font-family: var(--rh-body);
  font-size: 0.95rem;
  text-align: left;
  color: var(--rh-ink);
}

.rh-track__form table.shop_table thead th {
  font-family: var(--rh-mono);
  font-size: 0.6rem;
  font-weight: 500;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--rh-laung);
}

.rh-track__form .woocommerce-order-details__title,
.rh-track__form .woocommerce-column__title {
  margin: 1.5rem 0 0.75rem;
  font-family: var(--rh-mono);
  font-size: 0.62rem;
  font-weight: 500;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--rh-sev);
}

.rh-track__aside .rh-place {
  margin-top: 1.5rem;
}

/* --- Order received & tracking responsive ------------------------------- */

@media (max-width: 900px) {

  .rh-thanks__hero-inner,
  .rh-thanks__body-grid,
  .rh-track__body,
  .rh-track__head {
    padding-left: 1.5rem;
    padding-right: 1.5rem;
  }

  .rh-thanks__hero-inner {
    grid-template-columns: minmax(0, 1fr);
  }

  /* The mark moves above the flag rather than keeping a column to itself — at this
   * width a 126px seal beside a 32px headline squeezes the headline to three
   * words. */
  .rh-thanks__mark {
    grid-column: 1;
    grid-row: auto;
    justify-self: start;
    margin-bottom: 0.5rem;
  }

  .rh-thanks__body-grid,
  .rh-track__body {
    grid-template-columns: minmax(0, 1fr);
  }

  /* Placement is for the two-column layout only; left set, it would pin all three
   * blocks into two rows of a single column and overlap them. */
  .rh-thanks__body-grid > .rh-thanks__receipt,
  .rh-thanks__body-grid > .rh-thanks__next,
  .rh-thanks__body-grid > .rh-receipt {
    grid-column: auto;
    grid-row: auto;
  }
}

@media (max-width: 600px) {

  .rh-thanks__actions .rh-btn {
    flex: 1 1 100%;
    text-align: center;
  }
}


/* ==========================================================================
   My account
   ==========================================================================
 * Template override: woocommerce/myaccount/my-account.php.
 * Helpers in inc/woocommerce-account.php.
 *
 * The one screen on the site that Elementor genuinely owns — page 99 is in
 * builder mode with `[woocommerce_my_account]` inside a text-editor widget — so
 * this is mostly a matter of overriding what Elementor and Astra paint rather
 * than building layout from scratch. Two things had to be undone before anything
 * else could be styled: the Elementor container's pale-yellow background, and
 * Astra's orange buttons.
 *
 * Form fields are not styled here. `.woocommerce form .form-row` in the cart &
 * checkout section already covers labels, inputs, selects and required marks
 * site-wide, so they arrive correct.
 */

/* Elementor's container paints its own background and adds its own vertical
 * padding, which produced a tall empty yellow band above the login form. It can
 * only be reached from an ancestor, which is why inc/woocommerce-account.php adds
 * a body class instead of a wrapper. */
.rh-account-page #content,
.rh-account-page .elementor-element.e-con,
.rh-account-page .elementor-widget-container {
  background-color: transparent;
}

.rh-account-page #content {
  background-color: var(--rh-paper);
  background-image: var(--rh-grain);
  background-repeat: repeat;
}

/* Scoped to #content deliberately. `.ast-container` is Astra's generic container
 * class and the HEADER uses it too — an unscoped version of this rule stripped the
 * header's max-width and padding, which pushed the logo off the left edge of the
 * viewport and the cart button off the right. */
.rh-account-page #content > .ast-container {
  max-width: none;
  padding: 0;
}

.rh-account-page #primary {
  margin: 0;
  padding: 0;
}

/* Elementor's container already supplies 60px of top padding — matching what the
 * document pages set for themselves — so the account head adds none of its own.
 *
 * The alternative was to zero Elementor's padding and set our own, which loses:
 * that padding is declared as
 * `.elementor-99 .elementor-element-44521068 > .e-con-inner`, a specificity a
 * child-theme stylesheet can only beat with !important. Taking the space Elementor
 * is already giving is both simpler and correct — the container padding is a
 * property of the Elementor page, and the client can change it in the builder. */
.rh-account__head {
  padding-top: 0;
}

.rh-account-page .ast-article-single {
  padding: 0;
  border: 0;
  background: transparent;
  box-shadow: none;
}

/* The widget's own `<p>&nbsp;</p>` spacer, which Elementor rendered as an
 * unexplained gap above the form. */
.rh-account-page .elementor-widget-text-editor > .elementor-widget-container > p:empty,
.rh-account-page .elementor-widget-text-editor > .elementor-widget-container > p:first-child:not(:has(*)) {
  display: none;
}

/* --- Head ---------------------------------------------------------------- */

.rh-account__head {
  max-width: var(--rh-measure);
  margin: 0 auto;
  padding: 0 2.5rem clamp(1.5rem, 3vw, 2rem);
}

/* Signed out, the head lines up with the two form panels rather than with the
 * page measure — otherwise the title sits 120px left of the Login box under it. */
.rh-account__head--login {
  max-width: 60rem;
}

.rh-account__kind {
  margin: 0;
  font-family: var(--rh-mono);
  font-size: 0.66rem;
  font-weight: 500;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: var(--rh-sev);
}

.rh-account__title {
  margin: 0.75rem 0 0;
  font-family: var(--rh-display);
  font-optical-sizing: auto;
  font-weight: 600;
  font-size: clamp(1.9rem, 4vw, 2.75rem);
  line-height: 1.04;
  letter-spacing: -0.025em;
  color: var(--rh-ink);
}

.rh-account__note {
  margin: 0.85rem 0 0;
  max-width: 34rem;
  font-family: var(--rh-body);
  font-size: 0.98rem;
  line-height: 1.55;
  color: var(--rh-laung);
}

/* --- Signed in: navigation beside content -------------------------------- */

.rh-account {
  display: grid;
  grid-template-columns: minmax(0, 16rem) minmax(0, 1fr);
  gap: clamp(1.75rem, 4vw, 3.5rem);
  max-width: var(--rh-measure);
  margin: 0 auto;
  padding: 0 2.5rem clamp(3rem, 6vw, 4.5rem);
}

/* WooCommerce floats the nav at 30% and the content at 68%. Both are overridden
 * rather than tweaked, because a float inside a grid item collapses the layout in
 * a way that is much harder to reason about than replacing it. */
.woocommerce-MyAccount-navigation,
.woocommerce-MyAccount-content {
  float: none !important;
  width: auto !important;
  margin: 0;
}

.woocommerce-MyAccount-navigation ul {
  margin: 0;
  padding: 0;
  list-style: none;
  border-top: 1px solid var(--rh-rule);
}

/* Astra ships a grey border on all four sides of every item and a near-white
 * background on the active link — together they drew a boxed grey list with one
 * white row in it. Both are reset explicitly, and the horizontal padding is
 * stated on the plain and the active link alike so labels do not shift when a row
 * becomes current.
 *
 * Every selector below is prefixed with `.rh-account-page`. Astra writes its own
 * as `body .woocommerce-MyAccount-navigation-link` and
 * `body .woocommerce-MyAccount-navigation-link.is-active a`, so an unprefixed
 * single-class selector loses the specificity contest — the first version of this
 * reset was silently ignored for exactly that reason. Two classes beat `body` plus
 * one class, so no !important is needed. */
.rh-account-page .woocommerce-MyAccount-navigation-link {
  margin: 0;
  border: 0;
  border-bottom: 1px solid var(--rh-rule);
}

.rh-account-page .woocommerce-MyAccount-navigation-link a,
.rh-account-page .woocommerce-MyAccount-navigation-link.is-active a {
  display: block;
  padding: 0.7rem 0;
  border: 0;
  background-color: transparent;
  font-family: var(--rh-body);
  font-size: 0.95rem;
  font-weight: 500;
  color: var(--rh-ink) !important;
  text-decoration: none;
}

.rh-account-page .woocommerce-MyAccount-navigation-link a:hover {
  color: var(--rh-sev) !important;
}

/* The active screen is marked with a gold rule in the gutter rather than a filled
 * pill — the same device as the shop's active filter, and it survives a long
 * label wrapping to two lines, which a pill does not. */
.rh-account-page .woocommerce-MyAccount-navigation-link.is-active {
  position: relative;
  padding-left: 0.85rem;
}

.rh-account-page .woocommerce-MyAccount-navigation-link.is-active::before {
  content: "";
  position: absolute;
  top: 0.7rem;
  bottom: 0.7rem;
  left: 0;
  width: 2px;
  background-color: var(--rh-ghee);
}

.rh-account-page .woocommerce-MyAccount-navigation-link.is-active a {
  color: var(--rh-sev) !important;
}

.rh-account-page .woocommerce-MyAccount-navigation-link--customer-logout a {
  font-family: var(--rh-mono);
  font-size: 0.68rem;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--rh-laung) !important;
}

/* --- Signed in: content -------------------------------------------------- */

.woocommerce-MyAccount-content p {
  font-family: var(--rh-body);
  font-size: 1rem;
  line-height: 1.6;
  color: var(--rh-laung);
}

.woocommerce-MyAccount-content p strong {
  font-weight: 600;
  color: var(--rh-ink);
}

.woocommerce-MyAccount-content a:not(.button) {
  color: var(--rh-ink);
  text-decoration: underline;
  text-decoration-color: rgba(201, 118, 27, 0.5);
  text-underline-offset: 0.18em;
}

.woocommerce-MyAccount-content a:not(.button):hover {
  color: var(--rh-sev);
}

.woocommerce-MyAccount-content h2,
.woocommerce-MyAccount-content h3,
.woocommerce-MyAccount-content legend {
  font-family: var(--rh-display);
  font-optical-sizing: auto;
  font-weight: 600;
  font-size: clamp(1.2rem, 2.2vw, 1.5rem);
  letter-spacing: -0.015em;
  color: var(--rh-ink);
}

/* --- Dashboard ---------------------------------------------------------- */

/* Template override: woocommerce/myaccount/dashboard.php. */

.rh-account__latest {
  margin-bottom: clamp(1.75rem, 4vw, 2.5rem);
}

.rh-account__latest-row {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 0.5rem 1.25rem;
  padding: 0.95rem 1.1rem;
  border: 1px solid rgba(232, 178, 58, 0.55);
  background-color: var(--rh-sunk);
}

.rh-account__latest-num,
.rh-account__latest-date,
.rh-account__latest-status {
  font-family: var(--rh-mono);
  font-size: 0.7rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
}

.rh-account__latest-num {
  color: var(--rh-ink);
}

.rh-account__latest-date {
  color: var(--rh-laung);
}

.rh-account__latest-status {
  color: var(--rh-seal);
}

.rh-account__latest-total {
  font-family: var(--rh-display);
  font-optical-sizing: auto;
  font-weight: 600;
  font-size: 1.15rem;
  color: var(--rh-ink);
}

/* Pushed to the end of the row on wide viewports, but it wraps with everything
 * else rather than being pinned, so a long status never collides with it. */
.rh-account__latest-link {
  margin-left: auto;
  font-family: var(--rh-mono);
  font-size: 0.62rem;
  letter-spacing: 0.14em;
  text-transform: uppercase;
}

.rh-account__links ul {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 13rem), 1fr));
  gap: 1px;
  margin: 0;
  padding: 0;
  list-style: none;
  background-color: var(--rh-rule);
  border: 1px solid var(--rh-rule);
}

.rh-account__links li {
  margin: 0;
  background-color: var(--rh-paper);
}

.rh-account__links a {
  display: block;
  height: 100%;
  padding: 1.1rem 1.15rem;
  text-decoration: none !important;
  transition: background-color 0.15s ease;
}

.rh-account__links a:hover {
  background-color: var(--rh-sunk);
}

.rh-account__link-title {
  display: block;
  font-family: var(--rh-body);
  font-size: 1rem;
  font-weight: 600;
  color: var(--rh-ink);
}

.rh-account__links a:hover .rh-account__link-title {
  color: var(--rh-sev);
}

.rh-account__link-note {
  display: block;
  margin-top: 0.3rem;
  font-family: var(--rh-body);
  font-size: 0.85rem;
  line-height: 1.4;
  color: var(--rh-laung);
  text-wrap: pretty;
}

.rh-account__signout {
  margin: 1.25rem 0 0 !important;
  font-family: var(--rh-mono) !important;
  font-size: 0.62rem !important;
  letter-spacing: 0.14em !important;
  text-transform: uppercase !important;
  color: var(--rh-laung) !important;
}


/* --- Order and download tables ------------------------------------------ */

.woocommerce-orders-table,
.woocommerce-table--order-details,
.woocommerce-table--order-downloads,
.shop_table.my_account_orders {
  width: 100%;
  border-collapse: collapse;
  border: 1px solid var(--rh-rule);
}

.woocommerce-orders-table th,
.woocommerce-table--order-details th,
.woocommerce-table--order-downloads th,
.shop_table.my_account_orders th {
  padding: 0.7rem 0.9rem;
  border-bottom: 1px solid var(--rh-rule);
  background-color: var(--rh-sunk);
  font-family: var(--rh-mono);
  font-size: 0.6rem;
  font-weight: 500;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--rh-laung);
  text-align: left;
}

.woocommerce-orders-table td,
.woocommerce-table--order-details td,
.woocommerce-table--order-downloads td,
.shop_table.my_account_orders td {
  padding: 0.85rem 0.9rem;
  border-bottom: 1px solid var(--rh-rule);
  font-family: var(--rh-body);
  font-size: 0.95rem;
  color: var(--rh-ink);
  vertical-align: middle;
}

.woocommerce-orders-table__cell-order-number a {
  font-family: var(--rh-mono);
  font-size: 0.85rem;
  letter-spacing: 0.04em;
}

.woocommerce-orders-table__cell-order-status {
  font-family: var(--rh-mono);
  font-size: 0.66rem;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--rh-seal);
}

.woocommerce-orders-table__cell-order-actions {
  text-align: right;
  white-space: nowrap;
}

/* --- Addresses ---------------------------------------------------------- */

.woocommerce-Addresses {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr));
  gap: 1px;
  margin: 1.25rem 0 0;
  background-color: var(--rh-rule);
  border: 1px solid var(--rh-rule);
}

/* `.col2-set` again — its clearfix ::before becomes a grid item and occupies the
 * first track. Here the symptom was different from the login screen and easier to
 * miss: the empty cell showed the grid's own rule colour, so the Addresses screen
 * rendered a grey rectangle to the left of the two address panels.
 *
 * WooCommerce declares it as `.woocommerce .col2-set::before`, so the selector has
 * to be at least three classes deep. `#customer_login` got away with one because
 * an id outranks any number of classes. */
.rh-account-page .woocommerce .col2-set::before,
.rh-account-page .woocommerce .col2-set::after,
.rh-account-page .woocommerce-Addresses::before,
.rh-account-page .woocommerce-Addresses::after {
  display: none;
}

.woocommerce-Addresses .woocommerce-Address {
  width: auto !important;
  float: none !important;
  margin: 0;
  padding: 1.25rem;
  background-color: var(--rh-paper);
}

/* Astra paints this header near-white with its own border and padding — the
 * "double frame" inside each address panel — via
 * `.woocommerce .woocommerce-Addresses .woocommerce-Address-title`, three classes
 * deep. A two-class version of this rule applied its layout properties and lost
 * only the background and border, which is the confusing failure mode: the header
 * wrapped correctly and stayed white. Four classes settle it. `__title` is
 * included because Astra styles the order-details column headings identically.
 *
 * The wrap matters as much as the colour: "Edit billing address" beside "Billing
 * address" needs 266px in a 227px header, and with nowrap the link ran straight
 * out of the panel. */
.rh-account-page .woocommerce .woocommerce-Addresses .woocommerce-Address-title,
.rh-account-page .woocommerce .woocommerce-Addresses .woocommerce-column__title,
.rh-account-page .woocommerce-Address-title {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: space-between;
  gap: 0.35rem 1rem;
  margin-bottom: 0.85rem;
  padding: 0 0 0.6rem;
  border: 0;
  border-bottom: 1px solid var(--rh-rule);
  background-color: transparent;
}

.woocommerce-Address-title h2,
.woocommerce-Address-title h3 {
  margin: 0;
  font-family: var(--rh-mono);
  font-size: 0.66rem;
  font-weight: 500;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--rh-sev);
}

.woocommerce-Address-title .edit {
  flex: none;
  font-family: var(--rh-mono);
  font-size: 0.62rem;
  letter-spacing: 0.14em;
  text-transform: uppercase;
}

/* Astra frames every <address> in the account area
 * (`.woocommerce .woocommerce-Addresses address`, and the same for the order
 * details and customer details blocks). Inside a panel that already has a border
 * that is a box within a box, so the frame is removed and the address is left as
 * plain type. Four classes deep to clear Astra's three. */
.rh-account-page .woocommerce .woocommerce-Addresses address,
.rh-account-page .woocommerce .woocommerce-MyAccount-content address,
.rh-account-page .woocommerce .woocommerce-customer-details address,
.rh-account-page .woocommerce-Address address {
  border: 0;
  padding: 0;
  font-family: var(--rh-body);
  font-size: 0.95rem;
  font-style: normal;
  line-height: 1.6;
  color: var(--rh-laung);
}

/* The "You have not set up this type of address yet." placeholder gets the same
 * treatment — Astra borders it as if it were an address. */
.rh-account-page .woocommerce-Address > p {
  margin: 0;
  padding: 0;
  border: 0;
}

/* --- Sign in / register ------------------------------------------------- */

/* WooCommerce's own two-column set, which floats at 48%. Replaced with a grid so
 * the two panels are equal height and the gap does not depend on a percentage.
 *
 * Narrower than the page measure on purpose: two short forms stretched across
 * 1320px are two thin things a long way apart. At 60rem each panel is about 450px,
 * which is the width the fields actually want.
 *
 * The column count is fixed at two rather than auto-fit because this wrapper only
 * ever exists when registration is enabled — form-login.php omits it entirely
 * otherwise — so there are always exactly two panels, and `repeat(2, …)` cannot
 * produce a stray empty track. */
#customer_login {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: clamp(1.5rem, 4vw, 2.5rem);
  max-width: 60rem;
  margin: 0 auto;
  padding: 0 2.5rem clamp(3rem, 6vw, 4.5rem);
}

/* `.col2-set` carries a clearfix, and in a grid container a ::before pseudo-element
 * is a GRID ITEM. It silently took the first track, pushing Login into track 2 and
 * Register into track 3 — three 341px columns with the first one empty, which read
 * as the whole form being shunted to the right of the page. */
#customer_login::before,
#customer_login::after {
  display: none;
}

#customer_login .u-column1,
#customer_login .u-column2 {
  float: none !important;
  width: auto !important;
  margin: 0;
  padding: clamp(1.5rem, 3vw, 2rem);
  border: 1px solid var(--rh-rule);
  background-color: rgba(244, 237, 224, 0.6);
}

#customer_login h2 {
  margin: 0 0 1.25rem;
  padding-bottom: 0.75rem;
  border-bottom: 1px solid rgba(232, 178, 58, 0.55);
  font-family: var(--rh-mono);
  font-size: 0.68rem;
  font-weight: 500;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--rh-sev);
}

#customer_login p {
  font-family: var(--rh-body);
  font-size: 0.95rem;
  line-height: 1.6;
  color: var(--rh-laung);
}

/* The "remember me" checkbox. Chrome paints the native glyph outside its own
 * layout box and ignores `clip`, so `appearance: none` is the only way to get rid
 * of it — the same lesson the checkout's shipping radios taught. */
.woocommerce-form__input-checkbox {
  -webkit-appearance: none !important;
  appearance: none !important;
  flex: none;
  width: 1rem;
  height: 1rem;
  margin: 0;
  border: 1px solid rgba(42, 24, 16, 0.3);
  border-radius: 2px;
  background-color: transparent;
  cursor: pointer;
}

.woocommerce-form__input-checkbox:checked {
  border-color: var(--rh-ghee);
  background-color: var(--rh-ghee);
  box-shadow: inset 0 0 0 2px var(--rh-paper);
}

.woocommerce-form__label-for-checkbox {
  display: flex !important;
  align-items: center;
  gap: 0.55rem;
  font-family: var(--rh-mono) !important;
  font-size: 0.62rem !important;
  letter-spacing: 0.14em !important;
  text-transform: uppercase !important;
  color: var(--rh-laung) !important;
  cursor: pointer;
}

.woocommerce-LostPassword {
  margin: 1rem 0 0 !important;
  font-family: var(--rh-mono) !important;
  font-size: 0.62rem !important;
  letter-spacing: 0.14em !important;
  text-transform: uppercase !important;
}

.woocommerce-LostPassword a {
  color: var(--rh-laung) !important;
  text-decoration: none;
  border-bottom: 1px solid rgba(107, 52, 16, 0.35);
}

.woocommerce-LostPassword a:hover {
  color: var(--rh-sev) !important;
}

/* --- Buttons ------------------------------------------------------------ */

/* Astra colours WooCommerce buttons from the Customizer as inline <head> CSS, so
 * an external stylesheet cannot outrank it without !important — the same
 * constraint as the nav links and the cart drawer. Gold on ink for the action
 * that moves you forward, outlined for everything secondary. */
.rh-account-page .woocommerce button.button,
.rh-account-page .woocommerce input.button,
.rh-account-page .woocommerce a.button,
.woocommerce-MyAccount-content .button,
#customer_login .button {
  display: inline-block;
  padding: 0.8rem 1.5rem !important;
  border: 1px solid var(--rh-ghee) !important;
  border-radius: 4px !important;
  background-color: var(--rh-ghee) !important;
  font-family: var(--rh-body) !important;
  font-size: 0.9rem !important;
  font-weight: 600 !important;
  letter-spacing: 0.02em !important;
  text-transform: none !important;
  color: var(--rh-ink) !important;
}

.rh-account-page .woocommerce button.button:hover,
.rh-account-page .woocommerce input.button:hover,
.rh-account-page .woocommerce a.button:hover,
.woocommerce-MyAccount-content .button:hover,
#customer_login .button:hover {
  border-color: var(--rh-sev) !important;
  background-color: var(--rh-sev) !important;
  color: var(--rh-paper) !important;
}

/* Row-level actions in the orders table, and the Resend link in a notice, are
 * secondary — they should not compete with the primary action on the screen. */
.woocommerce-orders-table__cell-order-actions .button,
.woocommerce-info .button,
.woocommerce-message .button {
  padding: 0.45rem 0.8rem !important;
  border-color: rgba(232, 178, 58, 0.6) !important;
  background-color: transparent !important;
  font-family: var(--rh-mono) !important;
  font-size: 0.6rem !important;
  letter-spacing: 0.14em !important;
  text-transform: uppercase !important;
  color: var(--rh-laung) !important;
}

.woocommerce-orders-table__cell-order-actions .button:hover,
.woocommerce-info .button:hover,
.woocommerce-message .button:hover {
  border-color: var(--rh-ghee) !important;
  background-color: rgba(232, 178, 58, 0.16) !important;
  color: var(--rh-ink) !important;
}

/* --- Account, narrow viewports ----------------------------------------- */

@media (max-width: 900px) {

  .rh-account {
    grid-template-columns: minmax(0, 1fr);
  }

  /* The nav becomes a horizontal strip of links above the content. It scrolls
   * rather than wrapping to three rows, which keeps the screen you are on and the
   * screen you want next on the same line. */
  .woocommerce-MyAccount-navigation ul {
    display: flex;
    gap: 1.25rem;
    overflow-x: auto;
    border-top: 0;
    border-bottom: 1px solid var(--rh-rule);
    -webkit-overflow-scrolling: touch;
    scrollbar-width: none;
  }

  .rh-account-page .woocommerce-MyAccount-navigation ul::-webkit-scrollbar {
    display: none;
  }

  .rh-account-page .woocommerce-MyAccount-navigation-link {
    flex: none;
    border-bottom: 0;
  }

  .rh-account-page .woocommerce-MyAccount-navigation-link a {
    white-space: nowrap;
  }

  .rh-account-page .woocommerce-MyAccount-navigation-link.is-active {
    padding-left: 0;
  }

  .rh-account-page .woocommerce-MyAccount-navigation-link.is-active::before {
    top: auto;
    right: 0;
    bottom: 0;
    left: 0;
    width: auto;
    height: 2px;
  }

  /* Orders on a phone: the stock table scrolls sideways. WooCommerce already
   * ships the data-title attributes for a stacked view, so the rows are turned
   * into labelled blocks instead. */
  .woocommerce-orders-table thead {
    display: none;
  }

  .woocommerce-orders-table,
  .woocommerce-orders-table tbody,
  .woocommerce-orders-table tr,
  .woocommerce-orders-table td {
    display: block;
    width: auto;
  }

  .woocommerce-orders-table tr {
    padding: 0.5rem 0;
    border-bottom: 1px solid var(--rh-rule);
  }

  .woocommerce-orders-table tr:last-child {
    border-bottom: 0;
  }

  .woocommerce-orders-table td {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 1rem;
    padding: 0.35rem 0.9rem;
    border-bottom: 0;
    text-align: right;
  }

  .woocommerce-orders-table td::before {
    content: attr(data-title);
    flex: none;
    font-family: var(--rh-mono);
    font-size: 0.6rem;
    letter-spacing: 0.14em;
    text-transform: uppercase;
    color: var(--rh-laung);
  }
}

@media (max-width: 780px) {

  #customer_login {
    grid-template-columns: minmax(0, 1fr);
  }
}

@media (max-width: 600px) {

  .rh-account__head,
  .rh-account,
  #customer_login {
    padding-left: 1.25rem;
    padding-right: 1.25rem;
  }
}


/* --- Saving badge -------------------------------------------------------
 * inc/woocommerce-product.php → astra_child_sale_flash(), which replaces
 * WooCommerce's "Sale!" with the computed discount ("Up to 24% off").
 *
 * Every variation in this catalogue is permanently discounted, so the badge is
 * deliberately quiet: a small gold-ruled tab in the corner of the arch, not the
 * usual filled circle. It reports a number; it does not shout.
 * ------------------------------------------------------------------------- */

.rh-flash {
  position: absolute;
  top: 0.85rem;
  left: 0.85rem;
  z-index: 2;
  padding: 0.3rem 0.6rem;
  border: 1px solid var(--rh-ghee);
  border-radius: 3px;
  background-color: var(--rh-ink);
  font-family: var(--rh-mono);
  font-size: 0.58rem;
  font-weight: 500;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  line-height: 1;
  color: var(--rh-ghee);
  white-space: nowrap;
}

/* Both frames are already `position: relative`, so the badge anchors to the arch
 * rather than to the page. Stated explicitly here so a future change to either
 * frame does not silently send the badge to the top-left corner of the viewport. */
.rh-gallery__frame,
.rh-specimen__media {
  position: relative;
}

.rh-specimen__media .rh-flash {
  top: 0.5rem;
  left: 0.5rem;
}

/* WooCommerce's own bubble, if anything ever bypasses the filter. */
.woocommerce span.onsale {
  min-height: 0;
  min-width: 0;
  padding: 0.3rem 0.6rem;
  border-radius: 3px;
  background-color: var(--rh-ink);
  font-family: var(--rh-mono);
  font-size: 0.58rem;
  letter-spacing: 0.14em;
  line-height: 1;
  color: var(--rh-ghee);
}


/* --- Product rating ------------------------------------------------------
 * woocommerce_template_single_rating, re-attached at priority 12. Core prints
 * nothing when a product has no ratings, so this only appears on the Laung Sev.
 * ------------------------------------------------------------------------- */

.single-product div.product .woocommerce-product-rating {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.5rem 0.75rem;
  margin: 0.75rem 0 0;
  line-height: 1;
}

/* Astra colours the stars from the Customizer as inline <head> CSS. */
.single-product div.product .woocommerce-product-rating .star-rating,
.single-product div.product .woocommerce-product-rating .star-rating::before {
  color: var(--rh-ghee) !important;
  font-size: 0.9em;
}

.single-product div.product .woocommerce-product-rating .woocommerce-review-link {
  font-family: var(--rh-mono);
  font-size: 0.62rem;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--rh-laung);
  text-decoration: none;
  border-bottom: 1px solid rgba(107, 52, 16, 0.35);
}

.single-product div.product .woocommerce-product-rating .woocommerce-review-link:hover {
  color: var(--rh-sev);
  border-bottom-color: var(--rh-sev);
}


/* --- Category and tags --------------------------------------------------
 * inc/woocommerce-product.php → astra_child_product_filed_under(), restoring
 * what core's removed single_meta callback used to carry.
 * ------------------------------------------------------------------------- */

.rh-filed {
  margin-top: 1.1rem;
  padding-top: 0.9rem;
  border-top: 1px solid var(--rh-rule);
}

.rh-filed__row {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 0.25rem 0.75rem;
  margin: 0 0 0.4rem;
}

.rh-filed__row:last-child {
  margin-bottom: 0;
}

.rh-filed__label {
  flex: none;
  min-width: 5rem;
  font-family: var(--rh-mono);
  font-size: 0.6rem;
  font-weight: 500;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--rh-laung);
}

.rh-filed__value,
.rh-filed__value a {
  font-family: var(--rh-body);
  font-size: 0.88rem;
  line-height: 1.45;
  color: var(--rh-ink);
}

.rh-filed__value a {
  text-decoration: underline;
  text-decoration-color: rgba(201, 118, 27, 0.45);
  text-underline-offset: 0.18em;
}

.rh-filed__value a:hover {
  color: var(--rh-sev);
}


/* --- Order confirmation: itemised receipt -------------------------------
 * woocommerce/checkout/thankyou.php. Replaced a single ledger row that listed
 * item names and quantities as one comma-joined string with no prices, no
 * shipping cost and no delivery address.
 *
 * REPALETTED 2026-08-23, the first time this page was ever loaded in a browser.
 * Every colour in this block was written for an INK panel — `--rh-paper` text,
 * `rgba(244, 237, 224, 0.14)` hairlines — and the block renders on PAPER. Subtotal,
 * shipping, the grand total and the entire delivery address were therefore drawn
 * in near-white on cream: present in the DOM, correct in the markup, and invisible
 * on the screen. The ledger in the column beside it uses `.rh-ledger--paper` and
 * had always looked right, which is what made the contrast so stark once seen.
 *
 * Everything is now ink-on-paper to match that ledger. The gold hairlines stay —
 * they read on cream — but the grand-total *label* moved off gold to
 * `--rh-laung`: 0.62rem mono in #e8b23a on #f4ede0 is not a contrast ratio, it is
 * a suggestion.
 * ------------------------------------------------------------------------- */

.rh-receipt {
  margin-top: clamp(1.5rem, 3vw, 2rem);
}

.rh-receipt__table {
  width: 100%;
  margin: 0.75rem 0 0;
  border-collapse: collapse;
  border-top: 1px solid rgba(232, 178, 58, 0.5);
}

/* `background: transparent` because a global `th` rule tints these --rh-sunk, and
 * at the column widths below that painted a grey slab down the left two-thirds of
 * the receipt with a hard vertical edge in the middle of it. The paper ledger in
 * the next column separates rows with hairlines and no fills; this now matches. */
.rh-receipt__table th,
.rh-receipt__table td {
  padding: 0.6rem 0;
  border: 0;
  border-bottom: 1px solid var(--rh-rule);
  background: transparent;
  text-align: left;
  vertical-align: baseline;
}

.rh-receipt__name {
  font-family: var(--rh-body);
  font-size: 0.95rem;
  font-weight: 600;
  color: var(--rh-ink);
}

.rh-receipt__qty {
  margin-left: 0.4rem;
  font-family: var(--rh-mono);
  font-size: 0.68rem;
  font-weight: 400;
  letter-spacing: 0.08em;
  color: var(--rh-laung);
}

/* 44%, not the `width: 1%` this had.
 *
 * A table has one set of column widths, and `1%` on the item price said "make
 * this column as narrow as its content" — 85px. The tfoot shares that column, and
 * WooCommerce's shipping value is not a price, it is
 * "₹103.36 via Shadowfax Surface (Delivery By Aug 27, 2026)". It was wrapping to
 * five lines in an 85px gutter while two-thirds of the table sat empty.
 *
 * The item price keeps `nowrap`; the tfoot is allowed to wrap, because that string
 * has to break somewhere and mid-value is better than one word per line. */
.rh-receipt__amount {
  width: 44%;
  white-space: nowrap;
  text-align: right !important;
  font-family: var(--rh-mono);
  font-size: 0.85rem;
  color: var(--rh-ink);
}

/* Variation attributes under each line. WooCommerce emits them as a <dl>. */
.rh-receipt__meta td {
  padding-top: 0;
  padding-bottom: 0.6rem;
  border-bottom: 1px solid var(--rh-rule);
}

.rh-receipt__meta dl,
.rh-receipt__meta dt,
.rh-receipt__meta dd,
.rh-receipt__meta p {
  display: inline;
  margin: 0;
  font-family: var(--rh-mono);
  font-size: 0.6rem;
  font-weight: 400;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: rgba(42, 24, 16, 0.55);
}

.rh-receipt__table tfoot th {
  font-family: var(--rh-mono);
  font-size: 0.62rem;
  font-weight: 500;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--rh-laung);
}

.rh-receipt__table tfoot td {
  text-align: right;
  white-space: normal;
  font-family: var(--rh-mono);
  font-size: 0.85rem;
  line-height: 1.5;
  color: var(--rh-ink);
}

/* WooCommerce wraps the courier name and ETA in a <small> inside the shipping
 * value. Left at the mono 0.85rem of the figure it read as part of the amount. */
.rh-receipt__table tfoot td small,
.rh-receipt__table tfoot td .woocommerce-Price-currencySymbol + small {
  display: block;
  margin-top: 0.15rem;
  font-family: var(--rh-mono);
  font-size: 0.6rem;
  letter-spacing: 0.08em;
  color: var(--rh-laung);
}

/* The grand total is the row people look for, so it gets the display face and a
 * gold rule above it. `--order_total` is WooCommerce's own array key. */
.rh-receipt__total--order_total th {
  padding-top: 0.85rem;
  border-top: 1px solid rgba(232, 178, 58, 0.5);
  color: var(--rh-laung);
}

.rh-receipt__total--order_total td {
  padding-top: 0.85rem;
  border-top: 1px solid rgba(232, 178, 58, 0.5);
  font-family: var(--rh-display);
  font-optical-sizing: auto;
  font-weight: 600;
  font-size: 1.35rem;
  letter-spacing: 0;
  color: var(--rh-ink);
}

.rh-receipt__total:last-child th,
.rh-receipt__total:last-child td {
  border-bottom: 0;
}

.rh-receipt__address {
  margin-top: clamp(1.25rem, 3vw, 1.75rem);
  padding-top: 1rem;
  border-top: 1px solid var(--rh-rule);
}

/* The wrapper carries `woocommerce-customer-details` for plugin compatibility,
 * which pulls in WooCommerce's own `address` styling: a 1px rounded box with its
 * own padding. That box wrapped the street lines only, so the phone — which the
 * template prints inside the same block, correctly — rendered visibly *outside*
 * the box, looking detached from the address it belongs to.
 *
 * The box goes rather than the phone moving into it. Nothing else on this page is
 * boxed: the receipt ledger, the itemised table and the step timeline all separate
 * content with hairlines, and a rounded card here was WooCommerce's default
 * showing through, not a decision.
 *
 * The doubled selector is the specificity tax again: WooCommerce writes
 * `.woocommerce .woocommerce-customer-details address` at (0,2,1), so the plain
 * `.rh-receipt__address address` at (0,1,1) lost and the box stayed. */
.rh-receipt__address address,
.woocommerce .rh-receipt__address.woocommerce-customer-details address {
  margin: 0.5rem 0 0;
  padding: 0;
  border: 0;
  border-radius: 0;
  font-family: var(--rh-body);
  font-size: 0.95rem;
  font-style: normal;
  line-height: 1.6;
  color: var(--rh-ink);
}

.rh-receipt__phone {
  margin: 0.4rem 0 0;
  font-family: var(--rh-mono);
  font-size: 0.7rem;
  letter-spacing: 0.08em;
  color: var(--rh-laung);
}


/* --- Order confirmation: email verification -----------------------------
 * woocommerce/checkout/form-verify-email.php.
 *
 * WooCommerce shows this instead of the receipt whenever it cannot identify the
 * customer, which is the normal case for a guest opening the link from their
 * confirmation email on a different device. It was rendering as a bare Astra form.
 * ------------------------------------------------------------------------- */

.rh-verify {
  max-width: 34rem;
  margin: 0 auto;
  padding: clamp(2.25rem, 5vw, 3.5rem) 1.5rem clamp(3rem, 6vw, 4.5rem);
}

.rh-verify__kind {
  margin: 0;
  font-family: var(--rh-mono);
  font-size: 0.66rem;
  font-weight: 500;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: var(--rh-sev);
}

.rh-verify__title {
  margin: 0.75rem 0 0;
  font-family: var(--rh-display);
  font-optical-sizing: auto;
  font-weight: 600;
  font-size: clamp(1.9rem, 4vw, 2.5rem);
  line-height: 1.04;
  letter-spacing: -0.025em;
  color: var(--rh-ink);
}

.rh-verify__note {
  margin: 0.9rem 0 0;
  font-family: var(--rh-body);
  font-size: 1rem;
  line-height: 1.6;
  color: var(--rh-laung);
  text-wrap: pretty;
}

.rh-verify__form {
  margin-top: clamp(1.5rem, 4vw, 2rem);
  padding-top: clamp(1.25rem, 3vw, 1.75rem);
  border-top: 1px solid var(--rh-rule);
}

.rh-verify__row label {
  display: block;
  margin-bottom: 0.4rem;
  font-family: var(--rh-mono);
  font-size: 0.62rem;
  font-weight: 500;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--rh-laung);
}

.rh-verify__row .required {
  color: var(--rh-sev);
}

.rh-verify__row input[type="email"] {
  width: 100%;
  padding: 0.8rem 0.9rem;
  border: 1px solid var(--rh-rule);
  border-radius: 3px;
  background-color: rgba(244, 237, 224, 0.6);
  font-family: var(--rh-body);
  font-size: 0.98rem;
  color: var(--rh-ink);
}

.rh-verify__row input[type="email"]:focus {
  outline: 0;
  border-color: var(--rh-ghee);
}

.rh-verify__actions {
  margin: 1.1rem 0 0 !important;
}

.rh-verify__actions button {
  width: 100%;
  text-align: center;
}

.rh-verify__alt {
  margin: 1.25rem 0 0;
  font-family: var(--rh-body);
  font-size: 0.9rem;
  color: var(--rh-laung);
}

.rh-verify__alt a {
  color: var(--rh-ink);
  text-decoration: underline;
  text-decoration-color: rgba(201, 118, 27, 0.5);
  text-underline-offset: 0.18em;
}

.rh-verify__alt a:hover {
  color: var(--rh-sev);
}

/* The verification screen renders inside the checkout page, which Astra puts in a
 * boxed container. Same treatment as the editorial templates. */
body.woocommerce-order-received .ast-separate-container #content .ast-container:has(.rh-verify) {
  max-width: none;
  padding: 0;
}

body.woocommerce-order-received:has(.rh-verify) {
  background-color: var(--rh-paper);
}


/* ==========================================================================
   Mobile menu drawer (Astra's off-canvas popup)
   ==========================================================================
 * Markup: Astra_Builder_UI_Controller's mobile-popup output — `#ast-mobile-popup`
 * with an overlay, a close button, the header search form and the mobile menu.
 * Like the cart flyout it is not a template, so it can only be restyled.
 *
 * It was arriving completely undesigned, and it is the *entire* navigation on a
 * phone: a white panel, a stock search box with a magnifier glyph, and the menu
 * links on a solid #f0a500 block — the last of the old orange, and the loudest
 * surface anywhere on the site.
 *
 * Treated as the same ink object as the cart drawer, so the two panels that slide
 * in from the right read as one family.
 * ========================================================================== */

.ast-mobile-popup-overlay {
  background-color: rgba(15, 12, 10, 0.55) !important;
}

.ast-mobile-popup-drawer .ast-mobile-popup-inner {
  background-color: var(--rh-ink) !important;
  background-image: var(--rh-grain);
  background-repeat: repeat;
  color: var(--rh-paper);
  box-shadow: none;
}

/* --- Close --------------------------------------------------------------- */

.ast-mobile-popup-drawer .ast-mobile-popup-header {
  justify-content: flex-end;
  padding: 1rem 1.25rem;
  border-bottom: 1px solid rgba(232, 178, 58, 0.4);
  background-color: transparent !important;
  min-height: 0;
}

/* Astra leaves this button at `align-items: normal` with 14.4px of padding and
 * wraps the glyph in a `svg-baseline` span, so the cross landed 5px right and 9px
 * below the centre of its gold box. Same shape of problem as the hamburger
 * trigger above: centre the button as a flex box and stop the inner spans from
 * sitting on a text baseline. */
.ast-mobile-popup-drawer .menu-toggle-close {
  display: flex !important;
  align-items: center;
  justify-content: center;
  width: 2.75rem;
  height: 2.75rem;
  padding: 0 !important;
  border: 1px solid rgba(232, 178, 58, 0.45) !important;
  border-radius: 4px !important;
  background-color: transparent !important;
  color: var(--rh-ghee) !important;
  line-height: 1 !important;
}

.ast-mobile-popup-drawer .menu-toggle-close .ast-svg-iconset,
.ast-mobile-popup-drawer .menu-toggle-close .ahfb-svg-iconset {
  display: flex;
  align-items: center;
  justify-content: center;
  vertical-align: middle;
  line-height: 1;
}

.ast-mobile-popup-drawer .menu-toggle-close .ast-close-svg,
.ast-mobile-popup-drawer .menu-toggle-close svg {
  display: block;
  width: 1.125rem;
  height: 1.125rem;
  fill: var(--rh-ghee);
}

.ast-mobile-popup-drawer .ast-mobile-popup-content {
  padding: 1.25rem 1.25rem 2rem;
}

/* --- Search ------------------------------------------------------------- */

/* Astra ships both a visible field and a magnifier that toggles the same field.
 * With the field already open the icon is a control that does nothing, so it is
 * removed rather than styled. */
.ast-mobile-popup-content .ast-search-icon {
  display: none !important;
}

.ast-mobile-popup-content .ast-header-search {
  width: 100%;
  margin-bottom: 1.5rem;
}

.ast-mobile-popup-content .ast-search-menu-icon,
.ast-mobile-popup-content .ast-search-menu-icon.slide-search {
  position: static !important;
  width: 100%;
  height: auto;
  padding: 0 !important;
  border: 0;
  background: transparent !important;
  opacity: 1 !important;
  visibility: visible !important;
  transform: none !important;
}

.ast-mobile-popup-content .search-form {
  position: relative;
  display: block;
  width: 100%;
  padding: 0 !important;
  background: transparent !important;
}

.ast-mobile-popup-content .search-form label {
  display: block;
  width: 100%;
  margin: 0;
}

.ast-mobile-popup-content .search-field,
.ast-mobile-popup-content input.search-field {
  width: 100% !important;
  padding: 0.8rem 2.75rem 0.8rem 0.9rem !important;
  border: 1px solid rgba(232, 178, 58, 0.4) !important;
  border-radius: 4px !important;
  background-color: rgba(244, 237, 224, 0.06) !important;
  font-family: var(--rh-body);
  font-size: 0.95rem;
  color: var(--rh-paper) !important;
}

.ast-mobile-popup-content .search-field::placeholder {
  font-family: var(--rh-mono);
  font-size: 0.72rem;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: rgba(244, 237, 224, 0.45);
}

.ast-mobile-popup-content .search-field:focus {
  outline: 0;
  border-color: var(--rh-ghee) !important;
}

/* The magnifier was rendering half outside the field, clipped away to a sliver.
 *
 * Astra pins this button with `top: 0; right: 0; bottom: 0` at a specificity this
 * file was not matching, so `top: 50%` never applied — but `transform:
 * translateY(-50%)` did, lifting the full-height button 23.5px above the form.
 * `.search-form` carries `overflow: hidden`, so the part that escaped was cropped
 * and what stayed inside was the empty bottom half of the button.
 *
 * Fixed by working *with* Astra's offsets instead of against them: keep the
 * button stretched top-to-bottom, drop the transform, and centre the glyph with
 * flexbox. `overflow: visible` on the form is belt-and-braces — nothing should
 * escape now, but a clipped control is a silent failure and this makes it a
 * visible one. */
.ast-mobile-popup-content .search-form {
  overflow: visible !important;
}

.ast-mobile-popup-content .search-submit,
.ast-mobile-popup-content .search-form button.search-submit {
  position: absolute !important;
  top: 0 !important;
  right: 0 !important;
  bottom: 0 !important;
  left: auto !important;
  transform: none !important;
  display: flex !important;
  align-items: center;
  justify-content: center;
  width: 2.75rem !important;
  height: auto !important;
  min-height: 0 !important;
  padding: 0 !important;
  border: 0 !important;
  border-radius: 0 4px 4px 0 !important;
  background: transparent !important;
  color: var(--rh-ghee) !important;
  line-height: 1 !important;
}

/* Astra renders the glyph as an icon font (`.ast-icon`), not an <svg>, so sizing
 * it means font-size. The svg rule is kept for the builds that do emit one. */
.ast-mobile-popup-content .search-submit .ast-icon,
.ast-mobile-popup-content .search-submit .ast-icon svg,
.ast-mobile-popup-content .search-submit svg {
  display: block;
  width: 1rem;
  height: 1rem;
  font-size: 1rem;
  line-height: 1;
  fill: var(--rh-ghee);
  color: var(--rh-ghee);
}

/* --- Navigation --------------------------------------------------------- */

/* The orange block. Astra colours the mobile menu from the Customizer as inline
 * <head> CSS, so every colour here needs !important — the same constraint as the
 * desktop nav links and the cart drawer buttons. */
.ast-mobile-popup-content .main-header-bar-navigation,
.ast-mobile-popup-content .main-navigation,
.ast-mobile-popup-content #ast-hf-mobile-menu,
.ast-mobile-popup-content .ast-nav-menu {
  background-color: transparent !important;
  background-image: none !important;
}

.ast-mobile-popup-content #ast-hf-mobile-menu {
  margin: 0;
  padding: 0;
  border-top: 1px solid rgba(244, 237, 224, 0.14);
  list-style: none;
}

.ast-mobile-popup-content #ast-hf-mobile-menu > li {
  margin: 0;
  border-bottom: 1px solid rgba(244, 237, 224, 0.14);
  background-color: transparent !important;
}

/* Rows tall enough to hit: 3.25rem against the 13px targets the audit found
 * elsewhere on mobile. */
.ast-mobile-popup-content #ast-hf-mobile-menu .menu-link,
.ast-mobile-popup-content #ast-hf-mobile-menu > li > a {
  display: flex;
  align-items: center;
  min-height: 3.25rem;
  padding: 0.5rem 0 !important;
  border: 0 !important;
  background-color: transparent !important;
  font-family: var(--rh-display);
  font-optical-sizing: auto;
  font-weight: 600;
  font-size: 1.375rem;
  line-height: 1.15;
  letter-spacing: -0.01em;
  color: var(--rh-paper) !important;
}

.ast-mobile-popup-content #ast-hf-mobile-menu .menu-link:hover,
.ast-mobile-popup-content #ast-hf-mobile-menu .menu-link:focus-visible {
  color: var(--rh-ghee) !important;
}

/* The page you are on, marked with a gold rule in the gutter — the same device as
 * the account navigation, and it survives a label wrapping to two lines. */
.ast-mobile-popup-content #ast-hf-mobile-menu > li.current-menu-item,
.ast-mobile-popup-content #ast-hf-mobile-menu > li.current_page_item {
  position: relative;
  padding-left: 0.85rem;
}

.ast-mobile-popup-content #ast-hf-mobile-menu > li.current-menu-item::before,
.ast-mobile-popup-content #ast-hf-mobile-menu > li.current_page_item::before {
  content: "";
  position: absolute;
  top: 0.85rem;
  bottom: 0.85rem;
  left: 0;
  width: 2px;
  background-color: var(--rh-ghee);
}

.ast-mobile-popup-content #ast-hf-mobile-menu > li.current-menu-item > .menu-link,
.ast-mobile-popup-content #ast-hf-mobile-menu > li.current_page_item > .menu-link {
  color: var(--rh-ghee) !important;
}

/* Submenus, if a dropdown is ever added to the menu. */
.ast-mobile-popup-content #ast-hf-mobile-menu .sub-menu {
  margin: 0 0 0.5rem;
  padding: 0 0 0 0.85rem;
  border-left: 1px solid rgba(232, 178, 58, 0.3);
  list-style: none;
  background-color: transparent !important;
}

.ast-mobile-popup-content #ast-hf-mobile-menu .sub-menu li {
  border: 0;
}

.ast-mobile-popup-content #ast-hf-mobile-menu .sub-menu .menu-link {
  min-height: 2.75rem;
  font-family: var(--rh-body);
  font-size: 1rem;
  font-weight: 500;
  color: rgba(244, 237, 224, 0.8) !important;
}

/* Astra's dropdown chevron. */
.ast-mobile-popup-content .ast-menu-toggle {
  color: var(--rh-ghee) !important;
  background-color: transparent !important;
}


/* ==========================================================================
   Cart flyout (Astra's slide-in drawer)
   ==========================================================================
 * Markup: Astra_Builder_UI_Controller::render_mobile_cart_flyout_markup(), which
 * hangs off `astra_footer` and drops WooCommerce's WC_Widget_Cart inside a
 * `.astra-cart-drawer`. It is not a template, so it can only be restyled — and it
 * was arriving completely undesigned: a white panel with two orange buttons, which
 * is the first thing anyone sees after adding to cart.
 *
 * Treated as a small ink version of the cart summary, so the drawer, the cart page
 * and the checkout review all read as the same object.
 */

.astra-cart-drawer {
  background-color: var(--rh-ink) !important;
  background-image: var(--rh-grain);
  background-repeat: repeat;
  color: var(--rh-paper);
}

.astra-cart-drawer-header {
  padding: 1.1rem 1.25rem;
  border-bottom: 1px solid rgba(232, 178, 58, 0.4) !important;
  background-color: transparent !important;
}

/* !important on the colour: Astra sets the drawer title and the widget's own text
 * from the Customizer as inline head CSS, which an external stylesheet cannot
 * outrank — the heading was rendering barely legible against the ink. */
.astra-cart-drawer-title {
  font-family: var(--rh-mono);
  font-size: 0.66rem;
  font-weight: 500;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--rh-ghee) !important;
}

.astra-cart-drawer-close {
  border: 1px solid rgba(232, 178, 58, 0.4) !important;
  border-radius: 4px !important;
  background-color: transparent !important;
}

.astra-cart-drawer-close svg,
.astra-cart-drawer-close .ast-close-svg {
  fill: var(--rh-ghee);
}

.astra-cart-drawer-content {
  padding: 1.25rem;
}

/* --- The WooCommerce cart widget inside it ------------------------------ */

.astra-cart-drawer .widget_shopping_cart_content {
  color: var(--rh-paper);
}

.astra-cart-drawer .woocommerce-mini-cart {
  margin: 0;
  padding: 0;
  list-style: none;
}

/* The item row.
 *
 * WooCommerce's mini-cart markup nests the thumbnail INSIDE the product link:
 *
 *   <li>  <a class="remove">x</a>
 *         <a href="..."><img> Product name</a>
 *         <dl class="variation">  <span class="quantity">1 x price</span>  </li>
 *
 * A first attempt placed the <img> with grid-column, but the img is not a child of
 * the <li> — so it was not a grid item, and `width: 100%` made it fill the link's
 * whole column as a squashed full-width band with the name hidden behind it.
 *
 * So the <li> lays out content vs remove, and the LINK is itself a grid holding the
 * thumbnail and the name. The variation and quantity lines are indented to sit
 * under the name rather than under the thumbnail. */
.astra-cart-drawer .woocommerce-mini-cart-item {
  position: relative;
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: start;
  gap: 0.35rem 0.75rem;
  margin: 0;
  /* Left padding clears the absolutely positioned thumbnail. */
  padding: 0.875rem 0 0.875rem 4.125rem !important;
  border-bottom: 1px solid rgba(244, 237, 224, 0.1) !important;
}

/* The thumbnail is ABSOLUTELY POSITIONED against the row. Fourth approach, and the
 * previous three are recorded because each failed for a different reason:
 *
 * WooCommerce's markup is `<a> 
 <img> Product name&nbsp; </a>` — a whitespace text
 * node, the image, then the name ending in a non-breaking space.
 *
 *   grid  → the stray text run took column 1 and pushed the image and the name onto
 *           separate rows; the link rendered 94px tall with the name split above and
 *           below the thumbnail.
 *   float → took the image out of flow, so it escaped the one-line link box and
 *           overlapped the first characters of the name.
 *   flex  → `display: flex` on the <a> never took effect (the link stayed 19px tall
 *           against a 52px image), so the image overflowed and overlapped the name
 *           again.
 *
 * Absolute positioning does not depend on winning a display-property fight: the row
 * is the containing block, the image is pinned to its left, and the row is padded to
 * clear it. The text then simply flows in the remaining space regardless of how many
 * stray nodes the widget emits. */
.astra-cart-drawer .woocommerce-mini-cart-item a:not(.remove) {
  display: block;
  font-family: var(--rh-body);
  font-size: 0.9rem;
  font-weight: 600;
  line-height: 1.35;
  color: var(--rh-paper) !important;
  text-decoration: none;
}

.astra-cart-drawer .woocommerce-mini-cart-item a:not(.remove):hover {
  color: var(--rh-ghee) !important;
}

.astra-cart-drawer .woocommerce-mini-cart-item img {
  position: absolute !important;
  /* Centred against the row rather than pinned to its top: the text block is the
   * name plus a variation and a quantity line, so a top-aligned 52px thumbnail sat
   * visibly higher than the words it belongs to. */
  top: 50% !important;
  left: 0 !important;
  transform: translateY(-50%);
  width: 3.25rem !important;
  height: auto !important;
  margin: 0 !important;
  float: none !important;
  border-radius: 50% 50% 3px 3px / 38% 38% 3px 3px;
  background-color: rgba(244, 237, 224, 0.06);
}

/* Astra draws a circular loading spinner as `a.remove::before` with
 * `border-radius: 100%`. Unconstrained in this drawer it rendered as a large
 * ellipse around the whole row — the stray oval that was reported. It is only ever
 * visible mid-AJAX, so suppressing it costs nothing here. */
.astra-cart-drawer .woocommerce-mini-cart-item a.remove::before,
.astra-cart-drawer .woocommerce-mini-cart-item a.remove::after {
  content: none !important;
  display: none !important;
}

/* Sits under the name, indented past the thumbnail. */
.astra-cart-drawer .woocommerce-mini-cart-item .variation,
.astra-cart-drawer .woocommerce-mini-cart-item .quantity {
  display: block;
  grid-column: 1;
  padding-left: 0;
}

/* The row has to contain its float, or the thumbnail overhangs the next item. */
.astra-cart-drawer .woocommerce-mini-cart-item::after {
  content: "";
  display: table;
  clear: both;
}

.astra-cart-drawer .woocommerce-mini-cart-item .quantity {
  font-family: var(--rh-mono);
  font-size: 0.78rem;
  color: rgba(244, 237, 224, 0.6);
}

.astra-cart-drawer .woocommerce-mini-cart-item .quantity .amount {
  color: rgba(244, 237, 224, 0.6);
}

.astra-cart-drawer .woocommerce-mini-cart-item .variation {
  margin: 0;
  font-family: var(--rh-mono);
  font-size: 0.6rem;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: rgba(244, 237, 224, 0.42);
}

.astra-cart-drawer .woocommerce-mini-cart-item .variation dt,
.astra-cart-drawer .woocommerce-mini-cart-item .variation dd {
  display: inline;
  margin: 0;
  font-weight: 400;
}

/* Astra renders the remove control as a circular icon button; here it is a small
 * gold cross in its own column. `position: static` undoes WooCommerce's
 * `a.remove { position: absolute; top: 0; left: 0 }`, which would otherwise pin it
 * over the thumbnail. */
.astra-cart-drawer .woocommerce-mini-cart-item a.remove {
  grid-column: 2;
  grid-row: 1;
  position: static !important;
  width: 1.5rem !important;
  height: 1.5rem !important;
  line-height: 1.4rem !important;
  border: 1px solid rgba(232, 178, 58, 0.35) !important;
  border-radius: 4px !important;
  background-color: transparent !important;
  font-size: 0.9rem !important;
  color: var(--rh-ghee) !important;
  text-align: center;
}

.astra-cart-drawer .woocommerce-mini-cart-item a.remove:hover {
  background-color: rgba(232, 178, 58, 0.16) !important;
  color: var(--rh-ghee) !important;
}

/* --- Subtotal and buttons ---------------------------------------------- */

.astra-cart-drawer .woocommerce-mini-cart__total {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 1rem;
  margin: 0;
  padding: 1rem 0 !important;
  border-top: 1px solid rgba(232, 178, 58, 0.4) !important;
  border-bottom: 0 !important;
  font-family: var(--rh-mono);
  font-size: 0.66rem;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--rh-ghee) !important;
}

.astra-cart-drawer .woocommerce-mini-cart__total strong {
  font-weight: 400;
}

.astra-cart-drawer .woocommerce-mini-cart__total .amount,
.astra-cart-drawer .woocommerce-mini-cart__total .woocommerce-Price-amount {
  font-family: var(--rh-display);
  font-optical-sizing: auto;
  font-weight: 600;
  font-size: 1.5rem;
  letter-spacing: 0;
  text-transform: none;
  color: var(--rh-paper);
}

.astra-cart-drawer .woocommerce-mini-cart__buttons {
  display: flex;
  flex-direction: column;
  gap: 0.55rem;
  margin: 0.5rem 0 0;
  padding: 0;
}

/* Astra colours these from the Customizer as inline head CSS — the same
 * constraint as the nav links, hence !important. Checkout is the gold primary;
 * View cart is the outlined secondary, because the drawer already shows the
 * contents and the goal is to move forward. */
.astra-cart-drawer .woocommerce-mini-cart__buttons a.button {
  display: block;
  width: 100%;
  margin: 0;
  padding: 0.85rem 1.25rem;
  border: 1px solid rgba(232, 178, 58, 0.45) !important;
  border-radius: 4px !important;
  background-color: transparent !important;
  font-family: var(--rh-body);
  font-size: 0.9rem;
  font-weight: 600;
  letter-spacing: 0.03em;
  text-align: center;
  text-transform: none !important;
  color: var(--rh-ghee) !important;
}

.astra-cart-drawer .woocommerce-mini-cart__buttons a.button:hover {
  background-color: rgba(232, 178, 58, 0.14) !important;
  border-color: var(--rh-ghee) !important;
}

.astra-cart-drawer .woocommerce-mini-cart__buttons a.button.checkout {
  border-color: var(--rh-ghee) !important;
  background-color: var(--rh-ghee) !important;
  color: var(--rh-ink) !important;
}

.astra-cart-drawer .woocommerce-mini-cart__buttons a.button.checkout:hover {
  background-color: var(--rh-sev) !important;
  border-color: var(--rh-sev) !important;
  color: var(--rh-paper) !important;
}

.astra-cart-drawer .woocommerce-mini-cart__empty-message {
  font-family: var(--rh-body);
  font-size: 0.95rem;
  color: rgba(244, 237, 224, 0.6);
}

.astra-mobile-cart-overlay {
  background-color: rgba(15, 12, 10, 0.55) !important;
}


/* ==========================================================================
   Responsive / mobile overrides
   ========================================================================== */
