/*
Theme Name: Organio Child
Theme URI: http://demo.casethemes.net/organio/
Author: Case-Themes
Author URI: https://themeforest.net/user/case-themes/portfolio/
Description: Nirsha child theme (based on Organio parent). Custom design system for the Nirsha premium food e-commerce brand — dry fruits, spices, sweets, namkeen and healthy products.
Version: 10.0.0
License: ThemeForest
License URI: https://themeforest.net/licenses
Template: organio
Text Domain: organio-child
Tags: organic, food, woocommerce
*/

/* ═══════════════════════════════════════════════════════════════════════════
   NIRSHA CHILD THEME — v10.2.0 (Phase 11.2 Full-Width Responsive Content System)
   ---------------------------------------------------------------------------
   Layer order (loaded once, cascading):
     1. Design tokens (colors, type, spacing)
     2. Global overrides (primary color, links, header, mobile menu)
     3. Announcement bar
     4. Homepage sections (.nrs-*) — Phase 9 blueprint
     5. WooCommerce product loop (shop/archive) — kept from previous phases
     6. Single product + related products — kept from previous phases
     7. Currency switcher header polish
     8. Footer polish
     9. Safety nets (mobile ATC, horizontal overflow, breadcrumb icon)
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── 1. DESIGN TOKENS ────────────────────────────────────────────────────── */
:root {
    /* ═══ NIRSHA PREMIUM PALETTE — Warm Ivory × Deep Cocoa × Antique Gold ═══
       The single authoritative colour source for the whole site. Nothing below
       this block, and nothing in nirsha-pages.css, functions.php or the Nirsha
       plugins, introduces a brand hex of its own — they all resolve here, so a
       future brand change is a dozen lines in ONE file.

       Distribution target: ~70% warm neutrals, ~20% cocoa/espresso, ~10% gold.
       The interface FRAMES the product photography; it never competes with it.

       ROLES ARE PART OF THE TOKEN. Two rules matter and are enforced below:
         · Antique Gold (#B8893B) measures 2.6–3.1:1 on the light surfaces, so
           it is DECORATION, dark-surface text, and button FILL only — never
           small text on ivory/sand/card. `--nirsha-gold-ink` is the readable
           gold for text on light (4.9:1). This is a role change, not a palette
           change: the approved gold is still the gold you see.
         · Green is NO LONGER a brand colour. It survives only as the semantic
           success/in-stock token, and as the FSSAI veg mark in the compliance
           plugin (a regulated symbol — see nirsha-commerce/food-info.css). */

    /* Brand — cocoa & gold */
    --nirsha-cocoa:       #3B241B;  /* primary: CTAs, dark brand surfaces      */
    --nirsha-cocoa-dark:  #2B1913;  /* pressed / deepest cocoa                 */
    --nirsha-gold:        #B8893B;  /* accent: decoration, fills, dark-bg text */
    --nirsha-gold-dark:   #956D2E;  /* gold hover; large glyphs on light 3.8:1 */
    --nirsha-gold-ink:    #8C6529;  /* gold-toned TEXT on light — 4.9:1 on ivory*/
    /* Gold small text on the LIFTED surfaces inside a cocoa band (the Special
       Selection cards sit on rgba(ivory,.05) over cocoa = rgb(69,47,38), where
       #B8893B measures only 3.96:1). Same hue, one step up. */
    --nirsha-gold-light:  #C69A4E;
    --nirsha-espresso:    #201713;  /* headings, footer, deep photographic band */

    /* Ink */
    --nirsha-text:        #675A50;  /* body copy — 6.2:1 on ivory              */
    --nirsha-muted:       #8B7B6D;  /* de-emphasis w/ a non-colour cue (3.8:1) */
    /* Secondary copy. Chosen against the WORST ground it lands on, Soft Sand
       (4.61:1), not the best one — at #7D6D60 the trust-strip descriptions
       measured 4.09:1 on sand and failed. */
    --nirsha-muted-ink:   #756557;  /* 5.23 ivory · 4.61 sand · 5.50 card */

    /* Surfaces */
    --nirsha-ivory:       #FBF7EF;  /* dominant site ground                    */
    --nirsha-sand:        #F2E8D8;  /* alternate band — rhythm, not everywhere  */
    --nirsha-card:        #FFFDF8;  /* cards, product surfaces, header          */
    --nirsha-border:      #E8DDCD;  /* borders & dividers                      */

    /* Semantic — deliberately NOT brand colours */
    --nirsha-success:     #557A46;  /* success · in stock · confirmed          */
    --nirsha-success-ink: #48663B;  /* success text on a success tint          */
    --nirsha-success-bg:  #EDF3E9;
    --nirsha-error:       #A63D32;  /* validation failure · destructive        */
    --nirsha-error-bg:    #FBF0EE;
    --nirsha-warning:     #9A6B1E;  /* restrained warm amber — genuine warnings */
    --nirsha-warning-bg:  #FBF3E4;

    /* ── Legacy surface aliases ──────────────────────────────────────────────
       Kept so the 4,000 lines below did not have to be rewritten by hand; each
       now points at its NEW role. The old green/sage names are gone entirely so
       nothing can resolve to a green by accident. */
    --nirsha-bg-main:    var(--nirsha-ivory);
    --nirsha-surface:    var(--nirsha-card);
    --nirsha-cream:      var(--nirsha-sand);   /* deepest warm band (Combo)     */
    --nirsha-cream-soft: var(--nirsha-ivory);  /* Shop by Category              */
    --nirsha-forest:     var(--nirsha-espresso);
    --nirsha-charcoal:   var(--nirsha-espresso);

    /* Brand aliases — every one of these now resolves to cocoa/gold */
    --nrs-brand:        var(--nirsha-cocoa);
    --nrs-brand-dark:   var(--nirsha-cocoa-dark);
    --nrs-brand-deep:   var(--nirsha-cocoa);
    --nrs-brand-tint:   var(--nirsha-sand);   /* soft warm tint behind glyphs   */
    --nrs-accent:       var(--nirsha-gold);

    /* Primary action — one place to change every CTA on the site.
       Cocoa fill / ivory label at rest; gold fill / espresso label on hover. */
    --nrs-cta-bg:        var(--nirsha-cocoa);
    --nrs-cta-ink:       var(--nirsha-ivory);
    --nrs-cta-bg-hover:  var(--nirsha-gold);
    --nrs-cta-ink-hover: var(--nirsha-espresso);
    /* Focus: cocoa on light surfaces (13.5:1); dark bands override to gold. */
    --nrs-focus:        var(--nirsha-cocoa);

    /* Neutrals — warm bias, chosen not defaulted */
    --nrs-ink:          var(--nirsha-espresso);
    --nrs-ink-2:        var(--nirsha-text);
    --nrs-muted:        var(--nirsha-muted-ink);
    --nrs-line:         var(--nirsha-border);
    --nrs-line-2:       #F0E7DA;              /* one step softer than --nrs-line */
    --nrs-cream:        var(--nirsha-ivory);
    --nrs-cream-2:      var(--nirsha-sand);
    --nrs-white:        var(--nirsha-card);
    --nrs-shadow:       0 6px 24px rgba(59, 36, 27, 0.07);
    --nrs-shadow-lg:    0 12px 42px rgba(32, 23, 19, 0.12);

    /* Legacy hooks used elsewhere in the parent theme */
    --primary-color:    var(--nirsha-cocoa);
    --link-color:       var(--nirsha-cocoa);

    /* Type & rhythm
       NOTE: only faces the site actually enqueues may appear first here.
       'Fraunces' was previously first but is never loaded by the theme, so every
       display heading silently fell back to the theme's Lora !important rule.
       Playfair Display IS enqueued by Organio and is the intended display face. */
    --nrs-font-body:    'Poppins', 'Barlow', sans-serif;
    --nrs-font-display: 'Playfair Display', 'Lora', Georgia, serif;
    --nrs-radius:       12px;
    --nrs-radius-sm:    8px;
    --nrs-radius-lg:    20px;
    --nrs-section-y:    88px;
}

/* ── 2. GLOBAL OVERRIDES ─────────────────────────────────────────────────── */
.ct-cursor--follower { background-color: rgba(59, 36, 27, 0.20) !important; }
/* Body links read cocoa and warm to gold on hover. Gold-INK, not gold: plain
   #B8893B is 2.9:1 on ivory and would make every hovered link unreadable. */
a:hover { color: var(--nirsha-gold-ink); }

/* Site ground. Organio leaves <body> at #fff, so every Elementor section that
   declares no background of its own rendered pure white — the real cause of the
   white/white/cream/white rhythm. Set once, here. */
body { background-color: var(--nirsha-bg-main); }
/* The header surface is set in functions.php (nirsha-header-polish), the only
   place that can beat Organio own !important rule. Not duplicated here —
   one background, one owner. */

