/* Jost, the brand webfont, is NOT loaded here. It is a preconnected <link> in
   views/partials/seo.ejs, which every view reaches either directly or through
   partials/head.

   It was an @import on this line, chosen because fourteen views carry their own
   inline <head> and a link tag looked like a fourteen-file change. That was the
   wrong trade. An @import cannot be discovered until this stylesheet has itself
   been fetched and parsed, so the font request is serialised behind another
   request and the text reflows later than it needs to — a plausible cause of
   the "header text shifts on first paint" report. seo.ejs turned out to be the
   single include point that was wanted, so the font moved there and gained
   preconnect at the same time.

   Anything setting font-family here should keep matching the family list in
   seo.ejs: 400, 500 and 600 are the only weights fetched. */

*{
    margin:0;
    padding:0;
    box-sizing:border-box;
}

html{
    scroll-behavior:smooth;
}

body{
    font-family:Arial, Helvetica, sans-serif;
    background:
    linear-gradient(
    180deg,
    #faf7f2 0%,
    #f4efe7 100%
    );
    color:#131313;
    overflow-x:hidden;
}

/* ==========================================
   NEW PREMIUM NAVBAR
========================================== */

.navbar{
    position:sticky;
    top:0;
    z-index:9999;
    background:#000;
    transition:.3s ease;
    border-bottom:1px solid rgba(0,0,0,.08);
}

.navbar.scrolled{
    transform:translateY(-35px);
}

.top-bar{
    background:#000;
    height:42px;
    overflow:hidden;
    display:flex;
    align-items:center;
}

.top-bar-track{
    white-space:nowrap;
    color:#fff;
    font-size:.9rem;
    font-weight:500;
    animation:ticker 25s linear infinite;
}

.top-bar-track span{
    margin:0 80px;   /* increase to 100px if you want more spacing */
    opacity:.7;
}
.top-bar-track span{
    margin:0 120px;
}

@keyframes ticker{
    0%{
        transform:translateX(0);
    }
    100%{
        transform:translateX(-50%);
    }
}
.nav-main{
    background:#000;
    height:110px;
    padding:0 50px;

    display:grid;
    grid-template-columns:80px 1fr 160px;

    align-items:center;
}

.logo{
    text-align:center;
    /* min-width:0 lets this grid cell shrink; a grid item defaults to
       min-width:auto, which is how the wordmark got to push into the icon row.
       NO overflow:hidden here — clipping a brand name is worse than the overlap
       it was meant to prevent, and it cost the "R" off EXTRAALAYER. The fit is
       guaranteed by sizing the wordmark to the space instead. */
    min-width:0;
}

.logo a{
    color:#fff;
    font-size:2.8rem;
    font-weight:900;
    letter-spacing:-2px;
    text-decoration:none !important;
    border:none !important;
}


.nav-icons{
    display:flex;
    justify-content:flex-end;
    align-items:center;
    gap:16px;
}

/* The icons themselves stay the same size; the link box around them grows to
   a 44x44 touch target. They were 15-18px wide, roughly a third of the
   minimum, and the cart icon is on the path to checkout. Gap reduced from 28
   to 16 so the wider boxes do not push the header past the screen. */
.nav-icons a{
    color:#fff;
    font-size:1.2rem;
    font-weight:300;
    display:inline-flex;
    align-items:center;
    justify-content:center;
    min-width:44px;
    min-height:44px;
}

.navbar.scrolled .nav-main{
    height:90px;
}

.navbar.scrolled .logo a{
    font-size:2.2rem;
}

.menu-toggle{
    display:block;
    color:#fff;
    font-size:2rem;
    cursor:pointer;
}

.mobile-menu{
    position:fixed;
    top:0;
    left:-100%;
    width:300px;
    height:100vh;
    background:#fff;
    z-index:99999;
    /* Was 40px 30px. The rows inside now carry their own 44px height and a
       negative inline margin for the hover background, so this only needs to
       set the panel's edge. */
    padding:18px 22px;
    transition:.4s ease;
    overflow-y:auto;
}

.mobile-menu.active{
    left:0;
}

/* 40px of panel padding plus a 2rem glyph plus 30px of margin pushed the first
   link about 110px down the panel, so the drawer opened onto a block of empty
   white before anything you could tap. Sized as a real 44px control instead,
   pulled into the panel's own padding so it does not add a row of its own. */
.close-menu{
    display:inline-flex;
    align-items:center;
    justify-content:center;
    width:44px;
    height:44px;
    margin:-8px -8px 10px;
    font-size:1.6rem;
    line-height:1;
    cursor:pointer;
}

/* The only search entry point on a phone. The header form is display:none
   below 768px because that row cannot fit another control, which left the site
   with no way to search at all on mobile.

   type="search" rather than text so the on-screen keyboard offers a search key
   instead of a newline, and iOS draws its own clear button. 44px on both the
   field and the submit, matching the drawer rows underneath. */
.mobile-menu__search{
    display:flex;
    align-items:stretch;
    gap:8px;
    margin:0 0 14px;
}

.mobile-menu__search input{
    flex:1 1 auto;
    min-width:0;
    min-height:44px;
    padding:0 12px;
    border:1px solid rgba(19,19,19,.18);
    border-radius:10px;
    background:#fff;
    font-family:inherit;
    /* 16px exactly. Anything smaller and iOS zooms the page on focus, which on
       a fixed-position drawer leaves the customer scrolled sideways inside a
       panel they cannot see the edges of. */
    font-size:16px;
    color:#131313;
}

.mobile-menu__search input:focus{
    outline:none;
    border-color:#131313;
}

.mobile-menu__search button{
    flex:0 0 44px;
    min-height:44px;
    border:0;
    border-radius:10px;
    background:#131313;
    color:#F1EFE8;
    font-size:.95rem;
    cursor:pointer;
}

.mobile-menu__search button:hover,
.mobile-menu__search button:focus-visible{
    background:#2e2e2e;
}

.mobile-menu ul{
    list-style:none;
}

/* Typography for the whole panel, set once here rather than per rule.

   Jost is geometric and its uppercase is wide and even, which is what makes
   the fashion-house register work: generous letter-spacing on a geometric
   reads as considered, the same spacing on Arial reads as stretched. The
   weight comes DOWN from 700 to 500 at the same time — heavy uppercase at
   small sizes is what made this panel feel shouted rather than premium, and
   the tracking is what carries the emphasis now.

   Sizes stay put. This is the phone's primary navigation and every row keeps
   its 44px target; the change is in the letterforms, not the hit areas. */
.mobile-menu{
    font-family:'Jost', 'Futura', 'Avenir Next', 'Century Gothic', sans-serif;
}



/* These were 800-weight uppercase at 1rem with 1px of tracking and 22px of
   dead margin between them: dense, heavy, and with nothing to say they were
   interactive. Each is now a full-width row with its own hit area, a hover
   state, and a chevron, so the panel reads as somewhere to tap rather than a
   list of shouted words. Tracking comes down because letter-spacing on heavy
   uppercase at small sizes is what made it feel cramped. */
.mobile-menu a{
    display:flex;
    align-items:center;
    justify-content:space-between;
    gap:12px;
    min-height:44px;
    padding:0 12px;
    margin:0 -12px;
    border-radius:10px;
    text-decoration:none;
    color:#131313;
    /* Typography set here rather than in a rule of its own. A separate
       `.mobile-menu a` block placed EARLIER in the file was silently beaten by
       this one: same selector, same specificity, later source wins. That is
       the trap documented at the foot of this stylesheet, and it caught this
       very change on the first attempt.

       Weight comes down from 700 and tracking goes up from 0.4px. Heavy
       uppercase at this size is what made the panel feel shouted; on a
       geometric face the emphasis comes from the spacing instead, which is the
       register fashion navigation is usually set in. */
    font-family:'Jost', 'Futura', 'Avenir Next', 'Century Gothic', sans-serif;
    font-weight:500;
    font-size:.9rem;
    letter-spacing:.16em;
    text-transform:uppercase;
    transition:background .18s ease, color .18s ease, padding-left .18s ease;
}

.mobile-menu a::after{
    content:"\203A";
    font-size:1.35rem;
    line-height:1;
    font-weight:400;
    color:rgba(19,19,19,.28);
    transition:transform .18s ease, color .18s ease;
}

.mobile-menu a:hover,
.mobile-menu a:focus-visible{
    background:#F1EFE8;
    padding-left:18px;
}

.mobile-menu a:hover::after,
.mobile-menu a:focus-visible::after{
    color:#131313;
    transform:translateX(3px);
}

.mobile-menu hr{
    border:0;
    border-top:1px solid rgba(19,19,19,.12);
    margin:14px 0;
}

/* Logout is a POST, so it cannot be an <a> and does not pick up the
   .mobile-menu a rule above. Every number here is copied from that rule
   deliberately rather than shared through a common selector — the two are the
   same row and must stay the same row, and a future edit to the link metrics
   has to come here too. Width is calc(100% + 24px) because the -12px inline
   margin that bleeds the hover background to the panel edge would otherwise
   push a width:100% button 12px past it. No chevron: ::after on the links
   means "this goes somewhere", which is the wrong promise on a control that
   ends the session. */
.mobile-menu__logout{
    margin:0;
}

.mobile-menu__logout button{
    display:flex;
    align-items:center;
    width:calc(100% + 24px);
    min-height:44px;
    padding:0 12px;
    margin:0 -12px;
    border:0;
    border-radius:10px;
    background:none;
    color:#131313;
    /* Kept in step with .mobile-menu a by hand, as that rule's comment warns.
       inherit picks Jost up from .mobile-menu; the other three have to match
       the link metrics explicitly or LOGOUT reads as a different control from
       every row above it. */
    font-family:inherit;
    font-weight:500;
    font-size:.9rem;
    letter-spacing:.16em;
    text-transform:uppercase;
    text-align:left;
    cursor:pointer;
    transition:background .18s ease, padding-left .18s ease;
}

