/* =====================================================================
   FreshCart — Premium Grocery E-Commerce UI
   Design system + components. Bootstrap 5 is loaded before this file.
   ===================================================================== */

:root{
  /* Brand — defaults match the admin dashboard's own palette
     (admin_primary_color/admin_secondary_color in BusinessSettings.js) so
     an untouched install reads as one product across backend and
     storefront. Actual values are usually overridden per-request by the
     inline <style> block src/app/(storefront)/layout.js renders from
     Settings > Online Store > Branding — see storefrontThemeStyle() there. */
  --brand:#f97015;
  --brand-600:#d75d0d;
  --brand-700:#ad4a0a;
  --brand-100:#fce0cc;
  --brand-50:#fef0e4;
  --accent:#fbbd23;
  --accent-50:#fef6e1;
  --danger:#d64545;
  --warning:#e0a500;
  --info:#2b7fd4;
  --success:#21c45d;

  /* Neutrals */
  --ink:#434a5e;
  --ink-2:#3d4353;
  --muted:#6d7382;
  --line:#e6eae8;
  --surface:#ffffff;
  --surface-2:#f6f8f7;
  --surface-3:#eef1ef;

  /* Shape & motion */
  --r-sm:8px; --r-md:12px; --r-lg:16px; --r-xl:22px;
  --shadow-1:0 1px 2px rgba(16,32,24,.05);
  --shadow-2:0 6px 18px -6px rgba(16,32,24,.12);
  --shadow-3:0 18px 40px -18px rgba(16,32,24,.28);
  --t:200ms cubic-bezier(.4,0,.2,1);
  --container:1280px;
}

/* ---------- Dark mode ----------
   Toggled by src/lib/storefront/useStorefrontTheme.js setting
   [data-bs-theme="dark"] on <html> (the same attribute Bootstrap 5.3's own
   dark-mode component styles key off of, since Bootstrap is loaded ahead of
   this file — see the storefront layout). The brand/accent vars here are
   design-time fallbacks only; the per-tenant values actually used come from
   the dark block in storefrontThemeStyle() (src/app/(storefront)/layout.js),
   which recomputes them from the admin's chosen hex so custom branding
   still looks right in dark mode instead of reverting to these defaults. */
[data-bs-theme="dark"]{
  --brand:#fa8c42;
  --brand-600:#e06a17;
  --brand-700:#c2530e;
  --brand-100:#5a3216;
  --brand-50:#40230f;
  --accent:#fcc94f;
  --accent-50:#40320f;
  --danger:#e2696e;
  --warning:#f0b429;
  --info:#4f9ce0;
  --success:#4eda81;

  --ink:#eff1f5;
  --ink-2:#c7cdda;
  --muted:#8a94a8;
  --line:#262d40;
  --surface:#171b26;
  --surface-2:#12151f;
  --surface-3:#0d0f17;

  --shadow-1:0 1px 2px rgba(0,0,0,.3);
  --shadow-2:0 6px 18px -6px rgba(0,0,0,.45);
  --shadow-3:0 18px 40px -18px rgba(0,0,0,.6);
}

*{-webkit-tap-highlight-color:transparent}
html{scroll-behavior:smooth}
body{
  font-family:"Plus Jakarta Sans",system-ui,-apple-system,"Segoe UI",sans-serif;
  color:var(--ink); background:var(--surface); font-size:15px; line-height:1.55;
  -webkit-font-smoothing:antialiased;
}
h1,h2,h3,h4,h5,h6{font-weight:700; letter-spacing:-.02em; color:var(--ink); line-height:1.2}
h1{font-size:clamp(2rem,4vw,2.2rem); line-height:1.08}
h2{font-size:clamp(1.0rem,2.4vw,1.4rem)}
h3{font-size:1.11rem}
/* h1/h2 stay 800 for section-title impact; everything smaller steps down a
   weight so the hierarchy reads clearly instead of every heading shouting
   at the same volume. */