@media screen and (min-width: 1200px) {
    #ct-header-wrap.ct-header-layout10 .ct-header-branding {
        margin-top: 6px; margin-bottom: 6px;
    }
    #ct-header-wrap.ct-header-layout10 .ct-header-main .ct-main-menu > li > a {
        line-height: 52px;
        font-weight: 600;
        letter-spacing: 0.01em;
    }
    /* Underline indicator for active + hover */
    #ct-header-wrap.ct-header-layout10 .ct-main-menu > li > a::after {
        content: ""; position: absolute; left: 12px; right: 12px; bottom: 12px;
        height: 2px; background: var(--nirsha-gold);
        transform: scaleX(0); transform-origin: left center;
        transition: transform .22s ease;
    }
    #ct-header-wrap.ct-header-layout10 .ct-main-menu > li > a { position: relative; }
    #ct-header-wrap.ct-header-layout10 .ct-main-menu > li:hover > a::after,
    #ct-header-wrap.ct-header-layout10 .ct-main-menu > li.current-menu-item > a::after,
    #ct-header-wrap.ct-header-layout10 .ct-main-menu > li.current-menu-parent > a::after {
        transform: scaleX(1);
    }
}
#ct-header-wrap.ct-header-layout10 .ct-main-menu > li.current-menu-item > a,
#ct-header-wrap.ct-header-layout10 .ct-main-menu > li.current-menu-parent > a {
    color: var(--nirsha-cocoa) !important;
}
@media (max-width: 991px) { #ct-menu-mobile { display: flex !important; } }

/* ── 3. ANNOUNCEMENT BAR — premium rotating (2026, pure CSS @keyframes) ──── */
/*
 * Strategy: pure CSS animation — works in foreground AND background tabs.
 * 4 messages × 5 s each = 20 s total cycle.
 * Keyframe: visible 0-25 % of cycle; hidden 25-100 %.
 * Negative delay on msg[0] makes it instantly visible at page load.
 * JS is only used for aria-hidden toggling (no timer-sensitive logic).
 */
@keyframes nrs-annb-rotate {
    0%              { opacity: 0; transform: translateY(8px); }
    2%              { opacity: 1; transform: translateY(0);   }
    23%             { opacity: 1; transform: translateY(0);   }
    25%             { opacity: 0; transform: translateY(-8px);}
    25.5%, 100%     { opacity: 0; transform: translateY(8px); }
}

.nrs-annb {
    background: var(--nirsha-espresso);
    color: rgba(251, 247, 239, 0.82);
    font-family: var(--nrs-font-body);
    font-size: 11px;
    letter-spacing: 0.14em;
    text-transform: uppercase;
    line-height: 1;
    height: 34px;
    display: flex;
    align-items: center;
    justify-content: center;
    overflow: hidden;
    position: relative;
    z-index: 1200;
    width: 100%;
}
.nrs-annb__msg {
    position: absolute;
    inset: 0;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 10px;
    padding: 0 20px;
    opacity: 0;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    /* animation: each msg plays a 20 s cycle; staggered by 5 s each */
    animation: nrs-annb-rotate 20000ms ease-in-out infinite;
}
/* Stagger: -400ms offset makes msg[0] appear at 2 % (fully visible) at page load */
.nrs-annb__msg:nth-child(1) { animation-delay:    -400ms; }
.nrs-annb__msg:nth-child(2) { animation-delay:   4600ms; }
.nrs-annb__msg:nth-child(3) { animation-delay:   9600ms; }
.nrs-annb__msg:nth-child(4) { animation-delay:  14600ms; }

.nrs-annb__dot {
    width: 4px;
    height: 4px;
    border-radius: 50%;
    background: var(--nirsha-gold);
    display: inline-block;
    flex-shrink: 0;
    opacity: 0.9;
}
@media (max-width: 767px) {
    .nrs-annb { font-size: 10px; height: 32px; letter-spacing: 0.09em; }
    .nrs-annb__msg { gap: 8px; }
    .nrs-annb__dot { display: none; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   4. HOMEPAGE — .nrs-* COMPONENTS (Phase 9 blueprint)
   ═══════════════════════════════════════════════════════════════════════════ */

/* Neutralise Elementor section defaults for all Phase 9 full-bleed sections */
.elementor-element-nrshero, .elementor-element-nrstrust, .elementor-element-nrscats,
.elementor-element-nrspromo, .elementor-element-nrswhy,
.elementor-element-nrscoll, .elementor-element-nrsabout, .elementor-element-nrsprom,
.elementor-element-nrsgall, .elementor-element-nrsnews {
    padding: 0 !important;
    margin: 0 !important;
    background: transparent !important;
}
/* Favorites is the one Phase-9 section that carries its own full-bleed surface
   colour (its content sits in a plain .nrs-container with no band wrapper of
   its own), so it is neutralised individually and keeps its background. */
.elementor-element-nrsbest { margin: 0 !important; }
.elementor-element-nrshero .elementor-column-gap-default,
.elementor-element-nrshero .elementor-widget-html,
.elementor-element-nrshero .elementor-widget-container,
.elementor-element-nrstrust .elementor-widget-container,
.elementor-element-nrscats .elementor-widget-container,
.elementor-element-nrspromo .elementor-widget-container,
.elementor-element-nrswhy .elementor-widget-container,
.elementor-element-nrscoll .elementor-widget-container,
.elementor-element-nrsabout .elementor-widget-container,
.elementor-element-nrsprom .elementor-widget-container,
.elementor-element-nrsgall .elementor-widget-container,
.elementor-element-nrsnews .elementor-widget-container,
.elementor-element-nrsbest .elementor-widget-container {
    padding: 0 !important;
    margin: 0 !important;
}
.elementor-element-nrsbest .elementor-widget-ct_product_grid {
    margin-top: 0 !important;
}

/* Container + shared type */
.nrs-container {
    max-width: 1360px;
    margin: 0 auto;
    padding: 0 40px;
}

.nrs-eyebrow {
    display: inline-block;
    font-family: var(--nrs-font-body);
    font-size: 12px;
    font-weight: 700;
    letter-spacing: 0.14em;
    text-transform: uppercase;
    /* Eyebrows are the site's signature gold detail. On LIGHT surfaces they use
       the readable gold-ink (4.9:1); over dark bands and photography the full
       Antique Gold is used instead — see .nrs-eyebrow--light and §13/§16. */
    color: var(--nirsha-gold-ink);
    margin-bottom: 14px;
}
/* Eyebrow OVER PHOTOGRAPHY.
   Antique Gold is 2.9:1 against a light photograph and there is no overlay
   opacity that rescues it without also flattening the picture — so this is a
   role change, exactly as §38 prescribes: the LABEL becomes ivory (5.3:1 at the
   weakest point of the hero wash) and the gold moves to a 2px rule beside it,
   where it is decoration and carries no meaning of its own. The gold reads just
   as strongly; it simply stops being the thing you have to read.
   Over SOLID cocoa/espresso bands the gold text is 4.6–5.6:1 and stays gold —
   see .nrs-coll and .nrs-gallery. */
.nrs-eyebrow--light {
    color: var(--nirsha-ivory);
    text-shadow: 0 1px 6px rgba(32,23,19,0.55);
    display: inline-flex;
    align-items: center;
    gap: 10px;
}
.nrs-eyebrow--light::before {
    content: "";
    width: 24px; height: 2px;
    background: var(--nirsha-gold);
    flex: 0 0 24px;
    border-radius: 2px;
}

.nrs-title {
    font-family: var(--nrs-font-display);
    font-weight: 500;
    font-size: clamp(28px, 3.4vw, 44px);
    line-height: 1.15;
    letter-spacing: -0.01em;
    color: var(--nrs-ink);
    margin: 0 0 14px;
    text-wrap: balance;
}
.nrs-head { text-align: center; max-width: 720px; margin: 0 auto 42px; }
.nrs-head--left { text-align: left; margin: 0 0 32px; max-width: none;
                  display: flex; align-items: flex-end; justify-content: space-between; gap: 30px; }
.nrs-head--light .nrs-title { color: var(--nirsha-ivory); }
.nrs-head--light .nrs-lead { color: rgba(251,247,239,0.80); }
.nrs-lead {
    font-family: var(--nrs-font-body);
    font-size: 15.5px;
    line-height: 1.65;
    color: var(--nrs-muted);
    margin: 0;
}

/* Buttons */
.nrs-btn {
    display: inline-flex; align-items: center; justify-content: center;
    padding: 13px 26px;
    font-family: var(--nrs-font-body);
    font-size: 14px;
    font-weight: 600;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    text-decoration: none;
    border-radius: 999px;
    border: 1.5px solid transparent;
    line-height: 1;
    cursor: pointer;
    transition: background .18s ease, color .18s ease, border-color .18s ease, transform .18s ease;
    white-space: nowrap;
}
/* One primary-action treatment for the whole site: cocoa fill, ivory label;
   hover lifts to Antique Gold with an espresso label (5.6:1). White on gold is
   only 3.1:1, which is why the hover label is espresso and not #fff. */
.nrs-btn--primary { background: var(--nrs-cta-bg); color: var(--nrs-cta-ink); border-color: var(--nrs-cta-bg); }
.nrs-btn--primary:hover,
.nrs-btn--primary:focus-visible { background: var(--nrs-cta-bg-hover); border-color: var(--nrs-cta-bg-hover); color: var(--nrs-cta-ink-hover); }
.nrs-btn--ghost { background: transparent; color: var(--nirsha-cocoa); border-color: rgba(59,36,27,0.28); }
.nrs-btn--ghost:hover { background: var(--nirsha-cocoa); color: var(--nirsha-ivory); border-color: var(--nirsha-cocoa); }
.nrs-btn--light { background: var(--nirsha-ivory); color: var(--nirsha-espresso); border-color: var(--nirsha-ivory); }
.nrs-btn--light:hover { background: var(--nirsha-gold); color: var(--nirsha-espresso); border-color: var(--nirsha-gold); }

/* ─── HERO ─── */
.nrs-hero {
    background: linear-gradient(180deg, var(--nrs-cream) 0%, var(--nrs-cream-2) 100%);
    padding: 72px 0 88px;
    position: relative;
    overflow: hidden;
}
.nrs-hero::before {
    content: ""; position: absolute; inset: auto -10% -30% auto;
    width: 460px; height: 460px; border-radius: 50%;
    background: radial-gradient(circle, rgba(184,137,59,0.12) 0%, transparent 70%);
    pointer-events: none;
}
.nrs-hero__inner {
    display: grid;
    grid-template-columns: 1.05fr 1fr;
    gap: 60px;
    align-items: center;
    position: relative;
    z-index: 1;
}
.nrs-hero__content { max-width: 560px; }
.nrs-hero__title {
    font-family: var(--nrs-font-display);
    font-weight: 500;
    font-size: clamp(38px, 4.6vw, 62px);
    line-height: 1.05;
    letter-spacing: -0.015em;
    color: var(--nrs-ink);
    margin: 0 0 22px;
    text-wrap: balance;
}
.nrs-hero__lead {
    font-family: var(--nrs-font-body);
    font-size: 17px;
    line-height: 1.65;
    color: var(--nrs-ink-2);
    margin: 0 0 30px;
    max-width: 520px;
}
.nrs-hero__cta { display: flex; gap: 12px; flex-wrap: wrap; margin-bottom: 32px; }
.nrs-hero__points {
    display: flex; flex-wrap: wrap; gap: 18px 26px;
    list-style: none; padding: 0; margin: 0;
    font-family: var(--nrs-font-body);
    font-size: 13.5px;
    font-weight: 500;
    color: var(--nrs-muted);
    letter-spacing: 0.02em;
}
.nrs-hero__points li {
    padding-left: 22px;
    position: relative;
}
.nrs-hero__points li::before {
    content: ""; position: absolute; left: 0; top: 50%;
    width: 14px; height: 14px; margin-top: -7px;
    border-radius: 50%;
    background: var(--nrs-brand-tint);
    box-shadow: inset 0 0 0 4px var(--nirsha-gold-dark);
}

.nrs-hero__media { position: relative; }
.nrs-hero__frame {
    position: relative;
    aspect-ratio: 4/3;
    border-radius: 28px;
    overflow: hidden;
    box-shadow: var(--nrs-shadow-lg);
    background: #eee;
}
.nrs-hero__frame img { width: 100%; height: 100%; object-fit: cover; display: block; }
.nrs-hero__badge {
    position: absolute;
    right: -12px; bottom: -22px;
    background: #fff;
    padding: 14px 20px;
    border-radius: var(--nrs-radius);
    box-shadow: var(--nrs-shadow-lg);
    display: flex; flex-direction: column; gap: 2px;
    z-index: 2;
}
.nrs-hero__badge strong {
    font-family: var(--nrs-font-display);
    font-weight: 600;
    font-size: 20px;
    color: var(--nrs-ink);
    line-height: 1;
}
.nrs-hero__badge span {
    font-family: var(--nrs-font-body);
    font-size: 11.5px;
    font-weight: 600;
    letter-spacing: 0.1em;
    text-transform: uppercase;
    color: var(--nrs-muted);
}
@media (max-width: 991px) {
    .nrs-hero { padding: 52px 0 68px; }
    .nrs-hero__inner { grid-template-columns: 1fr; gap: 40px; }
    .nrs-hero__content { max-width: none; }
    .nrs-hero__frame { aspect-ratio: 3/2; }
}
@media (max-width: 480px) {
    .nrs-hero { padding: 36px 0 56px; }
    .nrs-hero__cta { flex-direction: column; align-items: stretch; }
    .nrs-hero__cta .nrs-btn { width: 100%; }
    .nrs-hero__badge { right: 8px; bottom: -18px; padding: 10px 14px; }
    .nrs-hero__badge strong { font-size: 16px; }
    .nrs-hero__badge span { font-size: 10px; }
}

/* ─── TRUST STRIP ─── */
/* Soft Sand, not ivory: this is a thin band directly under the photographic
   hero, and a sand ground reads as a deliberate rule between the hero and the
   ivory category section rather than merging into it. */
.nrs-trust {
    background: var(--nirsha-sand);
    border-top: 1px solid var(--nrs-line);
    border-bottom: 1px solid var(--nrs-line);
    padding: 22px 0;
    margin-top: -1px;
    position: relative;
    z-index: 1;
}

.nrs-trust__item {
    display: flex; align-items: center; gap: 14px;
    padding: 8px 22px;
    border-right: 1px solid var(--nrs-line);
}
.nrs-trust__item:last-child { border-right: none; }
.nrs-trust__icon {
    flex-shrink: 0;
    width: 42px; height: 42px;
    /* Card medallion on the sand band, cocoa glyph. Quiet by design (§7) —
       these four marks must not compete with the hero above them. */
    background: var(--nirsha-card);
    color: var(--nirsha-cocoa);
    border-radius: 50%;
    display: inline-flex; align-items: center; justify-content: center;
}
.nrs-trust__icon svg { width: 22px; height: 22px; display: block; }
.nrs-trust__label {
    font-family: var(--nrs-font-body);
    font-size: 14px; font-weight: 700; color: var(--nrs-ink);
    margin: 0 0 2px; line-height: 1.25;
}
.nrs-trust__desc {
    font-family: var(--nrs-font-body);
    font-size: 12.5px; color: var(--nrs-muted);
    margin: 0; line-height: 1.35;
}
@media (max-width: 991px) {
    .nrs-trust__inner { grid-template-columns: repeat(2, 1fr); }
    .nrs-trust__item { border-right: none; padding: 12px 16px; }
    .nrs-trust__item:nth-child(odd) { border-right: 1px solid var(--nrs-line); }
    .nrs-trust__item:nth-child(-n+2) { border-bottom: 1px solid var(--nrs-line); }
}
@media (max-width: 520px) {
    .nrs-trust__inner { grid-template-columns: 1fr; }
    .nrs-trust__item, .nrs-trust__item:nth-child(odd) { border-right: none; }
    .nrs-trust__item:not(:last-child) { border-bottom: 1px solid var(--nrs-line); }
}

/* ─── SHOP BY CATEGORY ─── */
@keyframes nrs-cat-in {
    from { opacity: 0; transform: translateY(38px) scale(0.95); filter: blur(3px); }
    to   { opacity: 1; transform: translateY(0)    scale(1);    filter: blur(0);  }
}
@keyframes nrs-cat-shine {
    0%   { transform: translateX(-100%) skewX(-15deg); }
    100% { transform: translateX(220%)  skewX(-15deg); }
}

.nrs-cats {
    background: var(--nrs-cream);
    padding: var(--nrs-section-y) 0;
}

/* 6-column mosaic: 2 tall rows + optional bottom row for items 6-8 */
.nrs-cats__grid {
    display: grid;
    grid-template-columns: repeat(6, 1fr);
    grid-template-rows: 240px 240px;
    gap: 16px;
    align-items: stretch;
}
.nrs-cats__grid .nrs-cat:nth-child(1) { grid-column: 1 / 3; grid-row: 1 / 3; }
.nrs-cats__grid .nrs-cat:nth-child(2) { grid-column: 3 / 5; grid-row: 1 / 2; }
.nrs-cats__grid .nrs-cat:nth-child(3) { grid-column: 5 / 7; grid-row: 1 / 2; }
.nrs-cats__grid .nrs-cat:nth-child(4) { grid-column: 3 / 5; grid-row: 2 / 3; }
.nrs-cats__grid .nrs-cat:nth-child(5) { grid-column: 5 / 7; grid-row: 2 / 3; }
.nrs-cats__grid .nrs-cat:nth-child(6) { grid-column: 1 / 3; grid-row: 3 / 4; min-height: 210px; }
.nrs-cats__grid .nrs-cat:nth-child(7) { grid-column: 3 / 5; grid-row: 3 / 4; min-height: 210px; }
.nrs-cats__grid .nrs-cat:nth-child(8) { grid-column: 5 / 7; grid-row: 3 / 4; min-height: 210px; }

/* ── Base card ── */
.nrs-cat {
    position: relative;
    display: block;
    border-radius: var(--nrs-radius-lg);
    overflow: hidden;
    text-decoration: none;
    background: var(--nirsha-sand);
    box-shadow: 0 2px 8px rgba(59,36,27,0.10), 0 1px 2px rgba(59,36,27,0.06);
    transition: transform .32s cubic-bezier(0.22,1,0.36,1), box-shadow .32s ease;
    will-change: transform;
    min-height: 220px;
}

/* Entrance animation — .nrs-visible added by JS IntersectionObserver */
@media (prefers-reduced-motion: no-preference) {
    .nrs-cat {
        opacity: 0;
        animation: nrs-cat-in 0.72s cubic-bezier(0.22,1,0.36,1) both;
        animation-play-state: paused;
    }
    .nrs-cat.nrs-visible { animation-play-state: running; }
}

/* ── Hover ── */
.nrs-cat:hover {
    transform: translateY(-7px) scale(1.018);
    box-shadow: 0 22px 52px rgba(32,23,19,0.20), 0 4px 12px rgba(32,23,19,0.10);
}

/* ── Image ── */
.nrs-cat__media { position: absolute; inset: 0; width: 100%; height: 100%; }
.nrs-cat__media img {
    width: 100% !important; height: 100% !important;
    object-fit: cover !important;
    object-position: center center !important;
    display: block !important;
    transition: transform .68s cubic-bezier(0.22,1,0.36,1);
}
.nrs-cat:hover .nrs-cat__media img { transform: scale(1.1); }

/* ── Gradient overlay ── */
.nrs-cat::before {
    content: ""; position: absolute; inset: 0;
    /* Warm espresso wash, not the old green-black. Keeps the photography's own
       colour honest while guaranteeing the ivory caption stays legible.
       Pixel-sampled: on the SMALL tiles (215px tall) the title sits at ~70% of
       the card, where the previous 0.52@62% ramp left "Chocolates", "Sweets",
       "Healthy Products" and "Combo Packs" at 3.3–4.1:1 over their brighter
       photographs. Reaching 0.62 by 52% and 0.86 by 76% fixes all four; the top
       quarter of every tile is still essentially untouched. */
    background: linear-gradient(180deg,
        rgba(0,0,0,0.03) 0%,
        rgba(0,0,0,0.12) 26%,
        rgba(32,23,19,0.62) 52%,
        rgba(32,23,19,0.86) 76%,
        rgba(32,23,19,0.94) 100%
    );
    z-index: 1;
    transition: background .4s ease;
}
.nrs-cat:hover::before {
    background: linear-gradient(180deg,
        rgba(0,0,0,0.07) 0%,
        rgba(32,23,19,0.26) 26%,
        rgba(32,23,19,0.70) 52%,
        rgba(32,23,19,0.90) 76%,
        rgba(32,23,19,0.96) 100%
    );
}

/* ── Shine sweep on hover ── */
.nrs-cat::after {
    content: '';
    position: absolute; top: 0; left: 0;
    width: 55%; height: 100%;
    background: linear-gradient(90deg,
        transparent 0%,
        rgba(255,255,255,0.15) 50%,
        transparent 100%
    );
    transform: translateX(-100%) skewX(-15deg);
    z-index: 3;
    pointer-events: none;
}
.nrs-cat:hover::after { animation: nrs-cat-shine 0.7s ease forwards; }

/* ── Text content ── */
.nrs-cat__body {
    position: absolute; left: 0; right: 0; bottom: 0;
    padding: 22px 24px 20px;
    z-index: 2;
    color: var(--nirsha-ivory);
    display: flex; flex-direction: column; gap: 4px;
    transform: translateY(5px);
    transition: transform .35s cubic-bezier(0.22,1,0.36,1);
}
.nrs-cat:hover .nrs-cat__body { transform: translateY(0); }

.nrs-cat__title {
    font-family: var(--nrs-font-display);
    font-weight: 500;
    font-size: 24px;
    line-height: 1.1;
    letter-spacing: -0.01em;
    text-shadow: 0 1px 5px rgba(0,0,0,0.28);
}
.nrs-cats__grid .nrs-cat:nth-child(1) .nrs-cat__title { font-size: 32px; }

.nrs-cat__desc {
    font-family: var(--nrs-font-body);
    font-size: 13px;
    opacity: 0.88;
    line-height: 1.4;
    margin-top: 2px;
}
.nrs-cat__link {
    font-family: var(--nrs-font-body);
    font-size: 12px;
    font-weight: 700;
    letter-spacing: 0.1em;
    text-transform: uppercase;
    margin-top: 10px;
    display: inline-flex; align-items: center; gap: 6px;
    color: rgba(251,247,239,0.88);
    transition: color .2s ease;
}
/* Hover warms to Antique Gold over the darkened photograph (4.6:1+). */
.nrs-cat:hover .nrs-cat__link { color: var(--nirsha-gold); }
.nrs-cat__link em {
    font-style: normal;
    display: inline-block;
    opacity: 0.68;
    transition: transform .28s cubic-bezier(0.22,1,0.36,1), opacity .2s ease;
}
.nrs-cat:hover .nrs-cat__link em { transform: translateX(6px); opacity: 1; }

/* ── Responsive ── */
@media (max-width: 1199px) {
    .nrs-cats__grid { grid-template-rows: 210px 210px; gap: 14px; }
}
/* The feature-tile span and the 1-column drop that used to live here fought the
   .nrs-cats__grid--six ladder in R.4 and won on specificity (0,3,0 vs 0,2,0),
   so tile 1 still spanned the full row at <=991px. The markup always carries
   --six, so R.4 is the single authority for columns below 1200; only type
   sizing remains here. */
@media (max-width: 991px) {
    .nrs-cats__grid .nrs-cat:nth-child(1) .nrs-cat__title { font-size: 28px; }
}
@media (max-width: 480px) {
    .nrs-cat__title { font-size: 20px; }
    .nrs-cats__grid .nrs-cat:nth-child(1) .nrs-cat__title { font-size: 24px; }
}

/* ─── BEST SELLERS ─── */
/* Card-white band. It sits between the ivory category mosaic and the sand
   Combo band, so the ladder reads ivory → white → sand rather than three
   identical grounds in a row (§43 rhythm). */
.elementor-element-nrsbest {
    background: var(--nirsha-card);
    padding: var(--nrs-section-y) 0 !important;
}
.nrs-bs-head {
    max-width: 1360px;
    padding: 0 40px;
    margin-bottom: 32px;
}
@media (max-width: 767px) {
    .nrs-bs-head { padding: 0 18px; flex-direction: column; align-items: flex-start; gap: 10px; }
}
/* ─── NIRSHA FAVORITES — curated card rail ───────────────────────────────────
   The 17 rules that used to sit here were scoped to `.ct-product-grid-layout3`,
   the Organio product-grid widget this section was originally built on. That
   widget was replaced (first by WooCommerce's [products] shortcode, now by
   [nirsha_favorites]) and the DOM contains ZERO .ct-product-grid-layout3 nodes,
   so every one of those rules was dead — which is why the cards had lost their
   surface, shadow and title styling. Re-pointed at the markup WooCommerce's
   own content-product.php actually emits. Column counts live in R.5. */
.nrs-fav {
    max-width: 1360px;
    margin: 0 auto;
    padding: 0 40px;
}
.elementor-element-nrsbest li.product .woocommerce-product-inner {
    border-radius: var(--nrs-radius) !important;
    background: var(--nirsha-card);
    border: 1px solid var(--nirsha-border) !important;
    box-shadow: var(--nrs-shadow);
    overflow: hidden;
    transition: box-shadow .22s ease, transform .22s ease;
}
.elementor-element-nrsbest li.product .woocommerce-product-inner:hover {
    box-shadow: var(--nrs-shadow-lg);
    transform: translateY(-3px);
}
/* Fixed image area so every card is the same height regardless of how tall the
   source photograph is. `contain` because these are packets and bowls shot on
   white — cropping them (cover) cuts the product. */
.elementor-element-nrsbest li.product .woocommerce-product-header {
    background: var(--nrs-cream) !important;
    padding: 18px;
}
.elementor-element-nrsbest li.product .woocommerce-product-header a {
    display: block;
    aspect-ratio: 1 / 1;
}
.elementor-element-nrsbest li.product .woocommerce-product-header img {
    width: 100% !important;
    height: 100% !important;
    object-fit: contain !important;
    background: transparent !important;
    mix-blend-mode: multiply;      /* white product backgrounds melt into the cream tile */
}
.elementor-element-nrsbest li.product .woocommerce-loop-product__title,
.elementor-element-nrsbest li.product .woocommerce-product--title {
    font-family: var(--nrs-font-body);
    font-size: 15px !important;
    font-weight: 600 !important;
    color: var(--nrs-ink) !important;
    line-height: 1.35 !important;
    /* Long names must not push the button out of line with its neighbours:
       reserve exactly two lines in every card, ellipsing anything longer. */
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
    min-height: calc(2 * 1.35 * 15px);
    margin-bottom: 6px;
}
.elementor-element-nrsbest li.product .price {
    font-family: var(--nrs-font-body);
    font-size: 15px;
    font-weight: 700;
    color: var(--nirsha-cocoa);
}
/* Struck price: the line-through is the primary cue, so the muted token can
   carry the de-emphasis without the colour having to do the work alone. */
.elementor-element-nrsbest li.product .price del {
    font-weight: 500; opacity: 1; color: var(--nirsha-muted-ink); margin-right: 6px;
}
.elementor-element-nrsbest li.product .price ins {
    text-decoration: none; color: var(--nirsha-cocoa);
}
/* Out of stock: WooCommerce swaps the button for a "Read more" link, so the
   state is called out explicitly instead of looking like a broken CTA. */
.elementor-element-nrsbest li.product.outofstock .woocommerce-product-header::after {
    content: "Out of stock";
    position: absolute; top: 14px; left: 14px;
    background: rgba(32,23,19,.86); color: var(--nirsha-ivory);
    font-size: 11px; font-weight: 600; letter-spacing: .06em; text-transform: uppercase;
    padding: 5px 10px; border-radius: 999px;
}
.elementor-element-nrsbest li.product.outofstock .woocommerce-product-header { position: relative; }
.elementor-element-nrsbest li.product.outofstock .woocommerce-product-inner { opacity: .92; }

/* Organio reveals quick-view and wishlist on hover, positioned by CSS that was
   scoped to .ct-product-grid-layout3. With that wrapper gone the buttons fall
   into normal flow and stack ~104px of dead height at the base of every card
   (measured 696px cards, of which 104px was empty). The curated card spec is
   image, title, price, one action — so they are hidden in this rail.
   NOTE: the Shop archive shows the same symptom and is deliberately left
   alone here; it is outside this section's brief. */
.elementor-element-nrsbest li.product > .woosq-btn,
.elementor-element-nrsbest li.product > .woosw-btn,
.elementor-element-nrsbest li.product .woocommerce-product-meta {
    display: none !important;
}
/* The bare .onsale badge sits above the card as a 26px block; float it onto
   the image tile instead so it does not add height. */
.elementor-element-nrsbest li.product > .woocommerce-loop-product__link {
    position: absolute; top: 10px; left: 10px; z-index: 3; height: auto;
}
/* Sale badge: Antique Gold with an espresso label (5.6:1). Deliberately NOT
   cocoa — the Add to Cart button below it is cocoa, and two cocoa blocks in one
   card flattens the hierarchy. Gold reads as "offer", cocoa as "action". */
.elementor-element-nrsbest li.product .onsale {
    background: var(--nirsha-gold); color: var(--nirsha-espresso); border-radius: 999px;
    font-size: 11px; font-weight: 700; letter-spacing: .05em; padding: 4px 10px;
}

/* CTA under the grid — dynamic Shop permalink, printed by the shortcode. */
.nrs-fav__cta { display: flex; justify-content: center; margin-top: 36px; }
.nrs-fav__cta .nrs-btn {
    background: transparent;
    color: var(--nirsha-cocoa);
    border: 1.5px solid rgba(59,36,27,0.28);
}
.nrs-fav__cta .nrs-btn:hover {
    background: var(--nirsha-cocoa);
    border-color: var(--nirsha-cocoa);
    color: var(--nirsha-ivory);
}
/* Admin-only empty state (visitors get the section collapsed instead). */
.nrs-fav--empty {
    max-width: 1360px; margin: 0 auto; padding: 22px 40px;
    border: 1px dashed rgba(59,36,27,0.30); border-radius: var(--nrs-radius);
    background: var(--nirsha-ivory);
}
.nrs-fav--empty p { margin: 0; font-size: 14.5px; color: var(--nrs-muted); }
@media (max-width: 767px) {
    .nrs-fav { padding: 0 18px; }
    .nrs-fav__cta { margin-top: 26px; }
}

/* ─── SPLIT PROMO BANNERS ─── */
.nrs-promos { background: var(--nirsha-ivory); padding: 0 0 var(--nrs-section-y); }
.nrs-promos__grid {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 20px;
}
.nrs-promo {
    position: relative;
    /* Flex column with the copy pinned to the end: the text block sits at the
       BOTTOM-left instead of being centred over the middle of the photograph,
       which is where every one of these three images carries its subject. */
    display: flex;
    flex-direction: column;
    justify-content: flex-end;
    aspect-ratio: 16/9;
    border-radius: var(--nrs-radius-lg);
    overflow: hidden;
    text-decoration: none;
    color: #fff;
    box-shadow: var(--nrs-shadow);
    transition: transform .3s ease, box-shadow .3s ease;
}
.nrs-promo:hover { transform: translateY(-4px); box-shadow: var(--nrs-shadow-lg); }
.nrs-promo__img {
    position: absolute; inset: 0;
    width: 100%; height: 100%; object-fit: cover; display: block;
    transition: transform .6s ease;
}
.nrs-promo:hover .nrs-promo__img { transform: scale(1.04); }
.nrs-promo__shade {
    position: absolute; inset: 0;
    /* Was a left-to-right wash that dimmed the whole left half of the picture.
       Now fully clear across the top ~40% so the product photography reads, and
       ramping to near-solid only across the band the copy actually occupies. */
    /* The ramp starts earlier and climbs harder than before. Measured cause:
       the gold eyebrow sat at ~44% of the card height, where the old ramp was
       still only ~0.35 opaque, so on the two bright photographs (the lit gift
       table and the pale gift box) it fell to roughly 2:1 against the image.
       Seating the whole copy block on a reliable ground is what fixes it —
       the eyebrow keeps its gold. */
    /* Ramp measured against the copy block, not chosen by eye. The eyebrow sits
       at roughly 44% of the card height; at the old 0.35 there, ivory label text
       fell to ~2.5:1 over the two bright photographs. 0.68 by 44% puts it at
       5.7:1 in the worst case (a pure-white photo) while the top 24% of every
       picture stays completely clear. */
    /* Card-level vignette only — depth, not readability. The readability scrim
       is on .nrs-promo__content below, because a FIXED ramp cannot work here:
       card 2's headline wraps to two lines, which lifts its copy block (and its
       eyebrow) to 24% of the card while cards 1 and 3 start at 36%. Any ramp
       dark enough for card 2 at 24% would have flattened the top quarter of all
       three photographs — and the subjects of these three shots sit at 30–42%,
       exactly there. Anchoring the scrim to the copy instead of to the card
       makes it correct at any copy height. */
    background: linear-gradient(180deg,
        rgba(26,18,14,0)    34%,
        rgba(26,18,14,0.16) 58%,
        rgba(26,18,14,0.34) 100%);
    z-index: 1;
}
/* Keep each photograph's subject clear of the bottom-left copy: card 1 is an
   all-over spread biased up to its best bowls, card 2's gift box sits high of
   centre, card 3's box sits right of centre. */
.nrs-promos__grid--three .nrs-promo:nth-child(1) .nrs-promo__img { object-position: 50% 30%; }
.nrs-promos__grid--three .nrs-promo:nth-child(2) .nrs-promo__img { object-position: 52% 36%; }
.nrs-promos__grid--three .nrs-promo:nth-child(3) .nrs-promo__img { object-position: 64% 42%; }
.nrs-promo__content {
    /* relative, not absolute: the block sits in normal flow at the end of the
       card's flex column, so it anchors bottom-left and lets a long title grow
       the card instead of overflowing a box pinned to the card's height.
       z-index needs a position, hence relative rather than static. */
    position: relative;
    z-index: 2;
    padding: 28px 30px;
    display: flex; flex-direction: column; align-items: flex-start;
    text-align: left;
    max-width: 80%;
    color: #fff;
}
/* Readability scrim, anchored to the COPY rather than to the card, so it is
   always exactly as tall as the text it has to carry — however many lines the
   headline wraps to. Bled past the card edges with -100vw and clipped by the
   card's own overflow:hidden, because .nrs-promo__content is only 80–88% wide
   and a gradient on the element itself would have left a visible vertical seam
   down the middle of the photograph. */
.nrs-promo__content::before {
    content: "";
    position: absolute;
    top: -26px; bottom: 0; left: -100vw; right: -100vw;
    background: linear-gradient(180deg,
        rgba(26,18,14,0)    0%,
        rgba(26,18,14,0.66) 16%,
        rgba(26,18,14,0.88) 52%,
        rgba(26,18,14,0.95) 100%);
    z-index: -1;
    pointer-events: none;
}
.nrs-promo__content .nrs-eyebrow { opacity: 1; text-shadow: 0 1px 4px rgba(0,0,0,0.45); }
.nrs-promo__desc, .nrs-promo__title { text-shadow: 0 1px 5px rgba(0,0,0,0.40); }
.nrs-promo__title {
    font-family: var(--nrs-font-display);
    font-weight: 500;
    font-size: 32px;
    line-height: 1.1;
    letter-spacing: -0.01em;
    margin-bottom: 8px;
    /* at most two lines, so a long headline can never push the CTA out */
    display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2;
    overflow: hidden;
}
.nrs-promo__desc {
    font-family: var(--nrs-font-body);
    font-size: 14.5px;
    opacity: 0.92;
    line-height: 1.5;
    margin-bottom: 20px;
    display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2;
    overflow: hidden;
}
.nrs-promo__content > * { flex-shrink: 0; }
.nrs-promo .nrs-btn { align-self: flex-start; }
@media (max-width: 767px) {
    .nrs-promos__grid { grid-template-columns: 1fr; gap: 14px; }
    .nrs-promo { aspect-ratio: 5/4; }
    .nrs-promo__content { padding: 22px 24px; max-width: 80%; }
    .nrs-promo__title { font-size: 24px; }
}

/* ─── WHY CHOOSE ─── */
.nrs-why {
    background: var(--nirsha-ivory);
    padding: var(--nrs-section-y) 0;
    border-top: 1px solid var(--nrs-line);
    border-bottom: 1px solid var(--nrs-line);
}
.nrs-why__grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 22px;
    max-width: 1280px;
    margin: 0 auto;
}
.nrs-pillar {
    background: var(--nirsha-card);
    padding: 34px 30px;
    border-radius: var(--nrs-radius);
    position: relative;
    border: 1px solid var(--nrs-line-2);
    transition: transform .22s ease, box-shadow .22s ease;
}
.nrs-pillar:hover { transform: translateY(-3px); box-shadow: var(--nrs-shadow); }
.nrs-pillar__num {
    position: absolute;
    top: 22px; right: 26px;
    font-family: var(--nrs-font-display);
    font-size: 30px;
    font-weight: 500;
    color: var(--nrs-line);
    line-height: 1;
}
.nrs-pillar__icon {
    display: inline-flex; align-items: center; justify-content: center;
    width: 54px; height: 54px;
    background: var(--nirsha-sand);
    /* gold-dark, not #B8893B: a 28px glyph needs 3:1 and plain gold on sand is
       2.6:1. Same gold family, one step down, legible (3.8:1). */
    color: var(--nirsha-gold-dark);
    border-radius: 14px;
    margin-bottom: 20px;
}
.nrs-pillar__icon svg { width: 28px; height: 28px; }
.nrs-pillar__title {
    font-family: var(--nrs-font-display);
    font-weight: 500;
    font-size: 22px;
    color: var(--nrs-ink);
    margin: 0 0 10px;
    line-height: 1.2;
}
.nrs-pillar__desc {
    font-family: var(--nrs-font-body);
    font-size: 14.5px;
    color: var(--nrs-muted);
    line-height: 1.6;
    margin: 0;
}

/* ─── NIRSHA SPECIAL SELECTION (signature dark band) ─────────────────────────
   This band used to be a large flat olive field and was the single strongest
   reason the storefront still read as an organic-grocery theme. It is now Deep
   Cocoa — the chocolatier / gift-box register the brand actually sells in. Two
   very low-opacity radials keep it from looking like a painted rectangle: a
   warm ivory lift top-left, an Antique Gold bloom bottom-right. */
.nrs-coll {
    background: var(--nirsha-cocoa);
    background-image:
        radial-gradient(ellipse at 15% 0%,   rgba(251,247,239,0.06), transparent 62%),
        radial-gradient(ellipse at 85% 100%, rgba(184,137,59,0.16),  transparent 62%);
    color: var(--nirsha-ivory);
    padding: var(--nrs-section-y) 0;
}
.nrs-coll .nrs-eyebrow { color: var(--nirsha-gold); }
.nrs-coll .nrs-title   { color: var(--nirsha-ivory); }
.nrs-coll .nrs-lead    { color: rgba(251,247,239,0.78); }
/* One gold hairline above the grid — the band's only hard accent. */
.nrs-coll__grid { border-top: 1px solid rgba(184,137,59,0.24); padding-top: 34px; }
.nrs-coll__grid {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: 18px;
}
.nrs-coll__card {
    display: block;
    background: rgba(251,247,239,0.05);
    border: 1px solid rgba(251,247,239,0.10);
    border-radius: var(--nrs-radius);
    overflow: hidden;
    text-decoration: none;
    color: var(--nirsha-ivory);
    transition: transform .28s ease, background .28s ease, border-color .28s ease;
}
.nrs-coll__card:hover {
    transform: translateY(-4px);
    background: rgba(251,247,239,0.09);
    border-color: rgba(184,137,59,0.45);
    color: var(--nirsha-ivory);
}
.nrs-coll__media {
    display: block;
    aspect-ratio: 4/3;
    overflow: hidden;
    background: rgba(0,0,0,0.2);
}
.nrs-coll__media img {
    width: 100%; height: 100%; object-fit: cover; display: block;
    transition: transform .5s ease;
}
.nrs-coll__card:hover .nrs-coll__media img { transform: scale(1.05); }
.nrs-coll__body {
    padding: 20px 22px 22px;
    display: block;
}
.nrs-coll__title {
    font-family: var(--nrs-font-display);
    font-weight: 500;
    font-size: 22px;
    line-height: 1.15;
    color: var(--nirsha-ivory);
    margin-bottom: 6px;
    display: block;
}
.nrs-coll__desc {
    font-family: var(--nrs-font-body);
    font-size: 13.5px;
    color: rgba(251,247,239,0.74);
    line-height: 1.5;
    margin-bottom: 14px;
    display: block;
}
.nrs-coll__link {
    font-family: var(--nrs-font-body);
    font-size: 12px;
    font-weight: 700;
    letter-spacing: 0.1em;
    text-transform: uppercase;
    /* gold-LIGHT: these links sit on the card's translucent lift, not on the
       cocoa band itself, where plain gold measures 3.96:1. */
    color: var(--nirsha-gold-light);
    display: inline-flex; align-items: center; gap: 6px;
}
.nrs-coll__link em { font-style: normal; transition: transform .2s ease; }
.nrs-coll__card:hover .nrs-coll__link em { transform: translateX(4px); }

/* ─── ABOUT ─── */
.nrs-about {
    background: var(--nirsha-sand);
    padding: var(--nrs-section-y) 0;
}
.nrs-about__inner {
    display: grid;
    grid-template-columns: 1fr 1.1fr;
    gap: 60px;
    align-items: center;
}
.nrs-about__media {
    position: relative;
    aspect-ratio: 4/5;
    max-width: 480px;
}
.nrs-about__media img {
    width: 100%; height: 100%; object-fit: cover;
    border-radius: var(--nrs-radius-lg);
    display: block;
    box-shadow: var(--nrs-shadow-lg);
}
.nrs-about__tag {
    position: absolute;
    left: -18px; bottom: 30px;
    background: var(--nirsha-card);
    padding: 12px 18px;
    border-radius: 999px;
    display: inline-flex; align-items: center; gap: 8px;
    font-family: var(--nrs-font-body);
    font-size: 13px;
    font-weight: 600;
    color: var(--nrs-ink);
    box-shadow: var(--nrs-shadow-lg);
}
.nrs-about__tag em {
    display: inline-flex; width: 22px; height: 22px;
    background: var(--nirsha-sand);
    color: var(--nirsha-gold-ink);
    border-radius: 50%;
    align-items: center; justify-content: center;
}
.nrs-about__tag em svg { width: 14px; height: 14px; }
.nrs-about__body { max-width: 540px; }
.nrs-about__text {
    font-family: var(--nrs-font-body);
    font-size: 16px;
    line-height: 1.75;
    color: var(--nrs-ink-2);
    margin: 0 0 22px;
}
.nrs-about__list {
    list-style: none; padding: 0; margin: 0 0 30px;
    display: grid; gap: 10px;
}
.nrs-about__list li {
    font-family: var(--nrs-font-body);
    font-size: 14.5px;
    color: var(--nrs-ink-2);
    padding-left: 30px;
    position: relative;
    line-height: 1.5;
}
.nrs-about__list li::before {
    content: "";
    position: absolute; left: 0; top: 2px;
    width: 20px; height: 20px;
    /* Tick glyph is Deep Cocoa (%233B241B) on the sand disc — this is a
       decorative list marker, not a success state, so it must not be green. */
    background: var(--nirsha-sand) url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%233B241B' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'><polyline points='20 6 9 17 4 12'/></svg>") center/12px 12px no-repeat;
    border-radius: 50%;
}
@media (max-width: 991px) {
    .nrs-about__inner { grid-template-columns: 1fr; gap: 40px; }
    /* `margin: 0 auto` cancels the grid item's default stretch, and the only
       child is sized 100% of this box — so with width:auto the box had nothing
       to measure itself against and collapsed to 0x0, taking the photo with it
       on every screen at or below 991px. An explicit width restores it. */
    .nrs-about__media { width: 100%; max-width: 380px; margin: 0 auto; }
}

/* ─── PROMISE ─── */
/* Was a pale-green tinted band. Now Warm Ivory (§15) — the green tint was the
   last "wellness aisle" cue on the page. */
.nrs-promise {
    background: var(--nirsha-ivory);
    padding: var(--nrs-section-y) 0;
    border-top: 1px solid var(--nrs-line);
}
.nrs-promise__grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 24px;
    max-width: 1280px;
    margin: 0 auto;
}

.nrs-promise__icon {
    display: inline-flex; align-items: center; justify-content: center;
    width: 62px; height: 62px;
    background: var(--nirsha-card);
    color: var(--nirsha-gold-dark);
    border-radius: 50%;
    margin-bottom: 18px;
    border: 1px solid var(--nrs-line);
}

.nrs-promise__desc {
    font-family: var(--nrs-font-body);
    font-size: 14px;
    color: var(--nrs-muted);
    line-height: 1.55;
    margin: 0;
}

/* ─── GALLERY — "From Our Table to Yours" ─── */
/* Espresso, not green-black: the photographs are the hero, the ground only has
   to disappear behind them. */
.nrs-gallery {
    background: var(--nirsha-espresso);
    padding: var(--nrs-section-y) 0;
}
/* Override heading colours inside the dark gallery */
.nrs-gallery .nrs-eyebrow { color: var(--nirsha-gold); }
.nrs-gallery .nrs-title   { color: var(--nirsha-ivory); }
.nrs-gallery .nrs-lead    { color: rgba(251,247,239,0.72); }
.nrs-gallery__grid {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    grid-auto-rows: 200px;
    gap: 14px;
}
.nrs-gallery__item {
    margin: 0;
    overflow: hidden;
    border-radius: var(--nrs-radius);
    background: var(--nirsha-card);
    box-shadow: 0 4px 16px rgba(0,0,0,0.25);
    transition: transform .28s ease, box-shadow .28s ease;
}

/* Base: all images fill their cell.
   !important is required — Organio ships `img { height: auto !important }`, which
   otherwise collapses these to height:0. That was not merely cosmetic: a
   zero-height `loading="lazy"` image never intersects the viewport, so the lazy
   loader never fired and the entire gallery stayed permanently blank. */
.nrs-gallery__item img {
    width: 100% !important; height: 100% !important;
    object-fit: cover; object-position: center center;
    display: block !important; transition: transform .5s ease;
}
.nrs-gallery__item:hover img { transform: scale(1.05); }
/* Small product tiles: anchor slightly above centre so bowl fills frame */
.nrs-gallery__item:not(.nrs-gallery__item--wide) img {
    object-position: center 40%;
    transform-origin: center 40%;
}
/* Wide feature image: contain — must come last to win specificity via !important */
.nrs-gallery__item--wide img {
    object-fit: contain !important;
    object-position: center center !important;
    background: var(--nirsha-espresso);
}
.nrs-gallery__item--wide { grid-column: span 2; grid-row: span 2; }
/* Last item in a row-3 of-8 layout: span 2 cols to fill the 4th column gap */
.nrs-gallery__item:nth-child(8) { grid-column: span 2; }
@media (max-width: 991px) {
    .nrs-gallery__grid { grid-template-columns: repeat(3, 1fr); grid-auto-rows: 160px; }
    .nrs-gallery__item--wide { grid-column: span 2; grid-row: span 2; }
}

/* ─── NEWSLETTER BAND ─── */
.elementor-element-nrsnews {
    background: var(--nirsha-cocoa);
    background-image:
        radial-gradient(ellipse at 0% 0%, rgba(251,247,239,0.06), transparent 60%),
        radial-gradient(ellipse at 100% 100%, rgba(184,137,59,0.18), transparent 60%);
    padding: 60px 0 !important;
}
.elementor-element-nrsnews > .elementor-container {
    max-width: 1360px !important;
    margin: 0 auto !important;
    padding: 0 40px !important;
    align-items: center !important;
    gap: 40px !important;
}
.nrs-news__text .nrs-title { color: #fff; margin: 0 0 10px; font-size: clamp(24px, 3vw, 34px); }
.nrs-news__lead {
    font-family: var(--nrs-font-body);
    font-size: 14.5px;
    line-height: 1.6;
    color: rgba(255,255,255,0.78);
    margin: 0;
    max-width: 480px;
}
/* Mailchimp widget inside our band: neutralise its own container styles */
.elementor-element-nrsnews .ct-mailchimp,
.elementor-element-nrsnews .ct-mailchimp-form,
.elementor-element-nrsnews .mc4wp-form-fields {
    background: transparent !important;
    padding: 0 !important;
    margin: 0 !important;
    box-shadow: none !important;
    border: none !important;
}
.elementor-element-nrsnews .mc4wp-form,
.elementor-element-nrsnews form {
    display: flex; gap: 8px; margin: 0;
}
.elementor-element-nrsnews input[type="email"],
.elementor-element-nrsnews .mc4wp-form input[type="email"] {
    flex: 1;
    background: rgba(251,247,239,0.94) !important;
    border: 1px solid rgba(251,247,239,0.55) !important;
    color: var(--nirsha-espresso) !important;
    padding: 14px 18px !important;
    border-radius: 999px !important;
    font-family: var(--nrs-font-body) !important;
    font-size: 14px !important;
    line-height: 1;
    min-width: 0;
    height: auto !important;
    box-shadow: none !important;
}
.elementor-element-nrsnews input[type="email"]::placeholder { color: var(--nrs-muted); }
.elementor-element-nrsnews input[type="email"]:focus {
    background: var(--nirsha-card) !important;
    border-color: var(--nirsha-gold) !important;
    box-shadow: 0 0 0 3px rgba(184,137,59,0.55) !important;
    outline: none !important;
}
.elementor-element-nrsnews input[type="submit"],
.elementor-element-nrsnews button[type="submit"] {
    background: var(--nirsha-gold) !important;
    color: var(--nirsha-espresso) !important;
    border: none !important;
    padding: 14px 26px !important;
    border-radius: 999px !important;
    font-family: var(--nrs-font-body) !important;
    font-size: 13px !important;
    font-weight: 700 !important;
    letter-spacing: 0.06em !important;
    text-transform: uppercase !important;
    cursor: pointer;
    transition: background .18s ease;
    height: auto !important;
}
.elementor-element-nrsnews input[type="submit"]:hover,
.elementor-element-nrsnews button[type="submit"]:hover {
    background: var(--nirsha-ivory) !important;
    color: var(--nirsha-espresso) !important;
}
@media (max-width: 991px) {
    .elementor-element-nrsnews > .elementor-container { flex-direction: column !important; text-align: center; }
    .elementor-element-nrsnews .elementor-column { width: 100% !important; }
    .nrs-news__lead { margin-left: auto; margin-right: auto; }
    .elementor-element-nrsnews form { max-width: 460px; margin: 0 auto; }
}
@media (max-width: 520px) {
    .elementor-element-nrsnews form { flex-direction: column; }
    .elementor-element-nrsnews input[type="submit"], .elementor-element-nrsnews button[type="submit"] { width: 100%; }
}
/* Inner layout for inline newsletter HTML (no mailchimp widget) */
.nrs-news { width: 100%; }
.nrs-news__inner {
    display: flex;
    align-items: center;
    gap: 48px;
}
.nrs-news__text { flex: 0 0 auto; max-width: 480px; }
.nrs-news__form { flex: 1; }
.nrs-news__row { display: flex; gap: 8px; margin: 0; }
.nrs-news__note {
    font-size: 12px;
    color: rgba(251,247,239,0.62);
    margin: 10px 0 0;
    letter-spacing: 0.03em;
}
@media (max-width: 991px) {
    .nrs-news__inner { flex-direction: column; text-align: center; }
    .nrs-news__text { max-width: 100%; }
    .nrs-news__form { width: 100%; max-width: 460px; }
    .nrs-news__note { margin: 10px auto 0; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   5. WOOCOMMERCE PRODUCT LOOP (shop/archive) — kept from Phase 4+
   ═══════════════════════════════════════════════════════════════════════════ */
.woocommerce .products, .woocommerce-page .products {
    max-width: 100% !important;
    box-sizing: border-box !important;
}
/* Brand colours on ATC everywhere the loop appears */
.ct-product-grid-layout3 .woocommerce-add-to-cart a,
.ct-product-grid-layout3 .button {
    background-color: var(--nrs-cta-bg) !important;
    border-color: var(--nrs-cta-bg) !important;
    color: var(--nrs-cta-ink) !important;
}
.ct-product-grid-layout3 .woocommerce-add-to-cart a:hover,
.ct-product-grid-layout3 .button:hover {
    background-color: var(--nrs-cta-bg-hover) !important;
    border-color: var(--nrs-cta-bg-hover) !important;
    color: var(--nrs-cta-ink-hover) !important;
}
.ct-product-grid-layout3 .price ins { color: var(--nirsha-cocoa) !important; font-weight: 700 !important; }
.ct-product-grid-layout3 .price del { color: var(--nirsha-muted-ink) !important; font-weight: 400 !important; opacity: 1 !important; }
.ct-product-grid-layout3 .woocommerce-product-header img {
    object-fit: contain !important;
    height: 220px !important;
    width: 100% !important;
}

/* Empty-state messaging retained for filter tabs on best sellers */
.ct-product-grid-layout3 .ct-grid-inner:has(.grid-sizer:only-child) {
    height: auto !important; position: relative !important;
    overflow: visible !important; min-height: 0; display: block;
}
.ct-product-grid-layout3 .ct-grid-inner:has(.grid-sizer:only-child) .grid-sizer { display: none; }
.ct-product-grid-layout3 .ct-grid-inner:has(.grid-sizer:only-child)::before {
    content: "New products are coming soon.";
    display: block; text-align: center; padding: 28px 20px 6px;
    border-top: 1px solid var(--nrs-line-2); color: var(--nrs-ink-2);
    font-family: var(--nrs-font-body); font-size: 15px; font-weight: 600;
}
.ct-product-grid-layout3 .ct-grid-inner:has(.grid-sizer:only-child)::after {
    content: "We\2019re carefully selecting premium products for you. Check back soon.";
    display: block; text-align: center; padding: 0 20px 28px;
    color: var(--nrs-muted); font-family: var(--nrs-font-body); font-size: 14px; line-height: 1.75;
}
.ct-product-grid-layout3 .ct-grid-inner.nirsha-filter-empty {
    height: auto !important; position: relative !important;
    overflow: visible !important; min-height: 0; display: block;
}
.ct-product-grid-layout3 .ct-grid-inner.nirsha-filter-empty .grid-sizer { display: none; }
.ct-product-grid-layout3 .ct-grid-inner.nirsha-filter-empty::before {
    content: "No products in this category yet.";
    display: block; text-align: center; padding: 28px 20px 6px;
    border-top: 1px solid var(--nrs-line-2); color: var(--nrs-ink-2);
    font-family: var(--nrs-font-body); font-size: 15px; font-weight: 600;
}
.ct-product-grid-layout3 .ct-grid-inner.nirsha-filter-empty::after {
    content: "Check back soon \2014 we\2019re curating the best for you.";
    display: block; text-align: center; padding: 0 20px 28px;
    color: var(--nrs-muted); font-family: var(--nrs-font-body); font-size: 14px; line-height: 1.75;
}

/* ═══════════════════════════════════════════════════════════════════════════
   6. SINGLE PRODUCT + RELATED PRODUCTS — kept intact from Phase 6+
   ═══════════════════════════════════════════════════════════════════════════ */
.single-product .summary { --primary-color: var(--nirsha-cocoa); }
.single-product .summary .single_add_to_cart_button {
    background-color: var(--nrs-cta-bg) !important;
    border-color: var(--nrs-cta-bg) !important;
    color: var(--nrs-cta-ink) !important; opacity: 1 !important; filter: none !important;
    min-width: 160px; flex: 1 1 auto;
}
.single-product .summary .single_add_to_cart_button:hover,
.single-product .summary .single_add_to_cart_button:focus-visible {
    background-color: var(--nrs-cta-bg-hover) !important;
    border-color: var(--nrs-cta-bg-hover) !important; color: var(--nrs-cta-ink-hover) !important;
}
.single-product .summary .single_add_to_cart_button.loading {
    background-color: var(--nrs-cta-bg) !important; color: var(--nrs-cta-ink) !important;
    opacity: 0.75 !important; cursor: wait;
}
/* Disabled must stay recognisably the SAME control, just unavailable — a warm
   neutral rather than a washed-out cocoa that could read as a hover state. */
.single-product .summary .single_add_to_cart_button.disabled,
.single-product .summary .single_add_to_cart_button[disabled] {
    background-color: var(--nirsha-border) !important;
    border-color: var(--nirsha-border) !important;
    color: var(--nirsha-text) !important;
    opacity: 1 !important; cursor: not-allowed !important;
}
.single-product .summary .price { color: var(--nirsha-cocoa) !important; }
.single-product .summary .price ins { color: var(--nirsha-cocoa) !important; font-size: 28px !important; font-weight: 700; text-decoration: none !important; }
.single-product .summary .price del { color: var(--nirsha-muted-ink) !important; font-size: 18px !important; font-weight: 400 !important; opacity: 1 !important; }
.single-product .summary .quantity {
    border: 1.5px solid var(--nirsha-border) !important; border-radius: 8px !important;
    overflow: hidden; background: var(--nirsha-card);
}
.single-product .summary .quantity input.qty { border: none !important; background: transparent !important; color: var(--nirsha-espresso) !important; }
.single-product .summary i.quantity-down, .single-product .summary i.quantity-up {
    background-color: var(--nirsha-sand) !important; color: var(--nirsha-cocoa) !important;
    width: 32px !important; height: 28px !important; line-height: 28px !important;
    font-size: 15px !important; font-style: normal; transition: background 0.15s ease;
}
.single-product .summary i.quantity-down:hover, .single-product .summary i.quantity-up:hover {
    background-color: var(--nirsha-border) !important;
}
.single-product .summary .woosw-btn,
.single-product .summary .woocommerce-sg-product-button .woosw-btn {
    background-color: var(--nirsha-card) !important; color: var(--nirsha-cocoa) !important;
    border: 1px solid var(--nirsha-border) !important; box-shadow: none !important;
}
/* Wishlist hover is GOLD, not green: wishlist is a saved-for-later preference,
   never a success state (§26). The pale-green wash here was a brand remnant. */
.single-product .summary .woosw-btn:hover,
.single-product .summary .woocommerce-sg-product-button .woosw-btn:hover {
    background-color: var(--nirsha-sand) !important; border-color: var(--nirsha-gold) !important; color: var(--nirsha-gold-ink) !important;
}
.single-product .summary form.cart { gap: 12px; flex-wrap: wrap; }
.single-product .summary .product_meta {
    margin-top: 20px; padding-top: 16px; border-top: 1px solid var(--nirsha-border);
    font-size: 14px; color: var(--nrs-muted);
}
/* Selected variation swatch: cocoa ring. Deliberately not gold — a customer
   must be able to tell "this size is chosen" at a glance, and cocoa on the
   card surface is 14:1 where gold would be 3:1. */
.single-product .summary .wvs-term.selected,
.single-product .summary .wvs-style-rounded.selected {
    border-color: var(--nirsha-cocoa) !important;
    box-shadow: 0 0 0 2px var(--nirsha-cocoa) !important;
}
.single-product .summary .wvs-term:hover,
.single-product .summary .wvs-style-rounded:hover {
    border-color: var(--nirsha-gold) !important;
}

.single-product .related { --primary-color: var(--nirsha-cocoa); }
.single-product .related .woocommerce-product-inner::before,
.single-product .related .woocommerce-product-inner:hover::before {
    content: none !important; display: none !important; border: none !important; visibility: hidden !important;
}
.single-product .related .products {
    display: flex !important; flex-wrap: wrap !important;
    justify-content: center !important; gap: 24px !important;
    list-style: none !important; padding: 0 !important;
    margin-left: 0 !important; margin-right: 0 !important;
}
.single-product .related li.product {
    float: none !important; width: auto !important;
    flex: 0 0 calc(33.333% - 16px) !important; max-width: 380px !important; margin: 0 !important;
}
.single-product .related .woocommerce-product-inner {
    border: none !important; border-radius: 8px !important; overflow: hidden !important;
    box-shadow: 0 2px 16px rgba(0, 0, 0, 0.07) !important;
    transition: box-shadow 0.2s ease !important;
}
.single-product .related .woocommerce-product-inner:hover { box-shadow: 0 6px 30px rgba(0, 0, 0, 0.12) !important; }
.single-product .related .woocommerce-product-header { border-radius: 0 !important; overflow: hidden !important; }
.single-product .related .woocommerce-product-inner:hover .woocommerce-product-content .woocommerce-add-to-cart,
.single-product .related .woocommerce-product-inner.cart-added .woocommerce-product-content .woocommerce-add-to-cart {
    bottom: 6px !important; opacity: 1 !important; visibility: visible !important;
}
.single-product .related .woocommerce-product-content {
    padding-left: 16px !important; padding-right: 16px !important;
    padding-bottom: 60px !important; overflow: visible !important;
}
.single-product .related .woocommerce-product-header img {
    width: 100% !important; max-width: 100% !important; height: 220px !important;
    object-fit: contain !important; display: block !important;
    padding: 12px !important; background: var(--nirsha-ivory) !important;
}
.single-product .related .price ins { color: var(--nirsha-cocoa) !important; font-weight: 700 !important; text-decoration: none !important; }
.single-product .related .price del { color: var(--nirsha-muted-ink) !important; font-weight: 400 !important; opacity: 1 !important; font-size: 0.85em !important; }
.single-product .related .woocommerce-product--title,
.single-product .related .woocommerce-loop-product__title {
    font-size: 15px !important; font-weight: 600 !important; line-height: 1.4 !important;
    color: var(--nirsha-espresso) !important; margin-bottom: 6px !important;
}
.single-product .related .woocommerce-product--title a,
.single-product .related .woocommerce-loop-product__title a { color: var(--nirsha-espresso) !important; }
.single-product .related .woocommerce-product--title a:hover,
.single-product .related .woocommerce-loop-product__title a:hover { color: var(--nirsha-gold-ink) !important; }
/* Colour and width only. Radius, padding, display, font-size and font-weight
   used to be declared here too — a 6px radius, 10px/16px padding and
   `display:block` that made the related rail the odd one out among the five
   places this same card CTA appears. Those four properties now belong to the
   single product-card CTA block in section 26; leaving them here would be two
   rules fighting over the same button. */
.single-product .related .woocommerce-add-to-cart a,
.single-product .related .woocommerce-add-to-cart .button,
.single-product .related a.add_to_cart_button {
    background-color: var(--nrs-cta-bg) !important; border-color: var(--nrs-cta-bg) !important; color: var(--nrs-cta-ink) !important;
    width: 100% !important; text-align: center !important;
}
.single-product .related .woocommerce-add-to-cart a:hover,
.single-product .related .woocommerce-add-to-cart .button:hover,
.single-product .related a.add_to_cart_button:hover {
    background-color: var(--nrs-cta-bg-hover) !important; border-color: var(--nrs-cta-bg-hover) !important;
    color: var(--nrs-cta-ink-hover) !important;
}
@media (max-width: 767px) {
    .single-product .related li.product { flex: 0 0 calc(50% - 12px) !important; max-width: 300px !important; }
}
@media (min-width: 480px) and (max-width: 599px) {
    .single-product .related li.product { flex: 0 0 calc(50% - 12px) !important; max-width: 210px !important; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   7. CURRENCY SWITCHER — leave the plugin styles alone; only header sizing
   ═══════════════════════════════════════════════════════════════════════════ */

/* ═══════════════════════════════════════════════════════════════════════════
   8. FOOTER polish (preserves post 30 content + widgets)
   ═══════════════════════════════════════════════════════════════════════════ */
.site-footer-custom {
    background: var(--nirsha-espresso);
    color: rgba(251,247,239,0.75);
}
.site-footer-custom .ct-heading .ct-heading-inner,
.site-footer-custom .ct-heading .heading-title {
    color: var(--nirsha-ivory) !important;
    font-family: var(--nrs-font-display) !important;
    font-weight: 500 !important;
    font-size: 18px !important;
    letter-spacing: 0.01em;
}
.site-footer-custom a { color: rgba(251,247,239,0.75); transition: color .15s ease; }
.site-footer-custom a:hover { color: var(--nirsha-gold); }
.site-footer-custom .ct-navigation-menu ul li a { padding: 4px 0 !important; }
.site-footer-custom .ct-divider { border-color: rgba(251,247,239,0.12) !important; }
.site-footer-custom .ct-contact-info li { color: rgba(251,247,239,0.75); }

/* Footer copyright band bg-image was a demo file — cover with a solid tone */
.site-footer-custom .elementor-element-c05d2ff {
    background-image: none !important;
    background: rgba(0,0,0,0.35) !important;
    border-top: 1px solid rgba(184,137,59,0.20);
    margin-top: 20px;
}
/* Older subscribe module in-footer visual: neutralise Organio demo bg image */
.site-footer-custom .ct-mailchimp-form.style1,
.site-footer-custom .ct-mailchimp-form.style2 {
    background-image: none !important;
    background-color: transparent !important;
}
@media (max-width: 767px) {
    .site-footer-custom .ct-footer-inner > .row { flex-direction: column; }
    .site-footer-custom .ct-footer-inner > .row > [class*="col-"] {
        flex: 0 0 100%; max-width: 100%; margin-bottom: 32px;
    }
}

/* ═══════════════════════════════════════════════════════════════════════════
   9. SAFETY NETS — mobile ATC visibility, overflow, breadcrumb
   ═══════════════════════════════════════════════════════════════════════════ */

/* Mobile ATC — Organio hides ATC at rest (hover-only). Show it on touch. */
@media (max-width: 991px) {
    /* The 54px reserve below the card body existed to hold an ABSOLUTELY
       positioned hover-reveal add-to-cart. That button was returned to normal
       flow (see section 12.6), so the reserve became dead space -- 112px of
       blank card below the CTA at 375px. Removed; the card now sizes to its
       content. */
    .single-product .related .woocommerce-add-to-cart {
        bottom: 4px !important; opacity: 1 !important; visibility: visible !important;
    }
}

/* Overflow safety */
body { overflow-x: hidden; }
.elementor-section.elementor-section-stretched { overflow-x: hidden; }

/* Breadcrumb labels use the site UI font. This rule previously forced
   "Caseicon, Barlow, sans-serif" here on the assumption that the separator glyph
   lived on .breadcrumb-entry -- it does not, it is on li::after, which sets
   font-family: Caseicon itself. Applying an icon font to the LABEL gave every
   Latin character a near-zero advance width, so "Home" measured 10px instead of
   41px and breadcrumbs read "H >> C". Inheriting from .ct-breadcrumb restores
   the text; the separator is untouched. */
.ct-breadcrumb .breadcrumb-entry {
    font-family: inherit;
}

/* =========================================================
   NIRSHA PHASE 10 — FULL-WIDTH LAYOUT / HERO SLIDER / FOOTER
   ========================================================= */

/* ── A. Wide-desktop best-sellers padding fix ─────────────── */
@media (max-width: 1024px) {
    .nrs-bs-head { padding: 0 24px; }
    .elementor-element-nrsbest .nrs-fav { padding: 0 24px; }
}

/* =========================================================
   ELEMENTOR CONTAINER WIDTH OVERRIDE (Phase 10 — Task A)
   Overrides Elementor's default 1140px and Organio's 1190px
   to match the Nirsha 1360px content-width target.
   ========================================================= */
.elementor-section.elementor-section-boxed > .elementor-container,
.elementor .elementor-section.elementor-section-boxed > .elementor-container.elementor-column-gap-default,
.elementor .elementor-section.elementor-section-boxed > .elementor-container.elementor-column-gap-extended {
    max-width: 1360px !important;
}

/* =========================================================
   NIRSHA PREMIUM HERO SLIDER (Phase 10 — Task B)
   Image replacement: edit style="background-image:url(...)"
   on each .nrs-slide div in the Elementor HTML widget (post 2870).
   ========================================================= */

/* ── Wrapper ─────────────────────────────────────────────── */
.elementor-element-nrshero { position: relative; }
.nrs-slider-wrap { position: relative; }
.nrs-slider { position: relative; }

/* ── Pre-init FOUC guard ─────────────────────────────────────
   Before Slick adds .slick-initialized all slides render as raw
   block elements and only partially fill the viewport (white gap
   on the right). Hide every slide except the first so the hero
   looks correct from the very first paint. The moment Slick fires
   it adds .slick-initialized and takes full control, so these
   rules stop applying with zero visual change.                  */
.nrs-slider:not(.slick-initialized) {
    overflow: hidden;
}
.nrs-slider:not(.slick-initialized) .nrs-slide {
    display: none;
}
.nrs-slider:not(.slick-initialized) .nrs-slide:first-child {
    display: block;
    width: 100%;
}

/* ── Slick container overrides ───────────────────────────── */
.nrs-slider .slick-list,
.nrs-slider .slick-track { height: 100%; }

/* ── Individual slide ────────────────────────────────────── */
.nrs-slide {
    min-height: 780px;
    background-size: cover;
    background-position: center center;
    background-repeat: no-repeat;
    display: flex !important;
    align-items: center;
    justify-content: flex-start;
    position: relative;
    overflow: hidden;
}
/* Pin content to left — override .nrs-container's margin:0 auto inside the flex slide */
.nrs-slide > .nrs-slide__content {
    margin-left: 0 !important;
    margin-right: auto !important;
    padding-left: clamp(80px, 8vw, 140px) !important;
    padding-right: 40px !important;
}

/* ── Dark overlay ────────────────────────────────────────── */
/* ── Hero slide image ────────────────────────────────────────
   The hero used to be a CSS background-image, which cannot carry
   a srcset — every phone downloaded the 1920-wide file. It is now
   a real <img> pinned under the overlay with object-fit: cover,
   which reproduces background-size: cover exactly while letting
   the browser pick an appropriately sized source.
   object-position defaults to centre, matching the old
   background-position, and per-slide focus points are set inline. */
/* The wrapper is not decoration. The slide's height comes from min-height, so
   it is not a definite containing block: an absolutely positioned <img> there
   falls back to its intrinsic ratio — too short at 360px, overflowing by 300px
   at 1920px. A non-replaced element stretches to inset:0 and becomes definite,
   and the image then resolves 100%/100% against it. Verified at both widths. */
.nrs-slide__media {
    position: absolute;
    inset: 0;
    z-index: 0;
    overflow: hidden;
    pointer-events: none;
}

/* Selector deliberately includes the element and its parent. Organio ships a
   global `img { max-width:100%; height:auto }`, and a single class is not
   enough to beat it once WordPress also puts real width/height attributes on
   the tag — the image kept collapsing to its intrinsic ratio. */
.nrs-slide__media > img.nrs-slide__img {
    display: block;
    width: 100%;
    height: 100%;
    max-width: none;
    object-fit: cover;
    object-position: center center;
}

.nrs-slide__overlay {
    position: absolute;
    inset: 0;
    z-index: 1;
    /* Warm espresso wash (was a cool green-black). Same readability budget —
       ivory headline on the darkest stop is > 12:1 — but the tint now belongs
       to the cocoa palette rather than fighting it. */
    background: linear-gradient(
        110deg,
        rgba(26, 18, 14, 0.80) 0%,
        rgba(26, 18, 14, 0.44) 55%,
        rgba(26, 18, 14, 0.16) 100%
    );
    pointer-events: none;
}

/* ── Slide content ───────────────────────────────────────── */
.nrs-slide__content {
    position: relative;
    z-index: 2;
    padding-top: 120px;
    padding-bottom: 120px;
    max-width: 680px;
    text-align: left;
}
.nrs-slide__title {
    font-family: var(--nrs-font-display);
    font-size: clamp(42px, 5.4vw, 82px);
    line-height: 1.04;
    color: var(--nirsha-ivory);
    letter-spacing: -0.022em;
    margin: 0 0 22px;
    text-wrap: balance;
    text-align: left;
}
.nrs-slide__desc {
    font-family: var(--nrs-font-body);
    font-size: clamp(15px, 1.3vw, 18px);
    line-height: 1.65;
    color: rgba(251, 247, 239, 0.86);
    margin: 0 0 36px;
    max-width: 540px;
    text-align: left;
}
.nrs-slide__cta { display: flex; gap: 14px; flex-wrap: wrap; justify-content: flex-start; }
/* A cocoa fill is the right brand answer everywhere EXCEPT here: on the dark
   chocolate and sweets slides the button is nearly the same value as the
   photograph behind it, so the CTA loses its shape even though its label is
   perfectly legible. A gold hairline restores the edge without turning the
   button gold — the accent stays a micro-detail. */
.nrs-slide__cta .nrs-btn--primary {
    border: 1.5px solid rgba(184, 137, 59, 0.65);
    box-shadow: 0 6px 20px rgba(26, 18, 14, 0.45);
}
.nrs-slide__cta .nrs-btn--primary:hover { border-color: var(--nirsha-gold); }

/* ── Ghost light button (on dark hero) ───────────────────── */
.nrs-btn--ghost-light {
    background: transparent;
    color: var(--nirsha-ivory);
    border: 2px solid rgba(251, 247, 239, 0.58);
    padding: 13px 28px;
    border-radius: 999px;
    font-family: var(--nrs-font-body);
    font-size: 13px;
    font-weight: 600;
    letter-spacing: 0.05em;
    text-transform: uppercase;
    text-decoration: none;
    display: inline-flex;
    align-items: center;
    transition: background .18s ease, border-color .18s ease, color .18s ease;
}
.nrs-btn--ghost-light:hover {
    background: rgba(184, 137, 59, 0.18);
    border-color: var(--nirsha-gold);
    color: var(--nirsha-ivory);
}

/* ── Slider nav (dots + arrows) ──────────────────────────── */
.nrs-slider-nav {
    position: absolute;
    bottom: 36px;
    left: 0;
    right: 0;
    z-index: 10;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 24px;
    pointer-events: none;
}
.nrs-slider-nav > * { pointer-events: auto; }

/* Dots. The numerals sit directly on the photograph, where the hero wash has
   already faded to ~0.4 — ivory measured 2.5:1 there against a light slide. A
   small espresso pill gives them a ground of their own (worst case 4.6:1) and
   reads as deliberate chrome rather than a patch. */
.nrs-slider-nav .slick-dots {
    position: static;
    display: flex !important;
    gap: 10px;
    list-style: none;
    margin: 0;
    padding: 6px 14px;
    background: rgba(32, 23, 19, 0.72);
    border-radius: 999px;
    backdrop-filter: blur(3px);
}
.nrs-slider-nav .slick-dots li { margin: 0; width: auto; height: auto; }
.nrs-slider-nav .slick-dots li button {
    font-family: var(--nrs-font-body);
    font-size: 11px;
    font-weight: 700;
    letter-spacing: 0.08em;
    /* 0.45 alpha measured 1.0:1 over a light slide. 0.80 clears AA on the pill. */
    color: rgba(251, 247, 239, 0.80);
    background: none;
    border: none;
    padding: 4px 6px 7px;
    cursor: pointer;
    line-height: 1;
    transition: color .2s ease;
    width: auto;
    height: auto;
    position: relative;
}
.nrs-slider-nav .slick-dots li button::before { display: none; }
/* Active slide: full ivory PLUS a gold underline, so which slide you are on is
   not signalled by colour alone. */
.nrs-slider-nav .slick-dots li.slick-active button { color: var(--nirsha-ivory); }
.nrs-slider-nav .slick-dots li.slick-active button::after {
    content: ""; position: absolute; left: 5px; right: 5px; bottom: 0;
    height: 2px; border-radius: 2px; background: var(--nirsha-gold);
}
.nrs-slider-nav .slick-dots li button:hover { color: var(--nirsha-ivory); }

/* Arrow buttons — absolutely positioned over the slides */
.nrs-slider__arrow {
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
    z-index: 10;
    width: 48px;
    height: 48px;
    border-radius: 50%;
    /* Was a translucent WHITE disc, which on a pale slide left an ivory chevron
       at ~1:1 — the arrows were invisible on the light hero images. An espresso
       disc keeps the glyph at 4.6:1 in the worst case. */
    background: rgba(32, 23, 19, 0.62);
    border: 1.5px solid rgba(251, 247, 239, 0.42);
    color: var(--nirsha-ivory);
    display: flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    transition: background .18s ease, border-color .18s ease;
    flex-shrink: 0;
}
/* The arrow SVG carries width="20"/height="20" as presentation attributes, but
   as a flex item Chrome does not use those as its flex base size, so it shrank
   to 0px wide -- the controls rendered as empty circles. An explicit CSS size
   plus flex:none restores the glyph. */
.nrs-slider__arrow svg { width: 20px; height: 20px; flex: none; display: block; }
.nrs-slider__prev { left: 20px; }
.nrs-slider__next { right: 20px; }
.nrs-slider__arrow:hover {
    background: rgba(32, 23, 19, 0.82);
    border-color: var(--nirsha-gold);
    color: var(--nirsha-gold);
}

/* ── Responsive heights — REMOVED (superseded by section 17.1/17.2).
      Held min-height 660/580/540px and a stacked CTA column that pushed the
      mobile hero past 550px. Only the non-conflicting bits are kept here. */
@media (max-width: 767px) {
    .nrs-slide__content { max-width: 100%; }
    .nrs-slider-nav { bottom: 20px; }
}

/* HEADER TRANSPARENCY block removed — header is always solid white, controlled via functions.php wp_head */

/* =========================================================
   PREMIUM FOOTER (Phase 10 — Task D)
   Post 30 — rebuilt via phase10-build-footer.php
   CSS class prefix: .nrs-ft-*
   ========================================================= */

/* ── Footer section wrappers ─────────────────────────────── */
.elementor-element-nrsft-news,
.elementor-element-nrsft-main,
.elementor-element-nrsft-bar {
    padding: 0 !important;
    margin: 0 !important;
}
.elementor-element-nrsft-news .elementor-widget-container,
.elementor-element-nrsft-main .elementor-widget-container,
.elementor-element-nrsft-bar .elementor-widget-container {
    padding: 0 !important;
    margin: 0 !important;
}

/* ── Newsletter band ─────────────────────────────────────── */
/* Newsletter: Deep Cocoa. It is the deliberate warm ribbon between the espresso
   gallery above and the espresso footer below — three dark bands, but two tones,
   so the page still steps rather than flattening into one black tail. */
.nrs-ft-news {
    background:
        radial-gradient(ellipse 65% 85% at 18% 52%, rgba(184,137,59,0.16) 0%, transparent 62%),
        var(--nirsha-cocoa);
    padding: 64px 0;
}
.nrs-ft-news__inner {
    max-width: 1360px;
    margin: 0 auto;
    padding: 0 40px;
    display: flex;
    align-items: center;
    gap: 48px;
}
.nrs-ft-news__text { flex: 0 0 auto; max-width: 500px; }
.nrs-ft-news__heading {
    font-family: var(--nrs-font-display);
    font-size: clamp(26px, 3vw, 38px);
    color: var(--nirsha-ivory);
    margin: 0 0 10px;
    line-height: 1.15;
    letter-spacing: -0.01em;
}
.nrs-ft-news__sub {
    font-size: 15px;
    color: rgba(251, 247, 239, 0.82);
    margin: 0;
    line-height: 1.6;
}

.nrs-ft-news__row { display: flex; gap: 10px; }
.nrs-ft-news__input {
    flex: 1;
    /* Warm light surface on the cocoa band (§17), not a translucent grey. */
    background: rgba(251, 247, 239, 0.94) !important;
    border: 1.5px solid rgba(251, 247, 239, 0.55) !important;
    color: var(--nirsha-espresso) !important;
    padding: 15px 20px !important;
    border-radius: 999px !important;
    font-family: var(--nrs-font-body) !important;
    font-size: 14px !important;
    min-width: 0;
    height: auto !important;
    box-shadow: none !important;
    outline: none;
}
.nrs-ft-news__input::placeholder { color: var(--nrs-muted); }
/* Focus must be unmistakable against a dark band: gold border + gold ring. */
.nrs-ft-news__input:focus {
    background: var(--nirsha-card) !important;
    border-color: var(--nirsha-gold) !important;
    box-shadow: 0 0 0 3px rgba(184,137,59,0.55) !important;
}
.nrs-ft-news__btn {
    background: var(--nirsha-gold) !important;
    color: var(--nirsha-espresso) !important;
    border: none !important;
    padding: 15px 30px !important;
    border-radius: 999px !important;
    font-family: var(--nrs-font-body) !important;
    font-size: 13px !important;
    font-weight: 700 !important;
    letter-spacing: 0.06em !important;
    text-transform: uppercase !important;
    cursor: pointer;
    white-space: nowrap;
    transition: background .18s ease, box-shadow .18s ease;
    box-shadow: 0 4px 18px rgba(184,137,59,0.35);
}
.nrs-ft-news__btn:hover {
    background: var(--nirsha-ivory) !important;
    color: var(--nirsha-espresso) !important;
    box-shadow: 0 6px 24px rgba(251,247,239,0.30) !important;
}
.nrs-ft-news__note { font-size: 12px; color: rgba(251, 247, 239, 0.62); margin: 10px 0 0; }

/* ── Main footer body ─────────────────────────────────────── */
.nrs-ft-main {
    background: var(--nirsha-espresso);
    padding: 72px 0 52px;
}
/* Box only. Columns are declared once, in the R.13 footer ladder. */
.nrs-ft-main__inner {
    max-width: 1360px;
    margin: 0 auto;
    padding: 0 40px;
}
/* Footer mark: the approved footer artwork is horizontal (2172x724, 3:1) with a
   transparent ground, so it sits directly on the dark band. 56px tall renders
   it 168px wide, which fits the brand column at every tier (300px at 1440,
   324px full-width on a 360px phone). Full opacity — the file is already
   tuned for a dark background, and dimming it would alter the approved art. */
.nrs-ft-logo img {
    max-height: 96px;
    width: auto;
    height: auto;
    object-fit: contain;
    filter: none;
    opacity: 1;
    margin-bottom: 20px;
    display: block;
}
.nrs-ft-desc {
    font-size: 14px;
    line-height: 1.7;
    /* was 0.58 alpha = 6.3:1; 0.68 keeps the quiet tone and clears AA solidly */
    color: rgba(251, 247, 239, 0.68);
    margin: 0 0 24px;
    max-width: 280px;
}
.nrs-ft-social { display: flex; gap: 14px; }
.nrs-ft-social a {
    width: 36px;
    height: 36px;
    border-radius: 50%;
    border: 1px solid rgba(251, 247, 239, 0.20);
    display: flex;
    align-items: center;
    justify-content: center;
    color: rgba(251, 247, 239, 0.62);
    text-decoration: none;
    transition: border-color .18s, color .18s;
}
.nrs-ft-social a:hover { border-color: var(--nirsha-gold); color: var(--nirsha-gold); }

.nrs-ft-col ul li a {
    font-size: 14px;
    color: rgba(251, 247, 239, 0.72);
    text-decoration: none;
    transition: color .15s ease;
}
.nrs-ft-col ul li a:hover { color: var(--nirsha-gold); }
.nrs-ft-contact-item { display: flex; align-items: flex-start; gap: 10px; margin-bottom: 16px; }
.nrs-ft-contact-item svg { flex-shrink: 0; margin-top: 2px; color: var(--nirsha-gold); }
.nrs-ft-contact-item p { margin: 0; font-size: 14px; color: rgba(251, 247, 239, 0.72); line-height: 1.5; }
.nrs-ft-contact-item strong { display: block; font-size: 12px; letter-spacing: 0.08em; text-transform: uppercase; color: rgba(251, 247, 239, 0.48); margin-bottom: 3px; }
.nrs-ft-contact-item a { color: rgba(251, 247, 239, 0.72); text-decoration: none; }
.nrs-ft-contact-item a:hover { color: var(--nirsha-gold); }

/* ── Footer bottom bar ────────────────────────────────────── */
.nrs-ft-bar {
    /* One step below the espresso footer body so the legal bar still separates. */
    background: #17100D;
    /* Restrained gold hairline. */
    border-top: 1px solid rgba(184,137,59,0.24);
    padding: 22px 0;
}
.nrs-ft-bar__inner {
    max-width: 1360px;
    margin: 0 auto;
    padding: 0 40px;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 16px;
    flex-wrap: wrap;
}
/* 0.38 alpha measured 3.3:1 — below AA for 13px text. 0.62 keeps the bar quiet
   and clears 7:1. */
.nrs-ft-bar__copy {
    font-size: 13px;
    color: rgba(251, 247, 239, 0.62);
    margin: 0;
}
/* wrap, not nowrap: six legal links across a 390px phone ran past the viewport
   and "Return & Refund Policy" was clipped by the page's overflow guard — the
   link was there, just unreadable and half off-screen. */
.nrs-ft-bar__links { display: flex; gap: 20px; flex-wrap: wrap; }
.nrs-ft-bar__links a {
    font-size: 13px;
    color: rgba(251, 247, 239, 0.62);
    text-decoration: none;
    transition: color .15s ease;
}
.nrs-ft-bar__links a:hover { color: var(--nirsha-gold); }

/* Footer responsive lives in ONE place — the R.13 ladder near the end of this
   file. The Phase-10 block that used to sit here (1024 / 767 / 480 queries with
   a 1fr-1fr grid) was superseded and has been deleted, not layered over. */

/* =========================================================
   NIRSHA PHASE 11 — VISUAL POLISH
   Section-by-section refinements, wide-desktop breathing room,
   text-wrap consistency, and gallery / hero enhancements.
   ========================================================= */

/* ── Wider vertical rhythm at 1440px+ ────────────────────── */
@media (min-width: 1440px) {
    /* 96px, not 100 — keeps the whole ladder inside the 80–96px desktop brief. */
    :root { --nrs-section-y: 96px; }
}

/* ── Hero: more dramatic height at wide viewports ─────────── */
@media (min-width: 1280px) {
    .nrs-slide { min-height: 820px; }
}
@media (min-width: 1600px) {
    .nrs-slide { min-height: 880px; }
    .home .nrs-slide__content { padding-top: 240px !important; }
}

/* ── text-wrap: balance on all display headings ───────────── */
.nrs-slide__title,
.nrs-cat__title,
.nrs-promo__title,
.nrs-coll__title,
.nrs-pillar__title,
.nrs-promise__title {
    text-wrap: balance;
}

/* ── Category: richer loading placeholder ─────────────────── */
.nrs-cat__media {
    background: linear-gradient(135deg, var(--nirsha-border) 0%, var(--nrs-cream-2) 100%);
}

/* ── Category first-card title: larger on wide desktop ───── */
@media (min-width: 1280px) {
    .nrs-cats__grid .nrs-cat:nth-child(1) .nrs-cat__title { font-size: 38px; }
    .nrs-cats__grid .nrs-cat:nth-child(1) .nrs-cat__body { padding: 28px 30px 26px; }
}

/* ── Promo: larger title at 1280px+ ──────────────────────── */
@media (min-width: 1280px) {
    .nrs-promo__title { font-size: 36px; }
    .nrs-promo__content { padding: 40px 48px; }
}

/* ── Gallery: taller cells at 1280px+ ────────────────────── */

/* ── Gallery: card shadow on hover ──────────────────────── */
.nrs-gallery__item:hover {
    box-shadow: var(--nrs-shadow-lg);
    transform: translateY(-3px);
}

/* ── Collection: max-width for grid on ultra-wide ───────── */
@media (min-width: 1440px) {
    .nrs-coll__grid { gap: 22px; }
    .nrs-coll__body { padding: 22px 26px 26px; }
}

/* ── Logo filter transition: smooth header scroll ─────────── */
.home #page #ct-masthead .ct-header-branding-inner img {
    transition: filter .25s ease;
}

/* ── Why section: wider grid on large desktop ─────────────── */
@media (min-width: 1280px) {
    .nrs-why__grid { max-width: 1360px; gap: 28px; }
}
@media (min-width: 1440px) {
    .nrs-promise__grid { max-width: 1360px; gap: 28px; }
}

/* ── Best sellers: card image area gradient for transparency ─ */
.elementor-element-nrsbest li.product .woocommerce-product-header {
    background: linear-gradient(160deg, var(--nrs-cream) 0%, var(--nrs-cream-2) 100%) !important;
}

/* ── Trust strip: icon accent ring — the one gold touch in this band ─────── */
.nrs-trust__icon {
    box-shadow: 0 0 0 3px rgba(184, 137, 59, 0.20);
}

/* =========================================================
   NIRSHA PHASE 11.2 — FULL-WIDTH RESPONSIVE CONTENT SYSTEM
   Root causes fixed:
   a) Hero slider confined to 1360px column — made full-viewport
   b) Header Bootstrap .container at 1200px vs sections at 1360px
   c) Section content stays 1360px at ≥1600px — progressive widening
   ========================================================= */

/* ── a. Hero slider: full-bleed background across the viewport ──────
   The hero uses elementor-section-boxed which caps its inner container
   at 1360px. This override lifts that cap so the slide background-image
   fills the entire stretched section (= full viewport width).
   Uses .home prefix for specificity (0,5,0) to beat the ≥1600px
   widening rule (0,4,0) that would otherwise cap the hero at 1520px. */
.home .elementor-element-nrshero.elementor-section.elementor-section-boxed > .elementor-container {
    max-width: 100% !important;
    padding:   0    !important;
}

/* ── b. Header: align Organio Bootstrap container to section width ───
   At ≥1200px Organio caps .container at 1200px inside the masthead,
   placing the logo and nav 113px from viewport edges while section
   content sits at 33px. Aligning both to 1360px removes the gap. */
@media (min-width: 1200px) {
    #ct-masthead .container { max-width: 1360px; }
}

/* ── c. Large desktop ≥1600px: widen content to 1520px ──────────────
   At 1600px the viewport is ~1585px; 1360px containers leave ~112px
   blank on each side. 1520px reduces this to ~33px — same proportional
   gutter as 1440px. */
@media (min-width: 1600px) {
    /* Elementor inner containers — homepage stretched sections only */
    .home .elementor-section-stretched.elementor-section-boxed > .elementor-container {
        max-width: 1520px !important;
    }
    /* Newsletter section has its own !important-guarded container */
    .elementor-element-nrsnews > .elementor-container {
        max-width: 1520px !important;
        padding:   0 60px !important;
    }
    /* Custom inline containers */
    .nrs-container   { max-width: 1520px; }
    .nrs-slide__content { max-width: 680px; }   /* hero text stays narrow */
    /* Best sellers section — column-gap-default container needs (0,6,0) to beat the (0,5,0) global rule */
    .home .elementor .elementor-element-nrsbest.elementor-section-boxed > .elementor-container.elementor-column-gap-default {
        max-width: 1520px !important;
    }
    .nrs-bs-head { max-width: 1520px; padding: 0 48px; }
    .elementor-element-nrsbest .nrs-fav { max-width: 1520px; padding: 0 48px; }
    /* Why and Promise pillar grids */
    .nrs-why__grid     { max-width: 1480px; }
    .nrs-promise__grid { max-width: 1480px; }
    /* Header */
    #ct-masthead .container { max-width: 1520px; }
}

/* ── d. Extra-large ≥1800px: widen to 1720px ────────────────────────
   At 1920px viewport (1905px clientWidth) 1720px content leaves ~93px
   per side — comfortable gutter at ultrawide without feeling narrow. */
@media (min-width: 1800px) {
    .home .elementor-section-stretched.elementor-section-boxed > .elementor-container {
        max-width: 1720px !important;
    }
    .elementor-element-nrsnews > .elementor-container {
        max-width: 1720px !important;
        padding:   0 80px !important;
    }
    .nrs-container   { max-width: 1720px; }
    .nrs-slide__content { max-width: 700px; }
    /* Best sellers section — (0,6,0) override for ≥1800px */
    .home .elementor .elementor-element-nrsbest.elementor-section-boxed > .elementor-container.elementor-column-gap-default {
        max-width: 1720px !important;
    }
    .nrs-bs-head { max-width: 1720px; padding: 0 60px; }
    .elementor-element-nrsbest .nrs-fav { max-width: 1720px; padding: 0 60px; }
    .nrs-why__grid     { max-width: 1680px; }
    .nrs-promise__grid { max-width: 1680px; }
    #ct-masthead .container { max-width: 1720px; }
}

/* =========================================================
   HEADER POLISH — Phase 11.3
   - Hide empty 24/7 Support (no phone number configured)
   - Compact top row once support item is removed
   - Clean Shop Now button to brand green
   - Badge counters: orange → brand green
   - Icon + link colors in transparent-header state
   ========================================================= */

/* 1. Hide 24/7 Support item — no phone number is set */
.ct-header-info { display: none !important; }

/* 2. Compact the top row now that only logo + button remain */
#ct-header-middle { padding-top: 6px !important; padding-bottom: 6px !important; }
#ct-header-middle .row { min-height: 48px !important; align-items: center !important; }

/* 3. Shop Now button — consistent brand styling */
.ct-header-button .btn.btn-gradient,
.ct-header-button .btn.btn-gradient:visited {
    background: var(--nirsha-cocoa) !important;
    border-color: var(--nirsha-cocoa) !important;
    color: var(--nirsha-ivory) !important;
    font-size: 13px !important;
    font-weight: 600 !important;
    padding: 9px 24px !important;
    border-radius: 6px !important;
    letter-spacing: 0.03em !important;
    text-transform: none !important;
    transition: background 0.2s, border-color 0.2s !important;
    box-shadow: none !important;
}
.ct-header-button .btn.btn-gradient:hover {
    background: var(--nirsha-gold) !important;
    border-color: var(--nirsha-gold) !important;
    color: var(--nirsha-espresso) !important;
}

/* 4. Cart + wishlist badge counters — cocoa, so they read as brand chrome
      rather than as a status. Ivory numeral on cocoa is 13.5:1. */
.wishlist-count,
.widget_cart_counter {
    background: var(--nirsha-cocoa) !important;
    color: var(--nirsha-ivory) !important;
}

/* Currency switcher styles removed in Phase 4 — INR is the base currency
   and the switcher no longer renders. See nirsha-currency plugin. */

/* 5. Compact top-row logo — organio-theme-inline-css uses (1,1,2)+!important; two IDs gives (2,1,2) */
#ct-header-wrap #ct-header-middle .ct-header-branding a img {
    max-height: 55px !important;
    height: auto !important;
    width: auto !important;
}

/* 6. Shop Now button: white outline style on transparent hero header */
.home #page #ct-masthead:not(.nrs-header--scrolled) .ct-header-button .btn.btn-gradient {
    background: transparent !important;
    border: 2px solid rgba(255,255,255,0.75) !important;
    color: #fff !important;
}
.home #page #ct-masthead:not(.nrs-header--scrolled) .ct-header-button .btn.btn-gradient:hover {
    background: rgba(255,255,255,0.15) !important;
    border-color: #fff !important;
}

/* 7. Scrolled: restore the solid cocoa Shop Now */
.home #page #ct-masthead.nrs-header--scrolled .ct-header-button .btn.btn-gradient {
    background: var(--nirsha-cocoa) !important;
    border-color: var(--nirsha-cocoa) !important;
    color: var(--nirsha-ivory) !important;
}

/* ═══════════════════════════════════════════════════════════════════════════
   PHASE 12 — LAYOUT FOUNDATION & DESIGN-SYSTEM CONSOLIDATION (v11.0.0)
   ---------------------------------------------------------------------------
   Root cause fixed here: Elementor's stretch-section JS mis-measures inside the
   parent theme's 1200px Bootstrap container and writes `width:0; left:-15px`
   inline onto every stretched section (12 of 13 were collapsed, footer included).
   Everything below replaces that JS race with deterministic CSS.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── 12.1 Full-bleed stretched sections ──────────────────────────────────────
   `--nrs-vw` is set from JS to documentElement.clientWidth, i.e. the viewport
   MINUS the scrollbar. Using it instead of raw 100vw is what prevents the
   classic scrollbar-induced horizontal overflow. 100vw is the no-JS fallback.
   The !important beats Elementor's inline style without needing to unset it. */
.elementor-section.elementor-section-stretched {
    position: relative !important;
    width: var(--nrs-vw, 100vw) !important;
    max-width: var(--nrs-vw, 100vw) !important;
    left: 50% !important;
    right: auto !important;
    margin-left: calc(var(--nrs-vw, 100vw) / -2) !important;
    margin-right: 0 !important;
}

/* Inner container of a stretched section must fill it, then re-constrain via
   .nrs-container so text still sits on the design grid. */
.elementor-section.elementor-section-stretched > .elementor-container {
    max-width: 100% !important;
    width: 100% !important;
}

/* ── 12.2 Kill the dead side gutters from the parent Bootstrap container ─────
   The Organio container caps page content at 1200px. On the Elementor-built
   pages we want the shell to span the viewport and let .nrs-container do the
   measuring, so full-bleed bands (hero, dark collection band, gallery, footer)
   actually reach the screen edges.
   Organio nests: .container (max-width 1200, padding 15) > .row (margin -15)
   > .content-area.col-12 (padding 15). Zeroing only the container padding leaves
   the row's negative margins uncancelled and pushes content 30px past the
   viewport, so all three levels must be neutralised together. */
body.elementor-page .container.content-container {
    max-width: 100% !important;
    padding-left: 0 !important;
    padding-right: 0 !important;
}
body.elementor-page .container.content-container > .row.content-row {
    margin-left: 0 !important;
    margin-right: 0 !important;
}
body.elementor-page .content-area.content-full-width {
    padding-left: 0 !important;
    padding-right: 0 !important;
}

/* ── 12.3 Horizontal-overflow safety net ─────────────────────────────────────
   Applied to <html> ONLY, never <body>. Setting overflow-x on body forces its
   overflow-y to compute to `auto`, which promotes body to a scroll container
   with its own height — that breaks window scrolling, so lazy images below the
   fold never load and IntersectionObserver reveals never fire. */
html { overflow-x: clip; }
body { max-width: 100%; }

/* ── 12.4 Typography enforcement ─────────────────────────────────────────────
   Organio ships heading rules with !important, which silently beat every
   `font-family: var(--nrs-font-display)` declaration in this file. Rather than
   sprinkle !important through 12 component rules, the tokens are re-asserted
   once here, scoped to the .nrs-* design system so WooCommerce and parent-theme
   chrome keep their own typography. */
.nrs-title,
.nrs-slide__title,
.nrs-cat__title,
.nrs-coll__title,
.nrs-promo__title,
.nrs-why__title,
.nrs-about__title,
.nrs-promise__title,
.nrs-ft__brandname {
    font-family: var(--nrs-font-display) !important;
    font-weight: 600;
    letter-spacing: -0.015em;
    text-wrap: balance;
}

.nrs-eyebrow,
.nrs-lead,
.nrs-cat__desc,
.nrs-coll__desc,
.nrs-btn,
.nrs-cat__link,
.nrs-coll__link {
    font-family: var(--nrs-font-body) !important;
}

/* Lead paragraphs: comfortable measure so they never run edge to edge */
.nrs-lead { max-width: 62ch; margin-left: auto; margin-right: auto; }

/* ── 12.5 Mobile & tablet UX ─────────────────────────────────────────────────
   Audited at 375 / 768 / 1024px. Three classes of defect were found:
   single-column grids wasting horizontal space, sub-44px tap targets, and
   sub-12.5px body copy. Each is addressed below. */

/* 12.5a Container gutters scale down with the viewport */

/* 12.5b Category grid mobile rules — REMOVED. The live grid is
   .nrs-cats__grid--six and is handled once in section 14.1, which already
   defines the 2-up phone layout and its title sizes. Keeping both meant two
   rule sets competing for the same component. */

/* 12.5c Collection cards: 2-up on phones rather than a long single stack */

/* 12.5d Tap targets — WCAG 2.5.8 minimum 44px.
   Slider dots and the wishlist / quick-view icons were 12–30px. */

/* 12.5e Legibility — no body copy below 12.5px on small screens */

/* 12.5f Hero: readable proportions on phones */

/* 12.5f-2 Footer newsletter — the text block was `flex: 0 0 auto; max-width:500px`
   so it refused to shrink, squeezing the form to 191px at 768px and collapsing
   the email input to 42px while the button overflowed the viewport. */
.nrs-ft-news__text { flex: 1 1 auto !important; min-width: 0; }
.nrs-ft-news__form { flex: 1 1 340px !important; min-width: 0; }
.nrs-ft-news__input { min-width: 0; }
.nrs-ft-news__btn { flex: 0 0 auto; white-space: nowrap; }

@media (max-width: 991px) {
    .nrs-ft-news__inner {
        flex-direction: column;
        align-items: flex-start;
        gap: 24px;
        padding-left: 24px; padding-right: 24px;
    }
    .nrs-ft-news__text { max-width: 100% !important; }
    .nrs-ft-news__form { width: 100%; flex: 1 1 100% !important; }
}

/* 12.5g Tablet (768–1024): the range that felt most unfinished.
   Give the category and gallery grids a deliberate 3-up rhythm. */

/* ═══════════════════════════════════════════════════════════════════════════
   12.6 WOOCOMMERCE LAYOUT — shop, product, cart, checkout, account
   ---------------------------------------------------------------------------
   WooCommerce pages are NOT elementor-page, so they never received the layout
   work above and stayed capped at the parent theme's 1200px (226px of dead
   gutter at 1440px). They are widened to the same measure as the design system
   and the product loop is moved from margin-spaced flex to grid so gutters are
   even and column counts are deliberate at every breakpoint.
   ═══════════════════════════════════════════════════════════════════════════ */

/* 12.6a Match Woo page width to the .nrs-container measure */
.woocommerce .container.content-container,
.woocommerce-page .container.content-container {
    max-width: 1440px !important;
    padding-left: 40px !important;
    padding-right: 40px !important;
}
@media (max-width: 991px) {
    .woocommerce .container.content-container,
    .woocommerce-page .container.content-container {
        padding-left: 24px !important; padding-right: 24px !important;
    }
}
@media (max-width: 767px) {
    .woocommerce .container.content-container,
    .woocommerce-page .container.content-container {
        padding-left: 18px !important; padding-right: 18px !important;
    }
}

/* 12.6b Product loop → CSS grid with even gutters.
   Excludes the single-product related/upsell rails, which keep their own
   flex layout defined earlier in this file. */
.woocommerce:not(.single-product) ul.products,
.woocommerce-page:not(.single-product) ul.products {
    display: grid !important;
    grid-template-columns: repeat(4, minmax(0, 1fr)) !important;
    gap: 28px !important;
    margin: 0 0 40px !important;
    padding: 0 !important;
    list-style: none;
}
.woocommerce:not(.single-product) ul.products::before,
.woocommerce:not(.single-product) ul.products::after,
.woocommerce-page:not(.single-product) ul.products::before,
.woocommerce-page:not(.single-product) ul.products::after { display: none !important; }

.woocommerce:not(.single-product) ul.products li.product,
.woocommerce-page:not(.single-product) ul.products li.product {
    width: 100% !important;
    max-width: 100% !important;
    margin: 0 !important;
    float: none !important;
    clear: none !important;
    display: flex !important;
    flex-direction: column;
}
/* Card body stretches so CTAs align across a row regardless of title length */
.woocommerce:not(.single-product) ul.products li.product .woocommerce-product-inner,
.woocommerce-page:not(.single-product) ul.products li.product .woocommerce-product-inner {
    display: flex; flex-direction: column; height: 100%;
}

/* Organio frames every product card TWICE, and neither frame sets a border
   width: .woocommerce-product-inner gets `border-color: rgba(255,120,0,.32)` (the
   orange line) and its ::before draws a second 2px inset frame inheriting that
   colour. With no width declared the border falls back to `medium` = 3px, and a
   UA-level `:where([style*="border-color"])` rule supplies border-style:solid.
   Products still carrying Organio's demo `line_color` post meta additionally get
   an INLINE border-color (rgba(69,9,9,1)) which repaints both frames dark maroon.
   Zeroing width+style here kills every variant at once no matter which layer
   supplies the colour -- including the inline one, which only sets colour and so
   cannot resurrect a border that has no width. Organio's card shadow is kept. */
.woocommerce-product-inner,
.woocommerce .woocommerce-product-inner,
.woocommerce-page .woocommerce-product-inner { border: 0; }
.woocommerce-product-inner::before,
.woocommerce .woocommerce-product-inner::before,
.woocommerce-page .woocommerce-product-inner::before { border: 0; }

/* Sidebar present → 3 columns; the loop still fills its column evenly */
.woocommerce .content-has-sidebar ul.products,
.woocommerce-page .content-has-sidebar ul.products {
    grid-template-columns: repeat(3, minmax(0, 1fr)) !important;
}

/* 12.6c Deliberate column counts per breakpoint */
@media (max-width: 1199px) {
    .woocommerce:not(.single-product) ul.products,
    .woocommerce-page:not(.single-product) ul.products,
    .woocommerce .content-has-sidebar ul.products,
    .woocommerce-page .content-has-sidebar ul.products {
        grid-template-columns: repeat(3, minmax(0, 1fr)) !important;
        gap: 22px !important;
    }
}
@media (max-width: 1024px) {
    .woocommerce:not(.single-product) ul.products,
    .woocommerce-page:not(.single-product) ul.products,
    .woocommerce .content-has-sidebar ul.products,
    .woocommerce-page .content-has-sidebar ul.products {
        grid-template-columns: repeat(2, minmax(0, 1fr)) !important;
        gap: 18px !important;
    }
    /* Cap the card: two tracks of a 1024px viewport are ~463px each, which
       rendered a 427px product image and a 585px-tall card. */
    .woocommerce:not(.single-product) ul.products li.product,
    .woocommerce-page:not(.single-product) ul.products li.product {
        max-width: 400px !important; justify-self: center;
    }
    /* Sidebar drops below the products on tablet rather than squeezing them */
    .woocommerce .content-area.content-has-sidebar,
    .woocommerce-page .content-area.content-has-sidebar { width: 100% !important; max-width: 100% !important; flex: 0 0 100% !important; }
    .woocommerce .widget-area, .woocommerce-page .widget-area { width: 100% !important; max-width: 100% !important; flex: 0 0 100% !important; margin-top: 40px; }
}
/* Phone: ONE product per row. Two columns left a 182px card holding a 152px
   image, a 3-line title and a 128px CTA -- unreadable and unsellable. A single
   centred card gives the packaging its full width. */
@media (max-width: 767px) {
    .woocommerce:not(.single-product) ul.products,
    .woocommerce-page:not(.single-product) ul.products,
    .woocommerce .content-has-sidebar ul.products,
    .woocommerce-page .content-has-sidebar ul.products {
        grid-template-columns: minmax(0, 1fr) !important;
        gap: 20px !important;
        justify-items: center;
    }
    .woocommerce:not(.single-product) ul.products li.product,
    .woocommerce-page:not(.single-product) ul.products li.product {
        width: 100% !important; max-width: 400px !important; margin-inline: auto !important;
    }
}

/* 12.6d Cart / Checkout / Account — readable measure + consistent controls */
.woocommerce-cart .woocommerce,
.woocommerce-checkout .woocommerce,
.woocommerce-account .woocommerce { font-family: var(--nrs-font-body); }

.woocommerce table.shop_table {
    border-radius: var(--nrs-radius);
    border-color: var(--nrs-line);
    overflow: hidden;
}
.woocommerce table.shop_table th { font-weight: 600; color: var(--nrs-ink); }

/* Form controls: one consistent style across cart, checkout and account */
.woocommerce form .form-row input.input-text,
.woocommerce form .form-row textarea,
.woocommerce form .form-row select,
.woocommerce-account input.input-text,
.select2-container .select2-selection--single {
    border: 1px solid var(--nrs-line) !important;
    border-radius: var(--nrs-radius-sm) !important;
    padding: 12px 14px !important;
    min-height: 48px !important;
    font-family: var(--nrs-font-body);
    font-size: 15px;
    color: var(--nirsha-espresso);
    background: var(--nirsha-card);
    transition: border-color .18s ease, box-shadow .18s ease;
}
/* Focus: gold border (3.1:1 against the card surface, so it qualifies as a
   non-text indicator) plus a cocoa ring, so the state survives even where the
   gold sits against a warmer band. */
.woocommerce form .form-row input.input-text:focus,
.woocommerce form .form-row textarea:focus,
.woocommerce form .form-row select:focus,
.woocommerce-account input.input-text:focus,
.select2-container--focus .select2-selection--single {
    border-color: var(--nirsha-gold) !important;
    box-shadow: 0 0 0 3px rgba(59,36,27,0.22) !important;
    outline: none;
}
/* Visible keyboard focus everywhere (was missing). Cocoa is 13.5:1 on ivory;
   the offset puts the ring on the page ground, so it stays visible even around
   a cocoa button. Dark bands override this to gold further down (§37). */
.woocommerce a:focus-visible,
.woocommerce button:focus-visible,
.nrs-btn:focus-visible,
.nrs-cat:focus-visible,
.nrs-coll__card:focus-visible {
    outline: 3px solid var(--nrs-focus);
    outline-offset: 2px;
    border-radius: var(--nrs-radius-sm);
}
/* Inside the dark bands the cocoa ring would disappear — use gold there. */
.nrs-coll a:focus-visible,
.nrs-coll__card:focus-visible,
.nrs-gallery a:focus-visible,
.nrs-ft-news a:focus-visible,
.nrs-ft-news button:focus-visible,
.nrs-ft-main a:focus-visible,
.nrs-ft-bar a:focus-visible,
.nrs-slide a:focus-visible,
.nrs-slider__arrow:focus-visible,
.nrs-slider-nav button:focus-visible {
    outline: 3px solid var(--nirsha-gold);
    outline-offset: 3px;
}

/* Checkout column layout.
   The 2-track grid that used to sit here put Billing Details in the RIGHT track
   and "Ship to a different address?" plus the order notes in the LEFT one —
   measured at 1440px: .col-1 at x=389, .col-2 at x=40 — with an empty gutter
   beside them. Organio already lays #customer_details out as a 50%-wide column
   with .col-1 and .col-2 STACKED inside it, next to the order review; forcing a
   grid on top of that fought the theme and reversed the reading order.
   The width/float reset is kept (it is what stops Woo's own floats leaking);
   the grid is not. */
@media (min-width: 992px) {
    .woocommerce-checkout .col2-set { display: block; }
    .woocommerce-checkout .col2-set .col-1,
    .woocommerce-checkout .col2-set .col-2 { width: 100% !important; float: none !important; }
    .woocommerce-checkout .col2-set .col-1 { margin-bottom: 8px; }
}
@media (max-width: 991px) {
    .woocommerce-checkout .col2-set .col-1,
    .woocommerce-checkout .col2-set .col-2 { width: 100% !important; float: none !important; }
    .woocommerce table.shop_table_responsive tr td { text-align: right; }
}

/* Cart totals / order review card treatment */
/* Sand, not ivory: the page ground IS ivory now, so an ivory panel would have
   lost its edge against it. */
.woocommerce .cart_totals,
.woocommerce-checkout #order_review {
    background: var(--nirsha-sand);
    border: 1px solid var(--nrs-line);
    border-radius: var(--nrs-radius);
    padding: 24px;
}