.mobile-menu__logout button:hover,
.mobile-menu__logout button:focus-visible{
    background:#F1EFE8;
    padding-left:18px;
}

/* ==========================================
   DESKTOP CATEGORY BAR
========================================== */

.nav-links{
    display:flex;
    justify-content:center;
    gap:35px;
}

.nav-links a{
    font-size:.82rem;
    font-weight:800;
    text-transform:uppercase;
}

/* ==========================================
   NAV MOBILE
========================================== */

@media(max-width:992px){

    .search-bar{
        display:none;
    }

    .menu-toggle{
        display:block;
    }

    /* The icon column was a fixed 100px holding three links, which is why the
       cart and wishlist icons measured 15-18px wide. Widened to fit three
       44px touch targets; the logo column gives up the difference.
       Then a fourth icon (Search) was added and 148px was never revisited:
       4 targets at 44px plus three 4px gaps needs 188px, so the row ran 40px
       past its column. body{overflow-x:hidden} swallowed the scrollbar, so on
       a 360px screen the Cart icon simply left the viewport with 5px of 44
       still visible. Sized to content so adding a fifth icon cannot
       reintroduce this. */
    .nav-main{
        grid-template-columns:44px minmax(0,1fr) auto;
        padding:0 16px;
        height:75px;
    }

    .logo a{
        font-size:1.6rem;
    }

    .menu-toggle{
        display:inline-flex;
        align-items:center;
        justify-content:center;
        min-width:44px;
        min-height:44px;
    }

    .nav-icons{
        gap:4px;
    }

    .nav-icons a{
        font-size:1.1rem;
    }

    /* THE SCROLLED STATE HAD NO MOBILE SIZE, so it fell back to the desktop
       one and undid every fit calculation in this block.

       `.navbar.scrolled .logo a` is two classes and an element, so it outranks
       the plain `.logo a` above no matter how far down the file that sits.
       Scrolling past 50px therefore jumped the wordmark from ~1.6rem to the
       desktop 2.2rem inside a column still sized for the smaller one, and it
       ran straight into the icons. `.nav-main` did the same, growing 75px to
       90px on a screen where the header had been deliberately shortened.

       Specificity, not source order. The earlier collision fixed in this block
       was measured in the RESTING state only, and nobody scrolled. */
    .navbar.scrolled .nav-main{
        height:64px;
    }

    .navbar.scrolled .logo a{
        font-size:1.45rem;
    }

}

/* ==========================================
   SMALL MOBILE
========================================== */

@media(max-width:576px){

    /* The wordmark rendered 190.5px wide inside a 157px grid column, and
       .logo does not clip, so "EXTRAALAYER" ran straight into the wishlist
       icon: a measured 33x31px collision between two tappable things at
       393px, and 44x31px at 360px. This rule also used to set a LARGER size
       than the 992px breakpoint above it, so the logo grew as the screen
       shrank. Scales with the viewport instead, and never exceeds what the
       column can hold. */
    /* Hidden on phones, not removed: Wishlist is still in the drawer menu and
       in the footer. Three 44px icons plus a 44px hamburger left only ~104px
       for an 11-character wordmark at 320px, which is not enough for any
       readable size. Giving the brand that 44px back is better than shrinking
       the wordmark to illegibility or dropping the icons below their tap
       target. */
    .nav-icons .nav-icon-link[aria-label="Wishlist"]{
        display:none;
    }

    .logo a{
        font-size:clamp(1.25rem, 6vw, 1.7rem);
        letter-spacing:-1px;
        white-space:nowrap;
        /* letter-spacing adds its advance after the LAST glyph too, so the
           inline box runs ~1px wider than the visible ink. At 320px there is no
           slack left in the cell to absorb it and the tap boxes overlapped by
           1.19px. Cancels the trailing advance. */
        margin-right:-2px;
    }

    /* The mobile banner override lives in the late block at the FOOT of this
       file, not here. `.hero-banner`'s base rule is declared after this point,
       and at equal specificity the later rule wins, so an override written
       here is dead at every width. Third instance of that trap in this
       stylesheet. */

    .nav-main{
        width:95%;
    }

    /* Same specificity problem as the 992 block, and worse here: this is the
       width where the wordmark was already measured colliding with the icons
       at rest, so the scrolled state has even less slack to give. Scales with
       the viewport exactly like the resting rule above, one step smaller,
       because the header is shorter when scrolled and a wordmark sized for a
       75px bar looks oversized in a 64px one. */
    .navbar.scrolled .logo a{
        font-size:clamp(1.15rem, 5.4vw, 1.5rem);
        letter-spacing:-1px;
        white-space:nowrap;
        margin-right:-2px;
    }

    .mobile-menu{
        width:100%;
    }

}

/* =========================
   HERO
========================= */
/* The client's own banner artwork, supplied as SVG.

   It arrived as a 4.3MB SVG wrapping five base64 PNGs — an export from a design
   tool rather than real vector art, so it carried the weight of a raster with
   none of the compression. Rendered at 1920x1080 and encoded properly it is
   138KB of WebP: the same picture, a thirty-second of the bytes. A 4.3MB hero
   is a several-second wait on Indian mobile data and it blocks the first thing
   anyone sees.

   The `background-image` line overrides only the image from the shorthand
   above, so position, size and repeat survive. Browsers that do not understand
   image-set() ignore that declaration and keep the JPEG from the shorthand,
   which is why the shorthand names the JPEG rather than the WebP.

   Only .hero-banner is repointed. `.category-banner--all` further down this
   file also uses hero.jpg and is a DIFFERENT component (the shop "all"
   banner) — repointing it here would silently restyle a page nobody asked
   about. hero.jpg stays on disk for it, and for the og:image default in
   partials/seo.ejs. */
.hero-banner{
    width:100%;
    height:100vh;
    min-height:500px;
    background:url('/images/banner.jpg') center center/cover no-repeat;
    background-image:image-set(
        url('/images/banner.webp') type('image/webp'),
        url('/images/banner.jpg') type('image/jpeg')
    );
}

.hero-overlay{
    height:100%;
    background:rgba(0,0,0,.25);
    display:flex;
    flex-direction:column;
    justify-content:flex-end;
    align-items:flex-start;
    padding: 100px;
    text-align:center;
    color:#F1EFE8;
}

.hero-subtitle{
    letter-spacing:4px;
    font-size:.8rem;
    margin-bottom:20px;
}

/* No stylesheet defined this, so every placeholder on the storefront fell
   through to the browser default, which renders around #757575 and measured
   4.0:1 against the cream search field. Set explicitly rather than inherited
   from the UA. The admin has its own value: its fields sit on near-black. */
::placeholder{
    color:#6b6b6b;
    opacity:1;
}

.hero-overlay h1{
    font-size:5rem;
    line-height:.85;
    max-width:700px;
    font-weight:900;
    /* .hero-overlay sets text-align:center, which this inherited. The flex
       column already left-aligns each child box, so the blocks looked correct,
       but every wrapped LINE of the heading centred inside that box: "FOR
       EVERY" sat 38px right of the subtitle and button at 1440, and at 390 the
       three wrapped lines started at 34, 83 and 127px against a 30px edge, a
       visible wedge. */
    text-align:left;
}

.hero-btn{
    margin-top:30px;
    background:#F1EFE8;
    color:#131313;
    padding:18px 40px;
    text-decoration:none;
    font-weight:900;
}

/* =========================
   PREMIUM SECTION HEADINGS
========================= */
.mini-categories{
    display:flex;
    justify-content:center;
    gap:20px;
    padding:30px 0;
}

.mini-categories div{
    padding:12px 24px;
    border:1px solid #d9d4ca;
    border-radius:999px;
    font-weight:700;
    cursor:pointer;
    transition:.3s;
}

.mini-categories div:hover{
    background:#131313;
    color:white;
}
.section-heading{
    text-align:center;
    margin-bottom:70px;
}

.section-heading span{
    display:block;
    font-size:.8rem;
    letter-spacing:6px;
    text-transform:uppercase;
    color:#707070;
    margin-bottom:15px;
    font-weight:600;
}

.section-heading h1,
.section-heading h2{
    margin:0;
    font-size:3rem;
    font-weight:900;
    text-transform:uppercase;
    letter-spacing:-2px;
    line-height:1;
    color:#131313;
}
/* =========================
   COLLECTIONS
========================= */
/* =========================
   MAIN COLLECTIONS
========================= */

.collections{
    display:grid;
    grid-template-columns:repeat(5,1fr);
    border-top:1px solid #ddd;
    border-bottom:1px solid #ddd;
}

.collection-content h2{
    font-size:.75rem;
    letter-spacing:1px;
}

.collection-card{
    position:relative;
    height:220px;
    overflow:hidden;
    background:#f5f2eb;
}

.collection-card img{
    width:100%;
    height:240px;
    object-fit:contain;
    object-position:center bottom;
    transition:.4s ease;
}

.collection-card:hover img{
    transform:scale(1.08);
}

.collection-content{
    position:absolute;
    bottom:15px;
    left:0;
    width:100%;
    text-align:center;
}

.collection-content h2{
    color:#131313;
    font-size:.85rem;
    font-weight:900;
    letter-spacing:2px;
}

/* =========================
   OVERSIZED COLLECTIONS
========================= */
.title-line{
    width:70px;
    height:4px;
    background:#F1EFE8;
    margin:25px auto 0;
}

.oversized-collections{
    padding:34px 3.2% 30px;
    background:#F1EFE8;
}

.category-grid{
    display:grid;
    grid-template-columns:repeat(3,1fr);
    gap:20px;
    max-width:1400px;
    margin:60px auto 0;
}

.category-card{
    background:transparent;
    border:none;
    box-shadow:none;
    overflow:visible;
    position:relative;
}