h3,h4,h5,h6{font-weight:700}
a{color:inherit; text-decoration:none; transition:color var(--t)}
a:hover{color:#434a5e}
p{color:var(--ink-2)}
.container-xxl{max-width:var(--container)}
.text-muted-2{color:var(--muted)!important}
.text-brand{color:var(--brand)!important}
.text-accent{color:var(--accent)!important}
.bg-soft{background:var(--surface-2)}
.bg-brand-50{background:var(--brand-50)}
.section{padding:72px 0}
.section-sm{padding:36px 0}
svg.swiper-navigation-icon{
  width: 10px;
}
button.btn.btn-cat-menu.my-2 {
    margin: 0 !important;
}
@media(max-width:767.98px){.section{padding:40px 0}}
.hr-line{border-top:1px solid var(--line)}

/* Focus visibility (accessibility) */
:focus-visible{outline:3px solid rgba(249,112,21,.45); outline-offset:2px; border-radius:6px}

/* ---------- Buttons ---------- */
/* Fully-rounded pill buttons throughout, matching the flatter reference look. */
.btn{--bs-btn-font-weight:700; border-radius:999px; transition:all var(--t); font-size:.92rem}
.btn-brand{background:var(--brand); border:1px solid var(--brand); color:#fff}
.btn-brand:hover,.btn-brand:focus{background:var(--brand-600); border-color:var(--brand-600); color:#fff; box-shadow:var(--shadow-2)}
.btn-outline-brand{border:1px solid var(--brand); color:var(--brand); background:transparent}
.btn-outline-brand:hover{background:var(--brand); color:#fff}
.btn-accent{background:var(--accent); border:1px solid var(--accent); color:#fff}
.btn-accent:hover{filter:brightness(.94); color:#fff}
.btn-ghost{background:var(--surface-2); border:1px solid var(--line); color:var(--ink)}
.btn-ghost:hover{background:var(--surface-3)}
/* Header "All Categories" trigger — plain neutral gray, not brand-colored
   (Storify's own header uses a flat gray pill for this, not the accent hue). */
.btn-cat-menu{border:1px solid var(--line); color:var(--ink); background:var(--surface-2)}
.btn-cat-menu:hover{background:var(--surface-3); color:var(--ink)}
.btn-lg{padding:.6rem 1.6rem; font-size:1rem; border-radius:999px}
.btn-icon{width:40px;height:40px;display:inline-flex;align-items:center;justify-content:center;padding:0;border-radius:10px}

/* ---------- Badges / chips ---------- */
.chip{display:inline-flex;align-items:center;gap:.35rem;font-size:.74rem;font-weight:700;
  padding:.28rem .6rem;border-radius:999px;background:var(--surface-2);color:var(--ink-2);border:1px solid var(--line)}
.chip-sale{background:var(--danger);color:#fff;border-color:transparent}
.chip-new{background:var(--brand);color:#fff;border-color:transparent}
.chip-best{background:var(--accent);color:#fff;border-color:transparent}
.chip-organic{background:var(--brand-50);color:var(--brand-700);border-color:var(--brand-100)}
.status-dot{width:8px;height:8px;border-radius:50%;display:inline-block}

.status-pill{font-size:.74rem;font-weight:700;padding:.3rem .65rem;border-radius:999px;display:inline-flex;gap:.35rem;align-items:center}
.st-pending{background:#fff6e0;color:#9a6b00}
.st-confirmed{background:#e6f1fb;color:#1a5f9e}
.st-processing{background:#eae7fb;color:#4a3fae}
.st-shipped{background:#e4f4ee;color:#0f6237}
.st-delivered{background:var(--success);color:#fff}
.st-cancelled{background:#fbe7e7;color:#a52929}
.st-paid{background:#e4f4ee;color:#0f6237}
.st-unpaid{background:#fbe7e7;color:#a52929}
[data-bs-theme="dark"] .st-pending{background:#3a2e0d;color:#f0c33d}
[data-bs-theme="dark"] .st-confirmed{background:#12293d;color:#6fb3ee}
[data-bs-theme="dark"] .st-processing{background:#251f42;color:#b6a6f7}
[data-bs-theme="dark"] .st-shipped{background:#0f2b20;color:#5fd7a3}
[data-bs-theme="dark"] .st-cancelled{background:#3a1717;color:#f19a9a}
[data-bs-theme="dark"] .st-paid{background:#0f2b20;color:#5fd7a3}
[data-bs-theme="dark"] .st-unpaid{background:#3a1717;color:#f19a9a}

/* ---------- Announcement bar ---------- */
.announce{background:var(--brand-700);color:#fff;font-size:.82rem}
.announce a{color:#fff;text-decoration:underline;text-underline-offset:2px}
.announce .bi{color:var(--accent)}

/* ---------- Header ---------- */
.site-header{background:var(--surface);border-bottom:1px solid var(--line);position:sticky;top:0;z-index:1030;transition:box-shadow var(--t)}
.site-header.is-stuck{box-shadow:var(--shadow-2)}
.brand-logo{display:inline-flex;align-items:center;gap:.55rem;font-weight:800;font-size:1.28rem;letter-spacing:-.03em}
.brand-logo .mark{width:38px;height:38px;border-radius:11px;background:var(--brand);color:#fff;display:grid;place-items:center;font-size:1.15rem}
.brand-logo span b{color:var(--brand)}
.search-wrap{position:relative;flex:1;}
.search-wrap .form-control{border-radius:12px;border:1px solid var(--line);background:var(--surface-2);padding:.7rem 2.6rem .7rem 2.4rem;font-size:.9rem}
.search-wrap .form-control:focus{background:var(--surface);border-color:var(--brand);box-shadow:0 0 0 3px rgba(249,112,21,.12)}
.search-wrap .bi-search{position:absolute;left:.85rem;top:50%;transform:translateY(-50%);color:var(--muted)}
.suggestions{position:absolute;top:calc(100% + 6px);left:0;right:0;background:var(--surface);border:1px solid var(--line);
  border-radius:var(--r-md);box-shadow:var(--shadow-3);z-index:60;overflow:hidden;display:none}
.suggestions.show{display:block}
.suggestions a{display:flex;gap:.7rem;align-items:center;padding:.55rem .8rem;border-bottom:1px solid var(--surface-2)}
.suggestions a:hover{background:var(--surface-2)}
.suggestions img{width:38px;height:38px;object-fit:cover;border-radius:8px}
.icon-btn{position:relative;width:35px;height:35px;border-radius:12px;border:0;background:transparent;
  display:inline-grid;place-items:center;font-size:1.25rem;color:var(--ink);transition:all var(--t)}
.icon-btn:hover{color:var(--brand);transform:translateY(-1px)}
.icon-btn .count{position:absolute;top:-6px;right:-6px;min-width:19px;height:19px;padding:0 5px;border-radius:999px;
  background:var(--accent);color:#fff;font-size:.68rem;font-weight:800;display:grid;place-items:center}
.icon-btn.pop{animation:pop .4s ease}
@keyframes pop{0%{transform:scale(1)}45%{transform:scale(1.18)}100%{transform:scale(1)}}
.nav-utility.d-flex.align-items-center.gap-4 .btn{
  font-size: .9rem;
}
.form-check-input[type=checkbox]:focus{
  box-shadow: none;
  outline: none;
}
.offcanvas{
  color: var(--ink);
  font-size: 14px;
}
input[type="number"]:focus-visible{
  box-shadow: none;
  outline: none!important;
}
.hero-bg {
    border-radius: 20px;
    overflow: hidden;
}
.accordion.accordion-flush .accordion-item .accordion-button {
    padding-left: 0;
    font-weight: 400;
    font-size: 14px;
    background: none;
    color: var(--ink);
    ;
}
.accordion-button:focus{
  box-shadow: none!important;
}
.accordion-body.small {
    padding-left: 0;
    font-size: inherit;
    padding-top: 0;
    font-family: var(--font-heading)!important;
    font-size: 14px!important;
}
/* Signed-in account trigger/menu — header equivalent of the admin
   dashboard's TopBar user dropdown (avatar + name + role/email header +
   Logout), replacing the plain bare person icon a logged-in customer used
   to get (which was indistinguishable from being signed out). */
.acct-trigger{display:inline-flex;align-items:center;border:0;background:transparent;padding:0;border-radius:50%;transition:transform var(--t)}
.acct-trigger:hover{transform:translateY(-1px)}
.acct-avatar{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:30px;height:30px;border-radius:50%;
  background:var(--brand);color:#fff;font-weight:700;font-size:.72rem}
.acct-avatar-lg{width:40px;height:40px;font-size:.85rem}
.acct-menu-head{display:flex;align-items:center;gap:.65rem;padding:.5rem .6rem .7rem}
.mainnav{border-top:1px solid var(--line)}
.mainnav .nav-link{font-weight:600;font-size:.9rem;color:var(--ink);padding:.85rem 0;position:relative}
.mainnav .nav-link:hover{color:var(--brand)}
/* Small muted utility links on the far right of the menu row (track order,
   branch, phone) — same slot Storify uses for Track Order/Blog/Contact Us. */
.nav-utility{font-size:.9rem; color:var(--muted);white-space:nowrap}
.nav-utility a,.nav-utility button{color:var(--ink);font-weight:600;transition:color var(--t)}
.nav-utility a:hover,.nav-utility button:hover{color:var(--brand)}
.megamenu{border:1px solid var(--line);border-radius:var(--r-lg);box-shadow:var(--shadow-3);padding:1.25rem;min-width:720px}
.megamenu .mm-item{display:flex;gap:.7rem;align-items:center;padding:.5rem;border-radius:10px;transition:background var(--t)}
.megamenu .mm-item:hover{background:var(--brand-50)}
.megamenu .mm-item img{width:44px;height:44px;border-radius:9px;object-fit:cover}
.megamenu .mm-item small{color:var(--muted)}
/* Bootstrap's own --bs-dropdown-bg/color (a generic gray, not this theme's
   --surface) otherwise wins in dark mode, since nothing here overrode it —
   the category megamenu, language switcher, and account menu all share this
   class, so this fixes the panel-doesn't-match-the-page look on all three. */
.dropdown-menu{border:1px solid var(--line);border-radius:var(--r-md);box-shadow:var(--shadow-3);font-size:.9rem;background:var(--surface);color:var(--ink)}

/* Mobile bottom bar */
.mobile-bar{position:fixed;left:0;right:0;bottom:0;z-index:1040;background:var(--surface);border-top:1px solid var(--line);
  display:none;padding:.35rem .25rem env(safe-area-inset-bottom)}
.mobile-bar a,.mobile-bar button{flex:1;text-align:center;font-size:.68rem;font-weight:700;color:var(--muted);padding:.35rem 0;
  position:relative;border:0;background:transparent;font-family:inherit}
.mobile-bar a .bi,.mobile-bar button .bi{display:block;font-size:1.2rem;color:var(--ink)}
.mobile-bar a.active,.mobile-bar a.active .bi{color:var(--brand)}
.mobile-bar .count{position:absolute;top:-2px;right:24%;background:var(--accent);color:#fff;font-size:.6rem;font-weight:800;
  border-radius:999px;min-width:16px;padding:0 4px}
@media(max-width:991.98px){.mobile-bar{display:flex} body{padding-bottom:62px}}

/* ---------- Hero slider ---------- */
/* Inset rounded banner (not full-bleed) — padding on .hero pulls the slider
   in from the viewport edges, and the radius+overflow-hidden on the Swiper
   root (not .hero itself) clips the sliding images to that shape. */
.hero{position:relative;background:var(--surface);padding:20px clamp(16px,4vw,40px) 4px}
.heroSwiper{border-radius:var(--r-xl);overflow:hidden}
/* A fixed height, not min-height — Swiper only takes slides out of flow
   (position:absolute) once a slide is dragged/active; the others still sit
   in the wrapper's flex row with their own natural content height. With
   min-height, a slide whose text/badge/buttons are shorter than a sibling
   slide's stays at its own shorter height while the wrapper still grows to
   match the tallest slide — stranding the pagination dots and everything
   below the hero in a gap under whichever slide happens to be short. A
   fixed height makes every slide (and the wrapper) the same size regardless
   of how much text a given slide has. */
.hero .swiper-slide{position:relative;height:450px;display:flex;align-items:center;overflow:hidden}
@media(max-width:767.98px){.hero .swiper-slide{height:280px}
.page-head{
  padding: 40px 0;
}
}
@media(max-width:547px){
.page-head{
  padding: 40px 0;
}
.toolbar .d-flex.gap-2.align-items-center {
    width: 100%;
    min-width: 100%;
}
.toolbar .d-flex.gap-2.align-items-center .select-menu {
    display: block;
    width: 100%;
}
button.select-menu-trigger {
    width: 100%;
}
}
.hero-bg{position:absolute;inset:0}
.hero-bg img{width:100%;height:100%;object-fit:cover}
.hero-bg::after{content:"";position:absolute;inset:0;background:linear-gradient(90deg,rgba(11,16,30,.88) 0%,rgba(11,16,30,.62) 45%,rgba(11,16,30,.15) 100%)}
/* .hero-content's badge/heading/text are white for legibility over a photo
   (the gradient above) — a slide with no background image has no dark
   overlay to sit on top of, so it gets this brand-gradient backdrop of its
   own instead, keeping that same white text readable rather than invisible
   against .hero's plain, light background. */
.hero-fallback-bg{background:linear-gradient(135deg,var(--brand) 0%,var(--brand-700) 100%)}
@media(max-width:767.98px){.hero-bg::after{background:linear-gradient(180deg,rgba(11,16,30,.55),rgba(11,16,30,.88))}}
.hero-content{position:relative;z-index:2;color:#fff;max-width:560px;padding:36px 0}
.hero-content h1,.hero-content p{color:#fff}
.hero-content p{color:rgba(255,255,255,.85);font-size:1.05rem}
.hero-badge{display:inline-flex;align-items:center;gap:.45rem;background:var(--accent);color:#fff;font-weight:800;
  font-size:.76rem;letter-spacing:.06em;text-transform:uppercase;padding:.4rem .8rem;border-radius:999px}
.hero .swiper-slide-active .anim{animation:heroIn .7s both}
.hero .swiper-slide-active .anim:nth-child(2){animation-delay:.1s}
.hero .swiper-slide-active .anim:nth-child(3){animation-delay:.2s}
.hero .swiper-slide-active .anim:nth-child(4){animation-delay:.3s}
@keyframes heroIn{from{opacity:0;transform:translateY(22px)}to{opacity:1;transform:none}}
.hero .swiper-button-next,.hero .swiper-button-prev{width:46px; display:none;height:46px;border-radius:50%;background:rgba(255,255,255,.16);
  backdrop-filter:blur(6px);color:#fff;border:1px solid rgba(255,255,255,.3)}
.hero .swiper-button-next::after,.hero .swiper-button-prev::after{font-size:1rem;font-weight:900}
.hero .swiper-pagination-bullet{background:#fff;opacity:.45;width:22px;height:4px;border-radius:2px;transition:all var(--t)}
.hero .swiper-pagination-bullet-active{opacity:1;width:34px;background:var(--accent)}
.button_groups button.opt-card.d-flex.gap-3.align-items-center.text-start {
    padding: 10px 15px;
}
/* ---------- Cards / sections ---------- */
.section-head{display:flex;align-items:flex-end;justify-content:space-between;gap:1rem;margin-bottom:2rem}
.section-head .eyebrow{display:inline-block;margin-bottom:.4rem;font-size:.76rem;font-weight:800;letter-spacing:.1em;text-transform:uppercase;color:var(--muted)}
.section-head p{margin:0;color:var(--muted);font-size:.92rem}
.select-menu.w-100 button.select-menu-trigger {
    width: 100%;
    justify-content: space-between;
}
/* Flat circular category icon + label — no card shape at all, just the
   round photo and a caption underneath. */
.cat-card{display:flex;flex-direction:column;align-items:center;border:0;background:transparent;padding:0;text-align:center;
  box-shadow:none;transition:transform var(--t)}
.cat-card:hover{transform:translateY(-3px);box-shadow:none;border-color:transparent}
.cat-card .thumb{border-radius:50%;overflow:hidden;aspect-ratio:1/1;width:144px;max-width:100%;background:var(--surface-2);
  box-shadow:0 1px 4px rgba(16,32,24,.08)}
.cat-card img{width:100%;height:100%;object-fit:cover;transition:transform 420ms ease}
.cat-card:hover img{transform:scale(1.07)}
.cat-card h4{font-size:.92rem;font-weight:600;margin:.85rem 0 .1rem}
.cat-card small{color:var(--muted);font-size:.78rem}

.benefit{display:flex;gap:.9rem;align-items:flex-start;padding:1.1rem;border:1px solid var(--line);border-radius:var(--r-lg);background:var(--surface);height:100%;
  box-shadow:var(--shadow-1);transition:transform var(--t),box-shadow var(--t)}
.benefit:hover{transform:translateY(-2px);box-shadow:var(--shadow-2)}
.benefit .ico{flex:none;width:46px;height:46px;border-radius:12px;background:var(--brand-50);color:var(--brand);
  display:grid;place-items:center;font-size:1.35rem}
.benefit h4{font-size:.95rem;margin:0 0 .15rem}
.benefit p{font-size:.83rem;margin:0;color:var(--muted)}
.qty-sm input:fucus{
  box-shadow: none;
  outline: none;
}

/* ---------- Product card ---------- */
.p-card{position:relative;background:var(--surface);border:1px solid var(--line);border-radius:var(--r-lg);height:100%;
  display:flex;flex-direction:column;overflow:hidden;box-shadow:var(--shadow-1);transition:transform var(--t),box-shadow var(--t)}
.p-card:hover{transform:translateY(-4px);box-shadow:var(--shadow-2)}
.p-media{position:relative;aspect-ratio:1/1;background:var(--surface-2);overflow:hidden}
.p-media img{width:100%;height:100%;object-fit:cover;transition:transform 500ms ease}
.p-card:hover .p-media img{transform:scale(1.06)}
.p-flags{position:absolute;top:10px;left:10px;display:flex;flex-direction:column;gap:.3rem;z-index:2}
.p-actions{position:absolute;top:10px;right:10px;display:flex;flex-direction:column;gap:.4rem;z-index:2;
  opacity:0;transform:translateX(8px);transition:all var(--t)}
.p-card:hover .p-actions,.p-card:focus-within .p-actions{opacity:1;transform:none}
@media(max-width:767.98px){.p-actions{opacity:1;transform:none}}
.p-actions button{width:34px;height:34px;border-radius:9px;border:1px solid var(--line);background:rgba(255,255,255,.96);
  display:grid;place-items:center;color:var(--ink);font-size:.92rem;transition:all var(--t)}
[data-bs-theme="dark"] .p-actions button{background:rgba(23,27,38,.9)}
.p-actions button:hover{background:var(--brand);color:#fff;border-color:var(--brand)}
.p-actions button.active{background:var(--danger);color:#fff;border-color:var(--danger)}
.p-body{padding:1rem 1.05rem 1.15rem;display:flex;flex-direction:column;gap:.3rem;flex:1}
.p-cat{font-size:.72rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--muted)}
.p-title{font-size:.94rem;font-weight:700;line-height:1.3;margin:0}
.p-title a:hover{color:#434a5e}
.p-unit{font-size:.78rem;color:var(--muted)}
.p-rate{font-size:.76rem;color:var(--muted);display:flex;align-items:center;gap:.3rem}
.p-rate .bi{color:#f2b21b;font-size:.8rem}
.p-price{display:flex;align-items:baseline;gap:.45rem;margin-top:.15rem}
.p-price .now{font-size:0.9rem;font-weight:500;color:var(--ink)}
.p-price .was{font-size:.82rem;color:var(--muted);text-decoration:line-through}
.p-stock{font-size:.75rem;font-weight:700;display:flex;align-items:center;gap:.35rem}
.p-stock.in{color:var(--success)} .p-stock.low{color:var(--accent)} .p-stock.out{color:var(--danger)}
/* Price on the left, a single compact action on the right (icon-only "add
   to cart", the qty stepper once it's in the cart, or the ghost "Notify
   me" pill) — replaces a full-width text button so more of the card reads
   as price/product info and the action reads as a deliberate, secondary
   tap target instead of dominating the card. */
.p-foot{margin-top:auto;padding-top:.65rem;display:flex;align-items:center;justify-content:space-between;gap:.6rem}
.p-add-btn{flex:none;width:40px;height:40px;border-radius:12px;border:1px solid var(--line);background:var(--surface-2);color:var(--ink-2);
  display:grid;place-items:center;font-size:1.05rem;transition:all var(--t)}
.p-add-btn:hover{background:var(--brand);border-color:var(--brand);color:#fff;box-shadow:var(--shadow-2);transform:translateY(-2px)}
.p-add-btn:active{transform:translateY(0)}
button.btn.btn-brand.mt-sm-4.text-nowrap.flex-shrink-0 {
    padding: 9px 15px;
    margin-top: 29px !important;
}
.panel + .panel {
    margin-top: 30px;
}
.radio_wrapper_pd label.opt-card.d-flex.gap-2.align-items-start {
    padding: 10px 15px;
}

/* Product-detail page's Add to Cart — fixed, sane width instead of
   flex-grow-1 stretching it across the whole row next to the qty stepper. */
.pd-add-btn{flex:none;width:220px;max-width:100%}
.radio_wrapper_pd label.opt-card.d-flex.gap-2.align-items-start {
    padding: 10px 15px;
}
a.btn.btn-brand {
    padding-left: 20px;
    padding-right: 20px;
}
a.btn.btn-ghost{
  padding-left: 20px;
    padding-right: 20px;
}

/* Wishlist toggle beside the product-detail page's Add to Cart button —
   same gray-by-default treatment as .p-add-btn, red once saved instead of
   brand orange (this is a "saved" state, not a brand action). */
.pd-wish-btn{flex:none;width:48px;height:48px;border-radius:999px;border:1px solid var(--line);background:var(--surface-2);color:var(--ink-2);
  display:grid;place-items:center;font-size:1.15rem;padding:0;transition:all var(--t)}
.pd-wish-btn:hover{border-color:var(--danger);color:var(--danger)}
.pd-wish-btn.active{background:var(--danger);border-color:var(--danger);color:#fff}
.qty{display:inline-flex;align-items:center;border:1px solid var(--line);border-radius:10px;overflow:hidden;background:var(--surface)}
.qty button{width:34px;height:36px;display:inline-flex;align-items:center;justify-content:center;padding:0 0 5px;line-height:1;
  border:0;background:transparent;font-size:1rem;color:var(--ink);transition:background var(--t)}
.qty button:hover{background:var(--surface-2);color:var(--brand)}
.qty input{width:44px;height:36px;border:0;text-align:center;font-weight:700;font-size:.9rem;background:transparent}
.qty input::-webkit-outer-spin-button,.qty input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}
.qty.w-100{display:flex;justify-content:space-between}.qty.w-100 input{flex:1}

/* Deals section */
.deals{background:var(--surface-2)}
.countdown{display:flex;gap:.5rem}
.countdown .cd{background:var(--surface);border:1px solid var(--line);border-radius:12px;
  padding:.55rem .3rem;min-width:64px;text-align:center}
.countdown .cd b{display:block;font-size:1.35rem;line-height:1;font-variant-numeric:tabular-nums;color:var(--ink)}
.countdown .cd span{font-size:.66rem;text-transform:uppercase;letter-spacing:.08em;color:var(--muted)}

/* Split / banner */
/* A fixed (not percentage) height, not min-height:280px+height:100% — that
   combo left the box sized by the source image's own intrinsic aspect ratio
   (percentage heights don't resolve against an auto-height flex column), so
   a tall/portrait photo could tower over its text column and leave the
   shorter column's content stranded with huge top/bottom gaps from
   align-items:center. A definite height crops any image to the same
   proportions via object-fit:cover instead. */
.split-media{border-radius:var(--r-xl);overflow:hidden;height:440px;min-height:240px}
.split-media img{width:100%;height:100%;object-fit:cover}
.promo-banner{position:relative;border-radius:var(--r-xl);overflow:hidden;min-height:300px;display:flex;align-items:center}
.promo-banner img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.promo-banner .veil{position:absolute;inset:0;background:linear-gradient(90deg,rgba(11,16,30,.9),rgba(11,16,30,.35))}
.promo-banner .inner{position:relative;z-index:2;color:#fff;padding:2.75rem;max-width:560px}
.promo-banner h2,.promo-banner p{color:#fff}

/* Testimonials */
.review-card{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-lg);padding:1.5rem;height:100%;
  box-shadow:var(--shadow-1);transition:transform var(--t),box-shadow var(--t)}
.review-card:hover{transform:translateY(-2px);box-shadow:var(--shadow-2)}
.review-card .avatar{width:46px;height:46px;border-radius:50%;object-fit:cover}
.review-card .stars{color:#f2b21b;font-size:.85rem}

/* Newsletter + footer */
.newsletter{background:var(--surface-2);border:1px solid var(--line);border-radius:var(--r-xl);padding:2.75rem}
.site-footer{background:var(--surface-2);color:var(--ink-2);padding-top:56px}
.site-footer h5{color:var(--ink);font-size:.9rem;text-transform:uppercase;letter-spacing:.08em;margin-bottom:1rem}
.site-footer a{color:var(--ink-2);font-size:.88rem}
.site-footer a:hover{color:var(--ink)}
.site-footer .brand-logo{color:var(--ink)}
.site-footer ul{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:.55rem}
.pay-badge{background:var(--surface);border:1px solid var(--line);border-radius:8px;padding:.35rem .6rem;font-size:1.1rem;color:var(--ink)}
.soc{width:38px;height:38px;border-radius:10px;background:var(--surface);border:1px solid var(--line);display:grid;place-items:center;color:var(--ink-2)}
.soc:hover{background:var(--brand);border-color:var(--brand);color:#fff}
.footer-bottom{border-top:1px solid var(--line);margin-top:40px;padding:18px 0;font-size:.82rem}

/* ---------- Page header / breadcrumb ---------- */
.page-head{background:var(--surface-2);border-bottom:1px solid var(--line);padding:60px 0}
.breadcrumb{--bs-breadcrumb-divider-color:var(--muted);font-size:.83rem;margin:0}
.breadcrumb a{color:var(--muted)} .breadcrumb .active{color:var(--ink);font-weight:600}

/* ---------- Shop ---------- */
/* Filter sidebar (#filterHost) — a plain static column at lg+ regardless of
   `show`/backdrop state (Bootstrap's own .offcanvas-lg media query), a
   slide-in drawer with backdrop below it, opened by the "Filters" button in
   the toolbar (mobile-only, d-lg-none) instead of always eating vertical
   space above the product grid on small screens. */
.filter-offcanvas{--bs-offcanvas-width:320px}
.filter-card{border:1px solid var(--line);border-radius:var(--r-lg);background:var(--surface);padding:1.1rem;margin-bottom:1rem}
.filter-card h6{font-size:.82rem;text-transform:uppercase;letter-spacing:.07em;font-weight:800;margin-bottom:.85rem}
.form-check-label{font-size:.88rem;color:var(--ink-2)}
.form-check-input:checked{background-color:var(--brand);border-color:var(--brand)}
.form-control,.form-select{border-radius:10px;border-color:var(--line);font-size:.9rem;padding:.6rem .8rem}
.form-control:focus,.form-select:focus{border-color:var(--brand);box-shadow:0 0 0 3px rgba(249,112,21,.12)}

/* Custom select (SelectMenu.jsx) — replaces a native <select> where its
   unstyleable options popup would be too plain (e.g. shop "Sort by"). */
.select-menu{position:relative;display:inline-block}
.select-menu-trigger{display:inline-flex;align-items:center;gap:.6rem;padding:.6rem 1rem;border-radius:10px;
  border:1px solid var(--line);background:var(--surface);color:var(--ink);font-size:.88rem;font-weight:700;
  cursor:pointer;transition:border-color var(--t),box-shadow var(--t);white-space:nowrap}
.select-menu-trigger:hover{border-color:var(--brand-100)}
.select-menu-trigger:focus-visible{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px rgba(249,112,21,.12)}
.select-menu-trigger .bi-chevron-down{font-size:.7rem;color:var(--muted);transition:transform var(--t)}
.select-menu-trigger[aria-expanded="true"] .bi-chevron-down{transform:rotate(180deg)}
.select-menu-list{position:absolute;top:calc(100% + 6px);right:0;min-width:100%;width:max-content;z-index:1040;
  background:var(--surface);border:1px solid var(--line);border-radius:var(--r-md);box-shadow:var(--shadow-3);
  padding:.4rem;margin:0;list-style:none}
.select-menu-item{display:flex;align-items:center;justify-content:space-between;gap:1.25rem;width:100%;text-align:left;
  border:0;background:transparent;padding:.55rem .7rem;border-radius:8px;font-size:.86rem;color:var(--ink-2);
  cursor:pointer;transition:background var(--t)}
.select-menu-item:hover{background:var(--surface-2)}
.select-menu-item.active{color:var(--brand-700);font-weight:700;background:var(--brand-50)}
.select-menu-item .bi-check2{color:var(--brand)}

/* Price range slider — custom track/thumb (not Bootstrap's .form-range) so
   the filled portion, thumb size and hover feedback are all ours; the
   --range-pct custom property (set inline per current value) draws the
   brand-colored fill up to the thumb without a second overlay element. */
.price-slider{padding-top:.15rem}
.price-range-input{-webkit-appearance:none;appearance:none;width:100%;height:6px;border-radius:99px;margin:.5rem 0 .6rem;
  background:linear-gradient(to right,var(--brand) 0%,var(--brand) var(--range-pct,100%),var(--surface-3) var(--range-pct,100%),var(--surface-3) 100%);
  outline:none;cursor:pointer}
.price-range-input::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:18px;height:18px;border-radius:50%;
  background:#fff;border:3px solid var(--brand);box-shadow:var(--shadow-2);cursor:grab;transition:transform .12s ease}
.price-range-input::-webkit-slider-thumb:hover{transform:scale(1.15)}
.price-range-input::-webkit-slider-thumb:active{cursor:grabbing;transform:scale(1.05)}
.price-range-input::-moz-range-thumb{width:18px;height:18px;border-radius:50%;background:#fff;border:3px solid var(--brand);box-shadow:var(--shadow-2);cursor:grab}
.price-range-input::-moz-range-track{height:6px;border-radius:99px;background:var(--surface-3)}
.price-range-input::-moz-range-progress{height:6px;border-radius:99px;background:var(--brand)}
.price-slider-value{font-weight:800;color:var(--ink)}
.form-label{font-size:.83rem;font-weight:700;margin-bottom:.35rem}
.toolbar{display:flex;flex-wrap:wrap;gap:.75rem;align-items:center;justify-content:space-between;
  border:1px solid var(--line);border-radius:var(--r-md);padding:.7rem .9rem;background:var(--surface);margin-bottom:1rem}
.view-toggle button{width:36px;height:36px;border:1px solid var(--line);background:var(--surface);border-radius:9px;color:var(--muted)}
.view-toggle button.active{background:var(--brand-50);border-color:var(--brand);color:var(--brand)}
.list-view .p-card{flex-direction:row}
.list-view .p-media{width:220px;flex:none;aspect-ratio:1/1}
.cart-row.mini-cart-row button.btn-close.btn-sm.flex-shrink-0 {
    background-size: 10px;
}
.page-head h1.mb-1 {
    font-size: 22px !important;
}
.site-header .d-flex.align-items-center.gap-3.py-3 {
    padding-top: 8px !important;
    padding-bottom: 8px !important;
}
.qty.qty-sm button {
    line-height: 10px;
    /* line-height: 5px; */
    padding-bottom:6px;
}
.search-wrap .form-control{
  padding-right: 0.7rem;
}
ul.pagination {
    margin: 0;
}
ul.pagination li {
    margin: 0 5px;
}
@media(max-width:575.98px){.list-view .p-media{width:130px}}
.page-link{color:var(--ink);border-color:var(--line);border-radius:9px!important;margin:0 3px;font-size:.88rem;font-weight:700}
.page-item.active .page-link{background:var(--brand);border-color:var(--brand)}

/* Skeletons / states */
.skel{background:linear-gradient(90deg,var(--surface-2) 25%,var(--surface-3) 37%,var(--surface-2) 63%);
  background-size:400% 100%;animation:sk 1.2s ease infinite;border-radius:8px}
@keyframes sk{0%{background-position:100% 50%}100%{background-position:0 50%}}
.skel-card{border:1px solid var(--line);border-radius:var(--r-lg);padding:0;overflow:hidden}
.state-box{text-align:center;padding:56px 20px;border:1px dashed var(--line);border-radius:var(--r-xl);background:var(--surface-2)}
.state-box .bi{font-size:2.6rem;color:var(--muted)}
.state-box h3{margin-top:.8rem;font-size:1.15rem}
.state-box p{color:var(--muted);max-width:420px;margin:.35rem auto 1.2rem}

/* ---------- Product details ---------- */
.gallery-main{border:1px solid var(--line);border-radius:var(--r-xl);overflow:hidden;background:var(--surface);position:relative;aspect-ratio:1/1}
.gallery-main img{width:100%;height:100%;object-fit:cover;transition:transform .3s ease}
.gallery-main.zoomed img{transform:scale(1.9)}
.gallery-thumbs .t{border:1px solid var(--line);border-radius:12px;overflow:hidden;aspect-ratio:1/1;cursor:pointer;background:var(--surface)}
.gallery-thumbs .t.active{border-color:var(--brand);box-shadow:0 0 0 2px rgba(249,112,21,.18)}
.gallery-thumbs img{width:100%;height:100%;object-fit:cover}
.nav-tabs{border-bottom:1px solid var(--line);gap:.25rem}
.nav-tabs .nav-link{border:0;border-bottom:2px solid transparent;color:var(--muted);font-weight:700;font-size:.92rem;padding:.7rem 1rem}
.nav-tabs .nav-link.active{color:var(--brand);border-bottom-color:var(--brand);background:transparent}
.spec-table td{padding:.6rem .2rem;border-bottom:1px solid var(--line);font-size:.9rem}
.spec-table td:first-child{color:var(--muted);width:42%}
.fbt-item{display:flex;gap:.75rem;align-items:center;border:1px solid var(--line);border-radius:var(--r-md);padding:.6rem}
.fbt-item img{width:64px;height:64px;border-radius:10px;object-fit:cover}

/* ---------- Cart / checkout ---------- */
.summary-card{border:1px solid var(--line);border-radius:var(--r-lg);background:var(--surface);padding:1.2rem;position:sticky;top:150px}
.summary-row{display:flex;justify-content:space-between;font-size:.9rem;padding:.35rem 0;color:var(--ink-2)}
.summary-total{display:flex;justify-content:space-between;font-weight:800;font-size:1.15rem;border-top:1px solid var(--line);padding-top:.8rem;margin-top:.5rem}
/* Checkout's per-item breakdown (cart/order-summary pages show items in
   their own left-column list instead, so only checkout needs this) —
   compact thumbnail rows above the subtotal/delivery/total block. */
.summary-items{display:flex;flex-direction:column;gap:.7rem;padding-bottom:1rem;margin-bottom:.3rem;border-bottom:1px solid var(--line)}
.summary-item{display:flex;align-items:center;gap:.65rem}
.summary-item img{width:44px;height:44px;border-radius:8px;object-fit:cover;flex:none;border:1px solid var(--line)}
.summary-item-ph{width:44px;height:44px;border-radius:8px;background:var(--surface-2);flex:none}
.cart-row{display:flex;gap:1rem;padding:1rem;border:1px solid var(--line);border-radius:var(--r-lg);background:var(--surface);margin-bottom:.8rem}
.cart-row img{width:96px;height:96px;border-radius:12px;object-fit:cover;flex:none}
@media(max-width:575.98px){.cart-row img{width:74px;height:74px}}
/* Icon-only remove — gray by default, red on hover, same treatment as
   .pd-wish-btn/.p-add-btn rather than a permanently-red text+icon button. */
.cart-remove-btn{flex:none;width:34px;height:34px;border-radius:9px;border:1px solid var(--line);background:var(--surface-2);color:var(--ink-2);
  display:grid;place-items:center;font-size:.95rem;padding:0;transition:all var(--t)}
.cart-remove-btn:hover{background:var(--danger);border-color:var(--danger);color:#fff}

/* ---------- Mini cart drawer ---------- */
.mini-cart{--bs-offcanvas-width:400px}
.mini-cart .offcanvas-body{padding:1rem 1.25rem}
.mini-cart-row{padding:.75rem;gap:.75rem;margin-bottom:.6rem}
.mini-cart-row img{width:64px;height:64px;border-radius:10px}
.qty-sm button{width:28px;height:30px;font-size:.9rem}
.qty-sm input{width:32px;height:30px;font-size:.82rem}
.mini-cart-row .btn-close{width:.55em;height:.55em;padding:.3em;margin-top:.1rem}
.opt-card{display:block;border:1px solid var(--line);border-radius:var(--r-md);padding:0;cursor:pointer;transition:all var(--t);background:var(--surface)}
.opt-card:hover{border-color:var(--brand-100);background:var(--brand-50)}
.opt-card input:checked ~ .opt-body{color:var(--brand-700)}
.opt-card:has(input:checked){border-color:var(--brand);background:var(--brand-50);box-shadow:0 0 0 2px rgba(249,112,21,.12)}
/* Shop sidebar rows (category/brand) reuse .opt-card but flat — no per-item
   border/ring, just the background tint on hover/active (checkout's
   delivery/payment .opt-card keeps its bordered-card look above). */
#filterHost .opt-card{border-color:transparent;background:transparent}
#filterHost .opt-card:hover{border-color:transparent}
#filterHost .opt-card:has(input:checked){border-color:transparent;box-shadow:none}
.opt-count{font-size:.74rem;font-weight:700;color:var(--muted);background:var(--surface-2);border-radius:999px;
  padding:.1rem .55rem;flex-shrink:0;transition:background var(--t),color var(--t)}
#filterHost .opt-card:has(input:checked) .opt-count{background:var(--brand-100);color:var(--brand-700)}
.checkout-step{font-size:.78rem;font-weight:800;color:#fff;background:var(--brand);width:26px;height:26px;border-radius:50%;display:grid;place-items:center}
.secure-note{display:flex;gap:.5rem;align-items:center;font-size:.82rem;color:var(--muted);justify-content:center;margin-top:.7rem}

/* ---------- Checkout stepper (CheckoutClient.jsx) ---------- */
.checkout-stepper{display:flex;align-items:center;margin-bottom:1.2rem;padding:0 .1rem}
.cs-item{display:flex;align-items:center;gap:.55rem;background:none;border:0;padding:0;flex:1;cursor:pointer;color:inherit;text-align:start}
.cs-item:disabled{cursor:default}
.cs-item:not(:last-child)::after{content:'';flex:1;height:2px;background:var(--line);margin:0 .7rem;transition:background var(--t)}
.cs-item.done:not(:last-child)::after{background:var(--brand)}
.cs-circle{flex:none;width:28px;height:28px;border-radius:50%;display:grid;place-items:center;font-size:.78rem;font-weight:800;background:var(--surface-2);color:var(--muted);border:2px solid var(--line);transition:background var(--t),color var(--t),border-color var(--t)}
.cs-item.active .cs-circle{background:var(--brand);color:#fff;border-color:var(--brand)}
.cs-item.done .cs-circle{background:var(--brand-50);color:var(--brand);border-color:var(--brand)}
.cs-label{font-size:.82rem;font-weight:600;color:var(--muted);white-space:nowrap}
.cs-item.active .cs-label{color:var(--ink)}
@media (max-width:575.98px){.cs-label{display:none}}

/* ---------- Checkout success (success/[id]/page.js) ---------- */
.success-hero{text-align:center;padding:0px 20px 40px}
.success-hero .chk{width:84px;height:84px;border-radius:50%;background:var(--success);color:#fff;display:grid;place-items:center;margin:0 auto 1.2rem;font-size:2.3rem;box-shadow:0 12px 26px -10px rgba(33,196,93,.5)}
.success-hero h2{font-size:1.6rem;margin-bottom:.4rem}
.success-hero p{color:var(--muted);max-width:460px;margin:0 auto}
.success-order-no{display:inline-block;margin-top:1.1rem;padding:.5rem 1.1rem;border-radius:999px;background:var(--surface-2);font-weight:700;letter-spacing:.02em}

/* ---------- Auth ---------- */
/* Standalone centered auth shell (StorefrontAuthLayout.jsx) — /store/login
   and /store/register, no Header/Footer (see StorefrontShell.jsx). Same
   centered-logo/centered-card layout as the admin dashboard's own login
   page, in storefront tokens instead of Tailwind/shadcn ones. */
.store-auth-page{position:relative;min-height:100vh;display:flex;flex-direction:column;align-items:center;justify-content:center;
  padding:2.5rem 1.25rem;background:var(--surface-2)}
.store-auth-back{position:absolute;top:1.5rem;left:1.5rem;display:inline-flex;align-items:center;font-size:.85rem;font-weight:700;color:var(--ink-2)}
.store-auth-back:hover{color:var(--brand)}
.store-auth-shell{width:100%;max-width:440px;display:flex;flex-direction:column;align-items:center}
.store-auth-shell .card-box{max-width:none;width:100%;margin:0;text-align:left;background:var(--surface);
  border:1px solid var(--line);border-radius:var(--r-xl);box-shadow:var(--shadow-3);padding:clamp(1.5rem,4vw,2.5rem)}
.pw-toggle{position:absolute;right:.6rem;top:50%;transform:translateY(-50%);border:0;background:transparent;color:var(--muted);
  font-size:1.05rem;line-height:1;padding:.25rem;display:inline-flex;transition:color var(--t)}
.pw-toggle:hover{color:var(--brand)}
.strength{height:5px;border-radius:99px;background:var(--surface-3);overflow:hidden}
.strength b{display:block;height:100%;width:0;background:var(--danger);transition:all var(--t)}

/* ---------- Account ---------- */
.acc-side{border:1px solid var(--line);border-radius:var(--r-lg);background:var(--surface);overflow:hidden;position:sticky;top:150px}
.acc-side .head{padding:1.1rem;border-bottom:1px solid var(--line);display:flex;gap:.75rem;align-items:center;background:var(--surface-2)}
.acc-side .head img{width:48px;height:48px;border-radius:50%;object-fit:cover}
.acc-side a{display:flex;align-items:center;gap:.65rem;padding:.7rem 1.1rem;font-size:.9rem;font-weight:600;color:var(--ink-2);border-left:3px solid transparent}
.acc-side a:hover{background:var(--surface-2);color:var(--brand)}
.acc-side a.active{background:var(--brand-50);color:var(--brand-700);border-left-color:var(--brand)}
.acc-side a .bi{font-size:1.05rem}
.stat-card{border:1px solid var(--line);border-radius:var(--r-lg);background:var(--surface);padding:1.1rem;height:100%}
.stat-card .ico{width:44px;height:44px;border-radius:12px;display:grid;place-items:center;font-size:1.25rem}
.stat-card b{font-size:1.6rem;display:block;line-height:1.1}
.stat-card small{color:var(--muted);font-size:.8rem}
.panel{border:1px solid var(--line);border-radius:var(--r-lg);background:var(--surface)}
.panel-head{padding:1rem 1.2rem;border-bottom:1px solid var(--line);display:flex;justify-content:space-between;align-items:center;gap:.5rem}
.panel-head h3{font-size:1rem;margin:0}
.panel-body{padding:1.2rem}
.table{font-size:.88rem;vertical-align:middle}
.table thead th{font-size:.74rem;text-transform:uppercase;letter-spacing:.06em;color:var(--muted);font-weight:800;border-bottom-color:var(--line)}
.table td{border-color:var(--line)}
.order-card{border:1px solid var(--line);border-radius:var(--r-lg);background:var(--surface);margin-bottom:1rem;overflow:hidden}
.order-card .oc-head{background:var(--surface-2);padding:.85rem 1.1rem;display:flex;flex-wrap:wrap;gap:.75rem;justify-content:space-between;align-items:center;border-bottom:1px solid var(--line)}
.order-card .oc-body{padding:1.1rem}
.thumb-stack{display:flex}
.thumb-stack img{width:52px;height:52px;border-radius:10px;object-fit:cover;border:2px solid var(--surface);margin-left:-10px}
.thumb-stack img:first-child{margin-left:0}
.address-card{border:1px solid var(--line);border-radius:var(--r-lg);padding:1.1rem;background:var(--surface);height:100%;position:relative;transition:all var(--t)}
.address-card:hover{border-color:var(--brand-100);box-shadow:var(--shadow-2)}
.address-card.is-default{border-color:var(--brand);background:var(--brand-50)}
.timeline{position:relative;padding-left:0;list-style:none;margin:0}
.timeline li{position:relative;padding:0 0 1.5rem 2.2rem}
.timeline li::before{content:"";position:absolute;left:9px;top:22px;bottom:0;width:2px;background:var(--line)}
.timeline li:last-child::before{display:none}
.timeline .dot{position:absolute;left:0;top:2px;width:20px;height:20px;border-radius:50%;background:var(--surface);border:2px solid var(--line);display:grid;place-items:center;font-size:.6rem;color:transparent}
.timeline li.done .dot{background:var(--brand);border-color:var(--brand);color:#fff}
.timeline li.done::before{background:var(--brand)}
.timeline li.current .dot{border-color:var(--brand);box-shadow:0 0 0 4px rgba(249,112,21,.15)}
.timeline h6{margin:0;font-size:.92rem}
.timeline small{color:var(--muted);font-size:.8rem}
.track-steps{display:flex;justify-content:space-between;position:relative;margin:2rem 0}
.track-steps::before{content:"";position:absolute;left:6%;right:6%;top:19px;height:3px;background:var(--line)}
.track-steps .bar{position:absolute;left:6%;top:19px;height:3px;background:var(--brand);transition:width .6s ease}
.track-steps .ts{position:relative;text-align:center;flex:1;z-index:2}
.track-steps .ts .c{width:40px;height:40px;border-radius:50%;background:var(--surface);border:2px solid var(--line);display:grid;place-items:center;margin:0 auto;color:var(--muted)}
.track-steps .ts.done .c{background:var(--brand);border-color:var(--brand);color:#fff}
.track-steps .ts small{display:block;margin-top:.45rem;font-size:.74rem;font-weight:700}
.progress{height:8px;border-radius:99px;background:var(--surface-3)}
.progress-bar{background:var(--brand)}

/* ---------- Toasts ---------- */
.toast-stack{position:fixed;right:18px;bottom:18px;z-index:1090;display:flex;flex-direction:column;gap:.5rem;max-width:330px}
@media(max-width:991.98px){.toast-stack{bottom:74px;left:14px;right:14px;max-width:none}}
.t-toast{display:flex;gap:.65rem;align-items:flex-start;background:var(--surface);border:1px solid var(--line);border-left:4px solid var(--brand);
  border-radius:12px;box-shadow:var(--shadow-3);padding:.75rem .9rem;animation:tIn .28s ease}
.t-toast.err{border-left-color:var(--danger)} .t-toast.warn{border-left-color:var(--accent)}
.t-toast .bi{font-size:1.1rem;color:var(--brand)} .t-toast.err .bi{color:var(--danger)} .t-toast.warn .bi{color:var(--accent)}
.t-toast strong{display:block;font-size:.88rem} .t-toast span{font-size:.8rem;color:var(--muted)}
@keyframes tIn{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}
.fly{position:fixed;z-index:1100;width:56px;height:56px;border-radius:12px;object-fit:cover;pointer-events:none;
  box-shadow:var(--shadow-3);transition:all .75s cubic-bezier(.55,-0.3,.4,1.1)}

/* Offcanvas */
.offcanvas{border:0}
.offcanvas .nav-link{padding:.75rem 0;border-bottom:1px solid var(--line); color: var(--ink); font-weight:700}
.reveal{opacity:0;transform:translateY(16px)}

/* ---------- Bootstrap/Tailwind class-name collision fix ---------- */
/* The dashboard's Tailwind build (globals.css, loaded on every page incl.
   /store) ships a `.collapse{visibility:collapse}` utility. Bootstrap's own
   `.collapse` component only ever toggles `display` for open/close and never
   resets `visibility`, so Tailwind's rule silently wins once both are
   loaded — a collapse/accordion panel gets `display:block` but stays
   invisible (space reserved, content hidden). Restore Bootstrap's intent
   here, after both stylesheets, so any current or future .collapse usage on
   the storefront (accordions, navbar-collapse, etc.) actually shows. */
.collapse{visibility:visible}
.collapse:not(.show){display:none}

/* ---------- AI Shopping Assistant (storefront chat widget) ---------- */
.ai-chat-root{position:fixed;bottom:1.5rem;right:1.5rem;z-index:1080}
.ai-chat-launcher{width:58px;height:58px;border-radius:50%;border:0;background:var(--brand);color:#fff;
  display:flex;align-items:center;justify-content:center;box-shadow:var(--shadow-3);cursor:pointer;
  position:relative;transition:transform var(--t)}
.ai-chat-launcher:hover{transform:translateY(-2px) scale(1.04)}
.ai-chat-launcher:active{transform:scale(.96)}
.ai-chat-launcher.pulse{animation:aiPulse 2.4s ease-out infinite}
@keyframes aiPulse{0%{box-shadow:var(--shadow-3),0 0 0 0 rgba(249,112,21,.35)}70%{box-shadow:var(--shadow-3),0 0 0 14px rgba(249,112,21,0)}100%{box-shadow:var(--shadow-3),0 0 0 0 rgba(249,112,21,0)}}
.ai-chat-unread{position:absolute;top:0;right:0;width:14px;height:14px;border-radius:50%;background:var(--danger);border:2px solid var(--surface)}

.ai-chat-panel{width:380px;max-width:calc(100vw - 2rem);height:min(600px,calc(100vh - 8rem));
  background:var(--surface);border-radius:var(--r-xl);box-shadow:var(--shadow-3);border:1px solid var(--line);
  display:flex;flex-direction:column;overflow:hidden;margin-bottom:14px;animation:aiPanelIn .22s cubic-bezier(.4,0,.2,1)}
@keyframes aiPanelIn{from{opacity:0;transform:translateY(16px) scale(.98)}to{opacity:1;transform:none}}
@media(max-width:640px){
  .ai-chat-panel{position:fixed;inset:0;width:100%;height:100%;max-width:none;max-height:none;border-radius:0;margin-bottom:0;z-index:1090}
}

.ai-chat-header{background:var(--brand);color:#fff;padding:14px 16px;display:flex;align-items:center;gap:10px;flex-shrink:0}
.ai-chat-avatar{width:36px;height:36px;border-radius:50%;background:rgba(255,255,255,.22);display:flex;
  align-items:center;justify-content:center;flex-shrink:0;overflow:hidden}
.ai-chat-avatar img{width:100%;height:100%;object-fit:cover}
.ai-chat-header-info{flex:1;min-width:0}
.ai-chat-header-info strong{display:block;font-size:14px;font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ai-chat-header-status{font-size:11px;opacity:.85;display:flex;align-items:center;gap:5px}
.ai-chat-header-status .status-dot{background:#4ade80}
.ai-chat-close{background:rgba(255,255,255,.15);border:0;color:#fff;width:30px;height:30px;border-radius:8px;
  display:flex;align-items:center;justify-content:center;cursor:pointer;transition:background var(--t);flex-shrink:0}
.ai-chat-close:hover{background:rgba(255,255,255,.28)}

.ai-chat-body{flex:1;overflow-y:auto;padding:14px;display:flex;flex-direction:column;gap:10px;background:var(--surface-2)}
.ai-chat-msg{max-width:88%;display:flex;flex-direction:column}
.ai-chat-msg.user{align-self:flex-end;align-items:flex-end}
.ai-chat-msg.assistant{align-self:flex-start;align-items:flex-start}
.ai-chat-bubble{font-size:13.5px;line-height:1.5;border-radius:var(--r-lg);padding:10px 13px;white-space:pre-wrap;word-break:break-word}
.ai-chat-msg.user .ai-chat-bubble{background:var(--brand);color:#fff;border-bottom-right-radius:4px}
.ai-chat-msg.assistant .ai-chat-bubble{background:var(--surface);color:var(--ink);border:1px solid var(--line);border-bottom-left-radius:4px}

.ai-chat-typing{display:inline-flex;align-items:center;gap:5px;padding:13px 16px;background:var(--surface);
  border:1px solid var(--line);border-radius:var(--r-lg);border-bottom-left-radius:4px;
  animation:aiTypingGlow 2s ease-in-out infinite}
.ai-chat-typing span{width:7px;height:7px;border-radius:50%;background:var(--brand);
  animation:aiTypingBounce 1.1s cubic-bezier(.45,0,.55,1) infinite}
.ai-chat-typing span:nth-child(2){animation-delay:.18s}
.ai-chat-typing span:nth-child(3){animation-delay:.36s}
@keyframes aiTypingBounce{0%,80%,100%{transform:translateY(0) scale(.75);opacity:.4}40%{transform:translateY(-6px) scale(1);opacity:1}}
@keyframes aiTypingGlow{0%,100%{box-shadow:0 0 0 0 rgba(249,112,21,0)}50%{box-shadow:0 0 0 3px var(--brand-50)}}

.ai-chat-added{display:flex;align-items:center;gap:4px;font-size:11px;color:var(--success);margin-top:5px;font-weight:700}

.ai-chat-rail{display:flex;gap:8px;margin-top:8px;overflow-x:auto;padding-bottom:4px;scroll-snap-type:x proximity;
  -webkit-overflow-scrolling:touch;max-width:100%}
.ai-chat-rail::-webkit-scrollbar{height:5px}
.ai-chat-rail::-webkit-scrollbar-thumb{background:var(--line);border-radius:99px}
.ai-chat-card{scroll-snap-align:start;flex:0 0 156px;border:1px solid var(--line);border-radius:var(--r-md);
  background:var(--surface);padding:8px;display:flex;flex-direction:column;gap:6px;transition:box-shadow var(--t),border-color var(--t)}
.ai-chat-card:hover{box-shadow:var(--shadow-2);border-color:var(--brand-100)}
.ai-chat-card img{width:100%;height:80px;object-fit:cover;border-radius:8px;background:var(--surface-3)}
.ai-chat-card .name{font-size:12px;font-weight:700;color:var(--ink);display:-webkit-box;-webkit-line-clamp:2;
  -webkit-box-orient:vertical;overflow:hidden;line-height:1.3;min-height:2.6em}
.ai-chat-card .price-row{display:flex;align-items:center;justify-content:space-between;gap:6px}
.ai-chat-card .price{font-size:12.5px;font-weight:800;color:var(--brand)}
.ai-chat-card .add-btn{width:26px;height:26px;border-radius:7px;border:1px solid var(--line);background:var(--surface);
  color:var(--ink);display:flex;align-items:center;justify-content:center;cursor:pointer;flex-shrink:0;transition:all var(--t)}
.ai-chat-card .add-btn.added{background:var(--success);border-color:var(--success);color:#fff}
.ai-chat-card .add-btn:disabled{opacity:.4;cursor:not-allowed}

.ai-chat-quick{display:flex;flex-wrap:wrap;gap:6px;margin-top:10px}
.ai-chat-chip{font-size:12px;font-weight:600;padding:7px 12px;border-radius:99px;border:1px solid var(--line);
  background:var(--surface);color:var(--ink);cursor:pointer;transition:all var(--t)}
.ai-chat-chip:hover{border-color:var(--brand);color:var(--brand);background:var(--brand-50)}

.ai-chat-retry{font-size:11px;font-weight:700;color:var(--brand);cursor:pointer;text-decoration:underline;
  margin-top:4px;display:inline-block;background:none;border:0;padding:0}

.ai-chat-footer{border-top:1px solid var(--line);padding:10px;display:flex;gap:8px;background:var(--surface);flex-shrink:0}
.ai-chat-input{flex:1;font-size:13.5px;border:1px solid var(--line);border-radius:99px;padding:10px 16px;
  outline:none;background:var(--surface-2);color:var(--ink);transition:border-color var(--t),background var(--t)}
.ai-chat-input:focus{border-color:var(--brand);background:var(--surface)}
.ai-chat-send{width:38px;height:38px;border-radius:50%;border:0;background:var(--brand);color:#fff;
  display:flex;align-items:center;justify-content:center;cursor:pointer;flex-shrink:0;transition:opacity var(--t),transform var(--t)}
.ai-chat-send:disabled{opacity:.4;cursor:not-allowed}
.ai-chat-send:not(:disabled):active{transform:scale(.92)}
.reveal.in{opacity:1;transform:none;transition:opacity .55s ease,transform .55s ease}
