/* ═══════════════════════════════════════════════════════════════════
   store.css — the STOREFRONT shell for catalog/view/template/ (the LIVE theme) (Twisti, 2026-09-03)

   Loaded by catalog/view/template/common/header.twig AFTER
   uix.min.css (Tabler = Bootstrap 5) and app.css (the shared admin/storefront
   component vocabulary). It owns ONLY the shell: top bar, mobile drawer,
   category-nav slot, page frame, footer and cookie bar. Page bodies are
   written by the other storefront templates and must sit inside this frame.

   ── Conventions every storefront template must follow ─────────────────────
   Root:      <div class="store-shell">  (NOT .app-shell — that is the admin root
              and app.css positions a fixed 430px app bar off it.)
   Frame:     header.twig opens  <main class="store-main"> ; footer.twig closes it.
              Pages render the stock  <div id="…" class="container"><div class="row">
              {{ column_left }} <div id="content" class="col"> … grid unchanged —
              Bootstrap's grid comes from uix.min.css.
   Tokens:    use the app.css tokens (--app-primary, --app-bg, --app-card,
              --app-border, --app-text, --app-muted, --app-radius, --app-shadow).
              Tabler's own --tblr-primary / link colour are remapped below to
              --app-primary so .btn-primary, .form-control:focus, links, badges
              all pick up the AarZaa blue automatically.
   Buttons:   plain Bootstrap/Tabler classes (.btn .btn-primary / .btn-outline-
              secondary / .btn-light …) — uix.min.css styles them in the Tabler
              look. app.css .btn-save / .btn-cancel-bar remain available for
              phone-style save bars.
   Cards:     .card-android (app.css) for app-flavoured blocks, or Tabler .card.
   Icons:     Tabler Icons  <i class="ti ti-…"></i>.  The served font is a
              SUBSET — see catalog/view/javascript/native/uix/icons/fonts/README.md
              before using a new icon. Font Awesome ({{ icons }}) is also loaded
              (plan D6) for stock-derived fragments and common.js alert glyphs.
   Prefix:    every class defined in THIS file starts with `store-`.
   Breakpoints (plan §5.2): <768 phone, 768–991 tablet, ≥992 desktop nav.
   ═══════════════════════════════════════════════════════════════════════ */

/* ── Tabler → AarZaa colour remap ─────────────────────────────────────────
   uix.min.css defines --tblr-primary:#066fd1. Re-pointing the handful of
   variables Tabler derives buttons/links/focus rings from makes stock-derived
   `.btn-primary` / `a` / `.form-control:focus` match the admin blue without
   touching any page template. */
:root {
  --tblr-primary: var(--app-primary);
  --tblr-primary-rgb: 26, 86, 219;
  --tblr-primary-darken: #1747b8;
  --tblr-link-color: var(--app-primary);
  --tblr-link-color-rgb: 26, 86, 219;
  --tblr-link-hover-color: #1747b8;
  --tblr-link-hover-color-rgb: 23, 71, 184;
  --tblr-body-bg: var(--app-bg);
  --store-bar-h: 64px;      /* top bar height (desktop); phone uses 56px */
  --store-max-w: 1200px;    /* ONE content band shared by bar, nav, page, footer */
  --store-gutter: 16px;     /* ONE side gutter shared by the same four (12px on phones) */
  --store-ctrl-h: 40px;     /* height of every control in the bar: pills, icons,
                               search input+button, cart button */
}

/* ── Shared container ─────────────────────────────────────────────────────
   Everything that spans the page — the bar's inner row, the category strip's
   .container, each page's root .container, .app-content hub pages and the
   footer — is capped at --store-max-w and inset by --store-gutter, so the
   brand, the search box, the page heading and the first card all start on the
   same vertical line and end on the same one. Bootstrap's own responsive
   .container caps (1140/1320…) are overridden here on purpose. */