/* Account dashboard navigation as a proper sidebar list */
.woocommerce-account .woocommerce-MyAccount-navigation ul { list-style: none; margin: 0; padding: 0; }
.woocommerce-account .woocommerce-MyAccount-navigation li a {
    display: block; padding: 12px 16px; border-radius: var(--nrs-radius-sm);
    color: var(--nrs-ink); font-weight: 500; transition: background .18s ease, color .18s ease;
}
/* Active account page = solid cocoa, so "where am I" is unmistakable; hover is
   the softer sand tint so the two states never look alike (§25). */
.woocommerce-account .woocommerce-MyAccount-navigation li a:hover {
    background: var(--nirsha-sand); color: var(--nirsha-cocoa);
}
.woocommerce-account .woocommerce-MyAccount-navigation li.is-active a {
    background: var(--nirsha-cocoa); color: var(--nirsha-ivory); font-weight: 600;
}
/* Logout is a plain exit, not a destructive action and not a brand CTA — it
   stays neutral so it can never be confused with the active page. */
.woocommerce-account .woocommerce-MyAccount-navigation li.woocommerce-MyAccount-navigation-link--customer-logout a {
    color: var(--nrs-muted);
}
.woocommerce-account .woocommerce-MyAccount-navigation li.woocommerce-MyAccount-navigation-link--customer-logout a:hover {
    background: var(--nirsha-sand); color: var(--nirsha-espresso);
}