.category-card:hover{
    transform:translateY(-12px);
    box-shadow:0 25px 50px rgba(0,0,0,.12);
}

/* A planned category with artwork but nothing to sell yet.

   Deliberately does NOT lift on hover and shows a default cursor: the hover
   transform on a real card is the site's own signal that a tile is somewhere
   you can go, and reusing it here would promise a destination that does not
   exist. The card is a div with no href for the same reason.

   The photograph is dimmed rather than greyscaled. Desaturating the client's
   own product photography to communicate a state reads as an image that failed
   to load; holding the colour and dropping the contrast reads as deliberate. */
.category-card--soon{
    cursor:default;
    pointer-events:none;
}

/* Both selectors, deliberately. `.category-grid--home .category-card:hover`
   further down this file is THREE classes and outranks a bare
   `.category-card--soon:hover`, so on the homepage strip — the only place these
   tiles appear — the lift would win on specificity. It does not today only
   because pointer-events:none stops :hover ever matching, which means the
   inertness rests entirely on one property. If anyone ever removes that to make
   a tooltip work, the lift silently returns. Two rules, and it holds either
   way. */
.category-card--soon:hover,
.category-grid--home .category-card--soon:hover{
    transform:none;
    box-shadow:none;
}

.category-card--soon img{
    opacity:.55;
}

.category-card--soon .category-card__content h3,
.category-card--soon .category-card__content p{
    opacity:.75;
}

.category-card__soon-badge{
    position:absolute;
    top:14px;
    left:14px;
    z-index:2;
    padding:5px 11px;
    border-radius:999px;
    background:rgba(19,19,19,.88);
    color:#F1EFE8;
    /* Was .62rem, which measured 9.92px. Small enough that it stops being a
       label and starts being texture, and this one has a job to do: it is the
       only thing telling a customer the tile is not shoppable. .72rem holds the
       badge proportion without shrinking into decoration. */
    font-size:.72rem;
    font-weight:700;
    letter-spacing:.14em;
    text-transform:uppercase;
    white-space:nowrap;
}

.category-card img{
    width:100%;
    height:420px;
    object-fit:contain;
    background:transparent;
    transition:.4s;
    display:block;
    position:relative;
    z-index:2;
}

.category-card:hover img{
    transform:scale(1.03);
}

.category-card::before{
    content:attr(data-title);
    position:absolute;
    top:20px;
    left:50%;
    transform:translateX(-50%);
    font-size:90px;
    font-weight:900;
    color:#bdbdbd;
    z-index:1;
}

.category-card:hover::before{
    opacity:1;
}

.category-card h3{
    position:absolute;
    bottom:15px;
    left:50%;
    transform:translateX(-50%);
    background:#111;
    color:#fff;
    padding:14px 34px;
    border-radius:999px;
    width:auto;
    min-width:180px;
}

.category-card:hover h3{
    letter-spacing:2px;
}

.section-heading__copy{
    margin-top:8px;
    color:#7b776f;
    font-size:.82rem;
    font-weight:500;
}

.category-grid--home{
    /* Was a hardcoded repeat(5,...) from when there were five categories. With
       three, the row filled three of five tracks and left two empty columns of
       dead space on the right. auto-fit sizes to however many categories exist,
       the 380px ceiling stops three cards stretching into billboards, and
       justify-content centres whatever is left rather than pinning it left. */
    /* auto-fit read the available width at 1024 as room for two tracks, so the
       third card dropped to its own row and left the same hole the fix was
       meant to close, just at a laptop width instead. Three explicit columns
       that can shrink to nothing but never exceed 380px cannot wrap, so the row
       stays a row from 993px upwards and the cards simply narrow. */
    grid-template-columns:repeat(3,minmax(0,380px));
    justify-content:center;
    gap:16px;
    max-width:1500px;
    margin-top:34px;
}

.category-grid--home .category-card{
    min-height:354px;
    border-radius:6px;
    overflow:hidden;
    background:#d9d3c8;
    border:0;
    box-shadow:0 14px 34px rgba(19,19,19,.13);
    isolation:isolate;
}

.category-grid--home .category-card:hover{
    transform:translateY(-6px);
    box-shadow:0 22px 42px rgba(19,19,19,.2);
}

.category-grid--home .category-card::before{
    content:"";
    inset:0;
    top:auto;
    left:auto;
    transform:none;
    width:auto;
    height:auto;
    background:linear-gradient(180deg,rgba(0,0,0,0) 28%,rgba(0,0,0,.28) 62%,rgba(0,0,0,.64) 100%);
    z-index:3;
    transition:opacity .35s ease, background .35s ease;
}

.category-grid--home .category-card:hover::before{
    background:linear-gradient(180deg,rgba(0,0,0,0) 24%,rgba(0,0,0,.32) 58%,rgba(0,0,0,.72) 100%);
}

.category-grid--home .category-card img{
    height:100%;
    min-height:354px;
    object-fit:cover;
    background:#d9d3c8;
    z-index:1;
    transition:transform .65s ease, filter .65s ease;
}

.category-grid--home .category-card:hover img{
    transform:scale(1.08);
    filter:saturate(1.06) contrast(1.04);
}

.category-grid--home .category-card__content{
    position:absolute;
    left:16px;
    right:16px;
    bottom:16px;
    z-index:4;
}

.category-grid--home .category-card h3{
    position:static;
    transform:none;
    min-width:0;
    padding:0;
    margin:0 0 8px;
    background:transparent;
    border-radius:0;
    color:#fff;
    /* Scales with the card instead of a fixed 1.55rem, so a longer name like
       COMFORT CREW cannot run past the card edge at narrower widths. */
    font-size:clamp(1.1rem, 1.6vw, 1.5rem);
    line-height:1.05;
    font-weight:900;
    letter-spacing:0;
    text-transform:uppercase;
    overflow-wrap:break-word;
}

.category-grid--home .category-card:hover h3{
    letter-spacing:0;
}

.category-grid--home .category-card p{
    margin:0 0 12px;
    color:rgba(255,255,255,.82);
    font-size:.78rem;
    line-height:1.4;
    font-weight:600;
}

.category-card__arrow{
    width:42px;
    height:42px;
    border-radius:50%;
    display:inline-flex;
    align-items:center;
    justify-content:center;
    background:rgba(0,0,0,.76);
    color:#fff;
    font-size:1rem;
    font-weight:900;
    box-shadow:0 10px 22px rgba(0,0,0,.22);
    transition:transform .28s ease, background .28s ease, box-shadow .28s ease;
}

.category-grid--home .category-card:hover .category-card__arrow{
    transform:translateX(5px);
    background:#000;
    box-shadow:0 14px 28px rgba(0,0,0,.3);
}
/* =========================
   FEATURED SECTION
========================= */

.featured{
    background:#131313;
    color:#F1EFE8;
    padding:120px 5%;
}
/* =========================
   FEATURED
========================= */
/* The second selector was missing its .featured prefix, so it applied to every
   .section-heading h2 on the site rather than only the ones inside this dark
   section. .oversized-collections has a #F1EFE8 background, so "SHOP BY STYLE"
   was cream text on a cream panel at 1:1 and simply did not appear. Same class
   of fault as the invisible form labels, in the one place nobody was looking:
   a heading on the homepage. */
.featured .section-heading h1,
.featured .section-heading h2{
    color:#F1EFE8;
}

.featured .section-heading span{
    color:#999;
}

.featured-heading{
    text-align:center;
    margin-bottom:80px;
}

.featured-heading span{
    color:#8a8a8a;
    letter-spacing:8px;
    font-size:.8rem;
    text-transform:uppercase;
}

.featured-heading h2{
    color:#F1EFE8;
    font-size:5rem;
    font-weight:900;
    letter-spacing:-3px;
    margin-top:15px;
    text-transform:uppercase;
}

.heading-line{
    width:120px;
    height:4px;
    background:#F1EFE8;
    margin:25px auto 0;
}
.product-grid{
    display:grid;
    grid-template-columns:repeat(3,1fr);
    gap:30px;
}

.product-card{
    background:#F1EFE8;
    border-radius:24px;
    overflow:hidden;
    transition:.4s ease;
}

.product-card:hover{
    transform:translateY(-10px);
}

/* One shape for every product card, at every width.

   This was height:420px + object-fit:contain, and contain is what made the
   cards look inconsistent. Contain fits the whole photo inside the box, so the
   RENDERED size depends on the photo's own proportions: the catalogue carries
   both 1245x1600 (0.778) and 1025x1534 (0.668), and in a fixed box the second
   drew about 11% narrower than the first with cream either side. Two garments,
   same card, visibly different sizes. Nothing was wrong with the CSS numbers;
   the variable was the photography.

   aspect-ratio fixes the BOX and cover fills it, so every card is now
   identical regardless of what was uploaded. Cover scales uniformly, so
   nothing is stretched or distorted, it is cropped instead, and the crop is
   anchored to the top because a garment shot loses its hem more gracefully
   than its neckline, print or collar.

   3/4 is the shallower of the two ratios in use, so the taller shots give up
   the least. The uncropped view now lives in the full-screen viewer, which is
   the trade this makes: uniform grid, one tap to see the whole piece.

   Consistency here depends on the shoot as much as the CSS. Exporting product
   photos at one ratio is what makes the crop invisible. */
.product-card img{
    width:100%;
    aspect-ratio:3/4;
    height:auto;
    object-fit:cover;
    object-position:top center;
    background:#F1EFE8;
    border-radius:25px;
    transition:.4s ease;
}

.product-info{
    padding:20px;
    /* .featured sets color:#F1EFE8 for its dark band, and .product-card sits
       inside it with a CREAM background, so every child that did not declare a
       colour inherited cream onto cream. The product NAME and the PRICE THE
       CUSTOMER PAYS were both invisible on every card; only the struck-through
       original and the discount badge, which set their own colours, showed. A
       shopper saw a crossed-out price and a "-10%" badge with a blank space
       where the actual price belongs. Set on the container so the name and
       price inherit correctly and the muted children keep their own. */
    color:#131313;
}