.store-bar-inner,
.store-nav > .container,
.store-main > .container,
.store-main > [id] > .container,
.store-main .app-content,
.store-footer-inner {
  width: 100%;
  max-width: var(--store-max-w);
  margin-left: auto; margin-right: auto;
  padding-left: var(--store-gutter); padding-right: var(--store-gutter);
}

/* ── Shell root ── */
.store-shell {
  min-height: 100vh;
  display: flex; flex-direction: column;
  background: var(--app-bg);
}
.store-main { flex: 1 0 auto; padding: 18px 0 32px; }
/* Hub-style pages (account/*) reuse the admin's .app-content class. In app.css
   that class carries the ADMIN shell geometry — padding-top for a fixed 60px
   app bar, 100vh min-height, a 1140px cap at >=1200px. The storefront bar is
   sticky (no reserved padding needed), so neutralise all of it here; the
   shared-container rule above already gives it the page band + gutter. The
   .card-android / .form-page-title / .section-label children carry their own
   12–16px insets, so the band is pulled in by 12px to land the cards exactly
   on the gutter line the grid pages use. */
.store-main .app-content {
  padding-top: 0 !important;
  padding-bottom: 24px !important;
  min-height: 0 !important;
  flex: none;
  padding-left: calc(var(--store-gutter) - 12px);
  padding-right: calc(var(--store-gutter) - 12px);
}
/* Heading / section labels keep the same 12px inset as .card-android so their
   text starts on the card edge (and on the bar's brand). */
.store-main .app-content .form-page-title { padding: 4px 12px 12px; }
.store-main .app-content .section-label { padding-left: 12px; padding-right: 12px; }
.store-main .app-content .section-label:first-of-type { padding-top: 8px; }
/* app.css sets `a { color: inherit }` for the admin's button-style links.
   The storefront is text-link heavy (product names, breadcrumbs, footer), so
   restore link colour inside the content and footer.
   Written with :where() so the rule has the specificity of a bare `a`
   (0,0,1): it still beats app.css's `a { color: inherit }` by source order,
   but ANY class on the anchor now wins — .acct-btn-primary, .acct-hub-feature,
   .store-footer-links a, Tabler .btn-* … Before this it was (0,1,1) and
   silently painted every class-coloured <a> primary-blue (the unreadable
   "My Workspace" tile and the workspace login button). Do not raise it again. */
:where(.store-main, .store-footer) a { color: var(--app-primary); }
:where(.store-main, .store-footer) a:hover { text-decoration: underline; }
/* NOT `.store-main .btn` here: Tabler's .btn sets its own colour and each
   variant (.btn-primary {color:#fff} …) is a bare class — forcing `inherit` at
   (0,1,1) painted every <a class="btn btn-primary"> dark-on-blue. The link rule
   above is (0,0,1), so Tabler's .btn wins over it on its own. */
.store-main .text-reset, .store-main .store-plain a,
.store-main .card-android a, .store-main .list-item { color: inherit; }
.store-main .btn:hover, .store-main .card-android a:hover, .store-main .list-item:hover { text-decoration: none; }
/* Stock pages open with <h1> straight inside #content; give it the Tabler
   page-title weight without every template restating it. */
.store-main #content > h1, .store-main #content > h2 {
  font-size: 22px; font-weight: 800; letter-spacing: -0.3px;
  color: var(--app-text); margin: 4px 0 14px;
}
.store-main .breadcrumb {
  padding: 0; margin: 0 0 12px; background: none;
  font-size: 12.5px; font-weight: 600;
}
.store-main .breadcrumb-item a { color: var(--app-muted); }
.store-main .breadcrumb-item.active, .store-main .breadcrumb-item:last-child a { color: var(--app-text); }
/* Account screens carry no breadcrumb (owner, 2026-09-04) — mirrors the admin,
   where app.css hides .breadcrumb-wrapper under .app-shell. One scoped rule
   instead of editing every account/*.twig: every account/ page root is
   <div id="account-…">, and the two breadcrumb shapes in that folder are the
   stock <ul class="breadcrumb"> and the native <ul class="acct-crumbs">.
   information/gdpr.twig also uses the stock id #account-gdpr but is NOT an
   account screen, so it is excluded and keeps its trail. Product, category,
   checkout and information pages are untouched. display:none removes the
   element's own margins too, so the heading keeps the shared page-top rhythm. */