/* 12.6e Mobile: stop Woo tables scrolling the page sideways */
@media (max-width: 767px) {
    .woocommerce table.shop_table { display: block; overflow-x: auto; }
    .woocommerce .quantity input.qty { min-height: 44px; }
    .woocommerce #respond input#submit,
    .woocommerce a.button, .woocommerce button.button {
        min-height: 46px; display: inline-flex; align-items: center; justify-content: center;
    }
}

/* ═══════════════════════════════════════════════════════════════════════════
   PHASE 13 — VISUAL POLISH (v11.2.0)
   Measured-defect fixes only; no structural or functional change.
   ═══════════════════════════════════════════════════════════════════════════ */

/* 13.1 Button scale.
   Primary CTAs measured 43px tall with mismatched 13px/14px labels between the
   solid and ghost variants. Premium storefront CTAs sit at 48–52px, and the two
   variants must share one type size or the hero pair looks misaligned. */
.nrs-btn {
    padding: 16px 30px;
    font-size: 14px;
    letter-spacing: 0.045em;
}
.nrs-btn--ghost-light {
    padding: 15px 30px;   /* 1px less: its 2px border makes up the difference */
    font-size: 14px;
    letter-spacing: 0.045em;
}
/* Hero CTA pair: equal optical weight, comfortable separation */
.nrs-slide__cta { gap: 14px; }

/* 13.2 Card description legibility.
   Category card descriptions rendered at 13px — under the 14px floor used
   everywhere else in the system, which made the cards read as unfinished. */
.nrs-cat__desc { font-size: 14px; line-height: 1.45; }
.nrs-coll__desc { font-size: 14px; line-height: 1.5; }

/* 13.3 Eyebrow: slightly larger and less cramped at desktop */
@media (min-width: 992px) {
    .nrs-eyebrow { font-size: 12.5px; letter-spacing: 0.14em; }
}

/* 13.4 Gallery responsive ladder.
   The 3-column rule stopped at 991px, so 992–1024px (iPad landscape) fell back
   to the 4-column desktop grid at ~240px cells — denser than the layout used at
   a *smaller* width. Extending the 3-column band to 1024px makes the ladder
   monotonic: 4 cols ≥1025, 3 cols 600–1024, 2 cols below. */
@media (max-width: 1024px) {
    .nrs-gallery__grid {
        grid-template-columns: repeat(3, 1fr);
        grid-auto-rows: 180px;
    }
}

/* ═══════════════════════════════════════════════════════════════════════════
   PHASE 14 — HOMEPAGE UPGRADE (v12.0.0)
   6-category mosaic · Combo Packs section · header polish · adaptive best-sellers
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── 14.1 Shop by Category — six-tile editorial mosaic ───────────────────────
   The five-tile rule set above assumes 2 rows; the six-tile variant uses a
   3-row composition: one tall feature, two stacked beside it, three across
   the base. Declared as a modifier so the original 5-tile layout still works. */
.nrs-cats__grid--six {
    grid-template-columns: repeat(6, 1fr);
    grid-template-rows: 215px 215px 215px;
    gap: 16px;
}
.nrs-cats__grid--six .nrs-cat:nth-child(1) { grid-column: 1 / 4; grid-row: 1 / 3; }
.nrs-cats__grid--six .nrs-cat:nth-child(2) { grid-column: 4 / 7; grid-row: 1 / 2; }
.nrs-cats__grid--six .nrs-cat:nth-child(3) { grid-column: 4 / 7; grid-row: 2 / 3; }
.nrs-cats__grid--six .nrs-cat:nth-child(4) { grid-column: 1 / 3; grid-row: 3 / 4; min-height: 0; }
.nrs-cats__grid--six .nrs-cat:nth-child(5) { grid-column: 3 / 5; grid-row: 3 / 4; min-height: 0; }
.nrs-cats__grid--six .nrs-cat:nth-child(6) { grid-column: 5 / 7; grid-row: 3 / 4; min-height: 0; }

/* Feature tile earns a larger title; the rest step down for clear hierarchy */
.nrs-cats__grid--six .nrs-cat:nth-child(1) .nrs-cat__title { font-size: 32px; }

/* Tablet: two columns, feature spans the top */

/* ── 14.2 Combo Packs ───────────────────────────────────────────────────────
   A commercial band, visually distinct from the cream category section above
   it so the two don't blur together while scrolling. */
/* Soft Sand — the gifting band (§10). Deliberately NOT a cocoa field: cocoa is
   already carrying Special Selection further down, and two large dark bands in
   the upper half would swamp the product photography. */
.elementor-element-nrscombo { background: var(--nirsha-sand); }
.nrs-combo {
    padding: var(--nrs-section-y) 0;
    position: relative;
}
.nrs-combo__grid {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: 22px;
}
.nrs-combo__card {
    position: relative;
    display: flex;
    flex-direction: column;
    background: var(--nirsha-card);
    border: 1px solid var(--nrs-line);
    border-radius: var(--nrs-radius-lg);
    overflow: hidden;
    text-decoration: none;
    color: var(--nrs-ink);
    box-shadow: var(--nrs-shadow);
    transition: transform .3s cubic-bezier(.22,1,.36,1), box-shadow .3s ease, border-color .3s ease;
}
.nrs-combo__card:hover {
    transform: translateY(-5px);
    box-shadow: var(--nrs-shadow-lg);
    border-color: var(--nirsha-gold);
    color: var(--nrs-ink);
}
.nrs-combo__media {
    display: block;
    aspect-ratio: 4 / 3;
    overflow: hidden;
    background: var(--nrs-cream-2);
}
.nrs-combo__media img {
    width: 100% !important; height: 100% !important;
    object-fit: cover; display: block !important;
    transition: transform .6s cubic-bezier(.22,1,.36,1);
}
.nrs-combo__card:hover .nrs-combo__media img { transform: scale(1.06); }
.nrs-combo__body {
    display: flex; flex-direction: column; gap: 6px;
    padding: 20px 22px 22px;
    flex: 1 1 auto;
}
.nrs-combo__title {
    font-family: var(--nrs-font-display) !important;
    font-size: 21px; font-weight: 600; line-height: 1.2;
    letter-spacing: -0.015em; color: var(--nrs-ink);
}
.nrs-combo__desc {
    font-family: var(--nrs-font-body);
    font-size: 14px; line-height: 1.5; color: var(--nrs-muted);
    flex: 1 1 auto;
}
.nrs-combo__link {
    font-family: var(--nrs-font-body);
    font-size: 12.5px; font-weight: 700; letter-spacing: 0.10em;
    text-transform: uppercase; color: var(--nirsha-cocoa);
    display: inline-flex; align-items: center; gap: 7px; margin-top: 6px;
    transition: color .22s ease;
}
.nrs-combo__link em { font-style: normal; transition: transform .22s ease; }
.nrs-combo__card:hover .nrs-combo__link { color: var(--nirsha-gold-ink); }
.nrs-combo__card:hover .nrs-combo__link em { transform: translateX(5px); }

/* Feature card: spans two columns on desktop so the section opens strongly */
.nrs-combo__card--featured { grid-column: span 2; }
.nrs-combo__card--featured .nrs-combo__media { aspect-ratio: 16 / 7; }
.nrs-combo__card--featured .nrs-combo__title { font-size: 27px; }

.nrs-combo__cta { display: flex; justify-content: center; margin-top: 38px; }

/* ── 14.3 Currency switcher + dropdown treatment.
      (Header logo/nav sizing lives solely in section 16.) */
/* Dropdown menus: readable panel for the Combo Packs submenu */
#ct-header-wrap .ct-main-menu .sub-menu {
    border-radius: var(--nrs-radius-sm);
    box-shadow: 0 12px 34px rgba(25,26,21,0.14);
    padding: 8px 0;
    border: 1px solid var(--nrs-line);
}
#ct-header-wrap .ct-main-menu .sub-menu > li > a {
    padding: 11px 20px !important;
    font-size: 14px !important;
    font-weight: 500 !important;
}
/* Currency switcher on touch sizes: meet the 44px tap minimum */

/* Mobile / tablet nav: touch-friendly rows */
@media (max-width: 991px) {
    #ct-menu-mobile .ct-main-menu > li > a,
    #ct-menu-mobile .sub-menu > li > a {
        min-height: 48px !important;
        display: flex !important; align-items: center;
        font-size: 16px !important;
    }
    #ct-menu-mobile .sub-menu > li > a { font-size: 15px !important; padding-left: 26px !important; }
}

/* ── 14.4 Best Sellers ──────────────────────────────────────────────────────
   Deliberately NOT restyled. The section renders through Organio's ct-grid
   masonry widget, which positions items with inline `left` percentages from its
   own JS; CSS attempts to re-centre or cap them fight that JS and leave gaps
   between cards. With only two products in the catalogue the section will look
   sparse regardless — that is a content gap, not a styling one, and it resolves
   itself as soon as more products are published. Left untouched on purpose. */

/* ═══════════════════════════════════════════════════════════════════════════
   PHASE 15 — STRUCTURAL FIX SUPPORT (v13.0.0)
   Styling for the sections rebuilt in Elementor this phase. No speculative
   rules: each block backs a specific structural change.
   ═══════════════════════════════════════════════════════════════════════════ */

/* (15.1 Header presence removed — header owned entirely by section 16.) */

/* ── 15.2 Promotional banners — now three, equal height ─────────────────── */
.nrs-promos__grid--three {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: 18px;
    align-items: stretch;
}
/* .nrs-promo carries `aspect-ratio: 16/9`. Setting a min-height here made the
   ratio derive WIDTH from that height (340 x 16/9 = 604px), which overflowed
   the 414px grid track. Constrain width and let the ratio drive height instead
   — 4/3 suits the narrower three-up column. */
.nrs-promos__grid--three .nrs-promo {
    width: 100%;
    min-width: 0;
    /* A hard aspect-ratio derives height from width, so between 1025 and 1199 the
       three-up cards computed shorter than their own copy and clipped 14-30px
       off the top of the text block. A viewport-scaled MINIMUM keeps the same
       proportions at wide widths (21vw = 302px at 1440, versus the 311px the
       4/3 ratio gave) while letting a card grow when the copy needs it; the grid
       stretches the row so all three stay equal height. */
    aspect-ratio: auto;
    min-height: clamp(250px, 21vw, 320px);
}
.nrs-promos__grid--three .nrs-promo__content { padding: 26px 28px; max-width: 88%; }

/* ── 15.3 Why Choose — four pillars, stronger hierarchy ─────────────────────
   The numbered 01/02/03 markers were removed: the four benefits are a set,
   not a sequence, so numbering implied an order that does not exist. Emphasis
   now comes from the icon medallion and title weight instead. */
.nrs-why__grid--four {
    display: grid;
    grid-template-columns: repeat(4, minmax(0, 1fr));
    gap: 22px;
}
.nrs-why__grid--four .nrs-pillar {
    background: var(--nirsha-card);
    border: 1px solid var(--nrs-line);
    border-radius: var(--nrs-radius-lg);
    padding: 34px 26px 30px;
    text-align: center;
    display: flex; flex-direction: column; align-items: center; gap: 12px;
    transition: transform .28s ease, box-shadow .28s ease, border-color .28s ease;
}
.nrs-why__grid--four .nrs-pillar:hover {
    transform: translateY(-4px);
    box-shadow: var(--nrs-shadow-lg);
    border-color: var(--nirsha-gold);
}
.nrs-why__grid--four .nrs-pillar__icon {
    width: 62px; height: 62px; flex: 0 0 62px;
    display: inline-flex; align-items: center; justify-content: center;
    border-radius: 50%;
    background: var(--nirsha-sand);
    color: var(--nirsha-gold-dark);
    margin-bottom: 4px;
}
.nrs-why__grid--four .nrs-pillar__icon svg { width: 27px; height: 27px; }
.nrs-why__grid--four .nrs-pillar__title {
    font-family: var(--nrs-font-display) !important;
    font-size: 19px; font-weight: 600; margin: 0; color: var(--nrs-ink);
    letter-spacing: -0.01em;
}
.nrs-why__grid--four .nrs-pillar__desc {
    font-size: 14px; line-height: 1.6; color: var(--nrs-muted); margin: 0;
}

/* ── 15.4 Nirsha Promise — more visual weight ───────────────────────────────
   Promoted from plain cards on white to a tinted band with medallion icons so
   it reads as a statement rather than a repeat of Why Choose. */
.nrs-promise__grid {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: 24px;
}
.nrs-promise__card {
    background: var(--nirsha-card);
    border: 1px solid var(--nirsha-border);
    border-radius: var(--nrs-radius-lg);
    padding: 40px 30px;
    text-align: center;
    display: flex; flex-direction: column; align-items: center; gap: 14px;
    box-shadow: var(--nrs-shadow);
    transition: transform .28s ease, box-shadow .28s ease;
}
.nrs-promise__card:hover { transform: translateY(-4px); box-shadow: var(--nrs-shadow-lg); border-color: var(--nirsha-gold); }
/* Filled cocoa medallion with a gold glyph (4.6:1). Promise is the statement
   section, so its marks carry more weight than the outlined sand medallions in
   Why Choose — same family, different rank. */
.nrs-promise__icon {
    width: 72px; height: 72px; flex: 0 0 72px;
    display: inline-flex; align-items: center; justify-content: center;
    border-radius: 50%;
    background: var(--nirsha-cocoa); color: var(--nirsha-gold);
}
.nrs-promise__icon svg { width: 31px; height: 31px; }
.nrs-promise__title {
    font-family: var(--nrs-font-display) !important;
    font-size: 22px; font-weight: 600; margin: 0; color: var(--nrs-ink);
}
.nrs-promise__desc { font-size: 14.5px; line-height: 1.6; color: var(--nrs-muted); margin: 0; }

/* ── 15.5 Footer — typography and column internals (layout lives in R.13) ── */
.nrs-ft-col h4 {
    font-family: var(--nrs-font-body);
    font-size: 12.5px; font-weight: 700; letter-spacing: 0.13em;
    text-transform: uppercase; color: var(--nirsha-ivory);
    margin: 0 0 16px;
}
.nrs-ft-col ul { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 9px; }
.nrs-ft-col ul a {
    color: rgba(251,247,239,0.72); font-size: 14.5px; text-decoration: none;
    transition: color .18s ease, padding-left .18s ease;
    display: inline-block;
}
.nrs-ft-col ul a:hover { color: var(--nirsha-gold); padding-left: 4px; }
/* Footer links sat at 18–23px tall. Padding lifts the hit area toward the 44px
   guidance without visually spacing the list out. */
.nrs-ft-col ul a { padding: 7px 0; line-height: 1.4; }
/* Touch sizing moved onto the 1023 ladder breakpoint (was an orphan 991). */
@media (max-width: 1023px) {
    .nrs-ft-col ul { gap: 2px; }
    .nrs-ft-col ul a { padding: 11px 0; min-height: 44px; display: flex; align-items: center; }
    .nrs-ft-social a { min-width: 44px; min-height: 44px; display: inline-flex; align-items: center; justify-content: center; }
}

/* Currency — informational only. The header owns the real switcher, so this is
   deliberately secondary text; the pill chips (.nrs-ft-pay__chips / .nrs-ft-chip)
   that used to compete with it have been removed from the markup and their
   now-dead selectors deleted with them. */
.nrs-ft-pay { margin-top: 20px; }
.nrs-ft-pay__text {
    margin: 0; font-size: 13px; line-height: 1.5;
    color: rgba(251,247,239,0.72);
}
.nrs-ft-pay__note {
    margin: 5px 0 0;
    /* 0.42 alpha was 3.7:1 at 12.5px — raised to clear AA. */
    font-size: 12.5px; color: rgba(251,247,239,0.60); line-height: 1.5;
}

/* ═══════════════════════════════════════════════════════════════════════════
   SECTION 16 — HEADER: single authoritative block  (v14.0.0)
   ---------------------------------------------------------------------------
   Header sizing previously lived in FOUR places that fought each other:
   functions.php inline (84px bar / 96px logo / 15px nav), style.css §2
   (line-height 52px), Phase 14 (104px logo / 15.5px nav) and Phase 15
   (122px logo / 104px bar / 16px-700 nav). The Phase 15 values won and pushed
   the 8-item menu past the available width.

   ROOT CAUSE of the 250px header: #ct-header .row is `display:flex;
   flex-wrap:wrap` and .ct-header-navigation was computing to 1330px inside a
   1360px row. Branding (96px) could not fit beside it, so the nav wrapped to a
   second line — and the menu then wrapped again internally. Fixed by letting
   the navigation flex-shrink instead of claiming the full row.

   This is now the ONLY place header size/spacing is declared.
   ═══════════════════════════════════════════════════════════════════════════ */

/* 16.1b Branding vertical margin reset -- the parent theme applies a
   margin-top/bottom to .ct-header-branding (15px at <=991px, 6px at
   >=992px) that flexbox does NOT collapse, so it silently adds on top of
   the row's min-height above and grows the bar as the logo grows. Zeroing
   it here is what actually keeps the header height locked to the ladder
   below regardless of logo size; align-items:center on the row still
   centers the logo correctly with margin:0. */
#ct-header-wrap #ct-header .ct-header-branding {
    margin-top: 0 !important;
    margin-bottom: 0 !important;
}

/* 16.0 Desktop-nav breakpoint — deliberately left to the parent theme.
   Organio turns .ct-header-navigation into the off-canvas drawer at <=991px
   and uses .ct-main-navigation as that drawer's CONTENT. An earlier attempt
   here hid .ct-main-navigation below 1300px to stop the desktop menu
   overflowing — which silently emptied the mobile drawer (panel slid open with
   zero visible links). Never hide .ct-main-navigation responsively; size the
   menu to fit instead (16.3). */

/* 16.1 One row, three zones: branding | menu | actions ───────────────────── */
@media (min-width: 992px) {
    #ct-header-wrap #ct-header .row {
        flex-wrap: nowrap !important;
        align-items: center !important;
        min-height: 84px !important;
        gap: 20px;
    }
    #ct-header-wrap #ct-header,
    #ct-header-wrap .ct-header-main { min-height: 84px !important; }

    /* Branding: fixed, never shrinks */
    #ct-header-wrap #ct-header .ct-header-branding {
        flex: 0 0 auto !important;
        max-width: none !important;
        width: auto !important;
    }
    /* Navigation: shares the row and is allowed to shrink (the actual fix) */
    #ct-header-wrap #ct-header .ct-header-navigation {
        flex: 1 1 auto !important;
        min-width: 0 !important;
        width: auto !important;
        max-width: none !important;
        display: flex !important;
        align-items: center !important;
        justify-content: flex-end !important;
        gap: 14px;
    }
    /* .ct-header-navigation holds BOTH the menu and the ~330px icons cluster.
       Without this the menu wrapper collapsed to the leftover ~516px and the
       8 items (≈800px) wrapped to a second row. */
    #ct-header-wrap #ct-header .ct-main-navigation {
        flex: 1 1 auto !important;
        min-width: 0 !important;
        width: auto !important;
        max-width: none !important;
    }
    /* Organio renders .ct-main-menu as display:block with inline-block <li>s,
       so flex-wrap alone had no effect — the items wrapped like text. Making
       the list a flex row is what actually keeps all 8 on one line. */
    #ct-header-wrap #ct-header .ct-main-menu {
        display: flex !important;
        flex-wrap: nowrap !important;
        align-items: center;
        justify-content: flex-end;
        width: auto !important;
        margin: 0 !important;
        padding: 0 !important;
    }
    /* Organio puts ~28px horizontal MARGIN on every top-level <li>. That margin
       (7 gaps x 56px = 392px) — not the label widths (647px) — is what pushed
       the menu past its 949px box, and with justify-content:flex-end the excess
       overflowed LEFT across the logo. Spacing is owned by the <a> padding. */
    #ct-header-wrap #ct-header .ct-main-menu > li {
        flex: 0 0 auto;
        margin: 0 !important;
    }
}

/* SELECTOR NOTE for the four tiers below: Organio's own sticky rule is
   `#ct-header-wrap #ct-header.h-fixed .ct-header-branding a img` (two IDs,
   !important, emitted inline from the logo_maxh_sticky option), which outranks
   a one-ID rule. Once the header goes sticky it would otherwise reimpose a
   single flat height on every tier — measured 134x56 at 1024 and 768, where the
   ladder wants 120x50 and 110x46, and it pushed the sticky bar to 86px. The
   tiers therefore carry two IDs as well, so ONE ladder governs both the resting
   and the sticky header instead of a second sticky-only block. */
/* 16.2 Logo — the approved header mark is HORIZONTAL (1942x809, 2.400:1), not
   the 1:1 mark this rule was originally written for, so height no longer sets
   the size on its own: every 1px of height costs 2.4px of row width.

   The artwork carries its own margin (content box 1726x478 sits inside the
   1942x809 canvas), so the visible wordmark is 59% of the box height. It is
   never cropped or trimmed — `object-fit: contain` and width:auto keep the
   file's own aspect ratio exactly.

   Width budget, measured: at 1440 the menu container has 935px and the eight
   labels need 844px, i.e. 91px of slack; at 1280 it has 798px and needs 663px.
   A 56px-tall logo is 134px wide — 68px more than the old 66px square — which
   stays inside the 1440 slack and keeps the bar at 84px. Going taller (64px =
   154px wide) consumed the entire slack and risked wrapping the menu. */
@media (min-width: 1300px) {
    #ct-header-wrap.ct-header-layout10 #ct-header.ct-header-main .ct-header-branding a img {
        max-height: 67.2px !important;
        width: auto !important; height: auto !important;
        object-fit: contain !important; filter: none !important;
    }
}
@media (min-width: 992px) and (max-width: 1299px) {
    #ct-header-wrap.ct-header-layout10 #ct-header.ct-header-main .ct-header-branding a img {
        max-height: 55.2px !important;
        width: auto !important; height: auto !important;
        object-fit: contain !important; filter: none !important;
    }
}

/* 16.3 Nav type — sized so all 8 items fit the row without wrapping OR
   overflowing left. Budget at 1440: row 1360 - logo 66 - actions ~250 leaves
   ~1030px; the eight labels need ~854px of glyphs, so padding must stay tight. */
/* The top-level menu now carries TEN items (Home, Shop, Dry Fruits, Mukhwas,
   Chocolates, Sweets, Healthy Products, Combo Packs, About Us, Contact Us), not
   the eight this block was first tuned for. At the 80px logo + 13px/14px padding
   that were in force, the ten labels computed to ~1020px inside a ~746px menu
   box and, with justify-content:flex-end, the surplus overflowed LEFT across the
   logo (the "HOME SHOP" over the wordmark bug). The budget is rebalanced here:
   a 46–56px logo (16.2) plus the tighter type below keeps all ten on one row
   and clear of both the logo and the actions cluster from 992px up. Verified at
   1200 / 1280 / 1440 / 1600. */
@media (min-width: 992px) {
    #ct-header-wrap #ct-header .ct-main-navigation .ct-main-menu > li > a {
        font-size: 11px !important;
        font-weight: 600 !important;
        letter-spacing: 0 !important;
        line-height: 84px !important;
        padding: 0 5px !important;
        white-space: nowrap;
    }
    /* Tight row/action gaps and container gutter so the ten items clear the logo
       on the left and the currency + icons cluster on the right. */
    #ct-header-wrap #ct-header .row { gap: 8px !important; }
    #ct-header-wrap #ct-header .ct-header-navigation { gap: 6px !important; }
    #ct-header-wrap #ct-header .container { padding-left: 16px !important; padding-right: 16px !important; }
}
/* >=1300: enough width to give the ten items and the logo more breathing room. */
@media (min-width: 1300px) {
    #ct-header-wrap #ct-header .ct-main-navigation .ct-main-menu > li > a {
        font-size: 12px !important;
        letter-spacing: 0.01em !important;
        padding: 0 9px !important;
    }
    #ct-header-wrap #ct-header .container { padding-left: 20px !important; padding-right: 20px !important; }
}
/* Genuine breathing room only once the viewport can pay for it */
/* Compact currency control so it does not eat the menu's budget */
@media (min-width: 1300px) {
    #ct-header-wrap #ct-header .ct-header-shop-icons .icon-item { margin-left: 6px !important; }
}
/* Only widen the nav once there is genuinely room for it. With ten items a
   13.5px/14px bar risks wrapping again at the low end of this range, so the
   wide-screen bump is modest and stays comfortably inside the slack measured at
   1600 (menu ~832px with hundreds of px to spare). */
@media (min-width: 1560px) {
    #ct-header-wrap #ct-header .ct-main-navigation .ct-main-menu > li > a {
        font-size: 12.5px !important;
        padding: 0 11px !important;
    }
}
/* Active/hover underline sits on the shorter bar */
@media (min-width: 1200px) {
    #ct-header-wrap.ct-header-layout10 .ct-main-menu > li > a::after { bottom: 22px; }
}

/* 16.4 Actions cluster — currency + icons aligned with the menu */
@media (min-width: 992px) {
    #ct-header-wrap #ct-header .ct-header-shop-icons {
        display: flex !important; align-items: center !important;
        flex: 0 0 auto !important; gap: 4px;
    }
}

/* 16.5 Tablet / mobile — compact bar, exactly one visible logo */
@media (max-width: 991px) {
    #ct-header-wrap #ct-header,
    #ct-header-wrap .ct-header-main { min-height: 72px !important; }
    #ct-header-wrap #ct-header .row { min-height: 72px !important; align-items: center !important; }
    /* Tablet: the horizontal mark, scaled proportionally (46px -> ~110px wide)
       inside the 72px bar. Nav is the off-canvas drawer here, so the only
       neighbours are the account/cart/menu icons. */
    #ct-header-wrap.ct-header-layout10 #ct-header.ct-header-main .ct-header-branding a img {
        max-height: 81.6px !important; width: auto !important; height: auto !important;
        object-fit: contain !important;
    }
    /* Organio ships a second mark for the off-canvas panel; keep only the
       in-header one visible so the bar never shows two logos. */
    #ct-header .ct-logo-mobile { display: none !important; }
}

/* 16.6 Sticky header must not sit on top of section headings.
        The old 250px bar was overlapping "From Our Table to Yours" on scroll. */
#ct-header-wrap #ct-header.h-fixed { box-shadow: 0 2px 14px rgba(25,26,21,0.10) !important; }

/* ═══════════════════════════════════════════════════════════════════════════
   SECTION 17 — HERO / HEADER SIZING & MOBILE COMPOSITION  (v14.2.0)
   Consolidates hero heights. Earlier rules stacked 780 → 820 → 880px at wide
   viewports, well past the 620–760px brief, and 540–580px on phones.
   These are the authoritative hero heights; they come last so they win.
   ═══════════════════════════════════════════════════════════════════════════ */

/* 17.1 Hero height ladder — substantial but never a full-screen wall */
.nrs-slide { min-height: 680px; }
@media (min-width: 1440px) { .nrs-slide { min-height: 720px; } }
@media (min-width: 1800px) { .nrs-slide { min-height: 760px; } }
@media (max-width: 1279px) { .nrs-slide { min-height: 620px; } }
@media (max-width: 1024px) { .nrs-slide { min-height: 560px; } }
@media (max-width: 767px)  { .nrs-slide { min-height: 470px; } }
@media (max-width: 480px)  { .nrs-slide { min-height: 430px; } }
@media (max-width: 380px)  { .nrs-slide { min-height: 400px; } }

/* 17.2 Hero content — clears the sticky header at every size, never clipped */
.nrs-slide__content { padding-top: 96px; padding-bottom: 56px; }
@media (min-width: 992px) { .home .nrs-slide__content { padding-top: 116px !important; } }
@media (max-width: 991px) { .home .nrs-slide__content { padding-top: 92px !important; padding-bottom: 44px; } }
@media (max-width: 767px) {
    .home .nrs-slide__content { padding-top: 84px !important; padding-bottom: 36px; }
    .nrs-slide > .nrs-slide__content {
        box-sizing: border-box;
        width: 100%;
        max-width: 100%;
        padding-left: 24px !important;
        padding-right: 24px !important;
    }
    /* Mobile crop: anchor the image so food stays visible beside the text
       instead of centre-cropping the composition. */
    .nrs-slide { background-position: 68% center; }
    .nrs-slide__overlay {
        background: linear-gradient(180deg, rgba(26,18,14,0.78) 0%, rgba(26,18,14,0.55) 55%, rgba(26,18,14,0.74) 100%);
    }
    .nrs-slide__title { font-size: clamp(28px, 8vw, 36px) !important; line-height: 1.12; margin-bottom: 14px; }
    .nrs-slide__desc  { font-size: 14.5px; margin-bottom: 18px; }
    .nrs-eyebrow--light { margin-bottom: 10px; }
    /* Hero CTA sizing lives in ONE place — the R.12 block near the end. */
}
@media (max-width: 480px) {
    .nrs-slide__title { font-size: clamp(26px, 8.4vw, 32px) !important; }
    .home .nrs-slide__content { padding-top: 78px !important; padding-bottom: 28px; }
}
@media (max-width: 380px) {
    .nrs-slide > .nrs-slide__content {
        padding-left: 20px !important;
        padding-right: 20px !important;
    }
}

/* 17.3 Mobile header — target 64–76px with exactly one logo (see functions.php) */
@media (max-width: 767px) {
    #ct-header-wrap #ct-header,
    #ct-header-wrap .ct-header-main { min-height: 68px !important; }
    #ct-header-wrap #ct-header .row { min-height: 68px !important; }
    /* Phone: the approved compact icon (1:1) replaces the wordmark — see the
       breakpoint switch in functions.php. 44px is both the visual size and the
       tap target, and it leaves the 164px of clear space between the mark and
       the account icon measured at 390px. */
    #ct-header-wrap.ct-header-layout10 #ct-header.ct-header-main .ct-header-branding a img {
        max-height: 76.8px !important; max-width: 76.8px !important;
        width: auto !important; height: auto !important;
        object-fit: contain !important;
    }
    /* Touch targets. The hamburger is `div.btn-nav-mobile` (not a button/link)
       and measured 40x36 — below the 44px minimum. */
    #ct-masthead .btn-nav-mobile,
    #ct-masthead .ct-mobile-meta-item,
    #ct-header .ct-header-shop-icons .icon-item {
        min-width: 44px !important; min-height: 44px !important;
        display: inline-flex !important; align-items: center; justify-content: center;
    }
}

/* 17.4 Section headings must never be hidden behind the sticky header.
   scroll-margin-top keeps in-page anchors clear of the fixed bar. */
.nrs-title, .nrs-head { scroll-margin-top: 110px; }
@media (max-width: 767px) { .nrs-title, .nrs-head { scroll-margin-top: 84px; } }

/* 17.5 Headings: never clipped, never forced to a fixed box.
   Guards against the truncated lead text seen in the mobile capture. */
.nrs-title, .nrs-slide__title, .nrs-lead,
.nrs-coll__title, .nrs-combo__title, .nrs-cat__title {
    overflow: visible;
    text-overflow: clip;
    height: auto;
    max-height: none;
    white-space: normal;
}
.nrs-head { overflow: visible; }
.nrs-lead { overflow-wrap: break-word; }

/* 17.6 Special Selection — 2-up from 480px, single column only on the
   narrowest phones where two columns would be unreadable. */

/* ═══════════════════════════════════════════════════════════════════════════
   SECTION 18 — TYPOGRAPHY SYSTEM (single authoritative scale)  (v15.0.0)
   ---------------------------------------------------------------------------
   One fluid scale via clamp(); no fixed heights, no nowrap on headings, no
   per-breakpoint size overrides scattered through the file. Obsolete rules
   removed rather than layered over (see §12.5b and the Phase-10 hero heights).

     role   mobile      desktop
     H1     28–36px  →  56–72px
     H2     24–30px  →  34–46px
     H3     18–22px  →  22–30px
     body   14px min →  14–17px
   ═══════════════════════════════════════════════════════════════════════════ */

/* 18.1 Shared heading behaviour — wrap naturally, never clip, never fixed */
.nrs-slide__title, .nrs-title, .nrs-cat__title, .nrs-coll__title,
.nrs-combo__title, .nrs-promo__title, .nrs-pillar__title,
.nrs-promise__title, .nrs-ft-news__heading {
    height: auto;
    max-height: none;
    min-height: 0;
    overflow: visible;
    white-space: normal;
    overflow-wrap: break-word;
    text-wrap: balance;
}

/* 18.2 H1 — hero headline. 28→72px across the range. */
.nrs-slide__title { font-size: clamp(28px, 4.6vw, 72px); line-height: 1.06; letter-spacing: -0.02em; }