.product-info span{
    font-size:.75rem;
    color:#707070;
    letter-spacing:2px;
}

.product-info h3{
    margin-top:10px;
    font-size:1.2rem;
    font-weight:800;
}

.product-info p{
    margin-top:10px;
    font-size:1.1rem;
    font-weight:900;
}
.product-btn{
    /* Was 35px tall. This is the buy path on a phone. */
    display:inline-flex;
    align-items:center;
    justify-content:center;
    min-height:44px;
    margin-top:15px;
    padding:10px 20px;
    background:#131313;
    color:#F1EFE8;
    text-decoration:none;
    font-size:.8rem;
    font-weight:700;
    transition:.3s ease;
}

.product-btn:hover{
    background:#333;
}

.product-card__link{
    display:block;
    position:relative;
    text-decoration:none;
}

.product-card__badge{
    position:absolute;
    top:16px;
    left:16px;
    background:#131313;
    color:#F1EFE8;
    padding:6px 12px;
    font-size:.75rem;
    font-weight:800;
    border-radius:999px;
    z-index:2;
}

.product-pricing{
    display:flex;
    align-items:center;
    gap:10px;
    margin-top:10px;
}

.product-price{
    font-size:1.1rem;
    font-weight:900;
}

.product-original{
    font-size:.9rem;
    color:#707070;
    text-decoration:line-through;
    font-weight:600;
}

.category-card{
    text-decoration:none;
    color:inherit;
    transition:.4s ease;
    display:block;
}

a.category-card{
    text-decoration:none;
}
/* =========================
   ABOUT
========================= */

.about-brand{
    align-items:center;
    display:grid;
    grid-template-columns:1fr 1fr;
    min-height:auto;
}

.about-left img{
    display:block;
    width:100%;
    /* Was height:100% on an auto-height grid row, so a 1066x1600 portrait at
       half the viewport rendered around 1080px tall and set the height of the
       whole section. Capped, and object-fit:cover crops rather than squashes. */
    height:clamp(340px, 44vw, 560px);
    object-fit:cover;
}

.about-right{
    padding:100px;
    display:flex;
    min-height:auto;
    flex-direction:column;
    justify-content:center;
}


.about-right span{
    letter-spacing:4px;
    font-size:.8rem;
}

.about-right h2{
    margin:25px 0;
    font-size:3.5rem;
    line-height:1.1;
}

.about-right p{
    max-width:500px;
    color:#555;
}

.about-right a{
    margin-top:30px;
    width:max-content;
    background:#131313;
    color:#F1EFE8;
    text-decoration:none;
    padding:15px 30px;
}

/* =========================
   TICKER
========================= */

.ticker{
    background:#F1EFE8;
    color:#131313;
    overflow:hidden;
    white-space: nowrap;
    padding:18px 0;
}

.ticker-track{
    font-size:1rem;
    font-weight:700;
    animation:scroll 20s linear infinite;
}

@keyframes scroll{
    from{
        transform:translateX(100%);
    }
    to{
        transform:translateX(-100%);
    }
}

/* =========================
   FOOTER
========================= */

.footer{
    background:#131313;
    color:#F1EFE8;
}

.footer-container{
    width:90%;
    max-width:1400px;
    margin:auto;
    padding:80px 0;
    display:grid;
    grid-template-columns:2fr 1fr 1fr 1fr;
    gap:50px;
}

.footer h2{
    margin-bottom:20px;
}

.footer h3{
    margin-bottom:20px;
}

.footer ul{
    list-style:none;
}

.footer li{
    margin-bottom:4px;
}

.footer a{
    color:#F1EFE8;
    text-decoration:none;
}

/* Footer list links were ~17px tall, well under the 44px touch minimum, and
   they sit close together so mis-taps were likely. Scoped to list links so
   inline links inside paragraphs keep their normal flow. */
/* The 44px touch target is a real requirement on a phone and pure dead space
   with a mouse: at 44px plus the 12px li margin, every footer row was 56px
   tall, which is what made the link lists look so loosely spaced on desktop.
   Scoped to touch widths below. */
.footer li a{
    display:inline-flex;
    align-items:center;
}

.footer input{
    width:100%;
    padding:12px;
    margin-bottom:10px;
    border:none;
}

.footer button{
    width:100%;
    padding:12px;
    border:none;
    cursor:pointer;
}

.footer-bottom{
    text-align:center;
    padding:20px;
    border-top:1px solid rgba(255,255,255,.1);
}

/* =========================
   MOBILE
========================= */

@media(max-width:992px){

    .section-heading h1,
.section-heading h2{
    font-size:2.8rem;
        }
    .collections{
        grid-template-columns:repeat(2,1fr);
    }
     .collection-card{
        height:160px;
    }

    .category-grid:not(.category-grid--home),
    .about-brand{
        grid-template-columns:1fr;
    }

    /* .product-grid was in the 1fr list above. One column below 992px meant a
       card up to ~940px wide holding an image box capped at 320px tall, and
       with object-fit:contain a portrait photo is constrained by the SHORT
       side: the live catalogue's 1025x1534 shots rendered 214px wide inside
       it, floating in cream on a full-width card. Two columns down to 576px
       keeps the card near the photo's own width; the phone block below goes
       back to one, where a full-width card is what makes the photo big. */
    .product-grid{
        grid-template-columns:repeat(2,minmax(0,1fr));
    }

    .category-grid--home{
        grid-template-columns:repeat(3,minmax(0,1fr));
    }

    .category-card img{
        height:350px;
    }

    /* Nothing to override any more. The base .product-card img rule is now
       ratio-based and cover, so it is already correct at every width and a
       breakpoint override would only be a second number to keep in step. */

    .hero-overlay h1{
        font-size:3.5rem;
    }

    .featured-heading h2{
        font-size:3rem;
    }

    /* Touch widths only. See .footer li a above. */
    .footer li a{
        min-height:44px;
    }

    .footer li{
        margin-bottom:8px;
    }

    .footer-container{
        grid-template-columns:1fr;
    }

    .pdp-layout{
        grid-template-columns:1fr;
    }

    .category-banner h1{
        font-size:3rem;
    }

}

@media(max-width:576px){
    /* Two products per row on a phone, which is the standard fashion-grid
       shape and lets a customer compare two pieces without scrolling.

       This reverses an earlier one-column change made to answer "photos look
       small". One column was the wrong lever: the photos looked small because
       contain was letterboxing them inside a short fixed box, not because the
       cards were narrow. With the box now ratio-based and cover, a card at
       this width renders the garment larger than the old full-width card did,
       because the photo fills the card instead of floating inside it.

       Gap tightens with the cards: 30px between two ~170px columns is most of
       a gutter, and the row stops reading as a pair. */
    /* Density modelled on the Indian marketplace grids (Myntra and the like),
       which is what the client asked to match, but kept inside this brand's
       own styling rather than copied wholesale. So: their gutter, their type
       scale and their single-line truncation, and our cream card, rounded
       corner and buy buttons.

       Myntra itself could not be measured — it, Ajio and Nykaa Fashion all
       refuse an automated browser at the edge — so these are the marketplace
       convention rather than numbers read off their DOM. Worth re-checking
       against a real screenshot before treating them as exact. */
    .product-grid{
        grid-template-columns:repeat(2,minmax(0,1fr));
        gap:8px;
    }

    /* 5% of a 390px screen is ~20px of padding each side, which at two columns
       costs more than a whole gutter. Marketplace grids run close to the edge
       because the photograph is the product. */
    .featured{
        padding:64px 12px;
    }

    /* The heading does NOT follow the cards to the edge. Photographs can run
       close to the trim, centred type at 12px from it reads as a mistake.
       Padding goes back on here, and the 80px rule below the heading comes
       down with the rest of the section's rhythm. */
    .featured-heading{
        padding:0 12px;
        margin-bottom:40px;
    }

    .featured-heading span{
        letter-spacing:4px;
        font-size:.7rem;
    }

    /* Corner comes in with the card. A 24px radius on a 168px tile is a much
       bigger visual event than the same radius on a 364px one, and it starts
       eating the garment at the corners. */
    .product-card{
        border-radius:16px;
    }

    .product-card img{
        border-radius:16px;
    }

    .product-info{
        padding:10px;
    }

    /* Category eyebrow: small, muted, spaced. */
    .product-info span{
        font-size:.625rem;
        letter-spacing:1px;
    }

    /* One line, then ellipsis. This is the detail that makes a marketplace grid
       look tidy: without it a two-word name and a five-word name build cards of
       different heights, the rows stop aligning, and the grid reads as broken
       rather than dense. */
    .product-info h3{
        font-size:.8125rem;
        font-weight:600;
        margin-top:4px;
        white-space:nowrap;
        overflow:hidden;
        text-overflow:ellipsis;
    }

    /* Price, was-price and discount on one line, which is the row a shopper
       actually scans. Wraps only if the numbers genuinely do not fit. */
    .product-pricing{
        gap:6px;
        margin-top:4px;
        flex-wrap:wrap;
    }

    .product-price{
        font-size:.8125rem;
        font-weight:800;
    }

    .product-original{
        font-size:.6875rem;
    }

    .product-info p{
        font-size:.8125rem;
        margin-top:4px;
    }

    /* Badge scales with the tile or it covers a third of the photograph. */
    .product-card__badge{
        top:8px;
        left:8px;
        padding:3px 7px;
        font-size:.625rem;
    }

    /* Side by side at this width the two buttons were 40px wide each with the
       label clipped. Stacked, both keep a full-width 44px target. */
    .product-actions{
        flex-direction:column;
        gap:6px !important;
        margin-top:10px !important;
    }

    .product-btn{
        width:100%;
        font-size:.7rem;
        padding:10px 6px;
    }

    /* .about-right kept its desktop 100px padding on phones, leaving 175px of
       usable width on a 375px screen. The section measured 446px wide at every
       phone size, and body{overflow-x:hidden} clipped the excess instead of
       letting it scroll, so the text was silently cut off. */
    .about-right{
        padding:40px 20px;
    }

    .about-right h2{
        font-size:2rem;
        margin:18px 0;
    }

    .about-right p{
        max-width:100%;
    }

    .shop-filters{
        align-items:stretch;
    }

    .shop-filters__control,
    .shop-filters__button,
    .search-form__control,
    .search-form__button{
        width:100%;
        min-width:0;
    }
}

