:root{--paper:#F4F1E9;--paper-2:#ECE6D8;--panel:#E5D9C2;--ink:#17140E;--ink-soft:#241F16;--rubric:#1F4E79;--rubric-dark:#163A5C;--eyebrow-mark:"\00A7";--accent-on-dark:#A7C2DD;--accent-creed:#8FB1D0;--accent-pale:#CFE0F0;--rubric-rgb:31,78,121;--mark-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='black'%3E%3Cpath d='M7 9.5C7 6.5 8 4.5 8.5 4.5 9 4.5 10 6.5 10 9 10 6 11 4 12 4 13 4 14 6 14 9 14 6.5 15 4.5 15.5 4.5 16 4.5 17 6.5 17 9.5 17 12.5 15 15 12 15.5 9 15 7 12.5 7 9.5Z'/%3E%3Cpath d='M11.4 15h1.2v7h-1.2z'/%3E%3Cpath d='M12 19C8.5 18.5 6.8 16.5 6.5 14 9.5 14.8 11.4 16.3 12 19Z'/%3E%3Cpath d='M12 19C15.5 18.5 17.2 16.5 17.5 14 14.5 14.8 12.6 16.3 12 19Z'/%3E%3C/svg%3E");--header-bg:#fff;--footer-bg:#173B5C;--muted:#6E6657;--line:rgba(23,20,14,.14);--line-lt:rgba(244,241,233,.16);}
/* Color-scheme toggle. Default = Geneva navy (blue) — the primary brand theme.
   Setting data-theme="red" on <html> swaps the accent back to the original rubric red
   + pilcrow eyebrow. The head script sets it from ?theme=blue|red (remembered in
   localStorage); each theme also overrides the on-dark/pale accent tints + --rubric-rgb. */
[data-theme="red"]{--rubric:#9E2B22;--rubric-dark:#85221b;--eyebrow-mark:"\00B6";--footer-bg:#7E211A;--accent-on-dark:#E7A79F;--accent-creed:#D98A82;--accent-pale:#F3CFCB;--rubric-rgb:158,43,34;}
*{box-sizing:border-box;}
body{margin:0;background:var(--paper);color:var(--ink);font-family:Inter,system-ui,sans-serif;font-size:16px;line-height:1.6;-webkit-font-smoothing:antialiased;min-height:100vh;display:flex;flex-direction:column;}
/* Sticky footer (all page templates): short pages stretch the main area so the
   footer sits at the bottom of the viewport instead of floating mid-page with
   blank space beneath it. Most pages wrap <main>+footer in <div class="page">;
   some (index, products, categories) put content/footer straight in <body>.
   These rules cover every variant — whichever wrapper exists grows to fill. */
.page{flex:1 0 auto;display:flex;flex-direction:column;}
#main{flex:1 0 auto;}
.foot{margin-top:auto;}
a{color:inherit;text-decoration:none;}img{max-width:100%;display:block;}
.wrap{max-width:1280px;margin:0 auto;padding:0 28px;}
/* Align the ECT/Bootstrap pages (products, proddetail) to the themed .wrap geometry so content
   — the breadcrumb especially — sits at the same width/left-edge as the rest of the site
   (header, footer, homepage, categories). Bootstrap's responsive .container (1140–1320px, 12px
   pad) otherwise makes the breadcrumb jump when navigating. Row(-12px)+col(12px) nets back to
   this 28px edge, so the grid math still works. */
.pg-products .container,.pg-proddetail .container{max-width:1280px;padding-left:28px;padding-right:28px;}
/* Mobile: tighten the site-wide side edges from 28px to 16px so content (esp. the product/
   category grids) gets more width on a phone. Covers the content .wrap, the announce bar +
   footer wraps (own explicit 28px), and the ECT/Bootstrap container override. */
@media(max-width:600px){.wrap,.utility .wrap,.foot .wrap,.pg-products .container,.pg-proddetail .container{padding-left:16px;padding-right:16px;}}
.serif{font-family:Fraunces,Georgia,serif;}
.rubric{font:500 .72rem/1 Inter;letter-spacing:.24em;text-transform:uppercase;color:var(--rubric);display:inline-flex;align-items:center;gap:.55em;}
.rubric::before{content:"";display:inline-block;width:1.15em;height:1.15em;background-color:currentColor;-webkit-mask:var(--mark-mask) center/contain no-repeat;mask:var(--mark-mask) center/contain no-repeat;}
.btn{display:inline-block;font:500 .82rem/1 Inter;letter-spacing:.1em;text-transform:uppercase;padding:15px 30px;border:1px solid var(--ink);cursor:pointer;transition:.18s;}
.btn-solid{background:var(--rubric);border-color:var(--rubric);color:var(--paper);}.btn-solid:hover{background:var(--rubric-dark);border-color:var(--rubric-dark);}
.btn-ghost{background:transparent;color:var(--paper);border-color:var(--line-lt);}.btn-ghost:hover{background:var(--paper);color:var(--ink);border-color:var(--paper);}

.utility{background:var(--ink);color:var(--paper);font:500 .72rem/1 Inter;letter-spacing:.14em;text-transform:uppercase;}
.utility .wrap{display:flex;align-items:center;justify-content:space-between;padding:10px 28px;}
.utility .msg .dot{color:var(--rubric);margin:0 .6em;}
.utility .msg .ann-flash{background:var(--rubric);color:var(--paper);padding:2px 9px;border-radius:2px;margin-left:.7em;letter-spacing:.08em;}
.utility .soc{display:flex;gap:14px;font-size:.95rem;}
.utility .soc a:hover{color:var(--rubric);}

.head{position:sticky;top:0;z-index:40;background:var(--header-bg);border-bottom:1px solid var(--line);}
/* Desktop (>=1024): single-row header — logo left · nav centred · icons right, all
 * in the 1280 wrap. DOM order is burger,brand,icons,navrow; grid-column places them.
 * Below 1024 this collapses to the compact burger + drawer bar (see the max-width
 * block further down). The nav shares the row now, so the mobile flip moved 920 -> 1024. */
.head .wrap.head-top{display:grid;grid-template-columns:auto 1fr auto;align-items:center;height:72px;gap:20px;}
.head-top .burger{display:none;}
/* grid-row:1 on all three so DOM order (burger,brand,icons,navrow) can't let grid's
 * sparse auto-placement bump the nav — placed after icons in the DOM — onto a 2nd row. */
.head-top .brand{grid-column:1;grid-row:1;justify-self:start;}
.head-top .navrow{grid-column:2;grid-row:1;min-width:0;align-self:stretch;}
.head-top .icons{grid-column:3;grid-row:1;justify-self:end;}
.navrow .menu{max-width:none;margin:0;padding:0;justify-content:center;height:100%;gap:2px;flex-wrap:nowrap;}
.navrow .menu>li>a{padding:10px 13px;white-space:nowrap;display:flex;align-items:center;align-self:stretch;}
.brand{font-family:Fraunces,serif;font-weight:600;font-size:1.44rem;letter-spacing:.01em;display:inline-flex;align-items:center;}.brand .amp{color:var(--rubric);}
.brand img{height:46px;width:auto;display:block;}
.d-top .brand img{height:30px;}
.menu{display:flex;gap:30px;list-style:none;margin:0;padding:0;height:100%;}
.menu>li{display:flex;align-items:center;}
.menu>li>a{font:500 .78rem/1 Inter;letter-spacing:.13em;text-transform:uppercase;padding:6px 0;transition:color .15s;position:relative;}
/* Tab indicator lives on the LINK, never the li. The li must stay UNPOSITIONED: the
 * full-width .mega panel is position:absolute; left/right:0 and anchors to the nearest
 * positioned ancestor — if the li is relative, the panel collapses to one item's width.
 * The link stretches full-height (single-row rule above), so bottom:0 sits at the header base. */
.menu>li>a::after{content:"";position:absolute;left:0;right:0;bottom:0;height:2.5px;background:var(--rubric);opacity:0;transition:opacity .15s;}
.menu>li:hover>a,.menu>li:focus-within>a{color:var(--rubric);}
.menu>li:hover>a::after,.menu>li:focus-within>a::after{opacity:1;}
.menu>li>a.nolink,.mega a.nolink,.drawer a.nolink{cursor:default;}   /* href-less items: trigger a submenu, navigate nowhere */
.icons{display:flex;gap:18px;align-items:center;}.icons a,.icons button{display:inline-flex;background:none;border:0;color:var(--ink);cursor:pointer;padding:0;}.icons svg{width:21px;height:21px;}
.icons #cartToggle{position:relative;overflow:visible;}
.cart-count{position:absolute;top:-6px;right:-8px;min-width:16px;height:16px;padding:0 4px;box-sizing:border-box;border-radius:8px;background:var(--rubric);color:#fff;font:600 .6rem/16px Inter;text-align:center;letter-spacing:.02em;pointer-events:none;}
.cart-count.hidden{display:none;}
.burger{display:none;appearance:none;-webkit-appearance:none;background:none;border:0;padding:0;margin:0;cursor:pointer;color:var(--ink);align-items:center;justify-content:center;}
.burger svg{width:24px;height:24px;display:block;}

/* No fade — the panel snaps straight to fully-opaque parchment. An opacity fade makes
 * the whole box (background included) translucent for its duration, which over the busy
 * hero slider reads as a broken, see-through, garbled panel. Instant open/close means it
 * is only ever fully absent or fully opaque — never a translucent in-between frame. */
.mega{position:absolute;left:0;right:0;top:100%;background:var(--paper);border-top:1px solid var(--line);box-shadow:0 26px 46px rgba(23,20,14,.12);opacity:0;visibility:hidden;transition:none;z-index:39;}
.menu>li:hover .mega,.menu>li:focus-within .mega{opacity:1;visibility:visible;}
/* nowrap keeps all containers on one row so a promo never floats to a second line; the text columns' flex-shrink then compresses them (links wrap within reason) to make room, while the fixed-width promos hold their size. */
.mega .inner{max-width:1280px;margin:0 auto;padding:30px 28px 36px;display:flex;flex-wrap:nowrap;justify-content:center;gap:22px 16px;align-items:flex-start;}
.mega .mh{flex:0 0 100%;margin-bottom:2px;}
.mega a{font-size:.84rem;color:#43403a;padding:4px 0;display:block;border-bottom:1px solid transparent;width:max-content;}
.mega a:hover{color:var(--rubric);}
/* Promo block (mType=promo) — featured image+caption card in the mega panel. */
.mega a.mega-promo{flex:0 0 177px;align-self:flex-start;width:auto;padding:0;border:0;border-radius:0;overflow:visible;background:none;box-shadow:none;}
.mega a.mega-promo .mega-promo-frame{display:block;overflow:hidden;background:#ECE6D8;}
.mega a.mega-promo img{display:block;width:177px;height:236px;object-fit:cover;border-radius:0;background:#ECE6D8;transition:opacity .4s ease, transform .5s;}
.mega a.mega-promo:hover .mega-promo-img{transform:scale(1.04);}
.mega .mega-promo-t{display:block;font-weight:500;color:var(--ink);padding:8px 0 0;font-size:.82rem;}
.mega a.mega-promo:hover .mega-promo-t{color:var(--rubric);}
.mega .mega-promo-b{display:block;color:#7a766c;font-size:.76rem;line-height:1.3;padding:1px 0 0;}
/* Grouped column (mType=group) / loose-link column: heading + child links. */
/* Text columns sit at their own content width (grow:0 → no empty padding inside a short block): narrow menus stay narrow, wider menus + fixed-width promos still fit one row, and columns shrink (text wraps within reason) before anything floats to a second row. max-width only caps a pathologically long single column; the panel's justify-content:center then clusters the blocks instead of stretching/spreading them. */
.mega .mega-col,.mega .mega-loose{flex:0 1 auto;min-width:0;max-width:240px;align-self:flex-start;}
.mega .mega-col a{width:auto;white-space:normal;line-height:1.25;}
/* 1-2 text columns: size to content (links don't wrap), plus a fixed breathing gutter so a dense column isn't cramped — a set amount beyond natural width, rather than growing to absorb all the slack (which over-pads short columns, the Discover-menu problem). */
.mega.mega-wide .mega-col,.mega.mega-wide .mega-loose{flex:0 1 auto;min-width:0;max-width:320px;padding-right:34px;}
.mega.mega-wide .mega-col-h,.mega.mega-wide .mega-col a{white-space:nowrap;}
/* Hairline "pinstripe" dividers between adjacent text columns only — never against an image block. Drawn as an absolutely-positioned pseudo-element so its height is independent of the column: it starts at the top of the content and runs the height of the promo image (236px, matching .mega-promo img). */
.mega .mega-col + .mega-col{position:relative;padding-left:22px;}
.mega .mega-col + .mega-col::before{content:"";position:absolute;left:0;top:0;height:236px;width:1px;background:var(--line);}
.mega .mega-col-h{display:block;font-size:.7rem;letter-spacing:.14em;text-transform:uppercase;color:#9b8f78;font-weight:600;padding:0;margin-bottom:4px;width:auto;}
/* lazysizes fade-in + parchment placeholder while the image loads. */
.mega a.mega-promo img{background:#ECE6D8;}
.mega img.lazyload{opacity:0;}
.mega img.lazyloaded{opacity:1;transition:opacity .4s ease;}
/* Below full desktop width, drop the feature image cards (they duplicate the
   text links) so the columns get the room; text menu stays to the drawer cutoff. */
@media(max-width:1280px){.mega a.mega-promo{display:none;}}

.slider{position:relative;background:var(--ink);color:var(--paper);overflow:hidden;max-width:1280px;margin:0 auto;touch-action:pan-y;}/* pan-y: let the page scroll vertically but keep horizontal swipes for the JS carousel (else the browser hijacks them and touchend never fires) */
.slides{display:flex;transition:transform .6s cubic-bezier(.4,0,.1,1);touch-action:pan-y;}/* pan-y on the track itself (where the swipe handlers live), not just .slider: reserve horizontal for the JS carousel so iOS can't claim the gesture for scrolling */
.slide{min-width:100%;position:relative;}
/* Kill iOS long-press on the slide links/images: if a finger lingers (a brief pause
   mid-swipe) iOS fires its callout / image-drag, which cancels the touch and stalls
   the swipe. Suppressing callout + selection + native drag keeps the gesture ours. */
.slide,.slide picture,.slide img{-webkit-touch-callout:none;-webkit-user-select:none;user-select:none;-webkit-user-drag:none;user-drag:none;}
.imgslide{display:block;}
.imgslide img{width:100%;height:auto;display:block;}
.slide .wrap{padding:108px 28px 104px;position:relative;z-index:2;}
.slide .rubric{color:var(--accent-creed);}
.slide h2{font-family:Fraunces,serif;font-weight:500;font-size:clamp(2.8rem,8vw,5.6rem);line-height:.98;letter-spacing:-.018em;margin:.5rem 0 1.3rem;max-width:13ch;}
.slide h2 em{font-style:italic;color:var(--rubric);}
.slide p{font-size:1.16rem;color:#CFC7B5;max-width:34ch;margin:0 0 2.1rem;}
.slide .ghost{position:absolute;right:-2%;bottom:-6%;font-family:Fraunces,serif;font-style:italic;font-size:clamp(5rem,15vw,12rem);color:rgba(244,241,233,.045);white-space:nowrap;z-index:1;pointer-events:none;}
/* Sleek circular "glass" arrows (replaces the old translucent squares). */
.s-arrow{position:absolute;top:50%;transform:translateY(-50%);z-index:5;display:flex;align-items:center;justify-content:center;width:42px;height:42px;border-radius:50%;border:0;background:rgba(23,20,14,.30);color:#fff;font-size:1.3rem;line-height:1;cursor:pointer;backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);box-shadow:0 2px 10px rgba(23,20,14,.18);transition:background .18s ease,transform .18s ease;}
.s-arrow:hover{background:rgba(23,20,14,.52);}
.s-arrow:active{transform:translateY(-50%) scale(.92);}
.s-arrow.prev{left:14px;}.s-arrow.next{right:14px;}
.dots{position:absolute;bottom:24px;left:0;right:0;display:flex;justify-content:center;gap:10px;z-index:5;}
.dot{width:9px;height:9px;border-radius:50%;border:1px solid rgba(244,241,233,.5);background:transparent;cursor:pointer;padding:0;}.dot.on{background:var(--rubric);border-color:var(--rubric);}
/* Mobile: lift the dots off the image into a discrete strip below it (on the page
   parchment, not a black bar), and drop the arrows — autoplay + dots already cue the swipe. */
@media(max-width:700px){
  .slider{background:var(--paper);}
  .dots{position:static;padding:13px 0 14px;}
  .dot{border-color:rgba(23,20,14,.32);}  /* visible on the light strip */
  .s-arrow{display:none;}
}

.section{padding:84px 0;}
.section-head{display:flex;align-items:flex-end;justify-content:space-between;margin-bottom:38px;gap:20px;flex-wrap:wrap;}
.section-head h2{font-family:Fraunces,serif;font-weight:500;font-size:clamp(1.9rem,4vw,2.7rem);letter-spacing:-.015em;margin:.5rem 0 0;}
.section-head .more{font:500 .76rem/1 Inter;letter-spacing:.13em;text-transform:uppercase;color:var(--rubric);border-bottom:1.5px solid var(--rubric);padding-bottom:3px;}

/* Interior page header (account, contact, faq, returns, legal, etc.) */
.page-hero{padding:48px 0 6px;}
.page-hero .crumb{font:500 .72rem/1 Inter;letter-spacing:.12em;text-transform:uppercase;color:var(--muted);margin-bottom:10px;}
.page-hero .crumb a{color:inherit;text-decoration:none;}.page-hero .crumb a:hover{color:var(--rubric);}
.page-hero h1{font-family:Fraunces,serif;font-weight:500;font-size:clamp(1.9rem,4vw,2.7rem);letter-spacing:-.015em;margin:0;}
.page-hero h1::before{content:"";display:inline-block;width:.74em;height:.74em;background-color:var(--rubric);-webkit-mask:var(--mark-mask) center/contain no-repeat;mask:var(--mark-mask) center/contain no-repeat;vertical-align:-.02em;margin-right:.5rem;}
.page-hero p.lede{color:var(--muted);max-width:60ch;margin:14px 0 0;}

/* Long-form content pages (policies, FAQ, care, shipping) */
.prose{max-width:72ch;margin:0 auto;}
.prose h2,.prose h3,.prose h4{font-family:Fraunces,serif;font-weight:500;letter-spacing:-.01em;margin:1.8em 0 .5em;}
.prose h2{font-size:1.55rem;}
.prose h3{font-size:1.3rem;}
.prose h4{font-size:1.12rem;}
.prose p,.prose li{line-height:1.7;}
.prose ul,.prose ol{padding-left:1.2em;margin:0 0 1em;}
.prose li{margin:.3em 0;}
.prose a{color:var(--rubric);text-decoration:underline;text-underline-offset:2px;}
.prose hr{border:0;border-top:1px solid var(--line);margin:1.8em 0;}
.prose blockquote{border-left:3px solid var(--rubric);padding-left:1em;margin:1.4em 0;color:var(--muted);}
.prose blockquote center{text-align:left;}

/* "Still need help?" style call-to-action band */
.cta-band{background:var(--ink);color:var(--paper);text-align:center;padding:56px 0;}
.cta-band h3{font-family:Fraunces,serif;font-weight:500;font-size:1.6rem;margin:0 0 18px;color:var(--paper);}

/* FAQ accordion (native details/summary, no JS) */
.faq{max-width:72ch;margin:0 auto;}
.faq details{border-top:1px solid var(--line);}
.faq details:last-child{border-bottom:1px solid var(--line);}
.faq summary{list-style:none;cursor:pointer;padding:18px 0;font-family:Fraunces,serif;font-size:1.12rem;font-weight:500;display:flex;justify-content:space-between;align-items:center;gap:1em;}
.faq summary::-webkit-details-marker{display:none;}
.faq summary::after{content:"+";color:var(--rubric);font-size:1.4em;line-height:1;}
.faq details[open] summary::after{content:"\2013";}
.faq details > div{padding:0 0 20px;max-width:68ch;}
.faq details > div p{margin:0 0 .8em;line-height:1.7;}
.faq a{color:var(--rubric);text-decoration:underline;text-underline-offset:2px;}

/* Contact page */
.contact-wrap{max-width:560px;margin:0 auto;}
.contact-wrap .form-control,.contact-wrap select,.contact-wrap textarea{margin-bottom:14px;}
.contact-wrap button{width:100%;}
.contact-meta{display:flex;flex-wrap:wrap;gap:24px;justify-content:center;margin:42px auto 0;max-width:560px;text-align:center;}
.contact-meta .ci{flex:1 1 200px;}
.contact-meta .ci i{color:var(--rubric);font-size:1.4rem;display:block;margin-bottom:8px;}
.contact-meta .ci h4{font-family:Fraunces,serif;font-weight:500;margin:0 0 .25em;}
.contact-meta .ci a{color:var(--rubric);}

/* 404 / error page */
.notfound{text-align:center;padding:90px 0;}
.notfound .code{font-family:Fraunces,serif;font-size:clamp(4rem,12vw,8rem);font-weight:500;color:var(--rubric);line-height:1;}
.notfound p{color:var(--muted);font-size:1.1rem;margin:12px 0 28px;}

/* ECT product-not-found state (proddetail.php → notfoundmarkup(): a #stextform wrapper holding
   .prodnoexist h1, .notfoundremoved, .notfoundtrysearch and a search bar). Bare/unstyled out of
   the box — give it the centred empty-state treatment matching .notfound above. NB: the class
   `notfoundinput` is on BOTH the wrapper div and the <input>, so disambiguate with div./input. */
.pg-proddetail #stextform{max-width:620px;margin:0 auto;text-align:center;padding:30px 0 12px;}
.pg-proddetail .prodnoexist{margin:0;}
.pg-proddetail .prodnoexist h1{font-family:Fraunces,serif;font-weight:500;font-size:clamp(1.7rem,4vw,2.5rem);line-height:1.14;color:var(--ink);margin:0 0 16px;}
.pg-proddetail .notfoundremoved{color:var(--muted);font-size:1.05rem;line-height:1.6;margin:0;}
.pg-proddetail .notfoundtrysearch{color:var(--ink);font-weight:500;margin:20px 0 14px;}
.pg-proddetail .notfoundinputcntnr{display:flex;justify-content:center;}
.pg-proddetail div.notfoundinput{display:flex;align-items:stretch;width:100%;max-width:420px;text-align:left;}
.pg-proddetail input.ecttextinput.notfoundinput{flex:1;min-width:0;border:1px solid var(--line);border-right:0;border-radius:2px 0 0 2px;padding:13px 15px;font:400 .98rem Inter;background:#fff;color:var(--ink);}
.pg-proddetail input.ecttextinput.notfoundinput:focus{outline:none;border-color:var(--ink);}
.pg-proddetail .notfoundsubmit{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;min-width:52px;border:1px solid var(--rubric);background:var(--rubric);color:var(--paper);border-radius:0 2px 2px 0;font-size:1.05rem;line-height:1;cursor:pointer;transition:.18s;}
.pg-proddetail .notfoundsubmit:hover{background:var(--rubric-dark);border-color:var(--rubric-dark);}
/* Optional "similar category" suggestion + contact-us fallback, if ECT emits them */
.pg-proddetail .prodnoexistaltcat{margin:22px 0 4px;}
.pg-proddetail .prodnoexistcatimg img{max-width:160px;height:auto;border:1px solid var(--line);border-radius:3px;}
.pg-proddetail .prodnoexistcat a,.pg-proddetail .notfoundcontact a{color:var(--rubric);}
.pg-proddetail .notfoundcontact{color:var(--muted);margin-top:22px;}

/* Gift certificate options */
.gift-duo{display:grid;grid-template-columns:repeat(2,1fr);gap:24px;}
.gift-tile{background:var(--paper-2);border:1px solid var(--line);padding:48px 36px;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:280px;}
.gift-tile .rubric{margin-bottom:14px;}
.gift-tile h2{font-family:Fraunces,serif;font-weight:500;margin:0 0 22px;font-size:1.7rem;}
@media(max-width:700px){.gift-duo{grid-template-columns:1fr;}}

/* Partner / client logo strip (about page) */
.logo-strip{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:38px;margin-top:6px;}
.logo-strip img{height:54px;width:auto;opacity:.55;filter:grayscale(1);transition:.2s;}
.logo-strip img:hover{opacity:1;filter:none;}
.grid{display:grid;grid-template-columns:repeat(4,1fr);gap:34px 26px;}
.card{position:relative;}
.card .frame{background:var(--paper-2);aspect-ratio:4/5;overflow:hidden;margin-bottom:16px;}
.card .frame img{width:100%;height:100%;object-fit:cover;transition:transform .5s;}
.card:hover .frame img{transform:scale(1.04);}
.card .nm{font-size:.98rem;line-height:1.35;margin-bottom:3px;}.card:hover .nm{color:var(--rubric);}
.card .pr{font:500 .92rem/1 Inter;color:var(--muted);}
.tag{position:absolute;top:12px;left:12px;background:var(--rubric);color:var(--paper);font:500 .62rem/1 Inter;letter-spacing:.14em;text-transform:uppercase;padding:6px 9px;}

/* Store-generated product blocks (ECT inccrosssell, fp-bs-*) */
.ectblock{padding:70px 0;}
.ectblock.alt{background:var(--paper-2);}
.ectblock .cstitle{font-family:Fraunces,serif;font-weight:500;font-size:clamp(1.8rem,4vw,2.6rem);letter-spacing:-.015em;margin:0 0 34px;}
.ectblock .cstitle::before{content:"";display:inline-block;width:.78em;height:.78em;background-color:var(--rubric);-webkit-mask:var(--mark-mask) center/contain no-repeat;mask:var(--mark-mask) center/contain no-repeat;vertical-align:-.04em;margin-right:.5rem;}
.cs-carousel{position:relative;}
/* overflow-y:hidden is deliberate — overflow-x:auto alone makes overflow-y compute to auto,
   giving the rail a few px of vertical scroll that absorbs page-scroll and jitters the row.
   justify-content:safe center centers a partial row but falls back to start when it overflows. */
.fp-bs-products{display:flex;gap:24px;justify-content:safe center;overflow-x:auto;overflow-y:hidden;scroll-snap-type:x mandatory;scroll-behavior:smooth;list-style:none;margin:0;padding:0 0 6px;scrollbar-width:none;}
.fp-bs-products::-webkit-scrollbar{display:none;}
.fp-bs-product{position:relative;flex:0 0 calc((100% - 72px)/4);scroll-snap-align:start;}/* 3 gaps × 24px = 72 */
.fp-bs-product.reveal{transform:none;}/* fade only — vertical rise would clip under overflow-y:hidden */
/* Sleek, discreet edge arrows. Hidden by default; each slides in only when the pointer
   is on its side of the rail (JS toggles .show-prev/.show-next on the wrap), and the arrow
   for an end you've already reached is removed (JS toggles .at-start/.at-end). */
.cs-arrow{position:absolute;top:46%;z-index:4;display:flex;align-items:center;justify-content:center;width:34px;height:34px;border:0;border-radius:50%;background:rgba(255,255,255,.8);color:var(--ink);font-size:1.05rem;line-height:1;cursor:pointer;opacity:0;box-shadow:0 2px 9px rgba(23,20,14,.12);backdrop-filter:blur(3px);-webkit-backdrop-filter:blur(3px);transition:opacity .2s ease, transform .2s ease, background .15s, color .15s;}
.cs-arrow.prev{left:8px;transform:translateY(-50%) translateX(-8px);}
.cs-arrow.next{right:8px;transform:translateY(-50%) translateX(8px);}
/* reveal the arrow for the hovered side (or on keyboard focus) — slide flush to the edge */
.cs-carousel.show-prev .cs-arrow.prev,.cs-carousel.show-next .cs-arrow.next,.cs-arrow:focus-visible{opacity:1;transform:translateY(-50%) translateX(0);}
.cs-arrow:hover{background:#fff;color:var(--rubric);}
/* no arrow pointing where you can't go: hide prev at the start, next at the end */
.cs-carousel.at-start .cs-arrow.prev,.cs-carousel.at-end .cs-arrow.next{display:none;}
.cs-carousel.no-overflow .cs-arrow{display:none;}/* nothing to scroll (partial row) — hide arrows */
/* Touch / mobile: no arrows at all — free-scroll with peeking neighbours is the cue
   (ScriptureType style). Dropping mandatory snap makes the rail glide instead of stopping. */
@media (hover:none){.cs-arrow{display:none;}.fp-bs-products{scroll-snap-type:none;}}
div.fp-bs-prodimage{background:var(--paper-2);aspect-ratio:4/5;overflow:hidden;margin-bottom:14px;}
.ectblock.alt div.fp-bs-prodimage{background:#E2DAC9;}
div.fp-bs-prodimage .ectlink,div.fp-bs-prodimage a{display:block;width:100%;height:100%;}
img.fp-bs-prodimage{width:100%;height:100%;object-fit:cover;transition:transform .5s;}
.fp-bs-product:hover img.fp-bs-prodimage{transform:scale(1.04);}
.fp-bs-prodname{font-size:.96rem;line-height:1.35;}
.fp-bs-prodname a{color:var(--ink);}
.fp-bs-product:hover .fp-bs-prodname a{color:var(--rubric);}
/* Narrower viewports: size the cards so the NEXT one peeks past the edge — the
   visual cue that the rail is swipeable (ScriptureType-style). The gesture itself
   is native: overflow-x:auto + scroll-snap (set above) give touch momentum + snap.
   scroll-padding-left keeps the snapped card off the container edge. */
@media(max-width:920px){.fp-bs-products{gap:18px;scroll-padding-left:0;}.fp-bs-product{flex:0 0 44%;}}
@media(max-width:600px){.fp-bs-product{flex:0 0 70%;}}
/* Mobile: let the horizontal card rails (cross-sell + reviews) break out of the page container
   to the viewport edges, so an off-screen card peeks at the very edge instead of stopping at the
   28px gutter. calc(50% - 50vw) reaches each edge regardless of container padding; the re-added
   28px keeps the first card aligned with the content/heading above and gives the last card room. */
@media(max-width:600px){
  .fp-bs-products,
  #reviews-slot .reviewscontainer{
    margin-left:calc(50% - 50vw);
    margin-right:calc(50% - 50vw);
    padding-left:16px;
    padding-right:16px;
    scroll-padding-left:16px;
  }
}
/* Detail-page related-product section titles ("You might also like", "More From This Collection",
   "Best Sellers"…). On proddetail and the cart these aren't inside .ectblock, so style them here — a
   centered Fraunces heading. Scoped to .pd-more / .pg-cart so the homepage titles are untouched. */
.pd-more .cstitle,.pg-cart .cstitle{font-family:Fraunces,serif;font-weight:500;font-size:clamp(1.3rem,2.2vw,1.7rem);letter-spacing:-.01em;color:var(--ink);text-align:center;width:fit-content;max-width:100%;margin:0 auto 30px;position:relative;}
/* Thin grey underline under the heading text, drawn in from the centre on scroll-in (mw.js adds
   .in to every .cstitle). Shared by proddetail's "more" section and the cart so both match;
   width:fit-content + margin:auto centers it regardless of the parent's text alignment. The
   homepage .ectblock heading keeps its logo-mark bullet instead, so it's excluded here. */
.pd-more .cstitle::after,.pg-cart .cstitle::after{content:"";position:absolute;left:10%;bottom:0;width:80%;height:1px;border-bottom:1px solid #ccc;padding-bottom:.25rem;transform-origin:center;}
.reveal-on .pd-more .cstitle::after,.reveal-on .pg-cart .cstitle::after{transform:scaleX(0);transition:transform .7s cubic-bezier(.2,.7,.2,1);}
.reveal-on .pd-more .cstitle.in::after,.reveal-on .pg-cart .cstitle.in::after{transform:scaleX(1);}

.brandintro{text-align:center;padding:82px 0 70px;}
.brandintro .rubric{justify-content:center;margin-bottom:1.25rem;}
.brandintro h2{font-family:Fraunces,serif;font-weight:500;font-size:clamp(1.9rem,4.6vw,3rem);line-height:1.08;letter-spacing:-.018em;margin:0 auto;max-width:17ch;}
.brandintro p{color:var(--muted);font-size:1.08rem;line-height:1.6;margin:1.1rem auto 0;max-width:52ch;}
/* Leaner top spacing for the bento tiles (the intro heading now lives in .brandline). */
.catfeature{padding-top:60px;}
.values{padding:18px 0 84px;}
.vgrid{display:grid;grid-template-columns:repeat(3,1fr);gap:46px;text-align:center;}
.vitem .seal{width:86px;height:86px;border-radius:50%;background:var(--paper-2);display:inline-flex;align-items:center;justify-content:center;margin-bottom:20px;position:relative;}
.vitem .seal::after{content:"";position:absolute;inset:7px;border:1px solid rgba(var(--rubric-rgb),.42);border-radius:50%;}
.vitem .seal i{font-size:30px;color:var(--rubric);line-height:1;}
.vitem h3{font-family:Fraunces,serif;font-weight:500;font-size:1.3rem;margin:0 0 9px;}
.vitem p{color:var(--muted);font-size:.95rem;line-height:1.6;margin:0 auto;max-width:32ch;}
@media(max-width:780px){.vgrid{grid-template-columns:1fr;gap:36px;}}
.ticker{background:var(--ink);color:var(--paper);overflow:hidden;padding:13px 0;}
.ticker-track{display:flex;width:max-content;animation:tickermove 32s linear infinite;}
.ticker:hover .ticker-track{animation-play-state:paused;}
.ticker-set{display:flex;align-items:center;flex:0 0 auto;}
.ticker .ph{font-family:Fraunces,serif;font-style:italic;font-size:1.12rem;padding:0 26px;white-space:nowrap;}
.ticker .sep{color:var(--rubric);font-size:.95rem;}
@keyframes tickermove{from{transform:translateX(0);}to{transform:translateX(-50%);}}
@media(prefers-reduced-motion:reduce){.ticker-track{animation:none;flex-wrap:wrap;justify-content:center;}.ticker .ph{padding:4px 16px;}}
.tmonials{padding:90px 0;background:var(--ink);color:var(--paper);}
.tmonials .t-head{text-align:center;margin-bottom:46px;}
.tmonials .t-head .rubric{justify-content:center;margin-bottom:1rem;color:#9A9079;}
.tmonials .t-head h2{font-family:Fraunces,serif;font-weight:500;font-size:clamp(1.9rem,4vw,2.7rem);letter-spacing:-.015em;margin:0;color:var(--paper);max-width:24ch;margin-inline:auto;}
/* Homepage "wall of praise": aggregate proof bar + two auto-scrolling marquee
   rows (opposite directions), pause on hover, full-bleed with masked edges. */
.tmonials .t-head h2{margin-bottom:1.1rem;}
.praise-proof{display:flex;align-items:center;justify-content:center;gap:8px 14px;flex-wrap:wrap;}
.praise-proof .pstars{color:#C9A24B;letter-spacing:4px;font-size:1.2rem;line-height:1;}
.praise-proof .pscore{font-family:Fraunces,serif;font-weight:600;font-size:1.25rem;color:var(--paper);}
.praise-proof .ptext{font-size:.92rem;color:#B7AF9D;}
.praise-proof .plink{font:500 .72rem/1 Inter;letter-spacing:.12em;text-transform:uppercase;color:#C9A24B;text-decoration:none;border-bottom:1px solid currentColor;padding-bottom:2px;white-space:nowrap;}.praise-proof .plink:hover{color:var(--paper);}
.praise-wall{position:relative;display:flex;flex-direction:column;gap:18px;overflow:hidden;
  -webkit-mask:linear-gradient(90deg,transparent,#000 7%,#000 93%,transparent);mask:linear-gradient(90deg,transparent,#000 7%,#000 93%,transparent);}
.praise-row{overflow:hidden;}
.praise-track{display:flex;gap:18px;width:max-content;}
.praise-wall.scroll .praise-track{animation:praise-scroll 64s linear infinite;}
.praise-wall.scroll .praise-row.rev .praise-track{animation-direction:reverse;animation-duration:78s;}
.praise-wall.scroll:hover .praise-track{animation-play-state:paused;}
@keyframes praise-scroll{from{transform:translateX(0);}to{transform:translateX(-50%);}}
.praise-card{flex:0 0 clamp(260px,26vw,340px);background:#211B12;border:1px solid rgba(244,241,233,.07);border-radius:5px;padding:22px 24px;display:flex;flex-direction:column;gap:11px;}
.praise-card .stars{color:#C9A24B;letter-spacing:3px;font-size:.92rem;line-height:1;}
.praise-card .stars .off{color:rgba(201,162,75,.26);}
.praise-card blockquote{margin:0;font-family:Inter,sans-serif;font-size:.95rem;line-height:1.55;color:#D9D2C2;}
.praise-card .who{font-weight:600;font-size:.82rem;letter-spacing:.02em;color:var(--paper);margin-top:auto;}
.praise-card .who::before{content:"\2014\00a0";color:#9A9079;}
@media (prefers-reduced-motion:reduce){
  .praise-wall{-webkit-mask:none;mask:none;}
  .praise-wall.scroll .praise-track{animation:none;flex-wrap:wrap;justify-content:center;width:auto;}
}
/* Mobile: a single scrolling row keeps the reviews block from getting too tall. */
@media(max-width:560px){.praise-wall .praise-row.rev{display:none;}}
.section.alt{background:var(--paper-2);}
.catfeature .bento,.catfeature .plates{margin-top:4px;}
.tile{position:relative;overflow:hidden;display:block;background:var(--paper-2);}
.tile img{width:100%;height:100%;object-fit:cover;transition:transform .6s ease;}
.tile:hover img{transform:scale(1.05);}
.tile .ov{position:absolute;inset:0;background:linear-gradient(to top,rgba(23,20,14,.74),rgba(23,20,14,.06) 56%,rgba(23,20,14,0));}
.tile .cap{position:absolute;left:20px;right:20px;bottom:17px;display:flex;align-items:flex-end;justify-content:space-between;gap:10px;}
.tile .nm{font-family:Fraunces,serif;font-weight:500;font-size:1.45rem;line-height:1.04;color:var(--paper);}
.tile .go{font:500 .67rem/1 Inter;letter-spacing:.16em;text-transform:uppercase;color:var(--accent-pale);white-space:nowrap;padding-bottom:5px;transition:.15s;}
.tile:hover .go{color:var(--paper);}
.bento{display:grid;grid-template-columns:repeat(4,1fr);grid-auto-rows:198px;gap:14px;}
.bento .b1{grid-column:1/3;grid-row:1/3;}.bento .b2{grid-column:3/5;}.bento .b5{grid-column:1/3;}.bento .b6{grid-column:3/5;}

/* Apparel-styles expanding panels (interactive lookbook) sitting under the bento.
   Hover a panel to widen it and reveal its caption; the others collapse to vertical
   serif labels. First panel (.is-open) is open by default until the row is hovered.
   Per-panel background image is set inline in index.php; empty panels fall back to a
   tinted fill so the row reads before photos are added. */
.panels-head{margin:34px 0 14px;}
.panels{display:flex;gap:8px;height:300px;overflow:hidden;}
.panels .panel{position:relative;flex:1 1 0;min-width:0;overflow:hidden;display:block;background:var(--panel) center/cover no-repeat;flex-grow:1;transition:flex-grow .55s cubic-bezier(.4,.05,.15,1);}
.panels .panel .ov{position:absolute;inset:0;background:linear-gradient(to top,rgba(23,20,14,.82),rgba(23,20,14,.12) 62%,rgba(23,20,14,.28));transition:.3s;}
.panels .vlab{position:absolute;bottom:18px;left:50%;transform:translateX(-50%) rotate(180deg);writing-mode:vertical-rl;font-weight:500;font-size:1.05rem;letter-spacing:.02em;color:var(--paper);white-space:nowrap;transition:opacity .3s;}
.panels .cap{position:absolute;left:18px;right:18px;bottom:16px;display:flex;align-items:flex-end;justify-content:space-between;gap:8px;opacity:0;transition:opacity .35s .12s;}
.panels .cap .nm{font-weight:500;font-size:1.45rem;line-height:1.02;color:var(--paper);}
.panels .cap .go{font:500 .67rem/1 Inter;letter-spacing:.16em;text-transform:uppercase;color:var(--accent-pale);white-space:nowrap;padding-bottom:5px;}
.panels .panel.is-open{flex-grow:4.6;}
.panels .panel.is-open .vlab{opacity:0;}.panels .panel.is-open .cap{opacity:1;}
.panels:hover .panel{flex-grow:1;}
.panels:hover .panel .vlab{opacity:1;}.panels:hover .panel .cap{opacity:0;}
.panels:hover .panel:hover{flex-grow:4.6;}
.panels:hover .panel:hover .vlab{opacity:0;}.panels:hover .panel:hover .cap{opacity:1;}
.panels .panel:hover .ov{background:linear-gradient(to top,rgba(23,20,14,.7),rgba(23,20,14,.04) 66%);}
.panels .panel:nth-child(6n+1){background-color:#34302a;}
.panels .panel:nth-child(6n+2){background-color:#6b3b3b;}
.panels .panel:nth-child(6n+3){background-color:#2e2b26;}
.panels .panel:nth-child(6n+4){background-color:#3c3a34;}
.panels .panel:nth-child(6n+5){background-color:#2a2825;}
.panels .panel:nth-child(6n){background-color:#5a3b40;}
@media(max-width:780px){
  .panels{display:grid;grid-template-columns:1fr 1fr;gap:10px;height:auto;}
  .panels .panel{height:150px;}
  .panels .vlab{display:none;}
  .panels .cap{opacity:1;}
}
.plates{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;}
.plates .tile{aspect-ratio:3/4;}
.plates .ov{background:rgba(23,20,14,.34);transition:.25s;}
.plates .tile:hover .ov{background:rgba(23,20,14,.52);}
.plates .cap{flex-direction:column;align-items:center;justify-content:center;inset:0;text-align:center;gap:8px;}
.plates .eyebrow{font:500 .64rem/1 Inter;letter-spacing:.22em;text-transform:uppercase;color:var(--accent-pale);}
.plates .nm{font-size:1.5rem;}
@media(max-width:780px){.bento{grid-template-columns:1fr 1fr;grid-auto-rows:158px;}.bento .tile{grid-column:auto!important;grid-row:auto!important;}.plates{grid-template-columns:1fr 1fr;}}
.creed{background:var(--ink);color:var(--paper);text-align:center;}
.creed .wrap{padding:96px 28px;}.creed .rubric{color:var(--accent-creed);justify-content:center;margin-bottom:1.5rem;}
.creed blockquote{font-family:Fraunces,serif;font-weight:400;font-size:clamp(1.8rem,4.4vw,3.1rem);line-height:1.18;margin:0 auto;max-width:20ch;}
.creed blockquote em{font-style:italic;color:var(--rubric);}
.creed cite{display:block;margin-top:1.7rem;font:500 .76rem/1 Inter;letter-spacing:.16em;text-transform:uppercase;color:#9A9079;font-style:normal;}

/* Editorial mission band — a parchment block that bridges the image-heavy slider and
   the dark brand hero below it. Two-column "masthead" split (statement left, supporting
   copy + shop link right, hairline between) finished with a flanked Latin-motto colophon. */
.brandline{background:var(--paper);padding:84px 28px;}
.brandline .rubric{margin-bottom:1rem;}
.brandline .rubric::before{display:none;}/* drop the fleuron mark on this eyebrow */
.brandline h2 em{font-style:italic;color:var(--rubric);}
.bl-split{max-width:1040px;margin:0 auto;display:grid;grid-template-columns:1fr auto 1fr;gap:56px;align-items:center;}
.bl-logo{display:flex;align-items:center;justify-content:center;}
.bl-logo img{width:132px;height:132px;object-fit:contain;display:block;}/* no circle crop — the emblem is already round on transparent bg, so a mask would trim its edges */
.bl-logo-ph{width:118px;height:118px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-weight:500;font-size:2.1rem;letter-spacing:.04em;color:var(--rubric);background:var(--paper);border:1.5px solid var(--rubric);box-shadow:inset 0 0 0 5px var(--paper),inset 0 0 0 6px rgba(var(--rubric-rgb),.35);}
.bl-head{text-align:right;}/* hug the centered logo so it reads as the centerpiece */
.bl-head h2{font-family:Fraunces,serif;font-weight:500;font-size:clamp(2.1rem,4.2vw,2.9rem);line-height:1.04;letter-spacing:-.02em;color:var(--ink);margin:0;}
.bl-copy p{color:var(--muted);font-size:1.05rem;line-height:1.62;margin:0 0 22px;}
.bl-link{display:inline-block;font:500 .76rem/1 Inter;letter-spacing:.13em;text-transform:uppercase;color:var(--rubric);border-bottom:1.5px solid var(--rubric);padding-bottom:3px;transition:.15s;}
.bl-link:hover{color:var(--rubric-dark);border-color:var(--rubric-dark);}
/* "conviction" — a rubric brushstroke that paints itself left-to-right when the split
   scrolls into view (and re-paints on hover of the band). With no JS / reduced motion
   (no .reveal-on) the stroke is simply shown, fully painted. */
.bl-copy .ul-draw{position:relative;white-space:nowrap;}
.bl-copy .ul-scribble{position:absolute;left:-5px;right:-5px;bottom:-9px;width:calc(100% + 10px);height:13px;overflow:visible;}
.bl-copy .ul-scribble path{fill:var(--rubric);}
.reveal-on .brandline .ul-scribble{clip-path:inset(0 100% 0 0);transition:clip-path .95s cubic-bezier(.45,.05,.2,1);}
.reveal-on .brandline .bl-split.in .ul-scribble,.brandline:hover .ul-scribble{clip-path:inset(0 0 0 0);}
/* Colophon — Latin mottos centred between two short rules. */
.bl-colophon{display:flex;align-items:center;justify-content:center;gap:18px;margin-top:42px;}
.bl-colophon::before,.bl-colophon::after{content:"";height:1px;width:72px;background:var(--line);}
.bl-motto{font:500 .72rem/1 Inter;letter-spacing:.22em;text-transform:uppercase;color:var(--ink);display:inline-flex;align-items:center;gap:12px;}
.bl-motto i{color:var(--rubric);font-style:normal;}
@media(max-width:680px){
  .brandline{padding:36px 22px 44px;}
  .bl-split{grid-template-columns:1fr;gap:14px;text-align:center;justify-items:center;}
  .brandline .rubric{margin-bottom:.55rem;}
  .bl-logo{order:-1;}/* logo stacks on top on mobile */
  .bl-logo img{width:92px;height:92px;}
  .bl-logo-ph{width:84px;height:84px;}
  .bl-logo-ph{font-size:1.5rem;box-shadow:inset 0 0 0 4px var(--paper),inset 0 0 0 5px rgba(var(--rubric-rgb),.35);}
  .bl-head{text-align:center;}
  .brandline .rubric{justify-content:center;}
  .bl-colophon{margin-top:30px;}
  .bl-colophon::before,.bl-colophon::after{width:42px;}
  .bl-motto .m-extra{display:none;}/* mobile: Soli Deo Gloria only */
}

/* Full-width product feature hero — full-bleed stylized image with a left-weighted
   scrim, slow Ken Burns drift, and scroll-revealed copy. Shared by the brand
   ("Wear what you believe"), statue, and sticker blocks on the homepage; each sets
   its own background inline in index.php (CDN-served, swappable). */
.feat-hero{position:relative;display:flex;align-items:center;overflow:hidden;isolation:isolate;min-height:clamp(420px,54vw,600px);background:var(--ink);}
.feat-hero .sh-bg{position:absolute;inset:0;z-index:-2;background-size:cover;background-position:center 28%;transform:scale(1.06);will-change:transform;animation:sh-kenburns 24s ease-in-out infinite alternate;}
.feat-hero .sh-scrim{position:absolute;inset:0;z-index:-1;background:linear-gradient(90deg,rgba(15,12,8,.88) 0%,rgba(15,12,8,.66) 40%,rgba(15,12,8,.22) 76%,rgba(15,12,8,.04) 100%);}
.feat-hero .sh-inner{width:100%;}
.feat-hero .sh-copy{max-width:34rem;color:var(--paper);padding:74px 0;}
.feat-hero .sh-copy .rubric{color:var(--accent-on-dark);margin-bottom:1.1rem;}
.feat-hero .sh-copy h2{font-family:Fraunces,serif;font-weight:500;font-size:clamp(2.1rem,5vw,3.4rem);line-height:1.06;letter-spacing:-.02em;margin:0 0 1rem;}
.feat-hero .sh-copy h2 em{font-style:italic;color:var(--accent-on-dark);}
.feat-hero .sh-copy p{color:rgba(244,241,233,.85);font-size:1.06rem;line-height:1.6;margin:0 0 1.9rem;max-width:42ch;}
@keyframes sh-kenburns{from{transform:scale(1.06) translate3d(0,0,0);}to{transform:scale(1.15) translate3d(-2%,-1.5%,0);}}
@media(prefers-reduced-motion:reduce){.feat-hero .sh-bg{animation:none;transform:none;}}
@media(max-width:700px){
  .feat-hero{min-height:0;}
  .feat-hero .sh-bg{background-position:center 22%;}
  .feat-hero .sh-scrim{background:linear-gradient(180deg,rgba(15,12,8,.40) 0%,rgba(15,12,8,.80) 100%);}
  .feat-hero .sh-copy{padding:54px 0;max-width:none;text-align:center;}
  .feat-hero .sh-copy .rubric{justify-content:center;}
  .feat-hero .sh-copy p{margin-left:auto;margin-right:auto;}
}

/* Email-signup band: its own full-width strip in the brand accent (toggles with
   the theme), sitting above the deeper-accent footer. */
.foot-signup{background:var(--rubric);color:var(--paper);}
.foot-news{display:flex;align-items:center;justify-content:space-between;gap:40px;padding:42px 0;}
.foot-news h3{font-family:Fraunces,serif;font-weight:500;color:var(--paper);font-size:1.4rem;margin:0 0 5px;}
.foot-news p{font-size:.9rem;color:rgba(244,241,233,.82);margin:0;max-width:48ch;}
.fn-formwrap{flex:0 0 auto;width:440px;max-width:100%;}
.fn-form{display:flex;width:100%;}
.fn-form input[type=email]{flex:1;min-width:0;background:var(--paper);border:1px solid var(--paper);color:var(--ink);padding:13px 16px;font:400 .9rem Inter;}
.fn-form input[type=email]:focus{outline:2px solid var(--paper);outline-offset:-2px;}
/* Join the field + button into one clean control: square the button (Bootstrap's
   .btn adds a 4px radius on product pages, leaving it looking detached/rounded
   against the square input) and split them with a hairline divider. */
.fn-form .btn{padding:13px 22px;white-space:nowrap;border-radius:0;border-left:1px solid var(--line);}
/* Solid buttons on dark / accent surfaces invert: parchment fill + accent text, so
   a primary button never sits invisibly on a dark section or accent band. Buttons on
   the light parchment body keep the normal solid-accent fill (defined above). */
.slider .btn-solid,.cta-band .btn-solid,.tmonials .btn-solid,.creed .btn-solid,.foot-signup .btn-solid,.foot .btn-solid{background:var(--paper);border-color:var(--paper);color:var(--rubric);}
.slider .btn-solid:hover,.cta-band .btn-solid:hover,.tmonials .btn-solid:hover,.creed .btn-solid:hover,.foot-signup .btn-solid:hover,.foot .btn-solid:hover{background:#fff;border-color:#fff;color:var(--rubric);}
/* Hairline between field and button (needs to out-rank the .btn-solid border-color above). */
.foot-signup .fn-form .btn{border-left:1px solid rgba(23,20,14,.16);}
.fn-result{margin:10px 0 0;font-size:.85rem;min-height:1em;color:#A39A86;}
.fn-result.ok{color:#8fc99a;}
.fn-result.err{color:#e6a39c;}
.fn-code{display:inline-block;margin-top:4px;padding:2px 10px;background:var(--paper);color:var(--ink);border-radius:4px;font:700 .92rem Inter;letter-spacing:.06em;}
.foot-cols{display:grid;grid-template-columns:1.5fr 1fr 1fr 1.2fr;gap:40px;padding:44px 0 6px;}

.foot{background:var(--footer-bg);color:#CFC7B5;}
.foot .wrap{padding:0 28px;}
.foot h4{font-family:Fraunces,serif;font-weight:500;color:var(--paper);font-size:1.05rem;margin:0 0 16px;}
.foot ul{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:10px;}
.foot ul a{font-size:.92rem;}.foot ul a:hover,.foot p a:hover{color:var(--paper);}
.foot .soc{display:flex;gap:16px;font-size:1.15rem;margin-top:16px;}.foot .soc a:hover{color:var(--paper);}
.foot .colophon{border-top:1px solid var(--line-lt);padding:22px 0 36px;display:flex;justify-content:space-between;flex-wrap:wrap;gap:10px;font-size:.8rem;color:#8C836F;}
.foot .colophon .sdg{color:var(--rubric);letter-spacing:.16em;text-transform:uppercase;font-weight:500;}

.scrim{position:fixed;inset:0;background:rgba(23,20,14,.5);opacity:0;visibility:hidden;transition:.2s;z-index:50;}.scrim.on{opacity:1;visibility:visible;}
.drawer{position:fixed;top:0;left:0;bottom:0;width:86%;max-width:360px;background:var(--paper);z-index:60;transform:translateX(-100%);transition:transform .25s ease;overflow-y:auto;}
.drawer.open{transform:none;}
.drawer .d-top{display:flex;align-items:center;justify-content:flex-end;padding:14px 18px;border-bottom:1px solid var(--line);}
/* Quick Ship menu label: small green ship-now dot to the right (reinforces the on-product dot) */
.nav-shipdot{margin-left:3px;}
.d-cat{border-bottom:1px solid var(--line);}
.d-cat>.d-cat-h{display:flex;align-items:center;justify-content:space-between;padding:16px 22px;font:500 .82rem/1 Inter;letter-spacing:.1em;text-transform:uppercase;cursor:pointer;}
.d-cat .d-sub{display:none;padding:0 22px 14px;}
.d-cat.exp .d-sub{display:block;}.d-cat.exp>.d-cat-h .chev{transform:rotate(180deg);}
.d-cat .d-sub a{display:block;padding:8px 0;font-size:.95rem;color:#43403a;}
.d-cat .d-sub .d-sub-h{display:block;font-size:.66rem;letter-spacing:.12em;text-transform:uppercase;color:#9b8f78;font-weight:600;margin:12px 0 2px;}
/* Indent each run of sub-links under a subtle left rule so long category lists
   read as tidy groups; the d-sub-h headings (and the lead "Shop all" link +
   promo cards) stay flush, which breaks the rule between groups. */
.d-cat .d-sub a:not(.d-promo):not(:first-child){border-left:1.5px solid var(--line);padding-left:15px;margin-left:1px;}
.d-cat .d-sub a:not(.d-promo):not(:first-child):hover{border-left-color:var(--rubric);color:var(--ink);}
.d-cat .d-sub>a:first-child{margin-bottom:3px;}
.d-cat .d-sub a.d-promo{display:flex;align-items:center;gap:10px;padding:8px 0;}
.d-cat .d-sub a.d-promo img{width:52px;height:52px;object-fit:cover;border-radius:8px;background:#ECE6D8;flex:none;}
.d-cat .d-sub a.d-promo img.lazyload{opacity:0;}
.d-cat .d-sub a.d-promo img.lazyloaded{opacity:1;transition:opacity .4s ease;}
.d-cat .chev{transition:.2s;color:var(--rubric);}
.drawer .d-soc{display:flex;gap:18px;font-size:1.25rem;padding:22px;}

/* Mini cart tray (slides in from the right; ECT incminicart output) */
.cart-tray{position:fixed;top:0;right:0;bottom:0;width:90%;max-width:380px;background:var(--paper);z-index:60;transform:translateX(100%);transition:transform .25s ease;overflow-y:auto;display:flex;flex-direction:column;}
.cart-tray.open{transform:none;}
.ct-top{display:flex;align-items:center;justify-content:space-between;padding:20px 22px;border-bottom:1px solid var(--line);}
.ct-title{font-family:Fraunces,serif;font-weight:600;font-size:1.2rem;}
.ct-x{background:none;border:0;color:var(--ink);cursor:pointer;padding:0;display:inline-flex;}
.ct-body{padding:6px 22px 24px;}
/* Theme the ECT-generated .minicart markup */
.ct-body .minicart{font-family:Inter,system-ui,sans-serif;font-size:.95rem;}
.ct-body .minicart img{display:none;}
.ct-body .minicartcnt{padding:12px 0;border-bottom:1px solid var(--line);color:var(--ink-soft);}
.ct-body .mcLNitems .minicartcnt{display:flex;justify-content:space-between;gap:12px;}
/* Per-line thumbnail (mw.js: api/cart-tray-images.php — ECT's own line items are text-only) */
.ct-body .minicart img.ct-thumb{display:block;width:44px;height:44px;object-fit:cover;border-radius:6px;background:var(--paper-2);flex:none;}
.ct-body .mcLNitems .minicartcnt:has(.ct-thumb){display:flex;align-items:center;justify-content:flex-start;}
.ct-body .ectMCquant,.ct-body .ectMCtot{font-weight:600;color:var(--ink);}
.ct-body .minicart>.minicartcnt:first-child,.ct-body .minicart>.minicartcnt:last-child{border-bottom:0;}
.ct-body .minicart>.minicartcnt:first-child{padding-top:14px;}
.ct-body .minicart>.minicartcnt:first-child a.mincart{font:500 .72rem/1 Inter;letter-spacing:.14em;text-transform:uppercase;color:var(--muted);}
.ct-body .minicart>.minicartcnt:first-child a.mincart:hover{color:var(--rubric);}
.ct-body button.mincart,.ct-body input.mincart{display:block;width:100%;text-align:center;margin-top:16px;background:var(--rubric);border:1px solid var(--rubric);color:var(--paper);font:500 .82rem/1 Inter;letter-spacing:.1em;text-transform:uppercase;padding:15px 30px;cursor:pointer;transition:.18s;}
.ct-body button.mincart:hover,.ct-body input.mincart:hover{background:var(--rubric-dark);border-color:var(--rubric-dark);color:var(--paper);}

/* Soft-add-to-cart popup. ECT injects #scdiv.scart.scwrap into the shared #opaquediv.ectopaque
   overlay (styled in the softform-modals block above) when the hard cart is off, to confirm the
   added item. The .ectopaque backdrop + .scclose::before X are inherited; here we only theme the
   inner .scwrap box and its contents, mirroring the .ectsoftwrapper / .qbuywrapper look. */
.scart.scwrap{position:relative;background:var(--paper);width:100%;max-width:560px;padding:34px 30px 28px;border-radius:3px;box-shadow:0 30px 70px rgba(23,20,14,.35);box-sizing:border-box;text-align:left;font-family:Inter,system-ui,sans-serif;color:var(--ink-soft);animation:nis-pop .22s ease;}
.scart.sccheckout{display:block;text-align:center;margin-bottom:8px;}
#scoutercontainer{clear:both;}
.scart.scprodsadded{clear:both;font-family:Fraunces,serif;font-size:1.25rem;font-weight:500;color:var(--ink);padding:2px 0 14px;border-bottom:1px solid var(--line);margin-bottom:16px;}
.scimgproducts{display:flex;gap:18px;align-items:flex-start;}
.scart.scimage{flex:0 0 120px;width:120px;text-align:center;}
img.scimage{max-width:100%;height:auto;border:1px solid var(--line);}
.scart.scproducts{flex:1;min-width:0;}
.scart.scproduct{padding-bottom:12px;}
.scart.scprodname{font-weight:500;color:var(--ink);}
.scart.scprice{margin-top:6px;font-weight:600;color:var(--ink);}
/* Selected options — styled to match the cart line: a muted label + a soft "filled" chip on the
   value, the whole set sitting in one subtly-raised card (mirrors .cart-optsgroup / .cartoption). */
.scart.scoptions{margin-top:8px;display:inline-flex;flex-direction:column;gap:5px;
  padding:8px 12px;background:rgba(255,255,255,.5);border:1px solid var(--line);border-radius:8px;}
.scart.scoption{display:flex;align-items:baseline;gap:7px;font-size:.84rem;line-height:1.45;color:var(--muted);}
.scart.scoptname{font-weight:500;color:var(--muted);}
.scart.scoptvalue{color:var(--ink);font-weight:500;background:var(--paper-2);border-radius:5px;padding:1.5px 8px;}
/* Cart contents + cart total share one tighter line; the total stands out (bigger + bolder)
   against the muted contents count. The popup's last block wraps these two + the links row. */
#scoutercontainer>div:last-child{display:flex;flex-wrap:wrap;align-items:baseline;column-gap:12px;border-top:1px solid var(--line);margin-top:16px;padding-top:13px;}
.scart.sccartitems{flex:1 1 auto;text-align:left;color:var(--muted);font-size:.84rem;padding:0;margin:0;border:0;}
.scart.sccarttotal{flex:0 0 auto;text-align:right;font-weight:700;font-size:1.15rem;color:var(--ink);padding:0;margin:0;border:0;}
.scart.sccarttotal span.sccartdscnt,.scart .sccartdscamnt,.scart .mcMCdsct{color:var(--rubric);}
.scart.scnostock,.scart.scbackorder{text-align:center;padding:9px;background:#FBE9E7;border:1px solid var(--rubric);color:var(--rubric);margin:8px 0;}
.scart.scerror{text-align:center;padding:60px 0;color:var(--rubric);}
/* Continue Shopping + Edit Order on one centered row; font-size:0 hides the literal " | "
   text separator ECT prints between the two buttons (buttons re-set their own size below). */
.scart.sclinks{flex:1 1 100%;display:flex;justify-content:center;gap:8px;font-size:0;padding-top:16px;margin-top:14px;border-top:1px solid var(--line);}
/* Buttons inside the popup */
.scart .ectbutton{font:500 .74rem/1 Inter;letter-spacing:.08em;text-transform:uppercase;padding:12px 20px;cursor:pointer;transition:.18s;border:1px solid var(--ink);background:transparent;color:var(--ink);}
.scart .ectbutton:hover{background:var(--ink);color:var(--paper);}
.scart button.sccheckout,.scart .sccheckout .ectbutton{background:var(--rubric);border-color:var(--rubric);color:var(--paper);}
.scart button.sccheckout:hover,.scart .sccheckout .ectbutton:hover{background:var(--rubric-dark);border-color:var(--rubric-dark);color:var(--paper);}
.scart .sclinks .ectbutton{margin:0;font-size:.62rem;padding:11px 13px;white-space:nowrap;}
/* Quantity badge (mw.js wraps the leading number in the soft-add popup AND the side cart
   drawer) — a small, lightly-tinted pill so the qty reads apart from the title subtly. */
.sc-qty{display:inline-flex;align-items:center;justify-content:center;min-width:1.5em;height:1.5em;padding:0 .35em;margin-right:.25em;border-radius:999px;background:rgba(var(--rubric-rgb),.13);color:var(--rubric);font-weight:700;font-size:.82em;line-height:1;vertical-align:.08em;}
/* Quantity > 1: solid rubric fill instead of the faint tint, so multi-qty lines stand out at a glance. */
.sc-qty-multi{background:var(--rubric);color:#fff;}
/* keep the badge inline with the name in the drawer (its line-item rows can be flex) */
.cart-tray .minicartcnt:has(.sc-qty){display:block;}
/* mw.js lifts the product image to the top of the popup so it sits beside the "The following…"
   heading on the first row; the product details then flow full-width on their own row below.
   One layout at every width (the popup is capped at 560px), so longer names are never squeezed
   into a narrow column. */
.sc-floatimg{display:flex;flex-wrap:wrap;align-items:center;column-gap:16px;}
.sc-floatimg .scart.scimage{flex:0 0 96px;width:96px;}
.sc-floatimg .scart.scprodsadded{flex:1;border-bottom:0;margin:0;padding:0;}
.sc-floatimg .scimgproducts{flex:1 1 100%;display:block;margin-top:16px;}
.sc-floatimg>div:last-child{flex:1 1 100%;}
@media(max-width:560px){
  /* Tighten the popup type for the narrow viewport: smaller image + serif heading, calmer body,
     and stack the cart contents / total so the (Discounts) + total can't clip off-edge. */
  .scart.scwrap{padding:30px 20px 24px;}
  .sc-floatimg .scart.scimage{flex:0 0 80px;width:80px;}
  .scart.scprodsadded{font-size:1.05rem;line-height:1.25;}
  .scart.scprodname,.scart.scprice{font-size:.95rem;}
  .scart.sccartitems{flex:1 1 100%;font-size:.78rem;}
  /* Smaller total so "(Discounts:…) / Cart total:…" fits one line instead of breaking
     mid-phrase; the discount span rides a touch smaller again for a calmer hierarchy. */
  .scart.sccarttotal{flex:1 1 100%;text-align:left;font-size:.92rem;margin-top:4px;line-height:1.4;}
  .scart .sccartdscnt{font-size:.9em;}
}
#softcartrelated{margin-top:18px;padding-top:16px;border-top:1px solid var(--line);clear:both;}

/* Header drops to the burger + drawer bar below 1024 (the nav no longer fits its
 * share of a single row). Header-only breakpoint — the site-wide 920 block below
 * still governs product grids / footer, which are unaffected by the row change. */
@media(max-width:1023px){
  .head .wrap.head-top{grid-template-columns:1fr auto 1fr;height:56px;gap:12px;}
  .head-top .burger{display:inline-flex;grid-column:1;justify-self:start;}
  .head-top .brand{grid-column:2;justify-self:center;}
  .head-top .navrow,.icons .desk{display:none;}
  .head-top .brand img{height:38px;}
}
@media(max-width:920px){
  .grid{grid-template-columns:repeat(2,1fr);gap:28px 18px;}
  .foot-cols{grid-template-columns:1fr 1fr;}
  .foot-news{flex-direction:column;align-items:flex-start;gap:16px;}
  .fn-formwrap{width:100%;}
  .utility .soc{display:none;}
}
/* Scroll-reveal: hidden state applied pre-paint via the head's `reveal-on` class
   (set only when JS+IO available and motion allowed) so content never flashes/jumps.
   The footer JS just adds `.in` to fade each element in on scroll. */
.reveal-on .brandline>*,.reveal-on .vitem,.reveal-on .section-head,.reveal-on .bento .tile,.reveal-on .plates .tile,.reveal-on .fp-bs-product,.reveal-on .creed blockquote,.reveal-on .news h2,.reveal-on .news p,.reveal-on .ms-card,.reveal-on .feat-hero .sh-copy>*{opacity:0;transform:translateY(18px);transition:opacity .65s ease,transform .65s cubic-bezier(.2,.7,.2,1);}
.reveal-on .brandline>*.in,.reveal-on .vitem.in,.reveal-on .section-head.in,.reveal-on .bento .tile.in,.reveal-on .plates .tile.in,.reveal-on .fp-bs-product.in,.reveal-on .creed blockquote.in,.reveal-on .news h2.in,.reveal-on .news p.in,.reveal-on .ms-card.in,.reveal-on .feat-hero .sh-copy>*.in{opacity:1;transform:none;}
@media(prefers-reduced-motion:reduce){*{transition:none!important;}.slides{transition:none;}}

/* ===== ECT product detail (proddetail.php) ===== */
.proddetail-col1,.proddetail-col2{margin-bottom:1.5rem;}
/* Collapse an empty cross-sell rail (e.g. "recommended" with no matching products):
   ECT still prints the <section> wrapper, so its vertical padding leaves a blank band
   above the footer. Hide any rail whose product column rendered empty. Scoped to the
   crosssell columns (they carry the inline text-align), so the reviews slot is untouched.
   Keyed off the missing .fp-bs-products rail — can't use :empty (ECT leaves a whitespace
   node) and can't nest :has() inside :has(), so test for the rail via :not(:has()). */
.pd-more section:has(> .container > .row > .col-md-12[style*="text-align"]):not(:has(.fp-bs-products)){display:none;}
/* Sticky gallery: the image column follows the scroll until the (taller) info
   column runs out, then releases — like scripturetype.com. Desktop only; on
   mobile the columns stack so there's nothing to pin against. Top offset clears
   the sticky header (.head-top 76px + nav row ≈ 124px). */
@media(min-width:768px){
  .proddetail-col1 .pd-gallery-sticky{position:sticky;top:130px;}
}
.detailimage img{width:100%;height:auto;border-radius:2px;}
/* Reserve the thumbnail strip's height before MagicScroll initializes (it builds
   late, after load), so the page doesn't jump when the initially-tall raw markup
   collapses to a single strip. Reserved height ≈ one square thumb = column ÷ cols
   (3 across on desktop, 2 on narrow); overflow clips the tall inner until mw.js
   pins the exact height. Keep this slightly generous so a thumb is never cropped. */
.detailthumbnailimage{overflow:hidden;aspect-ratio:2/1;}
@media(min-width:768px){.detailthumbnailimage{aspect-ratio:3/1;}}
.detailname{font-family:Fraunces,serif;font-weight:500;font-size:clamp(1.7rem,3vw,2.3rem);line-height:1.12;letter-spacing:-.012em;color:var(--ink);margin:0 0 1rem;}
/* Shopify-style price box: current price + struck original + save pill on one row */
.mw-pricebox{display:flex;align-items:baseline;flex-wrap:wrap;gap:.55rem .7rem;margin:.5rem 0 1rem;}
.detailprice{font-size:1.7rem;font-weight:600;color:var(--ink);margin:0;line-height:1;}
.detailprice strong{display:none;} /* hide the "Price:" label */
.detailprice .price{color:inherit;}
/* When discounted (save badge present), the live price turns rubric-red */
.mw-pricebox:has(.mw-savebadge) .detailprice .price{color:var(--rubric);}
.listpricediv,.detaillistprice{color:var(--muted);}
.detaillistprice{font-size:1.05rem;}
.detaillistprice del,.listprice del,.detailprice del{color:var(--muted);font-weight:400;text-decoration-thickness:1px;}
/* "Save X%" pill */
.mw-savebadge{display:inline-flex;align-items:center;}
.mw-savebadge .badge{display:inline-block;background:var(--rubric);color:var(--paper);font:600 .68rem/1 Inter;letter-spacing:.06em;text-transform:uppercase;padding:.4em .6em;border-radius:999px;}
/* Hide the now-redundant ECT percent-off text (the pill carries it) */
.detailpercentofflistprice{display:none;}
.shiptime{font-size:.92rem;color:var(--muted);margin:.5rem 0 1rem;}
.detailoptions,.optioncontainer{margin:1.1rem 0;}
.optiontext,.detailoptiontext{font:500 .78rem/1.4 Inter;letter-spacing:.1em;text-transform:uppercase;color:var(--muted);margin-bottom:.5rem;display:block;}
.detailquantity,.quantity2div{margin:1rem 0;}
.quantity2input,input.detailquantity2input,input.detailquantity{border:1px solid var(--line);padding:10px 12px;width:74px;font:400 1rem Inter;border-radius:2px;}
/* ECT buttons -> theme button (also themes cart/checkout/account site-wide) */
.ectbutton{display:inline-block;font:500 .8rem/1 Inter;letter-spacing:.1em;text-transform:uppercase;padding:14px 28px;border:1px solid var(--rubric);background:var(--rubric);color:var(--paper);cursor:pointer;transition:.18s;border-radius:2px;text-decoration:none;}
.ectbutton:hover{background:var(--rubric-dark);border-color:var(--rubric-dark);color:var(--paper);}
.ectbutton.forgotpassword,.ectbutton.createaccount,.ectbutton.newaccount{background:transparent;color:var(--ink);border-color:var(--ink);}
.ectbutton.forgotpassword:hover,.ectbutton.createaccount:hover,.ectbutton.newaccount:hover{background:var(--ink);color:var(--paper);}
.addtocartquant,.detailaddtocartquant{margin-top:1.4rem;}
.detailbuybutton,.ectbutton.buybutton{padding:16px 40px;font-size:.88rem;}
.detailprodoption,.rcoption{margin-bottom:.4rem;}

/* ===== Product detail refinements: breadcrumb, options-as-buttons, quantity, add-to-cart ===== */
/* Breadcrumb cleanup + hide the in-breadcrumb "Proceed to Checkout" */
.catnavdetail{font-size:.85rem;color:var(--muted);line-height:1.7;margin:0 0 1.2rem;}
.catnavdetail .ectbreadcrumb{display:inline;}
.catnavdetail a.ectlink{color:var(--muted);text-decoration:none;}
.catnavdetail a.ectlink:hover{color:var(--rubric);}
.catnavcheckout{display:none;}

/* Radio/checkbox options styled as selectable buttons.
   A single-value option group is emitted by ECT as a pre-checked .ectcheckbox
   (not a radio) — hide that native box too so it renders as a button like the rest. */
.option.detailoption{display:flex;flex-wrap:wrap;gap:8px;}
.rcoption{position:relative;margin:0;}
.rcoption input.ectradio,.rcoption input.ectcheckbox{position:absolute;opacity:0;width:1px;height:1px;}
.rcoption label.ectlabel{display:inline-block;border:1px solid var(--line);background:#fff;color:var(--ink);padding:9px 16px;min-width:46px;text-align:center;font-size:.92rem;line-height:1.1;cursor:pointer;border-radius:2px;transition:.15s;}
.rcoption label.ectlabel:hover{border-color:var(--ink);}
.rcoption input.ectradio:checked + label.ectlabel,.rcoption input.ectcheckbox:checked + label.ectlabel{background:var(--ink);border-color:var(--ink);color:var(--paper);}
.rcoption input.ectradio:focus-visible + label.ectlabel,.rcoption input.ectcheckbox:focus-visible + label.ectlabel{outline:2px solid var(--rubric);outline-offset:2px;}
/* "hidden" admin option Class = remove the option entirely (not just mark it sold out).
   ECT puts the optClass on the .rcoption wrapper, so an option set to "hidden" in the
   back office disappears from the size selector. (.hidden is scoped here, not global,
   so it can't clobber other uses like .cart-count.hidden.) */
.rcoption.hidden{display:none;}
/* Sold-out option buttons. ECT marks the <label> with .oostock (and ectcart.js may
   also mark the .rcoption), so target both. Recessed parchment fill, muted text, a
   thin corner-to-corner diagonal slash = "this size exists but is gone". Kept
   clickable so the shopper can pick it and join the back-in-stock waitlist. */
.rcoption label.ectlabel.oostock,
.rcoption.oostock label.ectlabel{color:var(--muted);border-color:var(--line);background-color:var(--paper);background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100' preserveAspectRatio='none'%3E%3Cline x1='0' y1='100' x2='100' y2='0' stroke='%236E6657' stroke-width='1' vector-effect='non-scaling-stroke'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:center;background-size:100% 100%;text-decoration:none;}
.rcoption label.ectlabel.oostock:hover,
.rcoption.oostock label.ectlabel:hover{border-color:var(--muted);}
/* Selected but sold-out (waitlist pick): keep the slash + muted fill so it never
   reads as a normal in-stock selection; add an ink ring to show it's the active size.
   Overrides the in-stock "selected" (dark fill) rule above. */
.rcoption input.ectradio:checked + label.ectlabel.oostock,
.rcoption input.ectcheckbox:checked + label.ectlabel.oostock,
.rcoption.oostock input.ectradio:checked + label.ectlabel,
.rcoption.oostock input.ectcheckbox:checked + label.ectlabel{background-color:var(--paper);color:var(--muted);border-color:var(--ink);box-shadow:inset 0 0 0 1px var(--ink);}
/* ===== Color options as circular swatches =====
   The proddetail swatch JS adds .is-color-swatch to a Color option group, then on
   each label it can resolve sets a CSS color (or gradient, for two-tone names like
   "Black/White") in --sw and adds .sw. Labels it can't resolve keep the default
   text-pill look above, so an unknown color name never disappears. The selected
   color name is echoed after the group header via .swname (e.g. "Color: Navy"). */
.optioncontainer.is-color-swatch .option.detailoption{gap:12px;align-items:flex-start;}
.optioncontainer.is-color-swatch .swname{text-transform:none;letter-spacing:0;color:var(--ink);font-weight:400;}
.rcoption label.ectlabel.sw{position:relative;width:30px;height:30px;min-width:0;padding:0;border:0;border-radius:50%;background:transparent;box-shadow:0 0 0 1px rgba(23,20,14,.2);font-size:0;line-height:0;transition:transform .12s ease;}
/* Colored disc is painted on ::before and shaped with a mask, so the circle and the
   two-tone diagonal anti-alias cleanly (border-radius clipping of a gradient looked
   rough). The selected ring stays on the element (box-shadow) so it isn't masked. */
.rcoption label.ectlabel.sw::before{content:"";position:absolute;inset:0;border-radius:50%;background:var(--sw,#cfcabd) center/100% 100% no-repeat;-webkit-mask:radial-gradient(closest-side,#000 calc(100% - 0.5px),transparent 100%);mask:radial-gradient(closest-side,#000 calc(100% - 0.5px),transparent 100%);}
.rcoption label.ectlabel.sw:hover{transform:scale(1.08);}
.rcoption input.ectradio:checked + label.ectlabel.sw,
.rcoption input.ectcheckbox:checked + label.ectlabel.sw{box-shadow:0 0 0 2px var(--paper),0 0 0 4px var(--ink);}
/* Sold-out swatch: dimmed circle with a diagonal slash overlay. */
.rcoption label.ectlabel.sw.oostock,
.rcoption.oostock label.ectlabel.sw{opacity:.5;background-image:none;}
.rcoption label.ectlabel.sw.oostock::after,
.rcoption.oostock label.ectlabel.sw::after{content:"";position:absolute;inset:0;border-radius:50%;background:linear-gradient(135deg,transparent 45%,#6E6657 45%,#6E6657 55%,transparent 55%);}
/* Color <select> rendered as a swatch row. Most color options on this store are
   dropdowns (apparel colors are size-dependent selects; wall-decal colors are one
   big select), so the swatch JS hides the real <select> (kept for ECT's cart +
   validation) and renders clickable .sw-chip circles that mirror its value. */
.is-color-swatch select.sw-hidden{position:absolute;opacity:0;width:1px;min-width:0;height:1px;padding:0;margin:0;border:0;pointer-events:none;clip:rect(0 0 0 0);}
.sw-row{display:flex;flex-wrap:wrap;gap:12px;margin:.2rem 0 .4rem;align-items:flex-start;}
.sw-chip{position:relative;width:30px;height:30px;padding:0;border:0;border-radius:50%;background:transparent;box-shadow:0 0 0 1px rgba(23,20,14,.2);cursor:pointer;font-size:0;line-height:0;transition:transform .12s ease;}
.sw-chip:not(.sw-text)::before{content:"";position:absolute;inset:0;border-radius:50%;background:var(--sw,#cfcabd) center/100% 100% no-repeat;-webkit-mask:radial-gradient(closest-side,#000 calc(100% - 0.5px),transparent 100%);mask:radial-gradient(closest-side,#000 calc(100% - 0.5px),transparent 100%);}
.sw-chip:hover{transform:scale(1.08);}
.sw-chip.is-active{box-shadow:0 0 0 2px var(--paper),0 0 0 4px var(--ink);}
.sw-chip:focus-visible{outline:2px solid var(--rubric);outline-offset:3px;}
.sw-chip.oostock{opacity:.5;}
.sw-chip.oostock::after{content:"";position:absolute;inset:0;border-radius:50%;background:linear-gradient(135deg,transparent 45%,#6E6657 45%,#6E6657 55%,transparent 55%);}
/* Unresolved color name: a readable text chip instead of a blank circle. */
.sw-chip.sw-text{width:auto;height:auto;border:1px solid var(--line);border-radius:2px;padding:9px 14px;font-size:.9rem;line-height:1.1;background:#fff;color:var(--ink);box-shadow:none;}
.sw-chip.sw-text.is-active{background:var(--ink);color:var(--paper);border-color:var(--ink);}

/* Select-style options */
.optioncontainer select{border:1px solid var(--line);border-radius:2px;padding:11px 14px;font:400 .95rem Inter;background:#fff;min-width:200px;}

/* Quantity stepper + add-to-cart row */
.addtocartquant,.detailaddtocartquant{display:flex;align-items:stretch;gap:12px;margin-top:1.5rem;flex-wrap:wrap;}
.detailquantity{margin:0;}
.quantity2div{display:inline-flex;align-items:stretch;border:1px solid var(--line);border-radius:2px;overflow:hidden;background:#fff;}
.quantity2div > div{width:44px;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:1.25rem;color:var(--ink);user-select:none;transition:.15s;}
.quantity2div > div:hover{background:var(--paper-2);color:var(--rubric);}
.quantity2input,input.detailquantity2input{border:0;border-left:1px solid var(--line);border-right:1px solid var(--line);width:58px;text-align:center;font:500 1rem Inter;padding:13px 0;border-radius:0;}
.addtocart,.detailaddtocart{flex:1 1 220px;display:flex;}
.addtocart .ectbutton,.detailaddtocart .ectbutton{flex:1;font-size:.92rem;padding:0 28px;min-height:52px;}

/* Add to List = compact outline-heart button beside Add to Cart (fills rubric on hover).
   The picker (ECT #savelistdiv, class .savecartlist) is emitted at the top of the page;
   on click ECT's JS relocates it next to the heart and flips visibility to visible, so
   absolute+hidden here stops it dumping inline and anchors it under the heart. */
.detailaddtocart .wishlistcontainer.detailwishlist{flex:0 0 auto;position:relative;display:flex;margin-left:10px;}
.detailaddtocart .ectbutton.detailwishlist,.qbopaque .qbaddtocart .ectbutton.prodwishlist{flex:0 0 auto;width:52px;min-height:52px;padding:0;background:transparent;border:1px solid var(--ink);color:var(--ink);border-radius:2px;font-size:0;display:inline-flex;align-items:center;justify-content:center;}
.detailaddtocart .ectbutton.detailwishlist::before,.qbopaque .qbaddtocart .ectbutton.prodwishlist::before{content:"";width:23px;height:23px;background-color:currentColor;transition:.18s;-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 21S4 14.5 4 8.8A3.8 3.8 0 0 1 12 6a3.8 3.8 0 0 1 8 2.8C20 14.5 12 21 12 21z'/%3E%3C/svg%3E") center/contain no-repeat;mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 21S4 14.5 4 8.8A3.8 3.8 0 0 1 12 6a3.8 3.8 0 0 1 8 2.8C20 14.5 12 21 12 21z'/%3E%3C/svg%3E") center/contain no-repeat;}
.detailaddtocart .ectbutton.detailwishlist:hover,.qbopaque .qbaddtocart .ectbutton.prodwishlist:hover{background:var(--rubric);border-color:var(--rubric);color:var(--paper);}
.detailaddtocart .ectbutton.detailwishlist:hover::before,.qbopaque .qbaddtocart .ectbutton.prodwishlist:hover::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='black'%3E%3Cpath d='M12 21S4 14.5 4 8.8A3.8 3.8 0 0 1 12 6a3.8 3.8 0 0 1 8 2.8C20 14.5 12 21 12 21z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='black'%3E%3Cpath d='M12 21S4 14.5 4 8.8A3.8 3.8 0 0 1 12 6a3.8 3.8 0 0 1 8 2.8C20 14.5 12 21 12 21z'/%3E%3C/svg%3E");}

/* Saved-lists picker — shared ECT class (.savecartlist) for both the product-page
   "Add to List" dropdown (#savelistdiv) and the cart "move to list" popup (#savecartlist). */
.savecartlist{background:var(--paper);border:1px solid var(--ink);border-radius:4px;box-shadow:0 18px 40px rgba(23,20,14,.18);padding:5px;min-width:180px;max-width:min(260px,calc(100vw - 24px));font:400 .88rem/1.3 Inter;z-index:9000;}
.savecartlist > div{padding:9px 13px;border-radius:2px;color:var(--ink);cursor:pointer;white-space:normal;transition:.12s;}
.savecartlist > div:hover{background:var(--panel);color:var(--rubric);}
.savecartlist .savecartdivider,.savecartlist .savecartdivider:hover{padding:6px 14px;color:var(--muted);cursor:default;background:transparent;font-size:.8rem;}
.savecartlist .savecartclose{position:absolute;top:6px;right:8px;width:14px;height:14px;cursor:pointer;opacity:.5;background-color:currentColor;-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round'%3E%3Cpath d='M6 6l12 12M18 6 6 18'/%3E%3C/svg%3E") center/contain no-repeat;mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round'%3E%3Cpath d='M6 6l12 12M18 6 6 18'/%3E%3C/svg%3E") center/contain no-repeat;}
.savecartlist .savecartclose:hover{opacity:1;color:var(--rubric);}
/* product-page + Quick Buy picker: drop under the heart, hard right-anchored (left:auto beats
   any stray inline left) so its right edge hugs the heart and it opens leftward — combined with
   the .savecartlist max-width clamp it can't run off either screen edge on mobile. */
#savelistdiv{position:absolute;visibility:hidden;top:calc(100% + 8px);right:0;left:auto;}
/* cart-page "move to list" picker: ECT injects #savecartlist into the inline position:relative div
   that wraps the clicked MOVE button (forced inline-block via .cartaddtolist>div below), so that
   div is the anchor. Drop the popup straight under the button, right edge flush with the button's
   right edge; the .savecartlist max-width keeps it on-screen on mobile. */
#savecartlist{position:absolute;visibility:hidden;top:calc(100% + 6px);right:0;left:auto;}
/* ECT's wrapper is display:inline (unreliable box); force inline-block so it hugs the button and
   the popup's right:0 / top:100% anchor lands flush beneath it. */
.cartaddtolist > div{display:inline-block!important;}

/* "Other [type] Styles" thumbnail menu (inc-proddetail-similar) — no bullets, grid */
.newprodmenu.similar{margin:1.4rem 0;}
.newprodmenu.similar ul{list-style:none;margin:.4rem 0 0;padding:0;display:flex;flex-wrap:wrap;gap:12px;}
.newprodmenu.similar li.proddetailmenu{margin:0;}
.newprodmenu.similar li a{display:flex;flex-direction:column;align-items:center;text-align:center;width:78px;color:var(--ink);text-decoration:none;font-size:.74rem;line-height:1.2;}
.newprodmenu.similar li img{width:66px;height:auto;border:1px solid var(--line);border-radius:2px;padding:3px;background:#fff;transition:.15s;}
.newprodmenu.similar li a:hover img{border-color:var(--rubric);}
.newprodmenu.similar li a:hover{color:var(--rubric);}
.newprodmenu.similar li span{margin-top:5px;}

/* Product detail: white main area, parchment band behind the bottom "more products" blocks */
body.pg-proddetail{background:#fff;}
.pd-more{background:var(--paper);padding:8px 0 36px;margin-top:30px;}
/* The cross-sell sections use pt-10/pb-10 utility classes that aren't defined (0 padding), so the
   "You might also like / More from this collection / Best Sellers" blocks were cramped. Give them
   consistent breathing room top and bottom. */
.pd-more > section{padding-top:34px;padding-bottom:34px;}

/* ===== Product ratings & reviews (proddetail: reviewstars + reviews tokens) =====
   Shown only when the portal toggle "Customer ratings" (enablecustomerratings) is on. Stars are
   an inline SVG sprite (#review-icon-full/half/empty) inheriting fill, so we tint here. */
.detailreviewstars .icon,.reviewstarsheader .icon,.reviewstars .icon,.smallreviewstars .icon,.largereviewstars .icon,.prodrating .icon,.reviewsavg .icon{fill:var(--rubric);width:15px;height:15px;}
/* Empty stars (partial ratings) render in light grey; the half symbol keeps the rubric fill */
svg.icon:has(use[*|href="#review-icon-empty"]){fill:var(--line);}
/* Star rating on listing cards (.smallreviewstars.prodrating) */
.prodrating,.smallreviewstars{display:inline-flex;align-items:center;gap:7px;margin:5px 0 0;font-size:.82rem;color:var(--muted);}
.prodrating a:not(:has(.icon)),.smallreviewstars a:not(:has(.icon)){color:var(--rubric);}
.prodrating > a,.smallreviewstars > a{display:inline-flex;gap:1px;line-height:0;}
.card .prodrating,.product .prodrating{margin:4px 0 0;}
/* Slim size-availability bar on listing cards (ectcustomfunction1 / inc-product-sizes.php).
   Full size run as small chips, under the name / above the price: in-stock = ink outline,
   sold-out = muted + diagonal slash. An at-a-glance "is my size left?" guide. */
.mw-sizebar{display:flex;flex-wrap:wrap;gap:4px;margin:7px 0 3px;padding:0;list-style:none;}
.mw-sz{font:600 .64rem/1 Inter;letter-spacing:.02em;color:var(--ink);background:#fff;border:1px solid var(--line);border-radius:2px;padding:3px 5px;min-width:1.5em;text-align:center;box-sizing:border-box;}
/* Out-of-stock size pill: crisp diagonal via an SVG line (gradient hard-stops alias on the diagonal).
   preserveAspectRatio='none' stretches corner-to-corner on any pill size; non-scaling-stroke keeps it 1px. */
.mw-sz.is-out{color:var(--muted);background:var(--paper-2);border-color:var(--line);background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100' preserveAspectRatio='none'%3E%3Cline x1='0' y1='100' x2='100' y2='0' stroke='%236E6657' stroke-width='1' vector-effect='non-scaling-stroke'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:center;background-size:100% 100%;}
/* Manual single-size tag for one-size / "Imperfection" closeout items whose Size option
   group won't trigger the dynamic bar. ECT strips HTML from the listing Description, so
   authors type a PLAIN-TEXT token in the product Description (pDescription) instead:
   [XL]  — or several: [S] [M] [L]  — and mw.js upgrades each token into one of these chips.
   A trailing - marks a size sold out: [XL-] renders the slashed .is-out variant. */
.mw-sizetag{display:inline-block;font:600 .64rem/1 Inter;letter-spacing:.02em;color:var(--ink);background:#fff;border:1px solid var(--line);border-radius:2px;padding:3px 5px;min-width:1.5em;text-align:center;box-sizing:border-box;margin:7px 0 3px;vertical-align:middle;}
.mw-sizetag.is-out{color:var(--muted);background:var(--paper-2);background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100' preserveAspectRatio='none'%3E%3Cline x1='0' y1='100' x2='100' y2='0' stroke='%236E6657' stroke-width='1' vector-effect='non-scaling-stroke'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:center;background-size:100% 100%;}
/* Star summary under the product name */
.detailreviewstars{display:inline-flex;align-items:center;margin:4px 0 2px;}
.detailreviewstars a{display:inline-flex;gap:1px;line-height:0;}
.detailratingtext{font-size:.85rem;color:var(--muted);margin-top:2px;}

/* Reviews section (below the product) */
.proddetail-reviews{padding-top:6px;}
.reviews{border-top:1px solid var(--line);padding-top:22px;margin-top:8px;}
.reviews::before{content:"Customer Reviews";display:block;font-family:Fraunces,serif;font-weight:500;font-size:clamp(1.2rem,2.4vw,1.45rem);color:var(--ink);margin-bottom:12px;}
.reviewtotals{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 10px;color:var(--muted);font-size:.88rem;margin-bottom:14px;}
.reviewtotals .count,.reviewtotals .rating.average{color:var(--ink);font-weight:600;}
/* Generic/placeholder reviews headline ("Over 100K Happy Customers…"): match the
   bold-ink emphasis of a real review count for the <strong> portion. */
.reviewtotals .mw-generic-totals strong{color:var(--ink);font-weight:600;}
.showallreview a{color:var(--rubric);text-decoration:underline;text-underline-offset:2px;}
.clickreview{margin:0 0 20px;}
.clickreview .ectbutton{background:transparent;color:var(--ink);border-color:var(--ink);font-size:.68rem;padding:10px 20px;}
.clickreview .ectbutton:hover{background:var(--ink);color:var(--paper);border-color:var(--ink);}
/* Individual reviews */
.reviewscontainer{display:flex;flex-direction:column;gap:12px;}
.ecthreview{border:1px solid var(--line);border-radius:3px;padding:13px 16px;background:var(--paper-2);}
.reviewstarsheader{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:5px;}
.reviewstarsheader .rating{display:inline-flex;gap:1px;line-height:0;}
.reviewheader{font-family:Fraunces,serif;font-weight:500;font-size:.98rem;color:var(--ink);}
.reviewname{font-size:.8rem;color:var(--muted);margin-bottom:7px;}
.reviewname .reviewer{font-weight:600;color:var(--ink);}
/* Shopify-style "verified buyer" badge after the reviewer name */
.reviewname .reviewer::after{content:"\2713 Verified Buyer";display:inline-block;margin-left:9px;background:#e6f1e6;color:#2c7a36;font:600 .58rem/1.5 Inter;letter-spacing:.05em;text-transform:uppercase;padding:2px 8px;border-radius:100px;vertical-align:1px;white-space:nowrap;}
/* Store reply to a review — a quiet, indented aside under the review body (never inside
   itemprop="reviewBody", carries no schema.org markup of its own). A translucent ink wash
   rather than a fixed tint so it reads correctly on both the --paper-2 card background here
   and the --paper card background inside the #reviews-slot rail. */
.reviewreply{margin-top:10px;padding:9px 13px;background:rgba(23,20,14,.05);border-left:3px solid var(--muted);border-radius:0 2px 2px 0;}
.reviewreply-label{font:600 .64rem/1.3 Inter;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);margin-bottom:3px;}
.reviewreply-text{font-size:.85rem;line-height:1.55;color:var(--ink);}

/* ----- Relocated reviews block (#reviews-slot, the band after "You Might Also Like") -----
   Sits in a tinted "section band" (--panel, a reusable warm-sand shade) so it reads as its
   own area; cards drop to the lightest paper so they lift off the band; the card list becomes
   a horizontal, swipeable rail (scrolls only when the cards overflow the row); and the
   "write a review" button rides up beside the heading. Scoped to #reviews-slot so the
   stacked all-reviews page is untouched. */
.section-band{background:var(--panel);}                 /* reusable across the site */
.review-band{background:var(--panel);padding:54px 0;}
#reviews-slot .proddetail-reviews{padding:0;}
#reviews-slot .reviews{position:relative;border-top:0;margin:0;padding:0;}
#reviews-slot .reviews::before{margin-bottom:6px;}
#reviews-slot .reviewtotals{margin-bottom:22px;}
/* Button up beside the title, top-right of the block */
#reviews-slot .clickreview{position:absolute;top:0;right:0;margin:0;}
#reviews-slot .clickreview .ectbutton{white-space:nowrap;}
/* Cards → horizontal rail */
#reviews-slot .reviewscontainer{flex-direction:row;gap:18px;overflow-x:auto;overflow-y:hidden;scroll-snap-type:x mandatory;scroll-behavior:smooth;scrollbar-width:none;padding-bottom:2px;}
#reviews-slot .reviewscontainer::-webkit-scrollbar{display:none;}
#reviews-slot .ecthreview{flex:0 0 min(380px,84%);scroll-snap-align:start;background:var(--paper);padding:16px 18px;}
/* Desktop: soften the right edge of the rail so the clipped next card fades out
   instead of ending on a hard line. Mask follows the scrollport's visible box. */
@media(min-width:601px){
  #reviews-slot .reviewscontainer{-webkit-mask-image:linear-gradient(to right,#000 calc(100% - 40px),transparent);mask-image:linear-gradient(to right,#000 calc(100% - 40px),transparent);}
}
@media(max-width:600px){
  #reviews-slot .clickreview{position:static;margin:0 0 16px;}
  #reviews-slot .ecthreview{flex:0 0 86%;}
}

/* All-reviews page (?review=all): ECT prints its own "Reviews for the product - <name>" heading
   plus sort links and a back button. Use that as the heading (drop the duplicate "Customer
   Reviews" label) and theme the back button. */
.reviews:has(.reviewsforprod)::before,.reviews .reviews::before{content:none;}
.reviewsforprod,.reviewprod{font-family:Fraunces,serif;font-weight:500;font-size:clamp(1.3rem,3vw,1.7rem);color:var(--ink);line-height:1.2;}
.reviewsforprod{color:var(--muted);}
.ectbutton.reviewback{background:transparent;color:var(--ink);border-color:var(--ink);font-size:.7rem;padding:11px 20px;margin-left:10px;vertical-align:2px;}
.ectbutton.reviewback:hover{background:var(--ink);color:var(--paper);}
/* The all-reviews page prints the full product image; show it as a small thumbnail instead */
.reviews .detailreviewimage{width:120px;height:auto;border-radius:2px;background:var(--paper-2);float:right;margin:0 0 14px 22px;}
.reviewcomments{line-height:1.55;font-size:.92rem;color:var(--ink);}
/* ECT repeats the "click to review" button below the list. We keep the one up
   top (next to the totals — present even when there are zero reviews) and hide
   this trailing duplicate. */
.reviews > .clickreview + .reviewscontainer{margin-top:0;}
.reviewscontainer + .clickreview{display:none;}

/* Write-a-review form (?review=true) */
.reviewing{font-family:Fraunces,serif;font-weight:500;font-size:clamp(1.3rem,3vw,1.6rem);color:var(--ink);margin:0 0 18px;}
.reviewformblock{max-width:520px;}
.reviewimagecontainer img{width:108px;height:auto;border-radius:2px;background:var(--paper-2);margin-bottom:18px;}
.reviewformline{margin:0 0 15px;}
.reviewlabels{font:600 .7rem/1.3 Inter;letter-spacing:.06em;text-transform:uppercase;color:var(--muted);margin-bottom:6px;}
.reviewlabels .redstar{color:var(--rubric);margin-right:3px;}
.reviewfields input,.reviewfields select,.reviewfields textarea,.reviewfields .reviewform{width:100%;border:1px solid var(--line);border-radius:2px;padding:11px 13px;font:400 .95rem Inter;background:#fff;color:var(--ink);}
.reviewfields textarea{min-height:120px;resize:vertical;}
.reviewfields input:focus,.reviewfields select:focus,.reviewfields textarea:focus{outline:none;border-color:var(--ink);}
.reviewsubmit{margin-top:10px;}
.reviewsubmit .ectbutton{font-size:.74rem;padding:14px 28px;}
/* Interactive star rating: replaces the ratingstars <select> in the review form.
   JS hides the select (keeps it for the value + ECT's checkratingform validation) and
   drives this widget — hover previews, click commits. */
.mw-starpick{display:inline-flex;gap:7px;font-size:1.85rem;line-height:1;cursor:pointer;}
.mw-starpick .st{color:var(--line);transition:color .12s,transform .12s;}
.mw-starpick .st.on{color:var(--rubric);}
.mw-starpick .st:active{transform:scale(.9);}
.mw-starpick .st:focus-visible{outline:2px solid var(--rubric);outline-offset:2px;border-radius:3px;}
/* ===== Lightweight popup/modal (replaces Magnific Popup) ===== */
.mfp-hide{display:none !important;}
.mw-ov{position:fixed;inset:0;background:rgba(23,20,14,.6);display:flex;align-items:flex-start;justify-content:center;padding:6vh 16px;z-index:200;overflow-y:auto;opacity:0;visibility:hidden;transition:opacity .2s;}
.mw-ov.open{opacity:1;visibility:visible;}
.mw-modal{background:var(--paper);max-width:640px;width:100%;padding:40px 34px 34px;position:relative;border-radius:3px;box-shadow:0 30px 70px rgba(23,20,14,.35);}
.mw-modal-x{position:absolute;top:10px;right:14px;background:none;border:0;font-size:1.7rem;line-height:1;cursor:pointer;color:var(--muted);}
.mw-modal-x:hover{color:var(--rubric);}
.mw-modal iframe{width:100%;height:62vh;border:0;display:block;}
.mw-modal-body :first-child{margin-top:0;}

/* ===== Product detail spacing tidy-ups ===== */

/* Breadcrumb — tighter */
/* Breadcrumb — sit it more evenly between the header and the image/title
   (the head section adds ~30px above; balance that with room below + a touch more breathing room up top). */
.catnavdetail{font-size:.82rem;line-height:1.5;}
/* Match the products/categories breadcrumb bar: one line, scrolls sideways when long, with the
   same right-edge fade (.is-scroll/.at-end toggled by a small script in proddetail.php). */
.catnavigation.catnavdetail{margin:.6rem 0 2.2rem;overflow-x:auto;white-space:nowrap;-webkit-overflow-scrolling:touch;scrollbar-width:none;}
.catnavigation.catnavdetail::-webkit-scrollbar{display:none;}
.catnavdetail .ectbreadcrumb{display:inline;margin:0;white-space:nowrap;}
.catnavigation.catnavdetail.is-scroll:not(.at-end){-webkit-mask-image:linear-gradient(to right,#000 84%,transparent);mask-image:linear-gradient(to right,#000 84%,transparent);}

/* Description tabs — clean minimal underline tabs */
.nav-tabs,.nav-tabs.tpl-minimal-tabs{border-bottom:1px solid var(--line);margin:1.9rem 0 1rem;padding:0;display:flex;flex-wrap:wrap;justify-content:center;gap:4px;list-style:none;}
.nav-tabs .nav-item{margin:0;}
.nav-tabs .nav-link{border:0;border-bottom:2px solid transparent;background:none;padding:10px 16px;font:500 .8rem/1 Inter;letter-spacing:.06em;text-transform:uppercase;color:var(--muted);border-radius:0;cursor:pointer;display:inline-flex;align-items:center;gap:7px;}
/* Optically center the tab icon on the uppercase cap-height (the caps sit high in the line
   box, so flex-centering alone leaves the icon reading slightly low) */
.nav-tabs .nav-link i[class*="fa-"]{font-size:.95em;transform:translateY(-1px);}
.nav-tabs .nav-link:hover{color:var(--ink);}
.nav-tabs .nav-link.active,.nav-tabs .nav-link.show.active{color:var(--ink);border-bottom-color:var(--rubric);background:none;}
.tab-content{padding-top:0;line-height:1.7;}
.tab-content>.tab-pane>:first-child{margin-top:0;}/* no extra gap above the first description line */
.tab-pane h2,.tab-pane h3{font-family:Fraunces,serif;font-weight:500;margin:1.2rem 0 .6rem;}

/* Bundle / quantity-discount card (Bundle tab, content region 34) — clean centered tiers */
.bundle-card{background:#F3EFE6;border-radius:10px;padding:26px 30px;text-align:center;max-width:430px;margin:.5rem auto;}
/* Title carries a highlighter wash behind the lower third; static by default, swept in by mw.js (.hl-anim + .in) when it scrolls into view. */
.bundle-card .bundle-title{display:inline-block;font:700 1.02rem/1.2 Inter;letter-spacing:.05em;text-transform:uppercase;color:var(--ink);margin:0 0 16px;padding:0 3px;background:linear-gradient(transparent 60%, color-mix(in srgb, var(--rubric) 22%, transparent) 60%) left bottom/100% 100% no-repeat;}
.bundle-card .bundle-title.hl-anim{background-size:0% 100%;}
.bundle-card .bundle-title.hl-anim.in{animation:bundleSweep .75s ease-out forwards;}
@keyframes bundleSweep{from{background-size:0% 100%;}to{background-size:100% 100%;}}
.bundle-card .bundle-tier{color:var(--muted);font-size:.98rem;line-height:1.45;margin:9px 0;}
.bundle-card .bundle-tier strong{color:var(--ink);font-weight:700;}
.bundle-card .bundle-tier .bundle-each{color:var(--muted);font-weight:400;font-size:.86em;}
.bundle-card .bundle-note{font-size:.8rem;color:var(--muted);margin:15px 0 0;line-height:1.5;}
.bundle-card .bundle-note .bundle-mix{display:inline-block;color:var(--ink);font-weight:600;font-size:.92rem;margin-bottom:2px;}
/* Left-aligned variant (sticker under-price card, region 11) — sits flush with the price/title above it */
.bundle-card.bundle-card--left{text-align:left;margin-left:0;margin-right:0;width:fit-content;padding:22px 24px;}
/* Mobile: drop the shrink-wrap; stretch and center with a gutter on each side. */
@media (max-width:560px){.bundle-card.bundle-card--left{width:auto;text-align:center;margin:.5rem 14px;}}
.tab-content table{margin:.5rem 0;}

/* Sizing charts (Sizing tab, inc-proddetail-sizing.php — table.table-slim).
   Themed to the parchment/ink palette: light hairline rows, no heavy Bootstrap
   borders, serif size labels, centered numeric columns. Wraps in a scroll area
   on narrow screens so wide (sleeve) charts don't blow out the layout. */
.tab-pane table.table-slim{width:auto;max-width:100%;border-collapse:collapse;margin:1rem 0 .4rem;font:400 .92rem/1.4 Inter;color:var(--ink-soft);background:#fff;border:1px solid var(--line);border-radius:4px;overflow:hidden;}
.tab-pane table.table-slim thead th{background:var(--paper-2);color:var(--ink);font:600 .68rem/1.3 Inter;letter-spacing:.06em;text-transform:uppercase;text-align:center;padding:11px 14px;border-bottom:2px solid var(--rubric);white-space:nowrap;vertical-align:bottom;}
.tab-pane table.table-slim thead th:first-child{text-align:left;}
.tab-pane table.table-slim tbody th[scope=row]{text-align:left;font:600 .9rem/1.3 Inter;color:var(--ink);padding:9px 14px;white-space:nowrap;}
.tab-pane table.table-slim tbody td{text-align:center;padding:9px 14px;font-variant-numeric:tabular-nums;}
.tab-pane table.table-slim tbody tr+tr th,.tab-pane table.table-slim tbody tr+tr td{border-top:1px solid var(--line);}
.tab-pane table.table-slim tbody tr:nth-child(even) th,.tab-pane table.table-slim tbody tr:nth-child(even) td{background:color-mix(in srgb,var(--paper) 45%,#fff);}
.tab-pane table.table-slim tbody tr:hover th,.tab-pane table.table-slim tbody tr:hover td{background:color-mix(in srgb,var(--rubric) 7%,#fff);}
/* Trailing note / measuring tip paragraphs under each chart */
.tab-pane table.table-slim+span,.tab-pane table.table-slim~p{display:block;font-size:.82rem;line-height:1.5;color:var(--muted);margin:.6rem 0 0;max-width:62ch;}
/* Narrow screens: let the table scroll horizontally rather than squashing */
@media(max-width:560px){.tab-pane table.table-slim{display:block;overflow-x:auto;-webkit-overflow-scrolling:touch;}}

/* "More" products tab — small wrapped thumbnails, no bullets (like the Other Styles grid) */
ul.moreproductstabmenu{list-style:none;margin:.4rem 0 0;padding:0;display:flex;flex-wrap:wrap;gap:12px;}
ul.moreproductstabmenu>li{list-style:none;margin:0;}
ul.moreproductstabmenu>li>a{display:block;}
ul.moreproductstabmenu img{width:90px;height:auto;border:1px solid var(--line);border-radius:2px;padding:3px;background:#fff;transition:.15s;}
ul.moreproductstabmenu>li>a:hover img{border-color:var(--rubric);}

/* ===== Category / product listing (products.php) ===== */
/* Breadcrumb — match the product-detail breadcrumb: inline crumbs, same size & spacing */
.catnavandcheckout.catnavproducts,.catnavigation.catnavproducts{font-size:.82rem;color:var(--muted);line-height:1.5;margin:0 56px 1rem 0;min-height:40px;display:flex;align-items:center;}
.catnavproducts .ectbreadcrumb{display:inline;margin:0;}
.catnavproducts a.ectlink{color:var(--muted);text-decoration:none;}
.catnavproducts a.ectlink:hover{color:var(--rubric);}
/* Category-landing breadcrumb — same .lh-crumbs bar as products/proddetail (categories.php now
   buffers inccategories and re-emits the breadcrumb at the top). Colours/links match. */
.catnavandcheckout.catnavcategories,.catnavigation.catnavcategories{font-size:.82rem;color:var(--muted);line-height:1.5;margin:0;}
.catnavcategories .ectbreadcrumb{display:inline;margin:0;}
.catnavcategories a.ectlink,.lh-crumbs a.ectlink{color:var(--muted);text-decoration:none;}
.catnavcategories a.ectlink:hover,.lh-crumbs a.ectlink:hover{color:var(--rubric);}
.cat-landing .lh-crumbs{margin-bottom:18px;}/* a little room before the centered header */
.products{display:grid;grid-template-columns:repeat(4,1fr);gap:38px 24px;margin:1.5rem 0;list-style:none;padding:0;}
.product{position:relative;}
.product .prodimg_cont{position:relative;}
/* Corner labels (New / Sale / Popular / Quick Ship / Out of Stock) from inc-product_tags_img.php */
.product-labels-container{position:absolute;top:10px;left:10px;z-index:3;display:flex;flex-direction:column;align-items:flex-start;gap:5px;pointer-events:none;}
.label-pill{display:inline-flex;align-items:center;gap:4px;font:600 .62rem/1 Inter;letter-spacing:.09em;text-transform:uppercase;padding:5px 9px;border-radius:2px;background:var(--ink);color:var(--paper);white-space:nowrap;box-shadow:0 1px 3px rgba(23,20,14,.18);}
.label-pill i{font-size:.9em;}
.label-pill.label-new{background:#2456a6;color:#fff;}
/* Sale badge = a little red price-tag (point + string hole on the left) so it reads
   differently from the other rectangular pills. clip-path carves the point; the base
   box-shadow gets clipped away, so restore depth with a shape-following drop-shadow. */
/* Always the rubric-RED (#9E2B22), not var(--rubric) — the active theme's rubric is blue,
   but a sale flag reads as red universally. Point + string hole are on the RIGHT edge. */
.label-pill.label-sale{position:relative;background:#9E2B22;color:#fff;padding-right:15px;border-radius:2px 0 0 2px;box-shadow:none;filter:drop-shadow(0 1px 2px rgba(23,20,14,.22));clip-path:polygon(0 0,calc(100% - 8px) 0,100% 50%,calc(100% - 8px) 100%,0 100%);}
.label-pill.label-sale::before{content:"";position:absolute;right:6px;top:50%;transform:translateY(-50%);width:3px;height:3px;border-radius:50%;background:var(--paper);}
.label-pill.label-popular{background:var(--paper);color:var(--ink);border:1px solid var(--line);box-shadow:none;}
.label-pill.label-quick-ship{background:#3a5a40;color:#fff;}
.label-pill.label-oos,.label-pill.label-out-of-stock,.label-pill.label-soldout{background:var(--muted);color:#fff;}
/* Hide the ECT "Customize" (configbutton) on product cards for now — the card links to the detail page */
.configbutton{display:none;}
.prodaddtocart:has(.configbutton){display:none;}

/* Out-of-stock cards (Shopify-style): grayed image + centered "Out of Stock" overlay */
.product:has(.prodnotifystock) img.prodimage{filter:grayscale(.55);opacity:.72;transition:.25s;}
.product:has(.prodnotifystock):hover img.prodimage{transform:none;opacity:.6;}
.product:has(.prodnotifystock) .prodaddtocart{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);margin:0;z-index:3;width:auto;}
.product .notifystock.prodnotifystock{background:rgba(23,20,14,.85);color:#fff;border:0;border-radius:2px;font:600 .68rem/1 Inter;letter-spacing:.1em;text-transform:uppercase;padding:12px 18px;cursor:pointer;transition:.18s;}
.product:hover .notifystock.prodnotifystock{background:var(--rubric);}

/* In-stock "Quick add" — hover overlay at the image's bottom-right (artofhomage/Shopify style).
   Keeps ECT's add-to-cart submit behavior; the label is set to "Quick add" in mw.js. */
.products .prodaddtocart:has(.buybutton){position:absolute;right:0;bottom:0;left:auto;top:auto;margin:0;width:auto;z-index:3;opacity:0;transform:translateY(6px);transition:opacity .2s,transform .2s;pointer-events:none;}
.products .product:hover .prodaddtocart:has(.buybutton),.products .product:focus-within .prodaddtocart:has(.buybutton){opacity:1;transform:none;pointer-events:auto;}
.products .prodaddtocart:has(.buybutton) .ectbutton.buybutton{flex:0 0 auto;background:rgba(23,20,14,.82);border:0;color:#fff;font:600 .74rem/1 Inter;letter-spacing:.02em;text-transform:none;padding:14px 22px;min-height:0;border-radius:0;cursor:pointer;}
.products .prodaddtocart:has(.buybutton) .ectbutton.buybutton:hover{background:var(--rubric);color:#fff;}
@media(hover:none),(max-width:920px){.products .prodaddtocart:has(.buybutton){opacity:1;transform:none;pointer-events:auto;}}
div.prodimage{display:block;background:var(--paper-2);aspect-ratio:1/1;overflow:hidden;margin-bottom:14px;border-radius:2px;}
div.prodimage a{display:block;width:100%;height:100%;}
img.prodimage{width:100%;height:100%;object-fit:cover;transition:transform .5s;}
.product:hover img.prodimage{transform:scale(1.03);}
/* Multi-image hover scrubber: hide ECT's PREV / "1 of 2" / More Images text controls; use dots instead */
.prodimagenavigator{display:none;}
.cardimg-dots{position:absolute;left:0;right:0;bottom:9px;display:flex;justify-content:center;gap:6px;z-index:4;pointer-events:none;}
.cardimg-dot{width:6px;height:6px;border-radius:50%;background:rgba(23,20,14,.3);box-shadow:0 0 0 1px rgba(244,241,233,.5);cursor:pointer;pointer-events:auto;transition:background .18s,transform .18s;}
.cardimg-dot.on{background:var(--ink);transform:scale(1.25);}
.prodname{font-size:.92rem;line-height:1.35;margin-bottom:3px;}
.prodname a{color:var(--ink);}
.product:hover .prodname a{color:var(--rubric);}
/* Pulsing "ready to ship" status dot (Shopify-style): a solid green dot with a ::before clone
   that expands and fades to make the glow ring. Used wherever an item is in stock & shipping now. */
.ship-dot{position:relative;display:inline-block;width:8px;height:8px;border-radius:50%;background:#22b24a;flex:0 0 auto;vertical-align:middle;}
.ship-dot::before{content:"";position:absolute;inset:0;border-radius:50%;background:#22b24a;animation:shipPulse 1.8s ease-out infinite;}
@keyframes shipPulse{0%{transform:scale(1);opacity:.7;}70%{transform:scale(2.8);opacity:0;}100%{transform:scale(2.8);opacity:0;}}
@media(prefers-reduced-motion:reduce){.ship-dot::before{animation:none;}}

/* Quick-ship marker (inc-product-shipnow.php): a pulsing dot at the image's top-right
   that, on card hover, expands into a discrete "Quick Ship" pill. The label slides out
   to the LEFT of the dot (flex row-reverse + right-anchored) so it never runs off the
   card edge. */
.prodimg_cont .ship-corner{position:absolute;top:10px;right:10px;z-index:3;display:inline-flex;flex-direction:row-reverse;align-items:center;background:transparent;border-radius:999px;padding:0;cursor:help;transition:background .2s ease,padding .25s ease,box-shadow .2s ease;}
.prodimg_cont .ship-corner .ship-dot{width:9px;height:9px;flex:none;}
.prodimg_cont .ship-corner .ship-label{max-width:0;overflow:hidden;white-space:nowrap;opacity:0;font:600 .6rem/1 Inter;letter-spacing:.07em;text-transform:uppercase;color:var(--ink);transition:max-width .35s ease,opacity .25s ease,margin .35s ease;}
/* Expand the "Quick Ship" explainer only when the dot itself is hovered — not the whole card */
.prodimg_cont .ship-corner:hover{background:rgba(244,241,233,.94);padding:5px 9px;box-shadow:0 3px 10px rgba(23,20,14,.14);}
.prodimg_cont .ship-corner:hover .ship-label{max-width:90px;opacity:1;margin-right:7px;}

/* Product-detail / content-region ship label (.shiptime) uses a truck <i> stored in a content
   region; render it as the pulsing green dot instead, so it matches everywhere (deploys with CSS). */
.shiptime i[class*="fa-truck"]{-webkit-mask:none !important;mask:none !important;background:transparent !important;display:inline-block;width:.85em;height:.85em;position:relative;vertical-align:-1px;}
.shiptime i[class*="fa-truck"]::after{content:"";position:absolute;left:50%;top:50%;width:8px;height:8px;margin:-4px 0 0 -4px;border-radius:50%;background:currentColor;}
.shiptime i[class*="fa-truck"]::before{content:"";position:absolute;left:50%;top:50%;width:8px;height:8px;margin:-4px 0 0 -4px;border-radius:50%;background:currentColor;animation:shipPulse 1.8s ease-out infinite;}
@media(prefers-reduced-motion:reduce){.shiptime i[class*="fa-truck"]::before{animation:none;}}
/* The dot + label sit in a bare inline <span>, so the dot aligned to the text
   baseline and rode high. Center it against the text. */
.shiptime span:has(> i[class*="fa-truck"]){display:inline-flex;align-items:center;gap:7px;}
.product br{display:none;}/* drop the hard break between name and price */
/* Price — Shopify-style: drop the "Price" label, show sale + original inline */
.prodpricelabel{display:none;}
.prodprice{display:inline-block;font:600 .95rem/1.4 Inter;color:var(--ink);margin-top:1px;}
.listpricediv.listprice{display:inline-block;margin-left:6px;font:400 .9rem/1.4 Inter;}
.listpricediv.listprice del{color:var(--muted);}
/* Percent-off chip injected by mw.js next to the crossed-out list price */
.listpricediv.listprice .price-pct{margin-left:6px;font:600 .8rem/1.4 Inter;color:#9E2B22;white-space:nowrap;}
/* Turn the price rubric ONLY on a real discount: ECT renders the list-price div for every
   product that has a list price, but hides it (style="display:none") when list == price.
   Match only the visible (truly discounted) list price so non-discounted prices stay ink. */
.product:has(.listpricediv.listprice:not([style*="display:none"])) .price{color:var(--rubric);}
.prodaddtocart{margin-top:10px;}
.prodaddtocart .ectbutton{font-size:.7rem;padding:10px 16px;}

/* ===== ECT softform modals (.ectopaque > .ectsoftwrapper) =====
   Covers notify-when-in-stock (#notifyinstockcover), login / create-account / contact (#softopaquediv),
   and quick-buy (#opaquediv). ECT toggles each overlay's inline display (none <-> '') in JS; the inline
   display:none keeps it hidden until opened, then it falls back to this flex overlay instead of rendering
   as a plain block at the bottom of the page. */
.ectopaque{position:fixed;inset:0;background:rgba(23,20,14,.6);z-index:200;display:flex;align-items:flex-start;justify-content:center;padding:8vh 16px;overflow-y:auto;}
.ectopaque .ectsoftwrapper{position:relative;background:var(--paper);max-width:440px;width:100%;padding:38px 34px 30px;border-radius:3px;box-shadow:0 30px 70px rgba(23,20,14,.35);text-align:center;animation:nis-pop .22s ease;}
@keyframes nis-pop{from{opacity:0;transform:translateY(12px);}to{opacity:1;transform:none;}}
.ectopaque .scclose{position:absolute;top:8px;right:12px;width:32px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer;color:var(--muted);font-size:0;z-index:2;}
.ectopaque .scclose::before{content:"\00d7";font-size:1.8rem;line-height:1;}
.ectopaque .scclose:hover{color:var(--rubric);}
.ectopaque .softformheader{font-family:Fraunces,serif;font-size:1.5rem;font-weight:500;color:var(--ink);margin:.1rem 0 1.1rem;line-height:1.12;}
/* Shared softform fields: stacked label + full-width input */
.ectsoftwrapper .ectsf2col{display:block;text-align:left;margin:0 0 14px;}
.ectsoftwrapper .ectsf2col>div:first-child{margin-bottom:6px;}
.ectsoftwrapper .ectsf2col label.ectlabel{display:block;font:600 .7rem/1 Inter;letter-spacing:.06em;text-transform:uppercase;color:var(--muted);}
.ectsoftwrapper .redstar label.ectlabel::after{content:" *";color:var(--rubric);}
.ectsoftwrapper input[type=text],.ectsoftwrapper input[type=email],.ectsoftwrapper input[type=password],.ectsoftwrapper input.ectinput,.ectsoftwrapper .ectselectinput,.ectsoftwrapper textarea{width:100%;border:1px solid var(--line);border-radius:2px;padding:12px 14px;font:400 .95rem Inter;background:#fff;}
.ectsoftwrapper input:focus,.ectsoftwrapper select:focus,.ectsoftwrapper textarea:focus{outline:none;border-color:var(--ink);}
/* Checkbox rows (e.g. "Remember login") stay inline */
.ectsoftwrapper .ectsf2col:has(.ectcheckbox){display:flex;align-items:center;gap:8px;}
.ectsoftwrapper .ectsf2col:has(.ectcheckbox)>div{margin:0;}
.ectsoftwrapper .ectsf2col:has(.ectcheckbox) label.ectlabel{text-transform:none;letter-spacing:0;font-weight:400;font-size:.9rem;color:var(--ink);}
.ectsoftwrapper .softformsend{margin-top:16px;}
.ectsoftwrapper .softformsend .ectbutton{width:100%;}
.ectsoftwrapper .ectwarning{color:var(--rubric);}
.ectsoftwrapper .ectsfsuccess:not(:empty){padding:10px 0;color:var(--ink);}
/* notify-in-stock form has two inline-styled blurb divs — tidy them */
#notifyinstockcover .ectsoftwrapper>div[style*="margin:20px"]{margin:6px 0 0 !important;}
#notifyinstockcover .ectsoftwrapper>div[style*="font-weight:bold"]{font-weight:400 !important;color:var(--muted);font-size:.92rem;line-height:1.55;padding:0 !important;margin:14px 0 4px !important;}
#notifyinstockcover h2{font-family:Fraunces,serif;font-weight:500;font-size:1.12rem;color:var(--ink);margin:6px 0 0 !important;}

/* ===== Quick Buy (option products) =====
   ECT emits BOTH an inline add-to-cart and a Quick Buy popup for every product. We surface only
   one per card: products WITH options can't pick a size from the inline button, so hide it and
   show Quick Buy; products WITHOUT options keep the one-click add and don't need the popup.
   Options render only inside the popup, so `.qbopaque .prodoption` is the reliable per-card flag.
   Hide the inline add-to-cart whatever its runtime state — NOT only while it carries `.buybutton`:
   picking an out-of-stock variant in the popup makes ectcart.js reclass this same (shared-class)
   card button buybutton -> notifystock, which would otherwise un-hide it behind the modal. The
   exception is a server-rendered fully-OOS product, whose button carries `.prodnotifystock` (the JS
   swap only ever adds `notifystock`); that one keeps its centered "join the waitlist" overlay. */
.products .product:has(.qbopaque .prodoption) .prodaddtocart:not(:has(.prodnotifystock)){display:none;}
.products .product:not(:has(.qbopaque .prodoption)) .qbuybutton{display:none;}
/* Quick Buy trigger: same hover-overlay treatment as the in-stock "Quick add" button */
.products .qbuybutton{position:absolute;right:0;bottom:0;z-index:3;margin:0;opacity:0;transform:translateY(6px);transition:opacity .2s,transform .2s;pointer-events:none;}
.products .product:hover .qbuybutton,.products .product:focus-within .qbuybutton{opacity:1;transform:none;pointer-events:auto;}
.products .qbuybutton .ectbutton.qbuybutton{background:rgba(23,20,14,.82);border:0;color:#fff;font:600 .74rem/1 Inter;letter-spacing:.02em;text-transform:none;white-space:nowrap;padding:14px 22px;min-height:0;border-radius:0;cursor:pointer;}
.products .qbuybutton .ectbutton.qbuybutton:hover{background:var(--rubric);color:#fff;}
@media(hover:none),(max-width:920px){.products .qbuybutton{opacity:1;transform:none;pointer-events:auto;}}
/* Mobile: drop the dark text pill for a discrete white basket-icon chip (applies to BOTH the
   Quick Buy trigger and the simple-product "Quick add"). Reuses the cart mask from mw-icons.css. */
@media(max-width:920px){
  /* Lower-LEFT on mobile: product photos often carry info (e.g. view labels) in the lower-right. */
  .products .qbuybutton,.products .prodaddtocart:has(.buybutton){left:8px;right:auto;bottom:8px;}
  .products .qbuybutton .ectbutton.qbuybutton,
  .products .prodaddtocart:has(.buybutton) .ectbutton.buybutton{
    width:36px;height:36px;min-width:0;padding:0;font-size:0;border-radius:50%;
    background:rgba(255,255,255,.9);color:var(--ink);box-shadow:0 1px 4px rgba(23,20,14,.22);
    display:flex;align-items:center;justify-content:center;}
  .products .qbuybutton .ectbutton.qbuybutton:hover,
  .products .prodaddtocart:has(.buybutton) .ectbutton.buybutton:hover{background:#fff;color:var(--rubric);}
  .products .qbuybutton .ectbutton.qbuybutton::before,
  .products .prodaddtocart:has(.buybutton) .ectbutton.buybutton::before{
    content:"";width:20px;height:20px;background-color:currentColor;
    -webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 7h16l-1.5 9h-13z'/%3E%3Ccircle cx='9' cy='20' r='1.4'/%3E%3Ccircle cx='18' cy='20' r='1.4'/%3E%3Cpath d='M5 7 4 4H2'/%3E%3C/svg%3E") center/contain no-repeat;
    mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 7h16l-1.5 9h-13z'/%3E%3Ccircle cx='9' cy='20' r='1.4'/%3E%3Ccircle cx='18' cy='20' r='1.4'/%3E%3Cpath d='M5 7 4 4H2'/%3E%3C/svg%3E") center/contain no-repeat;}
}
/* Quick Buy pop-up shell (div.qbopaque > div.qbuywrapper) — ectcart.css isn't loaded on themed
   pages, so mirror the softform modal look. Inner options/quantity reuse the global .optioncontainer
   / .quantity2div styling automatically. */
.qbopaque{position:fixed;inset:0;background:rgba(23,20,14,.6);z-index:200;display:flex;align-items:flex-start;justify-content:center;padding:8vh 16px;overflow-y:auto;}
/* Layout: photo on the left, product name + price stacked beside it (header row); every other
   element (options, add-to-cart) spans the full width below. */
.qbopaque .qbuywrapper{position:relative;background:var(--paper);max-width:560px;width:100%;padding:34px 30px 30px;border-radius:3px;box-shadow:0 30px 70px rgba(23,20,14,.35);animation:nis-pop .22s ease;box-sizing:border-box;display:grid;grid-template-columns:auto 1fr;column-gap:20px;row-gap:2px;align-items:center;}
.qbopaque .qbuywrapper > *{grid-column:1 / -1;min-width:0;}
.qbopaque .scclose{position:absolute;top:8px;right:12px;width:32px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer;color:var(--muted);z-index:2;}
.qbopaque .scclose::before{content:"\00d7";font-size:1.8rem;line-height:1;}
.qbopaque .scclose:hover{color:var(--rubric);}
/* Product photo: small fixed width at natural proportions, spanning the two header rows */
.qbopaque .qbuywrapper div.prodimage{grid-column:1;grid-row:1 / span 2;align-self:center;width:96px;max-width:96px;height:auto;aspect-ratio:auto;background:none;overflow:visible;margin:0;border-radius:2px;}
.qbopaque .qbuywrapper img.prodimage{display:block;width:100%;height:auto;object-fit:contain;}
.qbopaque .qbuywrapper .prodname{grid-column:2;grid-row:1;align-self:end;font-family:Fraunces,serif;font-weight:500;font-size:1.2rem;line-height:1.15;margin:0 36px 0 0;}
.qbopaque .qbuywrapper .prodname a{color:var(--ink);}
.qbopaque .qbuywrapper .prodprice{grid-column:2;grid-row:2;align-self:start;font:600 1.05rem/1.3 Inter;color:var(--ink);margin:2px 0 0;}
.qbopaque .qbuywrapper .prodpricelabel{display:none;}
/* Size / colour pickers: centered label + centered wrapping pills, below the header */
.qbopaque .qbuywrapper .prodoptions{margin-top:18px;}
.qbopaque .qbuywrapper .optiontext{text-align:center;}
.qbopaque .optioncontainer .option{display:flex;flex-wrap:wrap;gap:8px;align-items:center;justify-content:center;}
.qbopaque .optioncontainer .rcoption{margin:0;}
.qbopaque .qb-c9{display:none;}/* hidden pCustom9 token carrier read by mw.js to filter options */
.qbopaque .qbaddtocart{margin-top:12px;}
.qbopaque .qbaddtocart .ectbutton.buybutton{width:100%;}
/* Add to List in the Quick Buy popup = the same outline-heart square as the detail page
   (visual rules shared up at .detailwishlist). When present, sit it on one row beside the
   Add to Cart button: the buy button flexes, the heart is a fixed square. The shared
   #savelistdiv picker anchors under it via the position:relative container. */
.qbopaque .qbaddtocart:has(.productwishlist){display:flex;align-items:stretch;gap:10px;}
.qbopaque .qbaddtocart:has(.productwishlist) .ectbutton.buybutton{flex:1 1 auto;width:auto;}
.qbopaque .qbaddtocart .wishlistcontainer.productwishlist{flex:0 0 auto;position:relative;display:flex;margin:0;}
/* Add to List lives only in the Quick Buy popup (.qbaddtocart) + detail page. Hide it on the
   card hover-overlay (.prodaddtocart) so the card stays a single clean add-to-cart action.
   Simple products (no options, no popup) then carry Add to List on their detail page only. */
.products .prodaddtocart .wishlistcontainer.productwishlist,
.fp-bs-products .prodaddtocart .wishlistcontainer.productwishlist{display:none;}
@media(max-width:1024px){.products{grid-template-columns:repeat(3,1fr);gap:34px 24px;}}
@media(max-width:600px){.products{grid-template-columns:repeat(2,1fr);gap:28px 24px;}}

/* ===== Quick add / Quick Buy overlay on cross-sell cards (.fp-bs-products) =====
   Cross-sell blocks render with the fp-bs- prefix (card = .fp-bs-product), so the
   listing-grid overlay rules above (scoped to .products .product) don't reach them.
   Mirror the essentials here so a cross-sell card built with mw_crosssell_layout()
   gets the same image-overlay one-click add + Quick Buy option pop-up. Inactive
   until a block wraps its image in .prodimg_cont with addtocart/quickbuy. */
.fp-bs-products .prodimg_cont{position:relative;}
.fp-bs-products .fp-bs-product:has(.qbopaque .prodoption) .prodaddtocart:not(:has(.prodnotifystock)){display:none;}
.fp-bs-products .fp-bs-product:not(:has(.qbopaque .prodoption)) .fp-bs-qbuybutton{display:none;}
.fp-bs-products .fp-bs-qbuybutton,.fp-bs-products .prodaddtocart:has(.buybutton){position:absolute;right:0;bottom:0;left:auto;top:auto;z-index:3;margin:0;width:auto;opacity:0;transform:translateY(6px);transition:opacity .2s,transform .2s;pointer-events:none;}
.fp-bs-products .fp-bs-product:hover .fp-bs-qbuybutton,.fp-bs-products .fp-bs-product:focus-within .fp-bs-qbuybutton,.fp-bs-products .fp-bs-product:hover .prodaddtocart:has(.buybutton),.fp-bs-products .fp-bs-product:focus-within .prodaddtocart:has(.buybutton){opacity:1;transform:none;pointer-events:auto;}
.fp-bs-products .fp-bs-qbuybutton .ectbutton.fp-bs-qbuybutton,.fp-bs-products .prodaddtocart:has(.buybutton) .ectbutton.buybutton{flex:0 0 auto;background:rgba(23,20,14,.82);border:0;color:#fff;font:600 .74rem/1 Inter;letter-spacing:.02em;text-transform:none;white-space:nowrap;padding:14px 22px;min-height:0;border-radius:0;cursor:pointer;}
.fp-bs-products .fp-bs-qbuybutton .ectbutton.fp-bs-qbuybutton:hover,.fp-bs-products .prodaddtocart:has(.buybutton) .ectbutton.buybutton:hover{background:var(--rubric);color:#fff;}
@media(hover:none),(max-width:920px){.fp-bs-products .fp-bs-qbuybutton,.fp-bs-products .prodaddtocart:has(.buybutton){opacity:1;transform:none;pointer-events:auto;}}
/* Mobile: drop the dark text pill for a discrete white basket-icon chip in the lower-LEFT,
   mirroring the listing/search cards (both the Quick Buy trigger and simple-product add). */
@media(max-width:920px){
  .fp-bs-products .fp-bs-qbuybutton,.fp-bs-products .prodaddtocart:has(.buybutton){left:8px;right:auto;bottom:8px;}
  .fp-bs-products .fp-bs-qbuybutton .ectbutton.fp-bs-qbuybutton,
  .fp-bs-products .prodaddtocart:has(.buybutton) .ectbutton.buybutton{
    width:36px;height:36px;min-width:0;padding:0;font-size:0;border-radius:50%;
    background:rgba(255,255,255,.9);color:var(--ink);box-shadow:0 1px 4px rgba(23,20,14,.22);
    display:flex;align-items:center;justify-content:center;}
  .fp-bs-products .fp-bs-qbuybutton .ectbutton.fp-bs-qbuybutton:hover,
  .fp-bs-products .prodaddtocart:has(.buybutton) .ectbutton.buybutton:hover{background:#fff;color:var(--rubric);}
  .fp-bs-products .fp-bs-qbuybutton .ectbutton.fp-bs-qbuybutton::before,
  .fp-bs-products .prodaddtocart:has(.buybutton) .ectbutton.buybutton::before{
    content:"";width:20px;height:20px;background-color:currentColor;
    -webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 7h16l-1.5 9h-13z'/%3E%3Ccircle cx='9' cy='20' r='1.4'/%3E%3Ccircle cx='18' cy='20' r='1.4'/%3E%3Cpath d='M5 7 4 4H2'/%3E%3C/svg%3E") center/contain no-repeat;
    mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 7h16l-1.5 9h-13z'/%3E%3Ccircle cx='9' cy='20' r='1.4'/%3E%3Ccircle cx='18' cy='20' r='1.4'/%3E%3Cpath d='M5 7 4 4H2'/%3E%3C/svg%3E") center/contain no-repeat;}
}

/* Category title + pagination */
h1.h3{font-family:Fraunces,serif;font-weight:500;letter-spacing:-.015em;}
.pagenumbers{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:6px;margin:2.5rem 0 1rem;font:500 .9rem/1 Inter;}
.pagebarnum,.pagebarprevnext{display:inline-flex;align-items:center;justify-content:center;min-width:38px;height:38px;padding:0 10px;border:1px solid var(--line);color:var(--ink);border-radius:2px;text-decoration:none;}
.pagebarnum:hover,.pagebarprevnext:hover{border-color:var(--ink);color:var(--rubric);}
.pagebarnum.currpage{background:var(--ink);color:var(--paper);border-color:var(--ink);}
.pagebarsep,.pagebarquo{border:0;min-width:auto;height:auto;padding:0 2px;color:var(--muted);}
/* Hide the first/last «  » double-arrows; the Previous/Next buttons cover navigation. */
.pagenumbers .pagebarquo{display:none;}

/* ===== Category landing (categories.php) — ECT category grid styled as overlay plates ===== */
.cat-landing{padding-top:34px;}/* match the leaner top spacing of the other migrated pages (the homepage .section 84px is too much here) */
.cat-landing-head{text-align:center;margin-bottom:42px;}
.cat-landing-head .rubric{justify-content:center;margin-bottom:14px;}
.cat-landing-title{font-family:Fraunces,serif;font-weight:500;font-size:clamp(2rem,4vw,3.1rem);line-height:1.04;letter-spacing:-.015em;color:var(--ink);margin:0;}
.pg-categories .categories{display:grid;grid-template-columns:repeat(3,1fr);gap:18px;}
.pg-categories .category{position:relative;overflow:hidden;aspect-ratio:3/4;background:var(--paper-2);border-radius:2px;}
.pg-categories .category::after{content:"";position:absolute;inset:0;z-index:1;background:linear-gradient(to top,rgba(23,20,14,.74),rgba(23,20,14,.08) 58%,rgba(23,20,14,0));pointer-events:none;transition:.25s;}
.pg-categories .category:hover::after{background:linear-gradient(to top,rgba(23,20,14,.82),rgba(23,20,14,.2) 60%,rgba(23,20,14,.05));}
.pg-categories div.catimage{position:absolute;inset:0;margin:0;}
.pg-categories div.catimage a{display:block;width:100%;height:100%;}
.pg-categories img.catimage{width:100%;height:100%;object-fit:cover;transition:transform .6s ease;}
.pg-categories .category:hover img.catimage{transform:scale(1.05);}
.pg-categories .catname{position:absolute;left:16px;right:16px;bottom:16px;z-index:2;text-align:center;margin:0;}
.pg-categories .catname a{font-family:Fraunces,serif;font-weight:500;font-size:1.4rem;line-height:1.08;color:var(--paper);}
.pg-categories .category:hover .catname a{color:#fff;}
@media(max-width:780px){.pg-categories .categories{grid-template-columns:1fr 1fr;gap:12px;}.pg-categories .catname a{font-size:1.15rem;}}

/* Announcement / countdown bar (managed in vsadmin/mw-admin.php) */
.mw-annc{position:relative;background:var(--rubric);color:var(--paper);font:500 .74rem/1.2 Inter;letter-spacing:.04em;display:flex;align-items:center;justify-content:center;padding:8px 40px;overflow:hidden;}
.mw-annc a{color:inherit;text-decoration:none;}
.mw-annc a:hover{text-decoration:underline;}
.mw-annc-viewport{overflow:hidden;width:100%;max-width:960px;}
.mw-annc-track{display:flex;transition:transform .4s ease;will-change:transform;}
.mw-annc-slide{flex:0 0 100%;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.mw-annc-inner{display:inline-flex;align-items:center;gap:.6em;}
.mw-countdown{display:inline-flex;align-items:center;gap:.4em;}
.mw-countdown strong{font-weight:600;}
.mw-countdown small{font-size:.72em;opacity:.85;margin-left:1px;text-transform:uppercase;}
.mw-cd-prefix{opacity:.95;}
.mw-annc-arrow{position:absolute;top:50%;transform:translateY(-50%);border:0;background:transparent;color:currentColor;font-size:18px;line-height:1;cursor:pointer;padding:0 10px;opacity:.7;}
.mw-annc-arrow:hover{opacity:1;}
.mw-annc-prev{left:6px;}
.mw-annc-next{right:6px;}
@media(max-width:600px){.mw-annc{font-size:.7rem;padding:8px 32px;}}

/* ===== Cart page (cart.php) ===== */
/* (sticky footer now handled globally near the top of this file) */
/* Empty-cart message */
.emptycart{text-align:center;padding:64px 0 48px;}
.sorrycartempty{font-family:Fraunces,serif;font-weight:500;font-size:1.55rem;color:var(--ink);margin-bottom:.5rem;}
.cartemptyclickhere{color:var(--muted);}
.cartemptyclickhere a{color:var(--rubric);}
.emptycartcontinue{margin-top:18px;}
/* Cart header account buttons, signed-OUT (.loginprompt: Login / Create Account) and signed-IN
   (.cartloggedin: Logout / Create Gift Registry). ECT renders these as large navy blocks that
   crowd the page top (esp. on mobile); give BOTH states the same compact quiet-outline buttons
   that sit on one wrapping row, small enough to float, with a little space above — so logged-out
   looks and behaves the same as logged-in. */
.loginprompt,.cartloggedin{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin-top:12px;}
.loginprompt .ectbutton,.cartloggedin .ectbutton{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:auto;min-height:0;font:500 .66rem/1 Inter;letter-spacing:.06em;text-transform:uppercase;padding:8px 13px;border-radius:2px;background:transparent;color:var(--ink);border:1px solid var(--ink);white-space:nowrap;text-decoration:none;cursor:pointer;}
.loginprompt .ectbutton:hover,.cartloggedin .ectbutton:hover{background:var(--rubric);border-color:var(--rubric);color:var(--paper);}
/* Desktop: a touch larger and aligned to the right of the cart header (flex:1 fills the header row
   so justify-content can push the cluster to the right edge). Mobile keeps the compact left layout. */
@media(min-width:761px){
  .loginprompt,.cartloggedin{flex:1 1 auto;justify-content:flex-end;}
  .loginprompt .ectbutton,.cartloggedin .ectbutton{font-size:.72rem;padding:10px 18px;letter-spacing:.08em;}
}

/* ----- Cart stage: header, line items, totals, estimator, coupon ----- */
/* Cart header ("Shopping Cart (n)") */
.cartlisthead .ectdivhead,.cartlistshop .ectdivhead.cartlistcart{display:flex;align-items:center;gap:12px;padding:0 0 14px;border-bottom:1px solid var(--line);margin-bottom:4px;}
.cartlistcart .cartname{font-family:Fraunces,serif;font-weight:500;font-size:1.5rem;color:var(--ink);flex:1;}
/* Collapse toggle: ECT emits an arrow-up/down.png that its JS swaps on click. Hide the PNG and
   draw a modern chevron (mask) that flips via :has() on the swapped src — no markup change. */
.cartlistcart .cartlistimg,.cartlistgiftreg .cartlistimg{margin-left:auto;position:relative;flex:0 0 auto;width:18px;height:18px;color:var(--muted);transition:color .15s;}
.cartlistimg img{display:none;}
.cartlistcart .cartlistimg::after,.cartlistgiftreg .cartlistimg::after{content:"";position:absolute;inset:0;background-color:currentColor;transition:transform .2s;-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E") center/contain no-repeat;mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E") center/contain no-repeat;}
.cartlistcart .cartlistimg:has(img[src*="arrow-up"])::after,.cartlistgiftreg .cartlistimg:has(img[src*="arrow-up"])::after{transform:rotate(180deg);}
.ectdivhead.cartlistname:hover .cartlistimg{color:var(--ink);}
.checkoutstep{display:inline-flex;align-items:center;justify-content:center;min-width:26px;height:26px;border-radius:50%;background:var(--ink);color:var(--paper);font:600 .8rem/1 Inter;margin-right:10px;}
/* Show only the numbered checkout-step badge; hide the cart header's blank bullet */
.checkoutstep:not(.checkoutstepof3){display:none;}

/* ----- Saved lists / gift-registry view (cart.php, signed in: "My Wish List", named lists) ----- */
/* Each list = a collapsible .cartlistgiftreg header above themed cart lines; the per-line action
   is a "Move to Cart" button (.cartaddtolist). Mirror the cart header; quieten the move button. */
.cartlistdiv.cartlistwish,.cartlistdiv.cartlistgift{margin-bottom:30px;}
.ectdivhead.cartlistgiftreg{display:flex;align-items:center;gap:12px;padding:0 0 14px;margin:16px 0 4px;border-bottom:1px solid var(--line);}
.cartlistgiftreg .cartname{font-family:Fraunces,serif;font-weight:500;font-size:1.35rem;color:var(--ink);flex:1;}
div.cartaddtolist{margin:0;display:inline-flex;}
.ectbutton.cartaddtolist{font:500 .66rem/1 Inter;letter-spacing:.06em;padding:8px 13px;min-height:0;border-radius:2px;background:transparent;color:var(--ink);border:1px solid var(--ink);white-space:nowrap;}
.ectbutton.cartaddtolist:hover{background:var(--rubric);border-color:var(--rubric);color:var(--paper);}

/* Hide the column-label header row; each line is self-describing */
.cartdetails_cntnr{display:none;}

/* Line items */
.cartlineitems{margin:0;}
.cartandoptsline{border-bottom:1px solid var(--line);}
.cartline{display:grid;grid-template-columns:84px 1fr auto;align-items:center;gap:18px;padding:20px 0;}
.cartlineid{margin:0;}
/* Quick-ship "ship now" dot in the top-right corner of the cart line image (added by cart.php JS) */
.cartlineid.has-shipdot{position:relative;}
.cartlineid .cart-shipdot{position:absolute;top:5px;right:5px;width:9px;height:9px;}
.cartlineid a{display:block;}
img.cartimage{width:84px;height:84px;object-fit:cover;border-radius:2px;background:var(--paper-2);}
.cartlinename a{font-family:Fraunces,serif;font-weight:500;font-size:1.05rem;line-height:1.25;color:var(--ink);}
.cartlinename a:hover{color:var(--rubric);}
.cartlineprice{margin-top:4px;color:var(--muted);font-size:.9rem;}
.cartlinepricelabel{display:none;}
.cartlinequanttotal{display:flex;align-items:center;gap:20px;}
.cartlinequant{order:1;margin:0;}
.cartlinetotal{order:2;font:600 1rem/1 Inter;color:var(--ink);min-width:72px;text-align:right;}
.cartlinecheck{order:3;margin:0;}
input.cartquant,input.ecttextinput.cartquant{width:54px;text-align:center;border:1px solid var(--line);border-radius:2px;padding:9px 4px;font:500 .95rem Inter;background:#fff;}
.cartdelete{cursor:pointer;display:inline-flex;}
img.cartdelete{width:15px;height:15px;opacity:.45;transition:opacity .15s;}
.cartdelete:hover img.cartdelete{opacity:1;}

/* Mobile: product name spans the top of the line; image, unit price, qty, line total
   and trash all sit on ONE row underneath. display:contents unwraps .cartlinenameprice
   so name and price become direct grid items. */
@media(max-width:600px){
  .cartline{grid-template-columns:64px auto 1fr;column-gap:10px;row-gap:8px;align-items:center;
    grid-template-areas:"name name name" "img price qty";}
  .cartlinenameprice{display:contents;}
  .cartlinename{grid-area:name;}
  .cartlineid{grid-area:img;}
  .cartlineprice{grid-area:price;margin-top:0;white-space:nowrap;}
  .cartlinequanttotal{grid-area:qty;justify-content:flex-end;gap:12px;}
  img.cartimage{width:64px;height:64px;}
  input.cartquant,input.ecttextinput.cartquant{width:46px;padding:8px 3px;}
  .cartlinetotal{min-width:0;}
}

/* Shipping estimator + totals, side by side */
/* Ship-time banner (relocated above the estimator by cart.php). Accent color comes from
   the Store Setting via the inline --mwc custom property; a small dot reuses the site's
   ready-to-ship visual language. No dismissible X. */
.mw-shiptime-msg{margin:8px 0 22px;}
#mw-mixedtee{margin:0 0 16px;}
.mw-cart-alert{display:flex;align-items:center;gap:10px;border:1px solid var(--mwc,#999);border-left-width:4px;background:#f7f6f2;background:color-mix(in srgb, var(--mwc,#999) 9%, #fff);color:var(--ink);padding:13px 16px;border-radius:3px;font-size:.92rem;line-height:1.5;}
.mw-cart-alert::before{content:"";flex:0 0 auto;width:9px;height:9px;border-radius:50%;background:var(--mwc,#999);}
.cartshippingandtotals{display:grid;grid-template-columns:1fr 340px;gap:44px;align-items:start;margin-top:30px;}
@media(max-width:760px){.cartshippingandtotals{grid-template-columns:1fr;gap:26px;}}
.cartshippingdetails .ectlabel{display:block;font:600 .68rem/1 Inter;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);margin-bottom:6px;}
.cartstateselector_cntnr,.cartcountryselector_cntnr{margin-bottom:12px;}
.cartshippingdetails select.ectselectinput{width:100%;border:1px solid var(--line);border-radius:2px;padding:11px 12px;background:#fff;font:400 .92rem Inter;}
.cartstateselectortext.ectwarning,.estimatorerror.ectwarning{color:var(--rubric);}
.updateestimator{margin-top:4px;}

/* Totals block */
.cartsubtotal_cntnr,.shippingtotal_cntnr,.cartgrandtotal_cntnr,.cartdiscounts_cntnr,.cartloyaltypoint_cntnr,.cartgiftcert_cntnr{display:flex;justify-content:space-between;align-items:baseline;gap:16px;padding:7px 0;}
.cartsubtotaltext,.shippingtotaltext,.cartdiscountstext,.cartloyaltypointmenu,.cartgiftcerttext{color:var(--muted);font-size:.92rem;}
.cartsubtotal,.shippingtotal{font:500 .95rem/1 Inter;color:var(--ink);}
/* Discount / loyalty / gift-cert deductions — savings shown in rubric with a leading minus */
.cartdiscounts,.cartloyaltypoints,.cartgiftcert{font:500 .95rem/1 Inter;color:var(--rubric);white-space:nowrap;}
.cartdiscounts::before,.cartloyaltypoints::before,.cartgiftcert::before{content:"\2212";margin-right:1px;}
.cartgrandtotal_cntnr{border-top:1px solid var(--line);margin-top:6px;padding-top:14px;}
.cartgrandtotaltext{font-family:Fraunces,serif;font-size:1.12rem;color:var(--ink);}
.cartgrandtotal{font:600 1.25rem/1 Inter;color:var(--ink);}

/* Coupon */
.cartcoupon_cntnr{margin-top:18px;padding-top:16px;border-top:1px solid var(--line);}
.cartcoupontext .ectlabel{display:block;font:600 .68rem/1 Inter;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);margin-bottom:6px;}
.cartcoupon{display:flex;gap:8px;}
.cartcoupon input.cpncart1{flex:1;min-width:0;border:1px solid var(--line);border-radius:2px;padding:11px 12px;background:#fff;font:400 .92rem Inter;}
.cartcoupon .applycoupon{white-space:nowrap;font-size:.72rem;padding:0 16px;}

/* Checkout button */
.cartcheckoutbuttons{margin-top:26px;display:flex;justify-content:flex-end;}
.checkoutopts{display:flex;justify-content:flex-end;}
/* ECT emits these as <button>, not <input>, so match by class (not input.*). */
.checkoutbutton,.checkoutbutton1{min-width:260px;font-size:.9rem;padding:16px 36px;}
@media(max-width:760px){
  /* Full-width checkout button (stretch the wrapping flex item AND the button itself)
     plus breathing room before the cross-sell block below. */
  .cartcheckoutbuttons{justify-content:stretch;margin-bottom:36px;}
  .cartcheckoutbuttons .checkoutopts{flex:1 1 100%;justify-content:stretch;}
  .checkoutbutton,.checkoutbutton1{width:100%;min-width:0;}
}

/* Cart-line options (e.g. "Size: Small", "Color: Solid Black") — compact, indented under the name.
   ECT prints a price + total column per option (a literal "-" when there's no upcharge); hide those,
   since any upcharge is already folded into the line total. */
.cartandoptsline .cartoptionsline{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 6px;padding-left:102px;font-size:.82rem;line-height:1.45;color:var(--muted);}
.cartandoptsline .cartoptionsline:first-of-type{margin-top:-8px;}
.cartandoptsline .cartoptionsline:last-of-type{padding-bottom:18px;}
.cartoptiongroup{font-weight:500;color:var(--muted);}
.cartoptiongroup::after{content:":";}
.cartoptiongroupspacer{display:none;}
/* Selected option values get a subtle "filled" chip so the eye lands on them at a scan. */
.cartoption{color:var(--ink);font-weight:500;background:var(--paper-2);border-radius:5px;padding:1.5px 8px;}
.cartoptionprice,.cartoptiontotal{display:none;}
.cartoptionsline.ectwarning .cartoption{color:var(--rubric);background:rgba(var(--rubric-rgb),.07);}
@media(max-width:760px){.cartandoptsline .cartoptionsline{padding-left:0;}}

/* Visual grouping: cart.php JS wraps a line's option rows in .cart-optsgroup so they read
   as one subtly-raised card. A lighter warm fill keeps the tan (--paper-2) chips legible.
   The option chip-lines float inline and wrap on every viewport (inline-flex hugs content
   on desktop; the mobile rule below only widens it to a full row). */
.cart-optsgroup{display:inline-flex;flex-wrap:wrap;align-items:baseline;gap:6px 14px;
  margin:2px 0 16px 102px;padding:8px 13px;
  background:rgba(255,255,255,.5);border:1px solid var(--line);border-radius:8px;}
.cart-optsgroup .cartoptionsline{padding:2px 0;margin:0;}
.cart-optsgroup .cartoptionsline:first-of-type{margin-top:0;}
.cart-optsgroup .cartoptionsline:last-of-type{padding-bottom:2px;}

/* Mobile: the (grid) cart line takes the full first row, then the options card sits on its
   own full-width row underneath (chips already float via the base rule above). */
@media(max-width:600px){
  .cartandoptsline{display:flex;flex-wrap:wrap;align-items:baseline;column-gap:14px;row-gap:10px;padding-bottom:16px;}
  .cartandoptsline .cartline{flex:0 0 100%;padding:20px 0 0;}
  .cart-optsgroup{flex:1 1 100%;margin:0;}
}

/* ===== Checkout steps (cart.php: address -> shipping -> payment -> review) =====
   ECT loads these on POST mode=checkout; they share a label-cell (.cobhl) + field-cell (.cobll)
   pattern across all steps, plus an order-summary "resume" that reuses the cart-line styles. */
/* Constrain the whole checkout (any step) to a clean, centered single column */
.pg-cart .col-md-9:has(.cart2details),.pg-cart .col-md-9:has(.cart3details){max-width:600px;margin-left:auto;margin-right:auto;}
.cart2details{margin:0 auto 32px;}
.cartresumecontents .cartdetails_cntnr{display:none;}

/* Section / sub-section headers */
.cart2subheader,.cobhl.cart2subheader{font-family:Fraunces,serif;font-weight:500;font-size:1.18rem;color:var(--ink);margin:28px 0 16px;padding-bottom:10px;border-bottom:1px solid var(--line);}
.cartlistcart .cartname i{font-size:.82em;margin-right:8px;color:var(--rubric);}

/* Form rows: stacked uppercase label + full-width field (covers bill/ship/additional/payment) */
.billformrow,.shipformrow,.checkoutadditionals,.cart3row,.cart4row{margin:0 0 15px;}
.cobhl{margin-bottom:6px;}
.cobhl label.ectlabel,.cobhl .ectlabel{font:600 .68rem/1.3 Inter;letter-spacing:.07em;text-transform:uppercase;color:var(--muted);}
.redstar{color:var(--rubric);}
.cobll .ecttextinput,.cobll .cdform2fixw,.cobll select,.cobll .ectselectinput,.cobll textarea,.cobll .form-control{width:100%;border:1px solid var(--line);border-radius:2px;padding:12px 14px;font:400 .95rem Inter;background:#fff;color:var(--ink);}
.cobll input:focus,.cobll select:focus,.cobll textarea:focus{outline:none;border-color:var(--ink);}
.cobll textarea,textarea.addinfo{min-height:92px;resize:vertical;}

/* Wide action buttons (Ship to different / Enter payment / Place order) */
input.widecheckout2,input.widecheckout3,.ectbutton.widecheckout2,.ectbutton.widecheckout3{width:100%;margin-top:10px;font-size:.86rem;padding:15px 28px;}
.ectbutton.shipdiff{background:transparent;color:var(--ink);border-color:var(--ink);}
.ectbutton.shipdiff:hover{background:var(--ink);color:var(--paper);}

/* Shipping-method options */
.shipoptionstable,.shipoptionstable2{margin:4px 0;}
.shiprateline,.shipline,.shiptableline,.shiptableline2{margin:0 0 8px;}
label.ectlabel.shipradio{display:flex;align-items:center;gap:10px;border:1px solid var(--line);border-radius:2px;padding:12px 14px;cursor:pointer;font:400 .92rem/1.3 Inter;letter-spacing:0;text-transform:none;color:var(--ink);transition:border-color .15s;}
label.ectlabel.shipradio:hover{border-color:var(--ink);}
input.ectradio.shipradio{accent-color:var(--rubric);margin:0;flex:0 0 auto;}
.shipratemethod{flex:1;}
.shipratemethod.shipratemethodselected{font-weight:600;}
.cart3servicecommitment{font-size:.8rem;color:var(--muted);margin:3px 0 0 34px;}
.shiplogo img,.shiplogo2 img,.cart3shippingt img[alt="Logo"]{max-height:26px;width:auto;}
/* Pickup option (an ECT "ship flag" checkbox, rendered below the method radios) — box it to
   match the shipping radios above so the whole shipping choice reads as one tidy stack. The
   :has() scope keeps OTHER ship flags (insurance, T&Cs, etc.) on their plain rows. */
.coshipflagscontainer{margin-top:0;}
.billformrowflags:has(.cdformwillpickup){display:flex;align-items:center;gap:10px;border:1px solid var(--line);border-radius:2px;padding:12px 14px;margin:0 0 8px;transition:border-color .15s;}
.billformrowflags:has(.cdformwillpickup):hover{border-color:var(--ink);}
.billformrowflags:has(.cdformwillpickup) .cdshipftflag{margin:0;flex:0 0 auto;display:flex;align-items:center;}
.billformrowflags:has(.cdformwillpickup) .ectcheckbox{width:16px;height:16px;margin:0;accent-color:var(--rubric);cursor:pointer;}
.billformrowflags:has(.cdformwillpickup) .cdshipflag{flex:1;margin:0;font:400 .92rem/1.3 Inter;color:var(--ink);}
.billformrowflags:has(.cdformwillpickup) .cdshipflag label{cursor:pointer;}
.tofreeshipping{background:var(--paper-2);border-radius:2px;padding:10px 14px;font-size:.86rem;color:var(--ink);margin:10px 0;}
.cart3shiphead{font:600 .68rem/1 Inter;letter-spacing:.07em;text-transform:uppercase;color:var(--muted);margin-left:8px;}

/* City / State / Zip grouped onto one row (wrapper built in cart.php JS) */
.addr-3col{display:grid;grid-template-columns:1.6fr 1.2fr 1fr;gap:0 12px;}
.addr-3col>*{margin-bottom:0;}
@media(max-width:560px){.addr-3col{grid-template-columns:1fr;gap:0;}.addr-3col>*{margin-bottom:15px;}}

/* ----- Checkout: payment method as button-cards + compact coupon ----- */
/* Compact, single-line coupon (label hidden; placeholder describes it) */
.cdformtcoupon{display:none;}
.cobll.cdformcoupon{max-width:380px;}
.cobll.cdformcoupon>div:first-child{display:flex;gap:8px;}
.cobll.cdformcoupon input.cdformcoupon{flex:1;min-width:0;}
.cobll.cdformcoupon .applycoupon{flex:0 0 auto;white-space:nowrap;font-size:.72rem;padding:0 18px;}
#cpncodespan:empty{display:none;}

/* Payment method: two selectable button-cards with brand icons */
.cdformpayment .payprovider{display:flex;flex-wrap:wrap;gap:12px;}
.payprovider label.cdformradio{flex:1 1 220px;display:flex;align-items:center;gap:10px;margin:0;border:1px solid var(--line);border-radius:3px;padding:14px 16px;cursor:pointer;font:500 .92rem/1.2 Inter;letter-spacing:0;text-transform:none;color:var(--ink);transition:border-color .15s,background .15s;}
.payprovider label.cdformradio:hover{border-color:var(--ink);}
.payprovider input.cdformradio{accent-color:var(--rubric);margin:0;flex:0 0 auto;}
.payprovider label.cdformradio:has(input:checked){border-color:var(--ink);background:var(--paper-2);}
.payprovider .payicons{margin-left:auto;display:inline-flex;align-items:center;gap:7px;}
.payicon{display:inline-block;width:32px;height:22px;background-color:var(--muted);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-position:center;mask-position:center;-webkit-mask-size:contain;mask-size:contain;}
.pi-visa{-webkit-mask-image:url(../images/pay/visa.svg);mask-image:url(../images/pay/visa.svg);}
.pi-mastercard{-webkit-mask-image:url(../images/pay/mastercard.svg);mask-image:url(../images/pay/mastercard.svg);}
.pi-amex{-webkit-mask-image:url(../images/pay/amex.svg);mask-image:url(../images/pay/amex.svg);}
.pi-discover{-webkit-mask-image:url(../images/pay/discover.svg);mask-image:url(../images/pay/discover.svg);}
.pi-paypal{-webkit-mask-image:url(../images/pay/paypal.svg);mask-image:url(../images/pay/paypal.svg);}
.pi-applepay{-webkit-mask-image:url(../images/pay/applepay.svg);mask-image:url(../images/pay/applepay.svg);}
.pi-googlepay{-webkit-mask-image:url(../images/pay/googlepay.svg);mask-image:url(../images/pay/googlepay.svg);}
/* Apple Pay / Google Pay marks read smaller than the card logos — bump their size */
.pi-applepay,.pi-googlepay{width:52px;height:32px;}
@media(max-width:560px){.payprovider label.cdformradio{flex:1 1 100%;}}

/* ===== Checkout step 3 (Payment Details): order review + card form ===== */
/* Contact / billing / shipping review summary */
.custdetsresumehead{font:600 .68rem/1.2 Inter;letter-spacing:.07em;text-transform:uppercase;color:var(--muted);margin:16px 0 3px;}
.custdetsresumehead:first-child{margin-top:0;}
.custdetsresumeline{font-size:.95rem;color:var(--ink);line-height:1.5;}
input.ectbutton[value="Change"]{background:transparent;color:var(--ink);border-color:var(--ink);font-size:.72rem;padding:9px 18px;margin-top:14px;}
input.ectbutton[value="Change"]:hover{background:var(--ink);color:var(--paper);}

/* Order totals: label left / value right (leave the shipping-selector row full width) */
.cart3row:not(.cart3shipselrow){display:flex;justify-content:space-between;align-items:baseline;gap:16px;margin:0;padding:6px 0;}
.cart3row:not(.cart3shipselrow) .cobhl3{margin:0;color:var(--muted);font:400 .92rem/1.4 Inter;text-transform:none;letter-spacing:0;}
.cart3row:not(.cart3shipselrow) .cobll3{text-align:right;font:500 .95rem/1.4 Inter;color:var(--ink);}
.cart3gndtotcntnr{border-top:1px solid var(--line);margin-top:8px !important;padding-top:14px !important;}
.cart3gndtotcntnr .cobhl3{font-family:Fraunces,serif !important;font-size:1.1rem !important;color:var(--ink) !important;}
.cart3gndtotcntnr .cobll3{font:600 1.22rem/1 Inter !important;}

/* "Credit Card Details" / "ECheck Details" sub-headers */
.cobhl.cart4header{font-family:Fraunces,serif;font-weight:500;font-size:1.18rem;color:var(--ink);margin:26px 0 14px;padding-bottom:10px;border-bottom:1px solid var(--line);}
/* "this site may not be secure" notice */
.cobhl.cart2column.ectwarning{color:var(--rubric);font-size:.85rem;margin-bottom:10px;}

/* Credit-card fields */
.cart4row{margin:0 0 15px;}
.cobll4 .cdform3fixw{width:100%;border:1px solid var(--line);border-radius:2px;padding:12px 14px;font:400 .95rem Inter;background:#fff;color:var(--ink);min-height:46px;}
.cobll4 .cdform3fixw:focus{outline:none;border-color:var(--ink);}
.cobll4 input.ecttextinput.nofixw{border:1px solid var(--line);border-radius:2px;padding:12px 14px;font:400 .95rem Inter;background:#fff;}
/* Expires Month / Year inline + compact instead of two full-width selects */
.cobll4 select,.cobll4 .ectselectinput{width:auto;min-width:104px;display:inline-block;}
/* Expires (Month/Year) and the security code share one row (wrapper built in cart.php JS) */
.cc-exp-cvv{display:flex;gap:18px;align-items:flex-start;flex-wrap:wrap;}
.cc-exp-cvv .cart4row{margin:0 0 15px;}
.cc-exp-cvv .cart4row:first-child{flex:1 1 auto;}
.cc-exp-cvv .cart4row:last-child{flex:0 0 auto;}

/* Logged-in saved-address selector (Billing / Shipping address book on checkout) */
.cartcheckoutsavedaddr{margin-bottom:22px;}
.cdformtitle{font:600 .68rem/1.2 Inter !important;letter-spacing:.07em;text-transform:uppercase;color:var(--muted);margin:0 0 6px;padding:0;border:0;background:none;}
.cartcheckoutsavedaddr select.ectselectinput{display:block;width:100%;max-width:430px;border:1px solid var(--line);border-radius:2px;padding:12px 14px;font:400 .95rem Inter;background:#fff;color:var(--ink);}
.cartcheckoutsavedaddr select.ectselectinput:focus{outline:none;border-color:var(--ink);}
.editaddressbuttons{display:flex;gap:8px;margin-top:8px;}
.editaddressbuttons .ectbutton{background:transparent;color:var(--ink);border-color:var(--line);font-size:.72rem;padding:9px 18px;}
.editaddressbuttons .ectbutton:hover{background:var(--ink);color:var(--paper);border-color:var(--ink);}

/* Address-edit "Cancel" button -> small secondary (was caught by the field styling as a full-width white box) */
.nohidebillrow .cdformtextra2{display:none;}
.cobll.cdformextra2{margin-top:4px;}
.cobll.cdformextra2 .ectbutton{width:auto;background:transparent;color:var(--ink);border:1px solid var(--line);border-radius:2px;font:600 .72rem/1 Inter;letter-spacing:.08em;text-transform:uppercase;padding:11px 22px;min-height:0;}
.cobll.cdformextra2 .ectbutton:hover{background:var(--ink);color:var(--paper);border-color:var(--ink);}

/* ===== Account page (clientlogin.php — body.pg-account) =====
   ECT emits a logged-out stub (trigger buttons + a "must be logged in" card; the login
   itself is a styled .ectopaque modal) and, when signed in, a #clientlogindiv with collapsible
   sections (Account Details / Address Mgmt / Order History), each a label/value list built from
   .ectdivcontainer > .ectdivleft + .ectdivright. The modal is styled globally above; everything
   here is the inline page chrome, scoped to .pg-account so it can't leak into cart/checkout. */
/* Target the container divs only (.ectdiv.ectclientlogin) — ECT also reuses the bare
   .ectclientlogin class on inline "click here" buttons, which must NOT get card styling. */
.pg-account .ectdiv.ectclientlogin{max-width:760px;margin:0 auto;}

/* --- Logged-out stub: trigger buttons + prompt card (the logged-in dashboard shares
   .ectdiv.ectclientlogin but carries id="clientlogindiv", so exclude it from the card styling) --- */
.pg-account .clientloginbuttons{display:flex;flex-wrap:wrap;gap:12px;justify-content:center;margin:0 0 26px;}
.pg-account .ectdiv.ectclientlogin:not(#clientlogindiv){border:1px solid var(--line);border-radius:3px;background:var(--paper-2);text-align:center;padding:0 0 30px;overflow:hidden;}
.pg-account .ectdiv.ectclientlogin:not(#clientlogindiv) .ectdivhead{font-family:Fraunces,serif;font-weight:500;font-size:1.25rem;color:var(--ink);background:transparent;border:0;padding:24px 24px 0;cursor:default;}
.pg-account .clientloginmessage{color:var(--muted);padding:14px 24px 6px;line-height:1.6;}
/* Inline "click here" action buttons (in ectdiv2column) -> clean rubric text-links */
.pg-account .ectdiv2column .ectbutton.ectclientlogin{background:transparent;border:0;border-radius:0;color:var(--rubric);padding:0;font:inherit;letter-spacing:0;text-transform:none;text-decoration:underline;text-underline-offset:2px;vertical-align:baseline;}
.pg-account .ectdiv2column .ectbutton.ectclientlogin:hover{background:transparent;color:var(--rubric-dark);}

/* --- Forgot / reset password cards (clientlogin.php?mode=lostpassword, the "email sent"
   confirmation, and the email-link "set a new password" form). ECT renders these through the
   same 200px/1fr profile grid with oversized <h4> copy and a divider under every row, so a
   single-field form reads as a broken data-table. Collapse to a calm centred single column that
   matches the login modal. All scoped to :not(#clientlogindiv) so the signed-in profile grid
   (which legitimately needs the two-column layout) is left alone. --- */
.pg-account .ectdiv.ectclientlogin:not(#clientlogindiv) .ectdivcontainer{display:block;border-bottom:0;padding:7px 24px;text-align:center;}
.pg-account .ectdiv.ectclientlogin:not(#clientlogindiv) .ectdivleft,
.pg-account .ectdiv.ectclientlogin:not(#clientlogindiv) .ectdivright{padding:0;color:var(--ink);}
/* Empty / spacer label cells ECT emits beside the captcha & submit rows -> no blank gaps */
.pg-account .ectdiv.ectclientlogin:not(#clientlogindiv) .ectdivleft:empty{display:none;}
.pg-account .ectdiv.ectclientlogin:not(#clientlogindiv) .ectdivcontainer:has(.g-recaptcha) .ectdivleft{display:none;}
/* Row 1 = "Forgot Password?" lead-in (sub-heading) + instruction / result text (muted body) */
.pg-account .ectdiv.ectclientlogin:not(#clientlogindiv) .ectdivleft h4{font-family:Fraunces,serif;font-weight:500;font-size:1.05rem;color:var(--ink);margin:8px 0 2px;}
.pg-account .ectdiv.ectclientlogin:not(#clientlogindiv) .ectdivright h4{font:400 .95rem/1.6 Inter;color:var(--muted);max-width:420px;margin:0 auto 8px;}
/* Field labels sit above their input */
.pg-account .ectdiv.ectclientlogin:not(#clientlogindiv) .ectlabel{display:block;font:500 .8rem/1.5 Inter;color:var(--ink);margin-bottom:6px;}
/* Centre the email / password fields and the captcha widget */
.pg-account .ectdiv.ectclientlogin:not(#clientlogindiv) .g-recaptcha{display:inline-block;}
/* Button rows: single .ectdivright submit, or a .ectdiv2column submit + cancel pair */
.pg-account .ectdiv.ectclientlogin:not(#clientlogindiv) .ectdiv2column{display:flex;flex-wrap:wrap;gap:10px;justify-content:center;padding:8px 24px 4px;}
/* Secondary actions (Cancel / Go Back) as quiet ink outlines; Login / Submit keep the rubric fill */
.pg-account .ectdiv.ectclientlogin:not(#clientlogindiv) .ectbutton.cancel,
.pg-account .ectdiv.ectclientlogin:not(#clientlogindiv) .ectbutton.goback{background:transparent;color:var(--ink);border-color:var(--ink);}
.pg-account .ectdiv.ectclientlogin:not(#clientlogindiv) .ectbutton.cancel:hover,
.pg-account .ectdiv.ectclientlogin:not(#clientlogindiv) .ectbutton.goback:hover{background:var(--ink);color:var(--paper);}
/* Logout "you've been signed out" message reuses the same card */
.pg-account .ectdiv.ectclientlogin:not(#clientlogindiv) .ectmessagescreen{padding:14px 24px 4px;color:var(--muted);line-height:1.7;}

/* --- Logged-in dashboard --- */
/* Collapsible section headers (Account Details / Addresses / Orders) */
.pg-account .ectdivhead.clientloginmainheader{font-family:Fraunces,serif;font-weight:500;font-size:1.18rem;color:var(--ink);background:var(--paper-2);border:1px solid var(--line);border-radius:3px;padding:16px 20px;margin:14px 0 0;cursor:pointer;user-select:none;transition:background .15s;}
.pg-account .ectdivhead.clientloginmainheader:hover{background:#e4ddcd;}
.pg-account .ectdivhead.clientloginmainheader img{margin-top:6px;width:13px;height:auto;opacity:.45;}
.pg-account .ectdivhead.clientloginmainheader i{color:var(--rubric);margin-right:9px;font-size:.95em;}
/* Section bodies */
.pg-account .adformrow,.pg-account .amformrow,.pg-account .grformrow,.pg-account .omformrow{border:1px solid var(--line);border-top:0;border-radius:0 0 3px 3px;padding:8px 20px 22px;margin-bottom:4px;}

/* Label / value rows (shared by account details, address list, edit forms) */
.pg-account .ectdivcontainer{display:grid;grid-template-columns:200px 1fr;gap:8px 22px;align-items:start;padding:12px 0;border-bottom:1px solid var(--line);}
.pg-account .ectdivcontainer:last-of-type{border-bottom:0;}
/* Left cell holds short labels (Full Name, Email) but ECT also drops a full consent
   sentence here, so keep it readable rather than tiny-uppercase. */
.pg-account .ectdivleft{font:500 .9rem/1.5 Inter;color:var(--ink);padding-top:9px;}
.pg-account .ectdivleft div{font-weight:400;color:var(--muted);}
.pg-account .ectdivright{color:var(--ink);line-height:1.6;}

/* Email-subscription consent row: ECT drops the whole opt-in question into the label
   column with a lone checkbox in the value column. Re-flow it as one compact "checkbox +
   question" line. Handles both the read-only view (checkbox in .ectdivright) and the edit
   form (checkbox in .ectdivleft); these are the only checkbox rows in the account section. */
.pg-account .ectdivcontainer:has(input[type=checkbox]){display:flex;align-items:flex-start;gap:12px;}
.pg-account .ectdivcontainer:has(input[type=checkbox])>div{padding-top:0;}
.pg-account .ectdivcontainer:has(input[type=checkbox]) .ectcheckbox{flex:0 0 auto;order:0;margin-top:2px;width:16px;height:16px;accent-color:var(--rubric);}
/* the text cell (whichever side it's on) becomes secondary, full-width body copy */
.pg-account .ectdivcontainer:has(.ectdivright input[type=checkbox]) .ectdivright{order:0;flex:0 0 auto;}
.pg-account .ectdivcontainer:has(.ectdivright input[type=checkbox]) .ectdivleft{order:1;}
.pg-account .ectdivcontainer:has(input[type=checkbox]) .ectdivleft,
.pg-account .ectdivcontainer:has(input[type=checkbox]) .ectdivright:not(:has(input)){flex:1;font:400 .85rem/1.5 Inter;color:var(--muted);}
.pg-account .ectdivcontainer:has(input[type=checkbox]) .ectdivleft div,
.pg-account .ectdivcontainer:has(input[type=checkbox]) .ectdivright div{font-size:.92em;}
/* Inline section sub-head inside a body (e.g. "Change Password") */
.pg-account .adformrow .ectdivhead,.pg-account .amformrow .ectdivhead{font-family:Fraunces,serif;font-weight:500;font-size:1.05rem;color:var(--ink);background:transparent;border:0;padding:18px 0 4px;margin:6px 0 0;border-top:1px solid var(--line);cursor:default;}
/* Full-width action row */
.pg-account .ectdiv2column{padding:16px 0 4px;color:var(--muted);font-size:.92rem;}
.pg-account .ectdiv2column .ectbutton{margin-left:6px;}

/* Account-edit + address-edit form fields */
.pg-account .ectdivright input[type=text],.pg-account .ectdivright input[type=email],.pg-account .ectdivright input[type=password],.pg-account .ectdivright select,.pg-account .ectdivright textarea,.pg-account input.ectinputhalf,.pg-account input.ecttextinput,.pg-account select.ectselectinput{border:1px solid var(--line);border-radius:2px;padding:11px 13px;font:400 .95rem Inter;background:#fff;color:var(--ink);max-width:340px;width:100%;}
.pg-account input.ectinputhalf{width:calc(50% - 5px);max-width:none;}
.pg-account .ectdivright input:focus,.pg-account .ectdivright select:focus,.pg-account input.ectinputhalf:focus,.pg-account input.ecttextinput:focus{outline:none;border-color:var(--ink);}

/* Address cards: value block left, edit/delete buttons right */
/* Address row: value + edit/delete buttons. Flex-wrap (not grid) so a narrow column drops
   the buttons below the address instead of crushing the text to one word per line. */
.pg-account .ectclientloginaddress .ectdivcontainer{display:flex;flex-wrap:wrap;align-items:flex-start;justify-content:space-between;gap:14px 20px;}
.pg-account .ectclientloginaddress .ectdivleft{flex:1 1 200px;min-width:180px;}
.pg-account .ectclientloginaddress .ectdivright{flex:0 0 auto;}
.pg-account .ectcladdressbutton{display:inline-block;margin:0 0 6px 8px;}

/* Gift registry / wish lists (List Management section). Each list: name+count heading,
   a shareable public-access URL, and Copy/View/Delete actions; then a Create-New-List row. */
.pg-account .ectclientlogingiftreg{display:flex;flex-direction:column;}
.pg-account .ectgiftregname{font-family:Fraunces,serif;font-weight:500;font-size:1.05rem;color:var(--ink);padding:18px 0 6px;border-top:1px solid var(--line);margin-top:6px;}
.pg-account .ectclientlogingiftreg > .ectgiftregname:first-child{border-top:0;margin-top:0;}
.pg-account .ectclientlogingiftreg .ectdiv2column{display:flex;flex-wrap:wrap;align-items:center;gap:8px 12px;padding:4px 0 10px;}
.pg-account .ectpublicaccesstext{font:500 .72rem/1 Inter;letter-spacing:.1em;text-transform:uppercase;color:var(--muted);flex:0 0 auto;}
.pg-account .ectpublicaccessinput{flex:1 1 280px;}
.pg-account input.giftregistrycopy{width:100%;border:1px solid var(--line);border-radius:2px;padding:9px 11px;font:400 .82rem Inter;background:#fff;color:var(--muted);}
.pg-account .ectgiftregistrybuttons{display:flex;flex-wrap:wrap;align-items:center;gap:10px;padding:2px 0 16px;}
.pg-account .ectgiftregistrybuttons > div{margin:0;}
.pg-account .ectgiftregistrybuttons .ectbutton{font-size:.72rem;padding:11px 18px;}
/* Copy / View = quiet outline; Create New List + Delete keep the rubric fill. */
.pg-account .ectgiftregcopy .ectbutton,.pg-account .ectgiftregview .ectbutton{background:transparent;color:var(--ink);border-color:var(--ink);}
.pg-account .ectgiftregcopy .ectbutton:hover,.pg-account .ectgiftregview .ectbutton:hover{background:var(--ink);color:var(--paper);border-color:var(--ink);}
.pg-account input.createlistinput{flex:1 1 220px;max-width:300px;border:1px solid var(--line);border-radius:2px;padding:11px 13px;font:400 .95rem Inter;background:#fff;color:var(--ink);}
.pg-account .ectclientlogingiftreg .nosearchresults{color:var(--muted);padding:14px 0;font-style:italic;}
.pg-account .ectcladdressbutton .ectbutton{display:inline-flex;align-items:center;gap:7px;background:transparent;color:var(--ink);border-color:var(--line);padding:9px 16px;font-size:.7rem;}
.pg-account .ectcladdressbutton .ectbutton:hover{background:var(--ink);color:var(--paper);border-color:var(--ink);}
/* Pencil / trash glyphs before the Edit / Delete address buttons (CSS-mask, tinted by currentColor) */
.pg-account .ectcladdressbutton .ectbutton::before{content:"";width:13px;height:13px;flex:0 0 auto;background-color:currentColor;-webkit-mask-size:contain;mask-size:contain;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-position:center;mask-position:center;}
.pg-account .ectcladdressbutton .editaddress::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 20h9'/%3E%3Cpath d='M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 20h9'/%3E%3Cpath d='M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4z'/%3E%3C/svg%3E");}
.pg-account .ectcladdressbutton .deleteaddress::before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 6h18M8 6V4h8v2M19 6l-1 14H6L5 6'/%3E%3Cpath d='M10 11v6M14 11v6'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 6h18M8 6V4h8v2M19 6l-1 14H6L5 6'/%3E%3Cpath d='M10 11v6M14 11v6'/%3E%3C/svg%3E");}
.pg-account .nosearchresults{color:var(--muted);padding:16px 0;}

/* Order history: controls bar */
.pg-account .ordhistorycontrols form{display:flex;flex-wrap:wrap;align-items:center;gap:10px;padding:6px 0 16px;border-bottom:1px solid var(--line);}
.pg-account .ectclordcount{font-weight:600;color:var(--ink);}
.pg-account .ordhistorycontrols select.ectselectinput{width:auto;min-width:130px;}
.pg-account .ectclordsearchtxt{flex:1;min-width:140px;max-width:240px;}
/* Order cards */
.pg-account .ectclientlogorder{border:1px solid var(--line);border-radius:3px;padding:16px 18px;margin:16px 0;}
.pg-account .ectclordrow1{display:flex;flex-wrap:wrap;justify-content:space-between;gap:8px 24px;padding-bottom:10px;border-bottom:1px solid var(--line);}
.pg-account .ectclordrow2{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px;padding:10px 0;}
.pg-account .ectclordlabel{font:600 .72rem/1.4 Inter;letter-spacing:.04em;text-transform:uppercase;color:var(--muted);margin-right:4px;}
.pg-account .ectclordarticle{color:var(--ink);}
/* Track button: compact secondary button with a tracking-pin glyph (was a heavy solid block) */
.pg-account .ectclordrow1 .ectbutton{display:inline-flex;align-items:center;gap:7px;margin-top:8px;background:transparent;color:var(--ink);border-color:var(--line);padding:8px 16px;font-size:.66rem;}
.pg-account .ectclordrow1 .ectbutton:hover{background:var(--ink);color:var(--paper);border-color:var(--ink);}
.pg-account .ectclordrow1 .ectbutton[disabled]{opacity:.5;cursor:default;}
.pg-account .ectclordrow1 .ectbutton::before{content:"";width:13px;height:13px;flex:0 0 auto;background-color:currentColor;-webkit-mask-size:contain;mask-size:contain;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-position:center;mask-position:center;-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 10c0 6-8 12-8 12s-8-6-8-12a8 8 0 0 1 16 0z'/%3E%3Ccircle cx='12' cy='10' r='2.6'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 10c0 6-8 12-8 12s-8-6-8-12a8 8 0 0 1 16 0z'/%3E%3Ccircle cx='12' cy='10' r='2.6'/%3E%3C/svg%3E");}
.pg-account .orderhistorydetails .ectbutton{background:transparent;color:var(--ink);border-color:var(--ink);padding:9px 18px;font-size:.7rem;}
.pg-account .orderhistorydetails .ectbutton:hover{background:var(--ink);color:var(--paper);}
/* Per-product rows within an order: image | id+name (roomy) | action button group.
   Flex (not grid) so the name keeps a usable min-width and the buttons wrap below when tight.
   The id/name and actions cells are unclassed divs, so they're targeted via :has(). */
.pg-account .ectclordrow3{display:flex;flex-wrap:wrap;align-items:center;gap:12px 18px;padding:14px 0;border-top:1px solid var(--line);}
.pg-account .ectclprodimg{flex:0 0 auto;}
.pg-account .ectclprodimg img{width:64px;height:64px;object-fit:cover;border-radius:2px;background:var(--paper-2);}
.pg-account .ectclordrow3 > div:has(.ectclordprodname){flex:1 1 220px;min-width:170px;}
.pg-account .ectclordprodid{font:600 .68rem/1.4 Inter;letter-spacing:.04em;text-transform:uppercase;color:var(--muted);}
.pg-account .ectclordprodname{font-family:Fraunces,serif;font-weight:500;font-size:1rem;line-height:1.3;color:var(--ink);margin-top:2px;}
/* Action group: View Product / Quick Buy / Review Product as one tidy, even row of secondary
   buttons. display:contents on the quickbuy <form> lifts its button into the same flex group. */
.pg-account .ectclordrow3 > div:has(.ectclordviewprod){flex:0 0 auto;margin-left:auto;display:flex;flex-wrap:wrap;gap:8px;justify-content:flex-end;align-items:center;}
.pg-account .ectclordrow3 > div:has(.ectclordviewprod) form{display:contents;}
.pg-account .ectclordviewprod,.pg-account .ectclordqbuybutton,.pg-account .ectclordreview{margin:0;}
.pg-account .ectclordrow3 .ectbutton{margin:0;padding:9px 14px;font-size:.66rem;background:transparent;color:var(--ink);border-color:var(--line);white-space:nowrap;}
.pg-account .ectclordrow3 .ectbutton:hover{background:var(--ink);color:var(--paper);border-color:var(--ink);}
/* Hide secondary/redundant buttons the quickbuy may still emit (duplicate details link, stock notices) */
.pg-account .ectclordrow3 .ectbutton.detaillink,.pg-account .ectclordrow3 .prodoutofstock,.pg-account .ectclordrow3 .prodnotifystock,.pg-account .ectclordrow3 .outofstock{display:none;}

/* Order-detail popup (vieworder AJAX) reuses the modal shell */
#vieworderdiv .opaqueinner{position:relative;background:var(--paper);max-width:680px;width:100%;padding:34px;border-radius:3px;box-shadow:0 30px 70px rgba(23,20,14,.35);}

/* ===== Order receipt (do_order_success → receipt* classes) =====
   Shared markup: the "Details" order popup (#vieworderdiv), the thanks page, the order-status
   page, and confirmation pages all render this. Styled globally so it themes wherever it appears
   on-site (emails ship their own inline styles and don't load this sheet). */
.receiptbody{color:var(--ink);}
/* Prominent order id (left) + email (right) row at the top of the receipt */
.receipttopmeta{display:flex;justify-content:space-between;align-items:flex-end;flex-wrap:wrap;gap:12px 24px;margin:2px 0 26px;padding-bottom:18px;border-bottom:1px solid var(--line);}
.rmetaemail{text-align:right;}
.receiptmetaval{font-family:Fraunces,serif;font-weight:500;font-size:1.3rem;line-height:1;color:var(--ink);}
.receiptextra:empty{display:none;}
/* Billing + shipping addresses, side by side */
.receiptaddresses{display:grid;grid-template-columns:1fr 1fr;gap:30px 44px;margin:6px 0 30px;}
.receiptsectionhead{font-family:Fraunces,serif;font-weight:500;font-size:1.05rem;color:var(--ink);margin:0 0 13px;padding-bottom:9px;border-bottom:1px solid var(--line);}
/* Stacked fields: a small uppercase label above its value (addresses + order meta:
   order id, email, ship method…). Sleeker than a label/value grid and never wraps
   the address into a too-narrow column. */
.receiptcontainer{display:block;padding:0;margin:0 0 13px;font-size:.92rem;line-height:1.5;}
.receiptcontainer:last-child{margin-bottom:0;}
.receiptleft{display:block;font:600 .6rem/1.3 Inter;letter-spacing:.09em;text-transform:uppercase;color:var(--muted);margin:0 0 1px;}
.receiptright{display:block;color:var(--ink);}
/* Line-item list: 5-col grid (id/image · name · unit price · qty · line total) */
.receiptlist{margin:6px 0 4px;}
.receiptheadrow,.receiptitemrow{display:grid;grid-template-columns:84px minmax(0,1fr) 82px 66px 84px;gap:16px;align-items:center;padding:12px 0;border-bottom:1px solid var(--line);}
.receiptheadrow{font:600 .64rem/1.3 Inter;letter-spacing:.035em;text-transform:uppercase;color:var(--muted);white-space:nowrap;}
.receiptprodid{font-size:.6rem;color:var(--muted);word-break:break-word;line-height:1.3;}
.receiptprodname{font-family:Fraunces,serif;font-weight:500;font-size:.98rem;line-height:1.3;color:var(--ink);}
/* Every header cell reuses a data-cell class (.receiptprodid .78rem, .receiptunitprice
   etc. .9rem) — force them all to the header font so the labels are one size. */
.receiptheadrow > div{font:inherit;}
.receiptunitprice,.receipttotal{text-align:right;font-size:.9rem;white-space:nowrap;}
.receiptquantity{text-align:center;font-size:.9rem;}
.thankspageimg img{width:56px;height:56px;object-fit:cover;border-radius:4px;background:var(--paper-2);border:1px solid var(--line);margin-bottom:6px;}
.giftwrap{font-size:.78rem;color:var(--muted);margin-top:2px;}
/* Option sub-rows: indented under the name column, muted; the dash-filled price cells are hidden */
/* Options as a tidy sub-list indented under the product name: "Size - Small".
   The price cells are hidden; a divider closes the last option of each item. */
.receiptoptionrow{display:block;padding:0 0 12px 100px;font-size:.82rem;color:var(--muted);line-height:1.55;border-bottom:1px solid var(--line);}
.receiptoptionrow:has(+ .receiptoptionrow){border-bottom:0;padding-bottom:2px;}
.receiptoptgroup{display:inline;font-weight:600;color:var(--muted);text-align:left;}
.receiptoptname{display:inline;color:var(--ink);}
.receiptoptunitprice,.receiptoptquantity,.receiptopttotal{display:none;}
.receiptitemrow:has(+ .receiptoptionrow){border-bottom:0;}
/* Package / tracking sub-rows */
.receiptpackagerow{display:flex;gap:12px;font-size:.84rem;color:var(--muted);padding:2px 0;}
/* Totals: compact right-aligned stack */
.receipttotalstable{max-width:320px;margin:20px 0 4px auto;}
.receipttotalsrow{display:flex;justify-content:space-between;align-items:baseline;gap:18px;padding:5px 0;font-size:.92rem;}
.receipttotalsrow .ectleft{color:var(--muted);}
.receipttotalsrow .ectright{color:var(--ink);font-weight:500;white-space:nowrap;}
.rectotgrandtotal{border-top:2px solid var(--ink);margin-top:10px;padding-top:15px;}
.rectotgrandtotal .ectleft{font-family:Fraunces,serif;font-size:1.18rem;color:var(--ink);}
.rectotgrandtotal .ectright{font:600 1.5rem/1 Inter;color:var(--ink);}
/* Digital-download section + footer buttons (Back / Print) */
.receiptdownload{margin-top:2px;margin-bottom:6px;}
.receiptdownloadhead{margin-top:0;}
.recptthanks{margin-top:26px;display:flex;gap:10px;flex-wrap:wrap;}
.receiptbuttons .receiptcontinueshopping,.receiptbuttons .receiptprintversion{margin:0;}
.recptthanks .ectbutton,.receiptprintversion .ectbutton,.receiptdownload .ectbutton{background:transparent;color:var(--ink);border-color:var(--ink);padding:11px 22px;font-size:.72rem;}
.recptthanks .ectbutton:hover,.receiptprintversion .ectbutton:hover,.receiptdownload .ectbutton:hover{background:var(--ink);color:var(--paper);}
/* ----- Order-confirmation polish (thanks.php) -------------------------------
   Receipt body (#printcontent, fed by the emailmessages.receiptheaders template)
   rendered as a centered card; the digital-download block gridded; core's inline
   red download link re-themed; footer buttons laid out. Scoped to .pg-content so
   the in-modal "Details" receipt (pg-account) is untouched. */
.pg-content #printcontent{max-width:680px;margin:0 auto;background:#fff;border:1px solid var(--line);border-radius:8px;padding:34px 40px;box-shadow:0 1px 3px rgba(23,20,14,.05);}
.pg-content #printcontent .receiptaddresses{margin-top:22px;}
/* Hide the receipt logo on the website only (it stays in the emailed copy, which
   ignores this stylesheet). The logo is the <p> wrapping mw-receipt-logo.png. */
.pg-content #printcontent p:has(img[src*="mw-receipt-logo"]){display:none;}
/* Digital downloads: bare divs -> tidy 3-column table */
.downloadlist{margin-top:8px;}
.downloadheadrow,.downloadlistrow{display:grid;grid-template-columns:minmax(0,.8fr) minmax(0,1fr) minmax(0,1.2fr);gap:14px;align-items:baseline;padding:11px 0;border-bottom:1px solid var(--line);}
.downloadheadrow{font:600 .66rem/1.3 Inter;letter-spacing:.06em;text-transform:uppercase;color:var(--muted);}
.downloadlistrow > div:first-child{font-size:.8rem;color:var(--muted);word-break:break-word;}
.downloadlistrow > div:nth-child(2){font-family:Fraunces,serif;font-weight:500;color:var(--ink);}
.downloadlistrow .downloadbtn{transition:.18s;}
/* Whiten the inner span + icon directly (the <a>'s inline color can't be overridden),
   on a solid rubric fill — avoids Bootstrap's default blue link colour on hover. */
.downloadlistrow .downloadbtn:hover{background:var(--rubric);}
.downloadlistrow .downloadbtn:hover span{color:#fff;}
.downloadlistrow .downloadbtn:hover svg{stroke:#fff;}
.receiptnodownloadtext{color:var(--muted);font-size:.9rem;}
/* Footer buttons */
.receiptbuttons{display:flex;flex-wrap:wrap;align-items:center;gap:12px;max-width:680px;margin:24px auto 6px;}
.receiptrecemail{flex-basis:100%;color:var(--muted);font-size:.9rem;margin:0 0 6px;}
/* One identical box for both buttons (they're an <a> + an <input> with different
   padding/font). line-height centering (not flex) keeps the labels vertically
   aligned across both element types. */
.receiptbuttons .ectbutton{box-sizing:border-box;display:inline-block;height:48px;line-height:46px;padding:0 26px;font-size:.74rem;text-align:center;vertical-align:top;}
.receiptcontinueshopping .ectbutton{background:var(--rubric);border-color:var(--rubric);color:var(--paper);}
.receiptcontinueshopping .ectbutton:hover{background:var(--rubric-dark);border-color:var(--rubric-dark);color:var(--paper);}
.receiptprintversion .ectbutton{background:transparent;color:var(--ink);border-color:var(--ink);margin-top:0;}
.receiptprintversion .ectbutton:hover{background:var(--ink);color:var(--paper);}
@media(max-width:600px){
  .pg-content #printcontent{padding:24px 20px;}
  .downloadheadrow{display:none;}
  .downloadlistrow{grid-template-columns:1fr;gap:6px;padding:12px 0;}
  .downloadlistrow > div:nth-child(2){font-size:1.02rem;}
  /* Full-width tap target (override the helper's inline display:inline-block) */
  .downloadlistrow .downloadbtn{display:block!important;text-align:center;margin-top:2px;}
  .receiptaddresses{grid-template-columns:1fr;gap:18px;}
  .receiptheadrow{display:none;}
  /* Line items as a media object: thumbnail (+sku) floated left, details column to
     the right. The column headers are hidden on mobile, so each value carries an
     explicit label instead of bare "$0.00 / 1 / $0.00" numbers. overflow:hidden on
     the text rows makes them sit beside the float rather than wrap under it. */
  .receiptitemrow{display:block;padding:15px 0;overflow:hidden;}
  .receiptitemrow > div{text-align:left;}
  .receiptitemrow .receiptprodid{float:left;margin:0 14px 0 0;max-width:88px;text-align:center;font-size:.6rem;color:var(--muted);}
  .receiptitemrow .receiptprodname{font-size:1.02rem;overflow:hidden;}
  .receiptitemrow .receiptunitprice,.receiptitemrow .receiptquantity,.receiptitemrow .receipttotal{overflow:hidden;font-size:.85rem;color:var(--muted);margin-top:3px;}
  .receiptitemrow .receiptunitprice::before{content:"Unit price: ";}
  .receiptitemrow .receiptquantity::before{content:"Qty: ";}
  .receiptitemrow .receipttotal{color:var(--ink);font-weight:500;}
  .receiptitemrow .receipttotal::before{content:"Line total: ";}
  .receiptoptionrow{padding-left:16px;}
  /* Order id / email stack so a long email never overflows the card */
  .receipttopmeta{flex-direction:column;align-items:stretch;gap:13px;}
  .rmetaemail{text-align:left;}
  .receipttopmeta .receiptright{word-break:break-word;}
  /* Footer buttons: full-width stacked tap targets */
  .receiptbuttons{flex-direction:column;align-items:stretch;}
  .receiptbuttons .ectbutton{width:100%;}
}

/* ----- Printable receipt (the "Printable Version" button opens a .printbody
   window that pulls in this stylesheet and auto-prints; also covers Ctrl+P).
   Shrinks everything so a typical receipt fits on one page. ------------------ */
@media print{
  @page{margin:1.2cm;}
  .mw-annc,.head,.utility,.page-hero,.foot,.foot-signup,.receiptbuttons,.mega,.mw-drawer{display:none!important;}
  /* Drop the receipt footer/colophon on the printed copy: every trailing <p> that
     follows the message-body <div> (Please-check note, Missional Wear block,
     Soli Deo Gloria, url, address) + the thank-you line. */
  .printbody > div ~ p, #printcontent > div ~ p, .recptthanks{display:none!important;}
  /* Digital-download block is a screen-only affordance — omit it from the printout. */
  .receiptdownload{display:none!important;}
  body{background:#fff!important;}
  .page,main,#main,section{margin:0!important;padding:0!important;}
  #printcontent,.printbody{max-width:none!important;margin:0!important;padding:0!important;border:0!important;box-shadow:none!important;font-size:10px;color:#000;}
  /* show the logo when printing the website page (it's hidden on-screen); the
     .printbody print window already shows it. Resize globally for both. */
  #printcontent p:has(img[src*="mw-receipt-logo"]){display:block!important;text-align:center!important;margin:0 0 6px!important;}
  img[src*="mw-receipt-logo"]{width:128px!important;height:auto!important;}
  .receipttopmeta{margin:0 0 7px!important;padding-bottom:6px!important;}
  .receiptmetaval{font-size:.95rem!important;}
  .receiptaddresses{gap:6px 26px!important;margin:3px 0 8px!important;}
  .receiptsectionhead{font-size:.84rem!important;margin:0 0 5px!important;padding-bottom:3px!important;}
  /* Print only: address fields go label-left (paper has the width); saves height. */
  .receiptcontainer{display:grid!important;grid-template-columns:72px 1fr!important;gap:0 10px!important;font-size:9px!important;margin-bottom:2px!important;line-height:1.3!important;}
  .receiptleft{font-size:9px!important;text-transform:none!important;letter-spacing:0!important;font-weight:600!important;color:#555!important;margin:0!important;}
  .receiptheadrow,.receiptitemrow{padding:3px 0!important;font-size:9px!important;}
  /* Options on one comma-separated line (e.g. "Size - Small, Color - Heather Red")
     indented under the name — saves a row per option on paper. */
  .receiptoptionrow{display:inline!important;border:0!important;padding:0!important;margin:0!important;font-size:8.5px!important;color:#555!important;line-height:1.3!important;}
  .receiptitemrow + .receiptoptionrow{margin-left:100px!important;}
  .receiptoptionrow + .receiptoptionrow::before{content:", "!important;}
  .receiptoptionrow + .receiptitemrow{border-top:1px solid var(--line)!important;}
  .receiptoptgroup,.receiptoptname{display:inline!important;}
  .receiptprodname{font-size:.8rem!important;}
  .thankspageimg img{width:26px!important;height:26px!important;margin-bottom:0!important;}
  .receipttotalsrow{font-size:9.5px!important;padding:2px 0!important;}
  .rectotgrandtotal{margin-top:6px!important;padding-top:8px!important;}
  .rectotgrandtotal .ectleft{font-size:.95rem!important;}
  .rectotgrandtotal .ectright{font-size:1.1rem!important;}
  .recptthanks,.receiptrecemail,.downloadlistrow,.receiptnodownloadtext{font-size:9px!important;}
  .downloadbtn{font-size:9px!important;padding:5px 9px!important;}
}

@media(max-width:620px){
  .pg-account .ectdivcontainer{grid-template-columns:1fr;gap:4px;}
  .pg-account .ectdivleft{padding-top:0;}
  /* Login / Create-account buttons sit side-by-side (not stacked) on mobile */
  .pg-account .clientloginbuttons{flex-wrap:nowrap;gap:8px;}
  .pg-account .clientloginbuttons .ectbutton{flex:1 1 0;min-width:0;padding:14px 10px;text-align:center;}
  .pg-account input.ectinputhalf{width:100%;}
  .pg-account .ectclordrow3 > div:has(.ectclordviewprod){margin-left:0;justify-content:flex-start;width:100%;}
  .pg-account .ectcladdressbutton{margin:0 8px 0 0;}
}

/* --- Gift-certificate / donation purchase form (ECT incspecials.php, rendered through
   proddetail.php on the gift-certificate-email/-physical + donation pages). Same bare
   .ectdiv* markup as the account section, but unscoped there — give it a centred card
   that matches the account treatment. .ectbutton submit is already themed globally. --- */
.pg-proddetail .ectgiftcerts,.pg-proddetail .ectdonations{max-width:560px;margin:0 auto;border:1px solid var(--line);border-radius:3px;background:var(--paper-2);overflow:hidden;}
.pg-proddetail .ectgiftcerts .ectdivhead,.pg-proddetail .ectdonations .ectdivhead{font-family:Fraunces,serif;font-weight:500;font-size:1.25rem;color:var(--ink);background:transparent;border-bottom:1px solid var(--line);padding:22px 26px;margin:0;}
.pg-proddetail .ectgiftcerts .ectdiv2column,.pg-proddetail .ectdonations .ectdiv2column{padding:14px 26px 0;color:var(--muted);font-size:.92rem;}
.pg-proddetail .ectgiftcerts .ectdiv2column.ectwarning,.pg-proddetail .ectdonations .ectdiv2column.ectwarning{color:var(--rubric);}
.pg-proddetail .ectgiftcerts .ectdivcontainer,.pg-proddetail .ectdonations .ectdivcontainer{display:grid;grid-template-columns:150px 1fr;gap:8px 22px;align-items:center;padding:14px 26px;border-bottom:1px solid var(--line);}
.pg-proddetail .ectgiftcerts .ectdivcontainer:last-child,.pg-proddetail .ectdonations .ectdivcontainer:last-child{border-bottom:0;}
.pg-proddetail .ectgiftcerts .ectdivleft,.pg-proddetail .ectdonations .ectdivleft{font:500 .9rem/1.5 Inter;color:var(--ink);}
.pg-proddetail .ectgiftcerts .ectdivleft label,.pg-proddetail .ectdonations .ectdivleft label{cursor:pointer;}
.pg-proddetail .ectgiftcerts .ectdivcontainer:has(textarea){align-items:start;}
.pg-proddetail .ectgiftcerts .ectdivright input[type=text],.pg-proddetail .ectgiftcerts .ectdivright textarea,.pg-proddetail .ectdonations .ectdivright input[type=text],.pg-proddetail .ectdonations .ectdivright textarea{width:100%;max-width:320px;border:1px solid var(--line);border-radius:2px;padding:11px 13px;font:400 .95rem Inter;background:#fff;color:var(--ink);box-sizing:border-box;}
.pg-proddetail .ectgiftcerts .ectdivright textarea,.pg-proddetail .ectdonations .ectdivright textarea{max-width:none;min-height:110px;resize:vertical;}
.pg-proddetail .ectgiftcerts #amount,.pg-proddetail .ectdonations #amount{max-width:140px;}
.pg-proddetail .ectgiftcerts .ectdivright input:focus,.pg-proddetail .ectgiftcerts .ectdivright textarea:focus,.pg-proddetail .ectdonations .ectdivright input:focus,.pg-proddetail .ectdonations .ectdivright textarea:focus{outline:none;border-color:var(--ink);}
.pg-proddetail .ectgiftcerts .gcsubmit,.pg-proddetail .ectdonations .donationsubmit{margin-top:2px;}
@media(max-width:560px){
  .pg-proddetail .ectgiftcerts .ectdivcontainer,.pg-proddetail .ectdonations .ectdivcontainer{grid-template-columns:1fr;gap:6px;padding:14px 20px;}
  .pg-proddetail .ectgiftcerts .ectdivhead,.pg-proddetail .ectdonations .ectdivhead{padding:18px 20px;}
  .pg-proddetail .ectgiftcerts .ectdiv2column,.pg-proddetail .ectdonations .ectdiv2column{padding:12px 20px 0;}
}

/* About — winding story timeline */
.timeline{position:relative;list-style:none;margin:0 auto;padding:6px 0 2px;max-width:880px;}
.timeline-svg{position:absolute;inset:0;width:100%;height:100%;overflow:visible;pointer-events:none;z-index:0;}
.timeline-svg .trail-base{fill:none;stroke:rgba(var(--rubric-rgb),.28);stroke-width:2;stroke-linecap:round;stroke-dasharray:1 9;}
.timeline-svg .trail-fill{fill:none;stroke:var(--rubric);stroke-width:2.5;stroke-linecap:round;}
.ms{position:relative;display:flex;box-sizing:border-box;width:50%;min-height:54px;margin-bottom:26px;z-index:1;}
.ms.left{left:0;justify-content:flex-end;padding-right:46px;}
.ms.right{left:50%;justify-content:flex-start;padding-left:46px;}
.ms-dot{position:absolute;top:7px;width:15px;height:15px;border-radius:50%;background:var(--paper);border:2px solid var(--rubric);z-index:2;transform:translateX(-50%);transition:background .3s,box-shadow .3s;}
.ms.left .ms-dot{left:calc(100% - 15px);}
.ms.right .ms-dot{left:15px;}
.ms-dot.on{background:var(--rubric);box-shadow:0 0 0 5px rgba(var(--rubric-rgb),.14);}
.ms-card{max-width:340px;width:100%;}
.ms-figure{margin:0 0 14px;aspect-ratio:16/10;background:var(--paper-2);border:1px solid var(--line);border-radius:8px;overflow:hidden;}
.ms-figure img{width:100%;height:100%;object-fit:cover;display:block;}
.ms-year{display:inline-block;font:500 .72rem/1 Inter;letter-spacing:.16em;text-transform:uppercase;color:var(--rubric);margin-bottom:6px;}
.ms-body h3{font-family:Fraunces,serif;font-weight:500;font-size:1.28rem;letter-spacing:-.01em;line-height:1.15;margin:0 0 .35rem;}
.ms-body p{color:var(--ink-soft);line-height:1.55;margin:0;font-size:.96rem;}
.ms-body em{color:var(--rubric);font-style:italic;}
@media(max-width:820px){
  .timeline{max-width:560px;}
  .ms,.ms.left,.ms.right{width:100%;left:0;justify-content:flex-start;padding:0 0 0 52px;}
  .ms.left .ms-dot,.ms.right .ms-dot{left:14px;transform:none;}
  .ms-card{max-width:none;}
  .ms-figure{max-width:200px;}
}

/* ===== Top search panel (Shopify-style drop-down) ===== */
.search-panel{position:fixed;top:0;left:0;right:0;z-index:61;background:var(--paper);border-bottom:1px solid var(--line);box-shadow:0 26px 46px rgba(23,20,14,.16);transform:translateY(-100%);transition:transform .3s cubic-bezier(.4,0,.2,1);visibility:hidden;}
.search-panel.open{transform:none;visibility:visible;}
.search-panel-inner{max-width:1280px;margin:0 auto;padding:26px 28px 30px;}
.sp-form{display:flex;align-items:center;gap:14px;border-bottom:2px solid var(--ink);padding-bottom:14px;}
.sp-ico{display:inline-flex;color:var(--muted);flex:0 0 auto;}.sp-ico svg{width:24px;height:24px;}
.sp-input{flex:1;min-width:0;border:0;background:none;outline:none;font-family:Fraunces,serif;font-weight:500;font-size:clamp(1.25rem,3vw,1.85rem);letter-spacing:-.01em;color:var(--ink);padding:4px 0;}
.sp-input::placeholder{color:var(--muted);opacity:.65;}
.sp-input::-webkit-search-cancel-button{-webkit-appearance:none;}
.sp-go{flex:0 0 auto;background:var(--rubric);border:1px solid var(--rubric);color:var(--paper);font:500 .8rem/1 Inter;letter-spacing:.1em;text-transform:uppercase;padding:14px 28px;cursor:pointer;transition:.18s;}
.sp-go:hover{background:var(--rubric-dark);border-color:var(--rubric-dark);}
.sp-close{flex:0 0 auto;background:none;border:0;color:var(--ink);cursor:pointer;display:inline-flex;padding:6px;transition:color .15s;}
.sp-close:hover{color:var(--rubric);}
.sp-quick{display:flex;flex-wrap:wrap;align-items:center;gap:10px;margin-top:18px;}
.sp-quick-label{font:500 .7rem/1 Inter;letter-spacing:.16em;text-transform:uppercase;color:var(--muted);margin-right:4px;}
.sp-quick a{font:400 .88rem/1 Inter;color:var(--ink-soft);border:1px solid var(--line);border-radius:999px;padding:8px 16px;transition:.15s;}
.sp-quick a:hover{border-color:var(--ink);color:var(--ink);background:var(--paper-2);}
@media(max-width:920px){
  .search-panel-inner{padding:18px 18px 22px;}
  .sp-go{display:none;}
  .sp-quick-label{width:100%;margin-bottom:2px;}
}

/* ===== Search page — refine form + results ===== */
.searchform{display:grid;gap:18px 22px;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));align-items:end;background:var(--paper-2);border:1px solid var(--line);border-radius:6px;padding:26px;margin:0 0 6px;}
.searchheader{grid-column:1/-1;font:500 .72rem/1 Inter;letter-spacing:.16em;text-transform:uppercase;color:var(--rubric);}
.searchcntnr{display:flex;flex-direction:column;gap:7px;min-width:0;}
.searchform .ectlabel{font:600 .68rem/1 Inter;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);}
.searchform .ecttextinput,.searchform .ectselectinput{width:100%;border:1px solid var(--line);border-radius:2px;padding:12px 14px;font:400 .95rem Inter;background:#fff;color:var(--ink);}
.searchform .ecttextinput:focus,.searchform .ectselectinput:focus{outline:none;border-color:var(--ink);}
.searchform .searchcontrol>div[style]{position:relative;}
.searchform .ectsearchsubmit .searchcontrol{display:flex;}
.searchform .ectsearchsubmit input,.searchform .ectsearchsubmit button{width:100%;background:var(--rubric);border:1px solid var(--rubric);color:var(--paper);font:500 .8rem/1 Inter;letter-spacing:.1em;text-transform:uppercase;padding:14px 26px;cursor:pointer;transition:.18s;}
.searchform .ectsearchsubmit input:hover,.searchform .ectsearchsubmit button:hover{background:var(--rubric-dark);border-color:var(--rubric-dark);}
/* autosearch suggestions dropdown */
.searchform .autosearch{position:absolute;top:100%;left:0;right:0;z-index:5;background:#fff;border:1px solid var(--line);border-top:0;box-shadow:0 14px 28px rgba(23,20,14,.14);max-height:320px;overflow-y:auto;}
.searchform .autosearch>*{display:block;padding:10px 14px;font:400 .9rem Inter;color:var(--ink-soft);cursor:pointer;border-top:1px solid var(--line);}
.searchform .autosearch>*:first-child{border-top:0;}
.searchform .autosearch>*:hover,.searchform .autosearch .autosearchselected{background:var(--paper-2);color:var(--rubric);}
.searchresults{margin-top:34px;}
.nosearchresults{text-align:center;color:var(--muted);font-family:Fraunces,serif;font-size:1.35rem;padding:64px 0;}
@media(max-width:560px){.searchform{padding:20px;grid-template-columns:1fr;}
/* On phones the stacked form eats the screen; hide it once a search has run (header search icon still re-searches). The bare /search page keeps the form so users can search. */
.has-query .searchform{display:none;}
.has-query .searchresults{margin-top:0;}}

/* ============================================================
   Product filter drawer (ECT incsidefilter output)
   The "Filter & Sort" trigger on product listings opens a
   right-side drawer that reuses the shared #scrim. ECT emits
   .ectpatgrp / .ectpat / .ectpacount / .sidefilter inputs etc.;
   we theme them here. Price-slider behaviour (#sliderdiv +
   the two range inputs) is driven by ectcart.js — we only
   supply the look. Filters are enabled in admin (sideFilter).
   ============================================================ */
/* Category-header content region (custom_section_regions slot category_header):
   an optional promo strip + full-width banner image, rendered above .listing-head.
   The region HTML only carries semantic markup; all styling lives here. Colors track
   the active theme via --rubric (blue by default, red under [data-theme="red"]). */
.mw-cat-strip{display:flex;align-items:center;gap:14px;margin:0 0 14px;background:var(--rubric);color:var(--paper);border-radius:10px;padding:12px 18px;line-height:1.25;}
.mw-cat-strip .cs-mark{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;border-radius:50%;background:rgba(255,255,255,.14);flex:none;font-size:1.05rem;}
.mw-cat-strip .cs-msg{flex:1;min-width:0;margin:0;font-size:.92rem;}
.mw-cat-strip .cs-msg b{font-family:Fraunces,serif;font-weight:500;font-size:1.04rem;}
.mw-cat-strip .cs-msg span{opacity:.85;}
.mw-cat-strip .cs-ends{flex:none;display:inline-flex;align-items:center;gap:6px;font:500 .7rem/1 Inter;letter-spacing:.12em;text-transform:uppercase;opacity:.82;}
.mw-cat-strip .cs-code{flex:none;font:500 .8rem/1 Inter;letter-spacing:.08em;background:var(--paper);color:var(--rubric);border-radius:5px;padding:8px 13px;}
.mw-cat-banner{display:block;margin:0 0 1.5rem;border-radius:12px;overflow:hidden;line-height:0;border:1px solid var(--line);}
.mw-cat-banner img{width:100%;height:auto;display:block;}
@media(max-width:640px){
  /* Stack for mobile: mark + message on row 1 (message fills, forcing the wrap),
     deadline + code drop to row 2 with the code pushed to the right edge. */
  .mw-cat-strip{flex-wrap:wrap;gap:9px 12px;padding:11px 14px;}
  .mw-cat-strip .cs-mark{width:30px;height:30px;font-size:.98rem;}
  .mw-cat-strip .cs-msg{flex:1 1 auto;font-size:.86rem;}
  .mw-cat-strip .cs-msg b{font-size:.98rem;}
  .mw-cat-strip .cs-code{margin-left:auto;padding:7px 11px;font-size:.74rem;}
  .mw-cat-banner{border-radius:9px;margin-bottom:1.1rem;}
}

/* Filter control pinned to the breadcrumb row (Shopify-style): title, then
   breadcrumb across the top, then the category title (left) + filter icon (right). */
.listing-head{margin:0 0 6px;}/* grid carries its own 1.5rem top margin, so keep this small */
/* Breadcrumb bar: ALWAYS one line. When it's longer than the bar it scrolls sideways (swipe /
   trackpad), with a soft right-edge fade shown only while there's hidden content to the right
   and you're not scrolled to the end (the .is-scroll / .at-end classes are toggled by a tiny
   presentational script in products.php). */
.lh-crumbs{margin:0 0 8px;min-height:1.2em;overflow-x:auto;white-space:nowrap;-webkit-overflow-scrolling:touch;scrollbar-width:none;}
.lh-crumbs::-webkit-scrollbar{display:none;}
.lh-crumbs .catnavigation{display:inline-flex;flex-wrap:nowrap;white-space:nowrap;margin:0;min-height:0;}
.lh-crumbs .ectbreadcrumb{white-space:nowrap;}
.lh-crumbs.is-scroll:not(.at-end){-webkit-mask-image:linear-gradient(to right,#000 84%,transparent);mask-image:linear-gradient(to right,#000 84%,transparent);}
.lh-row{display:flex;align-items:center;gap:16px;min-height:40px;}
.lh-title{font-family:Fraunces,serif;font-weight:500;font-size:clamp(1.55rem,3.4vw,2.25rem);letter-spacing:-.015em;line-height:1.1;color:var(--ink);margin:0;}
.listing-toolbar{margin-left:auto;flex:none;}
.filter-trigger{display:inline-flex;align-items:center;justify-content:center;width:40px;height:40px;color:var(--ink);background:transparent;border:1px solid var(--line);border-radius:6px;padding:0;cursor:pointer;transition:.18s;}
.filter-trigger:hover{background:var(--ink);color:var(--paper);border-color:var(--ink);}
.filter-trigger svg{flex:none;}

.filter-drawer{position:fixed;top:0;right:0;bottom:0;width:90%;max-width:380px;background:var(--paper);z-index:60;transform:translateX(100%);transition:transform .25s ease;overflow-y:auto;display:flex;flex-direction:column;}
.filter-drawer.open{transform:none;}
.filter-drawer .fd-top{position:sticky;top:0;display:flex;align-items:center;justify-content:space-between;padding:20px 24px;background:var(--paper);border-bottom:1px solid var(--line);z-index:2;}
.filter-drawer .fd-title{font-size:1.2rem;font-weight:600;}
.filter-drawer .fd-close{background:none;border:0;cursor:pointer;color:var(--ink);line-height:0;padding:4px;}
.filter-drawer .fd-close:hover{color:var(--rubric);}
.filter-drawer .fd-body{padding:10px 24px 36px;}

/* group wrapper + title */
.fd-body .ectpatgrp{border-bottom:1px solid var(--line);margin-bottom:18px;padding-bottom:16px;max-height:none !important;overflow:visible !important;}
.fd-body .ectpatgrp:last-child{border-bottom:0;}
.fd-body .ectpattitle{font:600 .72rem/1 Inter !important;letter-spacing:.14em;text-transform:uppercase;color:var(--rubric);margin:0 0 12px !important;}
.fd-body .ectpattitle a{color:var(--ink);text-decoration:underline;}
.fd-body .ectpatfilters{display:flex;flex-direction:column;gap:2px;}

/* clickable attribute links (default $sidefilterstyle) */
.fd-body .ectpat{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:8px 10px;font-size:.95rem;color:var(--ink-soft);cursor:pointer;border-radius:2px;transition:.15s;}
.fd-body .ectpat:hover{background:var(--paper-2);color:var(--rubric);}
.fd-body .ectpatset{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:8px 10px;font-size:.95rem;font-weight:600;color:var(--rubric);background:var(--paper-2);border-radius:2px;}
.fd-body .ectpacount{font-size:.82em;color:var(--muted);font-weight:400;}
.fd-body .zeroatt{color:var(--muted);opacity:.6;}

/* checkbox style ($sidefilterstyle='multiple') */
.fd-body .ectpatcb,.fd-body .ectpatcbset{display:flex;align-items:center;gap:8px;padding:6px 2px;font-size:.95rem;}
.fd-body .ectpatcb label{display:flex;align-items:center;gap:8px;cursor:pointer;width:100%;}
.fd-body .ectpatcb .ectpacount{margin-left:auto;}

/* "More" expander (button / link / mouseover bar) */
.fd-body .moreattributes,.fd-body .grpMoreDiv,.fd-body div[id^="grpMoreLnk"]{font:600 .72rem/1 Inter;letter-spacing:.1em;text-transform:uppercase;color:var(--rubric);cursor:pointer;padding-top:10px;}
.fd-body .sidefiltermore{background:none;border:0;color:var(--rubric);font:600 .72rem/1 Inter;letter-spacing:.1em;text-transform:uppercase;cursor:pointer;padding:8px 0;}

/* inputs / selects */
.fd-body .ecttextinput,.fd-body .ectselectinput,.fd-body select.sidefilter,.fd-body input.sidefilter{width:100%;border:1px solid var(--line);border-radius:2px;padding:11px 13px;font:400 .92rem Inter;background:#fff;color:var(--ink);}
.fd-body .ecttextinput:focus,.fd-body .ectselectinput:focus,.fd-body select.sidefilter:focus,.fd-body input.sidefilter:focus{outline:none;border-color:var(--ink);}

/* price band: min/max inputs, slider, Go button */
.fd-body .sfpriceinputs{display:flex;gap:10px;margin-bottom:16px;}
.fd-body .sfpriceinputs>div{flex:1;}
.fd-body .sfslidercontainer{position:relative;height:4px;background:var(--line);border-radius:2px;margin:8px 8px 0;}
.fd-body #sliderdiv{position:absolute;top:0;bottom:0;background:var(--rubric);border-radius:2px;}
.fd-body .sfrangesliders{position:relative;height:24px;margin:0 8px;}
.fd-body .sfrangesliders input[type=range]{position:absolute;top:0;left:0;width:100%;height:24px;margin:0;background:none;pointer-events:none;-webkit-appearance:none;appearance:none;}
.fd-body .sfrangesliders input[type=range]::-webkit-slider-thumb{pointer-events:auto;-webkit-appearance:none;appearance:none;width:16px;height:16px;border-radius:50%;background:var(--rubric);border:2px solid var(--paper);box-shadow:0 1px 3px rgba(0,0,0,.3);cursor:pointer;}
.fd-body .sfrangesliders input[type=range]::-moz-range-thumb{pointer-events:auto;width:16px;height:16px;border-radius:50%;background:var(--rubric);border:2px solid var(--paper);box-shadow:0 1px 3px rgba(0,0,0,.3);cursor:pointer;}
.fd-body .sfprice{text-align:center;}
.fd-body .ectbutton.sidefiltergo{width:100%;}

/* ── Channel offer engine (inc-mw-offer.php + mw.js): one panel, 4 formats ──── */
.mw-offer-backdrop{position:fixed;inset:0;z-index:120;background:rgba(23,20,14,.55);opacity:0;transition:opacity .25s ease;}
.mw-offer-backdrop.show{opacity:1;}
/* Generic panel — common look; each format below sets position/size/transform. */
.mw-offer-panel{position:fixed;z-index:121;box-sizing:border-box;overflow:hidden;
  background:var(--paper);color:var(--ink);border:1px solid var(--line);border-top:3px solid var(--rubric);
  box-shadow:0 26px 46px rgba(23,20,14,.22);opacity:0;text-align:center;
  transition:opacity .25s ease, transform .28s cubic-bezier(.2,.8,.2,1);}
.mw-offer-img{display:block;width:100%;height:150px;object-fit:cover;}
.mw-offer-content{padding:30px 28px 24px;}
.mw-offer-panel h2{font-family:Fraunces,serif;font-weight:600;font-size:1.4rem;line-height:1.18;margin:0 0 10px;}
.mw-offer-body{color:var(--muted);font-size:.95rem;margin:0 0 18px;}
.mw-offer-form{display:flex;flex-direction:column;gap:10px;}
.mw-offer-form input[type=email]{width:100%;box-sizing:border-box;padding:13px 14px;border:1px solid var(--line);background:#fff;color:var(--ink);font:400 .95rem Inter,sans-serif;}
.mw-offer-form input[type=email]:focus{outline:none;border-color:var(--rubric);}
.mw-offer-form .btn-solid{width:100%;cursor:pointer;}
.mw-offer-result{min-height:1.2em;margin:14px 0 0;font-size:.9rem;}
.mw-offer-result.ok{color:var(--rubric);}
.mw-offer-result.err{color:#b3261e;}
.mw-offer-code{display:inline-block;margin-top:4px;font:600 1.05rem/1 'Fraunces',serif;letter-spacing:.06em;
  background:var(--panel);border:1px dashed var(--rubric);padding:6px 12px;color:var(--ink);}
.mw-offer-dl{display:inline-block;margin-top:10px;width:auto;}
.mw-offer-close{position:absolute;top:8px;right:12px;z-index:2;background:none;border:0;font-size:1.7rem;line-height:1;color:var(--muted);cursor:pointer;padding:4px;}
.mw-offer-close:hover{color:var(--ink);}
.mw-offer-decline{display:block;margin:14px auto 0;background:none;border:0;color:var(--muted);font-size:.78rem;letter-spacing:.04em;text-decoration:underline;cursor:pointer;}
.mw-offer-decline:hover{color:var(--ink);}
/* PANEL positioning — scoped to .mw-offer-panel so these never leak onto the
   launcher (.mw-offer-tab), which carries the same mw-offer--tab_side/etc classes. */
/* modal — centered overlay */
.mw-offer-panel.mw-offer--modal{left:50%;top:50%;width:min(440px,calc(100vw - 32px));transform:translate(-50%,-46%);}
.mw-offer-panel.mw-offer--modal.show{opacity:1;transform:translate(-50%,-50%);}
/* tab_side — docked to left/right edge, vertically centered, slides in */
.mw-offer-panel.mw-offer--tab_side{top:50%;width:min(360px,calc(100vw - 24px));}
.mw-offer-panel.mw-offer--tab_side.mw-offer--right{right:0;transform:translateY(-50%) translateX(110%);}
.mw-offer-panel.mw-offer--tab_side.mw-offer--left{left:0;transform:translateY(-50%) translateX(-110%);}
.mw-offer-panel.mw-offer--tab_side.show{opacity:1;transform:translateY(-50%) translateX(0);}
/* tab_bottom — bottom sheet rising up */
.mw-offer-panel.mw-offer--tab_bottom{left:50%;bottom:0;width:min(540px,calc(100vw - 16px));transform:translateX(-50%) translateY(110%);}
.mw-offer-panel.mw-offer--tab_bottom.show{opacity:1;transform:translateX(-50%) translateY(0);}
/* inline — flows in a [data-mw-offer-slot] placeholder, no overlay */
.mw-offer-panel.mw-offer--inline{position:relative;z-index:1;width:100%;transform:none;box-shadow:none;margin:24px 0;}
.mw-offer-panel.mw-offer--inline.show{opacity:1;}
.mw-offer-panel.mw-offer--inline .mw-offer-close{display:none;}
/* Labeled corner PILL — the "Mystery Gift" resting state (start-collapsed) and the
   reopen handle after a tab panel is closed. Horizontal pill "<label> ✕". */
.mw-offer-tab{position:fixed;z-index:121;display:inline-flex;align-items:center;gap:9px;
  background:var(--rubric);color:var(--paper);border:0;cursor:pointer;
  font:600 .78rem/1 Inter;letter-spacing:.08em;text-transform:uppercase;padding:11px 14px;border-radius:999px;
  box-shadow:0 8px 22px rgba(23,20,14,.3);opacity:0;transform:translateY(10px);
  transition:opacity .2s ease, transform .2s ease, background .15s ease;}
/* [hidden] must beat the display:inline-flex above (0,2,0 > 0,1,0), or tab.hidden=true
   is a no-op and the launcher never hides — the pill lingers over the panel and, once
   armed=false on dismiss, becomes a dead clickable ghost. */
.mw-offer-tab[hidden]{display:none;}
.mw-offer-tab.show{opacity:1;transform:none;}
.mw-offer-tab:hover{background:var(--rubric-dark);}
.mw-offer-tab-label{pointer-events:none;}
.mw-offer-tab-x{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;flex:0 0 auto;
  border-radius:50%;background:rgba(255,255,255,.22);font-size:11px;line-height:1;}
.mw-offer-tab-x:hover{background:rgba(255,255,255,.4);}
.mw-offer-tab.mw-offer--tab_side.mw-offer--right{right:18px;bottom:18px;}
.mw-offer-tab.mw-offer--tab_side.mw-offer--left{left:18px;bottom:18px;}
.mw-offer-tab.mw-offer--tab_bottom{left:50%;bottom:18px;transform:translateX(-50%) translateY(10px);}
.mw-offer-tab.mw-offer--tab_bottom.show{transform:translateX(-50%);}
/* bubble style — a compact circular launcher (round image, short text, or gift icon).
   Deliberately LIGHT (parchment + accent ring) so it reads as discreet, not a heavy
   solid disc. Softens only the bubble; the pill + site accent are untouched. */
.mw-offer-tab.mw-offer-bubble{width:58px;height:58px;padding:0;border-radius:50%;justify-content:center;overflow:visible;
  box-sizing:border-box;background:var(--paper);color:var(--rubric);border:2px solid var(--rubric);}
.mw-offer-tab.mw-offer-bubble:hover{background:var(--paper);color:var(--rubric-dark);border-color:var(--rubric-dark);}
.mw-offer-bubble-img{width:100%;height:100%;border-radius:50%;object-fit:cover;pointer-events:none;}
.mw-offer-bubble-txt{font-size:.72rem;font-weight:600;line-height:1.05;text-align:center;padding:0 4px;pointer-events:none;}
.mw-offer-bubble-icon{font-size:24px;pointer-events:none;}
/* ✕ sits OUTSIDE the bubble's click face (bigger hit target, clear of the open zone). */
.mw-offer-tab.mw-offer-bubble .mw-offer-tab-x{position:absolute;top:-9px;right:-9px;width:24px;height:24px;z-index:2;
  background:var(--ink);color:var(--paper);border:2px solid var(--paper);font-size:14px;cursor:pointer;box-shadow:0 1px 5px rgba(23,20,14,.35);}
.mw-offer-tab.mw-offer-bubble.mw-offer--tab_bottom{transform:translateX(-50%) translateY(10px);}
.mw-offer-tab.mw-offer-bubble.mw-offer--tab_bottom.show{transform:translateX(-50%);}
/* "Parked" — the bottom bubble arrives centred (noticeable), then slides to the left
   edge once the visitor scrolls a little, so it's out of the way while they browse
   rather than something they ✕ out of annoyance. mw.js adds .is-parked (one-way).
   Animates `left` (not a translate to 50vw) so it lands exactly 18px off the edge:
   under a classic/non-overlay scrollbar 50vw is WIDER than the fixed containing
   block, which would drift the bubble off-target. One tiny element, one-shot — the
   layout cost of animating `left` is irrelevant here. */
.mw-offer-tab.mw-offer-bubble.mw-offer--tab_bottom{
  transition:opacity .2s ease, transform .45s cubic-bezier(.22,.61,.36,1),
             left .45s cubic-bezier(.22,.61,.36,1), background .15s ease;}
.mw-offer-tab.mw-offer-bubble.mw-offer--tab_bottom.show.is-parked{left:18px;transform:translateX(0) scale(.9);}
@media(max-width:480px){
  .mw-offer-content{padding:26px 20px 20px;}
  .mw-offer-panel h2{font-size:1.25rem;}
  .mw-offer-panel.mw-offer--tab_side{width:calc(100vw - 24px);}
}
/* The parked-bubble transition above is a 3-class selector, so it would out-specify a
   bare `.mw-offer-tab{transition:none}` here — restate it, or reduced-motion users
   still get the slide. Parking itself still happens; it just jumps instead of gliding. */
@media(prefers-reduced-motion:reduce){
  .mw-offer-backdrop,.mw-offer-panel,.mw-offer-tab,
  .mw-offer-tab.mw-offer-bubble.mw-offer--tab_bottom{transition:none;}}

/* ===== MW Chat =====
   Site-wide chat widget (inc-mw-chat.php shell + the "MW Chat" feature block at
   the end of js/mw.js). Launcher + panel are position:fixed bottom-right,
   z-index:90 — above the header/nav/drawers (40/60) but below the two
   single-overlay widgets that take priority when shown: the newsletter modal
   (#mwNl, .mw-ov, z-index:200) and the channel-offer engine (#mwOfferPanel /
   #mwOfferBackdrop, .show, z-index:121/120). js/mw.js polls both and adds
   .is-suppressed to .mw-chat-launcher while either is visible, or while the
   chat panel itself is open. Tokens only — no hardcoded accent hex, so the
   navy/red theme swap (data-theme="red") carries through unchanged. */

.mw-chat-launcher{position:fixed;right:1rem;bottom:calc(1rem + env(safe-area-inset-bottom));z-index:90;background:var(--rubric);color:#fff;font:500 .82rem/1 Inter;letter-spacing:.04em;text-transform:uppercase;border:0;border-radius:999px;padding:14px 22px;cursor:pointer;box-shadow:0 10px 26px rgba(23,20,14,.24);transition:opacity .18s ease,transform .18s ease,visibility .18s;}
.mw-chat-launcher:hover{background:var(--rubric-dark);}
.mw-chat-launcher:focus-visible{outline:2px solid var(--rubric);outline-offset:2px;}
.mw-chat-launcher.is-suppressed{opacity:0;visibility:hidden;pointer-events:none;transform:translateY(10px);}

.mw-chat-panel{position:fixed;right:1rem;bottom:calc(1rem + env(safe-area-inset-bottom));z-index:90;width:min(380px,calc(100vw - 2rem));max-height:min(560px,80vh);display:flex;flex-direction:column;background:var(--paper);border:1px solid var(--line);border-radius:14px;box-shadow:0 24px 60px rgba(23,20,14,.3);overflow:hidden;opacity:0;transform:translateY(16px) scale(.98);transition:opacity .18s ease,transform .18s ease;}
.mw-chat-panel[hidden]{display:none;}   /* a class setting display would otherwise defeat [hidden] — see CLAUDE.md gotcha */
.mw-chat-panel.is-open{opacity:1;transform:none;}

.mw-chat-head{flex:0 0 auto;display:flex;align-items:center;justify-content:space-between;gap:10px;padding:14px 16px 12px;border-bottom:1px solid var(--line);}
.mw-chat-title{font-family:Fraunces,Georgia,serif;font-weight:600;font-size:1.02rem;color:var(--ink);}
.mw-chat-title::before{content:"";display:inline-block;width:.9em;height:.9em;margin-right:.4em;vertical-align:-.05em;background-color:var(--rubric);-webkit-mask:var(--mark-mask) center/contain no-repeat;mask:var(--mark-mask) center/contain no-repeat;}
.mw-chat-close{background:none;border:0;padding:2px 4px;margin:-2px -4px;font-size:1.4rem;line-height:1;color:var(--muted);cursor:pointer;}
.mw-chat-close:hover{color:var(--rubric);}

.mw-chat-log{flex:1 1 auto;overflow-y:auto;-webkit-overflow-scrolling:touch;padding:14px 16px;display:flex;flex-direction:column;gap:10px;}
.mw-chat-msg{max-width:86%;padding:9px 13px;border-radius:12px;font-size:.87rem;line-height:1.45;overflow-wrap:break-word;}
.mw-chat-msg.user{align-self:flex-end;background:var(--panel);color:var(--ink);border-bottom-right-radius:3px;}
.mw-chat-msg.bot{align-self:flex-start;background:var(--paper-2);color:var(--ink);border-bottom-left-radius:3px;}
.mw-chat-msg.bot>:first-child{margin-top:0;}
.mw-chat-msg.bot>:last-child{margin-bottom:0;}
.mw-chat-msg a{color:var(--rubric);text-decoration:underline;}
.mw-chat-msg.mw-chat-fallback{color:var(--ink);}

.mw-chat-typing{display:inline-flex;gap:4px;align-items:center;padding:12px 13px;}
.mw-chat-dot{width:6px;height:6px;border-radius:50%;background:var(--muted);opacity:.4;animation:mwch-bounce 1.1s ease-in-out infinite;}
.mw-chat-dot:nth-child(2){animation-delay:.15s;}
.mw-chat-dot:nth-child(3){animation-delay:.3s;}
@keyframes mwch-bounce{0%,60%,100%{opacity:.35;transform:translateY(0);}30%{opacity:1;transform:translateY(-3px);}}

.mw-chat-chips{flex:0 0 auto;display:flex;flex-wrap:wrap;gap:6px;padding:0 16px 10px;}
.mw-chat-chip{font:500 .74rem/1 Inter;padding:7px 12px;border:1px solid var(--line);border-radius:999px;background:var(--paper);color:var(--ink);cursor:pointer;transition:background .15s,border-color .15s,color .15s;}
.mw-chat-chip:hover,.mw-chat-chip:focus-visible{background:var(--rubric);border-color:var(--rubric);color:#fff;}

.mw-chat-form{flex:0 0 auto;display:flex;align-items:center;gap:8px;padding:10px 16px;border-top:1px solid var(--line);}
.mw-chat-input{flex:1 1 auto;min-width:0;border:1px solid var(--line);border-radius:10px;padding:10px 12px;font:400 .88rem/1.3 Inter;color:var(--ink);background:#fff;}
.mw-chat-input:focus{outline:2px solid var(--rubric);outline-offset:-1px;}
.mw-chat-input:disabled{opacity:.6;}
.mw-chat-send{flex:0 0 auto;width:38px;height:38px;border:0;border-radius:10px;background:var(--rubric);color:#fff;font-size:0;cursor:pointer;transition:background .15s;position:relative;}
.mw-chat-send::before{content:"\2192";font-size:1rem;position:absolute;inset:0;display:flex;align-items:center;justify-content:center;}
.mw-chat-send:hover{background:var(--rubric-dark);}
.mw-chat-send:disabled{opacity:.5;cursor:default;}
.mw-chat-hp{position:absolute;left:-9999px;opacity:0;}

.mw-chat-disclosure{flex:0 0 auto;margin:0;padding:8px 16px 12px;font-size:.68rem;line-height:1.35;color:var(--muted);text-align:center;}
.mw-chat-alt{margin:8px 0;font-size:.85rem;color:var(--muted);}
.mw-chat-alt a{color:var(--rubric);text-decoration:underline;}

/* Handoff form, rendered from <template id="mwChatHandoffTpl"> into the log */
.mw-chat-handoff-wrap{max-width:96%;padding:0;background:transparent;}
.mw-chat-handoff{display:flex;flex-direction:column;gap:8px;background:var(--paper-2);border:1px solid var(--line);border-radius:10px;padding:12px;font-size:.85rem;}
.mw-chat-handoff label{display:flex;flex-direction:column;gap:3px;font:500 .68rem/1 Inter;letter-spacing:.04em;text-transform:uppercase;color:var(--muted);}
.mw-chat-handoff input,.mw-chat-handoff select,.mw-chat-handoff textarea{font:400 .86rem/1.4 Inter;color:var(--ink);background:#fff;border:1px solid var(--line);border-radius:6px;padding:7px 9px;}
.mw-chat-handoff textarea{resize:vertical;min-height:60px;}
.mw-chat-handoff input:focus,.mw-chat-handoff select:focus,.mw-chat-handoff textarea:focus{outline:2px solid var(--rubric);outline-offset:-1px;}
.mw-chat-news{flex-direction:row!important;align-items:center;gap:6px!important;text-transform:none!important;font-weight:400!important;letter-spacing:0!important;font-size:.78rem!important;}
.mw-chat-news input{flex:0 0 auto;}
.mw-chat-handoff button[type=submit]{align-self:flex-start;background:var(--rubric);border:1px solid var(--rubric);color:var(--paper);font:500 .78rem/1 Inter;letter-spacing:.06em;text-transform:uppercase;padding:9px 18px;border-radius:8px;cursor:pointer;}
.mw-chat-handoff button[type=submit]:hover{background:var(--rubric-dark);border-color:var(--rubric-dark);}
.mw-chat-handoff-error{margin:0;font-size:.78rem;color:var(--rubric);}

/* Mobile: bottom sheet instead of a floating corner card */
@media(max-width:640px){
  .mw-chat-panel{left:0;right:0;bottom:0;width:100%;max-height:85vh;border-radius:14px 14px 0 0;padding-bottom:env(safe-area-inset-bottom);}
}

@media(prefers-reduced-motion:reduce){
  .mw-chat-launcher,.mw-chat-panel{transition:none;}
  .mw-chat-dot{animation:none;opacity:.7;}
}

/* ===== Cart reassurance strip (inc-mw-cart-reassurance.php) =====
   Static, no JS — native <details>/<summary> for the disclosure behavior.
   Not the chat widget (that's suppressed on cart.php on purpose); this reuses
   the same KB content as plain server-rendered HTML. */
.mw-cart-reassurance{display:flex;flex-direction:column;gap:8px;margin-top:16px;padding-top:16px;border-top:1px solid var(--line);}
.mw-cart-reassurance-item{border:1px solid var(--line);border-radius:10px;background:var(--paper-2);}
.mw-cart-reassurance-item summary{display:flex;align-items:center;gap:9px;padding:11px 14px;font:500 .84rem/1.3 Inter;color:var(--ink);cursor:pointer;list-style:none;}
.mw-cart-reassurance-item summary::-webkit-details-marker{display:none;}
.mw-cart-reassurance-item summary i{flex:0 0 auto;width:1.05em;height:1.05em;color:var(--rubric);}
.mw-cart-reassurance-item summary::after{content:"";flex:0 0 auto;width:.8em;height:.8em;margin-left:auto;background-color:var(--muted);-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m5 9 7 7 7-7'/%3E%3C/svg%3E") center/contain no-repeat;mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m5 9 7 7 7-7'/%3E%3C/svg%3E") center/contain no-repeat;transition:transform .15s ease;}
.mw-cart-reassurance-item[open] summary::after{transform:rotate(180deg);}
.mw-cart-reassurance-item p{margin:0;padding:0 14px 12px 39px;font-size:.82rem;line-height:1.5;color:var(--muted);}
@media(prefers-reduced-motion:reduce){.mw-cart-reassurance-item summary::after{transition:none;}}

/* Store contact details (Settings Manager > Front-end > Store & Contact), shown
   in the footer brand column and on the 404 page. Lines are emitted only when
   their setting is non-blank, so these rules never style an empty element. */
.foot .foot-contact{font-style:normal;font-size:.88rem;line-height:1.6;margin:12px 0 0;color:#B8AF9B;}
.foot .foot-contact a{color:inherit;text-decoration:none;border-bottom:1px solid var(--line-lt);}
.foot .foot-contact a:hover{color:#fff;}
.notfound .nf-help{margin:28px auto 0;padding-top:20px;border-top:1px solid var(--line);max-width:44ch;font-size:.92rem;color:var(--muted);}
.notfound .nf-help h4{font-family:Fraunces,serif;font-weight:500;margin:0 0 .35em;color:var(--ink);}
.notfound .nf-help p{margin:0;}
.notfound .nf-help a{color:var(--rubric);}

/* ===== Free Gift Unlock (.mwg-*) — progress bar + gift card on cart.php and in the cart tray; JS in mw.js ===== */
.mwg{font-family:Inter,system-ui,sans-serif;color:var(--ink);}
.mwg-bar{margin-bottom:22px;padding:18px 0;}
.mwg-bar-text{font:600 .68rem/1.4 Inter;letter-spacing:.04em;text-transform:uppercase;color:var(--muted);margin-bottom:10px;}
/* .mwg-bar-rail wraps the track + the gift marker. The marker must sit OUTSIDE
   .mwg-bar-track: the track clips (overflow:hidden, for the fill's rounded ends)
   and is only 10px tall, so an emoji inside it renders as a sliced smudge. */
.mwg-bar-rail{position:relative;padding-right:26px;}
.mwg-bar-track{position:relative;height:10px;background:var(--paper-2,#ECE6D8);border-radius:8px;overflow:hidden;}
.mwg-bar-fill{position:absolute;left:0;top:0;bottom:0;background:var(--mwg,#2c7a36);border-radius:8px;transition:width .4s ease;}
/* Greyed at the finish line while locked (shows what you're working toward), then
   pops to full colour on unlock. */
.mwg-bar-gift{position:absolute;right:0;top:50%;font-size:1.15rem;line-height:1;opacity:.4;filter:grayscale(1);transform:translateY(-50%) scale(.85);transform-origin:center;transition:opacity .4s ease,filter .4s ease,transform .4s ease;}
.mwg-bar-gift.is-on{opacity:1;filter:none;transform:translateY(-50%) scale(1);}
@media (prefers-reduced-motion:reduce){.mwg-bar-fill,.mwg-bar-gift{transition:none;}}
.mwg-card{border:1px solid var(--line);border-left:3px solid var(--mwg,#2c7a36);border-radius:8px;background:rgba(var(--rubric-rgb),.02);padding:18px;margin-bottom:20px;}
.mwg-card-title{font-family:Fraunces,serif;font-weight:500;font-size:1.1rem;color:var(--ink);margin:0 0 12px;}
.mwg-card-text{font-size:.92rem;line-height:1.5;color:var(--ink-soft);margin:0 0 16px;}
.mwg-card--locked .mwg-gift{opacity:.55;}
.mwg-card--collapsed{border:0;background:transparent;padding:0;}
.mwg-card--collapsed .mwg-card-title{display:none;}
.mwg-card--collapsed .mwg-card-text{display:none;}
.mwg-card--collapsed .mwg-gifts{display:none;}
.mwg-card--collapsed .mwg-actions{display:none;}
/* auto-fit + a max track: on the full-width cart card the tiles spread instead of
   huddling left, but never balloon when only one gift is offered. */
.mwg-gifts{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,210px));gap:12px;margin-bottom:16px;}
.mwg--tray .mwg-gifts{grid-template-columns:1fr;}
.mwg-gift{display:flex;flex-direction:column;text-align:left;background:transparent;border:1px solid var(--line);border-radius:8px;padding:12px;cursor:pointer;transition:all .15s ease;appearance:none;-webkit-appearance:none;font:inherit;}
.mwg-gift:hover{border-color:var(--mwg,#2c7a36);background:rgba(var(--rubric-rgb),.04);}
.mwg-gift.is-sel{border-color:var(--mwg,#2c7a36);border-width:2px;padding:11px;background:rgba(var(--rubric-rgb),.08);}
.mwg-gift-img{width:100%;aspect-ratio:1;object-fit:cover;border-radius:6px;background:var(--paper-2);margin-bottom:8px;}
.mwg-gift-name{font:.5rem/1.3 Inter;font-weight:500;color:var(--ink);margin-bottom:4px;}
.mwg-gift-price{font-size:.8rem;line-height:1.3;}
.mwg-gift-price s{color:var(--muted);text-decoration:line-through;margin-right:3px;}
.mwg-gift-price b{font-weight:600;color:var(--mwg,#2c7a36);}
.mwg-opts{display:flex;flex-direction:column;gap:8px;margin-top:12px;}
.mwg-opt{display:flex;flex-direction:column;gap:4px;font-size:.85rem;}
.mwg-opt label{font-weight:500;color:var(--ink-soft);}
.mwg-opt select{width:100%;font:400 .9rem/1.4 Inter;color:var(--ink);background:#fff;border:1px solid var(--line);border-radius:4px;padding:8px 10px;cursor:pointer;}
.mwg-opt select:disabled{opacity:.5;cursor:not-allowed;background:var(--paper-2);}
.mwg-actions{display:flex;flex-wrap:wrap;gap:10px;margin-top:16px;align-items:center;}
.mwg-claim{flex:1 1 auto;min-width:120px;background:var(--rubric);border:1px solid var(--rubric);color:var(--paper);font:500 .82rem/1 Inter;letter-spacing:.1em;text-transform:uppercase;padding:13px 24px;border-radius:4px;cursor:pointer;transition:.18s;}
.mwg-claim:hover{background:var(--rubric-dark);border-color:var(--rubric-dark);}
.mwg-decline{flex:0 1 auto;background:transparent;border:0;color:var(--muted);font:500 .78rem/1 Inter;letter-spacing:.06em;text-transform:uppercase;padding:0;cursor:pointer;transition:color .15s;}
.mwg-decline:hover{color:var(--ink);}
.mwg-swap{background:none;border:0;padding:0;font:500 .8rem/1.4 Inter,system-ui,sans-serif;color:var(--muted);cursor:pointer;text-decoration:underline;text-underline-offset:3px;text-decoration-color:var(--line);transition:color .15s ease;}
.mwg-swap:hover,.mwg-swap:focus-visible{color:var(--mwg,#2c7a36);text-decoration-color:currentColor;}
.mwg-swap[disabled]{opacity:.5;cursor:default;}
.mwg-card--claimed .mwg-actions{margin-top:10px;}
.mwg-reclaim{background:transparent;border:0;color:var(--mwg,#2c7a36);font:500 .78rem/1 Inter;letter-spacing:.06em;text-transform:uppercase;padding:0;cursor:pointer;text-decoration:underline;}
.mwg-reclaim:hover{opacity:.8;}
.mwg-msg{font-size:.82rem;color:#9E2B22;line-height:1.4;margin-top:8px;display:none;}
.mwg-msg:not(:empty){display:block;}
.cartandoptsline.is-gift .cartlinename::after{content:" FREE GIFT";font:600 .65rem/1 Inter;letter-spacing:.1em;color:var(--mwg,#2c7a36);margin-left:6px;}
.cartandoptsline.is-gift input.cartquant{pointer-events:none;opacity:.6;}
.mwg--tray{margin-bottom:12px;padding-bottom:12px;border-bottom:1px solid var(--line);}
.mwg--tray .mwg-bar{margin-bottom:14px;padding:12px 0;}
.mwg--tray .mwg-bar-rail{padding-right:22px;}
.mwg--tray .mwg-bar-gift{font-size:1rem;}
.mwg--tray .mwg-card{padding:14px;margin-bottom:14px;}
.mwg--tray .mwg-card-title{font-size:.95rem;margin-bottom:8px;}
.mwg--tray .mwg-card-text{font-size:.84rem;margin-bottom:12px;}
.mwg--tray .mwg-gift{padding:8px 10px;display:grid;grid-template-columns:56px 1fr;column-gap:10px;align-items:center;}
.mwg--tray .mwg-gift-img{grid-row:1/3;width:56px;height:56px;aspect-ratio:auto;margin:0;}
.mwg--tray .mwg-gift-name,.mwg--tray .mwg-gift-price{grid-column:2;}
.mwg--tray .mwg-gift-name{font-size:.8rem;}
.mwg--tray .mwg-gift-price{font-size:.75rem;}
.mwg--tray .mwg-actions{gap:8px;margin-top:12px;}
.mwg--tray .mwg-claim{padding:11px 20px;font-size:.76rem;}
@media(max-width:600px){
  .mwg-gifts{grid-template-columns:repeat(2,1fr);}
  .mwg-actions{flex-direction:column;gap:8px;}
  .mwg-claim,.mwg-decline{width:100%;text-align:center;flex:1 1 100%;}
  .mwg-decline{order:2;}
}

/* ===== Coupon reveal (cart page) — quiet link that opens ECT's coupon box (mw.js) ===== */
.mwcp-toggle{display:block;width:100%;margin:14px 0 0;padding:0;background:none;border:0;text-align:left;font:500 .78rem/1.4 Inter,system-ui,sans-serif;color:var(--muted);cursor:pointer;text-decoration:underline;text-underline-offset:3px;text-decoration-color:var(--line);transition:color .15s ease;}
.mwcp-toggle:hover,.mwcp-toggle:focus-visible{color:var(--ink);text-decoration-color:currentColor;}
.mwcp-toggle::before{content:"+ ";font-weight:600;}
.mwcp-toggle.is-open::before{content:"– ";}
/* class-based collapse, not [hidden]: an existing display: rule would defeat the attribute */
.cartcoupon_cntnr.mwcp-hide{display:none;}
.cartcoupon_cntnr[data-mwcp]{margin-top:10px;}

/* ===== Free-gift checkout prompt (mw.js mwgOpenPrompt) ===== */
.mwg-prompt-backdrop{position:fixed;inset:0;z-index:220;background:rgba(28,25,20,.55);display:flex;align-items:center;justify-content:center;padding:20px;animation:mwgFade .18s ease;}
@keyframes mwgFade{from{opacity:0}to{opacity:1}}
.mwg-prompt{background:var(--paper,#F7F3EA);border-radius:10px;border-top:3px solid var(--mwg,#2c7a36);max-width:420px;width:100%;padding:26px 26px 22px;box-shadow:0 18px 50px rgba(0,0,0,.28);}
.mwg-prompt-title{font:600 1.18rem/1.3 Fraunces,Georgia,serif;color:var(--ink,#211d18);margin-bottom:10px;}
.mwg-prompt-text{font:400 .92rem/1.55 Inter,system-ui,sans-serif;color:var(--ink-soft,#4a443c);margin-bottom:20px;}
.mwg-prompt-actions{display:flex;align-items:center;gap:16px;flex-wrap:wrap;}
.mwg-prompt-choose{flex:1 1 auto;min-width:170px;}
.mwg-prompt-skip{background:none;border:0;padding:6px 2px;font:500 .84rem/1.4 Inter,system-ui,sans-serif;color:var(--muted,#8a8175);cursor:pointer;text-decoration:underline;text-underline-offset:3px;text-decoration-color:var(--line,#e0d9cb);}
.mwg-prompt-skip:hover,.mwg-prompt-skip:focus-visible{color:var(--ink,#211d18);text-decoration-color:currentColor;}
/* brief highlight when the prompt sends them back to the picker */
.mwg-flash{animation:mwgFlash 1.6s ease;}
@keyframes mwgFlash{0%,100%{box-shadow:0 0 0 0 rgba(44,122,54,0)}18%,60%{box-shadow:0 0 0 4px rgba(44,122,54,.28)}}
@media (max-width:600px){.mwg-prompt-actions{flex-direction:column;align-items:stretch;}.mwg-prompt-skip{text-align:center;}}
@media (prefers-reduced-motion:reduce){.mwg-prompt-backdrop,.mwg-flash{animation:none;}}

/* ===== Free Gift Unlock — multiple offers (stacked bar+card pairs) ===== */
.mwg-offer{margin-bottom:24px;}
.mwg-offer:last-child{margin-bottom:0;}
/* Separator only appears between stacked offers (via sibling selector); single offer has no separator */
.mwg-offer + .mwg-offer{border-top:1px solid var(--line);padding-top:24px;}
.mwg--tray .mwg-offer{margin-bottom:14px;}
.mwg--tray .mwg-offer:last-child{margin-bottom:0;}
.mwg--tray .mwg-offer + .mwg-offer{border-top:1px solid var(--line);padding-top:14px;}
.mwg-offer-name{font:600 .68rem/1.4 Inter;letter-spacing:.04em;text-transform:uppercase;color:var(--muted);margin-bottom:10px;display:block;}
@media (max-width:600px){
  .mwg-offer{margin-bottom:16px;}
  .mwg-offer:last-child{margin-bottom:0;}
  .mwg-offer + .mwg-offer{padding-top:16px;}
}