/* 18.3 H2 — section headings. 24→46px. */
.nrs-title { font-size: clamp(24px, 3.1vw, 46px); line-height: 1.16; letter-spacing: -0.015em; }

/* 18.4 H3 — card titles. 18→30px, with the two feature cards a step above. */
.nrs-combo__title,
.nrs-promise__title,
.nrs-pillar__title { font-size: clamp(18px, 1.5vw, 24px); line-height: 1.25; }
.nrs-coll__title   { font-size: clamp(18px, 1.4vw, 22px); line-height: 1.25; }
.nrs-cats__grid--six .nrs-cat .nrs-cat__title { font-size: clamp(17px, 1.35vw, 22px); line-height: 1.2; }
.nrs-cats__grid--six .nrs-cat:nth-child(1) .nrs-cat__title,
.nrs-combo__card--featured .nrs-combo__title,
.nrs-promo__title { font-size: clamp(22px, 2.1vw, 30px); line-height: 1.18; }

/* 18.5 Body copy — never below 14px */
.nrs-lead        { font-size: clamp(14px, 1.05vw, 17px); line-height: 1.65; }
.nrs-slide__desc { font-size: clamp(14px, 1.05vw, 17px); line-height: 1.6; }
.nrs-cat__desc, .nrs-coll__desc, .nrs-combo__desc,
.nrs-pillar__desc, .nrs-promise__desc, .nrs-promo__desc {
    font-size: clamp(14px, 0.95vw, 15px); line-height: 1.55;
}

/* ═══════════════════════════════════════════════════════════════════════════
   SECTION 19 — BUTTON SYSTEM (single authoritative rule)
   Desktop 46–50px · touch >= 44px · one font/radius/padding/focus treatment.
   ═══════════════════════════════════════════════════════════════════════════ */
.nrs-btn, .nrs-btn--ghost-light {
    min-height: 48px;
    padding: 0 30px;
    font-family: var(--nrs-font-body);
    font-size: 14px;
    font-weight: 600;
    letter-spacing: 0.045em;
    line-height: 1;
    border-radius: 999px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    text-decoration: none;
    cursor: pointer;
    transition: background .22s ease, color .22s ease, border-color .22s ease, transform .22s ease;
}
.nrs-btn:hover, .nrs-btn--ghost-light:hover { transform: translateY(-1px); }
.nrs-btn:focus-visible, .nrs-btn--ghost-light:focus-visible {
    outline: 3px solid var(--nrs-brand);
    outline-offset: 3px;
}
.nrs-btn[disabled], .nrs-btn.is-disabled { opacity: .55; pointer-events: none; }
@media (max-width: 991px) { .nrs-btn, .nrs-btn--ghost-light { min-height: 46px; padding: 0 24px; } }
@media (max-width: 767px) { .nrs-btn, .nrs-btn--ghost-light { min-height: 46px; padding: 0 20px; font-size: 13px; } }

/* ═══════════════════════════════════════════════════════════════════════════
   SECTION 20 — FOOTER ON MOBILE: collapsible groups
   Brand blurb + socials stay open; the four link groups collapse.
   Uses <details>-free CSS: the JS in functions.php adds .nrs-ft-acc toggles.
   ═══════════════════════════════════════════════════════════════════════════ */
@media (max-width: 767px) {
    /* Columns for this tier are declared in the R.13 ladder. */
    .nrs-ft-brand { padding-bottom: 22px; }

    .nrs-ft-col {
        border-top: 1px solid rgba(251,247,239,0.14);
        padding: 0;
    }
    .nrs-ft-col h4 {
        margin: 0;
        padding: 16px 0;
        min-height: 52px;               /* comfortable tap row */
        display: flex; align-items: center; justify-content: space-between;
        cursor: pointer;
        user-select: none;
    }
    .nrs-ft-col h4::after {
        content: "";
        width: 9px; height: 9px;
        border-right: 2px solid rgba(251,247,239,0.62);
        border-bottom: 2px solid rgba(251,247,239,0.62);
        transform: rotate(45deg) translate(-2px, -2px);
        transition: transform .25s ease;
    }
    .nrs-ft-col.is-open h4::after { transform: rotate(-135deg) translate(-2px, -2px); }

    /* Collapse via max-height. The grid `0fr` technique only zeroes the FIRST
       implicit row, so with one <li> per row the panel never actually closed.
       overflow:hidden here is the collapse mechanism itself, not a layout
       workaround, and only applies to groups JS has marked as accordions. */
    .nrs-ft-col.nrs-ft-acc ul,
    .nrs-ft-col.nrs-ft-acc .nrs-ft-contact-item,
    .nrs-ft-col.nrs-ft-acc .nrs-ft-pay {
        max-height: 0;
        overflow: hidden;
        opacity: 0;
        margin: 0;
        transition: max-height .3s ease, opacity .2s ease, margin .3s ease;
    }
    .nrs-ft-col.nrs-ft-acc.is-open ul,
    .nrs-ft-col.nrs-ft-acc.is-open .nrs-ft-contact-item,
    .nrs-ft-col.nrs-ft-acc.is-open .nrs-ft-pay {
        max-height: 460px;
        opacity: 1;
        margin-bottom: 14px;
    }
    .nrs-ft-col ul { gap: 0; }
    .nrs-ft-col ul li { overflow: hidden; }
    .nrs-ft-col ul a { padding: 11px 0; min-height: 44px; display: flex; align-items: center; }

    /* Contact group: label row behaves like the others */
    .nrs-ft-col--contact .nrs-ft-contact-item { padding-left: 0; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   NIRSHA RESPONSIVE SYSTEM — single authoritative component ladder
   ---------------------------------------------------------------------------
   This block REPLACES the per-component responsive rules that were previously
   spread across Phase 10–15 (they have been deleted, not layered over).
   One ladder, five tiers, applied per component:

     TIER          RANGE
     desktop-lg    >= 1280
     desktop       1024 - 1279
     tablet         768 - 1023
     large-mobile   600 -  767
     mobile        <= 599

   Column plan (deliberate per component, not uniform):

     component    >=1280  1024+  768+   600+   <=599
     categories     6*      3*     2*     2*     2*      (* = with feature tile)
     favorites      4       3      2      2      2
     combo          3       3      2      2      2
     promos         3       3      2      2      1
     why            4       4      2      2      2
     selection      4       4      2      2      2
     promise        3       3      3      2      2
     trust          4       4      4      2      2
     gallery        4       4      3      3      2
     footer         5       3      3      2      1 (accordion)
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── R.1 Container ladder (one definition, no duplicates) ────────────────── */
.nrs-container { padding-left: 40px; padding-right: 40px; }
@media (min-width: 1600px) { .nrs-container { padding-left: 60px; padding-right: 60px; } }
@media (max-width: 1023px) { .nrs-container { padding-left: 24px; padding-right: 24px; } }
@media (max-width: 599px)  { .nrs-container { padding-left: 18px; padding-right: 18px; } }

/* ── R.2 Vertical rhythm ─────────────────────────────────────────────────── */
:root { --nrs-section-y: 88px; }
@media (min-width: 1440px) { :root { --nrs-section-y: 96px; } }
@media (max-width: 1023px) { :root { --nrs-section-y: 64px; } }
@media (max-width: 767px)  { :root { --nrs-section-y: 52px; } }
@media (max-width: 599px)  { :root { --nrs-section-y: 44px; } }

/* ── R.3 TRUST STRIP — 4 → 2x2, never four full-width rows ───────────────── */
.nrs-trust__inner { display: grid; grid-template-columns: repeat(4, 1fr); gap: 18px; align-items: start; }
.nrs-trust__item { align-items: center; }
@media (max-width: 767px) {
    .nrs-trust__inner { grid-template-columns: repeat(2, 1fr); gap: 12px; }
    .nrs-trust { padding: 24px 0 !important; }
    .nrs-trust__item { gap: 9px; align-items: center; }
    .nrs-trust__label { font-size: 13px; line-height: 1.25; }
    /* The four descriptions wrap to different line counts, which made the rows
       ragged (113/78/95/95px). They add little at this size. */
    .nrs-trust__desc  { display: none; }
}
@media (min-width: 768px) and (max-width: 1023px) {
    /* Descriptions wrap to differing line counts here too (113/78/95/95px rows) */
    .nrs-trust__desc { display: none; }
    .nrs-trust__label { font-size: 14px; }
}
@media (max-width: 400px) { .nrs-trust__icon { width: 34px; height: 34px; flex: 0 0 34px; } }

/* ── R.4 SHOP BY CATEGORY — mosaic degrades in deliberate steps ──────────── */
/* Below 1200 every tile is the SAME size and nothing spans. Six tiles then
   divide exactly into 3x2 or 2x3, so no orphan cell and no empty grid area can
   occur at any width -- which also retires the feature-span and orphan-span
   rules that used to be needed here. The editorial mosaic stays >=1200 only. */
@media (min-width: 1025px) and (max-width: 1199px) {
    .nrs-cats__grid--six { grid-template-columns: repeat(3, 1fr); grid-template-rows: none; grid-auto-rows: 230px; }
    .nrs-cats__grid--six .nrs-cat { grid-column: auto !important; grid-row: auto !important; min-height: 0; }
}
@media (max-width: 1024px) {
    .nrs-cats__grid--six { grid-template-columns: repeat(2, 1fr); grid-template-rows: none; grid-auto-rows: 200px; gap: 14px; }
    .nrs-cats__grid--six .nrs-cat { grid-column: auto !important; grid-row: auto !important; min-height: 0; }
}
@media (max-width: 599px) {
    .nrs-cats__grid--six { grid-auto-rows: 160px; gap: 10px; }
    .nrs-cat__body { padding: 14px 14px 16px; }
    .nrs-cat__desc { display: none; }              /* keep tiles legible, not crowded */
    .nrs-cat__link { font-size: 11px; letter-spacing: .08em; }
}

/* ── R.5 NIRSHA FAVORITES / product rails ────────────────────────────────────
   Standard WooCommerce `ul.products` markup (Elementor Shortcode widget).
   auto-fill + a max card width keeps 2 products centred without leaving huge
   empty tracks, and grows to 4-up automatically as products are published. */
/* Curated rail: 8 products max, 4 per row, so never more than two rows.
   Explicit track count (not auto-fit) means the layout cannot change shape as
   products are added — the shortcode caps the count, this caps the shape. */
.elementor-element-nrsbest ul.products,
.nrs-products ul.products {
    display: grid !important;
    grid-template-columns: repeat(4, minmax(0, 1fr));
    grid-auto-rows: 1fr;          /* every card the same height, row to row */
    justify-content: center;
    gap: 28px;
    margin: 0 !important;
    padding: 0 !important;
    list-style: none;
    max-width: 1360px;
    margin-inline: auto !important;
}
.elementor-element-nrsbest ul.products::before,
.elementor-element-nrsbest ul.products::after { display: none !important; }
.elementor-element-nrsbest ul.products li.product {
    width: auto !important; max-width: 340px !important; margin: 0 !important;
    float: none !important; position: relative !important; left: auto !important; top: auto !important;
    justify-self: center; display: flex; flex-direction: column;
}
/* Organio positions .woocommerce-add-to-cart ABSOLUTELY inside the card (a
   hover-reveal pattern). Measured at 1440/1024 the button's bottom edge landed
   15–20px BELOW the card, and the button never filled its wrapper. Returning it
   to normal flow keeps the CTA inside the card and full width at every size. */
.elementor-element-nrsbest li.product .woocommerce-product-inner,
.woocommerce ul.products li.product .woocommerce-product-inner {
    display: flex; flex-direction: column; height: 100%;
    flex: 1 1 auto;               /* fill the cell that grid-auto-rows:1fr made */
}
/* The content box shipped `padding: 10px 30px 50px` — 60px of side padding on a
   182px card left only 92px for the CTA, and the 50px base was reserved for the
   absolute button removed above. Scaled to the card instead. */
.elementor-element-nrsbest li.product .woocommerce-product-content,
.woocommerce ul.products li.product .woocommerce-product-content {
    padding: 14px 18px 18px !important;
    display: flex; flex-direction: column; flex: 1 1 auto;
}
@media (max-width: 767px) {
    .elementor-element-nrsbest li.product .woocommerce-product-content,
    .woocommerce ul.products li.product .woocommerce-product-content {
        padding: 12px 12px 14px !important;
    }
}
.elementor-element-nrsbest li.product .woocommerce-add-to-cart,
.woocommerce ul.products li.product .woocommerce-add-to-cart {
    position: static !important;
    width: 100% !important;
    margin-top: auto !important;          /* settle at the card's base */
    padding-top: 12px;
    opacity: 1 !important;
    visibility: visible !important;
    transform: none !important;
}
/* Width only. Height, centring and every other box property are owned by the
   product-card CTA block in section 26 — `justify-content` here did nothing in
   two of the five contexts anyway, because the button was not a flex container
   in those. */
.elementor-element-nrsbest li.product .woocommerce-add-to-cart > .button,
.elementor-element-nrsbest li.product .woocommerce-add-to-cart > a,
.woocommerce ul.products li.product .woocommerce-add-to-cart > .button,
.woocommerce ul.products li.product .woocommerce-add-to-cart > a {
    width: 100% !important;
    box-sizing: border-box;
}
/* The theme's 28px side padding left only ~72px of text room in a 128px button
   at 375px, so "Select options" was being clipped (the button has
   overflow:hidden). Padding and type scale down with the card. */
/* Narrow-screen box and type for the card CTA now live with the rest of the CTA
   in section 26, so a single block owns padding, font-size and the arrow at
   every width. Keeping a second copy here meant two rules fighting over the same
   three properties — and after section 26 was added this one lost, which is what
   pushed the label past the padding box at 480px and below. */

/* Content-aware column count. With only two products, auto-fill/auto-fit still
   produced four 319px tracks and left 694px of dead space to the right at
   1440px. Counting the children with :has() makes an under-filled rail centre
   itself as a deliberate pair, and the rail returns to the full 4-up grid on
   its own as soon as more products are published.
   !important is required: the Phase-12.6 WooCommerce rule sets
   `repeat(4, minmax(0,1fr)) !important`, so the :has() form supplies both the
   extra specificity and the weight needed to beat it. */
@media (min-width: 1024px) {
    .elementor-element-nrsbest ul.products:has(li.product:nth-child(1):last-child) {
        grid-template-columns: minmax(0, 340px) !important; justify-content: center !important;
    }
    .elementor-element-nrsbest ul.products:has(li.product:nth-child(2):last-child) {
        grid-template-columns: repeat(2, minmax(0, 340px)) !important; justify-content: center !important;
    }
    .elementor-element-nrsbest ul.products:has(li.product:nth-child(3):last-child) {
        grid-template-columns: repeat(3, minmax(0, 340px)) !important; justify-content: center !important;
    }
}
@media (min-width: 992px) and (max-width: 1279px) { .elementor-element-nrsbest ul.products { grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 22px; } }
/* Tablet: three across keeps the card wide enough for a two-line title. */
@media (min-width: 768px) and (max-width: 991px)  { .elementor-element-nrsbest ul.products { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 18px; } }
/* Phone: two across. The card stays usable because the image tile is square
   and the title is clamped to two lines, so a 2-up row is still a real card
   rather than a squeezed one. */
@media (max-width: 767px) {
    .elementor-element-nrsbest ul.products {
        grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px;
        padding-inline: 0 !important;
    }
    .elementor-element-nrsbest ul.products li.product {
        width: 100% !important; max-width: none !important; margin-inline: 0 !important;
    }
}

/* ── R.6 COMBO PACKS ─────────────────────────────────────────────────────── */
/* Six cards in a 3-col grid with a 2-col feature lay out as rows of [2,3,1],
   leaving the last card alone beside two empty cells. Letting an orphaned last
   card span the remaining columns keeps the block visually resolved at every
   width (the mobile equivalent is further down). */
/* The 2-col feature plus five cards fills 7 cells of a 3-col grid, so the sixth
   card lands alone in the final row. Spanning it resolves the block. */
/* Only >=1024, where the feature spans 2 of 3 columns and the sixth card is
   therefore left alone in the final row. At 768–1023 the feature spans all 3,
   so the tail is [3,2] and forcing a span there orphans card 5 instead. */
@media (min-width: 1024px) {
    .nrs-combo__grid .nrs-combo__card:nth-child(6):last-child { grid-column: span 3 !important; }
    /* Flat banner ratio: at 21/9 the full-width closing card was 549px tall and
       pushed the section to 2162px. 32/9 keeps it a closing strip, not a slab. */
    .nrs-combo__grid .nrs-combo__card:nth-child(6):last-child .nrs-combo__media { aspect-ratio: 32 / 9; }
    .nrs-combo__grid .nrs-combo__card:nth-child(6):last-child .nrs-combo__body {
        display: flex; flex-direction: row; align-items: baseline; gap: 16px; flex-wrap: wrap;
    }
    .nrs-combo__grid .nrs-combo__card:nth-child(6):last-child .nrs-combo__desc { flex: 1 1 auto; }
}
/* 768–1023 holds 3-up: at 2-up the section measured 1892px because six cards
   became a featured block plus three full rows. */
@media (min-width: 768px) and (max-width: 1023px) {
    .nrs-combo__grid { grid-template-columns: repeat(3, minmax(0,1fr)); gap: 16px; }
    .nrs-combo__card--featured { grid-column: span 3; }
    .nrs-combo__card--featured .nrs-combo__media { aspect-ratio: 21 / 9; }
    .nrs-combo__media { aspect-ratio: 4 / 3; }
    .nrs-combo__body { padding: 14px 14px 16px; }
    .nrs-combo__title { font-size: 16px !important; }
    .nrs-combo__card--featured .nrs-combo__title { font-size: 22px !important; }
    .nrs-combo__desc { font-size: 13px; }
}
@media (max-width: 767px) {
    .nrs-combo__grid { grid-template-columns: repeat(2, minmax(0,1fr)); gap: 14px; }
    .nrs-combo__card--featured { grid-column: span 2; }
    .nrs-combo__card--featured .nrs-combo__media { aspect-ratio: 16 / 7; }
    /* With a full-width feature plus an odd number of remaining cards the last
       one is left orphaned beside an empty cell; let it span instead. */
    .nrs-combo__grid .nrs-combo__card:last-child:nth-child(even) { grid-column: 1 / -1; }
    .nrs-combo__grid .nrs-combo__card:last-child:nth-child(even) .nrs-combo__media { aspect-ratio: 16 / 7; }
}
@media (max-width: 599px) {
    /* 2-up retained — 1-up made the section ~2950px tall */
    .nrs-combo__grid { grid-template-columns: repeat(2, minmax(0,1fr)) !important; gap: 12px; }
    .nrs-combo__card--featured { grid-column: 1 / -1 !important; }
    .nrs-combo__card--featured .nrs-combo__media { aspect-ratio: 16 / 8; }
    .nrs-combo__media { aspect-ratio: 4 / 3; }
    .nrs-combo__body { padding: 12px 12px 14px; gap: 4px; }
    .nrs-combo__title { font-size: 15px !important; line-height: 1.2; }
    .nrs-combo__card--featured .nrs-combo__title { font-size: 20px !important; }
    .nrs-combo__desc { font-size: 12.5px; line-height: 1.4; }
    .nrs-combo__link { font-size: 10.5px; letter-spacing: .08em; }
    .nrs-combo__cta { margin-top: 22px; }
}

/* ── R.7 PROMOTIONAL BANNERS ─────────────────────────────────────────────── */
/* Hold 3-up to 768: at 2-up the third banner spans the row and the section
   measured 759px versus 315px at 1024. */
/* Tablet: two columns with the third banner spanning the row. The portrait
   3-up that used to live here squeezed the copy into 19px type; two columns
   give each card a landscape shape the bottom-left layout suits. Both former
   per-breakpoint shade overrides are gone -- the base scrim is bottom-weighted
   now, so it is correct at every width. */
@media (min-width: 768px) and (max-width: 1024px) {
    .nrs-promos__grid--three { grid-template-columns: repeat(2, minmax(0,1fr)); gap: 14px; }
    .nrs-promos__grid--three .nrs-promo { aspect-ratio: auto; min-height: 260px; }
    .nrs-promos__grid--three .nrs-promo:nth-child(3) { grid-column: 1 / -1; min-height: 230px; }
    .nrs-promos__grid--three .nrs-promo__content { padding: 24px 26px; max-width: 86%; }
    .nrs-promo__title { font-size: 24px !important; }
    .nrs-promo__desc { font-size: 13.5px; }
}
@media (min-width: 600px) and (max-width: 767px) {
    .nrs-promos__grid--three { grid-template-columns: repeat(2, minmax(0,1fr)); gap: 14px; }
    /* aspect-ratio deliberately NOT set here: the third banner still spans the
       row, but its height comes from its content like the other two. */
    .nrs-promos__grid--three .nrs-promo:nth-child(3) { grid-column: 1 / -1; }
}
@media (max-width: 767px) {
    .nrs-promos__grid--three { gap: 12px; }
    /* aspect-ratio derives HEIGHT FROM WIDTH, so on a phone the card was a fixed
       182px at 360px wide while its copy needed exactly 182px -- zero slack. A
       second title line, a longer description or a larger text setting tipped it
       straight into the card's overflow:hidden and clipped the eyebrow and CTA.
       Letting the content box size the card removes the failure mode entirely
       instead of tuning numbers against it: min-height keeps short cards from
       collapsing, and the card grows for longer copy. */
    .nrs-promos__grid--three .nrs-promo,
    .nrs-promos__grid--three .nrs-promo:nth-child(3) {
        aspect-ratio: auto;
        /* tall enough that a clear band of photography reads above the copy --
           at 190px the card was almost entirely text block. */
        min-height: 232px;
    }
    .nrs-promos__grid--three .nrs-promo__content {
        padding: 20px 20px 22px;
        max-width: 100%;
    }
    .nrs-promos__grid--three .nrs-promo__desc { opacity: 1; }
}
@media (max-width: 599px) {
    .nrs-promos__grid--three { grid-template-columns: 1fr; }
    .nrs-promo__title { font-size: 20px !important; }
    .nrs-promo__desc { font-size: 12.5px; }
}

/* ── R.8 WHY CHOOSE — 4 → 2x2, never a 4-card vertical stack ─────────────── */
@media (max-width: 1023px) { .nrs-why__grid--four { grid-template-columns: repeat(2, minmax(0,1fr)); gap: 16px; } }
@media (max-width: 599px) {
    .nrs-why__grid--four { grid-template-columns: repeat(2, minmax(0,1fr)) !important; gap: 10px; max-width: none; }
    .nrs-why__grid--four .nrs-pillar { padding: 20px 12px 18px; gap: 8px; }
    .nrs-why__grid--four .nrs-pillar__icon { width: 46px; height: 46px; flex: 0 0 46px; }
    .nrs-why__grid--four .nrs-pillar__icon svg { width: 21px; height: 21px; }
    .nrs-why__grid--four .nrs-pillar__title { font-size: 14.5px !important; }
    .nrs-why__grid--four .nrs-pillar__desc { font-size: 12.5px; line-height: 1.4; }
}

/* ── R.9 SPECIAL SELECTION ───────────────────────────────────────────────── */
@media (min-width: 768px) and (max-width: 1023px) {
    /* 4-up keeps all four collections on one row; at 2-up this ran to ~1000px. */
    .nrs-coll__grid { grid-template-columns: repeat(4, minmax(0,1fr)) !important; gap: 12px; }
    .nrs-coll__media { aspect-ratio: 4 / 3; }
    .nrs-coll__body { padding: 14px 14px 16px; }
    .nrs-coll__title { font-size: 15px !important; }
    .nrs-coll__desc { font-size: 12.5px; line-height: 1.4; }
}
@media (max-width: 767px) { .nrs-coll__grid { grid-template-columns: repeat(2, minmax(0,1fr)) !important; gap: 14px; } }
@media (max-width: 599px) {
    /* 2-up retained down to 360px — 1-up produced a ~2000px section */
    .nrs-coll__grid { grid-template-columns: repeat(2, minmax(0,1fr)) !important; gap: 10px; }
    .nrs-coll__media { aspect-ratio: 4 / 3; }
    .nrs-coll__body { padding: 12px 12px 14px; }
    .nrs-coll__title { font-size: 14.5px !important; line-height: 1.2; }
    .nrs-coll__desc { font-size: 12.5px; line-height: 1.4; }
    .nrs-coll__link { font-size: 10.5px; letter-spacing: .08em; }
}

/* ── R.10 NIRSHA PROMISE ─────────────────────────────────────────────────── */
/* 768–1023 was falling to a single 852px-wide column; hold 3-up on tablet. */
@media (min-width: 768px) and (max-width: 1023px) {
    .nrs-promise__grid { grid-template-columns: repeat(3, minmax(0,1fr)) !important; gap: 16px; max-width: none; }
    .nrs-promise__card { padding: 26px 16px; }
    .nrs-promise__title { font-size: 17px !important; }
    .nrs-promise__desc { font-size: 13px; }
}
@media (max-width: 767px) {
    .nrs-promise__grid { grid-template-columns: repeat(2, minmax(0,1fr)) !important; gap: 12px; max-width: none; }
    .nrs-promise__card { padding: 22px 14px; gap: 10px; }
    .nrs-promise__icon { width: 52px; height: 52px; flex: 0 0 52px; }
    .nrs-promise__icon svg { width: 23px; height: 23px; }
    .nrs-promise__title { font-size: 15px !important; }
    .nrs-promise__desc { font-size: 12.5px; line-height: 1.4; }
    /* Three cards in a 2-up grid leave the third stranded; let it span. */
    .nrs-promise__grid .nrs-promise__card:last-child:nth-child(odd) { grid-column: 1 / -1; }
}

/* ── R.11 GALLERY — must not dominate mobile ─────────────────────────────── */
@media (min-width: 1024px) and (max-width: 1279px) { .nrs-gallery__grid { grid-auto-rows: 190px; } }
@media (max-width: 1023px) { .nrs-gallery__grid { grid-template-columns: repeat(3, 1fr); grid-auto-rows: 150px; gap: 12px; } }
@media (max-width: 599px) {
    .nrs-gallery__grid { grid-template-columns: repeat(2, 1fr); grid-auto-rows: 108px; gap: 8px; }
    .nrs-gallery__item--wide { grid-column: span 2; grid-row: span 2; }
    /* Trim the tail tiles on phones: the feature + 4 supporting shots tell the
       story without the section running to ~1000px. */
    .nrs-gallery__item:nth-child(n+6) { display: none; }
    .nrs-gallery__item:nth-child(8) { grid-column: auto; }
}

/* ── R.12 HERO CTAs — one authoritative rule, no per-label breakpoints ───────
   The pair used to be `flex: 1 1 0`, so both buttons took an identical share of
   the row (131px at 390) no matter how long the label was. "Explore Categories"
   needs 136px, and with `white-space: nowrap; overflow: visible` the extra 7px
   spilled straight out over the pill border. Side padding had been squeezed to
   8–10px to compensate, which is far less than the 23px the 999px radius eats
   at each end, so even the labels that did fit sat on the curve.

   `flex: 1 1 auto` + `min-width: max-content` fixes both at the source: a button
   can never be laid out narrower than its own label plus padding, and the pair
   shares any leftover space. If the two together genuinely exceed the track they
   wrap, and a wrapped button grows to fill its own row. No label list, no width
   guesses, and it keeps working if the slide copy is edited. */
@media (max-width: 767px) {
    .nrs-slide__cta {
        flex-direction: row;
        flex-wrap: wrap;          /* stack only when they truly do not fit */
        gap: 10px;
    }
    .nrs-slide__cta .nrs-btn {
        flex: 1 1 auto;
        min-width: max-content;   /* the label can never be crushed */
        min-height: 46px;         /* keeps the 44px tap minimum */
        padding: 0 18px !important;
        font-size: 13px !important;
        letter-spacing: .02em !important;
        white-space: nowrap;
        text-align: center;
        justify-content: center;
    }
}

/* ── R.18 Fixed page controls (consent pill + scroll-top) ────────────────────
   Both are position:fixed bottom corners. Measured overlaps: the scroll-top sat
   on top of four footer Quick Links, and both clipped the last Combo card.
   Content now reserves room for them and they respect the iOS safe area, so
   nothing tappable is permanently obscured. */
:root { --nrs-fixed-ctl: 60px; }
@media (max-width: 767px) {
    #page, .site { padding-bottom: calc(var(--nrs-fixed-ctl) + env(safe-area-inset-bottom, 0px)); }
    .nirsha-consent-manage {
        left: 12px !important; right: auto !important;
        bottom: calc(12px + env(safe-area-inset-bottom, 0px)) !important;
        min-height: 44px !important; padding: 0 14px !important; font-size: 12px !important;
        box-shadow: 0 4px 14px rgba(25,26,21,.28);
    }
    .scroll-top {
        right: 12px !important;
        bottom: calc(12px + env(safe-area-inset-bottom, 0px)) !important;
        width: 44px !important; height: 44px !important;
    }
    /* The consent dialog itself is a bottom sheet; keep it clear of the notch
       and never let it exceed half the viewport. */
    #nirsha-consent .nirsha-consent__panel {
        padding-bottom: calc(16px + env(safe-area-inset-bottom, 0px)) !important;
        max-height: 55vh; overflow-y: auto;
    }
}
@media (min-width: 768px) {
    #page, .site { padding-bottom: 0; }
    .nirsha-consent-manage { bottom: 16px !important; left: 16px !important; }
}

/* ── R.13 FOOTER — the single authoritative footer layout system ─────────────
   ROOT CAUSE of the 900–1200px footer body: the rule that used to sit here ran
   at `max-width: 1279px`, dropped the grid to THREE tracks and put
   `grid-column: span 3` on the contact column. With five children in a 3-track
   grid that span cannot share a row, so the browser laid out:

       row 1  brand | Shop | Quick Links
       row 2  Customer Support | (empty) | (empty)     <- the dark blank region
       row 3  Contact (spanning all three)

   Measured before the fix: footer body 1053px at 1024 and 1124px at 768,
   against 431px at 1440. The span — not padding and not a min-height — was
   what produced both the extra rows and the empty area beside them. There is
   no fixed or minimum height anywhere in the footer; every band is content-sized.

   Columns are declared HERE AND NOWHERE ELSE. The Phase-10 4-column grid, the
   15.5 5-column grid, the 15.5 767/420 span resets and the Phase-10 1024/767/480
   responsive block have all been deleted rather than overridden.

       >= 1024    five aligned columns, one row, no accordion
       768–1023   brand full width, then a clean 2-column grid
       <= 767     brand + four accordion groups (defined in section 20)
   ------------------------------------------------------------------------- */
.nrs-ft-main__inner {
    display: grid;
    align-items: start;            /* every column starts on the same baseline */
}
@media (min-width: 1280px) {
    .nrs-ft-main__inner { grid-template-columns: 1.4fr 0.8fr 0.9fr 1fr 1.1fr; gap: 44px; }
}
@media (min-width: 1024px) and (max-width: 1279px) {
    /* Five tracks still fit here; only the gutter needs to come in. */
    .nrs-ft-main__inner { grid-template-columns: 1.4fr 0.8fr 0.9fr 1fr 1.1fr; gap: 30px; }
    .nrs-ft-main { padding: 60px 0 44px; }
}
@media (max-width: 767px) {
    /* Phone: one column. Accordion behaviour itself lives in section 20. */
    .nrs-ft-main__inner { grid-template-columns: minmax(0, 1fr); gap: 0; padding-left: 18px; padding-right: 18px; }
    /* Phone padding. Without this the band inherits the desktop 72/52 and leaves
       52px of dead dark space between the last accordion row and the copyright;
       28px lets the copyright follow the accordion directly, as intended. */
    .nrs-ft-main { padding: 44px 0 28px; }
    .nrs-ft-news { padding: 44px 0; }
    /* Copyright above, links below, both left-aligned — the two were competing
       for one row and pushed the legal links off the right edge. */
    .nrs-ft-bar__inner { flex-direction: column; align-items: flex-start; gap: 10px; }
    .nrs-ft-bar__links { gap: 4px 18px; }
}
@media (min-width: 768px) and (max-width: 1023px) {
    .nrs-ft-news { padding: 48px 0; }
    .nrs-ft-main__inner { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 28px 40px; }
    .nrs-ft-brand { grid-column: 1 / -1; }        /* row 1 — brand, full width */
    .nrs-ft-main { padding: 52px 0 40px; }
    /* The blurb is a full-width row here; cap it so it stays a paragraph. */
    .nrs-ft-desc { max-width: 560px; }
}

/* ── R.14 WOOCOMMERCE — tablet sidebar must not become a giant block ─────── */
@media (max-width: 1023px) {
    .woocommerce .content-area.content-has-sidebar,
    .woocommerce-page .content-area.content-has-sidebar { width: 100% !important; max-width: 100% !important; flex: 0 0 100% !important; }
    /* Collapse the sidebar into a compact disclosure instead of a ~1400px block */
    .woocommerce .widget-area, .woocommerce-page .widget-area {
        width: 100% !important; max-width: 100% !important; flex: 0 0 100% !important;
        margin-top: 28px; border-top: 1px solid var(--nrs-line); padding-top: 8px;
    }
    .woocommerce .widget-area .widget, .woocommerce-page .widget-area .widget { margin-bottom: 0; }
    .woocommerce .widget-area .widget > *:not(.widget-title):not(h2):not(h3),
    .woocommerce-page .widget-area .widget > *:not(.widget-title):not(h2):not(h3) { display: none; }
    .woocommerce .widget-area .widget.nrs-open > *,
    .woocommerce-page .widget-area .widget.nrs-open > * { display: revert; }
    .woocommerce .widget-area .widget-title,
    .woocommerce .widget-area .widget > h2,
    .woocommerce .widget-area .widget > h3 {
        cursor: pointer; margin: 0; padding: 14px 0; min-height: 48px;
        display: flex; align-items: center; justify-content: space-between; font-size: 15px;
    }
    .woocommerce .widget-area .widget-title::after,
    .woocommerce .widget-area .widget > h2::after,
    .woocommerce .widget-area .widget > h3::after {
        content: ""; width: 8px; height: 8px; border-right: 2px solid currentColor;
        border-bottom: 2px solid currentColor; transform: rotate(45deg); opacity: .55;
    }
    .woocommerce .widget-area .widget.nrs-open .widget-title::after,
    .woocommerce .widget-area .widget.nrs-open > h2::after,
    .woocommerce .widget-area .widget.nrs-open > h3::after { transform: rotate(-135deg); }
}

/* ── R.15 WooCommerce product cards — consistent image ratio everywhere ──── */
.woocommerce ul.products li.product img,
.woocommerce-page ul.products li.product img {
    aspect-ratio: 1 / 1; object-fit: contain; width: 100%; height: auto;
}
/* Related/upsell rails carried a fixed `height: 220px` from an earlier phase,
   which pinned the height while the width flexed — the ratio swung from 1.59
   at 1440px to 0.58 at 375px. Height must follow the ratio, not the reverse. */
.single-product .related ul.products li.product img,
.single-product .up-sells ul.products li.product img,
.woocommerce .related ul.products li.product img,
.woocommerce .up-sells ul.products li.product img {
    height: auto !important;
    aspect-ratio: 1 / 1;
    object-fit: cover !important;
    width: 100% !important;
}
.woocommerce div.product .woocommerce-product-gallery__image img {
    aspect-ratio: 1 / 1; object-fit: contain; width: 100%; height: auto;
}
@media (min-width: 1024px) { .woocommerce div.product .woocommerce-product-gallery { max-width: 560px; } }

/* ── R.16 Touch targets (visual size unchanged; hit area enlarged) ───────── */
/* Slider dots: the BUTTON is the click target, so it carries the 44px hit area.
   Padding (not font/size) supplies it, so the visible numeral is unchanged. */
.nrs-slider-nav .slick-dots li { position: relative; display: inline-flex; align-items: center; justify-content: center; }
.nrs-slider-nav .slick-dots li button {
    min-width: 44px; min-height: 44px;
    display: inline-flex; align-items: center; justify-content: center;
    padding: 0; background: transparent; border: 0; line-height: 1;
}
@media (max-width: 1023px) {
    .nrs-slider__arrow { min-width: 44px; min-height: 44px; }
    /* Wishlist/quick-view render as .woosw-btn / .woosq-btn (the ct- prefixed
       variants only exist in the header), so both families are covered. */
    .ct-woosw-btn, .ct-woosq-btn,
    .woosw-btn, .woosq-btn,
    .woocommerce-wishlist button, .ct-product-button > a {
        min-width: 44px !important; min-height: 44px !important;
        display: inline-flex !important; align-items: center; justify-content: center;
    }
    /* Footer utility links and breadcrumbs: pad the hit area, keep type size */
    .nrs-ft-bar__links a,
    .nrs-ft-contact-item a { min-height: 44px; display: inline-flex; align-items: center; }
    /* Breadcrumb links: padding only, to lift the hit area. The truncation
       once noted here was an icon font on the label -- fixed at its source in
       section 9, not with a width patch. */
    .ct-breadcrumb a, .woocommerce-breadcrumb a, a.breadcrumb-entry { padding: 10px 4px; }
    a.scroll-top { width: 44px !important; height: 44px !important; }
    /* Product gallery zoom/lightbox trigger measured 36x36 */
    .woocommerce-product-gallery__trigger {
        width: 44px !important; height: 44px !important;
        display: inline-flex !important; align-items: center; justify-content: center;
    }
    /* Category/tag meta are inline links in a sentence (WCAG 2.5.8 exempts
       those), but a little vertical padding still makes them comfortable. */
    .product_meta .posted_in a, .product_meta .tagged_as a { padding: 6px 2px; display: inline-block; }
    /* Consent banner is rendered by the nirsha-commerce plugin; sized here so
       the plugin itself stays untouched. */
    .nirsha-consent__btn, .nirsha-consent-manage {
        min-height: 44px !important; display: inline-flex !important; align-items: center; justify-content: center;
    }
    .nirsha-consent__link { min-height: 44px; display: inline-flex; align-items: center; }
    .filter-item { min-height: 44px; display: inline-flex; align-items: center; }
    /* Whichever logo variant is visible at this width must carry the tap area
       (below 768 that is .logo-mobile, not .logo-dark). */
    #ct-masthead .ct-header-branding a.logo-dark,
    #ct-masthead .ct-header-branding a.logo-mobile { min-width: 44px; min-height: 44px; align-items: center; }
}
/* Desktop: keep dots visually small but give them a real hit area */
@media (min-width: 1024px) {
    .nrs-slider-nav .slick-dots li { min-width: 44px; min-height: 44px;
        display: inline-flex; align-items: center; justify-content: center; }
}

/* ── R.17 Typography floor — no interactive text under 13px ──────────────── */
.nrs-btn, .nrs-btn--ghost-light, .filter-item,
.woocommerce a.button, .woocommerce button.button,
.nrs-cat__link, .nrs-coll__link, .nrs-combo__link { font-size: max(13px, 1em); }
@media (max-width: 599px) {
    /* Affordance labels inside cards. The whole card is the link and already
       exceeds 44px, so these are cues rather than the tap target — but keep
       them at 12px rather than 11px so they stay legible. */
    .nrs-cat__link, .nrs-coll__link, .nrs-combo__link { font-size: 12px; letter-spacing: .06em; }
}

/* ── END ─────────────────────────────────────────────────────────────────── */

/* ── 21. EMPTY PRODUCT CATEGORY ──────────────────────────────────────────────
   Several ranges (Mukhwas, Chocolates, Sweets, Healthy Products, Combo Packs)
   are in the navigation before their products exist. WooCommerce's default
   "No products were found matching your selection." reads like a failed search
   on a page a shopper reached from the main menu, so inc/class-nirsha-content-
   pages.php replaces it with a real empty state. Self-contained on purpose —
   category archives do not load assets/css/nirsha-pages.css. */
.nrsp-empty-cat {
    max-width: 60ch;
    margin: 8px auto 48px;
    padding: 40px 32px;
    text-align: center;
    background: var(--nirsha-surface);
    border: 1px solid var(--nrs-line-2);
    border-radius: var(--nrs-radius-lg);
}
.nrsp-empty-cat h2 {
    font-family: var(--nrs-font-display);
    font-size: clamp(21px, 2.2vw, 28px);
    line-height: 1.25;
    color: var(--nrs-ink);
    margin: 0 0 12px;
}
.nrsp-empty-cat p {
    color: var(--nrs-muted);
    font-size: 15.5px;
    line-height: 1.7;
    margin: 0 0 24px;
}
.nrsp-empty-cat__links { margin-bottom: 26px; }
.nrsp-empty-cat .nrsp-btn--primary,
.nrsp-empty-cat a.nrsp-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-height: 48px;
    padding: 14px 30px;
    border-radius: 999px;
    background: var(--nrs-cta-bg);
    color: var(--nrs-cta-ink);
    font-family: var(--nrs-font-body);
    font-size: 14.5px;
    font-weight: 600;
    text-decoration: none;
    transition: background-color .22s ease, color .22s ease;
}
.nrsp-empty-cat .nrsp-btn--primary:hover { background: var(--nrs-cta-bg-hover); color: var(--nrs-cta-ink-hover); }
.nrsp-empty-cat__cats {
    list-style: none;
    margin: 0;
    padding: 22px 0 0;
    border-top: 1px solid var(--nrs-line-2);
    display: flex;
    flex-wrap: wrap;
    gap: 10px 22px;
    justify-content: center;
}
.nrsp-empty-cat__cats a {
    font-size: 14.5px;
    color: var(--nirsha-cocoa);
    text-decoration: none;
    border-bottom: 1px solid transparent;
    transition: color .18s ease, border-color .18s ease;
}
.nrsp-empty-cat__cats a:hover { color: var(--nirsha-gold-ink); border-bottom-color: var(--nirsha-gold); }
@media (max-width: 480px) {
    .nrsp-empty-cat { padding: 30px 20px; margin-bottom: 34px; }
    .nrsp-empty-cat__cats { gap: 8px 16px; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   SECTION 22 — COMMERCE & SEMANTIC LAYER  (Warm Ivory × Deep Cocoa × Gold)
   ---------------------------------------------------------------------------
   Everything a customer touches between the Shop grid and the order-received
   page. It is LAST in the file on purpose: WooCommerce, Organio and the
   wishlist/quick-view plugins all emit late, heavily-weighted rules, and this
   block has to answer them without adding a second stylesheet request.

   Three principles run through it:
     1. COCOA IS THE ACTION COLOUR. Every primary commerce button is cocoa with
        an ivory label, and every one of them warms to Antique Gold with an
        espresso label on hover. One rule, one hover, no per-page variants.
     2. SEMANTICS ARE NOT BRANDING. Success/in-stock stays GREEN, errors stay
        red, warnings stay amber. A customer must never have to learn that brown
        means "it worked". That is why the migration re-pointed the brand green
        and deliberately left the semantic green alone.
     3. NOTHING RELIES ON COLOUR ALONE. Stock, sale, validation and selected
        states each carry a word, an icon or a shape as well.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── 22.1 Page title band + breadcrumbs ─────────────────────────────────── */
#pagetitle.page-title { background-color: var(--nirsha-espresso); }
#pagetitle.page-title::before {
    /* Organio paints a flat scrim over the banner photo. Warmed so the band
       joins the espresso family instead of reading as neutral grey. */
    background: linear-gradient(180deg, rgba(32,23,19,0.58) 0%, rgba(32,23,19,0.78) 100%) !important;
}
#pagetitle .page-title-inner h1,
#pagetitle .page-title-inner .entry-title { color: var(--nirsha-ivory); }
.ct-breadcrumb,
.ct-breadcrumb .breadcrumb-entry { color: rgba(251,247,239,0.80); }
.ct-breadcrumb a { color: rgba(251,247,239,0.80); }
.ct-breadcrumb a:hover { color: var(--nirsha-gold); }
.ct-breadcrumb li:last-child { color: var(--nirsha-ivory); }
/* Breadcrumbs printed on a light page (no banner image) need the inverse. */
.page-title:not(.bg-image) .ct-breadcrumb,
.page-title:not(.bg-image) .ct-breadcrumb a { color: var(--nrs-muted); }
.page-title:not(.bg-image) .ct-breadcrumb a:hover { color: var(--nirsha-gold-ink); }

/* ── 22.2 Shop toolbar — result count + sorting ─────────────────────────── */
.woocommerce .woocommerce-result-count { color: var(--nrs-muted); font-family: var(--nrs-font-body); }
.woocommerce .woocommerce-ordering select,
.woocommerce select.orderby {
    background: var(--nirsha-card);
    border: 1px solid var(--nirsha-border);
    border-radius: var(--nrs-radius-sm);
    color: var(--nirsha-espresso);
    padding: 10px 14px;
    min-height: 44px;
    font-family: var(--nrs-font-body);
    font-size: 14px;
}
.woocommerce .woocommerce-ordering select:focus,
.woocommerce select.orderby:focus {
    border-color: var(--nirsha-gold);
    box-shadow: 0 0 0 3px rgba(59,36,27,0.22);
    outline: none;
}

/* ── 22.3 Product cards — ONE card system everywhere ─────────────────────
   Shop, category archives, search results, related rails and the wishlist all
   render WooCommerce content-product.php, so they are styled together here
   rather than four times over. */
.woocommerce ul.products li.product .woocommerce-product-inner,
.woocommerce-page ul.products li.product .woocommerce-product-inner {
    background: var(--nirsha-card);
    border: 1px solid var(--nirsha-border) !important;
    border-radius: var(--nrs-radius);
    overflow: hidden;
    transition: box-shadow .22s ease, transform .22s ease, border-color .22s ease;
}
.woocommerce ul.products li.product .woocommerce-product-inner:hover,
.woocommerce-page ul.products li.product .woocommerce-product-inner:hover {
    box-shadow: var(--nrs-shadow-lg);
    border-color: var(--nirsha-gold) !important;
    transform: translateY(-3px);
}
.woocommerce ul.products li.product .woocommerce-product-header {
    background: linear-gradient(160deg, var(--nirsha-ivory) 0%, var(--nirsha-sand) 100%);
}
.woocommerce ul.products li.product .woocommerce-product--title,
.woocommerce ul.products li.product .woocommerce-loop-product__title,
.woocommerce ul.products li.product .woocommerce-product--title a,
.woocommerce ul.products li.product .woocommerce-loop-product__title a {
    color: var(--nirsha-espresso) !important;
    font-family: var(--nrs-font-body);
    font-weight: 600;
    transition: color .18s ease;
}
.woocommerce ul.products li.product .woocommerce-product--title a:hover,
.woocommerce ul.products li.product .woocommerce-loop-product__title a:hover {
    color: var(--nirsha-gold-ink) !important;
}
.woocommerce ul.products li.product .price,
.woocommerce ul.products li.product .price .woocommerce-Price-amount {
    color: var(--nirsha-cocoa) !important;
    font-weight: 700;
}
.woocommerce ul.products li.product .price del,
.woocommerce ul.products li.product .price del .woocommerce-Price-amount {
    color: var(--nirsha-muted-ink) !important; font-weight: 400 !important; opacity: 1 !important;
}
.woocommerce ul.products li.product .price ins,
.woocommerce ul.products li.product .price ins .woocommerce-Price-amount {
    color: var(--nirsha-cocoa) !important; text-decoration: none !important; font-weight: 700 !important;
}
.woocommerce ul.products li.product .woocommerce-product--excerpt,
.woocommerce ul.products li.product .woocommerce-product-details__short-description {
    color: var(--nrs-muted);
}

/* Sale badge — gold with an espresso label, so it never reads as the CTA. */
.woocommerce span.onsale,
.woocommerce ul.products li.product .onsale {
    background: var(--nirsha-gold) !important;
    color: var(--nirsha-espresso) !important;
    border-radius: 999px;
    font-family: var(--nrs-font-body);
    font-size: 11px; font-weight: 700; letter-spacing: .05em; text-transform: uppercase;
    padding: 4px 12px; min-height: 0; line-height: 1.6;
    box-shadow: none; text-shadow: none;
}

/* Out of stock must stay unmistakable — a word plus a dimmed card, never a
   colour swap alone. */
.woocommerce ul.products li.product.outofstock .woocommerce-product-header { position: relative; }
.woocommerce ul.products li.product.outofstock .woocommerce-product-header::after {
    content: "Out of stock";
    position: absolute; top: 12px; left: 12px;
    background: rgba(32,23,19,.86); color: var(--nirsha-ivory);
    font-family: var(--nrs-font-body);
    font-size: 11px; font-weight: 600; letter-spacing: .06em; text-transform: uppercase;
    padding: 5px 10px; border-radius: 999px;
}
.woocommerce ul.products li.product.outofstock .woocommerce-product-inner { opacity: .94; }

/* ── 22.4 Buttons — the single commerce CTA treatment ───────────────────── */
.woocommerce a.button,
.woocommerce button.button,
.woocommerce input.button,
.woocommerce #respond input#submit,
.woocommerce a.add_to_cart_button,
.woocommerce .woocommerce-add-to-cart a,
.woocommerce-page a.button,
.woocommerce-page button.button,
.woocommerce-page input.button {
    background-color: var(--nrs-cta-bg) !important;
    border: 1px solid var(--nrs-cta-bg) !important;
    color: var(--nrs-cta-ink) !important;
    font-family: var(--nrs-font-body);
    font-weight: 600;
    border-radius: var(--nrs-radius-sm);
    transition: background-color .2s ease, color .2s ease, border-color .2s ease;
    text-shadow: none;
}
.woocommerce a.button:hover,
.woocommerce button.button:hover,
.woocommerce input.button:hover,
.woocommerce #respond input#submit:hover,
.woocommerce a.add_to_cart_button:hover,
.woocommerce .woocommerce-add-to-cart a:hover,
.woocommerce-page a.button:hover,
.woocommerce-page button.button:hover,
.woocommerce-page input.button:hover,
.woocommerce a.button:focus-visible,
.woocommerce button.button:focus-visible,
.woocommerce input.button:focus-visible {
    background-color: var(--nrs-cta-bg-hover) !important;
    border-color: var(--nrs-cta-bg-hover) !important;
    color: var(--nrs-cta-ink-hover) !important;
}
/* Emphasis button (Proceed to Checkout, Place Order). WooCommerce ships
   .button.alt with a colour of its own, so it is named explicitly. */
.woocommerce a.button.alt,
.woocommerce button.button.alt,
.woocommerce input.button.alt,
.woocommerce #place_order,
.woocommerce .checkout-button {
    background-color: var(--nrs-cta-bg) !important;
    border-color: var(--nrs-cta-bg) !important;
    color: var(--nrs-cta-ink) !important;
    font-weight: 700;
    letter-spacing: .02em;
}
.woocommerce a.button.alt:hover,
.woocommerce button.button.alt:hover,
.woocommerce input.button.alt:hover,
.woocommerce #place_order:hover,
.woocommerce .checkout-button:hover {
    background-color: var(--nrs-cta-bg-hover) !important;
    border-color: var(--nrs-cta-bg-hover) !important;
    color: var(--nrs-cta-ink-hover) !important;
}
/* Secondary action (Update cart, Apply coupon) — outline, so the page never
   shows two equally loud cocoa blocks side by side. */
.woocommerce button[name="update_cart"],
.woocommerce input[name="update_cart"],
.woocommerce .coupon button.button,
.woocommerce .woocommerce-form-coupon button.button {
    background-color: transparent !important;
    border: 1.5px solid var(--nirsha-cocoa) !important;
    color: var(--nirsha-cocoa) !important;
}
.woocommerce button[name="update_cart"]:hover,
.woocommerce input[name="update_cart"]:hover,
.woocommerce .coupon button.button:hover,
.woocommerce .woocommerce-form-coupon button.button:hover {
    background-color: var(--nirsha-cocoa) !important;
    color: var(--nirsha-ivory) !important;
}
/* Disabled: a warm neutral, NOT a faded cocoa — a translucent cocoa button
   reads as "hovering" rather than "unavailable". */
.woocommerce button.button:disabled,
.woocommerce button.button[disabled],
.woocommerce input.button:disabled,
.woocommerce a.button.disabled,
.woocommerce button[name="update_cart"]:disabled {
    background-color: var(--nirsha-border) !important;
    border-color: var(--nirsha-border) !important;
    color: var(--nrs-muted) !important;
    opacity: 1 !important;
    cursor: not-allowed;
}
/* Destructive: removing a cart line is an error-coloured action, never a gold
   one (§23).
   Organio does not draw an "x" glyph — it fills a 26px disc with
   --primary-color and lays two 1px WHITE bars across it. Clearing that fill (as
   an earlier pass here did) left white bars on a white cell, i.e. an invisible
   Remove control. The disc is therefore kept and recoloured instead: a warm
   neutral at rest so the cart is not peppered with red, and full error red the
   moment the pointer is on it. */
.woocommerce a.remove,
.woocommerce a.remove:link,
.product-remove a.remove {
    background-color: var(--nirsha-border) !important;
    border-radius: 50%;
    transition: background-color .18s ease;
}
.product-remove a.remove::before,
.product-remove a.remove::after {
    background-color: var(--nirsha-error) !important;
    height: 1.5px;
}
.woocommerce a.remove:hover,
.product-remove a.remove:hover {
    background-color: var(--nirsha-error) !important;
}
.product-remove a.remove:hover::before,
.product-remove a.remove:hover::after {
    background-color: var(--nirsha-ivory) !important;
}

/* ── 22.5 Pagination ────────────────────────────────────────────────────── */
.woocommerce nav.woocommerce-pagination ul,
.woocommerce nav.woocommerce-pagination ul li { border: 0; }
.woocommerce nav.woocommerce-pagination ul li a,
.woocommerce nav.woocommerce-pagination ul li span {
    background: var(--nirsha-card);
    border: 1px solid var(--nirsha-border);
    border-radius: var(--nrs-radius-sm);
    color: var(--nirsha-espresso);
    min-width: 44px; min-height: 44px;
    display: inline-flex; align-items: center; justify-content: center;
    font-family: var(--nrs-font-body); font-weight: 600;
    transition: background-color .18s ease, color .18s ease, border-color .18s ease;
}
.woocommerce nav.woocommerce-pagination ul li a:hover,
.woocommerce nav.woocommerce-pagination ul li a:focus {
    background: var(--nirsha-sand);
    border-color: var(--nirsha-gold);
    color: var(--nirsha-cocoa);
}
.woocommerce nav.woocommerce-pagination ul li span.current,
.woocommerce nav.woocommerce-pagination ul li a.current {
    background: var(--nirsha-cocoa);
    border-color: var(--nirsha-cocoa);
    color: var(--nirsha-ivory);
}

/* ── 22.6 Sidebar widgets (shop + archive filters) ──────────────────────── */
.widget-area .widget-title,
.widget-area .widget h2,
.widget-area .widget h3 {
    color: var(--nirsha-espresso);
    font-family: var(--nrs-font-display);
    border-bottom: 1px solid var(--nirsha-border);
    padding-bottom: 10px;
}
.widget-area .widget ul li a { color: var(--nrs-ink-2); transition: color .18s ease; }
.widget-area .widget ul li a:hover { color: var(--nirsha-gold-ink); }
.widget-area .widget ul li.current-cat > a,
.widget-area .widget ul li.current-cat-parent > a { color: var(--nirsha-cocoa); font-weight: 600; }
.widget_price_filter .ui-slider .ui-slider-range { background-color: var(--nirsha-cocoa) !important; }
.widget_price_filter .ui-slider .ui-slider-handle {
    background-color: var(--nirsha-gold) !important;
    border: 2px solid var(--nirsha-cocoa) !important;
}
.widget_price_filter .price_slider_wrapper .ui-widget-content { background-color: var(--nirsha-border) !important; }
.widget_price_filter .price_label { color: var(--nrs-muted); }
.widget_product_search input[type="search"],
.widget_product_search input[type="text"],
.widget_search input[type="search"] {
    background: var(--nirsha-card);
    border: 1px solid var(--nirsha-border);
    border-radius: var(--nrs-radius-sm);
    color: var(--nirsha-espresso);
    min-height: 46px; padding: 10px 14px;
}
.widget_product_search input:focus,
.widget_search input:focus {
    border-color: var(--nirsha-gold);
    box-shadow: 0 0 0 3px rgba(59,36,27,0.22);
    outline: none;
}
.widget_product_tag_cloud a,
.tagcloud a {
    background: var(--nirsha-sand) !important;
    border: 1px solid var(--nirsha-border) !important;
    color: var(--nirsha-cocoa) !important;
    border-radius: 999px;
}
.widget_product_tag_cloud a:hover,
.tagcloud a:hover {
    background: var(--nirsha-cocoa) !important;
    border-color: var(--nirsha-cocoa) !important;
    color: var(--nirsha-ivory) !important;
}

/* ── 22.7 WooCommerce notices — SEMANTIC, deliberately not branded ───────
   Customers read these as system feedback, so the colour has to keep meaning
   what it means everywhere else on the web. Success is green (the Nirsha
   success token, not the retired brand green), errors are red, informational
   messages use the neutral warm sand the rest of the UI already uses. */
.woocommerce-message,
.woocommerce-error,
.woocommerce-info,
.woocommerce .woocommerce-message,
.woocommerce .woocommerce-error,
.woocommerce .woocommerce-info {
    border-top: 0 !important;
    border-left: 4px solid !important;
    border-radius: var(--nrs-radius-sm);
    font-family: var(--nrs-font-body);
    line-height: 1.6;
}
.woocommerce-message, .woocommerce .woocommerce-message {
    border-left-color: var(--nirsha-success) !important;
    background: var(--nirsha-success-bg) !important;
    color: var(--nirsha-success-ink) !important;
}
.woocommerce-message::before, .woocommerce .woocommerce-message::before { color: var(--nirsha-success) !important; }
.woocommerce-error, .woocommerce .woocommerce-error {
    border-left-color: var(--nirsha-error) !important;
    background: var(--nirsha-error-bg) !important;
    color: var(--nirsha-error) !important;
}
.woocommerce-error::before, .woocommerce .woocommerce-error::before { color: var(--nirsha-error) !important; }
.woocommerce-info, .woocommerce .woocommerce-info {
    border-left-color: var(--nirsha-cocoa) !important;
    background: var(--nirsha-sand) !important;
    color: var(--nirsha-espresso) !important;
}
.woocommerce-info::before, .woocommerce .woocommerce-info::before { color: var(--nirsha-cocoa) !important; }
/* Buttons INSIDE a notice must not inherit the notice semantic colour. */
.woocommerce-message .button,
.woocommerce-info .button,
.woocommerce-error .button {
    background-color: var(--nrs-cta-bg) !important;
    border-color: var(--nrs-cta-bg) !important;
    color: var(--nrs-cta-ink) !important;
    padding: 9px 18px !important;
    line-height: 1.3 !important;
    border-radius: var(--nrs-radius-sm) !important;
    white-space: nowrap;
}
.woocommerce-message .button:hover,
.woocommerce-info .button:hover,
.woocommerce-error .button:hover {
    background-color: var(--nrs-cta-bg-hover) !important;
    border-color: var(--nrs-cta-bg-hover) !important;
    color: var(--nrs-cta-ink-hover) !important;
}

/* ── 22.8 Stock status — SEMANTIC GREEN, KEPT ──────────────────────────── */
.woocommerce .stock,
.woocommerce div.product .stock,
.woocommerce p.stock.in-stock,
.woocommerce .summary .stock.in-stock {
    color: var(--nirsha-success) !important;
    font-weight: 600;
}
.woocommerce .stock.out-of-stock,
.woocommerce p.stock.out-of-stock,
.woocommerce .summary .stock.out-of-stock {
    color: var(--nirsha-error) !important;
    font-weight: 600;
}
.woocommerce .stock.available-on-backorder,
.woocommerce p.stock.available-on-backorder {
    color: var(--nirsha-warning) !important;
    font-weight: 600;
}

/* ── 22.9 Tables — cart, checkout review, order details ─────────────────── */
.woocommerce table.shop_table,
.woocommerce table.woocommerce-table {
    background: var(--nirsha-card);
    border: 1px solid var(--nirsha-border);
}
.woocommerce table.shop_table th,
.woocommerce table.woocommerce-table th {
    background: var(--nirsha-sand);
    color: var(--nirsha-espresso);
    border-bottom: 1px solid var(--nirsha-border);
}
.woocommerce table.shop_table td,
.woocommerce table.shop_table tbody th,
.woocommerce table.shop_table tfoot td,
.woocommerce table.shop_table tfoot th {
    border-top: 1px solid var(--nirsha-border);
    color: var(--nrs-ink-2);
}
.woocommerce table.shop_table .product-name a { color: var(--nirsha-espresso); font-weight: 600; }
.woocommerce table.shop_table .product-name a:hover { color: var(--nirsha-gold-ink); }
.woocommerce table.shop_table .amount,
.woocommerce .cart_totals .amount,
.woocommerce-checkout #order_review .amount { color: var(--nirsha-cocoa); font-weight: 600; }
.woocommerce .cart_totals h2,
.woocommerce-checkout #order_review_heading { color: var(--nirsha-espresso); font-family: var(--nrs-font-display); }

/* ── 22.10 Checkout — restrained, never decorative ──────────────────────── */
.woocommerce form .form-row label { color: var(--nirsha-espresso); font-weight: 600; }
.woocommerce form .form-row .required { color: var(--nirsha-error); }
.woocommerce form .form-row.woocommerce-invalid input.input-text,
.woocommerce form .form-row.woocommerce-invalid select {
    border-color: var(--nirsha-error) !important;
    box-shadow: 0 0 0 3px rgba(166,61,50,0.14) !important;
}
.woocommerce form .form-row.woocommerce-validated input.input-text {
    border-color: var(--nirsha-success) !important;
}
/* Payment / COD selection has to be obvious — the chosen method gets a cocoa
   border AND a sand fill, so it is readable without relying on the radio dot. */
.woocommerce-checkout #payment {
    background: var(--nirsha-card);
    border: 1px solid var(--nirsha-border);
    border-radius: var(--nrs-radius);
}
.woocommerce-checkout #payment ul.payment_methods {
    border-bottom: 1px solid var(--nirsha-border);
    background: transparent;
}
.woocommerce-checkout #payment ul.payment_methods li {
    border: 1px solid var(--nirsha-border);
    border-radius: var(--nrs-radius-sm);
    padding: 14px 16px;
    margin-bottom: 10px;
    background: var(--nirsha-card);
    transition: border-color .18s ease, background-color .18s ease;
}
.woocommerce-checkout #payment ul.payment_methods li:hover { border-color: var(--nirsha-gold); }
.woocommerce-checkout #payment ul.payment_methods li label { color: var(--nirsha-espresso); font-weight: 600; }
.woocommerce-checkout #payment ul.payment_methods li:has(input[type="radio"]:checked) {
    border-color: var(--nirsha-cocoa);
    box-shadow: inset 0 0 0 1px var(--nirsha-cocoa);
    background: var(--nirsha-sand);
}
.woocommerce-checkout #payment div.payment_box {
    background: var(--nirsha-sand) !important;
    color: var(--nrs-ink-2);
    border-radius: var(--nrs-radius-sm);
}
.woocommerce-checkout #payment div.payment_box::before {
    border-bottom-color: var(--nirsha-sand) !important;
}
.woocommerce-checkout #payment .place-order { padding-top: 18px; }
.woocommerce input[type="radio"],
.woocommerce input[type="checkbox"] { accent-color: var(--nirsha-cocoa); }
/* Order received / thank-you */
.woocommerce .woocommerce-order .woocommerce-thankyou-order-received {
    color: var(--nirsha-success-ink);
    font-weight: 600;
}
.woocommerce ul.order_details { background: var(--nirsha-sand); border-radius: var(--nrs-radius); padding: 22px 24px; }
.woocommerce ul.order_details li { color: var(--nrs-muted); border-right-color: var(--nirsha-border); }
.woocommerce ul.order_details li strong { color: var(--nirsha-espresso); }