/* =========================
   CATEGORY PAGE
========================= */

.category-banner{
    width:100%;
    min-height:420px;
    background:#131313;
    position:relative;
    overflow:hidden;
}

.category-banner__img{
    position:absolute;
    inset:0;
    width:100%;
    height:100%;
    object-fit:cover;
    object-position:center;
}

.category-banner--all{
    background:url('/images/hero.jpg') center center/cover no-repeat;
}

.category-banner__overlay{
    position:relative;
    z-index:1;
    min-height:420px;
    background:rgba(0,0,0,.45);
    display:flex;
    flex-direction:column;
    justify-content:flex-end;
    align-items:flex-start;
    padding:80px 5%;
    color:#F1EFE8;
}

.category-banner__overlay h1{
    font-size:4.5rem;
    font-weight:900;
    line-height:.9;
    letter-spacing:-2px;
    text-transform:uppercase;
    margin-top:10px;
}

.category-banner__desc{
    max-width:600px;
    margin-top:20px;
    color:rgba(241,239,232,.85);
    line-height:1.6;
}

.category-banner__count{
    margin-top:20px;
    font-size:.85rem;
    letter-spacing:3px;
    text-transform:uppercase;
    font-weight:700;
}

.category-products{
    padding-bottom:120px;
}

.breadcrumb{
    display:flex;
    flex-wrap:wrap;
    align-items:center;
    gap:8px;
    font-size:.85rem;
    margin-bottom:40px;
    color:#707070;
}

.breadcrumb a{
    color:#707070;
    text-decoration:none;
    transition:.2s;
}

.breadcrumb a:hover{
    color:#131313;
}

.breadcrumb--light{
    margin-bottom:20px;
    color:rgba(241,239,232,.7);
}

.breadcrumb--light a{
    color:rgba(241,239,232,.7);
}

.breadcrumb--light a:hover{
    color:#F1EFE8;
}

.breadcrumb span{
    opacity:.5;
}

.page-empty{
    text-align:center;
    padding:120px 5%;
    min-height:50vh;
    display:flex;
    flex-direction:column;
    align-items:center;
    justify-content:center;
}

.page-empty--dark{
    padding:60px 0;
}

.page-empty__text{
    color:#707070;
    margin:20px 0 30px;
    font-size:1.1rem;
}

/* =========================
   PRODUCT DETAILS PAGE
========================= */

.pdp-main{
    padding:40px 5% 80px;
}

.pdp-container{
    max-width:1400px;
    margin:0 auto;
}

.pdp-layout{
    display:grid;
    grid-template-columns:1fr 1fr;
    gap:60px;
    align-items:start;
}

.pdp-gallery__main{
    background:#F1EFE8;
    border-radius:24px;
    overflow:hidden;
    margin-bottom:16px;
}

/* Now a <button>, so the browser's own control styling has to be cleared. It
   was a div with a zoom cursor and no handler: a promise on desktop, silence
   on a phone. */
.pdp-gallery__zoom{
    display:block;
    width:100%;
    padding:0;
    border:0;
    background:none;
    overflow:hidden;
    cursor:zoom-in;
}

/* ==========================================
   FULL-SCREEN IMAGE VIEWER
========================================== */

/* The one surface where the photo is NOT cropped. Every grid and gallery box
   on the site crops to a fixed shape so cards stay uniform; this is where the
   customer gets the whole garment. Hence contain, and a max-height that leaves
   room for the close button and the counter rather than running under them. */
.pdp-lightbox{
    position:fixed;
    inset:0;
    z-index:100000;
    display:flex;
    align-items:center;
    justify-content:center;
    gap:8px;
    padding:16px;
    background:rgba(10,10,10,.94);
}

.pdp-lightbox[hidden]{
    display:none;
}

.pdp-lightbox__img{
    max-width:100%;
    max-height:calc(100vh - 120px);
    object-fit:contain;
    /* Never upscale past the file's own pixels — a 1025px-wide shot blown up
       to a 1440px viewport looks soft, and soft reads as cheap on a garment. */
    width:auto;
    height:auto;
}

.pdp-lightbox__close{
    position:absolute;
    top:12px;
    right:12px;
    width:44px;
    height:44px;
    display:inline-flex;
    align-items:center;
    justify-content:center;
    border:0;
    border-radius:999px;
    background:rgba(255,255,255,.12);
    color:#fff;
    font-size:1.1rem;
    line-height:1;
    cursor:pointer;
}

.pdp-lightbox__close:hover,
.pdp-lightbox__close:focus-visible{
    background:rgba(255,255,255,.24);
}

/* 44px minimum, and pinned to the edges rather than floating beside the photo,
   so they stay in the same place whatever shape the image is. */
.pdp-lightbox__nav{
    position:absolute;
    top:50%;
    transform:translateY(-50%);
    width:44px;
    height:44px;
    display:inline-flex;
    align-items:center;
    justify-content:center;
    border:0;
    border-radius:999px;
    background:rgba(255,255,255,.12);
    color:#fff;
    font-size:1.8rem;
    line-height:1;
    cursor:pointer;
}

.pdp-lightbox__nav:hover,
.pdp-lightbox__nav:focus-visible{
    background:rgba(255,255,255,.24);
}

.pdp-lightbox__nav--prev{ left:12px; }
.pdp-lightbox__nav--next{ right:12px; }

.pdp-lightbox__nav[hidden]{ display:none; }

.pdp-lightbox__count{
    position:absolute;
    bottom:18px;
    left:0;
    right:0;
    text-align:center;
    color:rgba(255,255,255,.75);
    font-size:.8rem;
    letter-spacing:.12em;
    margin:0;
}

/* Freezes the page under the overlay. Without it iOS scrolls the product page
   behind the viewer while the customer swipes between photos. */
body.pdp-lightbox-open{
    overflow:hidden;
}

/* Same fixed-box treatment as the product cards, and for the same reason. This
   is the frame the client screenshotted: a 1025x1534 shot inside a 520px-tall
   contain box drew roughly a fifth of the panel with dead space above and
   below it, which is what "the picture is tiny" meant.

   Cover against a fixed ratio fills the frame. Nothing is distorted, the crop
   is top-anchored, and the whole uncropped garment is one tap away in the
   full-screen viewer, which is now the point of that control. */
.pdp-gallery__main-img{
    width:100%;
    aspect-ratio:3/4;
    height:auto;
    object-fit:cover;
    object-position:top center;
    display:block;
    transition:transform .3s ease, opacity .2s ease;
}

/* A landscape image inside the portrait gallery box. Set by product.js once
   the file has decoded, because CSS cannot read an image's proportions.

   contain instead of cover, so a wide composite is shown whole rather than
   cropped to a vertical strip through its middle. The box keeps its 3:4 shape
   so nothing moves on the page; the picture simply sits inside it with the
   card colour above and below, and that colour matches the card exactly so it
   reads as space rather than as letterboxing.

   object-position centres it, overriding the top anchoring that exists for
   portrait garment shots, where the hem is the right thing to lose. A wide
   composite has nothing spare at either edge. */
.pdp-gallery__main-img--wide{
    object-fit:contain;
    object-position:center center;
}

.pdp-gallery__main-img--fade{
    opacity:.4;
}

.pdp-gallery__thumbs{
    display:flex;
    gap:12px;
    flex-wrap:wrap;
}

.pdp-gallery__thumb{
    width:80px;
    height:80px;
    border:2px solid transparent;
    border-radius:12px;
    overflow:hidden;
    cursor:pointer;
    background:#F1EFE8;
    padding:0;
    transition:.3s ease;
}

.pdp-gallery__thumb img{
    width:100%;
    height:100%;
    object-fit:contain;
}

.pdp-gallery__thumb--active{
    border-color:#131313;
}

.pdp-info__category{
    display:inline-block;
    font-size:.75rem;
    letter-spacing:3px;
    text-transform:uppercase;
    color:#707070;
    font-weight:700;
    margin-bottom:12px;
}

.pdp-info__name{
    font-size:2.5rem;
    font-weight:900;
    letter-spacing:-1px;
    line-height:1.1;
    text-transform:uppercase;
    margin-bottom:20px;
}

.pdp-info__pricing{
    display:flex;
    align-items:center;
    gap:14px;
    flex-wrap:wrap;
    margin-bottom:24px;
}

.pdp-info__price{
    font-size:1.8rem;
    font-weight:900;
}

.pdp-info__original{
    font-size:1.1rem;
    color:#707070;
    text-decoration:line-through;
}

.pdp-info__discount{
    background:#131313;
    color:#F1EFE8;
    padding:6px 14px;
    font-size:.75rem;
    font-weight:800;
    border-radius:999px;
}

.pdp-info__desc{
    color:#555;
    line-height:1.7;
    margin-bottom:30px;
    max-width:520px;
}

.pdp-info__label{
    display:block;
    font-size:.8rem;
    font-weight:800;
    letter-spacing:2px;
    text-transform:uppercase;
    margin-bottom:12px;
}

.pdp-info__color{
    margin-bottom:22px;
}

.color-selector{
    display:flex;
    flex-wrap:wrap;
    gap:10px;
}

.color-selector__btn{
    display:inline-flex;
    align-items:center;
    gap:8px;
    padding:10px 16px;
    border:1px solid #d9d4ca;
    background:transparent;
    font-weight:700;
    font-size:.85rem;
    cursor:pointer;
    transition:.3s ease;
}