.store-main [id^="account-"]:not(#account-gdpr) .breadcrumb,
.store-main [id^="account-"]:not(#account-gdpr) .acct-crumbs { display: none !important; }
/* Owner, 2026-09-04 (2): also no breadcrumb on the product PAGE and on checkout.
   Exact root ids on purpose — no prefix match — because product/ also holds
   category, manufacturer, search, special and compare, which KEEP their trail,
   and cms/blog + account/order_info reuse product-… / checkout-… ids on nested
   elements. (Never write a star-slash pair inside this comment: it ends it.) Checkout fragments (cart_list, confirm, *_address, *_method,
   register) render inside these two roots and carry no breadcrumb of their own.
   Owner, 2026-09-06 (3): nor on the outcome page (common/success.twig, root
   #common-success) — a terminal "done" screen after registration, checkout,
   logout, returns, contact, GDPR and payment failure; the trail is still built by
   the controllers, only hidden here, so the markup contract is unchanged. */
.store-main #product-info .breadcrumb,
.store-main #checkout-cart .breadcrumb,
.store-main #checkout-checkout .breadcrumb,
.store-main #common-success .breadcrumb { display: none !important; }

/* ── Top bar ──────────────────────────────────────────────────────────────
   Sticky (not fixed): the page never needs to reserve padding for it, so
   stock page templates that know nothing about the bar still lay out right. */
.store-bar {
  position: sticky; top: 0; z-index: 30;
  background: var(--app-card);
  border-bottom: 1px solid var(--app-border);
  box-shadow: 0 2px 12px rgba(15,23,42,0.06);
  padding-top: env(safe-area-inset-top, 0px);
}
.store-bar-inner {
  /* width / max-width / gutter come from the shared-container rule above */
  min-height: var(--store-bar-h);
  padding-top: 8px; padding-bottom: 8px;
  display: flex; align-items: center; gap: 8px;
  flex-wrap: wrap;
}
/* Every direct control in the bar shares one height so the row centres on a
   single axis (pills, icon buttons, search, cart). */
.store-bar-icon, .store-pill, #cart .dropdown > .btn,
.store-search .form-control, .store-search .btn { height: var(--store-ctrl-h); min-height: 0; }
/* Icon button — same recipe as the admin white app bar (#appBar .app-bar-icon) */
.store-bar-icon {
  width: 40px; height: 40px; border-radius: 11px; border: none;
  background: transparent; color: #475569;
  display: inline-flex; align-items: center; justify-content: center;
  font-size: 21px; cursor: pointer; flex-shrink: 0; position: relative;
  -webkit-tap-highlight-color: transparent; text-decoration: none;
}
.store-bar-icon:hover, .store-bar-icon:active, .store-bar-icon:focus-visible {
  background: #f1f5f9; color: var(--app-text); text-decoration: none;
}
/* Brand: logo image or store name */
.store-brand {
  display: flex; align-items: center; gap: 8px;
  font-size: 18px; font-weight: 800; letter-spacing: -0.3px;
  color: var(--app-text); text-decoration: none; min-width: 0;
  flex-shrink: 0;
}
.store-brand img { max-height: var(--store-ctrl-h); max-width: 150px; width: auto; display: block; object-fit: contain; }
.store-brand:hover { text-decoration: none; color: var(--app-text); }
.store-brand-mark {
  width: 34px; height: 34px; border-radius: 10px;
  background: var(--app-grad); color: #fff;
  display: inline-flex; align-items: center; justify-content: center; font-size: 18px;
}
.store-brand-name { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

/* Search slot — holds the common/search partial ({{ search }}) unchanged.
   Stock markup is <form class="input-group"> <input.form-control-lg> <button.btn>. */
/* Flexible middle: shrinks before anything else so brand + actions never wrap
   the bar onto a second row (>=768px; phones move it to its own row below). */
.store-search { flex: 1 1 200px; min-width: 150px; max-width: 520px; }
/* The stock form carries .input-group.mb-3 and .form-control-lg/.btn-lg. Tabler
   gives -lg controls DIFFERENT min-heights (input 44px, button 48px), which is
   what made the input's bottom border sit above the button's and read as a
   stray rule. Both are pinned to --store-ctrl-h (see the bar rule above), the
   group is a non-wrapping flex row, and the two halves share one 12px radius. */
.store-search .input-group { margin: 0 !important; flex-wrap: nowrap; }
.store-search .form-control {
  font-size: 14px; line-height: 1.2; padding: 0 14px;
  border-radius: 12px 0 0 12px; border: 1.5px solid var(--app-border); border-right: 0;
  background: #f8fafc; box-shadow: none;
}
.store-search .form-control:focus { background: #fff; border-color: var(--app-primary); box-shadow: none; }
.store-search .form-control:focus + .btn { border-color: var(--app-primary); }
.store-search .btn {
  border-radius: 0 12px 12px 0; margin-left: 0 !important;
  background: var(--app-primary); color: #fff; border: 1.5px solid var(--app-primary);
  padding: 0 16px; display: inline-flex; align-items: center; justify-content: center;
  box-shadow: none;
}
.store-search .btn:hover { background: var(--tblr-primary-darken); border-color: var(--tblr-primary-darken); color: #fff; }

/* Right-hand action cluster */
.store-actions {
  display: flex; align-items: center; gap: 4px; flex-shrink: 0; margin-left: auto;
}
/* Pill: icon + optional label (label only ≥992px). Used for currency,
   language, account, wishlist, checkout, contact. Also the dropdown trigger
   look for the currency/language/account menus. */
.store-pill {
  display: inline-flex; align-items: center; gap: 6px;
  height: 40px; padding: 0 10px; border-radius: 11px; border: none;
  background: transparent; color: #475569; font-size: 13px; font-weight: 600;
  text-decoration: none; cursor: pointer; white-space: nowrap;
  -webkit-tap-highlight-color: transparent;
}
.store-pill i { font-size: 20px; line-height: 1; }
.store-pill:hover, .store-pill:focus-visible, .store-pill.show {
  background: #f1f5f9; color: var(--app-text); text-decoration: none;
}
.store-pill-label { display: none; }
.store-pill-sym { font-weight: 800; font-size: 14px; min-width: 14px; text-align: center; }
.store-pill-flag { width: 18px; height: 12px; border-radius: 2px; object-fit: cover; display: block; }
/* Tabler's .dropdown-toggle adds a caret pseudo-element; the pill draws its own */
.store-pill.dropdown-toggle::after { display: none; }
.store-pill .store-caret { font-size: 14px; opacity: .6; }
/* Count badge (wishlist / cart) — same as app.css .notif-badge */
.store-badge {
  position: absolute; top: 2px; right: 2px;
  min-width: 16px; height: 16px; padding: 0 4px;
  background: #f03e3e; color: #fff; font-size: 10px; font-weight: 800;
  line-height: 1; border-radius: 9px; border: 2px solid #fff;
  display: flex; align-items: center; justify-content: center;
}

/* Dropdown menus opened from the bar (account, currency, language, cart).
   Tabler's .dropdown-menu is already close; tighten radius/shadow to the
   app.css card look. */
.store-bar .dropdown-menu {
  border-radius: var(--app-radius); border: 1px solid var(--app-border);
  box-shadow: 0 10px 30px rgba(15,23,42,0.12); padding: 6px; min-width: 200px;
  margin-top: 6px !important;
}
.store-bar .dropdown-item {
  border-radius: 9px; padding: 9px 10px; font-size: 13.5px; font-weight: 600;
  color: var(--app-text); display: flex; align-items: center; gap: 9px;
}
.store-bar .dropdown-item i { font-size: 18px; color: var(--app-muted); }
.store-bar .dropdown-item:hover, .store-bar .dropdown-item:focus { background: #f1f5f9; color: var(--app-primary); }
.store-bar .dropdown-item:hover i { color: var(--app-primary); }
.store-bar .dropdown-item img { width: 18px; height: 12px; border-radius: 2px; object-fit: cover; }

/* Cart slot — wraps the common/cart partial ({{ cart }}). Stock markup:
   <div class="dropdown d-grid"><button class="btn btn-lg btn-dark dropdown-toggle">
   …<ul class="dropdown-menu dropdown-menu-end">. The button is restyled into a
   gradient pill here so the cart agent can keep the stock structure; the
   dropdown body (tables, totals) is left to that template. */
#cart { flex-shrink: 0; }
#cart .dropdown { display: inline-block; }
#cart .dropdown > .btn {
  /* height + min-height:0 come from the bar rule; Tabler's .btn-lg min-height
     (48px) is what made the cart overhang the bar. `display:block` from the
     stock .d-block is overridden so the icon/label centre vertically. */
  padding: 0 14px; border-radius: 11px; border: none; line-height: 1;
  background: var(--app-grad); color: #fff; font-size: 13px; font-weight: 700;
  display: inline-flex !important; align-items: center; gap: 7px; white-space: nowrap;
  box-shadow: 0 4px 12px rgba(26,86,219,0.28);
}
#cart .dropdown > .btn:hover { filter: brightness(1.06); }
#cart .dropdown > .btn i { font-size: 18px; }
#cart .dropdown-menu { min-width: min(360px, calc(100vw - 24px)); }
#cart .dropdown-menu .table { font-size: 12.5px; margin-bottom: 8px; }
#cart .dropdown-menu .img-thumbnail { max-width: 48px; border-radius: 8px; }
#cart .dropdown-menu a { color: var(--app-primary); }

/* ── Category navigation slot ─────────────────────────────────────────────
   Holds {{ menu }} (common/menu partial). Stock markup is
   <div class="container"><nav id="menu" class="navbar navbar-expand-lg bg-primary">.
   Restyled here as a white strip under the bar; the menu agent may replace the
   inner markup but should keep nav#menu so these rules keep applying. */
.store-nav { background: var(--app-card); border-bottom: 1px solid var(--app-border); }
.store-nav:empty { display: none; }
.store-nav #menu.navbar {
  background: transparent !important; padding: 0; min-height: 44px;
  border-radius: 0; border: none; box-shadow: none;
}
/* first/last nav links sit flush on the gutter line (their own 14px padding
   would otherwise push the text 14px inside it) */
.store-nav #menu .navbar-nav > li:first-child > a { padding-left: 0; }
/* Tabler gives .navbar-nav items flex-grow, which spread eight categories
   across the band and wrapped the last onto a second row. Items size to
   content and pack left, wrapping only when they truly run out of room. */
.store-nav #menu .navbar-collapse { flex-grow: 1; }
.store-nav #menu .navbar-nav { display: flex; flex-wrap: wrap; width: 100%; }
.store-nav #menu .navbar-nav > li { flex: 0 0 auto; width: auto; }
/* plain (childless) categories reuse .dropdown-item, whose Tabler min-width
   (11rem) padded every one out to 176px */
.store-nav #menu .navbar-nav > li > a.dropdown-item { min-width: 0; width: auto; }
.store-nav #menu .navbar-nav > li > a.nav-link,
.store-nav #menu .navbar-nav > li > a.dropdown-item {
  padding: 12px 14px; font-size: 13.5px; font-weight: 700; color: #475569;
  background: none; border-radius: 0; display: block;
}
.store-nav #menu .navbar-nav > li > a:hover,
.store-nav #menu .navbar-nav > li.show > a { color: var(--app-primary); text-decoration: none; }
.store-nav #menu .navbar-nav > li > a.nav-link.dropdown-toggle::after { margin-left: 5px; opacity: .6; }
.store-nav #menu #category { font-size: 13.5px; font-weight: 700; color: #475569; padding: 12px 14px; }
.store-nav #menu .navbar-toggler {
  border: none; color: #475569; font-size: 20px; padding: 6px 10px; box-shadow: none;
}
.store-nav #menu .dropdown-menu {
  border-radius: var(--app-radius); border: 1px solid var(--app-border);
  box-shadow: 0 10px 30px rgba(15,23,42,0.12); padding: 10px;
}
.store-nav #menu .dropdown-inner { display: flex; gap: 8px; }
.store-nav #menu .dropdown-inner ul { min-width: 160px; margin: 0; }
.store-nav #menu .dropdown-item { border-radius: 8px; padding: 8px 10px; font-size: 13px; font-weight: 600; color: var(--app-text); }
.store-nav #menu .dropdown-item:hover { background: #f1f5f9; color: var(--app-primary); }
@media (max-width: 991.98px) {
  .store-nav #menu { display: flex; flex-wrap: wrap; align-items: center; }
  .store-nav #menu #category { flex: 1; }
  .store-nav #menu .navbar-collapse { flex-basis: 100%; }
  .store-nav #menu .navbar-nav > li > a { padding: 10px 14px; border-top: 1px solid #f1f5f9; }
  .store-nav #menu .dropdown-menu { box-shadow: none; border: none; background: #f8fafc; margin: 0 0 6px; }
  .store-nav #menu .dropdown-inner { flex-direction: column; gap: 0; }
}

/* ── Mobile drawer (account / shop links) ─────────────────────────────────
   Opened by the bar hamburger via openStoreDrawer() (store.js). Slides in from
   the left like the admin More panel; ≥992px the drawer is never needed because
   every link it holds is visible in the bar, so it is simply not shown. */
.store-drawer {
  position: fixed; top: 0; bottom: 0; left: 0; z-index: 50;
  width: min(320px, 86vw); background: var(--app-card);
  transform: translateX(-100%); transition: transform .28s cubic-bezier(.4,0,.2,1);
  display: flex; flex-direction: column;
  box-shadow: 4px 0 24px rgba(15,23,42,0.18);
  padding-top: env(safe-area-inset-top, 0px);
}
.store-drawer.show { transform: translateX(0); }
.store-drawer-bar {
  display: flex; align-items: center; gap: 6px; padding: 10px 10px;
  border-bottom: 1px solid var(--app-border); min-height: 56px;
}
.store-drawer-title { flex: 1; font-size: 16px; font-weight: 800; color: var(--app-text); padding: 0 4px; }
.store-drawer-scroll { flex: 1; overflow-y: auto; -webkit-overflow-scrolling: touch; padding: 10px 10px calc(16px + env(safe-area-inset-bottom, 0px)); }
.store-drawer-section { margin-bottom: 14px; }
.store-drawer-heading {
  font-size: 10.5px; font-weight: 700; letter-spacing: .6px; text-transform: uppercase;
  color: #94a3b8; padding: 4px 10px 6px;
}
.store-drawer-link {
  display: flex; align-items: center; gap: 12px;
  padding: 11px 10px; border-radius: 11px; font-size: 14px; font-weight: 600;
  color: var(--app-text); text-decoration: none;
}
.store-drawer-link i { font-size: 20px; color: var(--app-muted); width: 24px; text-align: center; }
.store-drawer-link:hover, .store-drawer-link:active { background: #f1f5f9; color: var(--app-primary); text-decoration: none; }
.store-drawer-link:hover i { color: var(--app-primary); }
.store-drawer-link.store-drawer-link-primary {
  background: var(--app-grad); color: #fff; box-shadow: 0 4px 12px rgba(26,86,219,0.28);
}
.store-drawer-link.store-drawer-link-primary i { color: #fff; }
/* Backdrop — same look as app.css .sheet-overlay but its own element so the
   admin sheet helpers (closeAllSheets) never fight the drawer. */
.store-drawer-overlay {
  display: none; position: fixed; inset: 0; z-index: 45; background: rgba(0,0,0,0.46);
}
.store-drawer-overlay.show { display: block; }
body.store-drawer-open { overflow: hidden; }

/* ── Footer ── */
.store-footer {
  background: var(--app-card); border-top: 1px solid var(--app-border);
  margin-top: 24px; font-size: 13px;
}
.store-footer-inner { padding-top: 28px; padding-bottom: 20px; } /* width/gutter: shared-container rule */
.store-footer-grid {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(170px, 1fr));
  gap: 22px 18px;
}
.store-footer-title {
  font-size: 11px; font-weight: 700; letter-spacing: .7px; text-transform: uppercase;
  color: #94a3b8; margin: 0 0 10px;
}
.store-footer-links { list-style: none; margin: 0; padding: 0; }
.store-footer-links li { margin: 0 0 8px; }
.store-footer-links a { color: #475569; font-weight: 600; }
.store-footer-links a:hover { color: var(--app-primary); }
.store-footer-bottom {
  border-top: 1px solid var(--app-border); margin-top: 22px; padding-top: 14px;
  display: flex; align-items: center; justify-content: space-between; gap: 10px; flex-wrap: wrap;
  color: var(--app-muted); font-size: 12px;
}
.store-footer-bottom p { margin: 0; }
.store-footer-brand { display: inline-flex; align-items: center; gap: 8px; font-weight: 700; color: var(--app-text); }

/* ── Cookie consent bar (common/cookie partial, #cookie keeps the common.js
   contract: `#cookie button` click posts the button's value URL) ── */
.store-cookie {
  position: fixed; left: 12px; right: 12px; bottom: calc(12px + env(safe-area-inset-bottom, 0px));
  z-index: 40; margin: 0 auto; max-width: 720px;
  background: #0f172a; color: #fff; border-radius: var(--app-radius);
  box-shadow: 0 10px 30px rgba(15,23,42,0.35);
  padding: 14px 16px; display: flex; align-items: center; gap: 14px; flex-wrap: wrap;
}
.store-cookie-icon { font-size: 26px; color: #fbbf24; flex-shrink: 0; }
.store-cookie-text { flex: 1 1 260px; font-size: 13px; line-height: 1.5; margin: 0; }
.store-cookie-text a { color: #93c5fd; font-weight: 700; }
.store-cookie-actions { display: flex; gap: 8px; flex-shrink: 0; }
.store-cookie .btn { border-radius: 10px; font-weight: 700; font-size: 13px; padding: 8px 14px; }

/* ── Generic page blocks shared by common/success and error/not_found ── */
.store-panel {
  background: var(--app-card); border: 1px solid var(--app-border);
  border-radius: var(--app-radius); box-shadow: var(--app-shadow);
  padding: 22px 22px 18px;
}
.store-panel-icon {
  width: 64px; height: 64px; border-radius: 18px; margin-bottom: 14px;
  background: #dcfce7; color: #16a34a; font-size: 32px;
  display: inline-flex; align-items: center; justify-content: center;
}
.store-panel-actions { display: flex; gap: 10px; flex-wrap: wrap; justify-content: flex-end; margin-top: 18px; }
/* Sidebar module columns from column_left/column_right */
#column-left, #column-right { display: block; }
@media (max-width: 767.98px) {
  /* stock hides both columns below md via d-none d-md-block — kept */
}

/* ── Bootstrap alert container (#alert) — the common.js contract. Stock
   ships these in stylesheet.css, which the native shell does not load. ── */
#alert {
  position: fixed; z-index: 9999; top: calc(var(--store-bar-h) + 8px);
  left: 50%; transform: translateX(-50%);
  width: min(600px, calc(100vw - 24px)); pointer-events: none;
}
#alert > * { pointer-events: auto; border-radius: 12px; box-shadow: 0 8px 24px rgba(15,23,42,0.16); }

/* ── Toast (#toast, footer.twig) ──────────────────────────────────────────
   app.css .toast-android is the admin recipe (pointer-events:none, offset for
   the admin bottom nav). The storefront has no bottom nav and needs a real
   dismiss button, so: sits 16px (+safe area) above the bottom edge, centred in
   the viewport, capped to the content band, above the drawer (50), the
   bottom-sheet (50) and its overlay (40) so it is never hidden behind either. */
.store-shell .toast-android {
  bottom: calc(16px + env(safe-area-inset-bottom, 0px));
  left: 12px; right: 12px; margin-inline: auto;
  width: fit-content; max-width: min(520px, calc(100vw - 24px));
  display: flex; align-items: center; gap: 10px; text-align: start;
  padding: 10px 10px 10px 16px; border-radius: 14px;
  pointer-events: none; z-index: 70;
}
.store-shell .toast-android.show { pointer-events: auto; }
.store-toast-msg { flex: 1; min-width: 0; font-size: 13.5px; font-weight: 600; }
.store-toast-close {
  flex-shrink: 0; width: 32px; height: 32px; border-radius: 9px; border: none;
  background: rgba(255,255,255,.12); color: #fff; font-size: 16px; cursor: pointer;
  display: inline-flex; align-items: center; justify-content: center;
}
.store-toast-close:hover, .store-toast-close:focus-visible { background: rgba(255,255,255,.24); outline: none; }
.store-toast-close:focus-visible { box-shadow: 0 0 0 2px #fff; }
@media (prefers-reduced-motion: reduce) { .store-shell .toast-android { transition: opacity .15s; transform: none; } }

/* ── Responsive ── */
@media (max-width: 767.98px) {
  :root { --store-bar-h: 56px; --store-gutter: 12px; }
  .store-bar-inner { padding-top: 6px; padding-bottom: 6px; gap: 4px; }
  .store-main .app-content { padding-left: 0; padding-right: 0; }
  .store-brand { font-size: 16px; }
  .store-brand img { max-height: 32px; }
  /* Search collapses to a second row toggled by the search icon (store.js) */
  .store-search { flex-basis: 100%; order: 10; display: none; padding-bottom: 4px; }
  .store-search.show { display: block; }
  /* One row on phones: hamburger | brand | [search-toggle, currency, language,
     account, wishlist, cart]. The brand shrinks first, pills go icon-only and
     lose their caret, and the cart keeps just its glyph (the stock button has
     no label span to hide, so the text is collapsed with font-size:0 and the
     icon re-sized). */
  .store-brand { flex: 0 1 auto; min-width: 0; }
  .store-brand img { max-width: 96px; }
  .store-brand-name { display: none; }
  .store-pill { padding: 0 6px; }
  .store-pill .store-caret { display: none; }
  #cart .dropdown > .btn { padding: 0 11px; font-size: 0; }
  #cart .dropdown > .btn i { font-size: 18px; }
  #cart .dropdown > .btn .store-cart-label { display: none; }
  .store-main { padding-top: 12px; }
  .store-footer-grid { grid-template-columns: 1fr 1fr; gap: 18px 14px; }
}
@media (min-width: 768px) {
  .store-search-toggle { display: none; }
  /* one row: brand | search (shrinks) | actions */
  .store-bar-inner { flex-wrap: nowrap; }
}
@media (min-width: 992px) {
  .store-drawer-toggle, .store-drawer, .store-drawer-overlay { display: none !important; }
  .store-only-mobile { display: none !important; }
}
/* Pill text labels only once the band is wide enough to hold brand + a usable
   search box + six labelled pills on one row; 992–1199px stays icon-only. */
@media (min-width: 1200px) {
  .store-pill-label { display: inline; }
}
@media (max-width: 991.98px) {
  .store-only-desktop { display: none !important; }
}
@media print {
  .store-bar, .store-nav, .store-footer, .store-drawer, .store-cookie, #alert { display: none !important; }
}