/* ── 22.11 My Account ───────────────────────────────────────────────────── */
.woocommerce-account .woocommerce-MyAccount-content { color: var(--nrs-ink-2); }
.woocommerce-account .woocommerce-MyAccount-content a:not(.button) { color: var(--nirsha-cocoa); }
.woocommerce-account .woocommerce-MyAccount-content a:not(.button):hover { color: var(--nirsha-gold-ink); }
.woocommerce-account .woocommerce-Address-title a.edit { color: var(--nirsha-cocoa); }
.woocommerce form.login,
.woocommerce form.register,
.woocommerce-account .woocommerce-form-login {
    background: var(--nirsha-card);
    border: 1px solid var(--nirsha-border);
    border-radius: var(--nrs-radius);
}
.woocommerce-account .woocommerce-MyAccount-content mark,
.woocommerce mark { background: var(--nirsha-sand); color: var(--nirsha-espresso); }

/* ── 22.12 Wishlist + Quick view (third-party; overridden, never edited) ──
   Wishlist is a saved-for-later preference, NOT a success state, so its active
   colour is Antique Gold rather than green (§26). The plugin popup IS a success
   confirmation, so that one keeps the semantic green — retinted from the
   plugin default mint to the Nirsha success token. */
.woosw-btn,
.ct-woosw-btn,
.woocommerce .woosw-btn {
    color: var(--nirsha-cocoa) !important;
    transition: color .18s ease, background-color .18s ease, border-color .18s ease;
}
.woosw-btn:hover,
.ct-woosw-btn:hover { color: var(--nirsha-gold-ink) !important; }
.woosw-btn.woosw-added,
.woosw-btn.added,
.ct-woosw-btn.woosw-added {
    color: var(--nirsha-gold-dark) !important;
    font-weight: 600;
}
.woosw-popup .woosw-popup-inner .woosw-popup-content .woosw-popup-content-bot .woosw-notice {
    background-color: var(--nirsha-success) !important;
    color: var(--nirsha-ivory) !important;
}
.woosw-popup .woosw-popup-inner .woosw-popup-content .woosw-popup-content-bot a {
    color: var(--nirsha-cocoa) !important;
    border-color: var(--nirsha-cocoa) !important;
}
.woosq-btn, .woocommerce .woosq-btn { color: var(--nirsha-cocoa) !important; }
.woosq-btn:hover { color: var(--nirsha-gold-ink) !important; }
.woosq-popup .woosq-popup-inner { background: var(--nirsha-card) !important; }
.woocommerce .woosw-empty,
.woosw-list .woosw-empty { color: var(--nrs-muted); }

/* ── 22.13 Search + zero-result state ───────────────────────────────────── */
.search-results .page-title,
.search-no-results .page-title { background-color: var(--nirsha-espresso); }
.woocommerce .woocommerce-no-products-found,
.search-no-results .no-results {
    background: var(--nirsha-sand);
    border-left-color: var(--nirsha-cocoa);
    color: var(--nirsha-espresso);
}

/* ── 22.14 404 + empty states ───────────────────────────────────────────── */
.error404 .page-content,
.error404 .not-found { color: var(--nrs-ink-2); }
.error404 .search-field,
.error404 input[type="search"] {
    background: var(--nirsha-card);
    border: 1px solid var(--nirsha-border);
    border-radius: var(--nrs-radius-sm);
    min-height: 48px; padding: 12px 16px;
    color: var(--nirsha-espresso);
}
.error404 .search-field:focus {
    border-color: var(--nirsha-gold);
    box-shadow: 0 0 0 3px rgba(59,36,27,0.22);
    outline: none;
}

/* ── 22.15 Mini-cart / header cart drawer ───────────────────────────────── */
.ct-widget-cart-sidebar,
.widget_shopping_cart_content { background: var(--nirsha-card); color: var(--nrs-ink-2); }
.widget_shopping_head, .widget_shopping_title { color: var(--nirsha-espresso); }
.widget_shopping_cart_content .total,
.widget_shopping_cart_content .amount { color: var(--nirsha-cocoa); }
.widget_shopping_cart_content .buttons a.button {
    background-color: var(--nrs-cta-bg) !important;
    border-color: var(--nrs-cta-bg) !important;
    color: var(--nrs-cta-ink) !important;
}
.widget_shopping_cart_content .buttons a.button:hover {
    background-color: var(--nrs-cta-bg-hover) !important;
    border-color: var(--nrs-cta-bg-hover) !important;
    color: var(--nrs-cta-ink-hover) !important;
}
.ct-widget-cart-overlay { background: rgba(32,23,19,0.55); }

/* ── 22.16 Scroll-to-top control ────────────────────────────────────────── */
.scroll-top,
.scroll-top.active {
    background: var(--nirsha-cocoa) !important;
    border-color: var(--nirsha-cocoa) !important;
    color: var(--nirsha-ivory) !important;
}
.scroll-top:hover {
    background: var(--nirsha-gold) !important;
    border-color: var(--nirsha-gold) !important;
    color: var(--nirsha-espresso) !important;
}

/* ── 22.17 Text selection ───────────────────────────────────────────────── */
::selection { background: rgba(184,137,59,0.32); color: var(--nirsha-espresso); }

/* ── 22.18 Universal focus fallback ─────────────────────────────────────
   Anything interactive that no earlier rule reached still gets a visible ring.
   Last in the file so it cannot be silently outranked. */
a:focus-visible,
button:focus-visible,
input:focus-visible,
select:focus-visible,
textarea:focus-visible,
summary:focus-visible,
[tabindex]:focus-visible {
    outline: 3px solid var(--nrs-focus);
    outline-offset: 2px;
}
.nrs-coll :focus-visible,
.nrs-gallery :focus-visible,
.nrs-ft-news :focus-visible,
.nrs-ft-main :focus-visible,
.nrs-ft-bar :focus-visible,
.nrs-slide :focus-visible,
.nrsp-hero :focus-visible,
.nrsp-cta :focus-visible,
#pagetitle :focus-visible {
    outline-color: var(--nirsha-gold);
}

/* ═══════════════════════════════════════════════════════════════════════════
   SECTION 23 — PARENT-THEME BRAND-GREEN SWEEP
   ---------------------------------------------------------------------------
   Organio prints a ~16KB inline block (handle `organio-theme-inline-css`) that
   hard-codes #5fa232 into a dozen very long selector lists — it is NOT derived
   from --primary-color, so re-pointing the theme options and the CSS variables
   could not reach it. The parent theme must not be edited, so the affected
   component families are answered here instead.

   A rendered-DOM audit (not a source grep) was used to find these: every
   element on Home / Shop / product / cart / checkout / account / wishlist was
   walked and its COMPUTED colour tested for green, including elements that are
   only revealed on hover or inside a modal. The list below is exactly what that
   audit returned — nothing speculative.

   These rules deliberately do NOT require a `.woocommerce` ancestor: the
   homepage Favorites rail renders WooCommerce card markup through a shortcode,
   so `body` never gets the `woocommerce` class and every `.woocommerce a.button`
   rule in §22 missed it. That is why the Add to Cart buttons on the homepage
   stayed green after the first pass.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── 23.1 Every Organio/WooCommerce button family → the one CTA treatment ── */
a.button, button.button, input.button,
a.btn, button.btn, input.btn,
.btn.btn-animate, .btn.btn-outline, .btn.btn-gradient,
.button-login, .btn-up-register, .btn-up-login,
button.search-submit, input.search-submit,
li.product .woocommerce-add-to-cart a,
li.product a.add_to_cart_button {
    background-color: var(--nrs-cta-bg);
    border-color: var(--nrs-cta-bg);
    color: var(--nrs-cta-ink);
    transition: background-color .2s ease, color .2s ease, border-color .2s ease;
    text-shadow: none;
}
a.button:hover, button.button:hover, input.button:hover,
a.btn:hover, button.btn:hover, input.btn:hover,
.btn.btn-animate:hover, .btn.btn-outline:hover, .btn.btn-gradient:hover,
.button-login:hover, .btn-up-register:hover, .btn-up-login:hover,
button.search-submit:hover, input.search-submit:hover,
li.product .woocommerce-add-to-cart a:hover,
li.product a.add_to_cart_button:hover,
a.button:focus-visible, button.button:focus-visible,
a.btn:focus-visible, button.btn:focus-visible {
    background-color: var(--nrs-cta-bg-hover);
    border-color: var(--nrs-cta-bg-hover);
    color: var(--nrs-cta-ink-hover);
}
/* The ghost / light / outline variants are intentional exceptions and must not
   be flattened by the sweep above. They are RE-DECLARED rather than merely set
   transparent: the sweep also rewrites `color`, so clearing only the background
   left the promotional-card CTAs as empty outlines with ivory labels on ivory —
   invisible. Each variant therefore restates its full pair here. */
.nrs-btn--ghost,
.nrsp-btn--outline {
    background-color: transparent;
    color: var(--nirsha-cocoa);
    border-color: rgba(59,36,27,0.28);
}
.nrs-btn--ghost:hover,
.nrsp-btn--outline:hover,
.nrsp-btn--outline:focus-visible {
    background-color: var(--nirsha-cocoa);
    color: var(--nirsha-ivory);
    border-color: var(--nirsha-cocoa);
}
/* Over photography: a light fill with an espresso label. */
.nrs-btn--light {
    background-color: var(--nirsha-ivory);
    color: var(--nirsha-espresso);
    border-color: var(--nirsha-ivory);
}
.nrs-btn--light:hover,
.nrs-btn--light:focus-visible {
    background-color: var(--nirsha-gold);
    color: var(--nirsha-espresso);
    border-color: var(--nirsha-gold);
}
.nrs-btn--ghost-light,
.nrsp-btn--ghost {
    background-color: transparent;
    color: var(--nirsha-ivory);
    border-color: rgba(251,247,239,0.58);
}
.nrs-btn--ghost-light:hover,
.nrsp-btn--ghost:hover,
.nrsp-btn--ghost:focus-visible {
    background-color: rgba(184,137,59,0.18);
    color: var(--nirsha-ivory);
    border-color: var(--nirsha-gold);
}
.nrs-fav__cta .nrs-btn {
    background-color: transparent;
    color: var(--nirsha-cocoa);
    border-color: rgba(59,36,27,0.28);
}
.nrs-fav__cta .nrs-btn:hover {
    background-color: var(--nirsha-cocoa);
    color: var(--nirsha-ivory);
    border-color: var(--nirsha-cocoa);
}
.woocommerce button[name="update_cart"],
.woocommerce input[name="update_cart"],
.woocommerce .coupon button.button {
    background-color: transparent;
    color: var(--nirsha-cocoa);
}

/* ── 23.2 Card hover controls — quiet, never a second CTA ────────────────
   Wishlist and Quick view sit ON the product photograph. A filled cocoa block
   there would compete with the real Add to Cart directly below it, so they are
   a warm card chip with a cocoa glyph, and only fill on hover. */
/* Scoped to product cards ONLY. The same .ct-woosw-btn class is used for the
   bare heart in the header, and giving that one a chip turned the masthead
   icon into a boxed button. */
li.product .woosw-btn, li.product .woosq-btn,
li.product button.woosw-btn, li.product button.woosq-btn,
.woocommerce-product-inner .woosw-btn,
.woocommerce-product-inner .woosq-btn {
    background-color: rgba(255, 253, 248, 0.94) !important;
    border: 1px solid var(--nirsha-border) !important;
    color: var(--nirsha-cocoa) !important;
    box-shadow: 0 2px 10px rgba(32, 23, 19, 0.12);
}
li.product .woosw-btn:hover, li.product .woosq-btn:hover,
li.product button.woosw-btn:hover, li.product button.woosq-btn:hover,
.woocommerce-product-inner .woosw-btn:hover,
.woocommerce-product-inner .woosq-btn:hover {
    background-color: var(--nirsha-cocoa) !important;
    border-color: var(--nirsha-cocoa) !important;
    color: var(--nirsha-ivory) !important;
}
/* Saved: Antique Gold, so "in your wishlist" is a premium mark rather than a
   success state (§26 — wishlist is a preference, not a confirmation). */
li.product .woosw-btn.woosw-added,
.woocommerce-product-inner .woosw-btn.woosw-added {
    background-color: var(--nirsha-gold) !important;
    border-color: var(--nirsha-gold) !important;
    color: var(--nirsha-espresso) !important;
}
/* ── 23.2a Header utility controls ─────────────────────────────────────────
   Layout 10 uses icon-font pseudo-elements. Organio declares several header
   colors with !important, so this one scoped source of truth must match that
   cascade while keeping the glyph, its parent and every state on Nirsha tokens. */