.color-selector__btn:hover{
    border-color:#131313;
}

.color-selector__btn--active{
    background:#131313;
    color:#F1EFE8;
    border-color:#131313;
}

.color-selector__swatch{
    width:14px;
    height:14px;
    border-radius:50%;
    border:1px solid rgba(0,0,0,.25);
    display:inline-block;
}

.color-selector__btn--disabled{
    opacity:.35;
    cursor:not-allowed;
    text-decoration:line-through;
}

.size-selector{
    display:flex;
    flex-wrap:wrap;
    gap:10px;
    margin-bottom:8px;
}

.size-selector__btn{
    min-width:52px;
    padding:12px 18px;
    border:1px solid #d9d4ca;
    background:transparent;
    font-weight:700;
    font-size:.9rem;
    cursor:pointer;
    transition:.3s ease;
}

.size-selector__btn:hover{
    border-color:#131313;
}

.size-selector__btn--active{
    background:#131313;
    color:#F1EFE8;
    border-color:#131313;
}

.size-error{
    color:#c0392b;
    font-size:.85rem;
    margin-top:8px;
    display:none;
}

.size-error.visible{
    display:block;
}

.pdp-info__quantity{
    margin:24px 0;
}

.quantity-selector{
    display:inline-flex;
    align-items:center;
    border:1px solid #d9d4ca;
}

.quantity-selector__btn{
    width:44px;
    height:44px;
    border:none;
    background:transparent;
    font-size:1.2rem;
    cursor:pointer;
    font-weight:700;
    transition:.2s;
}

.quantity-selector__btn:hover{
    background:#F1EFE8;
}

.quantity-selector__input{
    width:52px;
    height:44px;
    border:none;
    border-left:1px solid #d9d4ca;
    border-right:1px solid #d9d4ca;
    text-align:center;
    font-size:1rem;
    font-weight:700;
    -moz-appearance:textfield;
}

.quantity-selector__input::-webkit-outer-spin-button,
.quantity-selector__input::-webkit-inner-spin-button{
    -webkit-appearance:none;
    margin:0;
}

.pdp-info__actions{
    margin:30px 0;
    display:flex;
    flex-direction:column;
    gap:12px;
}

.pdp-btn{
    display:inline-block;
    border:none;
    cursor:pointer;
    font-family:inherit;
    width:100%;
    max-width:400px;
    text-align:center;
}

.pdp-features{
    margin:30px 0;
    padding:24px;
    background:#F1EFE8;
    border-radius:16px;
}

.pdp-features__title{
    font-size:.85rem;
    letter-spacing:2px;
    text-transform:uppercase;
    margin-bottom:16px;
    font-weight:800;
}

.pdp-features__list{
    list-style:none;
    display:grid;
    gap:10px;
}

.pdp-features__list li{
    padding-left:20px;
    position:relative;
    color:#555;
    font-size:.95rem;
}

.pdp-features__list li::before{
    content:"•";
    position:absolute;
    left:0;
    color:#131313;
    font-weight:900;
}

.pdp-accordion{
    border-top:1px solid #d9d4ca;
}

.pdp-accordion__item{
    border-bottom:1px solid #d9d4ca;
}

.pdp-accordion__header{
    width:100%;
    display:flex;
    justify-content:space-between;
    align-items:center;
    padding:20px 0;
    background:none;
    border:none;
    cursor:pointer;
    font-family:inherit;
    font-size:.85rem;
    font-weight:800;
    letter-spacing:2px;
    text-transform:uppercase;
}

.pdp-accordion__icon{
    font-size:1.2rem;
    transition:.3s;
}

.pdp-accordion__item--open .pdp-accordion__icon{
    transform:rotate(45deg);
}

.pdp-accordion__body{
    max-height:0;
    overflow:hidden;
    transition:max-height .35s ease;
}

.pdp-accordion__item--open .pdp-accordion__body{
    max-height:500px;
    padding-bottom:20px;
}

.pdp-accordion__body p{
    color:#555;
    line-height:1.7;
}

.specs-table{
    width:100%;
    border-collapse:collapse;
}

.specs-table td{
    padding:10px 0;
    border-bottom:1px solid #eee;
    font-size:.9rem;
}

.specs-table td:first-child{
    color:#707070;
    width:40%;
    text-transform:capitalize;
}

.pdp-related{
    padding-top:80px;
}

/* =========================
   TOAST NOTIFICATION
========================= */

.toast{
    position:fixed;
    bottom:30px;
    left:50%;
    transform:translateX(-50%) translateY(20px);
    background:#131313;
    color:#F1EFE8;
    padding:14px 28px;
    font-size:.9rem;
    font-weight:700;
    border-radius:999px;
    z-index:99999;
    opacity:0;
    transition:opacity .35s ease, transform .35s ease;
    pointer-events:none;
}

.toast--visible{
    opacity:1;
    transform:translateX(-50%) translateY(0);
}

@media(max-width:576px){

    .pdp-info__name{
        font-size:1.8rem;
    }

    /* height:360px removed. The base rule is ratio-based now, so a fixed
       height here would fight it and bring back the letterboxing this change
       exists to remove. */

    .category-banner__overlay h1{
        font-size:2.5rem;
    }

    .hero-overlay{
        padding:60px 30px;
    }

}

/* =========================
   INTEGRATION — CART, SEARCH, AUTH
========================= */

.page-hero{
    padding:60px 5% 30px;
    text-align:center;
}

.nav-search{
    display:flex;
    align-items:center;
    background:#f1efe8;
    border-radius:999px;
    padding:4px 12px;
}

.nav-search input{
    border:none;
    background:transparent;
    font-size:.85rem;
    width:120px;
    outline:none;
}

.nav-search button{
    border:none;
    background:transparent;
    cursor:pointer;
}

.nav-icon-link{
    position:relative;
}

.nav-badge{
    position:absolute;
    top:-6px;
    right:-8px;
    background:#131313;
    color:#f1efe8;
    font-size:.65rem;
    font-weight:800;
    min-width:18px;
    height:18px;
    border-radius:999px;
    align-items:center;
    justify-content:center;
    padding:0 4px;
}

.filter-chips{
    display:flex;
    flex-wrap:wrap;
    gap:12px;
    margin:0 auto 34px;
    padding:0 5%;
    max-width:1400px;
}

.filter-chip{
    padding:11px 18px;
    border:1px solid rgba(241,239,232,.38);
    border-radius:999px;
    background:#1d1d1d;
    color:#fff;
    font-size:.8rem;
    font-weight:700;
    letter-spacing:0;
    text-decoration:none;
    transition:background .2s ease, border-color .2s ease, color .2s ease, transform .2s ease;
}

.filter-chip:hover,
.filter-chip--active{
    background:#000;
    color:#fff;
    border-color:#000;
    transform:translateY(-1px);
}

.shop-filters,
.search-form{
    display:flex;
    gap:12px;
    flex-wrap:wrap;
    padding:20px 5%;
    align-items:center;
    justify-content:center;
}

.shop-filters{
    gap:14px;
    padding:24px 5% 34px;
}

.search-form{
    gap:16px;
    padding:34px 5% 36px;
}

.shop-filters input,
.shop-filters select,
.search-form input,
.auth-form input,
.checkout-form input,
.checkout-form select,
.form-row input,
.form-row select{
    padding:12px 16px;
    border:1px solid #d9d4ca;
    font-family:inherit;
    min-width:200px;
}

.shop-filters__control,
.search-form__control{
    width:280px;
    height:48px;
    border-radius:12px;
    background:#fff;
    color:#131313;
    outline:none;
    transition:border-color .2s ease, box-shadow .2s ease;
}

.shop-filters__control:focus,
.search-form__control:focus{
    border-color:#131313;
    box-shadow:0 0 0 3px rgba(19,19,19,.08);
}

.shop-filters__button,
.search-form__button{
    margin-top:0;
    height:48px;
    min-width:130px;
    border-radius:12px;
    display:inline-flex;
    align-items:center;
    justify-content:center;
    padding:0 24px;
    border:2px solid #131313;
    line-height:1;
}

.hero-btn--sm{
    padding:10px 20px;
    font-size:.8rem;
}

.hero-btn--outline{
    background:transparent;
    color:#131313;
    border:2px solid #131313;
}

.cart-section{
    padding:40px 5% 80px;
    max-width:900px;
    margin:0 auto;
}

.cart-item{
    display:flex;
    gap:20px;
    align-items:center;
    padding:20px 0;
    border-bottom:1px solid #eee;
}

.cart-item__img{
    width:80px;
    height:80px;
    object-fit:contain;
    background:#f1efe8;
    border-radius:12px;
}

.cart-item__info{
    flex:1;
}

.cart-item__actions{
    display:flex;
    gap:8px;
    flex-wrap:wrap;
}

.cart-summary{
    padding:24px 0;
    font-size:1.1rem;
}

.checkout-form,
.auth-form{
    max-width:480px;
    margin:30px auto;
    padding:30px;
    background:#f1efe8;
    border-radius:16px;
}

.checkout-form.hidden{
    display:none;
}

.form-row{
    margin-bottom:16px;
}

.form-row label{
    display:block;
    font-size:.8rem;
    font-weight:700;
    letter-spacing:1px;
    margin-bottom:6px;
}

.form-row--grid{
    display:grid;
    grid-template-columns:1fr 1fr;
    gap:12px;
}

.alert{
    padding:16px 20px;
    margin:20px 5%;
    border-radius:12px;
    max-width:900px;
    margin-left:auto;
    margin-right:auto;
}

.alert--success{
    background:#e8f5e9;
    border:1px solid #30d158;
    color:#1a5c2e;
}

.alert--error{
    background:#fdecea;
    border:1px solid #ff453a;
    color:#8b1a12;
}