#ct-header-wrap #ct-header .ct-header-shop-icons .icon-item,
#ct-header-wrap #ct-header .ct-header-shop-icons .icon-item > i,
#ct-header-wrap #ct-header .ct-header-shop-icons .icon-item > i::before,
#ct-header-wrap #ct-header .ct-header-shop-icons .icon-item > a,
#ct-header-wrap #ct-header .ct-header-shop-icons .ct-woosw-btn,
#ct-header-wrap #ct-header .ct-header-shop-icons .woosw-btn {
    color: var(--nirsha-espresso) !important;
    opacity: 1 !important;
    transition: color .2s ease, border-color .2s ease !important;
}
#ct-header-wrap #ct-header .ct-header-shop-icons .ct-woosw-btn,
#ct-header-wrap #ct-header .ct-header-shop-icons .woosw-btn {
    background: transparent !important;
    border: 0 !important;
    box-shadow: none !important;
}
#ct-header-wrap #ct-header .ct-header-shop-icons .icon-item:hover,
#ct-header-wrap #ct-header .ct-header-shop-icons .icon-item:hover > i,
#ct-header-wrap #ct-header .ct-header-shop-icons .icon-item:hover > i::before,
#ct-header-wrap #ct-header .ct-header-shop-icons .icon-item:hover > a,
#ct-header-wrap #ct-header .ct-header-shop-icons .ct-woosw-btn:hover,
#ct-header-wrap #ct-header .ct-header-shop-icons .woosw-btn:hover {
    color: var(--nirsha-gold-ink) !important;
}
#ct-header-wrap #ct-header .ct-header-shop-icons .ct-woosw-btn.woosw-added {
    color: var(--nirsha-gold-dark) !important;
}
#ct-header-wrap #ct-header .ct-header-shop-icons a:focus-visible,
#ct-header-wrap #ct-header .ct-header-shop-icons .icon-item:focus-visible,
#ct-menu-mobile .ct-mobile-meta-item:focus-visible,
.header-mobile-search .search-field:focus-visible,
.header-mobile-search .search-submit:focus-visible {
    outline: 2px solid var(--nirsha-gold-ink) !important;
    outline-offset: 3px;
}

@media (max-width: 991px) {
    #ct-menu-mobile .ct-mobile-meta-item,
    #ct-menu-mobile .ct-mobile-meta-item > i,
    #ct-menu-mobile .ct-mobile-meta-item > i::before {
        color: var(--nirsha-espresso) !important;
        border-color: var(--nirsha-border) !important;
        opacity: 1 !important;
        transition: color .2s ease, border-color .2s ease !important;
    }
    #ct-menu-mobile .btn-nav-mobile > span,
    #ct-menu-mobile .btn-nav-mobile > span::before,
    #ct-menu-mobile .btn-nav-mobile > span::after {
        background-color: var(--nirsha-espresso) !important;
        opacity: 1 !important;
    }
    #ct-menu-mobile .ct-mobile-meta-item:hover,
    #ct-menu-mobile .ct-mobile-meta-item:active,
    #ct-menu-mobile .ct-mobile-meta-item.opened,
    #ct-menu-mobile .ct-mobile-meta-item:hover > i,
    #ct-menu-mobile .ct-mobile-meta-item:active > i,
    #ct-menu-mobile .ct-mobile-meta-item.opened > i {
        color: var(--nirsha-gold-ink) !important;
        border-color: var(--nirsha-gold-ink) !important;
    }
    #ct-menu-mobile .btn-nav-mobile:hover > span,
    #ct-menu-mobile .btn-nav-mobile:active > span,
    #ct-menu-mobile .btn-nav-mobile.opened > span,
    #ct-menu-mobile .btn-nav-mobile:hover > span::before,
    #ct-menu-mobile .btn-nav-mobile:hover > span::after,
    #ct-menu-mobile .btn-nav-mobile.opened > span::before,
    #ct-menu-mobile .btn-nav-mobile.opened > span::after {
        background-color: var(--nirsha-gold-ink) !important;
    }
}

/* ── 23.3 Login / register modal (case-theme-user) ──────────────────────── */
.ct-modal-close, div.ct-modal-close {
    background-color: var(--nirsha-cocoa) !important;
    color: var(--nirsha-ivory) !important;
}
.ct-modal-close:hover, div.ct-modal-close:hover {
    background-color: var(--nirsha-gold) !important;
    color: var(--nirsha-espresso) !important;
}
/* Field icons inside the modal were the parent theme's green. */
.remodal i.zmdi, .ct-modal i.zmdi,
.ct-user-form i.zmdi, .ct-login-form i.zmdi, .ct-register-form i.zmdi {
    color: var(--nirsha-gold-dark) !important;
}

/* ── 23.4 Sale price must not paint itself out ───────────────────────────
   Organio gives `ins` a filled --primary-color background with white text. Once
   --primary-color became cocoa and §22.3 set the ins TEXT to cocoa as well, the
   sale price rendered as a solid cocoa block with invisible numerals. The fill
   is dropped: on a premium storefront the sale price is carried by the struck
   old price beside it and the gold Sale badge, not by a highlighter. */
.price ins,
.woocommerce .price ins,
li.product .price ins,
.woocommerce div.product .summary .price ins {
    background: transparent !important;
    background-color: transparent !important;
    padding: 0 !important;
    text-decoration: none !important;
    color: var(--nirsha-cocoa) !important;
}
.price ins .woocommerce-Price-amount,
.woocommerce .price ins .woocommerce-Price-amount {
    color: var(--nirsha-cocoa) !important;
}

/* ── 23.5 Parent-theme accents that read as brand green ─────────────────── */
.ct-main-menu .sub-menu li > a:hover,
.ct-main-menu .children li > a:hover,
.ct-main-menu .sub-menu li.current-menu-item > a,
.ct-main-menu .children li.current-menu-item > a,
.ct-main-menu .sub-menu li.current_page_item > a,
.ct-main-menu .children li.current_page_item > a {
    color: var(--nirsha-gold-ink) !important;
}
.ct-main-menu .sub-menu li a::before,
.ct-main-menu .children li a::before { background-color: var(--nirsha-gold) !important; }
.ct-header-product-search .product-search-meta button {
    background-color: var(--nirsha-cocoa) !important;
    color: var(--nirsha-ivory) !important;
}
.ct-header-product-search .product-search-meta button:hover {
    background-color: var(--nirsha-gold) !important;
    color: var(--nirsha-espresso) !important;
}
.ct-fancy-box-layout5 .item--icon i,
.ct-icon1.style2 a:hover { color: var(--nirsha-gold-dark) !important; }
.revslider-initialised .tp-bullets.custom .tp-bullet.selected {
    background-color: var(--nirsha-gold) !important;
}
.ct-nav-carousel .nav-prev:hover,
.ct-nav-carousel .nav-next:hover {
    background-color: var(--nirsha-cocoa) !important;
    border-color: var(--nirsha-cocoa) !important;
    color: var(--nirsha-ivory) !important;
}
/* CF7's "invalid" outline is emitted green by the parent theme — an error must
   never be green. */
.wpcf7 form.invalid .wpcf7-response-output,
.wpcf7 form.unaccepted .wpcf7-response-output {
    border-color: var(--nirsha-error) !important;
}

/* ═══════════════════════════════════════════════════════════════════════════
   SECTION 24 — PARENT-THEME CART / CHECKOUT / PDP SURFACES
   ---------------------------------------------------------------------------
   Organio ships ~1,300 lines of its own WooCommerce styling under long
   `body.woocommerce-cart …` / `.woocommerce-checkout …` selectors that outrank
   §22. None of it is green — it is a COOL palette (navy #152136, #f8f8f8,
   #ebebeb, #222) that survived the migration and left the transactional pages
   reading a step colder than the rest of the site.
   Found by probing computed styles on a seeded cart, not by reading the file:
   the cart product links measured rgb(21,33,54) and the Cart Totals panel
   rgb(255,255,255) after §22 had supposedly set both.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── 24.1 Cart table ────────────────────────────────────────────────────── */
body.woocommerce-cart .woocommerce-cart-form .shop_table {
    background: var(--nirsha-card);
    border: 1px solid var(--nirsha-border);
    border-radius: var(--nrs-radius);
}
body.woocommerce-cart .woocommerce-cart-form .shop_table thead th {
    background: var(--nirsha-sand);
    color: var(--nirsha-espresso);
    border-bottom: 1px solid var(--nirsha-border);
}
body.woocommerce-cart .woocommerce-cart-form .shop_table tbody td {
    border-top: 1px solid var(--nirsha-border);
    color: var(--nrs-ink-2);
}
body.woocommerce-cart .woocommerce-cart-form tbody .product-name a {
    color: var(--nirsha-espresso);
    font-weight: 600;
}
body.woocommerce-cart .woocommerce-cart-form tbody .product-name a:hover {
    color: var(--nirsha-gold-ink);
}
body.woocommerce-cart .woocommerce-cart-form tbody .product-price,
body.woocommerce-cart .woocommerce-cart-form tbody .product-subtotal,
body.woocommerce-cart .woocommerce-cart-form tbody .product-price ins,
body.woocommerce-cart .woocommerce-cart-form tbody .product-subtotal ins {
    color: var(--nirsha-cocoa);
    background: transparent;
}
body.woocommerce-cart .woocommerce-cart-form tbody .product-price del,
body.woocommerce-cart .woocommerce-cart-form tbody .product-subtotal del {
    color: var(--nirsha-muted-ink);
}
/* Coupon field: same control language as every other input on the site. */
body.woocommerce-cart .woocommerce-cart-form table.cart td.actions .input-text,
body.woocommerce-cart #coupon_code {
    background: var(--nirsha-card);
    border: 1px solid var(--nirsha-border);
    border-radius: var(--nrs-radius-sm);
    color: var(--nirsha-espresso);
}
body.woocommerce-cart .woocommerce-cart-form table.cart td.actions .input-text:focus,
body.woocommerce-cart #coupon_code:focus {
    border-color: var(--nirsha-gold);
    box-shadow: 0 0 0 3px rgba(59, 36, 27, 0.22);
    outline: none;
}

/* ── 24.2 Cart totals panel ─────────────────────────────────────────────── */
body.woocommerce-cart .cart-collaterals .cart_totals,
body.woocommerce-cart .entry-content > .woocommerce .cart-collaterals .cart_totals {
    box-sizing: border-box;
    padding: clamp(20px, 2.4vw, 30px);
    background: #fbf7ef;
    border: 1px solid rgba(184, 137, 59, 0.3);
    border-radius: 16px;
    box-shadow: 0 10px 28px rgba(59, 36, 27, 0.07);
}
body.woocommerce-cart .cart_totals > h2 {
    margin: 0 0 16px;
    padding: 0 0 12px;
    color: var(--nirsha-espresso);
    border-bottom: 1px solid rgba(184, 137, 59, 0.28);
    font-family: var(--nrs-font-display);
    font-size: clamp(25px, 2vw, 30px);
    line-height: 1.2;
}
body.woocommerce-cart .cart_totals table.shop_table {
    width: 100%;
    margin: 0 0 18px;
    overflow: hidden;
    background: #fffdf9;
    border: 1px solid rgba(59, 36, 27, 0.1);
    border-radius: 12px;
    border-collapse: separate;
    border-spacing: 0;
}
body.woocommerce-cart .cart_totals table.shop_table th,
body.woocommerce-cart .cart_totals table.shop_table td {
    padding: 13px 12px;
    color: var(--nrs-ink-2);
    background: transparent;
    border: 0;
    vertical-align: middle;
    line-height: 1.45;
}
body.woocommerce-cart .cart_totals table.shop_table th {
    width: 46%;
    color: var(--nirsha-espresso);
    font-weight: 500;
    text-align: left;
}
body.woocommerce-cart .cart_totals table.shop_table td {
    text-align: right;
    overflow-wrap: anywhere;
}
body.woocommerce-cart .cart_totals tr.woocommerce-shipping-totals td { text-align: left; }
body.woocommerce-cart .cart_totals table.shop_table tr + tr th,
body.woocommerce-cart .cart_totals table.shop_table tr + tr td {
    border-top: 1px solid rgba(59, 36, 27, 0.1);
}
body.woocommerce-cart .cart_totals .woocommerce-shipping-totals ul#shipping_method {
    margin: 0;
    padding: 0;
    list-style: none;
    text-align: left;
}
body.woocommerce-cart .cart_totals .woocommerce-shipping-destination {
    margin: 7px 0 0;
    color: var(--nirsha-muted-ink);
    font-size: 0.9em;
    line-height: 1.5;
    text-align: left;
}
body.woocommerce-cart .cart_totals .shipping-calculator-button {
    display: inline-flex;
    align-items: center;
    min-height: 44px;
    margin-top: 3px;
    color: var(--nirsha-cocoa);
    font-weight: 600;
    text-decoration: underline;
    text-decoration-color: rgba(184, 137, 59, 0.6);
    text-underline-offset: 3px;
}
/* Avoid WooCommerce's icon-font glyph rendering as a stray block in Organio. */
body.woocommerce-cart .cart_totals .shipping-calculator-button::after { content: none; }
body.woocommerce-cart .cart_totals .order-total th,
body.woocommerce-cart .cart_totals .order-total td {
    padding-top: 16px;
    padding-bottom: 16px;
    color: var(--nirsha-cocoa);
    font-size: 1.08em;
    font-weight: 700;
}
body.woocommerce-cart .cart_totals .order-total td strong { font-weight: 700; }
body.woocommerce-cart .cart_totals .nirsha-estimate__note {
    display: block;
    margin-top: 4px;
    color: var(--nirsha-muted-ink);
    font-size: 0.78em;
    font-weight: 400;
    line-height: 1.35;
}
body.woocommerce-cart .nirsha-charge-callout--cart {
    margin: 0 0 16px;
    padding: 12px 14px;
    font-size: 0.9em;
    line-height: 1.45;
}
body.woocommerce-cart .wc-proceed-to-checkout { padding: 0; }
body.woocommerce-cart .wc-proceed-to-checkout a.checkout-button {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 100%;
    min-height: 54px;
    margin: 0;
    padding: 14px 18px;
    border: 1px solid var(--nirsha-espresso);
    border-radius: 10px;
    background: var(--nirsha-espresso);
    color: #fffdf9;
    font-size: 16px;
    font-weight: 700;
    line-height: 1.25;
    text-align: center;
    text-decoration: none;
    transition: background-color 0.18s ease, border-color 0.18s ease, transform 0.18s ease;
}
body.woocommerce-cart .wc-proceed-to-checkout a.checkout-button:hover {
    transform: translateY(-1px);
    border-color: var(--nirsha-cocoa);
    background: var(--nirsha-cocoa);
    color: #fffdf9;
}
body.woocommerce-cart .wc-proceed-to-checkout a.checkout-button:focus-visible,
body.woocommerce-cart .nrs-wa-cart__btn:focus-visible {
    outline: 3px solid var(--nirsha-gold);
    outline-offset: 3px;
}
body.woocommerce-cart .nrs-wa-cart { margin-top: 12px; }
body.woocommerce-cart .nrs-wa-cart__btn {
    min-height: 54px;
    border-radius: 10px;
    font-size: 16px;
}
body.woocommerce-cart .nrs-wa-cart__note {
    max-width: 38em;
    margin: 7px auto 0;
    font-size: 12px;
    line-height: 1.4;
    text-align: center;
}
@media (max-width: 767px) {
    body.woocommerce-cart .cart-collaterals .cart_totals,
    body.woocommerce-cart .entry-content > .woocommerce .cart-collaterals .cart_totals {
        width: 100%;
        max-width: 100%;
        padding: 18px;
    }
    body.woocommerce-cart .cart_totals > h2 { margin-bottom: 13px; font-size: 25px; }
    body.woocommerce-cart .cart_totals table.shop_table { margin-bottom: 15px; }
    body.woocommerce-cart .cart_totals table.shop_table th,
    body.woocommerce-cart .cart_totals table.shop_table td { padding: 12px 10px; }
    body.woocommerce-cart .cart_totals .order-total th,
    body.woocommerce-cart .cart_totals .order-total td { padding-top: 14px; padding-bottom: 14px; }
}
@media (max-width: 360px) {
    body.woocommerce-cart .cart-collaterals .cart_totals,
    body.woocommerce-cart .entry-content > .woocommerce .cart-collaterals .cart_totals { padding: 15px 13px; }
    body.woocommerce-cart .cart_totals table.shop_table th,
    body.woocommerce-cart .cart_totals table.shop_table td { padding: 11px 8px; font-size: 14px; }
    body.woocommerce-cart .nrs-wa-cart__btn,
    body.woocommerce-cart .wc-proceed-to-checkout a.checkout-button { font-size: 15px; }
}

/* ── 24.3 Checkout panels ───────────────────────────────────────────────── */
.woocommerce-checkout #customer_details .woocommerce-billing-fields > h3,
.woocommerce-checkout #customer_details .woocommerce-additional-fields > h3,
.woocommerce-checkout #order_review_heading {
    color: var(--nirsha-espresso);
    font-family: var(--nrs-font-display);
}
.woocommerce-checkout form.checkout_coupon {
    background: var(--nirsha-card);
    border: 1px solid var(--nirsha-border);
    border-radius: var(--nrs-radius);
}
.woocommerce-checkout #customer_details .woocommerce-shipping-fields #ship-to-different-address {
    color: var(--nirsha-espresso);
}
.woocommerce-checkout #customer_details .woocommerce-shipping-fields #ship-to-different-address:hover {
    color: var(--nirsha-gold-ink);
}
.woocommerce-checkout .woocommerce-checkout-review-order-table tfoot th,
.woocommerce-checkout .woocommerce-checkout-review-order-table tfoot td {
    color: var(--nirsha-espresso);
}
.woocommerce-checkout .woocommerce-checkout-review-order-table tfoot .order-total th,
.woocommerce-checkout .woocommerce-checkout-review-order-table tfoot .order-total td {
    color: var(--nirsha-cocoa); font-weight: 700;
}
.woocommerce-checkout .woocommerce-privacy-policy-text,
.woocommerce-checkout .woocommerce-terms-and-conditions-wrapper { color: var(--nrs-ink-2); }
.woocommerce-checkout .woocommerce-privacy-policy-text a,
.woocommerce-checkout .woocommerce-terms-and-conditions-wrapper a { color: var(--nirsha-cocoa); }

/* ── 24.4 Product detail — attribute + compliance tables ────────────────── */
/* "Product Information" and "Additional information" are the blocks a customer
   reads closely. Espresso ink on a card ground, warm rules, sand header cells —
   readability first, and NOT a gold heading on every row (§22). */
.single-product #primary div.product .woocommerce-tabs .woocommerce-Tabs-panel .shop_attributes th,
.single-product > div.product .woocommerce-tabs .woocommerce-Tabs-panel .shop_attributes th,
.single-product #primary div.product .woocommerce-tabs .woocommerce-Tabs-panel .shop_attributes td,
.single-product > div.product .woocommerce-tabs .woocommerce-Tabs-panel .shop_attributes td {
    border-bottom: 1px solid var(--nirsha-border);
    color: var(--nrs-ink-2);
}
.woocommerce table.shop_attributes th { background: var(--nirsha-sand); color: var(--nirsha-espresso); }
.woocommerce table.shop_attributes { border: 1px solid var(--nirsha-border); border-radius: var(--nrs-radius-sm); overflow: hidden; }
/* Tabs: the selected panel is cocoa-filled, the rest sand — a colour AND a fill
   change, so the active tab is never signalled by hue alone. */
.woocommerce div.product .woocommerce-tabs ul.tabs li,
.woocommerce div.product .woocommerce-tabs ul.tabs li a {
    background: var(--nirsha-sand);
    color: var(--nirsha-espresso);
    border-color: var(--nirsha-border);
}
.woocommerce div.product .woocommerce-tabs ul.tabs li.active,
.woocommerce div.product .woocommerce-tabs ul.tabs li.active a {
    background: var(--nirsha-cocoa);
    color: var(--nirsha-ivory);
    border-color: var(--nirsha-cocoa);
}
.woocommerce div.product .woocommerce-tabs ul.tabs li:not(.active):hover,
.woocommerce div.product .woocommerce-tabs ul.tabs li:not(.active):hover a {
    background: var(--nirsha-border);
    color: var(--nirsha-cocoa);
}

/* ── 24.5 My Account tables + order status ─────────────────────────────── */
.woocommerce-account .woocommerce-orders-table thead th { background: var(--nirsha-sand); color: var(--nirsha-espresso); }
.woocommerce-account .woocommerce-orders-table td { color: var(--nrs-ink-2); border-color: var(--nirsha-border); }
.woocommerce-account .woocommerce-orders-table .woocommerce-orders-table__cell-order-number a { color: var(--nirsha-cocoa); font-weight: 600; }

/* ═══════════════════════════════════════════════════════════════════════════
   SECTION 25 — FOCUS RINGS THAT SURVIVE THE PARENT THEME
   ---------------------------------------------------------------------------
   Found by tabbing through every page with real Tab key events (a
   DevTools-forced :focus-visible is a rendering override the page's own
   getComputedStyle cannot see, so it reports false results — this was measured
   with Input.dispatchKeyEvent instead).

   Result of that walk: 15 of 17 controls on the Shop page already showed a
   cocoa ring. The two that did not were the product-card Add to Cart / Select
   options buttons, because Organio ships `outline: none` on `.button:focus`
   inside a selector list carrying an ID — high enough specificity to beat the
   §22.18 fallback. Answered here, with !important, because there is no
   specificity that reliably outranks an arbitrary ID list.

   The ring is ESPRESSO, not gold: these buttons turn gold on focus (Organio's
   own rule), and a gold ring around a gold button is not an indicator.
   ═══════════════════════════════════════════════════════════════════════════ */
.woocommerce a.button:focus-visible,
.woocommerce button.button:focus-visible,
.woocommerce input.button:focus-visible,
.woocommerce a.add_to_cart_button:focus-visible,
.woocommerce .single_add_to_cart_button:focus-visible,
.woocommerce #place_order:focus-visible,
.woocommerce .checkout-button:focus-visible,
li.product a.button:focus-visible,
li.product a.add_to_cart_button:focus-visible,
.nrs-btn:focus-visible,
.nrsp-btn:focus-visible,
.nrs-ft-news__btn:focus-visible,
a.btn:focus-visible,
button.btn:focus-visible {
    outline: 3px solid var(--nirsha-espresso) !important;
    outline-offset: 3px !important;
}
/* On the dark bands the espresso ring would vanish; gold there. */
.nrs-slide .nrs-btn:focus-visible,
.nrs-coll .nrs-btn:focus-visible,
.nrs-gallery .nrs-btn:focus-visible,
.nrs-ft-news__btn:focus-visible,
.nrsp-hero .nrsp-btn:focus-visible,
.nrsp-cta .nrsp-btn:focus-visible {
    outline-color: var(--nirsha-gold) !important;
}

/* The quantity spinner sits inside a bordered wrapper and has border:none of
   its own, so it had no focus state at all — the wrapper is given the ring. */
.woocommerce .quantity:focus-within,
.single-product .summary .quantity:focus-within {
    border-color: var(--nirsha-gold) !important;
    box-shadow: 0 0 0 3px rgba(59, 36, 27, 0.22) !important;
}
.woocommerce .quantity input.qty:focus,
.woocommerce .quantity input.qty:focus-visible { outline: none !important; }

/* Sidebar search input: the §22.6 focus rule was outranked by the parent's own
   widget styling, leaving a search box that gave no sign of being focused. */
.widget_product_search input[type="search"]:focus,
.widget_product_search input[type="text"]:focus,
.widget_search input[type="search"]:focus,
.widget-area input[type="search"]:focus,
.widget-area input[type="text"]:focus {
    border-color: var(--nirsha-gold) !important;
    box-shadow: 0 0 0 3px rgba(59, 36, 27, 0.22) !important;
    outline: none !important;
}

/* Product-detail tabs: Organio styles the <li>, so an `a:hover` never fired.
   Give the anchor the same treatment so pointer users get feedback too. */
.woocommerce div.product .woocommerce-tabs ul.tabs li:not(.active) a:hover {
    background: var(--nirsha-border);
    color: var(--nirsha-cocoa);
}

/* Sidebar category / archive links had no hover at all — the parent theme sets
   colour on the <li>, so `li a:hover` from §22.6 never applied. */
.widget-area .widget ul li a:hover,
.widget-area .widget ul li a:focus,
.widget-area .widget_product_categories li a:hover {
    color: var(--nirsha-gold-ink) !important;
}

/* ── 25.1 Mini-cart drawer (found by the rendered green audit) ────────────
   Organio's inline block hard-codes #5fa232 into a selector list that includes
   `.ct-close i` and the drawer's outline button; both sit BEHIND an off-canvas
   panel, so a source grep would have found them but a screenshot never would —
   the rendered audit caught them because it walks the DOM, hidden nodes
   included, and reports what each element WOULD paint. */
.ct-widget-cart-sidebar .ct-close,
.ct-widget-cart-sidebar .ct-close i,
.ct-widget-cart-sidebar .widget_shopping_head .ct-close,
.ct-widget-cart-sidebar .widget_shopping_head .ct-close i,
i.caseicon-close {
    color: var(--nirsha-espresso) !important;
}
.ct-widget-cart-sidebar .ct-close:hover,
.ct-widget-cart-sidebar .ct-close:hover i { color: var(--nirsha-gold-ink) !important; }

/* "View Cart" is the drawer's SECONDARY action — it stays an outline so it does
   not compete with the cocoa "Checkout" beside it. */
.ct-widget-cart-sidebar .widget_shopping_cart .widget_shopping_cart_footer p.buttons .btn.btn-outline,
.ct-widget-cart-sidebar .btn.btn-outline,
.widget_shopping_cart .buttons .btn.btn-outline {
    background-color: transparent !important;
    border-color: var(--nirsha-cocoa) !important;
    color: var(--nirsha-cocoa) !important;
}
.ct-widget-cart-sidebar .widget_shopping_cart .widget_shopping_cart_footer p.buttons .btn.btn-outline:hover,
.ct-widget-cart-sidebar .btn.btn-outline:hover,
.widget_shopping_cart .buttons .btn.btn-outline:hover {
    background-color: var(--nirsha-cocoa) !important;
    border-color: var(--nirsha-cocoa) !important;
    color: var(--nirsha-ivory) !important;
}
/* The mini-cart's own remove control is destructive — never brand green. */
.widget_shopping_cart a.remove_from_cart_button,
.ct-widget-cart-sidebar a.remove_from_cart_button {
    color: var(--nirsha-error) !important;
    background-color: transparent !important;
}
.widget_shopping_cart a.remove_from_cart_button:hover,
.ct-widget-cart-sidebar a.remove_from_cart_button:hover {
    color: var(--nirsha-ivory) !important;
    background-color: var(--nirsha-error) !important;
}

/* ── 25.2 Sale badge — same card, same badge, everywhere ──────────────────
   Organio hides `.woocommerce span.onsale` outright, so the Shop and category
   archives showed a struck-through price with no "Sale!" mark while the
   homepage rail (which the child theme had already un-hidden) showed one. Same
   product, same card component, two different answers — §21 asks for one card
   system across Homepage / Shop / Category / Search / Related / Wishlist, so
   the badge is restored on all of them.
   Position is derived from the markup, not guessed: the badge lives inside
   `a.woocommerce-loop-product__link`, whose ancestor `.woocommerce-product-header`
   is already `position: relative`, so the link is pinned to that box and the
   badge rides in its top-left corner over the image tile. */
/* Organio sizes the archive badge as a fixed CIRCLE (width/height + 100%
   radius), which clipped the word "Sale!" the moment it was made visible. The
   homepage rail already used a pill; both are unified on the pill here. */
.woocommerce ul.products li.product span.onsale,
.woocommerce-page ul.products li.product span.onsale {
    display: inline-block !important;
    position: static !important;
    width: auto !important;
    height: auto !important;
    min-width: 0 !important;
    min-height: 0 !important;
    margin: 0 !important;
    border-radius: 999px !important;
    padding: 5px 12px !important;
    line-height: 1.25 !important;
    font-size: 11px !important;
}
.woocommerce ul.products li.product > a.woocommerce-loop-product__link,
.woocommerce-page ul.products li.product > a.woocommerce-loop-product__link {
    position: absolute;
    top: 12px; left: 12px;
    z-index: 3;
    height: auto;
    line-height: 1;
}

/* ── 25.3 404 page ───────────────────────────────────────────────────────
   Organio paints `body.error404 { background-color: #f4fdf5 }` — a pale mint
   that reads unmistakably as the old organic-grocery palette on a full-page
   surface. It is desaturated enough (g − max(r,b) = 8) that the rendered green
   audit's threshold let it through; it was caught by eye and then confirmed by
   sampling the painted pixel. Warm Ivory instead, matching every other page
   ground (§33). */
body.error404 { background-color: var(--nirsha-ivory) !important; }
body.error404 .error-404-content h1,
body.error404 .error-404-content h2,
body.error404 .error-404-content .page-title { color: var(--nirsha-espresso); }
body.error404 .error-404-content p { color: var(--nrs-ink-2); }
/* Organio's demo 404 artwork is a green cartoon carrot on a mint ground — the
   single most off-brand image left on the site, and it is a THEME asset, not
   Nirsha photography. It is desaturated to sit inside the warm palette rather
   than removed, so the page keeps its illustration and its proportions while
   the green stops competing with the brand. Replacing the file properly is a
   design task for a Nirsha illustration, noted in the report. */
body.error404 .error-404-content img,
body.error404 img[src*="image-404"] {
    filter: sepia(0.55) saturate(0.65) hue-rotate(-18deg) contrast(0.95);
    opacity: 0.92;
}

/* ── 25.4 Variation price (variable products) ────────────────────────────
   The struck price inside `.woocommerce-variation-price` is a separate node
   from the summary price and kept Organio's pale cool grey — 1.6:1 on ivory,
   i.e. the "was" price on every variable product was effectively unreadable.
   Caught by the rendered contrast audit, not by reading the stylesheet. */
.woocommerce div.product .woocommerce-variation-price .price,
.woocommerce div.product .woocommerce-variation-price .price ins,
.woocommerce div.product .woocommerce-variation-price .price ins .amount,
.woocommerce div.product .woocommerce-variation-price .price > .amount {
    color: var(--nirsha-cocoa) !important;
    background: transparent !important;
}
.woocommerce div.product .woocommerce-variation-price .price del,
.woocommerce div.product .woocommerce-variation-price .price del .amount,
.woocommerce div.product .woocommerce-variation-price .price del bdi,
.woocommerce div.product .woocommerce-variation-price del,
.woocommerce div.product .woocommerce-variation-price del bdi,
.woocommerce div.product .woocommerce-variation-price del .woocommerce-Price-currencySymbol {
    color: var(--nirsha-muted-ink) !important;
    opacity: 1 !important;
}
.woocommerce div.product .woocommerce-variation-availability .stock { font-weight: 600; }

/* ── 25.5 Wishlist table prices ──────────────────────────────────────────
   The wishlist plugin renders its price as `.woosw-item--price > ins`, which
   none of the `.price ins` selectors reach, so it kept Organio's filled
   highlight — after --primary-color became cocoa that showed as a solid cocoa
   block with a white numeral inside it. Same treatment as every other price on
   the site: no fill, cocoa figure, muted struck price. */
.woosw-items .woosw-item--price ins,
.woosw-items .woosw-item--price ins .amount,
.woosw-items .woosw-item--price ins bdi,
.woosw-content .woosw-item--price ins {
    background: transparent !important;
    background-color: transparent !important;
    padding: 0 !important;
    text-decoration: none !important;
    color: var(--nirsha-cocoa) !important;
    font-weight: 700 !important;
}
.woosw-items .woosw-item--price,
.woosw-items .woosw-item--price .amount { color: var(--nirsha-cocoa) !important; }
.woosw-items .woosw-item--price del,
.woosw-items .woosw-item--price del .amount,
.woosw-items .woosw-item--price del bdi {
    color: var(--nirsha-muted-ink) !important;
    opacity: 1 !important;
}
.woosw-items .woosw-item--name a { color: var(--nirsha-espresso) !important; font-weight: 600; }
.woosw-items .woosw-item--name a:hover { color: var(--nirsha-gold-ink) !important; }
.woosw-items .woosw-item--time { color: var(--nrs-muted) !important; }

/* ── 25.6 Empty cart ─────────────────────────────────────────────────────
   WooCommerce reuses the `.woocommerce-info` class for the empty-cart message,
   and Organio deliberately strips it back to a centred icon-above-text empty
   state (transparent, no border, 112px of top padding for the medallion). The
   §22.7 notice treatment applied a sand fill and a cocoa left border to it with
   !important, which collapsed that empty state into a 228px box with the text
   spilling out of it. The notice styling is excluded here so Organio's layout
   stands; only its colours are brought onto the palette. */
body.woocommerce-cart .cart-empty.woocommerce-info,
.woocommerce .cart-empty.woocommerce-info {
    background: transparent !important;
    border: 0 !important;
    border-left: 0 !important;
    color: var(--nirsha-espresso) !important;
    text-align: center !important;
    font-size: 17px;
}
body.woocommerce-cart .cart-empty.woocommerce-info::before,
.woocommerce .cart-empty.woocommerce-info::before {
    background-color: var(--nirsha-sand) !important;
    color: var(--nirsha-cocoa) !important;
}
/* On an empty cart Organio's `.woocommerce` wrapper is display:flex, so
   `.wc-empty-cart-message` shrink-wrapped to 238px and the centred icon and
   message ended up hugging the left edge while the "Return to shop" button
   (a sibling, not inside the message) stayed centred on the full width. Making
   the message fill its row is what actually centres the empty state. */
.woocommerce-cart .woocommerce > .wc-empty-cart-message,
.woocommerce-cart .wc-empty-cart-message { flex: 1 1 100%; width: 100%; }
.woocommerce .return-to-shop { text-align: center; color: var(--nrs-ink-2); }

/* ═══════════════════════════════════════════════════════════════════════════
   SECTION 26 — PRODUCT-CARD CTA
   ---------------------------------------------------------------------------
   WHERE THE ARROW COMES FROM. It is not a pseudo-element and not ours: Organio's
   JS appends `<i class="flaticon-next"></i>` to the loop add-to-cart link after
   page load (it also adds `btn btn-animate`). The server HTML is a plain
   `<a>Add to cart</a>`. So there is already exactly ONE arrow, and the job here
   is to space it, not to add one — a `::after` glyph would have produced two.

   WHY IT LOOKED CRAMPED. Organio spaces the glyph with
   `… .woocommerce-add-to-cart:not(.woocommerce-add-to-cart-grid) a i { margin-left: 6px }`,
   and that selector requires a `.woocommerce` ancestor. The homepage Favorites
   rail renders WooCommerce card markup through the [nirsha_favorites] shortcode,
   so `body` never gets the `woocommerce` class and the rule misses — the glyph
   sat at margin-left 0, touching the label. That is the screenshot. Elsewhere it
   was 6px, which is still tight at this weight.

   The audit also found the same component rendering three different ways:

     context                 height  font    weight  radius  gap   icon box
     homepage Favorites      52px    14px    700     pill    0px   14x17
     shop / category         44px    16px    600     pill    6px   16x42  (stretched)
     search / related rail   44px    14px    600     6px     6px   16x23

   Three geometries, three type treatments, two radii, and an icon stretched to
   42px by `align-items: normal`. This block is the single authority for all of
   them, so the card CTA is one component again.

   SCOPE. Everything below sits under `li.product .woocommerce-add-to-cart`,
   which is exactly where Organio injects the glyph. Checkout, Place Order, the
   PDP add-to-cart, CF7, the newsletter, account actions and every `.nrs-btn`
   were confirmed to have no `<i>` and are untouched.

   `display: flex`, NOT `inline-flex`: these CTAs are full-width inside the card
   (`width: 100%` from R.5). `inline-flex` would shrink-wrap them to their label
   and change the card design, which is out of scope. Block-level flex gives the
   same centred text+arrow group the brief asks for.
   ═══════════════════════════════════════════════════════════════════════════ */

.elementor-element-nrsbest li.product .woocommerce-add-to-cart > a,
.elementor-element-nrsbest li.product .woocommerce-add-to-cart > .button,
.woocommerce ul.products li.product .woocommerce-add-to-cart > a,
.woocommerce ul.products li.product .woocommerce-add-to-cart > .button,
.single-product .related li.product .woocommerce-add-to-cart > a,
.single-product .related li.product .woocommerce-add-to-cart > .button,
li.product .woocommerce-add-to-cart > a.added_to_cart {
    align-items: center;
    justify-content: center;
    /* 10px: the midpoint of the 9–12px brief. 9 still read as tight against a
       600-weight label; 12 started to look like two separate elements. */
    gap: 10px;
    min-height: 48px;
    padding: 0 28px !important;
    border-radius: 999px !important;
    font-family: var(--nrs-font-body);
    font-size: 14px !important;
    font-weight: 600 !important;
    /* Was `line-height: 44px`, which is how a non-flex button fakes vertical
       centring. In a flex row that same value stretched the glyph's box to 42px
       tall. Normal leading plus align-items:center centres both properly. */
    line-height: 1.2 !important;
    letter-spacing: .02em;
    white-space: nowrap;
    text-align: center;
    box-sizing: border-box;
}

/* `display` is declared separately and excludes `.added`, because Organio hides
   the button once WooCommerce marks it added and shows the View cart link in its
   place. A blanket `display: flex !important` above brought the hidden button
   back and the card ended up showing BOTH — caught by re-running the added-state
   test after the first pass. */
.elementor-element-nrsbest li.product .woocommerce-add-to-cart > a:not(.added),
.elementor-element-nrsbest li.product .woocommerce-add-to-cart > .button:not(.added),
.woocommerce ul.products li.product .woocommerce-add-to-cart > a:not(.added),
.woocommerce ul.products li.product .woocommerce-add-to-cart > .button:not(.added),
.single-product .related li.product .woocommerce-add-to-cart > a:not(.added),
.single-product .related li.product .woocommerce-add-to-cart > .button:not(.added),
li.product .woocommerce-add-to-cart > a.added_to_cart {
    display: flex !important;
}
/* Organio's hide rule needs a `.woocommerce` ancestor, which the homepage rail
   does not have (same shortcode reason as the arrow spacing above), so there the
   added button stayed on screen NEXT TO the View cart link while Shop showed
   only View cart. Matched to Shop so the added state behaves identically in
   every context. */
.elementor-element-nrsbest li.product .woocommerce-add-to-cart > a.added { display: none !important; }