.auth-section{
    padding:40px 5% 80px;
    max-width:520px;
    margin:0 auto;
}

.auth-switch{
    text-align:center;
    margin-top:20px;
    color:#666;
}

.auth-luxury{
    min-height:calc(100vh - 120px);
    display:grid;
    grid-template-columns:minmax(0,1.08fr) minmax(420px,.92fr);
    background:#0f0f0f;
}

.auth-luxury__visual{
    position:relative;
    min-height:720px;
    overflow:hidden;
}

.auth-luxury__visual img{
    width:100%;
    height:100%;
    object-fit:cover;
    display:block;
    filter:saturate(.95) contrast(1.04);
}

.auth-luxury__visual::after{
    content:"";
    position:absolute;
    inset:0;
    background:linear-gradient(90deg,rgba(0,0,0,.76) 0%,rgba(0,0,0,.35) 48%,rgba(0,0,0,.1) 100%);
}

.auth-luxury__overlay{
    position:absolute;
    left:8%;
    bottom:10%;
    max-width:520px;
    color:#fff;
    z-index:2;
}

.auth-luxury__overlay span,
.auth-card__header span{
    display:block;
    color:#c8b89a;
    font-size:.72rem;
    letter-spacing:4px;
    font-weight:900;
    margin-bottom:16px;
}

.auth-luxury__overlay h1{
    color:#fff;
    font-size:clamp(3rem,5vw,6rem);
    line-height:.92;
    letter-spacing:0;
    margin-bottom:18px;
    text-transform:uppercase;
}

.auth-luxury__overlay p{
    color:rgba(255,255,255,.82);
    font-size:1rem;
    line-height:1.7;
    max-width:360px;
}

.auth-luxury__panel{
    display:flex;
    align-items:center;
    justify-content:center;
    padding:64px 5%;
    background:radial-gradient(circle at top right,rgba(200,184,154,.12),transparent 34%),#111;
}

.auth-card{
    width:min(100%,470px);
    padding:42px;
    border-radius:24px;
    background:rgba(241,239,232,.92);
    border:1px solid rgba(255,255,255,.5);
    box-shadow:0 30px 80px rgba(0,0,0,.36);
    backdrop-filter:blur(18px);
}

.auth-card__header{
    margin-bottom:28px;
}

.auth-card__header h2{
    color:#0f0f0f;
    font-size:2.65rem;
    line-height:1;
    letter-spacing:0;
    text-transform:uppercase;
    margin-bottom:12px;
}

.auth-card__header p{
    color:#68635b;
    line-height:1.65;
    font-size:.94rem;
}

.auth-form--luxury{
    max-width:none;
    margin:0;
    padding:0;
    background:transparent;
    border-radius:0;
}

.form-row--luxury{
    margin-bottom:18px;
}

.form-row--luxury label{
    color:#1b1b1b;
    font-size:.72rem;
    letter-spacing:2px;
    text-transform:uppercase;
    margin-bottom:8px;
}

.form-row--luxury input{
    width:100%;
    min-width:0;
    height:52px;
    padding:0 16px;
    border-radius:12px;
    border:1px solid rgba(19,19,19,.18);
    background:rgba(255,255,255,.72);
    color:#111;
    outline:none;
    font-size:.95rem;
    transition:border-color .24s ease, box-shadow .24s ease, transform .24s ease, background .24s ease;
}

.form-row--luxury input:focus{
    border-color:#111;
    background:#fff;
    box-shadow:0 0 0 4px rgba(19,19,19,.08);
    transform:translateY(-1px);
}

.auth-submit{
    width:100%;
    height:54px;
    margin-top:6px;
    border:0;
    border-radius:12px;
    background:#050505;
    color:#fff;
    font-family:inherit;
    font-weight:900;
    letter-spacing:1.2px;
    cursor:pointer;
    transition:transform .25s ease, box-shadow .25s ease, background .25s ease;
}

.auth-submit:hover{
    transform:translateY(-2px);
    box-shadow:0 14px 28px rgba(0,0,0,.24);
    background:#000;
}

.auth-switch--luxury{
    margin-top:24px;
    color:#6d675e;
    font-size:.92rem;
}

.auth-switch--luxury a{
    color:#0f0f0f;
    font-weight:900;
    text-decoration:none;
    border-bottom:1px solid currentColor;
}

.auth-card .alert{
    margin:0 0 20px;
    max-width:none;
}

.account-section,
.account-actions{
    padding:40px 5%;
    text-align:center;
}

.account-actions{
    display:flex;
    gap:12px;
    justify-content:center;
    flex-wrap:wrap;
}

.size-selector__btn--disabled{
    opacity:.35;
    cursor:not-allowed;
}

.out-of-stock-msg{
    color:#c0392b;
    font-weight:700;
    padding:16px;
    background:#fdecea;
    border-radius:8px;
}

.search-results-count{
    padding:0 5% 20px;
    color:#666;
}

.track-hint{
    text-align:center;
    margin-top:20px;
    color:#555;
}

.wishlist-remove{
    margin-top:8px;
    background:transparent;
    border:1px solid #131313;
    color:#131313;
    cursor:pointer;
    transition:.3s ease;
}

.wishlist-remove:hover{
    background:#e11d48;
    border-color:#e11d48;
    color:#ffffff;
}

@media(max-width:768px){
    .nav-search{
        display:none;
    }

    .form-row--grid{
        grid-template-columns:1fr;
    }
}

@media(max-width:900px){
    .auth-luxury{
        grid-template-columns:1fr;
    }

    .auth-luxury__visual{
        min-height:420px;
    }

    .auth-luxury__panel{
        padding:42px 5% 68px;
    }
}

@media(max-width:576px){
    .oversized-collections{
        padding:44px 0 58px;
    }

    .oversized-collections .section-heading{
        padding:0 5%;
    }

    .category-grid--home{
        display:flex;
        /* Must be reset here. The desktop rule centres the row, and a centred
           flex container whose content overflows pushes half the overflow off
           the START edge, which scrollLeft clamps at 0 and can never reach.
           Measured at 390px: the first card sat at x=-219 with 47 of its 267px
           visible, and no scroll position in either direction revealed the
           rest. Centring and a start-clamped scroller are incompatible. */
        justify-content:flex-start;
        overflow-x:auto;
        gap:14px;
        padding:4px 5% 18px;
        margin:34px 0 0;
        scroll-snap-type:x mandatory;
        -webkit-overflow-scrolling:touch;
    }

    .category-grid--home .category-card{
        flex:0 0 76%;
        min-height:360px;
        scroll-snap-align:start;
    }

    .category-grid--home .category-card img{
        min-height:360px;
        height:100%;
    }

    .auth-luxury__visual{
        min-height:360px;
    }

    .auth-luxury__overlay{
        left:6%;
        right:6%;
        bottom:9%;
    }

    .auth-card{
        padding:30px 22px;
        border-radius:20px;
    }

    .auth-card__header h2{
        font-size:2.2rem;
    }
}

/* =========================
   POLICIES / LEGAL / SOCIAL
========================= */
.footer-container--pro{
    /* Four columns since the Shop list was added. The footer had no route into
       the catalogue at all before that. */
    grid-template-columns:1.6fr 1fr 1fr 1.4fr;
}

/* The PDP's promises, repeated where a hesitant buyer is about to leave. */
.footer-trust{
    display:flex;
    flex-wrap:wrap;
    justify-content:center;
    gap:14px 34px;
    list-style:none;
    margin:0;
    padding:22px 5%;
    border-bottom:1px solid rgba(255,255,255,.1);
    font-size:.8rem;
    font-weight:700;
    letter-spacing:1px;
    text-transform:uppercase;
}

.footer-trust i{
    margin-right:6px;
    opacity:.65;
}

.footer-support-meta{
    margin-top:6px;
    font-size:.85rem;
    /* Muted and outside the list on purpose: as a sibling <li> this read as a
       link customers would try to tap. */
    color:rgba(241,239,232,.6);
}

/* Policy links demoted out of the column grid. They sat at the same weight as
   Contact Us, and made up a third of the stacked rows on mobile. */
.footer-legal{
    display:flex;
    flex-wrap:wrap;
    justify-content:center;
    gap:6px 22px;
    list-style:none;
    margin:12px 0 0;
    padding:0;
    font-size:.82rem;
}

.footer-legal a{
    color:rgba(241,239,232,.66);
}

.footer-legal a:hover{
    color:#F1EFE8;
}

.footer-social{
    display:flex;
    gap:10px;
    flex-wrap:wrap;
    margin-top:18px;
}

.footer-social a{
    border:1px solid rgba(241,239,232,.22);
    border-radius:999px;
    padding:8px 12px;
}

.policy-hero{
    padding:74px 5% 52px;
    background:#f1efe8;
    text-align:center;
}

.policy-hero__icon{
    width:64px;
    height:64px;
    border-radius:50%;
    margin:28px auto 18px;
    display:flex;
    align-items:center;
    justify-content:center;
    background:#131313;
    color:#f1efe8;
}

.policy-hero h1{
    font-size:clamp(2.8rem,6vw,5.6rem);
    line-height:.9;
    letter-spacing:0;
    text-transform:uppercase;
    margin:12px 0;
}

.policy-hero p{
    max-width:760px;
    margin:0 auto;
    color:#68635b;
    line-height:1.7;
}

.policy-updated{
    display:inline-flex;
    gap:8px;
    margin-top:22px;
    padding:10px 14px;
    border-radius:999px;
    background:#fff;
    font-weight:800;
}

.policy-layout{
    display:grid;
    grid-template-columns:280px minmax(0,1fr);
    gap:28px;
    padding:56px 5% 86px;
    background:#131313;
}

.policy-toc{
    position:sticky;
    top:22px;
    align-self:start;
    padding:22px;
    border-radius:18px;
    background:#1d1d1d;
}

.policy-toc h2{
    color:#f1efe8;
    font-size:1rem;
    margin-bottom:14px;
}

.policy-toc a{
    display:block;
    color:#aaa;
    text-decoration:none;
    padding:9px 0;
    border-bottom:1px solid rgba(255,255,255,.06);
}

.policy-content{
    display:grid;
    gap:18px;
}

.policy-card{
    padding:26px;
    border-radius:20px;
    background:#f1efe8;
    box-shadow:0 20px 44px rgba(0,0,0,.2);
}

.policy-card h2,
.policy-card summary{
    color:#111;
    font-size:1.3rem;
    font-weight:900;
    text-transform:uppercase;
    margin-bottom:14px;
}

.policy-card h2 i,
.policy-card summary i{
    margin-right:10px;
}

.policy-card p{
    white-space:pre-line;
    color:#504b44;
    line-height:1.8;
    margin-bottom:14px;
}

.policy-card summary{
    cursor:pointer;
    list-style:none;
    margin-bottom:0;
}

.policy-card[open] summary{
    margin-bottom:14px;
}

.shipping-info-grid{
    display:grid;
    grid-template-columns:repeat(4,1fr);
    gap:18px;
    padding:60px 5% 90px;
    background:#131313;
}

/* About / Contact / FAQ show three cards, not four. The 992px and 576px
   breakpoints below still apply, since the base class stays on the element. */
.shipping-info-grid--info{
    grid-template-columns:repeat(3,1fr);
}

.shipping-info-grid article{
    padding:26px;
    border-radius:20px;
    background:#f1efe8;
}

.shipping-info-grid i{
    font-size:1.6rem;
    margin-bottom:20px;
}

.shipping-info-grid span,
.shipping-info-grid strong{
    display:block;
}

.shipping-info-grid span{
    color:#777;
    font-weight:800;
    margin-bottom:8px;
}

.shipping-info-grid strong{
    font-size:1.35rem;
}

.checkout-policy-links,
.pdp-policy-strip{
    display:flex;
    flex-wrap:wrap;
    gap:10px;
    margin-top:16px;
}

.checkout-policy-links a,
.pdp-policy-strip a{
    color:#131313;
    border:1px solid #d9d4ca;
    border-radius:999px;
    padding:9px 12px;
    text-decoration:none;
    font-size:.78rem;
    font-weight:800;
    background:#fff;
}

.instagram-section{
    padding:74px 5% 90px;
    background:#f1efe8;
}

.instagram-grid{
    display:grid;
    grid-template-columns:repeat(4,1fr);
    gap:18px;
    max-width:1400px;
    margin:42px auto 0;
}

.instagram-card{
    position:relative;
    overflow:hidden;
    border-radius:18px;
    aspect-ratio:1;
    background:#ddd4c6;
    box-shadow:0 16px 34px rgba(19,19,19,.12);
}

.instagram-card img{
    width:100%;
    height:100%;
    object-fit:cover;
    transition:.45s ease;
}

.instagram-card span{
    position:absolute;
    inset:auto 16px 16px auto;
    width:42px;
    height:42px;
    display:flex;
    align-items:center;
    justify-content:center;
    border-radius:50%;
    background:#111;
    color:#fff;
}

.instagram-card:hover img{
    transform:scale(1.07);
}

.instagram-cta{
    display:flex;
    align-items:center;
    justify-content:center;
    gap:18px;
    margin-top:30px;
    flex-wrap:wrap;
}

@media(max-width:992px){
    .policy-layout,
    .shipping-info-grid,
    .instagram-grid{
        grid-template-columns:1fr 1fr;
    }

    .policy-toc{
        display:none;
    }
}

@media(max-width:576px){
    .policy-layout,
    .shipping-info-grid,
    .instagram-grid{
        grid-template-columns:1fr;
    }

    .footer-container--pro{
        grid-template-columns:1fr;
    }

    /* The trust strip and the legal row are the two footer blocks that are
       horizontal by default; both need to wrap tightly rather than stretch on
       a phone. */
    .footer-trust{
        gap:10px 20px;
        padding:18px 5%;
        font-size:.72rem;
    }

    .footer-legal{
        gap:4px 16px;
        font-size:.78rem;
    }
}


/* ==========================================
   LATE MOBILE OVERRIDES — read the note

   This stylesheet's mobile @media blocks sit in the MIDDLE of the file
   (~line 1160 onwards), and several component sections define their base
   rules AFTER them. Media queries add no specificity, so when a base rule
   further down the file uses the same selector, the base rule wins and the
   mobile override is silently dead. It still reads as present and correct
   in the mobile block, which is what makes it hard to spot.

   Two were found doing exactly that. They are restated here, at the end of
   the file, where nothing can outrank them by source order. Their originals
   have been left where they are so the mobile block still reads as a
   complete description of the phone layout.

   Anything added to a mobile block from now on: check whether the selector
   is redefined later in the file before assuming it applies.
========================================== */

@media(max-width:992px){

    /* THE ONE THAT MATTERED. `.pdp-layout` is declared `1fr 1fr` at ~line
       1459, after the mobile block that sets it to `1fr`, so the product
       page kept its DESKTOP two-column split on phones. Measured at a 390px
       viewport the columns computed to 80px + 267px, which squeezed the
       whole gallery — and the main product image with it — into an 80px
       strip beside the product info.

       This is what the client screenshotted and described as the picture
       being tiny. It was not the image sizing at all; the image was
       correctly filling a column that should never have existed. */
    .pdp-layout{
        grid-template-columns:1fr;
    }
}

@media(max-width:576px){

    /* `.search-form__button` sets `min-width:130px` at ~line 2135, after the
       mobile rule asking for `width:100%; min-width:0`. The width survived
       (the base rule does not declare it) but the min-width did not, so the
       button could not shrink below 130px and pushed the search row wide on
       the narrowest phones. */
    .search-form__control,
    .search-form__button{
        min-width:0;
    }

    /* Half-size banner artwork on phones. The hero is `cover` on a portrait
       screen, so a 16:9 banner is cropped to roughly its middle third whatever
       the file resolution is — sending 1920px of it to a 390px viewport spends
       bytes on pixels cropped away before anyone sees them. 38KB instead of
       138KB, on the connection least able to afford it.

       Written here rather than beside the other phone rules because
       `.hero-banner`'s own declaration sits further down the file and would
       otherwise win the tie. Verified served: at 390px the browser must
       request banner-mobile.webp, not banner.webp.

       Deliberately a smaller file, NOT a different crop. Deciding where to
       crop this artwork needs eyes on it, and vision tooling has been down for
       days. If the subject sits off-centre on a phone the fix is one
       `background-position` value here. */
    .hero-banner{
        background-image:image-set(
            url('/images/banner-mobile.webp') type('image/webp'),
            url('/images/banner-mobile.jpg') type('image/jpeg')
        );
    }

    /* Measured collision at 320px in the RESTING state: the wordmark's box
       ended at 197.59px and the account icon began at 196px, so two tappable
       things overlapped by 1.59px. Pre-existing, and separate from the
       scrolled-state bug fixed above — that one was found by scrolling, this
       one only shows at the narrowest supported width.

       The clamp's floor was doing it: 1.25rem is 20px, and at 320px there is
       no room for an 11-character wordmark at that size beside three 44px
       targets. Dropped to the same floor the scrolled state already uses and
       clears at, which measured -4.34px there. Still legible; the alternative
       is dropping another icon. */
    .logo a{
        font-size:clamp(1.15rem, 6vw, 1.7rem);
    }
}

/* ==========================================
   BUY ACTIONS — hierarchy, on the brand palette

   Both buttons were reported as reading wrongly: "Add to Cart appears greyed
   out/disabled while Buy Now is a vibrant pink". Both halves of that were true
   and had the same cause.

   Buy Now was #e11d48, hardcoded inline in five places across four views. That
   is Tailwind's rose-600 — a framework default, the same species of accident as
   the #2563eb blue found on the login page, sitting in a cream and near-black
   streetwear palette it has nothing to do with.

   Add to Cart inherits .hero-btn, which is #F1EFE8 cream on a cream page with
   no border. A button the same colour as its background and without an outline
   is exactly how a disabled control is drawn, so customers read it as inactive.
   It works fine; it just does not look like it does.

   The rule, applied consistently: the primary conversion action in a given
   context is SOLID near-black, and its companion is OUTLINED. The outline is
   the part that matters — it is what separates "secondary" from "disabled".

   Which action is primary depends on where you are, and that is deliberate:
   on a product card the customer cannot choose a size, so Buy Now is the
   conversion action and View is navigation. On the product page they have
   already chosen colour and size, so Add to Cart is the conversion action and
   Buy Now is a shortcut past the bag.
========================================== */

/* Product cards: BUY NOW is primary, VIEW is secondary. */
.product-btn.buy-now-btn{
    background:#131313;
    color:#F1EFE8;
    border:1px solid #131313;
}

.product-btn.buy-now-btn:hover{
    background:#2e2e2e;
    border-color:#2e2e2e;
}

.product-actions .product-btn:not(.buy-now-btn){
    background:transparent;
    color:#131313;
    border:1px solid #131313;
}

.product-actions .product-btn:not(.buy-now-btn):hover{
    background:#131313;
    color:#F1EFE8;
}

/* Product page: ADD TO CART is primary, BUY NOW is secondary. */
#addToCartBtn.pdp-btn{
    background:#131313;
    color:#F1EFE8;
    border:1px solid #131313;
}

#addToCartBtn.pdp-btn:hover{
    background:#2e2e2e;
    border-color:#2e2e2e;
}

/* The border is doing the work here. Without it this is cream on cream, which
   is the disabled-looking state the whole change exists to remove. */
#buyNowBtn.pdp-btn{
    background:transparent;
    color:#131313;
    border:1px solid #131313;
}

#buyNowBtn.pdp-btn:hover{
    background:#131313;
    color:#F1EFE8;
}