/* ── The arrow ───────────────────────────────────────────────────────────── */
.elementor-element-nrsbest li.product .woocommerce-add-to-cart > a > i,
.woocommerce ul.products li.product .woocommerce-add-to-cart > a > i,
.single-product .related li.product .woocommerce-add-to-cart > a > i {
    /* margin zeroed so `gap` is the ONE thing that sets this distance —
       Organio's margin-left:6px and a gap would otherwise compound to 16px in
       some contexts and 10px in others. */
    margin: 0 !important;
    flex: 0 0 auto;
    /* Lighter than the label by size rather than by colour, so the glyph stays
       inherit-coloured (ivory on the cocoa button) as the brief requires.
       !important because Organio's own `… .woocommerce-add-to-cart:not(…) a i`
       is a five-class selector and outranks this one — measured: without it the
       glyph stayed 16px on shop, search and the related rail while the homepage
       rail (which that selector cannot reach) correctly went to 11px. */
    font-size: .8em !important;
    line-height: 1 !important;
    opacity: .85;
    transform: translateX(0);
    /* !important for the same reason as font-size above: Organio sets
       `transition: 0.3s cubic-bezier(…)` on this glyph, which both overshoots
       the brief's 180–220ms and animates `all` — measured `all 0.3s` on shop
       against the intended 200ms on the homepage rail. */
    transition: transform 200ms ease, opacity 200ms ease !important;
}
.elementor-element-nrsbest li.product .woocommerce-add-to-cart > a:hover > i,
.elementor-element-nrsbest li.product .woocommerce-add-to-cart > a:focus-visible > i,
.woocommerce ul.products li.product .woocommerce-add-to-cart > a:hover > i,
.woocommerce ul.products li.product .woocommerce-add-to-cart > a:focus-visible > i,
.single-product .related li.product .woocommerce-add-to-cart > a:hover > i,
.single-product .related li.product .woocommerce-add-to-cart > a:focus-visible > i {
    transform: translateX(3px);
    opacity: 1;
}

/* ── Loading ─────────────────────────────────────────────────────────────
   WooCommerce's spinner is `a.loading::after` — absolutely positioned at
   `right: 28px`, so it is not a flex item and `gap` never reaches it. It would
   simply appear alongside the arrow, giving the button two trailing marks at
   once. The arrow stands down while the spinner is running. */
li.product .woocommerce-add-to-cart > a.loading > i { display: none !important; }

/* ── Added ───────────────────────────────────────────────────────────────
   WooCommerce hides the button and injects `<a class="added_to_cart wc-forward">
   View cart</a>` as its sibling in the same slot. That link carries NO
   flaticon-next — its arrow is Organio's own `::after` in the Caseicon font, so
   there is still exactly one arrow and no double-up. It was rendering gold at
   rest, which inverted the system (gold is the hover, cocoa is the rest state)
   and made the replacement look unlike the button it replaced. */
li.product .woocommerce-add-to-cart > a.added_to_cart {
    background-color: var(--nrs-cta-bg) !important;
    border: 1px solid var(--nrs-cta-bg) !important;
    color: var(--nrs-cta-ink) !important;
    margin-top: 8px;
}
li.product .woocommerce-add-to-cart > a.added_to_cart:hover,
li.product .woocommerce-add-to-cart > a.added_to_cart:focus-visible {
    background-color: var(--nrs-cta-bg-hover) !important;
    border-color: var(--nrs-cta-bg-hover) !important;
    color: var(--nrs-cta-ink-hover) !important;
}
/* Its Caseicon ::after IS a flex item, so `gap` spaces it — the theme's own
   margin-left must go or the two would add up. */
li.product .woocommerce-add-to-cart > a.added_to_cart::after {
    margin: 0 !important;
    font-size: .8em;
    line-height: 1;
    opacity: .85;
    transform: translateX(0);
    transition: transform 200ms ease, opacity 200ms ease;
}
li.product .woocommerce-add-to-cart > a.added_to_cart:hover::after {
    transform: translateX(3px);
    opacity: 1;
}

/* ── Reduced motion ──────────────────────────────────────────────────────
   The nudge is decorative. Colour still changes on hover, so the state is never
   signalled by movement alone. */
@media (prefers-reduced-motion: reduce) {
    /* Selectors mirror the ones above exactly. A shorter selector here would
       lose to them on specificity even with !important, leaving a declaration
       that reads as if it applies and does not. */
    .elementor-element-nrsbest li.product .woocommerce-add-to-cart > a > i,
    .woocommerce ul.products li.product .woocommerce-add-to-cart > a > i,
    .single-product .related li.product .woocommerce-add-to-cart > a > i,
    li.product .woocommerce-add-to-cart > a.added_to_cart::after {
        transition: none !important;
    }
    .elementor-element-nrsbest li.product .woocommerce-add-to-cart > a:hover > i,
    .elementor-element-nrsbest li.product .woocommerce-add-to-cart > a:focus-visible > i,
    .woocommerce ul.products li.product .woocommerce-add-to-cart > a:hover > i,
    .woocommerce ul.products li.product .woocommerce-add-to-cart > a:focus-visible > i,
    .single-product .related li.product .woocommerce-add-to-cart > a:hover > i,
    .single-product .related li.product .woocommerce-add-to-cart > a:focus-visible > i,
    li.product .woocommerce-add-to-cart > a.added_to_cart:hover::after {
        transform: none !important;
    }
}

/* ── 26.1 Narrow screens ─────────────────────────────────────────────────
   Only the homepage Favorites rail needs these. It is the one context that
   stays TWO-up on a phone, so its button shrinks with the viewport — measured
   widths: 243px at 599, 183px at 480, 158px at 430, 138px at 390, 123px at 360,
   against a 117px "Choose Options" label at the canonical 14px. Shop, category,
   search and the related rail go one-up below 768px with 268–344px buttons, so
   they keep the full 28px padding, 14px type and the arrow at every width.
   That is why these steps are scoped and not global. */
@media (max-width: 599px) {
    .elementor-element-nrsbest li.product .woocommerce-add-to-cart > a,
    .elementor-element-nrsbest li.product .woocommerce-add-to-cart > .button,
    .elementor-element-nrsbest li.product .woocommerce-add-to-cart > a.added_to_cart {
        padding: 0 16px !important;
        letter-spacing: 0;
        gap: 8px;
    }
}
/* Below ~440px the label plus gap plus glyph plus padding no longer fits, so the
   GLYPH goes rather than the words — the label carries the meaning and the arrow
   is decoration. 13px is the site's interactive type floor (R.17), so the label
   stops shrinking there and the padding takes the last of the strain. */
@media (max-width: 439px) {
    .elementor-element-nrsbest li.product .woocommerce-add-to-cart > a,
    .elementor-element-nrsbest li.product .woocommerce-add-to-cart > .button,
    .elementor-element-nrsbest li.product .woocommerce-add-to-cart > a.added_to_cart {
        padding: 0 10px !important;
        font-size: 13px !important;
    }
    .elementor-element-nrsbest li.product .woocommerce-add-to-cart > a > i,
    .elementor-element-nrsbest li.product .woocommerce-add-to-cart > a.added_to_cart::after {
        display: none !important;
    }
}
@media (max-width: 380px) {
    .elementor-element-nrsbest li.product .woocommerce-add-to-cart > a,
    .elementor-element-nrsbest li.product .woocommerce-add-to-cart > .button,
    .elementor-element-nrsbest li.product .woocommerce-add-to-cart > a.added_to_cart {
        padding: 0 8px !important;
    }
}

/* ═══════════════════════════════════════════════════════════════════════════
   CHECKOUT PAGE BACKGROUND
   Scoped to the checkout main content area only (#content.site-content lives
   BETWEEN #pagetitle and #colophon, so the header, the checkout hero/banner,
   the newsletter and the footer are all outside it and untouched).

   Two stacked pseudo-element layers keep the form itself at full opacity:
     ::before  z-0  — the photograph, opacity 0.22
     ::after   z-1  — an ivory wash that knocks it back further
     content   z-2  — every checkout element, 100% opaque, unchanged
   Net image visibility ≈ 15–17% on desktop, ≈ 12% on small screens.
   ═══════════════════════════════════════════════════════════════════════════ */
.woocommerce-checkout #content.site-content {
    position: relative;
    isolation: isolate;
}
.woocommerce-checkout #content.site-content::before,
.woocommerce-checkout #content.site-content::after {
    content: "";
    position: absolute;
    inset: 0;
    pointer-events: none;
}
.woocommerce-checkout #content.site-content::before {
    z-index: 0;
    background-image: url("assets/images/nirsha-checkout-bg.png");
    background-size: cover;          /* fills the area, aspect ratio preserved */
    background-position: center center;
    background-repeat: no-repeat;
    background-attachment: scroll;   /* never `fixed` — breaks on iOS */
    opacity: 0.22;
}
.woocommerce-checkout #content.site-content::after {
    z-index: 1;
    background: rgba(251, 247, 239, 0.30);   /* --nirsha-ivory wash */
}
.woocommerce-checkout #content.site-content > .content-inner {
    position: relative;
    z-index: 2;
}
/* Tablet and phone: less room, so readability wins — deepen the wash rather
   than touching any checkout layout. */
@media (max-width: 991px) {
    .woocommerce-checkout #content.site-content::after  { background: rgba(251, 247, 239, 0.35); }
}
@media (max-width: 575px) {
    .woocommerce-checkout #content.site-content::after  { background: rgba(251, 247, 239, 0.42); }
}

/* ─────────────────────────────────────────────────────────────────────────
   Add-to-cart loading spinner — vertical centring fix.

   While WooCommerce adds its "\e01c" spinner glyph to a button during the
   add-to-cart AJAX, Organio's own theme.css pins it to the TOP edge of the
   button (`top: 0`) on the product grid/loop and single-product buttons. On
   the 48–53px pill buttons that glyph is clipped and reads as a broken mark in
   the top-right corner. Re-centre it vertically; horizontal position and the
   spin animation are left as the theme sets them.

   Scoped to the single-dash `.woocommerce-add-to-cart` grid button and the
   single-product button only — the theme's newer ring-style spinners
   (`.woocommerce-add-to--cart`, `.ct-loading-add-cart`) already centre
   correctly and are deliberately untouched. The theme rule carries a `:not()`
   that out-specifies a plain override, so `!important` is required here. */
.woocommerce .woocommerce-product-content .woocommerce-add-to-cart a.add_to_cart_button.loading::after,
.woocommerce .single_add_to_cart_button.loading::after {
    top: 50% !important;
    bottom: auto !important;
    margin-top: -0.5em !important;
    line-height: 1 !important;
}

/* ═══════════════════════════════════════════════════════════════════════════
   27. SINGLE PRODUCT — PREMIUM SURFACE + PURCHASE HIERARCHY
   ---------------------------------------------------------------------------
   The commerce controls and WooCommerce hooks remain unchanged.  This layer
   gives the page visual rhythm: compact context banner, one coherent buying
   card, a readable detail surface, and a distinct recommendations band.
   ═══════════════════════════════════════════════════════════════════════════ */

/* Keep the product-name banner requested by the owner, but let the product and
   buying action enter the first viewport instead of spending 220px on scenery. */
body.single-product #pagetitle {
    padding: 48px 0 !important;
    background-position: center 48% !important;
}
body.single-product #pagetitle .page-title {
    max-width: 900px;
    font-size: clamp(30px, 3vw, 42px);
    line-height: 1.15;
    letter-spacing: -0.02em;
}
body.single-product #pagetitle .ct-breadcrumb { margin-top: 10px; }

/* Layered page ground: brand warmth without putting a photograph behind copy. */
body.single-product #content.site-content {
    padding: 56px 0 0;
    background:
        radial-gradient(circle at 7% 9%, rgba(184,137,59,0.10) 0, rgba(184,137,59,0) 24rem),
        radial-gradient(circle at 94% 34%, rgba(59,36,27,0.055) 0, rgba(59,36,27,0) 28rem),
        var(--nirsha-ivory);
}

/* Gallery + purchase details read as one premium object. */
body.single-product #primary div.product > .woocommerce-summary-wrap {
    position: relative;
    isolation: isolate;
    overflow: hidden;
    margin: 0 0 52px !important;
    padding: clamp(22px, 3vw, 42px);
    background: rgba(255,253,248,0.96);
    border: 1px solid var(--nirsha-border);
    border-radius: 24px;
    box-shadow: 0 18px 55px rgba(59,36,27,0.10);
}
body.single-product #primary div.product > .woocommerce-summary-wrap::before {
    content: "";
    position: absolute;
    z-index: -1;
    width: 360px;
    height: 360px;
    right: -150px;
    top: -170px;
    border-radius: 50%;
    background: radial-gradient(circle, rgba(184,137,59,0.13), rgba(184,137,59,0) 70%);
    pointer-events: none;
}
body.single-product #primary div.product > .woocommerce-summary-wrap > [class*="col-"] {
    padding-left: clamp(10px, 1.5vw, 22px);
    padding-right: clamp(10px, 1.5vw, 22px);
}

/* Image stage: a quiet warm gradient separates transparent pack photography
   from the card without competing with the product itself. */
body.single-product #primary div.product .woocommerce-gallery {
    display: flex;
    align-items: center;
    min-height: 100%;
    padding: clamp(14px, 2vw, 24px);
    background: linear-gradient(145deg, var(--nirsha-ivory) 0%, #f7eddf 100%);
    border: 1px solid var(--nrs-line-2);
    border-radius: 18px;
}
body.single-product #primary div.product .woocommerce-product-gallery {
    margin-bottom: 0 !important;
}
body.single-product #primary div.product .woocommerce-product-gallery .woocommerce-product-gallery__image,
body.single-product #primary div.product .woocommerce-product-gallery .flex-viewport {
    padding-top: 0;
    padding-bottom: 0;
    background: transparent;
    border-radius: 14px;
    box-shadow: none;
}
body.single-product #primary div.product .woocommerce-product-gallery img {
    width: 100%;
    max-height: 560px;
    object-fit: contain;
    border-radius: 14px;
}
body.single-product #primary div.product .woocommerce-product-gallery .flex-control-nav {
    margin: 18px 0 0;
}
body.single-product #primary div.product .woocommerce-product-gallery .flex-control-nav li {
    margin-bottom: 8px;
}

/* Purchase panel: concise title rhythm and a visible gold brand cue. */
body.single-product #primary div.product .entry-summary {
    margin-bottom: 0;
    padding: 6px 4px 6px clamp(6px, 1vw, 16px);
}
body.single-product #primary div.product .entry-summary .woocommerce-sg-product-title::before {
    content: "";
    display: block;
    width: 48px;
    height: 3px;
    margin: 0 0 16px;
    border-radius: 99px;
    background: var(--nirsha-gold);
}
body.single-product #primary div.product .entry-summary .entry-title {
    margin: 0 0 12px;
    font-size: clamp(30px, 2.5vw, 40px);
    line-height: 1.15;
    color: var(--nirsha-espresso);
}
body.single-product #primary div.product .entry-summary .woocommerce-sg-product-price {
    padding-top: 4px;
    margin-bottom: 18px;
}
body.single-product #primary div.product .entry-summary .woocommerce-sg-product-excerpt {
    color: var(--nrs-ink-2);
    line-height: 1.7;
}

/* Simple products: price summary, quantity and CTA become one buying unit. */
body.single-product .product-type-simple .entry-summary form.cart {
    display: grid !important;
    grid-template-columns: 108px minmax(0, 1fr);
    gap: 12px;
    align-items: stretch;
    margin: 22px 0 16px !important;
}
body.single-product .product-type-simple .entry-summary form.cart .nrs-liveprice {
    grid-column: 1 / -1;
    margin-bottom: 0;
}
body.single-product .product-type-simple .entry-summary form.cart .quantity {
    grid-column: 1;
    width: 108px;
    min-height: 52px;
    margin: 0 !important;
    display: flex;
    align-items: center;
    justify-content: space-between;
}
body.single-product .product-type-simple .entry-summary form.cart .single_add_to_cart_button {
    grid-column: 2;
    width: 100%;
    min-height: 52px;
    margin: 0 !important;
    justify-content: center;
}
/* WooCommerce replaces an AJAX-added single-product button with a sibling
   `View cart` link. In this two-column purchase grid, that sibling otherwise
   auto-places into the 108px quantity column and wraps its label. Keep the
   replacement action on its own full-width row. */
body.single-product .product-type-simple .entry-summary form.cart > a.added_to_cart {
    grid-column: 1 / -1;
    display: flex !important;
    align-items: center;
    justify-content: center;
    width: 100%;
    min-width: 0;
    min-height: 52px;
    margin: 0 !important;
    padding: 14px 18px;
    box-sizing: border-box;
    line-height: 1.2;
    white-space: nowrap;
    text-align: center;
}

/* Variable products keep their variation table; only the final quantity/CTA
   row is consolidated so variation behaviour is untouched. */
body.single-product .entry-summary .woocommerce-variation-add-to-cart {
    display: flex;
    align-items: stretch;
    gap: 12px;
    flex-wrap: wrap;
}
body.single-product .entry-summary .woocommerce-variation-add-to-cart .nrs-liveprice {
    flex: 0 0 100%;
    width: 100%;
}
body.single-product .entry-summary .woocommerce-variation-add-to-cart .quantity {
    flex: 0 0 108px;
    min-height: 52px;
    margin: 0 !important;
}
body.single-product .entry-summary .woocommerce-variation-add-to-cart .single_add_to_cart_button {
    min-height: 52px;
    margin: 0 !important;
    justify-content: center;
}
body.single-product .entry-summary .woocommerce-variation-add-to-cart > a.added_to_cart {
    display: flex !important;
    align-items: center;
    justify-content: center;
    flex: 1 1 100%;
    width: 100%;
    min-width: 0;
    min-height: 52px;
    margin: 0 !important;
    padding: 14px 18px;
    box-sizing: border-box;
    line-height: 1.2;
    white-space: nowrap;
    text-align: center;
}

/* Pack sizes are purchase decisions, not tiny decorative swatches. Give every
   option a comfortable target and make the selected state unmistakable. */
body.single-product .entry-summary .variable-items-wrapper {
    display: flex;
    flex-wrap: wrap;
    gap: 10px;
}
body.single-product .entry-summary .variable-items-wrapper .variable-item {
    width: auto !important;
    min-width: 72px !important;
    height: 46px !important;
    min-height: 46px !important;
    margin: 0 !important;
    padding: 0 16px !important;
    background: var(--nirsha-card) !important;
    border: 1.5px solid var(--nirsha-border) !important;
    border-radius: 10px !important;
    box-shadow: none !important;
    color: var(--nirsha-espresso) !important;
    font-size: 15px !important;
    font-weight: 700 !important;
    line-height: 43px !important;
    text-align: center;
}
body.single-product .entry-summary .variable-items-wrapper .variable-item:hover,
body.single-product .entry-summary .variable-items-wrapper .variable-item:focus-visible {
    border-color: var(--nirsha-gold) !important;
    box-shadow: 0 0 0 3px rgba(184,137,59,0.18) !important;
}
body.single-product .entry-summary .variable-items-wrapper .variable-item.selected,
body.single-product .entry-summary .variable-items-wrapper .variable-item[aria-checked="true"] {
    background: var(--nirsha-cocoa) !important;
    border-color: var(--nirsha-cocoa) !important;
    box-shadow: 0 0 0 3px rgba(59,36,27,0.18) !important;
    color: var(--nirsha-ivory) !important;
}
body.single-product .entry-summary .variable-items-wrapper .variable-item.selected *,
body.single-product .entry-summary .variable-items-wrapper .variable-item[aria-checked="true"] * {
    color: var(--nirsha-ivory) !important;
}
/* Button swatches already expose their label. The plugin's duplicate tooltip
   can remain open after a touch selection and cover neighbouring pack sizes. */
body.single-product .entry-summary .variable-items-wrapper .button-variable-item::before,
body.single-product .entry-summary .variable-items-wrapper .button-variable-item::after {
    content: none !important;
    display: none !important;
}

/* Verifiable reassurance immediately after the primary action. */
.nrs-product-trust {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: 8px;
    margin: 0 0 16px;
    padding: 12px;
    list-style: none;
    background: var(--nirsha-sand);
    border: 1px solid var(--nirsha-border);
    border-radius: 12px;
}
.nrs-product-trust li {
    display: flex;
    align-items: center;
    gap: 7px;
    min-width: 0;
    color: var(--nirsha-espresso);
    font-size: 12px;
    font-weight: 600;
    line-height: 1.35;
}
.nrs-product-trust__mark {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex: 0 0 20px;
    width: 20px;
    height: 20px;
    border-radius: 50%;
    background: var(--nirsha-card);
    border: 1px solid var(--nirsha-gold);
    color: var(--nirsha-cocoa);
    font-size: 12px;
}

/* Metadata stays available but no longer competes with the buying controls. */
body.single-product #primary div.product .product_meta {
    margin-top: 18px;
    padding: 16px 0 0;
    border-top: 1px solid var(--nirsha-border);
    line-height: 1.7;
}

/* Description/review surface: controlled reading width and clear containment. */
body.single-product #primary div.product .woocommerce-tabs {
    max-width: 1120px;
    margin: 0 auto 42px;
    padding: 24px clamp(20px, 4vw, 52px) 38px;
    background: var(--nirsha-card);
    border: 1px solid var(--nirsha-border);
    border-radius: 20px;
    box-shadow: 0 12px 36px rgba(59,36,27,0.07);
}
body.single-product #primary div.product .woocommerce-tabs ul.wc-tabs {
    display: flex;
    justify-content: center;
    flex-wrap: wrap;
    gap: 8px;
    margin: 0 0 4px;
    padding: 0 0 20px;
    border-bottom: 1px solid var(--nirsha-border);
}
body.single-product #primary div.product .woocommerce-tabs ul.wc-tabs li {
    margin: 0;
}
body.single-product #primary div.product .woocommerce-tabs ul.wc-tabs li a {
    min-height: 44px;
    padding: 0 22px;
    border: 1px solid var(--nirsha-border);
    border-radius: 10px;
    font-size: 16px;
    line-height: 42px;
}
body.single-product #primary div.product .woocommerce-tabs .woocommerce-Tabs-panel.panel {
    max-width: 920px;
    margin: 0 auto;
    padding-top: 30px;
    color: var(--nrs-ink-2);
    font-size: 16px;
    line-height: 1.75;
}
body.single-product #primary div.product .woocommerce-tabs .woocommerce-Tabs-panel h2,
body.single-product #primary div.product .woocommerce-tabs .woocommerce-Tabs-panel h3 {
    color: var(--nirsha-espresso);
    line-height: 1.25;
}
body.single-product #primary div.product .woocommerce-tabs .woocommerce-Tabs-panel h2 {
    margin: 28px 0 12px;
    font-size: 28px;
}
body.single-product #primary div.product .woocommerce-tabs .woocommerce-Tabs-panel h3 {
    margin: 26px 0 10px;
    font-size: 23px;
}
body.single-product #primary div.product .woocommerce-tabs .woocommerce-Tabs-panel p {
    max-width: 78ch;
}
body.single-product #primary div.product .woocommerce-tabs .woocommerce-Tabs-panel--description ul {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 7px 30px;
    padding-left: 20px;
}

/* The Almond description previously placed four inline images inside its final
   paragraph. Two referenced deleted media and the remaining images staggered
   into a tall, empty column. The render filter supplies two verified images;
   this grid gives them equal, deliberate presentation. */
.nrs-description-gallery {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 18px;
    margin: 30px 0 0;
}
.nrs-description-gallery__item {
    overflow: hidden;
    aspect-ratio: 4 / 3;
    background: var(--nirsha-sand);
    border: 1px solid var(--nirsha-border);
    border-radius: 16px;
}
.nrs-description-gallery__image {
    display: block;
    width: 100% !important;
    height: 100% !important;
    margin: 0 !important;
    object-fit: cover;
}

/* Compliance declarations are their own compact card rather than a rule and a
   single fact floating on the page ground. */
body.single-product #primary div.product > .nirsha-food-info {
    max-width: 1120px;
    margin: 0 auto 42px;
    padding: clamp(20px, 3vw, 32px);
    background: var(--nirsha-card);
    border: 1px solid var(--nirsha-border);
    border-radius: 18px;
    box-shadow: 0 10px 28px rgba(59,36,27,0.06);
}
body.single-product #primary div.product > .nirsha-food-info .nirsha-food-info__facts {
    margin-bottom: 0;
}

/* Recommendations use the alternate brand band, ending the long cream field. */
body.single-product #primary div.product > section.related {
    margin: 0;
    padding: clamp(28px, 4vw, 48px) !important;
    background: linear-gradient(145deg, var(--nirsha-sand) 0%, #f7eddf 100%);
    border: 1px solid var(--nirsha-border);
    border-radius: 24px;
}
body.single-product #primary div.product > section.related h2 {
    color: var(--nirsha-espresso);
}
body.single-product #primary div.product > section.related ul.products {
    display: grid !important;
    grid-template-columns: repeat(4, minmax(0, 1fr));
    gap: 24px !important;
    margin-top: 28px;
}
/* WooCommerce's clearfix pseudo-elements become anonymous grid items unless
   removed, consuming column one and forcing the fourth product onto row two. */
body.single-product #primary div.product > section.related ul.products::before,
body.single-product #primary div.product > section.related ul.products::after {
    content: none !important;
    display: none !important;
}
body.single-product #primary div.product > section.related ul.products li.product {
    display: flex;
    width: auto !important;
    flex: none !important;
    max-width: none !important;
    margin-top: 0 !important;
}
body.single-product #primary div.product > section.related .woocommerce-product-inner {
    display: flex;
    flex-direction: column;
    width: 100%;
    height: 100%;
}
body.single-product #primary div.product > section.related .woocommerce-product-content {
    display: flex;
    flex: 1 1 auto;
    flex-direction: column;
}
body.single-product #primary div.product > section.related .woocommerce-add-to-cart {
    margin-top: auto;
}

@media (min-width: 768px) and (max-width: 1199px) {
    body.single-product #primary div.product > section.related ul.products {
        grid-template-columns: repeat(2, minmax(0, 1fr));
    }
}

@media (max-width: 767px) {
    body.single-product #pagetitle { padding: 30px 0 !important; }
    body.single-product #pagetitle .page-title { font-size: 28px; }
    body.single-product #pagetitle .ct-breadcrumb li { font-size: 13px; }

    body.single-product #content.site-content { padding-top: 26px; }
    body.single-product #primary div.product > .woocommerce-summary-wrap {
        margin-bottom: 28px !important;
        padding: 14px;
        border-radius: 16px;
        box-shadow: 0 10px 30px rgba(59,36,27,0.08);
    }
    body.single-product #primary div.product > .woocommerce-summary-wrap > [class*="col-"] {
        padding-left: 0;
        padding-right: 0;
    }
    body.single-product #primary div.product .woocommerce-gallery {
        margin-bottom: 22px;
        padding: 12px;
        border-radius: 14px;
    }
    body.single-product #primary div.product .entry-summary {
        position: static;
        padding: 10px 4px 4px;
    }
    body.single-product #primary div.product .entry-summary .entry-title {
        font-size: 30px;
    }
    .nrs-product-trust {
        grid-template-columns: 1fr;
        gap: 7px;
    }
    body.single-product #primary div.product .woocommerce-tabs {
        margin-bottom: 28px;
        padding: 14px;
        border-radius: 16px;
    }
    body.single-product #primary div.product .woocommerce-tabs ul.wc-tabs {
        display: grid;
        grid-template-columns: 1fr;
        gap: 6px;
        padding-bottom: 14px;
    }
    body.single-product #primary div.product .woocommerce-tabs ul.wc-tabs li,
    body.single-product #primary div.product .woocommerce-tabs ul.wc-tabs li a {
        width: 100%;
        margin: 0;
        text-align: center;
    }
    body.single-product #primary div.product .woocommerce-tabs .woocommerce-Tabs-panel.panel {
        padding: 22px 6px 6px;
        font-size: 15px;
    }
    body.single-product #primary div.product .woocommerce-tabs .woocommerce-Tabs-panel--description ul {
        grid-template-columns: 1fr;
        gap: 6px;
    }
    .nrs-description-gallery {
        grid-template-columns: 1fr;
        gap: 12px;
        margin-top: 22px;
    }
    body.single-product #primary div.product > .nirsha-food-info {
        margin-bottom: 28px;
        padding: 18px;
        border-radius: 16px;
    }
    body.single-product #primary div.product > section.related {
        padding: 24px 16px 32px !important;
        border-radius: 18px;
    }
    body.single-product #primary div.product > section.related ul.products {
        grid-template-columns: 1fr;
        gap: 18px !important;
    }
    body.single-product #primary div.product > section.related ul.products li.product {
        max-width: 420px !important;
        width: 100% !important;
        margin-left: auto !important;
        margin-right: auto !important;
    }
}

@media (max-width: 420px) {
    body.single-product .product-type-simple .entry-summary form.cart {
        grid-template-columns: 96px minmax(0, 1fr);
        gap: 10px;
    }
    body.single-product .product-type-simple .entry-summary form.cart .quantity {
        width: 96px;
    }
    body.single-product .entry-summary .woocommerce-variation-add-to-cart {
        flex-wrap: wrap;
    }
    body.single-product .entry-summary .woocommerce-variation-add-to-cart .single_add_to_cart_button {
        flex-basis: calc(100% - 108px - 12px);
    }
}

.nrs-faq-page { max-width: 900px; margin: 0 auto; padding: 32px 24px 64px; }
.nrs-faq-page__intro { margin-bottom: 28px; font-size: 18px; line-height: 1.7; }
.nrs-faq-page details { margin-bottom: 14px; padding: 20px 24px; background: var(--nirsha-card); border: 1px solid var(--nirsha-border); border-radius: 12px; }
.nrs-faq-page summary { color: var(--nirsha-cocoa); font-weight: 700; cursor: pointer; line-height: 1.5; }
.nrs-faq-page details p { margin: 16px 0 0; line-height: 1.75; }
.nrs-faq-page nav { display: flex; flex-wrap: wrap; gap: 20px; margin-top: 28px; }
.nrs-faq-page a { color: var(--nirsha-cocoa); text-decoration: underline; text-underline-offset: 4px; }
.nrs-faq-page summary:focus-visible { outline: 2px solid var(--nirsha-gold); outline-offset: 6px; }

/* Keyboard users must be able to reach category children without hovering. */
@media (min-width: 1200px) {
    #ct-header .ct-main-menu li:focus-within > .sub-menu {
        visibility: visible;
        opacity: 1;
        clip: auto;
        transform: scaleY(1);
    }
    #ct-header .ct-main-menu a:focus-visible {
        outline: 2px solid var(--nirsha-gold);
        outline-offset: -4px;
    }
}
/* NIRSHA storefront UI patch 2026-11-03 */
/* Hide the cramped product-list layout choice on every WooCommerce archive. */
.woocommerce-archive-layout .archive-layout.layout-list,
.woocommerce-page .woocommerce-archive-layout .archive-layout.layout-list {
    display: none !important;
}
/* ── 26.0 Product review experience ────────────────────────────────────
   Keep WooCommerce's native review form and moderation flow, while giving
   the read and write areas a clear, comfortable layout on every product. */
body.single-product #tab-reviews #reviews {
    display: grid !important;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 24px;
    align-items: stretch;
    color: var(--nrs-ink-2);
}
body.single-product #tab-reviews #comments,
body.single-product #tab-reviews #review_form_wrapper {
    float: none;
    width: auto;
    min-width: 0;
    margin: 0;
    padding: 24px;
    background: var(--nirsha-ivory);
    border: 1px solid var(--nirsha-border);
    border-radius: 16px;
}
body.single-product #tab-reviews .woocommerce-Reviews-title {
    margin: 0 0 18px;
    color: var(--nirsha-espresso);
    font-family: var(--nrs-font-display);
    font-size: clamp(23px, 2vw, 30px);
    line-height: 1.2;
}
body.single-product #tab-reviews .woocommerce-noreviews {
    margin: 0;
    padding: 18px;
    color: var(--nrs-ink-2);
    background: var(--nirsha-card);
    border: 1px dashed var(--nirsha-border);
    border-radius: 12px;
    line-height: 1.65;
}
body.single-product #tab-reviews #comments ol.commentlist {
    margin: 0;
    padding: 0;
}
body.single-product #tab-reviews #comments ol.commentlist li.review {
    margin: 0 0 14px;
    padding: 18px;
    list-style: none;
    background: var(--nirsha-card);
    border: 1px solid var(--nirsha-border);
    border-radius: 12px;
}
body.single-product #tab-reviews #comments .comment-text {
    margin: 0 0 0 58px;
    padding: 0;
    border: 0;
}
body.single-product #tab-reviews #comments .avatar {
    width: 42px;
    height: 42px;
    border: 2px solid var(--nirsha-card);
    border-radius: 50%;
}
body.single-product #tab-reviews #comments .meta {
    margin-bottom: 8px;
    color: var(--nirsha-espresso);
    font-size: 14px;
}
body.single-product #tab-reviews #comments .description {
    color: var(--nrs-ink-2);
    line-height: 1.7;
}
body.single-product #tab-reviews #respond {
    width: auto;
    margin: 0;
    padding: 24px;
    background: var(--nirsha-card);
    border: 1px solid var(--nirsha-border);
    border-radius: 14px;
}
body.single-product #tab-reviews #reply-title {
    display: block;
    margin: 0 0 12px;
    color: var(--nirsha-espresso);
    font-family: var(--nrs-font-display);
    font-size: 21px;
    font-weight: 700;
    line-height: 1.35;
}
body.single-product #tab-reviews .comment-notes,
body.single-product #tab-reviews .required-field-message {
    color: var(--nrs-ink-2);
    font-size: 14px;
    line-height: 1.6;
}
body.single-product #tab-reviews .comment-form-rating,
body.single-product #tab-reviews .comment-form-comment,
body.single-product #tab-reviews .comment-form-author,
body.single-product #tab-reviews .comment-form-email {
    margin: 18px 0;
}
body.single-product #tab-reviews .comment-form label {
    display: block;
    margin: 0 0 8px;
    color: var(--nirsha-espresso);
    font-size: 14px;
    font-weight: 600;
}
body.single-product #tab-reviews .comment-form textarea,
body.single-product #tab-reviews .comment-form input[type="text"],
body.single-product #tab-reviews .comment-form input[type="email"] {
    display: block;
    width: 100%;
    max-width: 100%;
    min-height: 48px;
    padding: 12px 14px;
    color: var(--nirsha-espresso);
    background: #fffdfa;
    border: 1px solid var(--nirsha-border);
    border-radius: 10px;
    box-shadow: none;
    font: inherit;
    transition: border-color .18s ease, box-shadow .18s ease;
}
body.single-product #tab-reviews .comment-form textarea {
    min-height: 150px;
    resize: vertical;
}
body.single-product #tab-reviews .comment-form textarea:focus,
body.single-product #tab-reviews .comment-form input[type="text"]:focus,
body.single-product #tab-reviews .comment-form input[type="email"]:focus {
    border-color: var(--nirsha-gold);
    outline: 0;
    box-shadow: 0 0 0 3px rgba(190, 137, 52, .16);
}
body.single-product #tab-reviews .comment-form-rating .stars {
    margin: 0;
}
body.single-product #tab-reviews .comment-form-rating .stars a {
    color: #b7a995;
    font-size: 25px;
    text-decoration: none;
}
body.single-product #tab-reviews .comment-form-rating .stars a:hover,
body.single-product #tab-reviews .comment-form-rating .stars a:focus,
body.single-product #tab-reviews .comment-form-rating .stars a.active {
    color: var(--nirsha-gold);
}
body.single-product #tab-reviews .comment-form-cookies-consent {
    display: flex;
    align-items: flex-start;
    gap: 9px;
    margin: 18px 0;
}
body.single-product #tab-reviews .comment-form-cookies-consent input {
    flex: 0 0 auto;
    margin: 4px 0 0;
    accent-color: var(--nirsha-cocoa);
}
body.single-product #tab-reviews .comment-form-cookies-consent label {
    margin: 0;
    color: var(--nrs-ink-2);
    font-size: 13px;
    font-weight: 400;
    line-height: 1.5;
}
body.single-product #tab-reviews .form-submit {
    margin: 20px 0 0;
}
body.single-product #tab-reviews .form-submit #submit {
    min-height: 50px;
    padding: 0 26px;
    color: var(--nirsha-card);
    background: var(--nirsha-espresso);
    border: 1px solid var(--nirsha-espresso);
    border-radius: 10px;
    font-weight: 700;
    cursor: pointer;
    transition: background .18s ease, transform .18s ease;
}
body.single-product #tab-reviews .form-submit #submit:hover,
body.single-product #tab-reviews .form-submit #submit:focus {
    background: var(--nirsha-cocoa);
    transform: translateY(-1px);
}
body.single-product #tab-reviews .form-submit #submit:focus-visible {
    outline: 3px solid var(--nirsha-gold);
    outline-offset: 3px;
}
@media (max-width: 767px) {
    body.single-product #tab-reviews #reviews {
        grid-template-columns: minmax(0, 1fr);
        gap: 14px;
    }
    body.single-product #tab-reviews #comments,
    body.single-product #tab-reviews #review_form_wrapper {
        padding: 14px;
    }
    body.single-product #tab-reviews #respond {
        padding: 18px;
    }
}
/* NIRSHA review card width correction 2026-11-03 */
body.single-product #tab-reviews #comments,
body.single-product #tab-reviews #review_form_wrapper {
    flex: none !important;
    width: 100% !important;
}
/* Combo Packs supplied artwork includes its own title and subtitle. */
body.tax-product_cat.term-combo-packs #pagetitle {
    height: 333px !important;
    min-height: 333px;
    max-height: 333px;
    aspect-ratio: auto;
    padding: 0 !important;
    background-position: center;
    background-size: cover !important;
}
body.tax-product_cat.term-combo-packs #pagetitle::before {
    background: linear-gradient(180deg, rgba(32,23,19,0.58) 0%, rgba(32,23,19,0.78) 100%) !important;
}
body.tax-product_cat.term-combo-packs #pagetitle .container,
body.tax-product_cat.term-combo-packs #pagetitle .page-title-inner {
    width: 100%;
    max-width: none;
    height: 100%;
}
body.tax-product_cat.term-combo-packs #pagetitle .page-title-inner {
    display: flex;
    align-items: center;
    justify-content: center;
}
body.tax-product_cat.term-combo-packs #pagetitle .page-title-holder h1.page-title {
    position: absolute !important;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border: 0;
}
body.tax-product_cat.term-combo-packs #pagetitle .ct-breadcrumb {
    display: none;
}
@media (max-width: 991px) {
    body.tax-product_cat.term-combo-packs #pagetitle {
        height: 313px !important;
        min-height: 313px;
        max-height: 313px;
    }
}
@media (max-width: 767px) {
    body.tax-product_cat.term-combo-packs #pagetitle {
        height: 301px !important;
        min-height: 301px;
        max-height: 301px;
    }
}