/* ==========================================================================
   WebPack.kz — 2026 redesign
   Header / top nav / banner / catalog tiles / about / popular products /
   advantages / news / footer.
   BEM-ish naming, prefix "wp-" to avoid collisions with legacy style.m.css
   (legacy CDN CSS is still loaded on the site for catalog/product/cart pages
   that are out of scope for this pass — see report).

   "Заказная продукция" (custom-order, modules/page/templates_2025/custom_*.tpl)
   styles used to live at the end of this file; split out to style2026-custom.css
   (loaded right after this file in main.tpl) so the two areas can be worked on
   without one edit colliding with the other. :root custom properties defined
   below still apply there — CSS variables resolve against the document, not
   per-file, so load order between the two stylesheets doesn't matter.
   ========================================================================== */

:root{
  --wp-blue:#2E7FCB;
  --wp-blue-dark:#1E63A3;
  --wp-blue-grad-top:#0088CE;
  --wp-blue-grad-bottom:#0177BF;
  --wp-btn-grad-a:#4FA3E8;
  --wp-btn-grad-b:#2E7FCB;
  --wp-ink:#1B1D22;
  --wp-ink-soft:#2B2B2E;
  --wp-text:#5C6270;
  --wp-text-muted:#6B7280;
  --wp-text-invert-muted:#9BA1AC;
  --wp-border:#E7EBEF;
  --wp-border-hover:#C7CDD6;
  --wp-bg-soft:#F6F7F8;
  --wp-bg-panel:#F7F8FA;
  --wp-green:#1E7A46;
  --wp-amber:#A85F09;
  --wp-red:#C0392B;
  --wp-pink:#E0537C;
  --wp-pink-dark:#C23D63;
  --wp-dark:#1B1D22;
  --wp-dark-panel:#2B2E36;
  --wp-radius:6px;
  --wp-radius-lg:12px;
  --wp-maxw:1424px; /* 1360px content width + 32px horizontal padding on each side (border-box) */
  --wp-shadow-card:0 6px 14px rgba(27,29,34,.08);
  --wp-shadow-header:0 2px 10px rgba(27,29,34,.06);

  /* Type scale — every font-size in this file now resolves through one of these (available
     to style2026-custom.css too, since :root vars resolve against the document regardless of
     which stylesheet declared them). Previously every declaration hardcoded its own px value
     and the scale had drifted to 18 distinct sizes including several one-off values a couple
     px apart from their neighbors (12.5, 17, 19, 21, 23, 26) with no clear reason for the
     difference; those were folded into the nearest step below when this was introduced. */
  --fs-10:10px;
  --fs-11:11px;
  --fs-12:12px;
  --fs-13:13px;
  --fs-14:14px;
  --fs-15:15px;
  --fs-16:16px;
  --fs-18:18px;
  --fs-20:20px;
  --fs-22:22px;
  --fs-28:28px;
  --fs-32:32px;
}

/* ---------- base ---------- */
/* Legacy style.m.css used to zero out the browser default <body> margin site-wide;
   that reset was lost when it was removed, leaving the UA-default 8px edge gap.
   overflow-x is `clip`, not `hidden` — `hidden` makes html/body scroll containers of their
   own, which breaks `position:sticky` for every descendant sticky element (left sidebar,
   header) instead of letting them stick to the real viewport scroll. `clip` still stops
   horizontal overflow without creating that scroll container. */
/* Reserves the vertical scrollbar's width up front, even on pages that don't need to scroll
   yet — otherwise a page that's shorter than the viewport on first paint (no scrollbar) and
   then grows taller as images/content load (scrollbar appears) loses ~15-17px of layout
   width mid-load. Anything with a width breakpoint sitting near that margin (e.g. the
   .wp-popular carousel-vs-grid @media query) can flip states right as the page finishes
   loading, which looks like an unwanted layout jump. */
/* scrollbar-gutter only has an effect when overflow is NOT visible on that axis — overflow-y
   was left at its default (visible) here, so the previous attempt at this rule did nothing.
   overflow-y:auto is what the browser was already doing implicitly for the page scrollbar;
   spelling it out is what makes scrollbar-gutter actually take effect. */
html{ scrollbar-gutter:stable; overflow-y:auto; }
html, body{ margin:0; padding:0; overflow-x:clip; }
.hide{ display:none !important; }
.wp-root, .wp-root *{ box-sizing:border-box; }
.wp-root{
  font-family:'Manrope',system-ui,-apple-system,'Segoe UI',Arial,sans-serif;
  font-weight:500;
  -webkit-font-smoothing:antialiased;
  color:var(--wp-ink);
  background:#fff;
}
.wp-root a{ color:var(--wp-blue); text-decoration:none; }
.wp-root a:hover{ color:var(--wp-blue-dark); }
.wp-root img{ max-width:100%; }
/* Generic .breadcrumbs-box fallback — .wp-product/.wp-catalog-page/.wp-basket each carry their
   own near-identical copy of this (added separately, page by page, over the course of this
   redesign); pages with neither of those page-scope classes (e.g. the /catalog/ index,
   catalog_page_category.tpl) had no breadcrumb styling at all and fell back to the browser's
   plain numbered <ol>. Placed early in the file, right after the base .wp-root rules, so the
   later page-specific copies above (same specificity, but declared further down) still win
   there via source order — this only fills the gap where none of them apply. */
.wp-root .breadcrumbs-box .menu{
  display:flex; flex-wrap:wrap; align-items:center; gap:8px; list-style:none; margin:0 0 16px; padding:0;
  font-size:var(--fs-13); color:var(--wp-text-muted);
}
.wp-root .breadcrumbs-box li{ display:flex; align-items:center; gap:8px; }
.wp-root .breadcrumbs-box li:not(:last-child)::after{ content:"\203A"; color:var(--wp-border-hover); }
.wp-root .breadcrumbs-box a{ color:var(--wp-text-muted); font-weight:500; transition:color .2s ease; }
.wp-root .breadcrumbs-box a:hover{ color:var(--wp-blue); }
.wp-root .breadcrumbs-box li:last-child{ color:var(--wp-ink); font-weight:600; }
/* /catalog/ index (catalog_page.tpl/catalog_page_category.tpl) has no .wp-content-shell —
   that's what gives the other catalog/product pages their 24px top margin before the sticky
   header — so its breadcrumb row sat flush against the nav bar. */
.wp-catalog-index .breadcrumbs-box{ margin-top:24px; }
#left-catalog-head{ background:var(--wp-bg-panel); padding-bottom:40px; }
/* padding, not just background — .wp-calc's own margin:24px auto (search_items.tpl) has
   nothing to stop it collapsing through this parent (no padding/border of its own), pushing
   the whole box down and exposing the white body background above it as a stripe. */
#left-catalog-calc{ background:var(--wp-bg-panel); padding:1px 0 32px; }
.wp-catalog-index .title-box.mb-small{ margin-bottom:20px; }
/* .wp-catalog's own background/margin-top/padding (defined further down, for its usual
   homepage role as its own standalone section) would otherwise double up with
   #left-catalog-head's — here it's nested inside that section purely to reuse the
   ".wp-catalog .item-wrap.js-tab-block" active-panel rule, not for its box styling. The #id
   in this selector outranks the plain .wp-catalog rule regardless of source order, so this is
   safe to declare anywhere in the file. */
#left-catalog-head .wp-catalog{ background:none; margin-top:0; padding:0; }
.wp-container{ max-width:var(--wp-maxw); margin:0 auto; padding:0 32px; }
.wp-eyebrow{ display:flex; align-items:center; gap:10px; margin-bottom:8px; }
.wp-eyebrow__bar{ width:24px; height:2px; background:var(--wp-blue); flex:none; }
.wp-eyebrow__text{ font-size:var(--fs-13); font-weight:700; letter-spacing:.08em; color:var(--wp-text-muted); text-transform:uppercase; }
.wp-h2{ margin:0; font-size:var(--fs-28); font-weight:700; color:var(--wp-ink); }
.wp-root .wp-h2 a{ color:inherit; text-decoration:none; transition:color .2s ease; }
.wp-root .wp-h2 a:hover{ color:var(--wp-blue); }
.wp-btn-grad{
  display:inline-block; padding:12px 26px; border-radius:var(--wp-radius);
  background:linear-gradient(135deg,var(--wp-btn-grad-a),var(--wp-btn-grad-b));
  color:#fff; font-size:var(--fs-14); font-weight:700; transition:filter .3s ease; border:none; cursor:pointer;
}
.wp-btn-grad:hover{ filter:brightness(1.12) saturate(1.1); color:#fff; }

/* ==========================================================================
   TOP BAR
   ========================================================================== */
.wp-topbar{ background:var(--wp-bg-soft); border-bottom:1px solid var(--wp-border); }
.wp-topbar__row{
  max-width:var(--wp-maxw); margin:0 auto;
  display:flex; align-items:center; justify-content:space-between; gap:20px;
  flex-wrap:wrap; row-gap:6px; padding:9px 32px;
}
.wp-topbar__links{ display:flex; align-items:center; gap:22px; font-size:var(--fs-13); font-weight:600; color:var(--wp-text); flex-wrap:wrap; }
.wp-topbar__links a{ color:var(--wp-text); transition:color .2s ease; }
.wp-topbar__links a:hover{ color:var(--wp-blue); }
.wp-topbar__links a.active{ color:var(--wp-blue); font-weight:700; }
.wp-topbar__right{ display:flex; align-items:center; gap:18px; flex-wrap:wrap; }
.wp-topbar__fav.wp-topbar__fav{ display:flex; align-items:center; gap:5px; color:var(--wp-text); font-size:var(--fs-13); font-weight:600; }
.wp-topbar__fav svg{ flex:none; }
.wp-topbar__lk.wp-topbar__lk{ color:var(--wp-text); font-size:var(--fs-13); font-weight:600; transition:color .2s ease; }
.wp-topbar__lk:hover{ color:var(--wp-blue); }
.wp-topbar__sep{ width:1px; height:16px; background:var(--wp-border); }
.wp-flag{ width:22px; height:15px; border-radius:2px; overflow:hidden; display:flex; flex-direction:column; cursor:pointer; flex:none; }
.wp-flag span{ flex:1; }
.wp-lang{ display:flex; align-items:center; gap:8px; }
.wp-lang a{ display:flex; opacity:.55; transition:opacity .2s ease; }
.wp-lang a.is-active{ opacity:1; }
.wp-lang a:hover{ opacity:1; }

/* ==========================================================================
   STICKY HEADER
   ========================================================================== */
/* .wp-topbar should scroll away while .wp-header (which already wraps both the logo/search/
   phone/cart row AND <nav class="wp-nav"> — see main.tpl) stays stuck. A sticky element can
   only stick within the bounds of its own flow PARENT's box, though, and that parent here is
   <header class="wp-page-header"> — only as tall as topbar+header combined (~207px), so on
   any longer page .wp-header would un-stick and scroll away with it well before the user
   reaches the bottom. display:contents removes wp-page-header's own box (topbar and .wp-header
   become effectively direct children of .wrap, ~3700px tall, for layout/sticky purposes)
   without changing the DOM/semantics, giving .wp-header a properly tall containing block to
   stay stuck within — while .wp-topbar, no longer sticky itself, scrolls away normally. */
.wp-page-header{ display:contents; }
/* z-index:56, not 40 — .wp-header creates its own stacking context (position:sticky), so
   its z-index has to clear .wp-nav__backdrop's (55) for the mobile drawer/backdrop pair
   nested inside it to paint above the backdrop; otherwise the whole header (including the
   open drawer, itself z-index:60 but trapped inside this context) renders BELOW the
   backdrop's dimming overlay and looks washed-out grey. */
.wp-header{ position:sticky; top:0; z-index:56; background:#fff; box-shadow:var(--wp-shadow-header); }
.wp-header__row{
  max-width:var(--wp-maxw); margin:0 auto; padding:18px 32px;
  display:flex; align-items:center; gap:24px; flex-wrap:wrap; row-gap:12px;
}
.wp-logo{ display:flex; align-items:center; gap:12px; flex:none; }
.wp-logo img{ height:30px; width:auto; display:block; }
.wp-logo__sep{ width:1px; height:34px; background:var(--wp-border); flex:none; }
.wp-logo__tag{ font-size:var(--fs-12); font-weight:700; color:var(--wp-text-muted); letter-spacing:.02em; line-height:1.45; }
.wp-header__spacer{ flex:1; min-width:12px; }
.wp-header__sep{ width:1px; height:34px; background:var(--wp-border); flex:none; }
.wp-header__sep{ display:block; }

.wp-mail{ line-height:1.4; flex:none; }
.wp-mail__addr.wp-mail__addr{ font-size:var(--fs-14); font-weight:700; color:var(--wp-blue); display:block; }
.wp-mail .wp-mail__wa{ font-size:var(--fs-13); color:var(--wp-text-muted); font-weight:600; display:block; margin-top:2px; transition:color .2s ease; }
.wp-mail .wp-mail__wa:hover{ color:var(--wp-blue); }

.wp-phone{ display:flex; align-items:center; gap:10px; flex:none; }
.wp-phone svg{ flex:none; }
.wp-phone__num{ font-size:var(--fs-20); font-weight:800; color:var(--wp-ink-soft); line-height:1.3; display:block; }
.wp-phone__time{ font-size:var(--fs-13); color:var(--wp-text-muted); font-weight:600; margin-top:2px; display:block; }

.wp-header-wa{ display:none; }
.wp-cart-btn{ display:flex; align-items:center; gap:14px; flex:none; cursor:pointer; color:inherit; }
.wp-cart-btn:hover{ color:inherit; }
.wp-cart-btn__icon{ transition:transform .3s cubic-bezier(.34,1.56,.64,1); flex:none; }
.wp-cart-btn:hover .wp-cart-btn__icon{ transform:rotate(-10deg) scale(1.12); }
.wp-cart-btn__label{ font-size:var(--fs-14); font-weight:700; color:var(--wp-ink-soft); line-height:1.3; display:block; }
.wp-cart-btn__meta{ font-size:var(--fs-13); color:var(--wp-text-muted); font-weight:600; margin-top:2px; display:block; }

/* header cart dropdown (basket_popup.tpl) — legacy style.m.css used to hide this by default
   and reveal it on the site's own "active" toggle; that base rule was lost when style.m.css
   was removed, so it rendered permanently open under the header. Restore the hidden-by-default
   behaviour here, site-wide (not scoped to any one page). */
.popup-outer-box{ display:none; }
.popup-outer-box.active{ display:block; }
.popup-cart-header.popup-outer-box{
  position:absolute; top:calc(100% - 2px); right:0; z-index:60; width:380px; max-width:92vw;
  background:#fff; border-radius:var(--wp-radius-lg); box-shadow:var(--wp-shadow-card), 0 20px 40px rgba(27,29,34,.16);
}
/* Opens the cart preview on hover (desktop/mouse only — touch keeps the existing tap-to-open
   .js-popup-open/.active behavior from main2026.js, since hover isn't a reliable touch gesture).
   padding-bottom+negative margin-bottom extends .wp-cart-hover-wrap's own hoverable box past the
   8px gap above without adding real layout space, so moving the mouse straight down from the
   cart button to the dropdown doesn't cross a dead zone and prematurely lose :hover. */
.wp-cart-hover-wrap {
    position: relative;
    padding-bottom: 20px;
    margin-bottom: -20px;
}
@media (hover:hover) and (pointer:fine){
  .wp-cart-hover-wrap:hover .popup-cart-header.popup-outer-box{ display:block; }
}
.popup-cart-header .popup-box{ position:relative; padding:20px; }
.popup-cart-header .popup-title-wrap{ margin-bottom:12px; }
.popup-cart-header .popup-title{ font-size:var(--fs-16); font-weight:700; color:var(--wp-ink); }
.popup-cart-header .title-counter{ display:block; font-size:var(--fs-13); font-weight:600; color:var(--wp-text-muted); margin-top:2px; }
.popup-cart-header .btn-popup-close{
  position:absolute; top:14px; right:14px; width:24px; height:24px; border:none; background:transparent;
  cursor:pointer; opacity:.5;
}
/* modules/basket/templates_2025/basket_popup_items.tpl — the cart-preview line items never
   got a redesign pass (see main.tpl comment near the CSS link: "not-yet-redesigned pages...
   will render unstyled"). Now that the dropdown opens on hover as well as click it's seen much
   more often, so it gets its own pass here rather than staying bare blue links and unstyled
   inputs. Scoped to .popup-cart-header since .item-wrap/.tile-title/.btn etc are generic,
   reused class names elsewhere on the site. */
.popup-cart-header .items-wrap{ max-height:340px; overflow-y:auto; margin:0 -20px; padding:0 20px; }
.popup-cart-header .item-wrap{ padding:14px 0; border-top:1px solid var(--wp-border); }
.popup-cart-header .item-wrap:first-child{ border-top:none; padding-top:0; }
.popup-cart-header .item-tile-cart-popup{ position:relative; display:flex; gap:12px; padding-right:22px; }
.popup-cart-header .tile-photo-wrap{ flex:none; }
.popup-cart-header .tile-photo{
  display:block; width:56px; height:56px; border-radius:var(--wp-radius); border:1px solid var(--wp-border);
  overflow:hidden; background:#fff;
}
.popup-cart-header .tile-photo img{ width:100%; height:100%; object-fit:contain; }
.popup-cart-header .tile-info-wrap{ flex:1; min-width:0; display:flex; flex-direction:column; gap:6px; }
.popup-cart-header .tile-title{
  font-size:var(--fs-14); font-weight:600; line-height:1.4; color:var(--wp-ink);
  display:-webkit-box; -webkit-box-orient:vertical; -webkit-line-clamp:2; overflow:hidden;
}
.popup-cart-header .tile-title a{ color:var(--wp-ink); }
.popup-cart-header .tile-title a:hover{ color:var(--wp-blue); }
.popup-cart-header .tile-counter-price-row{ display:flex; align-items:center; justify-content:space-between; gap:8px; }
.popup-cart-header .tile-counter-wrap{ display:flex; align-items:center; gap:8px; }
.popup-cart-header .frm-field-counter.basket-counter{
  display:flex; align-items:center; gap:2px; border:1px solid var(--wp-border); border-radius:6px;
  padding:0 2px; height:30px; box-sizing:border-box; flex:none;
}
.popup-cart-header .frm-field-counter.basket-counter .button-plus,
.popup-cart-header .frm-field-counter.basket-counter .button-minus{
  width:20px; height:100%; border:none; background:none; color:var(--wp-text); font-weight:700;
  cursor:pointer; position:relative; flex:none;
}
/* Markup order is plus, minus, input (see basket_popup_items.tpl) — reorder visually so minus
   sits left of the number and plus sits right, the conventional stepper layout. */
.popup-cart-header .frm-field-counter.basket-counter .button-minus{ order:1; }
.popup-cart-header .frm-field-counter.basket-counter .js-input-counter{ order:2; }
.popup-cart-header .frm-field-counter.basket-counter .button-plus{ order:3; }
.popup-cart-header .frm-field-counter.basket-counter .button-plus::before{ content:"+"; }
.popup-cart-header .frm-field-counter.basket-counter .button-minus::before{ content:"\2212"; }
.popup-cart-header .frm-field-counter.basket-counter .button-plus:hover,
.popup-cart-header .frm-field-counter.basket-counter .button-minus:hover{ color:var(--wp-blue); }
.popup-cart-header .frm-field-counter.basket-counter .js-input-counter{
  width:32px; border:none; outline:none; text-align:center; font-size:var(--fs-13); font-weight:600;
  color:var(--wp-ink); font-family:inherit; background:none;
}
.popup-cart-header .frm-field-counter.basket-counter .field-total{ display:none; }
.popup-cart-header .tile-price-wrap{ margin-left:auto; }
.popup-cart-header .tile-price{ font-size:var(--fs-14); font-weight:700; color:var(--wp-ink); white-space:nowrap; }
.popup-cart-header .tile-button-del{
  position:absolute; top:0; right:0; width:22px; height:22px; border:none; background:none;
  cursor:pointer; opacity:.4; flex:none;
}
.popup-cart-header .tile-button-del:hover{ opacity:1; }
.popup-cart-header .tile-button-del::before, .popup-cart-header .tile-button-del::after,
.wp-basket .tile-button.ico-del::before, .wp-basket .tile-button.ico-del::after{
  content:""; position:absolute; top:50%; left:50%; width:14px; height:2px; background:var(--wp-text-muted);
}
.popup-cart-header .tile-button-del:hover::before, .popup-cart-header .tile-button-del:hover::after,
.wp-basket .tile-button.ico-del:hover::before, .wp-basket .tile-button.ico-del:hover::after{ background:var(--wp-red); }
.popup-cart-header .tile-button-del::before, .wp-basket .tile-button.ico-del::before{ transform:translate(-50%,-50%) rotate(45deg); }
.popup-cart-header .tile-button-del::after, .wp-basket .tile-button.ico-del::after{ transform:translate(-50%,-50%) rotate(-45deg); }
.popup-cart-header .popup-buttons-wrap{ margin:16px -20px -20px; padding:16px 20px 20px; border-top:1px solid var(--wp-border); }
.popup-cart-header .popup-button-wrap .btn{
  display:flex; align-items:center; justify-content:center; width:100%; height:44px; border:none;
  border-radius:10px; background:linear-gradient(135deg,var(--wp-btn-grad-a),var(--wp-btn-grad-b));
  color:#fff; font-size:var(--fs-14); font-weight:700; cursor:pointer; text-decoration:none; transition:filter .2s ease;
}
.popup-cart-header .popup-button-wrap .btn:hover{ filter:brightness(1.12) saturate(1.1); }

/* #popup-form (call_back_popup.tpl, "Обратная связь") — centered modal + backdrop. Like the
   cart dropdown above, this lost its positioning when legacy style.m.css was removed; unlike
   the dropdown it's a full modal, not an anchored panel, so it needs its own overlay treatment
   rather than reusing .popup-cart-header's. */
#popup-form.popup-outer-box.active{
  position:fixed; inset:0; z-index:100; display:flex; align-items:center; justify-content:center;
  padding:20px; background:rgba(27,29,34,.5); box-sizing:border-box;
}
#popup-form .popup-box{
  position:relative; width:100%; max-width:420px; max-height:90vh; overflow-y:auto;
  background:#fff; border-radius:var(--wp-radius-lg); box-shadow:0 20px 50px rgba(27,29,34,.25); padding:28px;
  box-sizing:border-box;
}
#popup-form .btn-popup-close{
  position:absolute; top:14px; right:14px; width:32px; height:32px; border-radius:50%; border:none;
  background:var(--wp-bg-panel); cursor:pointer;
}
#popup-form .popup-title-wrap{ margin-bottom:16px; padding-right:28px; }
#popup-form .popup-title{ font-size:var(--fs-18); font-weight:700; color:var(--wp-ink); margin-bottom:6px; }
#popup-form .popup-title-wrap p{ font-size:var(--fs-14); color:var(--wp-text-muted); line-height:1.5; margin:0; }
#popup-form .frm-row{ margin-bottom:12px; }
#popup-form .form-input{
  width:100%; height:46px; border:1px solid var(--wp-border); border-radius:8px; padding:0 14px;
  font-size:var(--fs-14); font-family:inherit; color:var(--wp-ink); box-sizing:border-box; outline:none;
}
#popup-form textarea.form-input{ height:100px; padding:12px 14px; resize:vertical; }
#popup-form .form-input:focus{ border-color:var(--wp-blue); }
#popup-form .frm-row-submit{ margin-top:16px; }
#popup-form .button-main{
  width:100%; height:48px; border:none; border-radius:10px; cursor:pointer;
  background:linear-gradient(135deg,var(--wp-btn-grad-a),var(--wp-btn-grad-b)); color:#fff; font-size:var(--fs-15); font-weight:700;
}
#popup-form .button-main:hover{ filter:brightness(1.1) saturate(1.1); }
#popup-form .frm-message.text-alert{ font-size:var(--fs-12); color:var(--wp-red); margin-top:4px; }
.popup-cart-header .btn-popup-close:hover{ opacity:1; }

/* .popup-message (delete-confirm dialogs: #popup-cart-deleted in basket_items.tpl/
   basket_detailed_new.tpl, #popup-del-address-* in stat/delivery.tpl, #popup-del-company-*
   in stat/company.tpl) — same missing-positioning problem as #popup-form above: without this
   it just renders inline wherever its markup sits in the page (near the very bottom of the
   basket/account content), with unstyled buttons, instead of as a centered modal. Gets its
   own overlay treatment reusing #popup-form's pattern since .popup-cart-header's anchored-
   panel positioning doesn't apply here. */
.popup-message.popup-outer-box.active{
  position:fixed; inset:0; z-index:100; display:flex; align-items:center; justify-content:center;
  padding:20px; background:rgba(27,29,34,.5); box-sizing:border-box;
  font-family:'Manrope',system-ui,-apple-system,'Segoe UI',Arial,sans-serif;
}
.popup-message .popup-box{
  position:relative; width:100%; max-width:380px; background:#fff; border-radius:var(--wp-radius-lg);
  box-shadow:0 20px 50px rgba(27,29,34,.25); padding:28px; box-sizing:border-box;
}
.popup-message.popup-message-large .popup-box{ max-width:460px; }
.popup-message .btn-popup-close{
  position:absolute; top:14px; right:14px; width:32px; height:32px; border-radius:50%; border:none;
  background:var(--wp-bg-panel); cursor:pointer; opacity:.6;
}
.popup-message .btn-popup-close:hover{ opacity:1; }
.popup-message .popup-title-wrap{ margin-bottom:20px; padding-right:28px; }
.popup-message .popup-title{ font-size:var(--fs-18); font-weight:700; color:var(--wp-ink); line-height:1.4; }
.popup-message .popup-buttons-wrap{ display:flex; gap:10px; }
.popup-message .popup-button-wrap{ flex:1; }
.popup-message .popup-button-wrap .btn{
  display:flex; align-items:center; justify-content:center; width:100%; height:44px; border-radius:10px;
  font-size:var(--fs-14); font-weight:700; cursor:pointer; text-decoration:none; box-sizing:border-box;
  border:none; background:linear-gradient(135deg,var(--wp-btn-grad-a),var(--wp-btn-grad-b)); color:#fff;
  transition:filter .2s ease;
}
.popup-message .popup-button-wrap .btn:hover{ filter:brightness(1.12) saturate(1.1); }
.popup-message .popup-button-wrap .btn.button-border{
  background:#fff; color:var(--wp-ink); border:1px solid var(--wp-border);
}
.popup-message .popup-button-wrap .btn.button-border:hover{ filter:none; background:var(--wp-bg-panel); }

/* .popup-form-cols (#popup-add-company in stat/company.tpl, #popup-add-address in
   stat/delivery.tpl) — same missing-overlay problem as #popup-form/.popup-message above:
   without this it renders inline at the bottom of the page instead of as a modal (this is
   what "Добавить компанию" looked like — plain unstyled HTML dumped under the page). Reuses
   #popup-form's overlay pattern; the form styling itself is pulled in below by adding this
   selector to the existing .wp-account-shell/.wp-basket shared rules (both popups sit outside
   those containers in the DOM, so none of that scoped styling reached them either). */
.popup-form-cols.popup-outer-box.active{
  position:fixed; inset:0; z-index:100; display:flex; align-items:center; justify-content:center;
  padding:20px; background:rgba(27,29,34,.5); box-sizing:border-box;
  font-family:'Manrope',system-ui,-apple-system,'Segoe UI',Arial,sans-serif;
}
.popup-form-cols .popup-box{
  position:relative; width:100%; max-width:720px; max-height:90vh; overflow-y:auto;
  background:#fff; border-radius:var(--wp-radius-lg); box-shadow:0 20px 50px rgba(27,29,34,.25); padding:28px;
  box-sizing:border-box;
}
.popup-form-cols .btn-popup-close{
  position:absolute; top:14px; right:14px; width:32px; height:32px; border-radius:50%; border:none;
  background:var(--wp-bg-panel); cursor:pointer; opacity:.6;
}
.popup-form-cols .btn-popup-close:hover{ opacity:1; }
.popup-form-cols .popup-title-wrap{ margin-bottom:20px; padding-right:28px; }
.popup-form-cols .popup-title{ font-size:var(--fs-18); font-weight:700; color:var(--wp-ink); }
.popup-form-cols .form-lk-box{ display:flex; flex-direction:column; gap:20px; }
.popup-form-cols .frm-section-wrap{ background:#fff; border:1px solid var(--wp-border); border-radius:var(--wp-radius-lg); padding:20px; }
.popup-form-cols .lk-toggle-box{ background:none; border:none; margin:0; }
/* #form-address-msk/#form-address-tk's .frm-row-submit (the "Добавить адрес"/"Отмена" buttons)
   only had the #form-company-specific flex-basis rule below reaching it — no display:flex ever
   applied, so the two buttons rendered as stacked block-level divs with no gap between them. */
.popup-form-cols .frm-row-submit{ display:flex; align-items:center; gap:16px; flex-wrap:wrap; margin-top:16px; }
/* the generic ".popup-form-cols .frm-field{ flex:1 1 100% }" rule (further below) forces every
   field to fill its row — including these two button fields, which pushed "Отмена" onto its own
   line under "Добавить адрес" instead of sitting beside it. Buttons should size to content. */
.popup-form-cols .frm-row-submit .frm-field{ flex:0 1 auto; }
/* company.tpl's two .frm-section-wrap blocks are meant to sit side-by-side ("cols") inside
   #form-company; delivery.tpl's #form-address-* forms don't use this markup (single-column
   tabbed content) so this only ever matches company's form. */
.popup-form-cols #form-company{ display:flex; flex-wrap:wrap; gap:20px; }
.popup-form-cols #form-company .frm-section-wrap{ flex:1 1 260px; }
.popup-form-cols #form-company .frm-row-submit{ flex-basis:100%; }
/* "Организация не найдена..." was unconditionally in the markup with no hide-by-default —
   same bug already fixed for other validation messages site-wide — so it showed permanently
   instead of only after a failed INN search. */
.popup-form-cols #search_inn .frm-message.text-alert{ display:none; }

/* #left_menu (templates_2025/left_menu.tpl) is a mobile-only quick-nav strip; legacy CSS used
   to hide it on desktop entirely. Restore that, and give it a simple fixed bottom tab bar on
   mobile so it isn't just a bare bullet list. */
#left_menu{ display:none; }

.wp-search-toggle, .wp-burger{ display:none; flex:none; width:38px; height:38px; border-radius:6px; border:1px solid var(--wp-border); background:#fff; align-items:center; justify-content:center; cursor:pointer; }
.wp-burger span{ display:block; width:18px; height:2px; background:var(--wp-ink); position:relative; }
.wp-burger span::before, .wp-burger span::after{ content:""; position:absolute; left:0; width:18px; height:2px; background:var(--wp-ink); transition:transform .2s ease; }
.wp-burger span::before{ top:-6px; }
.wp-burger span::after{ top:6px; }
.wp-burger.is-active span{ background:transparent; }
.wp-burger.is-active span::before{ top:0; transform:rotate(45deg); }
.wp-burger.is-active span::after{ top:0; transform:rotate(-45deg); }

/* ---------- category nav ---------- */
.wp-nav{ background:linear-gradient(180deg,var(--wp-blue-grad-top),var(--wp-blue-grad-bottom)); box-shadow:0 4px 8px -4px rgba(27,29,34,.25); }
.wp-nav__row{ max-width:var(--wp-maxw); margin:0 auto; padding:0 32px; display:flex; align-items:stretch; font-size:var(--fs-15); min-height:44px; }
.wp-nav__list{ display:flex; align-items:stretch; flex:1; min-width:0; flex-wrap:wrap; list-style:none; margin:0; padding:0; }
/* info-page links (Оплата/Доставка/Контакты/...) appended to the mobile drawer only — same
   pages as .wp-topbar__links, which is hidden below 900px so these would otherwise be
   unreachable on mobile. Desktop already has them in the topbar, so hide here. */
.wp-nav__list-divider, .wp-nav__list-extra{ display:none; }
/* real markup comes from templates_2025/menu_top.tpl: <li><a class="btn-menu">...
   {if children}<ul class="menu"><li><a class="btn-menu">...</a></li>...</ul>{/if}</li> */
.wp-nav__list > li{ position:relative; list-style:none; }
.wp-nav__list > li > a.btn-menu{
  position:relative; z-index:0; color:rgba(255,255,255,.9); border-right:1px solid rgba(255,255,255,.18);
  font-weight:600; display:flex; align-items:center; gap:6px; padding:0 22px; height:100%; min-height:44px;
  box-sizing:border-box; white-space:nowrap; text-decoration:none;
}
.wp-nav__list > li:last-child > a.btn-menu{ border-right:none; }
.wp-nav__list > li > a.btn-menu::before{
  content:""; position:absolute; inset:0; background:rgba(255,255,255,.14); opacity:0; transition:opacity .25s ease; z-index:-1;
}
.wp-nav__list > li > a.btn-menu::after{
  content:""; position:absolute; top:0; left:0; right:0; height:3px; background:#0279c1;
  box-shadow:0 2px 8px rgba(255,255,255,.7); transform:scaleX(0); transform-origin:center;
  transition:transform .35s cubic-bezier(.22,.61,.36,1);
}
.wp-nav__list > li:hover > a.btn-menu::before,
.wp-nav__list > li > a.btn-menu.active::before,
.wp-nav__list > li > a.btn-menu.active-parent::before{ opacity:1; }
.wp-nav__list > li:hover > a.btn-menu::after,
.wp-nav__list > li > a.btn-menu.active::after,
.wp-nav__list > li > a.btn-menu.active-parent::after{ transform:scaleX(1); }
.wp-nav__list > li > a.btn-menu .button-title{ display:block; }

.wp-nav__list > li > ul.menu{
  display:none; position:absolute; top:100%; left:0; background:#fff; list-style:none; margin:0;
  box-shadow:0 10px 24px rgba(27,29,34,.14); border-radius:0 0 8px 8px; min-width:240px; z-index:20; padding:8px 0;
}
/* hover-reveal is for real mouse pointers only — on touch devices (mobile drawer) this
   rule has no ":hover" gesture to key off, but some mobile browsers apply a "sticky" :hover
   state after a tap/scroll anyway, which was popping submenus open at random underneath the
   JS-driven .is-open accordion (main2026.js initNavDropdowns), causing overlapping text. */
@media (hover:hover) and (pointer:fine){
  .wp-nav__list > li:hover > ul.menu{ display:block; }
}
.wp-nav__list > li.is-open > ul.menu{ display:block; }
.wp-nav__list > li > ul.menu > li > a.btn-menu{
  display:block; padding:10px 20px 10px 19px; border-left:3px solid transparent; color:var(--wp-ink);
  font-weight:600; font-size:var(--fs-14); transition:background-color .2s ease,border-color .2s ease; text-decoration:none;
}
.wp-nav__list > li > ul.menu > li > a.btn-menu:hover,
.wp-nav__list > li > ul.menu > li > a.btn-menu.active,
.wp-nav__list > li > ul.menu > li > a.btn-menu.active-parent{ background:var(--wp-bg-panel); border-left-color:var(--wp-blue); color:var(--wp-ink); }

.wp-nav__search{ display:flex; align-items:center; flex:0 0 auto; padding:5px 0px 5px 16px; margin-left:auto; }
.wp-nav__search-inner{ position:relative; display:flex; align-items:center; }
.wp-nav__search-input{
  width:230px; height:36px; border:none; border-radius:6px; background:#fff; padding:0 42px 0 14px;
  outline:none; color:var(--wp-ink); font-size:var(--fs-14); font-family:inherit; box-sizing:border-box;
}
.wp-nav__search-btn{
  position:absolute; top:50%; right:3px; transform:translateY(-50%); display:flex; align-items:center; justify-content:center;
  width:30px; height:30px; margin:0; padding:0;
  border-radius:6px; background:linear-gradient(180deg,var(--wp-blue-grad-top),var(--wp-blue-grad-bottom));
  cursor:pointer; box-shadow:0 2px 8px rgba(0,0,0,.18); border:none; transition:filter .25s ease;
}
.wp-nav__search-btn:hover{ filter:brightness(1.15) saturate(1.1); }

/* ==========================================================================
   BANNER CAROUSEL
   Real markup/data comes from main_page.tpl's original Swiper-based slider
   ({$banners_list_new} foreach, .slider-wrap.swiper / .slider.swiper-wrapper /
   .sl-wrap.swiper-slide, arrows .button-slider-tile-prev/next, dots
   .slider-tile-pagination). Swiper is already loaded site-wide and (per the
   existing arrow/pagination class-naming convention used identically for
   product-photo sliders) already initialised generically by the site's own
   JS — so we only re-skin colours/shape here instead of writing a new
   carousel; this supports any number of banners automatically. */
.wp-banner-wrap{ max-width:var(--wp-maxw); margin:0 auto; padding:28px 32px 0; box-sizing:border-box; }
.wp-banner.slider-inner-wrap{ position:relative; width:100%; aspect-ratio:1514/364; border-radius:var(--wp-radius); overflow:hidden; background:#0B3B66; }
.wp-banner .slider-wrap, .wp-banner .slider{ height:100%; }
.wp-banner .sl-wrap{ position:relative; width:100%; height:100%; }
.wp-banner .sl-link{ display:block; width:100%; height:100%; }
.wp-banner .elm-photo{ position:absolute; inset:0; width:100%; height:100%; }
.wp-banner .elm-photo img{ width:100%; height:100%; object-fit:cover; display:block; }

.wp-banner .button-slider-tile-prev,
.wp-banner .button-slider-tile-next{
  position:absolute; top:50%; transform:translateY(-50%); width:40px; height:40px; border-radius:50%;
  background:rgba(27,29,34,.35); display:flex; align-items:center; justify-content:center; cursor:pointer;
  transition:background-color .25s ease; z-index:5;
}
.wp-banner .button-slider-tile-prev:hover,
.wp-banner .button-slider-tile-next:hover{ background:rgba(27,29,34,.55); }
.wp-banner .button-slider-tile-prev{ left:16px; }
.wp-banner .button-slider-tile-next{ right:16px; }
.wp-banner .button-slider-tile-prev::before, .wp-banner .button-slider-tile-next::before{
  content:""; width:9px; height:9px; border:solid #fff; border-width:0 2px 2px 0; display:block;
}
.wp-banner .button-slider-tile-prev::before{ transform:rotate(135deg); margin-left:3px; }
.wp-banner .button-slider-tile-next::before{ transform:rotate(-45deg); margin-right:3px; }

.wp-banner .slider-tile-pagination{
  position:absolute; bottom:14px; left:0; right:0; display:flex !important; justify-content:center;
  align-items:center; gap:8px; z-index:5;
}
.wp-banner .slider-tile-pagination span[class*="bullet"]{
  width:8px; height:8px; border-radius:4px; background:rgba(255,255,255,.7); cursor:pointer;
  transition:width .3s ease,background-color .3s ease; opacity:1;
}
.wp-banner .slider-tile-pagination span[class*="bullet-active"]{ width:22px; background:var(--wp-blue); }

/* ==========================================================================
   CATALOG TILES
   ========================================================================== */
.wp-catalog{ background:var(--wp-bg-panel); padding:48px 0 56px; margin-top:40px; }
.wp-catalog__head{ display:flex; align-items:center; justify-content:space-between; gap:16px; flex-wrap:wrap; margin-bottom:24px; }
.wp-catalog__tabs{ display:flex; align-items:center; gap:10px; }
.wp-root a.wp-catalog__tab{
  padding:10px 22px; border-radius:6px; color:var(--wp-text); font-size:var(--fs-14); font-weight:700; cursor:pointer;
  background:#fff; border:1px solid var(--wp-border); transition:border-color .2s ease,box-shadow .2s ease;
}
.wp-root a.wp-catalog__tab:hover{ border-color:var(--wp-border-hover); box-shadow:0 6px 14px rgba(27,29,34,.12); color:var(--wp-blue); }
.wp-root a.wp-catalog__tab.active{
  background:linear-gradient(135deg,var(--wp-btn-grad-a),var(--wp-btn-grad-b)); color:#fff; border-color:transparent;
}
.wp-root a.wp-catalog__tab.active:hover{ color:#fff; filter:brightness(1.1); }

/* real markup toggles visibility of the two catalog-tile panels via ".item-wrap.js-tab-block.active"
   (data-tab="tab01"/"tab02", switched by site JS on .js-tabs-nav clicks) — without this rule both
   panels rendered at once, showing every tile twice. */
.wp-catalog .item-wrap.js-tab-block{ display:none; }
.wp-catalog .item-wrap.js-tab-block.active{ display:block; }

.wp-catalog__grid{ display:grid; grid-template-columns:repeat(4,minmax(0,1fr)); gap:16px; }
.wp-catalog__tile{
  position:relative; display:flex; align-items:center; gap:16px; background:#fff; border:1px solid var(--wp-border);
  border-radius:var(--wp-radius); padding:22px; text-decoration:none; min-width:0; color:inherit;
  transition:box-shadow .25s ease,transform .25s ease,border-color .25s ease;
}
/* hover-lift, reused (identical) by .main-catalog-item below */
.wp-catalog__tile:hover, .wp-root .main-catalog-wrap.items-main .main-catalog-item:hover{
  box-shadow:var(--wp-shadow-card); transform:translateY(-2px); border-color:var(--wp-border-hover); color:inherit;
}
.wp-catalog__tile-icon{
  flex:none; width:52px; height:52px; border-radius:6px; background:var(--wp-bg-panel);
  display:flex; align-items:center; justify-content:center;
}
.wp-catalog__tile:hover .wp-catalog__tile-icon{ background:linear-gradient(180deg,var(--wp-blue-grad-top),var(--wp-blue-grad-bottom)); }
.wp-catalog__tile-icon img{ width:32px; height:32px; object-fit:contain; }
.wp-catalog__tile:hover .wp-catalog__tile-icon img{ filter:brightness(0) invert(1); }
/* the (unnamed) text-wrapper span around title+count is a flex item next to the icon —
   without min-width:0 a long unbreakable word ("полипропиленовая") refuses to shrink and
   overflows the tile; overflow-wrap on the title is a second safety net for that word itself. */
.wp-catalog__tile > span:last-of-type{ flex:1; min-width:0; }
.wp-catalog__tile-title{ display:block; font-size:var(--fs-15); font-weight:600; color:var(--wp-ink); overflow-wrap:break-word; }
.wp-catalog__tile-count{ display:block; font-size:var(--fs-13); color:var(--wp-text-muted); margin-top:2px; }

/* ==========================================================================
   POPULAR PRODUCTS — new wrapper + reskin of legacy .item-wrap/.tile-* cards
   coming from modules/catalog/templates_2025/{getProduct,product}.tpl
   (used site-wide, so we restyle by class rather than rewriting markup)
   ========================================================================== */
.wp-popular{ background:var(--wp-bg-panel); padding:48px 0 56px; }
.wp-popular__head{ display:flex; align-items:baseline; justify-content:space-between; margin-bottom:24px; gap:12px; flex-wrap:wrap; }
.wp-popular__more.wp-popular__more{ font-size:var(--fs-14); font-weight:600; color:var(--wp-blue); display:inline-flex; align-items:center; gap:6px; }
.wp-popular__more span{ transition:transform .25s ease; }
.wp-popular__more:hover span{ transform:translateX(4px); }
.wp-popular__scroll{ overflow-x:auto; padding-bottom:8px; scrollbar-width:none; }
.wp-popular__scroll::-webkit-scrollbar{ display:none; }
.wp-popular__scroll .items-wrap{ display:flex; gap:16px; }

/* legacy product tile reskin — real DOM is
   .wp-popular__scroll > .tiles-slider-box > .slider-inner-wrap.slider-tiles >
   .slider-wrap.swiper > .slider.swiper-wrapper > .sl-wrap.swiper-slide > .item-tile-catalog.
   There is no ".item-wrap" element in the real markup — the card box (background/
   border/padding) has to live on ".sl-wrap", and the row itself has to be flexed at
   ".slider.swiper-wrapper" (three levels deeper than .wp-popular__scroll). */
/* THE actual scroll container — matches .wp-product-cross exactly. Previously this had
   overflow:hidden with .wp-popular__scroll (two levels further out) set to overflow-x:auto
   instead; that split the "clips content" and "scrolls content" roles across two different
   elements with a hard overflow:hidden boundary between them, so the flex row's overflow got
   clipped away right here and NEVER reached .wp-popular__scroll to actually become scrollable
   — nothing to scroll to, at any viewport width, no matter how the cards were sized. */
.wp-popular .slider-wrap.swiper{
  overflow-x:auto; overflow-y:hidden; position:relative; scroll-behavior:smooth;
  scrollbar-width:none; -ms-overflow-style:none;
}
.wp-popular .slider-wrap.swiper::-webkit-scrollbar{ display:none; }
.wp-popular .slider.swiper-wrapper{ display:flex; gap:16px; }

/* side nav buttons removed per request, same as .wp-product-cross — the row still scrolls via
   wheel/drag/touch (initPopularCarousel in main2026.js), just without the overlay arrow buttons. */
.wp-popular .button-slider-tiles-prev,
.wp-popular .button-slider-tiles-next{ display:none; }
.wp-popular .slider-scrollbar-tiles{ display:none; }
/* carousel only below 1320px, per request; at/above that width, fall back to a wrapping grid
   (card sizing is already flex:1 0 232px/max-width:280px on the base .sl-wrap.swiper-slide rule
   below, so it doesn't need its own override here — it both fills a short last row via
   flex-grow:1 and, in carousel mode, refuses to shrink so the row can actually overflow).
   This is a plain @media query, not a JS-toggled class — width is knowable at CSS-paint time,
   so this applies immediately with no flash of the wrong layout while JS is still loading/
   running (initPopularCarousel() only needs matchMedia() for the wheel/drag JS behavior gate,
   not for this visual switch — see main2026.js). overflow:visible undoes overflow-y:hidden
   from the base (carousel/single-row) rule, which would otherwise clip row 2+ once wrapped. */
@media (min-width:1320px){
  .wp-popular .slider-wrap.swiper{ overflow:visible; }
  .wp-popular .slider.swiper-wrapper{ flex-wrap:wrap; }
}
/* flex-shrink:0 (matching .wp-product-cross .slider-tiles .sl-wrap) — shrinking to fit was
   preventing the row from ever overflowing, so there was never anything to scroll to in
   carousel mode; flex-grow:1 still lets a short last row stretch to fill it in grid mode.
   min-width:0 overrides the flex-item default of min-width:auto (= min-content) — without it,
   the card's floor width is whatever its longest unbreakable content needs (price/button text),
   not the 232px basis; if that content's measured width changes after load (e.g. once a
   webfont swaps in), every card in the row silently grows to match, which can push the last
   one onto a new line moments after the page first paints. */
.wp-popular .sl-wrap.swiper-slide{
  flex:1 0 232px; max-width:280px; min-width:0; width:auto; height:auto; background:#fff; border:1px solid var(--wp-border); border-radius:var(--wp-radius);
  padding:16px; display:flex; flex-direction:column; gap:10px; transition:box-shadow .25s ease,border-color .25s ease;
}
/* Swiper's own base CSS sets .swiper-wrapper/.swiper-slide to height:100%, which — now
   that the real carousel (not just our flex fallback) is live here — collapses each card
   to whatever height the (unset) .slider-wrap.swiper container resolves to, squashing the
   photo/text inside. Force both back to content-driven height. */
.wp-popular .slider.swiper-wrapper{ height:auto; }
.wp-popular .sl-wrap.swiper-slide:hover{ box-shadow:var(--wp-shadow-card); border-color:var(--wp-border-hover); }
.wp-popular .item-tile-catalog{ display:flex; flex-direction:column; gap:8px; flex:1; }
.wp-popular .tooltip-content-box{ display:none; } /* consumed by tippy via innerHTML, portalled elsewhere */
.wp-popular .tile-photo-wrap{ border-radius:6px; overflow:hidden; background:#fff; min-height:236px; }
/* the real markup nests the photo several inline/unstyled levels deep
   (.tile-slider-inner-wrap > a.tile-slider-wrap.swiper > .tile-slider.swiper-wrapper >
   .tile-sl-wrap > .tile-photo) — none of them had width:100%/display:block, so the chain
   shrank to the <img>'s own intrinsic size (its width/height HTML attributes) instead of
   filling the card, leaving a stray gray strip (the wrap's own bg) down the right side. */
.wp-popular .tile-photo-wrap .tile-slider-inner-wrap,
.wp-popular .tile-photo-wrap .tile-slider-wrap.swiper,
.wp-popular .tile-photo-wrap .tile-photo{ display:block; width:100%; }
.wp-popular .tile-photo-wrap .tile-slider.swiper-wrapper{ width:100%; }
.wp-popular .tile-photo-wrap .tile-sl-wrap{ width:100%; flex-shrink:0; }
.wp-popular .tile-photo-wrap .tile-photo img{ width:100%; height:225px; object-fit:contain; display:block; }
/* real per-card photo gallery, initialised as a genuine Swiper by initPopularGallery()
   in main2026.js (pagination dots come from the server-rendered .tile-bullet spans —
   Swiper is configured to reuse them via bulletClass/bulletActiveClass instead of
   generating its own). Before JS runs — or if it fails to load — only the first photo
   shows and the dots stay inert, which is why the base rule below only hides the other
   slides while Swiper hasn't taken over (":not(.swiper-initialized)"). */
.wp-popular .tile-slider-wrap.swiper:not(.swiper-initialized) .tile-sl-wrap{ display:none; }
.wp-popular .tile-slider-wrap.swiper:not(.swiper-initialized) .tile-sl-wrap:first-of-type{ display:block; }
.wp-popular .tile-slider-catalog-pagination{ display:flex; align-items:center; gap:4px; margin-top:8px; width:100%; }
.wp-popular .tile-bullet{
  flex:1; height:3px; border-radius:2px; background:var(--wp-border); padding:0; border:none;
  transition:background-color .15s ease;
}
.wp-popular .tile-bullet.is-active{ background:var(--wp-blue); }
.wp-popular .tile-info-row-wrap{ display:flex; align-items:center; justify-content:space-between; font-size:var(--fs-12); color:var(--wp-text-muted); margin-bottom:8px; }
.wp-popular .tile-art{ font-size:var(--fs-13); color:var(--wp-text-muted); }
.wp-popular .tile-stock{ color:var(--wp-green); font-weight:600; font-size:var(--fs-13); }
.wp-popular .tile-stock.stock-wait, .wp-popular .tile-stock.stock-out{ color:#C9750C; }
.wp-popular .tile-title{
  font-size:var(--fs-14); font-weight:600; color:var(--wp-ink); line-height:1.45;
  display:-webkit-box; -webkit-box-orient:vertical; -webkit-line-clamp:2; overflow:hidden; min-height:calc(1.35em * 2);
}
.wp-popular .tile-title a{ color:var(--wp-ink); }
.wp-popular .tile-bottom-wrap{ margin-top:auto; }
.wp-popular .tile-price{ font-size:var(--fs-20); font-weight:800; color:var(--wp-ink); }
.wp-popular .tile-price-info{ font-size:var(--fs-13); color:var(--wp-text-muted); }
.wp-popular .tile-price-wrap, .wp-product-cross .tile-price-wrap, .wp-catalog-page .tile-price-wrap{ display:flex; align-items:baseline; justify-content:space-between; gap:6px; margin-bottom:6px; }
.wp-popular .price-label{ font-size:var(--fs-13); color:var(--wp-text-muted); font-weight:500; margin-bottom:2px; }
/* "В корзину" button label/meta — shared across every context that reuses
   modules/catalog/templates_2025/product.tpl (wp-popular, wp-catalog-page, wp-product-cross,
   wp-row all set their own fixed .btn height/font-size above/below; this only styles the two
   inner <span> lines, so it doesn't need per-context duplication). All 4 contexts give .btn a
   fixed height (42-44px) rather than sizing to content, and .btn is now itself a flex container
   centering .button-title (see below) — so the OUTER button box never resizes whether the meta
   line is shown or not, only .button-title's own (small, auto-height) content re-centers inside
   it. That means the meta line can safely stay display:none until it has real text instead of
   always reserving its row: reserving it unconditionally was an earlier attempt at prevent a
   click-triggered resize that turned out not to be needed here (fixed height already prevents
   it) and had its own bug — the invisible reserved line still took up space below the label,
   so single-line buttons looked off-center (more gap under the text than above it). */
.tile-action-wrap .btn{ display:flex; align-items:center; justify-content:center; }
/* wp-catalog-page/wp-popular/wp-product-cross/wp-row's own ".btn" rules set white-space:nowrap
   (meant for the single-line "В корзину" label, back when that's all this button ever held) —
   inherited down into .js-btn-meta, a longer string like "100 шт (12 000 ₸)" doesn't fit a
   ~130px button on one nowrap line, so it just doesn't get shown at all (not clipped-with-
   ellipsis either, because .btn's text-overflow:ellipsis only ever applied to its own direct
   text, not this DIV child). Reset to normal here so it can wrap instead of vanishing. */
.tile-action-wrap .btn .button-title{ display:flex; flex-direction:column; align-items:center; justify-content:center; gap:1px; white-space:normal; max-width:100%; }
.tile-action-wrap .btn .js-btn-meta{ display:none; font-weight:600; opacity:.9; font-size:var(--fs-10); line-height:1.3; }
.tile-action-wrap .btn.active .js-btn-meta{ display:block; }
.tile-action-wrap .btn .js-btn-label{ font-size:var(--fs-13); font-weight:500; line-height:1.3; }

.wp-popular .tile-action-wrap{ margin-top:10px; display:flex; align-items:flex-start; gap:8px; }
.wp-popular .tile-action-wrap > .btn{
  order:2; flex:1; height:42px; border-radius:6px; background:linear-gradient(180deg,var(--wp-blue-grad-top),var(--wp-blue-grad-bottom));
  color:#fff; font-size:var(--fs-13); font-weight:700; border:none; cursor:pointer; transition:filter .25s ease;
}
.wp-popular .tile-action-wrap > .btn:hover{ filter:brightness(1.12) saturate(1.1); }
.wp-popular .button-plus::after{ content:"+"; }
.wp-popular .button-minus::after{ content:"\2212"; }
.wp-popular .frm-field-counter{ order:1; flex:0 0 auto; display:flex; align-items:center; gap:2px; border:1px solid var(--wp-border); border-radius:6px; padding:0 4px; height:42px; box-sizing:border-box; }
.wp-popular .js-input-counter{ order:2; border:none; text-align:center; font-size:var(--fs-13); font-weight:700; color:var(--wp-ink); width:34px; font-family:inherit; }
.wp-popular .button-plus, .wp-popular .button-minus{ width:24px; height:28px; border:none; background:none; color:var(--wp-text); font-weight:700; cursor:pointer; }
.wp-popular .button-minus{ order:1; }
.wp-popular .button-plus{ order:3; }
.wp-popular .field-total{ display:none; } /* mockup's compact card has no live total next to the stepper */
.wp-popular .tile-stickers-wrap{ position:absolute; }
.wp-popular .tile-actions-wrap{ position:absolute; top:8px; right:8px; }

/* ==========================================================================
   FOOTER
   ========================================================================== */
.wp-footer{ background:var(--wp-dark); color:#fff; }
.wp-footer__top{ max-width:var(--wp-maxw); margin:0 auto; padding:48px 32px 32px; display:flex; gap:56px; flex-wrap:wrap; }
.wp-footer__col{ flex:1 1 200px; min-width:180px; }
.wp-footer__col--brand{ flex:1 1 260px; min-width:220px; }
.wp-footer__logo{ height:26px; width:auto; display:block; margin-bottom:16px; filter:brightness(0) invert(1); }
.wp-root p.wp-footer__desc{ margin:0 0 16px; font-size:var(--fs-13); line-height:1.6; color:var(--wp-text-invert-muted); }
.wp-footer__soc{ display:flex; align-items:center; gap:10px; }
.wp-footer__soc a{
  width:36px; height:36px; border-radius:6px; background:var(--wp-dark-panel); display:flex; align-items:center;
  justify-content:center; transition:background-color .2s ease;
}
.wp-footer__soc a:hover{ background:var(--wp-blue); }
.wp-footer__soc a img{ width:24px; height:24px; filter:brightness(0) invert(1); }
.wp-footer__heading{ font-size:var(--fs-14); font-weight:700; color:#fff; margin-bottom:16px; letter-spacing:.03em; }
.wp-footer__links{ display:flex; flex-direction:column; gap:11px; }
.wp-footer__links a{ color:var(--wp-text-invert-muted); font-size:var(--fs-14); font-weight:600; transition:color .2s ease; }
.wp-footer__links a:hover{ color:#fff; }
.wp-footer__contacts{ display:flex; flex-direction:column; gap:12px; }
.wp-footer__phone.wp-footer__phone{ color:#fff; font-size:var(--fs-20); font-weight:800; }
.wp-footer__phone:hover{ color:#fff; }
.wp-footer__time{ font-size:var(--fs-13); color:var(--wp-text-invert-muted); font-weight:600; margin-top:-6px; }
.wp-footer__mail.wp-footer__mail{ color:var(--wp-text-invert-muted); font-size:var(--fs-14); font-weight:600; transition:color .2s ease; }
.wp-footer__mail:hover{ color:#fff; }
.wp-footer__addr{ font-size:var(--fs-14); color:var(--wp-text-invert-muted); line-height:1.5; }
.wp-footer__bottom{ border-top:1px solid var(--wp-dark-panel); }
.wp-footer__bottom-row{
  max-width:var(--wp-maxw); margin:0 auto; padding:20px 32px; display:flex; align-items:center;
  justify-content:space-between; gap:16px; flex-wrap:wrap;
}
.wp-footer__copy{ font-size:var(--fs-13); color:#6B7280; font-weight:600; }
.wp-footer__legal{ font-size:var(--fs-13); line-height:1.6; color:#6B7280; }
.wp-root .wp-footer__legal p{ margin:0; font-size:var(--fs-13); }
.wp-footer__legal-right{ display:flex; align-items:center; gap:16px; flex-wrap:wrap; }

/* ==========================================================================
   LEGACY CONTENT RE-SKIN
   The large SEO/warehouses/production copy block in main_page.tpl (real
   business copy: warehouse list incl. Алматы, "Производство на заказ",
   "Почему выбирают WebPack" tiles, closing CTA quote) keeps its original
   markup/classes 1:1 — only re-themed here (Manrope, blue accents, card
   style) to match the rest of the redesigned page. Scoped to .wp-root so it
   cannot leak onto other pages that reuse the same class names.
   ========================================================================== */
/* the legacy copy block's own outer wrapper (.section-outer-box.bg-light[role="main"]) has no
   container of its own — unlike .wp-catalog/.wp-popular (which also carry "section-outer-box" but
   keep their own full-bleed-background + .wp-container pattern), this one needs the max-width
   treatment applied directly, scoped narrowly via [role="main"] so it doesn't leak onto those. */
.wp-root [role="main"].section-outer-box{ max-width:var(--wp-maxw); margin:0 auto; padding:48px 32px 56px; box-sizing:border-box; }

/* Advantages section (#left-advantages) — same boxed/no-background pattern as [role="main"]
   and #left-description above; was missing entirely (0 padding, no max-width), so it had no
   vertical breathing room from its own wrapper and relied only on child element margins. */
#left-advantages.section-outer-box{ max-width:var(--wp-maxw); margin:0 auto; padding:48px 32px 56px; box-sizing:border-box; }

/* News section (#left-description) — same tiles-slider-box/sl-wrap/swiper-slide pattern as
   .wp-popular (real news items from the DB, horizontal scroll, not the mockup's static 3-up
   grid, so all real items stay reachable), just with the mockup's card look: white bg, rounded
   photo, date + title. Was completely unstyled — a third ".section-outer-box.bg-light" instance
   that neither the [role="main"] nor .wp-catalog rules above happen to match. */
#left-description.section-outer-box{ background:var(--wp-bg-panel); padding:48px 0 56px; }
#left-description .button-link, .wp-product-cross .button-link{
  font-size:var(--fs-14); font-weight:600; color:var(--wp-blue); display:inline-flex; align-items:center; gap:6px; text-decoration:none;
}
#left-description .button-link:hover, .wp-product-cross .button-link:hover{ color:var(--wp-blue-dark); }
#left-description .button-title-border{ border-bottom:none; }
#left-description .action-wrap .btn{ background:none; border:none; padding:0; cursor:pointer; }
#left-description .more-box{ display:none; } /* duplicate CTA already shown in .title-box above */
.wp-popular .more-box{ display:none; } /* not present in the mockup — the "Все товары" link in .wp-popular__head is the only CTA */
#left-description .tiles-slider-box .slider-wrap.swiper{ overflow-x:auto; padding-bottom:4px; scrollbar-width:none; }
#left-description .tiles-slider-box .slider-wrap.swiper::-webkit-scrollbar{ display:none; }
#left-description .tiles-slider-box .slider.swiper-wrapper{ display:flex; gap:20px; }
#left-description .sl-wrap.swiper-slide{ flex:1 1 0; min-width:260px; }
#left-description .item-tile-article{
  display:flex; flex-direction:column; gap:12px; background:#fff; border:1px solid var(--wp-border); border-radius:var(--wp-radius);
  padding:16px; text-decoration:none; transition:box-shadow .25s ease,border-color .25s ease;
}
#left-description .item-tile-article:hover{ box-shadow:var(--wp-shadow-card); border-color:var(--wp-border-hover); }
#left-description .tile-photo-wrap{ border-radius:6px; overflow:hidden; background:#fff; height:225px; }
#left-description .tile-photo-wrap .tile-photo, #left-description .tile-photo-wrap img{ width:100%; height:100%; object-fit:cover; display:block; }
#left-description .tile-info-wrap{ display:flex; flex-direction:column; gap:6px; }
#left-description .tile-date{ font-size:var(--fs-13); color:var(--wp-text-muted); font-weight:600; }
#left-description .tile-title{
  font-size:var(--fs-15); font-weight:600; color:var(--wp-ink); line-height:1.35;
  display:-webkit-box; -webkit-box-orient:vertical; -webkit-line-clamp:2; overflow:hidden; min-height:calc(1.35em * 2);
}
#left-description .button-slider-tiles-prev, #left-description .button-slider-tiles-next{ display:none; }
#left-description .slider-scrollbar-tiles{ display:none; }
@media (max-width:900px){
  /* top padding was accidentally zeroed here — "О нас / Преимущества" sat flush against
     whatever section came before it on mobile, with no breathing room at all. */
  #left-advantages.section-outer-box{ padding:40px 16px; }
}

/* "Читать далее" expand toggle — reveals the real {$content} (pages.text for pseudo_dir="main",
   id 191) below the two intro paragraphs. Plain unstyled tags from that DB field (h2/h3/ul/p/img)
   get generic typography matching the rest of the page. */
.wp-root a.wp-readmore-link{
  display:inline-flex; align-items:center; justify-content:center; height:44px; padding:0 24px;
  border-radius:8px; background:linear-gradient(135deg,var(--wp-btn-grad-a),var(--wp-btn-grad-b)); color:#fff; font-size:var(--fs-14); font-weight:700;
  text-decoration:none; cursor:pointer; margin-top:8px; transition:filter .25s ease;
}
.wp-root a.wp-readmore-link:hover{ filter:brightness(1.12) saturate(1.1); color:#fff; }
.wp-readmore-content{
  display:none; margin-top:16px; padding-top:16px; border-top:1px solid var(--wp-border);
  font-size:var(--fs-15); line-height:1.65; color:var(--wp-text);
}
.wp-readmore-content.active{ display:block; }
.wp-readmore-content p{ margin:0 0 14px; }
.wp-readmore-content h2{ font-family:'Manrope',system-ui,sans-serif; font-size:var(--fs-20); font-weight:700; color:var(--wp-ink); margin:24px 0 12px; }
.wp-readmore-content h3{ font-family:'Manrope',system-ui,sans-serif; font-size:var(--fs-18); font-weight:700; color:var(--wp-ink); margin:20px 0 10px; }
.wp-readmore-content ul{ margin:0 0 14px; padding-left:20px; }
.wp-readmore-content li{ margin-bottom:6px; }
.wp-readmore-content a{ color:var(--wp-blue); }
.wp-readmore-content img{ max-width:160px; height:auto; border-radius:var(--wp-radius); margin:0 0 12px 16px; }
.wp-root .title-box{ display:flex; align-items:center; justify-content:space-between; gap:16px; flex-wrap:wrap; margin:0 0 20px; }
.wp-root .h1-title, .wp-root .h2-title, .wp-root .h3-title{
  font-family:'Manrope',system-ui,sans-serif; font-weight:700; color:var(--wp-ink); margin:32px 0 16px;
}
.wp-root .h1-title{ font-size:var(--fs-28); }
.wp-root .title-wrap .wp-eyebrow + .h1-title{ margin-top:0; }
.wp-root .h1-title a{ color:inherit; }
/* .wp-root .h1-title's generic margin:32px 0 16px above is meant for headings with no
   breadcrumb above them — here the breadcrumb's own .menu{margin-bottom:16px} already
   provides that gap, so the two stacked into a doubled, oversized one. Same fix as
   .wp-basket/.wp-product's own .h1-title{margin-top:0} elsewhere in this file — must come
   after the .wp-root rule above (same specificity, source order decides) to actually win. */
.wp-catalog-index .h1-title{ margin-top:0; }
.wp-root .h2-title{ font-size:var(--fs-22); }
.wp-root .h3-title{ font-size:var(--fs-18); }
.wp-root p{ font-size:var(--fs-15); line-height:1.65; color:var(--wp-text); }
.wp-root .info-box .box-inner-wrap{ display:flex; gap:32px; flex-wrap:wrap; align-items:flex-start; }
.wp-root .info-inner-wrap{ flex:1 1 420px; min-width:280px; }
.wp-root .photo-inner-wrap{ flex:1 1 340px; min-width:260px; align-self:stretch; }
.wp-root .photo-inner-wrap .elm-photo{ border-radius:var(--wp-radius-lg); overflow:hidden; height:320px; }
.wp-root .photo-inner-wrap img{ width:100%; height:100%; object-fit:cover; display:block; }
.wp-root blockquote{
  background:var(--wp-bg-panel); border-left:4px solid var(--wp-blue); border-radius:var(--wp-radius);
  padding:22px 24px; margin:32px 0; font-size:var(--fs-14); line-height:1.6; color:var(--wp-text);
}

.wp-root .main-catalog-wrap.items-main .main-catalog-item,
.wp-root .action-box, .wp-root .tiles-box .item-tile-info-ico{
  background:#fff; border:1px solid var(--wp-border); border-radius:var(--wp-radius);
}
.wp-root .main-catalog-wrap.items-main{ display:flex; flex-wrap:wrap; gap:16px; margin:20px 0; }
.wp-root .main-catalog-wrap.items-main .main-catalog-item{
  display:flex; align-items:center; gap:14px; padding:18px; text-decoration:none; color:inherit;
  transition:box-shadow .25s ease, border-color .25s ease, transform .25s ease;
}
/* merged into the shared hover-lift group near .wp-catalog__tile:hover (top of this file) */
.wp-root .main-catalog-icon.icon-box{ flex:none; width:44px; height:44px; display:flex; align-items:center; justify-content:center; }
.wp-root .main-catalog-icon.icon-box img{ max-width:36px; max-height:36px; }
.wp-root .main-catalog-title{ font-size:var(--fs-15); font-weight:600; color:var(--wp-ink); }
.wp-root .main-catalog-quantity{ font-size:var(--fs-13); color:var(--wp-text-muted); margin-top:2px; }

.wp-root .action-box{ position:relative; display:flex; align-items:center; gap:32px; flex-wrap:wrap; padding:32px; margin:32px 0; overflow:hidden; }
.wp-root .action-box .box-inner-wrap{ display:flex; align-items:center; gap:32px; flex-wrap:wrap; width:100%; }
.wp-root .action-box .info-inner-wrap{ flex:1 1 420px; }
.wp-root .action-box .photo-inner-wrap{ flex:1 1 300px; }
.wp-root .action-box .photo-inner-wrap img{ border-radius:var(--wp-radius); }
.wp-root .action-box .logo img{ height:28px; opacity:.5; }

.wp-root .tiles-box .items-wrap{ display:grid; grid-template-columns:repeat(2,1fr); gap:16px; margin:20px 0; }
/* height:100% so cards in the same grid row match height even when one's title/notice text
   wraps to more lines than its neighbour (the grid row itself already stretches .item-wrap
   to the tallest sibling's height by default; the card inside it needs to fill that too). */
.wp-root .tiles-box .item-tile-info-ico{ display:flex; align-items:flex-start; gap:16px; padding:24px; height:100%; box-sizing:border-box; }
.wp-root .tiles-box .tile-ico{ flex:none; width:34px; }
.wp-root .tiles-box .tile-ico img{ width:100%; height:auto; }
.wp-root .tiles-box .tile-title{ font-size:var(--fs-15); font-weight:700; color:var(--wp-ink); }
.wp-root .tiles-box .notice{ font-size:var(--fs-14); font-weight:500; color:var(--wp-text-muted); line-height:1.5; margin-top:4px; }

@media (max-width: 900px){
  .wp-root .main-catalog-wrap.items-main .main-catalog-item{ width:100% !important; }
  .wp-root .tiles-box .items-wrap{ grid-template-columns:1fr; }
  .wp-root .action-box .logo{ display:none; }
}

/* ==========================================================================
   RESPONSIVE
   ========================================================================== */
@media (max-width: 1200px){
  .wp-catalog__grid{ grid-template-columns:repeat(3,minmax(0,1fr)); }
}

/* between the mobile burger breakpoint (900px) and the desktop max-width (1424px) the nav
   row (category links + search box) is tight — .wp-nav__list now scrolls horizontally
   instead of wrapping to a second line (see base rule above), but shrink things first so
   that horizontal scroll is rarely actually needed at common tablet/laptop widths. */
@media (max-width: 1360px){
  .wp-nav__row{ font-size:var(--fs-14); }
  .wp-nav__list > li > a.btn-menu{ padding:0 14px; }
  .wp-nav__search-input{ width:150px; }
}
@media (max-width: 1150px){
  .wp-nav__list > li > a.btn-menu{ padding:0 10px; }
  .wp-nav__search{ display:none; }
}

/* below 1130px the header row (logo + mail + phone + cart) no longer fits on one line and
   the cart button wraps to a second row — drop the logo tagline first to buy back space. */
@media (max-width: 1130px){
  .wp-logo__tag{ display:none; }
}

/* still too tight below 940px even without the tagline — drop the mail block next (the
   mobile burger/search breakpoint below is 900px, so there's a narrow gap where this is
   the only thing left to shed before the row wraps). */
@media (max-width: 940px){
  .wp-mail{ display:none; }
  .wp-header__sep{ display:none; }
}

@media (max-width: 900px){
  .wp-container, .wp-header__row, .wp-topbar__row, .wp-nav__row,
  .wp-banner-wrap, .wp-catalog__head,
  .wp-footer__top, .wp-footer__bottom-row{ padding-left:16px; padding-right:16px; }

  .wp-logo__sep{ display:none; }
  .wp-logo img{ height:18px; }

  /* photo-count progress bar on product cards is driven by mousemove hover-scrub
     (see initPopularGalleryFallback in main2026.js) — meaningless on touch, hide it. */
  .wp-popular .tile-slider-catalog-pagination,
  .wp-catalog-page .tile-slider-catalog-pagination{ display:none; }

  .wp-topbar__links{ display:none; }
  .wp-mail{ display:none; }
  .wp-header__sep{ display:none; }

  /* icon-only phone/cart on mobile — full text (number/hours, "Ваша корзина"+price) is
     what was forcing the header row to wrap onto a second line. */
  .wp-phone__text{ display:none; }
  .wp-cart-btn__text{ display:none; }
  /* mobile already has a permanent cart entry in the bottom tab bar (left_menu.tpl), so the
     header's own cart icon is swapped for a WhatsApp shortcut here instead — desktop has no
     such fallback and keeps the header cart (with its hover preview) as its only quick-access
     point, so this stays desktop-only there. */
  .wp-cart-hover-wrap{ display:none; }
  .wp-header-wa{ display:flex; align-items:center; justify-content:center; flex:none; }

  .wp-search-toggle{ display:flex; }
  .wp-burger{ display:flex; }

  /* search/burger toggles moved here from the header row (see main.tpl) so they sit on the
     blue nav strip instead of forcing their own extra row above it. */
  .wp-nav__row{ padding:8px 16px; gap:10px; align-items:center; justify-content:space-between; position:relative; }
  /* search box moves off the (hidden) nav row into a toggled dropdown panel anchored
     under it — opened via .wp-search-toggle in the header, see main2026.js initMobileSearch() */
  .wp-nav__search{
    display:none; position:absolute; top:100%; left:0; right:0; z-index:30; margin-left:0;
    background:#fff; padding:12px 16px; box-shadow:0 10px 24px rgba(27,29,34,.14);
  }
  .wp-nav__search.is-open{ display:flex; }
  .wp-nav__search-inner{ flex:1; }
  /* iOS Safari auto-zooms the whole page on focus when a text input's font-size is under
     16px — the desktop 14px (line ~445) was carried over unchanged for mobile, so tapping
     the search field zoomed the viewport in instead of just focusing it. */
  .wp-nav__search-input{ width:100%; font-size:var(--fs-16); }
  /* transform:translateZ(0) forces this fixed, dynamically-resized drawer onto its own
     compositing layer — without it, mobile Safari has a known bug where toggling content
     height inside a position:fixed + overflow-y:auto element doesn't fully repaint, leaving
     old pixels of collapsed submenus ghosted/overlapping the new layout underneath. */
  .wp-nav__list{
    display:none; position:fixed; inset:0 auto 0 0; top:0; height:100%; width:82%; max-width:340px;
    background:#fff; flex-direction:column; flex-wrap:nowrap; overflow-y:auto; z-index:60;
    box-shadow:8px 0 24px rgba(0,0,0,.2); padding:16px 0 32px; transform:translateZ(0);
  }
  .wp-nav__list.is-open{ display:flex; }
  /* height:auto overrides the base (desktop horizontal-bar) rule's height:100% — inside this
     flex column, that resolved against the <li>'s own height (which already includes its
     open submenu), stretching the link to match and vertically centering its text way down
     the middle of that inflated box, while the submenu itself rendered past the link's
     doubled-up box and over the following categories. Root cause found via live DevTools
     inspection — thank you! */
  .wp-nav__list > li > a.btn-menu{
    color:var(--wp-ink); border-right:none; border-bottom:1px solid var(--wp-border); padding:14px 20px;
    height:auto; min-height:0;
  }
  .wp-nav__list > li > a.btn-menu::before, .wp-nav__list > li > a.btn-menu::after{ display:none; }
  /* max-height (JS-driven, see initNavDropdowns in main2026.js) instead of a display:none/
     block toggle — an instant display flip on a long submenu (7+ items, e.g. "Пакеты") was
     triggering a mobile Safari repaint bug inside this fixed+scrolling drawer, where the
     newly-revealed rows painted at a stale offset, overlapping the categories after it. A
     max-height transition repaints gradually frame-by-frame instead of jumping, which avoids it. */
  .wp-nav__list > li > ul.menu{
    display:block; position:static; box-shadow:none; border-radius:0; background:var(--wp-bg-panel); min-width:0; padding:0;
    max-height:0; overflow:hidden; transition:max-height .3s ease;
  }
  .wp-nav__list > li > ul.menu > li > a.btn-menu{ padding:10px 20px 10px 34px; }
  .wp-nav__list-divider{
    display:block; padding:16px 20px 8px; font-size:var(--fs-11); font-weight:700; letter-spacing:.06em;
    text-transform:uppercase; color:var(--wp-text-muted); background:var(--wp-bg-panel);
  }
  .wp-nav__list-extra{ display:block; }
  .wp-nav__backdrop{ display:none; position:fixed; inset:0; background:rgba(27,29,34,.45); z-index:55; }
  .wp-nav__backdrop.is-open{ display:block; }

  .wp-catalog__grid{ grid-template-columns:repeat(2,minmax(0,1fr)); }
  .wp-catalog__head{ align-items:flex-start; }


  .wp-banner{ aspect-ratio:auto; height:280px; }

  /* #left_menu: universal icon tab bar (Главная/Каталог/Корзина/Избранное/Профиль),
     templates_2025/left_menu.tpl — fixed bottom bar on mobile. */
  #left_menu{
    display:block; position:fixed; left:0; right:0; bottom:0; z-index:50; width:100%; box-sizing:border-box;
    background:#fff; border-top:1px solid var(--wp-border); box-shadow:0 -4px 14px rgba(27,29,34,.08);
  }
  #left_menu ul{ display:flex; margin:0; padding:0; list-style:none; width:100%; }
  #left_menu li{ flex:1 1 0; min-width:0; }
  #left_menu li > a{
    display:flex; flex-direction:column; align-items:center; gap:3px;
    padding:8px 4px 6px; font-size:var(--fs-11); font-weight:600; color:var(--wp-text-muted);
    font-family:'Manrope',system-ui,-apple-system,'Segoe UI',Arial,sans-serif;
    text-decoration:none; line-height:1.25; white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
  }
  #left_menu li.active > a{ color:var(--wp-blue); }
  /* "Каталог" no longer has an icon (removed per request). Its <a> only sizes to its own
     content (single text line, ~28px) while sibling <a>s are ~53px (icon+gap+text) — <li>
     itself isn't a flex container, so the shorter <a> just sits at the top of its <li> rather
     than centering in the row. Make this one <li> a flex container to center its <a>. */
  #left_menu li.left-catalog{ display:flex; align-items:center; }
  #left_menu .left-icon-wrap{ position:relative; display:flex; flex:none; }
  #left_menu .left-badge{
    position:absolute; top:-6px; right:-9px; min-width:16px; height:16px; padding:0 4px;
    border-radius:8px; background:var(--wp-pink); color:#fff; font-size:var(--fs-10); font-weight:700;
    display:flex; align-items:center; justify-content:center; line-height:1; box-sizing:border-box;
  }
  body{ padding-bottom:56px; }
}

@media (max-width: 600px){
  .wp-header__row{ padding:14px 16px; gap:12px; }
  .wp-logo__tag{ display:none; }
  .wp-phone__num{ font-size:var(--fs-16); }
  .wp-cart-btn__label{ font-size:var(--fs-13); }
  .wp-catalog__grid{ grid-template-columns:1fr 1fr; gap:10px; }
  .wp-catalog__tile{ padding:14px; gap:10px; }
  .wp-catalog__tile-icon{ width:40px; height:40px; }
  .wp-catalog__tile-icon img{ width:24px; height:24px; }
  .wp-catalog__tile-title{ font-size:var(--fs-13); }
  .wp-catalog__tile-count{ font-size:var(--fs-11); }
  .wp-h2{ font-size:var(--fs-22); }
  .wp-banner{ height:200px; border-radius:0; }
  .wp-banner-wrap{ padding:16px 0 0; }
  /* one card per screen on mobile instead of a cramped 180px width — 100vw minus the
     .wp-container's 16px+16px side padding at this breakpoint. */
  .wp-popular .sl-wrap.swiper-slide{ flex:0 0 calc(100vw - 32px); min-width:0; width:calc(100vw - 32px); }
  .wp-footer__top{ gap:28px; padding-top:32px; }
}

/* ==========================================================================
   PRODUCT PAGE — modules/products/templates_2025/product.tpl
   Real markup/classes/data-attributes are the site's existing legacy ones
   (frm-field-counter, js-input-counter, js-btn-tgl, js-counter, js-tabs-nav,
   js-tab-block, js-popup-select, elm-price, tile-*, etc.) so the existing
   add-to-cart / counter / tabs / popup JS (loaded from the CDN, out of this
   repo) keeps working unmodified. We only re-skin those classes here and add
   two small "wp-product-*" layout wrappers inserted in product.tpl around
   the gallery+info row and the price+counter row. Scoped under .wp-product
   (added to product.tpl's own <div class="content-wrap">) so nothing leaks
   onto other pages. Toggle states (open dropdown, active tab, active
   wishlist icon, active price-unit link) are assumed to use ".active" —
   the convention used everywhere else already in this template — since the
   real toggle JS itself is not present in this repo to verify against
   (loaded from cdn_url). See report for this open risk.
   ========================================================================== */
/* shared outer box for any full-page "sidebar + content" layout (product page,
   catalog page — same 250px/1fr grid, same white card). Both pages carry this
   class in their HTML alongside their own page-scoping class (.wp-product,
   .wp-catalog-page) so this box model can never drift between them again. */
/* fixed 32px padding on all sides — exactly matches .wp-header__row's own
   max-width:var(--wp-maxw)+padding:0 32px pattern, so content stays inset from
   the viewport edge at every width, not just once auto-margins kick in. */
.wp-content-shell{
  max-width:1360px; margin:24px auto; padding:32px; box-sizing:border-box;
  display:grid; grid-template-columns:250px 1fr; align-items:start; gap:32px;
  background:#fff; border-radius:var(--wp-radius); box-shadow:var(--wp-shadow-card);
}
@media (max-width:900px){
  .wp-content-shell{ grid-template-columns:1fr; gap:20px; padding:0 16px 40px; background:none; box-shadow:none; }
}
/* Shared shell for /favorites/ (favorites_list.tpl) and the "Личный кабинет" pages
   (modules/stat/templates_2025/*.tpl) — none had the .wp-root/.wp-catalog-page wrapper classes
   at all, same "never got a redesign pass" gap as /catalog/'s index. favorites_list.tpl reuses
   .wp-catalog-page too, for its breadcrumb/h1/tile-grid rules (getProduct.tpl tiles are
   identical markup to the catalog listing pages). Can't reuse .wp-content-shell's own
   fixed-column grid here: that assumes exactly 2 children in a fixed sidebar-then-content DOM
   order, while these pages' sidebar (.side-wrap, the account menu) is conditional on being
   logged in (favorites only) and comes *after* the content div in the markup — with the grid,
   a logged-out visitor's only child would get squeezed into the 250px sidebar column. flex-wrap
   sidesteps that: one child alone just grows to fill the row; two children lay out
   sidebar+content in whatever order they appear. */
.wp-account-shell{
  max-width:1360px; margin:24px auto; padding:32px; box-sizing:border-box;
  display:flex; align-items:flex-start; flex-wrap:wrap; gap:32px;
  background:#fff; border-radius:var(--wp-radius); box-shadow:var(--wp-shadow-card);
}
/* was ".wp-account-shell > div:first-child" — orders.tpl has a stray <style> tag as the actual
   first child (before .content-wrap), which :first-child require matching both the pseudo-class
   AND the div selector, so it never matched there; .content-wrap never got flex:1/min-width:0,
   couldn't shrink, forced .side-wrap to wrap onto its own (still position:sticky) line above it,
   which then floated over the order list as the page scrolled. Target the class directly instead
   — safe regardless of what else ends up as a sibling. */
.wp-account-shell > .content-wrap{ flex:1 1 480px; min-width:0; }
/* order:-1 puts the sidebar visually first (left column) without touching the markup — it
   comes after the content div in the DOM on both pages that use this shell (favorites_list.tpl,
   stat/index.tpl), same reason the flex layout was chosen over a fixed-column grid above. */
.wp-account-shell .side-wrap{ flex:0 0 250px; min-width:0; order:-1; position:sticky; top:130px; }
@media (max-width:900px){
  .wp-account-shell .side-wrap{ position:static; }
}
/* page background behind the white shell card, visible on the sides at wide viewports —
   :has() so this only applies on the pages that actually render the shell, without adding a
   body class to every page template. */
body:has(.wp-account-shell){ background:var(--wp-bg-panel); }
/* stat/templates_2025/index.tpl's own header row (h1 + "Выйти"/"Назад" links) — .button-link
   had no unscoped rule anywhere (only page-specific copies like .wp-basket's own), so these
   rendered as plain underlined text. */
.wp-account-shell .lk-title-box{ display:flex; flex-direction:column; gap:6px; margin-bottom:20px; }
.wp-account-shell .lk-title-box .title-wrap{ display:flex; align-items:center; justify-content:space-between; gap:16px; flex-wrap:wrap; }
.wp-account-shell .lk-title-box .h1-title{ margin:0; }
.wp-account-shell .button-link{ display:inline-flex; align-items:center; gap:8px; color:var(--wp-blue); font-weight:600; font-size:var(--fs-14); cursor:pointer; text-decoration:none; }
.wp-account-shell .button-link .button-title-border{ border-bottom:1px dashed var(--wp-blue); }
.wp-account-shell .button-link:hover{ color:var(--wp-blue-dark); }
.wp-account-shell .button-link:hover .button-title-border{ border-color:var(--wp-blue-dark); }
.wp-account-shell .button-ico img{ width:16px; height:16px; display:block; }
@media (max-width:900px){
  .wp-account-shell{ padding:0 16px 40px; margin-top:0; background:none; box-shadow:none; gap:20px; }
}
/* Shared form components reused across profile_account.tpl/company.tpl/delivery.tpl/
   orders_payment_company.tpl (.frm-row/.frm-field/.form-input/.frm-message/.btn) — same class
   names and same "always-visible validation message" bug already fixed for .wp-basket's own
   checkout form; values copied from there for one consistent look site-wide rather than
   redefined from scratch. */
.wp-account-shell .form-lk-box{ display:flex; flex-direction:column; gap:28px; }
.wp-account-shell .frm-section-wrap{ background:#fff; border:1px solid var(--wp-border); border-radius:var(--wp-radius-lg); padding:24px; }
.wp-account-shell .frm-section-content{ margin-top:16px; }
.wp-account-shell .frm-row{ display:flex; flex-wrap:wrap; gap:12px; margin-bottom:12px; }
.wp-account-shell .frm-row:last-child{ margin-bottom:0; }
.wp-account-shell .frm-field{ flex:1 1 100%; min-width:0; }
.wp-account-shell .frm-field.field-half{ flex:1 1 calc(50% - 6px); }
@media (max-width:600px){
  .wp-account-shell .frm-field.field-half{ flex-basis:100%; }
}
.wp-account-shell .field-title{ font-size:var(--fs-13); font-weight:600; color:var(--wp-text-muted); margin-bottom:6px; }
.wp-account-shell .form-input, .wp-basket .form-input, .popup-form-cols .form-input{
  width:100%; height:46px; border:1px solid var(--wp-border); border-radius:8px; padding:0 14px;
  font-size:var(--fs-14); font-family:inherit; color:var(--wp-ink); box-sizing:border-box; outline:none; background:#fff;
}
.wp-account-shell .form-input:focus{ border-color:var(--wp-blue); }
.wp-account-shell .form-input::placeholder{ color:var(--wp-text-muted); }
.wp-account-shell .frm-field-password{ position:relative; }
.wp-account-shell .frm-field-password .form-input{ padding-right:44px; }
/* .btn-action-ico/.ico-* (also used for popup close buttons elsewhere) never had any CSS —
   a generic icon-font/sprite system that was never ported. Rather than build that whole
   system out, this one gets a plain eye glyph (same "reuse a text character, no asset file"
   approach as the → arrows elsewhere). The click handler that actually toggles the input's
   type already exists — main.tpl's own inline script (only run when $param_tpl.module is
   'stat'/'auth'), toggling an .active class on the button; a second, independent handler was
   nearly added here too, which would have fought the first one (each click undoing the
   other's type change) — removed before it shipped. */
.wp-account-shell .button-password-toggle{
  position:absolute; top:0; right:0; width:46px; height:46px; display:flex; align-items:center; justify-content:center;
  color:var(--wp-text-muted); cursor:pointer; font-size:var(--fs-16);
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none'%3E%3Cpath d='M1 12C1 12 5 4 12 4C19 4 23 12 23 12C23 12 19 20 12 20C5 20 1 12 1 12Z' stroke='%232F87CC' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M12 15C13.6569 15 15 13.6569 15 12C15 10.3431 13.6569 9 12 9C10.3431 9 9 10.3431 9 12C9 13.6569 10.3431 15 12 15Z' stroke='%232F87CC' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat:no-repeat; background-position:center; background-size:20px 20px;
}
.wp-account-shell .button-password-toggle.active{
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none'%3E%3Cpath d='M17.94 17.94C16.2306 19.243 14.1491 19.9649 12 20C5 20 1 12 1 12C2.24389 9.68192 3.96914 7.65663 6.06 6.06003M9.9 4.24002C10.5883 4.0789 11.2931 3.99836 12 4.00003C19 4.00003 23 12 23 12C22.393 13.1356 21.6691 14.2048 20.84 15.19M14.12 14.12C13.8454 14.4148 13.5141 14.6512 13.1462 14.8151C12.7782 14.9791 12.3809 15.0673 11.9781 15.0744C11.5753 15.0815 11.1752 15.0074 10.8016 14.8565C10.4281 14.7056 10.0887 14.4811 9.80385 14.1962C9.51897 13.9113 9.29439 13.572 9.14351 13.1984C8.99262 12.8249 8.91853 12.4247 8.92563 12.0219C8.93274 11.6191 9.02091 11.2219 9.18488 10.8539C9.34884 10.4859 9.58525 10.1547 9.88 9.88003' stroke='%232F87CC' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M1 1L23 23' stroke='%232F87CC' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
}
/* validation hints ("Проверьте правильность адреса...", "Номер телефона должен содержать...")
   were always in the DOM with no hide-by-default, same bug as .wp-basket's checkout form —
   permanently visible instead of only-on-error (JS toggles .inp-valid on the .frm-field). */
.wp-account-shell .frm-message.text-alert{ display:none; font-size:var(--fs-13); color:var(--wp-red); margin-top:6px; line-height:1.5; }
.wp-account-shell .frm-field.inp-valid .frm-message.text-alert{ display:block; }
.wp-account-shell .frm-message-succefull{ font-size:var(--fs-13); color:var(--wp-green); font-weight:600; }
.wp-account-shell .frm-row-submit{ display:flex; align-items:center; gap:16px; flex-wrap:wrap; margin-top:16px; }
.wp-account-shell .btn, .wp-basket .btn, .popup-form-cols .btn{
  display:inline-flex; align-items:center; justify-content:center; height:46px; padding:0 24px; border:none;
  border-radius:10px; cursor:pointer; background:linear-gradient(135deg,var(--wp-btn-grad-a),var(--wp-btn-grad-b));
  color:#fff; font-size:var(--fs-14); font-weight:700; text-decoration:none;
}
.wp-account-shell .btn:hover, .wp-basket .btn:hover, .popup-form-cols .btn:hover{ filter:brightness(1.12) saturate(1.1); color:#fff; }
.wp-account-shell .btn.button-disabled{ opacity:.5; cursor:not-allowed; pointer-events:none; }
/* .button-border ("Отмена"/"Повторить" — company.tpl, delivery.tpl, orders.tpl) had no
   unscoped rule, so it rendered identical to the solid gradient .btn instead of its intended
   outlined/secondary look. */
.wp-account-shell .btn.button-border, .wp-basket .btn.button-border, .popup-form-cols .btn.button-border{
  background:#fff; color:var(--wp-ink); border:1px solid var(--wp-border);
}
.wp-account-shell .btn.button-border:hover, .wp-basket .btn.button-border:hover, .popup-form-cols .btn.button-border:hover{
  filter:none; background:var(--wp-bg-panel); color:var(--wp-ink);
}
/* "Назад"/"Выйти" etc. (js-btn-lk-back and friends) carry both .btn and .button-link — .btn
   alone means "the big gradient CTA" everywhere else on the site, but these are meant to be
   the lightweight text-link variant (.button-link's own rule above), not a full button. */
.wp-account-shell .btn.button-link{
  display:inline-flex; height:auto; padding:0; background:none; border-radius:0;
  color:var(--wp-blue); font-weight:600;
}
.wp-account-shell .btn.button-link:hover{ background:none; filter:none; color:var(--wp-blue-dark); }
/* "no orders/companies/addresses yet" empty state (orders.tpl/company.tpl/delivery.tpl/
   ticket_stat_add_ticket.tpl) — also had no CSS anywhere. */
.wp-account-shell .empty-box{
  display:flex; flex-direction:column; align-items:center; text-align:center; gap:14px;
  padding:48px 20px; background:#fff; border:1px solid var(--wp-border); border-radius:var(--wp-radius-lg);
}
.wp-account-shell .empty-box .elm-photo{ width:64px; height:64px; opacity:.5; }
.wp-account-shell .empty-box .elm-photo img{ width:100%; height:100%; object-fit:contain; }
.wp-account-shell .empty-box .section-title{ font-size:var(--fs-15); color:var(--wp-text-muted); }
.wp-account-shell .h4-title{ font-size:var(--fs-15); font-weight:600; color:var(--wp-ink); line-height:1.5; }
.wp-account-shell .orders-title{ font-size:var(--fs-15); font-weight:600; color:var(--wp-ink); margin-bottom:10px; }
/* company.tpl/delivery.tpl's saved-company/saved-address list cards (.lk-toggle-box.address-card)
   — the card's own inner bits (.address-card-title/-value/-actions, .btn-address-ico) already
   have their own inline <style> in each template (values fixed alongside the other var(--clr-*)
   replacements there), just missing the card container itself. */
.wp-account-shell .lk-toggle-box{ background:#fff; border:1px solid var(--wp-border); border-radius:var(--wp-radius-lg); margin-bottom:12px; }
.wp-account-shell .lk-toggle-box:last-child{ margin-bottom:0; }
/* stat/templates_2025/bonus.tpl — loyalty-level widget (.lk-bonuses-box) and history table
   (.bonus-log) had no CSS anywhere at all. */
.wp-account-shell .lk-bonuses-box{
  background:#fff; border:1px solid var(--wp-border); border-radius:var(--wp-radius-lg);
  padding:24px; margin-bottom:24px;
}
.wp-account-shell .total-inner-wrap{ display:flex; flex-wrap:wrap; gap:32px; margin-bottom:20px; }
.wp-account-shell .total-wrap{ display:flex; align-items:center; gap:10px; }
.wp-account-shell .total-wrap .elm-ico{ width:28px; height:28px; flex:none; display:flex; align-items:center; justify-content:center; }
.wp-account-shell .total-wrap .elm-ico img{ width:24px; height:24px; }
.wp-account-shell .total-title{ font-size:var(--fs-13); color:var(--wp-text-muted); }
.wp-account-shell .total-value{ font-size:var(--fs-15); font-weight:700; color:var(--wp-ink); }
.wp-account-shell .step-info{ display:flex; align-items:baseline; gap:8px; margin-bottom:14px; font-size:var(--fs-13); }
.wp-account-shell .step-info-title{ color:var(--wp-text-muted); }
.wp-account-shell .step-info-value{ font-weight:700; color:var(--wp-ink); }
.wp-account-shell .scale-row-wrap{
  display:flex; align-items:flex-start; justify-content:space-between; gap:8px; position:relative;
  padding-top:8px;
}
.wp-account-shell .scale-row-wrap::before{
  content:""; position:absolute; top:16px; left:16px; right:16px; height:2px; background:var(--wp-border); z-index:0;
}
.wp-account-shell .scale-step{ position:relative; z-index:1; display:flex; flex-direction:column; align-items:center; gap:8px; flex:1; text-align:center; }
.wp-account-shell .step-ico{ width:16px; height:16px; border-radius:50%; background:#fff; border:2px solid var(--wp-border); box-sizing:border-box; }
.wp-account-shell .step-title{ font-size:var(--fs-12); font-weight:600; color:var(--wp-text-muted); }
.wp-account-shell .scale-step.active .step-ico{ background:var(--wp-blue); border-color:var(--wp-blue); }
.wp-account-shell .scale-step.active .step-title{ color:var(--wp-ink); }
.wp-account-shell .lk-bonuses-table-box{ background:#fff; border:1px solid var(--wp-border); border-radius:var(--wp-radius-lg); padding:8px 24px; margin-bottom:24px; }
.wp-account-shell .bonus-log{ width:100%; border-collapse:collapse; }
.wp-account-shell .bonus-log th{ text-align:left; font-size:var(--fs-12); font-weight:600; color:var(--wp-text-muted); padding:14px 8px; border-bottom:1px solid var(--wp-border); }
.wp-account-shell .bonus-log th:last-child, .wp-account-shell .bonus-log td:last-child{ text-align:right; }
.wp-account-shell .bonus-log td{ font-size:var(--fs-14); color:var(--wp-ink); padding:14px 8px; border-bottom:1px solid var(--wp-border); }
.wp-account-shell .bonus-log tbody:last-child td{ border-bottom:none; }
.wp-account-shell .bonus-log tbody.hide{ display:none; }
.wp-account-shell .bonus-log .text-succefull{ color:var(--wp-green); font-weight:600; }
.wp-account-shell .bonus-log .text-alert{ color:var(--wp-red); font-weight:600; }
.wp-account-shell .bonus-log .td-date{ display:none; }
@media (max-width:600px){
  .wp-account-shell .lk-bonuses-table-box{ padding:8px 16px; }
  .wp-account-shell .bonus-log thead{ display:none; }
  .wp-account-shell .bonus-log tr{ display:flex; flex-wrap:wrap; justify-content:space-between; }
  .wp-account-shell .bonus-log td:last-child{ display:none; }
  .wp-account-shell .bonus-log .td-date{ display:block; font-size:var(--fs-12); color:var(--wp-text-muted); margin-top:2px; }
}
/* modules/page/templates_2025/bonus-status.tpl (4-tier privilege cards, included at the
   bottom of stat/bonus.tpl) — same "no CSS anywhere" gap. */
.wp-account-shell .items-status .items-wrap{ display:grid; grid-template-columns:repeat(4,1fr); gap:16px; }
@media (max-width:900px){
  .wp-account-shell .items-status .items-wrap{ grid-template-columns:repeat(2,1fr); }
}
@media (max-width:600px){
  .wp-account-shell .items-status .items-wrap{ grid-template-columns:1fr; }
}
.wp-account-shell .item-tile-status{
  background:#fff; border:1px solid var(--wp-border); border-radius:var(--wp-radius-lg);
  padding:20px; height:100%; box-sizing:border-box;
}
.wp-account-shell .tile-status{ display:flex; align-items:center; gap:10px; margin-bottom:14px; }
.wp-account-shell .tile-status .tile-ico{ width:28px; height:28px; flex:none; }
.wp-account-shell .tile-status .tile-ico img{ width:100%; height:100%; }
.wp-account-shell .tile-status .st-title{ font-size:var(--fs-15); font-weight:700; color:var(--wp-ink); }
.wp-account-shell .tile-status.st-bronze .tile-ico{ filter:sepia(.6) saturate(2) hue-rotate(-10deg) brightness(.9); }
.wp-account-shell .tile-status.st-silver .tile-ico{ filter:grayscale(1) brightness(1.3); }
.wp-account-shell .tile-status.st-gold .tile-ico{ filter:sepia(.8) saturate(3) hue-rotate(-10deg) brightness(1.1); }
.wp-account-shell .tile-status.st-platina .tile-ico{ filter:grayscale(.4) brightness(1.15); }
.wp-account-shell .tile-info-wrap p{ font-size:var(--fs-13); color:var(--wp-text-muted); line-height:1.5; margin:0 0 12px; }
.wp-account-shell .tile-info-wrap p b{ color:var(--wp-ink); }
.wp-account-shell .tile-info-wrap .tile-title.h5-title{ font-size:var(--fs-13); font-weight:700; color:var(--wp-ink); margin:0 0 8px; }
.wp-account-shell .tile-info-wrap .list-dots{ list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:6px; }
.wp-account-shell .tile-info-wrap .list-dots li{ position:relative; padding-left:14px; font-size:var(--fs-13); color:var(--wp-text-muted); line-height:1.4; }
.wp-account-shell .tile-info-wrap .list-dots li::before{ content:""; position:absolute; left:0; top:7px; width:5px; height:5px; border-radius:50%; background:var(--wp-blue); }

/* ---------------- order history (stat/orders.tpl) ----------------
   Never got a 2026 pass — every one of its classes (.type-order, .btn-popup, .button-status,
   .popup-content-block, .data-title-wrap, .data-content-wrap .list-dots, .item-tile-order,
   .popup-order-wrap, .stat-rating/.stars, .info-panel-box's own account-shell scope, the
   post-payment status boxes) was completely unstyled, rendering as plain unstyled text/links —
   see report. The open/close click handler itself already existed (templates_2025/main.tpl's
   own inline script, gated on $param_tpl.module === 'stat', toggles .active on
   ".lk-toggle-box .js-btn-tgl" directly) — this CSS just keys off the same .active class it
   was already setting. (A duplicate handler was briefly added to main2026.js under the wrong
   assumption that none existed; it fought the real one via double-toggle and was removed.) */
.wp-account-shell .type-order{ overflow:hidden; }
.wp-account-shell .type-order .btn-popup{
  display:flex; align-items:center; justify-content:space-between; gap:16px; width:100%; padding:18px 20px;
  box-sizing:border-box; cursor:pointer; text-decoration:none; background:none; border:none; text-align:left;
  transition:background .15s ease;
}
.wp-account-shell .type-order .btn-popup:hover{ background:var(--wp-bg-panel); }
.wp-account-shell .type-order .btn-popup .button-title{ font-size:var(--fs-15); font-weight:600; color:var(--wp-ink); display:flex; align-items:center; flex-wrap:wrap; gap:6px; }
.wp-account-shell .type-order .btn-popup .button-title b.red{ color:var(--wp-blue); font-weight:700; }
/* chevron, CSS-only (no icon asset in the markup) — rotates via .active same as every other
   accordion/dropdown toggle on this site. */
.wp-account-shell .type-order .btn-popup::after{
  content:""; flex:none; width:9px; height:9px; margin-left:4px; border-right:2px solid var(--wp-text-muted);
  border-bottom:2px solid var(--wp-text-muted); transform:rotate(45deg); transition:transform .2s ease; align-self:center;
}
.wp-account-shell .type-order .btn-popup.active::after{ transform:rotate(-135deg); }
.wp-account-shell .type-order .button-status{ flex:none; }
.wp-account-shell .type-order .button-status > div{
  display:inline-flex; align-items:center; padding:6px 14px; border-radius:20px; font-size:var(--fs-13); font-weight:600; white-space:nowrap;
}
.wp-account-shell .type-order .frm-message-wait{ background:rgba(168,95,9,.12); color:var(--wp-amber); }
.wp-account-shell .type-order .frm-message-cancel{ background:rgba(192,57,43,.1); color:var(--wp-red); }
.wp-account-shell .type-order .frm-message-succefull{ background:rgba(30,122,70,.1); color:var(--wp-green); font-size:var(--fs-13); font-weight:600; margin:0; }
.wp-account-shell .type-order .popup-content-block{ display:none; padding:0 20px 20px; border-top:1px solid var(--wp-border); }
.wp-account-shell .type-order .btn-popup.active + .popup-content-block{ display:block; padding-top:20px; }
.wp-account-shell .type-order .order-data-info-wrap > p{ font-size:var(--fs-13); color:var(--wp-text-muted); line-height:1.6; background:var(--wp-bg-panel); border-radius:var(--wp-radius); padding:14px 16px; margin:0 0 16px; }
.wp-account-shell .type-order .order-data-info-wrap > p .link{ color:var(--wp-blue); }
.wp-account-shell .type-order .data-title-wrap{ margin-bottom:10px; }
.wp-account-shell .type-order .data-title, .wp-account-shell .type-order .data-content-wrap h2{ font-size:var(--fs-15); font-weight:700; color:var(--wp-ink); margin:0 0 10px; }
.wp-account-shell .type-order .data-content-wrap{ margin-bottom:16px; }
.wp-account-shell .type-order .data-content-wrap .list-dots{ list-style:none; margin:0 0 16px; padding:0; display:flex; flex-direction:column; gap:8px; }
.wp-account-shell .type-order .data-content-wrap .list-dots:last-child{ margin-bottom:0; }
.wp-account-shell .type-order .data-content-wrap .list-dots li{ font-size:var(--fs-14); color:var(--wp-text-muted); line-height:1.5; }
.wp-account-shell .type-order .data-content-wrap .list-dots li b{ color:var(--wp-ink); font-weight:600; }
.wp-account-shell .type-order .data-content-wrap .list-dots li a{ color:var(--wp-blue); }
/* product rows */
.wp-account-shell .type-order .order-list-inner-wrap{ margin-bottom:16px; }
.wp-account-shell .type-order .items-wrap{ display:flex; flex-direction:column; gap:12px; }
.wp-account-shell .type-order .item-tile-order.tile-order{
  display:flex; align-items:center; gap:14px; padding:12px; background:var(--wp-bg-panel); border-radius:var(--wp-radius);
}
.wp-account-shell .type-order .tile-photo-wrap{ flex:none; width:56px; height:56px; border-radius:var(--wp-radius); overflow:hidden; background:#fff; }
.wp-account-shell .type-order .tile-photo-wrap img, .wp-account-shell .type-order .tile-photo-wrap .tile-photo{ width:100%; height:100%; object-fit:contain; display:block; }
.wp-account-shell .type-order .tile-info-wrap{ flex:1; min-width:0; }
.wp-account-shell .type-order .tile-info-wrap .tile-title{ font-size:var(--fs-14); font-weight:600; color:var(--wp-ink); line-height:1.4; }
.wp-account-shell .type-order .tile-info-wrap .tile-title a{ color:var(--wp-ink); }
.wp-account-shell .type-order .tile-info-wrap .tile-title a:hover{ color:var(--wp-blue); }
.wp-account-shell .type-order .tile-info-wrap .tile-info{ font-size:var(--fs-12); color:var(--wp-text-muted); margin-top:2px; }
.wp-account-shell .type-order .tile-price-wrap{ flex:none; text-align:right; }
.wp-account-shell .type-order .tile-price{ font-size:var(--fs-14); font-weight:700; color:var(--wp-ink); white-space:nowrap; }
.wp-account-shell .type-order .tile-price-info{ font-size:var(--fs-12); color:var(--wp-text-muted); white-space:nowrap; }
/* 5-star product rating — no icon asset anywhere in the markup for it (nor a base rule), so the
   star glyph itself is CSS-generated (★ character) rather than pulling in a new image asset. */
.wp-account-shell .type-order .stat-rating{ flex:none; text-align:center; }
.wp-account-shell .type-order .stars-wrap{ display:flex; gap:2px; }
.wp-account-shell .type-order .stars{ font-size:0; line-height:1; }
.wp-account-shell .type-order .stars::before{ content:"★"; font-size:18px; color:var(--wp-amber); }
.wp-account-shell .type-order .stars.stars-off::before{ color:var(--wp-border-hover); }
.wp-account-shell .type-order .stat-rating:not(.success) .stars:hover::before{ color:var(--wp-amber); }
/* collapsed-state preview (thumbnail strip + total + repeat button) — shown only while the
   detail block above is closed. */
.wp-account-shell .type-order .popup-order-wrap{
  display:flex; align-items:center; justify-content:space-between; gap:16px; flex-wrap:wrap; padding:14px 20px;
  border-top:1px solid var(--wp-border);
}
.wp-account-shell .type-order .btn-popup.active ~ .popup-order-wrap{ display:none; }
.wp-account-shell .type-order .orders-list-wrap{ display:flex; gap:6px; }
.wp-account-shell .type-order .order-wrap{ width:40px; height:40px; border-radius:var(--wp-radius); overflow:hidden; background:var(--wp-bg-panel); flex:none; }
.wp-account-shell .type-order .order-wrap .elm-photo, .wp-account-shell .type-order .order-wrap img{ width:100%; height:100%; object-fit:contain; display:block; }
.wp-account-shell .type-order .orders-info-wrap{ display:flex; align-items:center; gap:20px; margin-left:auto; }
.wp-account-shell .type-order .orders-total-wrap{ text-align:right; }
.wp-account-shell .type-order .elm-price{ font-size:var(--fs-15); font-weight:700; color:var(--wp-ink); }
/* footer actions ("Обратная связь" toggle) inside the expanded block */
.wp-account-shell .type-order .data-action-wrap{ margin-top:8px; }
/* post-payment status boxes that remain after removing the RU-only Tinkoff/invoice blocks —
   "Оплата возможна только после согласования", "Заказ оплачен". */
.wp-account-shell .type-order .side-qr-box{ margin-top:16px; }
.wp-account-shell .type-order .info-payment{ background:var(--wp-bg-panel); border-radius:var(--wp-radius); padding:16px; text-align:center; }
.wp-account-shell .type-order .error-stock{ font-size:var(--fs-13); color:var(--wp-amber); font-weight:600; }
.wp-account-shell .type-order .frm-succefull-message .frm-title{ font-size:var(--fs-14); font-weight:700; color:var(--wp-green); margin-bottom:8px; }
.wp-account-shell .type-order .frm-succefull-message .elm-ico img{ width:32px; height:32px; }
@media (max-width:600px){
  .wp-account-shell .type-order .item-tile-order.tile-order{ flex-wrap:wrap; }
  .wp-account-shell .type-order .stat-rating{ width:100%; order:3; }
  .wp-account-shell .type-order .stars-wrap{ justify-content:center; }
}

@media (min-width:901px){ .elm-hidden-desktop{ display:none !important; } }
@media (max-width:900px){ .elm-hidden-mobile{ display:none !important; } }
.wp-product .side-wrap{ position:sticky; top:130px; align-self:start; min-width:0; }
.wp-product-content{ min-width:0; }
@media (max-width:900px){
  .wp-product .side-wrap{ width:100%; position:static; }
}
.wp-product .h1-title{ margin-top:0; }
.wp-product .title-inner-wrap{ margin-bottom:20px; }
/* generic "hidden" utility class used across this template (e.g. the schema.org
   itemprop="brand" span) — was missing a scoped rule, so it rendered visibly. */
.wp-product .hide{ display:none; }

/* mobile off-canvas "Категории товаров" popup (.side-wrap > .side-menu-box.popup-mobile-box,
   fed by modules/catalog/templates_2025/menu_catalog.tpl — not edited here). CORRECTION: this
   panel is injected by templates_2025/main.tpl as a SIBLING of .page-full (both children of
   .wrap), not nested inside .wp-product/.wp-catalog-page — a ".wp-product ..." or
   ".wp-catalog-page ..." scoped selector never actually matches it in the real DOM. Scope to
   ".wrap" (the real common ancestor on every page type) so it hides correctly everywhere,
   revealed only via the site's existing ".active" toggle convention. The catalog page's own
   persistent-desktop-sidebar treatment (.wp-catalog-page .side-menu-box, unconditional) still
   wins there via its own separate, more specific rules further down. */
.wrap .popup-mobile-box{
  display:none; position:fixed; inset:0; z-index:70; background:#fff; overflow-y:auto; padding:0 0 24px;
}
.wrap .popup-mobile-box.active{ display:block; }
.wrap .popup-mobile-box .popup-title-wrap{
  display:flex; align-items:center; justify-content:space-between; padding:16px; border-bottom:1px solid var(--wp-border);
  position:sticky; top:0; background:#fff; z-index:2;
}
.wrap .popup-mobile-box .popup-title{ font-size:var(--fs-16); font-weight:700; color:var(--wp-ink); }
.wrap .popup-mobile-box .btn-popup-close{ width:32px; height:32px; border-radius:50%; border:none; background:var(--wp-bg-panel); cursor:pointer; position:relative; }
.wrap .popup-mobile-box .btn-popup-close::before, .wrap .popup-mobile-box .btn-popup-close::after{
  content:""; position:absolute; width:14px; height:2px; background:var(--wp-text); top:50%; left:50%;
}
.wrap .popup-mobile-box .btn-popup-close::before{ transform:translate(-50%,-50%) rotate(45deg); }
.wrap .popup-mobile-box .btn-popup-close::after{ transform:translate(-50%,-50%) rotate(-45deg); }
.wrap .popup-mobile-box .popup-content-wrap{ padding:0 0 16px 0; }

/* ---------- breadcrumbs ---------- */
.wp-product .breadcrumbs-box .menu, .wp-basket .breadcrumbs-box .menu{
  list-style:none; display:flex; flex-wrap:wrap; align-items:center; gap:4px;
  margin:0 0 20px; padding:0; font-size:var(--fs-13); color:var(--wp-text-muted);
}
.wp-product .breadcrumbs-box li{ display:flex; align-items:center; gap:4px; }
.wp-product .breadcrumbs-box li:not(:last-child)::after{ content:"\203A"; margin-left:4px; color:var(--wp-border-hover); }
.wp-product .breadcrumbs-box a{ color:var(--wp-text-muted); font-weight:500; }
.wp-product .breadcrumbs-box a:hover{ color:var(--wp-blue); }
.wp-product .breadcrumbs-box li:last-child{ color:var(--wp-ink); font-weight:600; }

/* ---------- gallery + info two-column row (wrapper added in product.tpl) ---------- */
.wp-product-top{ display:grid; grid-template-columns:440px 1fr; gap:40px; align-items:start; margin-bottom:32px; }
/* grid items default to min-width:auto (their content's own unbreakable minimum) — below the
   1100px breakpoint this collapses to a single 1fr column, but without min-width:0 that track
   still expands to fit whatever fixed-width content sits inside it (the 440px photo gallery),
   overflowing the whole page horizontally on narrow/mobile screens instead of shrinking. */
.wp-product-top > *{ min-width:0; }

.wp-product .photos-inner-wrap{ position:relative; }
.wp-product .tiles-thumbs-slider-box{
  display:flex; flex-direction:column; gap:12px; min-width:0;
  -webkit-user-select:none; user-select:none;
}
.wp-product .tiles-thumbs-slider-box > *{ min-width:0; }
.wp-product .slider-photos-main{
  position:relative; width:100%; min-width:0; aspect-ratio:1/1; border-radius:var(--wp-radius-lg);
  overflow:hidden; background:var(--wp-bg-panel);
}
.wp-product .slider-photos-main .slider-wrap, .wp-product .slider-photos-main .slider{ height:100%; }
.wp-product .slider-photos-main .slider,
.wp-product .slider-photos-thumbs .slider{ transition:transform .2s ease; }
/* No opacity/reveal hack needed here: the pre-Swiper CSS-only layout (flex row, gap:8px)
   and Swiper's own post-init layout (spaceBetween:0, same CSS gap) now render identically,
   so there's nothing to hide — see initProductGalleryFallback in main2026.js. */
#left-description .slider-photos-main .sl-wrap,
.wp-product .slider-photos-main .sl-wrap{ width:100%; height:100%; flex:none !important; min-width:0; }
.wp-product .slider-photos-main .elm-photo{ display:block; width:100%; height:100%; }
.wp-product .slider-photos-main .elm-photo img{ width:100%; height:100%; object-fit:contain; display:block; }
.wp-product .slider-photos-main-pagination{ display:none !important; }
.wp-product .slider-photos-main-pagination span[class*="bullet"]{
  width:7px; height:7px; border-radius:50%; background:var(--wp-border-hover); cursor:pointer;
  transition:width .25s ease,background-color .25s ease; opacity:1; box-shadow:0 1px 4px rgba(27,29,34,.25);
}
.wp-product .slider-photos-main-pagination span[class*="bullet-active"]{ width:18px; border-radius:4px; background:var(--wp-blue); }

.wp-product .button-slider-photos-main-prev, .wp-product .button-slider-photos-main-next{
  position:absolute; top:50%; transform:translateY(-50%); display:flex; align-items:center; justify-content:center;
  cursor:pointer; z-index:3; width:48px; height:48px; outline:none;
}
.wp-product .button-slider-photos-main-prev{ left:12px; }
.wp-product .button-slider-photos-main-next{ right:12px; }
.wp-product .button-slider-photos-main-prev svg, .wp-product .button-slider-photos-main-next svg{ display:block; transition:stroke .2s ease; }
.wp-product .button-slider-photos-main-prev:hover svg, .wp-product .button-slider-photos-main-next:hover svg,
.wp-product .button-slider-photos-main-prev:focus svg, .wp-product .button-slider-photos-main-next:focus svg{ stroke:var(--wp-blue); }

.wp-product .slider-photos-thumbs{ position:relative; }
/* the strip usually holds more thumbnails than fit (e.g. 6 at 77px+gap vs a ~440px box),
   so the trailing one is inevitably clipped at rest — fade it out instead of a hard cut so
   it reads as "scroll for more" rather than a broken image. */
.wp-product .slider-photos-thumbs .slider-wrap{
  overflow-x:auto; overflow-y:hidden; scroll-behavior:smooth;
  scrollbar-width:none; -ms-overflow-style:none;
  -webkit-mask-image:linear-gradient(to right, #000 calc(100% - 28px), transparent 100%);
  mask-image:linear-gradient(to right, #000 calc(100% - 28px), transparent 100%);
}
.wp-product .slider-photos-thumbs .slider-wrap::-webkit-scrollbar{ display:none; }
/* Plain natively-scrolled strip, not a second Swiper instance (see initProductGalleryFallback
   in main2026.js) — Swiper's slidesPerView:'auto' scroll-range math doesn't account for a CSS
   gap between slides and stops short of the last thumbnail, while the browser's own scrollWidth
   always gets this right, so a real CSS gap here is safe and finally doesn't need a load-time
   spacing jump to work around it. */
.wp-product .slider-photos-thumbs .slider{ display:flex; gap:8px; cursor:grab; }
.wp-product .slider-photos-thumbs .slider.is-dragging{ cursor:grabbing; scroll-behavior:auto; }
#left-description .slider-photos-thumbs .sl-wrap,
.wp-product .slider-photos-thumbs .sl-wrap{ flex:none !important; width:77px; height:77px; min-width:0; cursor:pointer; }
.wp-product .slider-photos-thumbs .elm-photo{
  width:100%; height:100%; box-sizing:border-box; padding:4px; border-radius:8px; border:1px solid var(--wp-border);
  overflow:hidden; display:block; transition:border-color .2s ease,box-shadow .2s ease; background:#fff;
}
.wp-product .slider-photos-thumbs .elm-photo img{ width:100%; height:100%; object-fit:contain; display:block; border-radius:5px; }
.wp-product .slider-photos-thumbs .sl-wrap:hover .elm-photo{ border-color:var(--wp-border-hover); box-shadow:0 4px 10px rgba(27,29,34,.14); }
.wp-product .slider-photos-thumbs .swiper-slide-thumb-active .elm-photo{ border-color:var(--wp-blue); box-shadow:0 4px 10px rgba(27,29,34,.14); }
.wp-product .photo-play{ position:relative; }
.wp-product .photo-play::after{
  content:""; position:absolute; inset:0; margin:auto; width:18px; height:18px; border-radius:50%;
  background:rgba(27,29,34,.55) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23fff'%3E%3Cpath d='M8 5v14l11-7z'/%3E%3C/svg%3E") center/10px no-repeat;
}
.wp-product .button-slider-photos-thumbs-prev, .wp-product .button-slider-photos-thumbs-next{ display:none; }
.wp-product .button-slider-photos-thumbs-prev{ left:0; }
.wp-product .button-slider-photos-thumbs-next{ right:0; }
.wp-product .button-slider-photos-thumbs-prev::before, .wp-product .button-slider-photos-thumbs-next::before{
  content:""; position:absolute; top:50%; left:50%; width:6px; height:6px; border:solid var(--wp-text); border-width:0 2px 2px 0;
}
.wp-product .button-slider-photos-thumbs-prev::before{ transform:translate(-30%,-50%) rotate(135deg); }
.wp-product .button-slider-photos-thumbs-next::before{ transform:translate(-70%,-50%) rotate(-45deg); }

/* badges + fav/video actions, overlaid on the gallery */
.wp-product .stickers-info-wrap{ position:absolute; top:12px; left:12px; z-index:3; display:flex; flex-direction:column; gap:8px; }
.wp-product .elm-sticker{ display:inline-flex; align-items:center; gap:6px; border-radius:6px; padding:5px 10px; color:#fff; }
.wp-product .elm-sticker .st-title{ font-size:var(--fs-12); font-weight:700; }
.wp-product .elm-sticker .elm-ico{ display:flex; width:13px; height:13px; flex:none; }
.wp-product .elm-sticker .elm-ico img{ width:100%; height:100%; filter:brightness(0) invert(1); }
.wp-product .elm-sticker.bg-att{ background:linear-gradient(135deg,var(--wp-btn-grad-a),var(--wp-btn-grad-b)); }
.wp-product .elm-sticker.bg-alert{ background:linear-gradient(135deg,var(--wp-pink),var(--wp-pink-dark)); }

.wp-product .actions-info-wrap{ position:absolute; top:12px; right:12px; z-index:3; display:flex; flex-direction:column; gap:8px; }
.wp-product .actions-info-wrap > *{
  width:38px; height:38px; border-radius:50%; background:#fff; display:flex; align-items:center; justify-content:center;
  cursor:pointer; box-shadow:var(--wp-shadow-card);
}
.wp-product .actions-info-wrap img{ width:17px; height:17px; display:block; }
.wp-product .actions-info-wrap .ico-fav{
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%235C6270' stroke-width='2'%3E%3Cpath d='M20.8 4.6a5.5 5.5 0 0 0-7.8 0L12 5.6l-1-1a5.5 5.5 0 0 0-7.8 7.8l1 1L12 21l7.8-7.6 1-1a5.5 5.5 0 0 0 0-7.8Z'/%3E%3C/svg%3E");
  background-repeat:no-repeat; background-position:center; background-size:18px 18px;
  transition:transform .2s ease, box-shadow .2s ease;
}
.wp-product .actions-info-wrap .ico-fav:hover{
  transform:scale(1.1); box-shadow:0 4px 12px rgba(27,29,34,.22);
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23E0537C' stroke-width='2'%3E%3Cpath d='M20.8 4.6a5.5 5.5 0 0 0-7.8 0L12 5.6l-1-1a5.5 5.5 0 0 0-7.8 7.8l1 1L12 21l7.8-7.6 1-1a5.5 5.5 0 0 0 0-7.8Z'/%3E%3C/svg%3E");
}
.wp-product .actions-info-wrap .ico-fav.active{
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23E0537C' stroke='%23E0537C' stroke-width='2'%3E%3Cpath d='M20.8 4.6a5.5 5.5 0 0 0-7.8 0L12 5.6l-1-1a5.5 5.5 0 0 0-7.8 7.8l1 1L12 21l7.8-7.6 1-1a5.5 5.5 0 0 0 0-7.8Z'/%3E%3C/svg%3E");
}
.wp-product .actions-info-wrap .ico-fav.active:hover{ transform:scale(1.14); }

/* ---------- right column: stock/article, price panel, price tiers, delivery ---------- */
.wp-product .info-inner-wrap.price-info{ min-width:0; }
.wp-product .product-info-wrap{
  margin-bottom:10px; display:flex; align-items:center; justify-content:space-between; flex-wrap:wrap; gap:6px 14px;
}
.wp-product .item-article-flex{ display:flex; align-items:center; justify-content:flex-start; gap:14px; flex-wrap:wrap; font-size:var(--fs-13); }
.wp-product .elm-stock{ font-size:var(--fs-13); font-weight:600; color:var(--wp-green); white-space:nowrap; }
.wp-product .elm-stock.stock-out{ color:var(--wp-red); }
.wp-product .elm-stock.stock-wait{ color:var(--wp-amber); }
.wp-product .product-art{ color:var(--wp-text-muted); white-space:nowrap; }
.wp-product .product-art span{ color:var(--wp-ink); font-weight:600; }
/* legacy inline <style> in product.tpl sets ".item-article-block{width:50%}" so the
   stock/article group and this toggle would each take half the row and stack instead of
   sitting inline on one line — override it here (higher specificity beats source order). */
.wp-product .item-article-block{ width:auto; }

.wp-product #change-unit{ display:flex; justify-content:flex-end; margin-top:0; }
.wp-product #change-unit a{ font-size:var(--fs-12); color:var(--wp-blue); font-weight:600; }
.wp-product #change-unit .button-title-border{ border-bottom:1px dashed var(--wp-blue); }
.wp-product #change-unit a.hide{ display:none; }

/* tippy's content() reads .tooltip-content-box.innerHTML then renders its own popup
   (appended to <body>, breaking any .wp-product/.wp-product-cross ancestor scoping) — the
   source element itself must stay hidden everywhere, not just on .wp-popular/.wp-catalog-page. */
.tooltip-content-box{ display:none; }

/* Tippy's own bundle self-injects a dark #333 default theme when no tippy.css/theme
   file is loaded (we only load the core JS bundle). Since main.tpl sets theme:'light-border'
   without ever shipping that theme's CSS, restyle it here as a plain white card — this is
   also portalled to <body> by tippy, so it must stay unscoped like .tooltip-content-box above. */
.tippy-box[data-theme~='light-border']{
  background:#fff; color:var(--wp-ink); border:1px solid var(--wp-border); border-radius:12px;
  box-shadow:0 8px 24px rgba(27,29,34,.12); font-size:var(--fs-13); line-height:1.4;
}
.tippy-box[data-theme~='light-border'] .tippy-content{ padding:16px; }
.tippy-box[data-theme~='light-border'] .tippy-arrow{ color:#fff; }
.tippy-box[data-theme~='light-border'][data-placement^='top'] .tippy-arrow::before{ border-top-color:#fff; }
.tippy-box[data-theme~='light-border'][data-placement^='bottom'] .tippy-arrow::before{ border-bottom-color:#fff; }
.tippy-box[data-theme~='light-border'][data-placement^='left'] .tippy-arrow::before{ border-left-color:#fff; }
.tippy-box[data-theme~='light-border'][data-placement^='right'] .tippy-arrow::before{ border-right-color:#fff; }

.item-tile-product-tooltip{ display:block; min-width:220px; max-width:280px; color:var(--wp-ink); text-decoration:none; }
.item-tile-product-tooltip .tile-title{ margin:0 0 12px; font-size:var(--fs-14); font-weight:500; line-height:1.4; color:var(--wp-ink); text-align:center; }
.item-tile-product-tooltip .tile-photo-wrap{ display:flex; justify-content:center; margin:0 0 12px; }
.item-tile-product-tooltip .tile-photo{ width:120px; height:120px; }
.item-tile-product-tooltip .tile-photo img{ width:100%; height:100%; object-fit:contain; }
.item-tile-product-tooltip .tile-stock{ font-size:var(--fs-13); font-weight:600; color:var(--wp-green); margin-bottom:8px; }
.item-tile-product-tooltip .tile-stock:not(.stock-wait):not(.stock-out)::before{ content:'\2713'; margin-right:4px; }
.item-tile-product-tooltip .tile-stock.stock-wait, .item-tile-product-tooltip .tile-stock.stock-out{ color:var(--wp-amber); }
.item-tile-product-tooltip .tile-price-wrap{ display:flex; align-items:baseline; gap:8px; flex-wrap:wrap; margin-bottom:10px; }
.item-tile-product-tooltip .tile-price{ font-size:var(--fs-20); font-weight:800; color:var(--wp-ink); white-space:nowrap; }
.item-tile-product-tooltip .tile-price-info{ font-size:var(--fs-13); color:var(--wp-text-muted); font-weight:500; }
.item-tile-product-tooltip .tile-info{
  background:var(--wp-bg-panel); border-radius:8px; padding:10px 12px; margin-bottom:12px;
  font-size:var(--fs-13); line-height:1.6; color:var(--wp-text-muted);
}
.item-tile-product-tooltip .tile-info b{ color:var(--wp-ink); font-weight:700; }
.item-tile-product-tooltip .tile-warehouses{ margin-top:4px; }
.wh-title{ font-weight:700; font-size:var(--fs-13); color:var(--wp-ink); margin-bottom:8px; }
.wh-row{ display:flex; justify-content:space-between; gap:16px; padding:3px 0; font-size:var(--fs-13); color:var(--wp-text); }
.wh-city{ color:var(--wp-text-muted); }
.wh-in{ color:var(--wp-green); font-weight:600; }
.wh-order, .wh-wait{ color:var(--wp-amber); font-weight:600; }

.wp-product-price-panel{
  display:flex; align-items:center; justify-content:space-between; gap:20px; flex-wrap:nowrap;
  background:var(--wp-bg-panel); border-radius:10px; padding:16px 18px; margin:14px 0 24px;
}
.wp-product .price-info-wrap {
    display: flex;
    align-items: baseline;
    /* gap: 10px; */
    flex-wrap: wrap;
}
.wp-product .elm-price{ font-size:var(--fs-32); font-weight:800; color:var(--wp-ink); white-space:nowrap; }
.wp-product .elm-price.price-all{ font-size:var(--fs-14); font-weight:600; color:var(--wp-text-muted); }
.wp-product .elm-price .price-unit{ font-weight:700; }

.wp-product .counter-info-wrap{ display:flex; align-items:center; gap:14px; flex-wrap:wrap; }
/* .counter-info-wrap.buy-btn is the ".counter-wrap + .button-wrap" pair (both the main
   price panel's and #panel-wrap-price's copy share this exact class list) — flex-wrap:wrap
   above was stacking them onto separate lines whenever they didn't jointly fit, regardless
   of the outer .wp-product-price-panel's own nowrap. Keep this one row always, shrinking
   the counter and letting the button take whatever's left instead. */
.wp-product .counter-info-wrap.buy-btn{ flex-wrap:nowrap; gap:10px; }
.wp-product .counter-info-wrap.buy-btn .counter-wrap{ flex:none; }
.wp-product .counter-info-wrap.buy-btn .frm-field-counter{ padding:0; gap:2px 0px; }
.wp-product .counter-info-wrap.buy-btn .js-input-counter{ width:32px; padding-right:0; }
.wp-product .counter-info-wrap.buy-btn .js-counter-unit{ /* padding-right:6px; */ }
.wp-product .counter-info-wrap.buy-btn .button-wrap{ flex:1; min-width:0; }
/* This <a class="btn"> has no width/display of its own anywhere in the stylesheet, so as a
   plain inline element it shrank-to-fit its text — constant width as long as the text never
   changed, but the moment the second (meta) line's text differs in width from the label, the
   whole button visibly resized. display:flex + width:100% pins it to always fill .button-wrap
   (already flex:1, i.e. sized by the row) regardless of what the label/meta text says. */
.wp-product .counter-info-wrap.buy-btn .button-wrap .btn {
    display: flex;
    width: 100%;
    height: 48px;
    align-items: center;
    justify-content: center;
    box-sizing: border-box;
    padding: 0 20px;
    overflow: hidden;
    text-overflow: ellipsis;
    min-width: 160px;
    white-space: nowrap;
}
.wp-product .counter-info-wrap.buy-btn .button-wrap .button-title{ overflow:hidden; text-overflow:ellipsis; }
/* "В корзину"/"buttonBuy"/"panelButton" — same label+meta pattern as the catalog card's
   .tile-action-wrap .btn above. Used to reserve the meta line's height unconditionally (rather
   than toggle display:none) specifically because this button had no fixed height back then —
   toggling would've resized it. Now that .btn has a fixed height (48px) the reservation isn't
   needed and was actively wrong: an always-present empty second line pushed the visible label
   text up off-center (more gap below it than above). Toggling with .active is safe here for
   the same reason it already is on .tile-action-wrap .btn: a fixed-height flex container just
   re-centers its (auto-height) content when the meta line appears, it doesn't resize. */
.wp-product .counter-info-wrap.buy-btn .button-wrap .btn .button-title{
  display:flex; flex-direction:column; align-items:center; justify-content:center; gap:1px; white-space:normal;
}
.wp-product .counter-info-wrap.buy-btn .button-wrap .btn .js-btn-label {
    font-size:var(--fs-14);
    line-height: 1.3;
}
.wp-product .counter-info-wrap.buy-btn .button-wrap .btn .js-btn-meta {
    display: none;
    font-weight: 600;
    opacity: .9;
    font-size:var(--fs-12);
    line-height: 1.3;
}
.wp-product .counter-info-wrap.buy-btn .button-wrap .btn.active .js-btn-meta {
    display: block;
}
.wp-product .counter-wrap{ display:flex; }
.wp-product .frm-field-counter{
  display:flex; flex-wrap:wrap; align-items:center; gap:2px 11px; border:1px solid var(--wp-border); border-radius:10px;
  padding:0; min-height:48px; background:#fff; box-sizing:border-box;
}
.wp-product .frm-field-counter .button-plus, .wp-product .frm-field-counter .button-minus{
  order:2; width:26px; border:none; background:none; color:var(--wp-text); font-weight:700;
  cursor:pointer; display:flex; align-items:center; justify-content:center; font-size:0; position:relative; flex:none;
  align-self:stretch; transition:background-color .2s ease, color .2s ease;
}
.wp-product .frm-field-counter .button-plus:hover, .wp-product .frm-field-counter .button-minus:hover{
  background:var(--wp-bg-panel); color:var(--wp-blue);
}
.wp-product .frm-field-counter .button-minus{ order:1; border-radius:10px 0 0 10px; }
.wp-product .frm-field-counter .button-plus{ order:3; border-radius:0 10px 10px 0; }
.wp-product .frm-field-counter .button-minus::before{ content:"\2212"; font-size:var(--fs-16); }
.wp-product .frm-field-counter .button-plus::before{ content:"+"; font-size:var(--fs-16); }
.wp-product .frm-field-counter .button-disabled{ opacity:.35; cursor:not-allowed; }
.wp-product .js-input-counter{
  order:2; border:none; background:transparent; text-align:center; font-size:var(--fs-14); font-weight:700; color:var(--wp-ink);
  width:26px; font-family:inherit; padding:16px 0; box-sizing:border-box; align-self:stretch; outline:none;
}
.wp-product .js-input-counter:focus{ outline:none; box-shadow:none; }
/* the unit ("уп."/"шт.") used to be typed into the input's own value (e.g. "2 уп.") — this is
   a separate, non-editable span right after it instead, same order:2 (ties with the input,
   falls back to DOM order — it comes right after it in the markup) so it renders in the same
   visual slot without the unit text being part of the editable field. */
.wp-product .js-counter-unit{
  order:2; font-size:var(--fs-14); font-weight:700; color:var(--wp-ink); align-self:center; white-space:nowrap; /* padding-left:2px; */
}
.wp-product .field-total{ display:none; } /* matches .wp-popular/.wp-catalog-page/.wp-product-cross — was left visible here, wrapping to a second line via flex-basis:100% and making the stepper taller than the 48px "В корзину" button beside it */

.wp-product .button-wrap{ flex:1; min-width:180px; }
.wp-product .button-wrap .btn{
  display:flex; align-items:center; justify-content:center; height:48px; width:100%; box-sizing:border-box;
  padding:0 28px; border-radius:10px; background:linear-gradient(135deg,var(--wp-btn-grad-a),var(--wp-btn-grad-b));
  color:#fff; font-size:var(--fs-15); font-weight:700; cursor:pointer; transition:filter .25s ease; border:none;
}
.wp-product .button-wrap .btn:hover{ filter:brightness(1.12) saturate(1.1); color:#fff; }

/* price-tiers table ("Ваша цена" / "Экономия") + КП request link */
.wp-product .features-info-wrap{ margin:4px 0 24px; }
.wp-product .features-info-wrap table{ width:100%; border-collapse:collapse; }
.wp-product .features-info-wrap thead th{
  font-size:var(--fs-15); font-weight:700; color:var(--wp-ink); text-align:center; padding-bottom:12px; border-bottom:1px solid var(--wp-border);
}
.wp-product .features-info-wrap tbody td{
  font-size:var(--fs-15); color:var(--wp-text); text-align:center; padding:12px 0; border-bottom:1px solid var(--wp-border); vertical-align:middle;
}
.wp-product .features-info-wrap tbody td:nth-child(2){ color:var(--wp-ink); }
.wp-product .features-info-wrap .text-light{ color:var(--wp-text-muted); font-size:var(--fs-12); }
.wp-product .features-info-wrap table:last-of-type{ margin-top:4px; }
.wp-product .features-info-wrap table:last-of-type td{ border-bottom:none; text-align:center; padding:14px 0 0; }
.wp-product .features-info-wrap table:last-of-type a{ font-size:var(--fs-14); font-weight:600; color:var(--wp-blue); }
.wp-product .features-info-wrap table:last-of-type a:hover{ color:#1B5FA0; }

/* delivery / pickup option cards (delivery_info.tpl) — 3 accordion cards
   (Самовывоз / Доставка / Доставка ТК) per SPEC-content-block.md §"Блок способов
   получения": click toggles an extra-detail panel + rotates the chevron 180°.
   Replaces the old RU-city popup-dropdown markup (.frm-field-select/.btn-popup/
   .select-content-block) which no longer applies to a KZ-only, single-warehouse site. */
.wp-product .delivery-info-wrap{ display:grid; grid-template-columns:repeat(3,1fr); align-items:start; gap:10px; padding-top:20px; }
.wp-product .wp-delivery-card{
  min-width:0; box-sizing:border-box; background:#F7F8FA;
  border:1px solid #E7EBEF; border-radius:10px; padding:14px; cursor:pointer;
  transition:box-shadow .2s ease, border-color .2s ease;
}
.wp-product .wp-delivery-card:hover{
  border-color:var(--wp-border-hover); box-shadow:0 4px 12px rgba(27,29,34,.12);
}
.wp-product .wp-delivery-card__row{ display:flex; align-items:flex-start; justify-content:space-between; gap:8px; }
.wp-product .wp-delivery-card__title{ font-size:var(--fs-14); font-weight:600; color:#1B1D22; line-height:1.5; }
.wp-product .wp-delivery-card__text{ font-size:var(--fs-13); color:#6B7280; font-weight:400; }
.wp-product .wp-delivery-card__chevron{
  flex:none; margin-top:2px; width:16px; height:16px; color:#9AA1AC; transition:transform .25s ease;
}
.wp-product .wp-delivery-card.active .wp-delivery-card__chevron{ transform:rotate(180deg); }
.wp-product .wp-delivery-card__panel{
  display:none; font-size:var(--fs-13); color:#6B7280; line-height:1.5; padding-top:10px;
}
.wp-product .wp-delivery-card.active .wp-delivery-card__panel{ display:block; }
.wp-product .logo-info-wrap{
  display:flex; align-items:center; justify-content:center; text-align:center; margin-top:12px; min-height:44px;
  padding:10px 16px; border-radius:10px; background:linear-gradient(180deg,var(--wp-blue-grad-top),var(--wp-blue-grad-bottom));
  color:#fff; font-size:var(--fs-14); font-weight:700; text-decoration:none;
}
.wp-product .logo-info-wrap:hover{ filter:brightness(1.1); color:#fff; }
.wp-product .info-title{ margin:0; }

/* ---------- variants ("Этот товар в других вариантах") ---------- */
.wp-product .info-variants-box{ background:var(--wp-bg-panel); border-radius:10px; padding:24px; margin-bottom:32px; }
/* .h2-title's base rule (.wp-root .h2-title) carries a 32px top margin meant for a
   heading that sits directly in page flow — inside this already-padded (24px) panel it
   stacked on top, doubling the gap above "Этот товар в других вариантах:". */
.wp-product .info-variants-box .h2-title{ margin-top:0; }
.wp-product .tags-box .title-inner-wrap{ margin-bottom:20px; }
.wp-product .tags-box .h2-title{ font-size:var(--fs-18); font-weight:700; color:var(--wp-ink); }
.wp-product .tags-box-wrap{ display:flex; align-items:flex-start; gap:16px; margin-bottom:16px; }
.wp-product .tags-box-wrap:last-child{ margin-bottom:0; }
.wp-product .variant-label{ flex:none; width:80px; padding-top:9px; font-size:var(--fs-14); font-weight:600; color:var(--wp-ink); margin-bottom:0; }
.wp-product .tags-box-wrap .menu{ list-style:none; display:flex; flex-wrap:wrap; gap:10px; margin:0; padding:0; }
.wp-product .button-tag{
  display:inline-flex; align-items:center; height:38px; padding:0 18px; border-radius:6px; border:1px solid var(--wp-border);
  background:#fff; color:var(--wp-ink); font-size:var(--fs-14); font-weight:600; cursor:pointer; text-decoration:none;
  transition:border-color .2s ease;
}
.wp-product .button-tag:hover{ border-color:var(--wp-border-hover); color:var(--wp-ink); }
.wp-product .button-tag.active{
  background:linear-gradient(180deg,var(--wp-blue-grad-top),var(--wp-blue-grad-bottom));
  color:#fff; font-weight:700; border-color:var(--wp-blue);
}
.wp-product .button-tag.not-stock-item{ background:#F1F3F5; color:#B7BCC4; border-color:transparent; cursor:not-allowed; }
.wp-product .button-tag.not-stock-item:hover{ border-color:transparent; color:#B7BCC4; }

/* ---------- description / reviews / payment / delivery / return tabs ---------- */
.wp-product .tabs-box .menu{ list-style:none; display:flex; margin:0 0 20px; padding:0; border-bottom:1px solid var(--wp-border); }
.wp-product .tabs-box .menu > li{ flex:1; text-align:center; }
.wp-product .button-tab-line{
  position:relative; display:block; padding:0 0 12px; font-size:var(--fs-16); font-weight:600; color:var(--wp-ink);
  cursor:pointer; white-space:nowrap; text-decoration:none;
}
/* underline-on-active/hover tab component, reused (identical ::after/:hover/.active behavior)
   by .wp-calc__tab, .wp-product-cross .button-tab, .wp-delivery__tab and .wp-return__tab below —
   each keeps its own base rule (different element: <a>/<button>, different base padding) but
   shares this animated-underline part. */
.wp-product .button-tab-line::after, .wp-product-cross .button-tab::after, .wp-calc__tab::after,
.wp-delivery__tab::after, .wp-return__tab::after{
  content:""; position:absolute; left:0; right:0; bottom:-1px; height:2px; background:var(--wp-blue);
  transform:scaleX(0); transform-origin:center; transition:transform .4s cubic-bezier(.22,.61,.36,1);
}
.wp-product .button-tab-line:hover, .wp-product .button-tab-line.active,
.wp-product-cross .button-tab:hover, .wp-product-cross .button-tab.active,
.wp-calc__tab:hover, .wp-calc__tab.active,
.wp-delivery__tab:hover, .wp-delivery__tab.active,
.wp-return__tab:hover, .wp-return__tab.active{ color:var(--wp-blue); }
.wp-product .button-tab-line:hover::after, .wp-product .button-tab-line.active::after,
.wp-product-cross .button-tab:hover::after, .wp-product-cross .button-tab.active::after,
.wp-calc__tab:hover::after, .wp-calc__tab.active::after,
.wp-delivery__tab:hover::after, .wp-delivery__tab.active::after,
.wp-return__tab:hover::after, .wp-return__tab.active::after{ transform:scaleX(1); }
.wp-product .info-features-box{ display:none; padding-top:24px; font-size:var(--fs-15); line-height:1.75; color:var(--wp-text); }
.wp-product .info-features-box.active{ display:block; }
.wp-product .info-features-box h2.h3-title{ margin-top:0; }
.wp-product .info-features-box .section-inner-wrap + .section-inner-wrap{ margin-top:28px; }
.wp-product .info-features-box p, .wp-product .info-features-box li{ font-size:var(--fs-15); line-height:1.75; color:var(--wp-text); }
/* Оплата/Доставка/Возврат panels use a slightly smaller size/line-height than Описание —
   applied on the panel itself (not just p/li) so bare text nodes and the trailing plain
   <a> links (no wrapping <p>, no .link class) inherit the same size instead of falling
   back to the browser default and looking mismatched against the list items. */
.wp-product .info-features-box[data-tab="tab02"],
.wp-product .info-features-box[data-tab="tab03"],
.wp-product .info-features-box[data-tab="tab04"]{ font-size:var(--fs-14); line-height:1.8; }
.wp-product .info-features-box[data-tab="tab02"] p, .wp-product .info-features-box[data-tab="tab02"] li,
.wp-product .info-features-box[data-tab="tab03"] p, .wp-product .info-features-box[data-tab="tab03"] li,
.wp-product .info-features-box[data-tab="tab04"] p, .wp-product .info-features-box[data-tab="tab04"] li{ font-size:var(--fs-14); line-height:1.8; }
.wp-product .info-features-box b{ color:var(--wp-ink); }
.wp-product .info-features-box ul{ padding-left:20px; margin:8px 0; }
.wp-product .info-features-box a.link{ color:var(--wp-blue); text-decoration:underline; }
.wp-product .info-features-box a.link:hover{ color:var(--wp-blue-dark); }
.wp-product .note-btn{ background:none; border:none; padding:0; font:inherit; color:var(--wp-blue); font-weight:600; cursor:pointer; }
.wp-product .dropdown-note{ font-size:var(--fs-14); color:var(--wp-text); line-height:1.7; margin-top:8px; }

/* description tab: two columns (description text on the left, characteristics
   on the right — matching the design) on wide screens. product.tpl renders
   the description .section-inner-wrap first, then productLadyChars.tpl
   (characteristics) second, inside a shared .box-inner-wrap, so a plain grid
   with DOM order places them left/right exactly like the design. */
.wp-product [data-tab="tab01"] .box-inner-wrap{
  display:grid; grid-template-columns:1fr 1fr; gap:40px; align-items:start;
}
.wp-product [data-tab="tab01"] .section-content{ display:flex; flex-direction:column; gap:2px; }
.wp-product [data-tab="tab01"] .section-content p{ margin:0; }
.wp-product [data-tab="tab01"] .section-content p br{ content:""; display:block; margin:9px 0; }

/* characteristics key/value list (productLadyChars.tpl) */
.wp-product .wp-char-list{ display:flex; flex-direction:column; }
.wp-product .wp-char-row{
  display:flex; justify-content:space-between; gap:16px; padding:10px 0; border-bottom:1px solid var(--wp-border); font-size:var(--fs-14);
}
.wp-product .wp-char-row:last-child{ border-bottom:none; }
.wp-product .wp-char-key{ color:var(--wp-text-muted); }
.wp-product .wp-char-value{ color:var(--wp-ink); font-weight:600; text-align:right; }

/* ---------- share ---------- */
.wp-product .share-box{
  display:flex; align-items:center; gap:12px; margin:32px 0 8px;
  background:#F7F8FA; border:1px solid #E7EBEF; border-radius:10px; padding:14px;
}
.wp-product .share-title{ font-size:var(--fs-14); font-weight:600; color:var(--wp-ink); margin:0; }
.wp-product .share-items{ display:flex; align-items:center; gap:8px; }
.wp-product .button-soc{
  width:34px; height:34px; border-radius:50%; background:#fff; border:1px solid var(--wp-border);
  display:flex; align-items:center; justify-content:center; transition:background-color .2s ease,border-color .2s ease,opacity .15s ease;
  padding:0; cursor:pointer; color:var(--wp-text-muted);
}
.wp-product .button-soc:hover{ border-color:var(--wp-border-hover); }
.wp-product .button-soc img{ width:16px; height:16px; }
/* brand icons (WhatsApp/Telegram/Facebook) ship their own colored circle in the SVG itself,
   so the button here stays a plain frame instead of layering a second gray circle behind it. */
.wp-product .button-soc-brand{ background:none; border:none; }
.wp-product .button-soc-brand:hover{ background:none; opacity:.85; }
.wp-product .button-soc-brand svg{ display:block; width:34px; height:34px; }
.wp-product .js-copy-link.is-copied{ color:var(--wp-green); border-color:var(--wp-green); }

/* ---------- compact "related_items_small.tpl" rows (accessories / compatible) ---------- */
.wp-parts{ margin:0 0 32px; }
.wp-parts .section-counter{ font-size:var(--fs-13); color:var(--wp-text-muted); margin-top:2px; }
.wp-list{ display:flex; flex-direction:column; gap:1px; background:var(--wp-border); border:1px solid var(--wp-border); border-radius:var(--wp-radius); overflow:hidden; }
.wp-row{ display:flex; align-items:center; gap:16px; background:#fff; padding:12px 16px; }
.wp-row__thumb{ flex:none; width:56px; height:56px; border-radius:6px; overflow:hidden; background:var(--wp-bg-panel); display:block; }
.wp-row__thumb img{ width:100%; height:100%; object-fit:contain; display:block; }
.wp-row .tile-content-wrap{ flex:1; min-width:0; }
.wp-row .tile-title{ font-size:var(--fs-14); font-weight:600; color:var(--wp-ink); margin-bottom:4px; }
.wp-row .tile-title a{ color:var(--wp-ink); }
.wp-row .tile-title a:hover{ color:var(--wp-blue); }
.wp-row .tile-info-row-wrap{ display:flex; align-items:center; gap:14px; font-size:var(--fs-13); color:var(--wp-text-muted); }
.wp-row .tile-art b{ color:var(--wp-ink); font-weight:600; }
.wp-row .tile-stock{ color:var(--wp-green); font-weight:600; }
.wp-row .tile-stock.stock-out{ color:var(--wp-amber); }
.wp-row__price{ flex:none; text-align:right; min-width:110px; }
.wp-row .wp-price{ font-size:var(--fs-16); font-weight:800; color:var(--wp-ink); white-space:nowrap; }
.wp-row .wp-price__unit{ font-size:var(--fs-11); color:var(--wp-text-muted); }
.wp-row .tile-action-wrap{ flex:none; display:flex; align-items:center; gap:8px; }
.wp-row .tile-action-wrap .btn{
  height:38px; padding:0 16px; border-radius:6px; background:linear-gradient(180deg,var(--wp-blue-grad-top),var(--wp-blue-grad-bottom));
  color:#fff; font-size:var(--fs-13); font-weight:700; border:none; cursor:pointer; white-space:nowrap;
}
.wp-row .tile-action-wrap .btn:hover{ filter:brightness(1.1) saturate(1.1); }
.wp-row .frm-field-counter{ min-height:38px; padding:0 8px; }
.wp-row .js-input-counter{ width:52px; font-size:var(--fs-13); }

/* ---------- cross-sell "С этим товаром покупают" / "Вы смотрели" sliders ----------
   Rendered as siblings of .wp-product (own #left-item-related/#left-item-history
   wrap in product.tpl, outside the .wp-root scope), so this block sets its own
   base typography/box-sizing instead of relying on .wp-root ancestors. */
.wp-product-cross{
  padding:32px; font-family:'Manrope',system-ui,-apple-system,'Segoe UI',Arial,sans-serif; font-weight:500;
  color:var(--wp-ink); box-sizing:border-box;
  background:#fff; border-radius:var(--wp-radius-lg); box-shadow:var(--wp-shadow-card);
  max-width:1360px; margin:24px auto 0;
}
@media (max-width:900px){
  .wp-product-cross{ margin:16px 16px 0; padding:20px 16px; border-radius:var(--wp-radius); }
}
.wp-product-cross, .wp-product-cross *{ box-sizing:border-box; }
/* this block sits outside .wp-root (see comment above), so it never gets .wp-root's
   sitewide "a{text-decoration:none}" reset either — every link here defaulted to the
   browser's underline until this was added. */
.wp-product-cross a{ text-decoration:none; }
.wp-product-cross .title-box{ display:flex; align-items:baseline; justify-content:space-between; gap:16px; flex-wrap:wrap; margin-bottom:20px; }
.wp-product-cross .title-wrap h1, .wp-product-cross .title-wrap h3{
  margin:0; font-size:var(--fs-22); font-weight:700; color:var(--wp-ink);
}
.wp-product-cross .title-wrap h1 a, .wp-product-cross .title-wrap h3 a{ color:inherit; }
.wp-product-cross .action-wrap .btn{ background:none; border:none; padding:0; cursor:pointer; }
/* merged into the shared #left-description/.wp-product-cross group above */
/* same "Все товары →" hover-slide arrow as .wp-popular__more (main_page.tpl) */
.wp-product-cross .button-link span{ transition:transform .25s ease; }
.wp-product-cross .button-link:hover span{ transform:translateX(4px); }
.wp-product-cross .button-title-border{ border-bottom:none; }
/* overflow-x:auto with no overflow-y specified computes overflow-y to auto too (CSS Overflow
   spec: a visible axis paired with a scrolling one is forced to auto), so this scrolled
   vertically as well as horizontally even with no vertical overflow ever intended —
   overflow-y:hidden pins it to the one (horizontal) scrollbar it's actually meant to have. */
.wp-product-cross .tabs-slider-box .menu{ list-style:none; display:flex; flex-wrap:nowrap; gap:28px; margin:0 0 20px; padding:0; border-bottom:1px solid var(--wp-border); overflow-x:auto; overflow-y:hidden; }
/* without an explicit no-wrap, a long tab label (e.g. two categories with multi-word names)
   just wrapped onto a second line instead of triggering the intended horizontal scroll —
   the row grew taller than its container expected, so the extra line got clipped by
   whatever ancestor happens to constrain height nearby, showing a vertical scrollbar/
   overlapping text instead of a clean single-row horizontal-scroll tab strip. */
.wp-product-cross .tabs-slider-box .menu li{ flex:none; }
.wp-product-cross .tabs-slider-box .menu .button-title{ white-space:nowrap; }
.wp-product-cross .button-tab{
  background:none; border:none; padding:0 0 12px; font:inherit; font-size:var(--fs-16); font-weight:600; color:var(--wp-ink);
  cursor:pointer; position:relative; white-space:nowrap;
}
/* ::after/:hover/.active underline behavior shared with .wp-product .button-tab-line etc. — see
   that rule (above) for the grouped selector. */
.wp-product-cross .tiles-slider-box{ position:relative; }
.wp-product-cross .tiles-slider-box.js-tab-block{ display:none; }
.wp-product-cross .tiles-slider-box.js-tab-block.active{ display:block; }
/* No JS Swiper instance actually runs this (no slidesPerView/navigation wired up) — it's a
   genuinely native-scrolled carousel instead (see initCrossSliders in main2026.js), same
   pattern as the product gallery thumbnail strip: overflow-x:auto lets the browser's own
   (always-correct) scrollWidth drive it, with the existing prev/next buttons and mouse wheel
   just nudging scrollLeft. Scrollbar hidden since the buttons + drag/wheel already cover it. */
.wp-product-cross .slider-wrap.swiper{
  overflow-x:auto; overflow-y:hidden; position:relative; scroll-behavior:smooth;
  scrollbar-width:none; -ms-overflow-style:none;
}
.wp-product-cross .slider-wrap.swiper::-webkit-scrollbar{ display:none; }
.wp-product-cross .slider-tiles .slider{ display:flex; gap:16px; cursor:grab; }
.wp-product-cross .slider-tiles .slider.is-dragging{ cursor:grabbing; scroll-behavior:auto; }
/* flex-grow shares out any leftover row width when a category has fewer items than fit one
   row (see wholesale/copy-link work above for the min-width:0 rationale); flex-shrink:0 keeps
   tiles at their full design width instead of squeezing when there are MORE items than fit —
   that overflow is exactly what should scroll, not get crammed into view. */
.wp-product-cross .slider-tiles .sl-wrap{ flex:1 0 232px; max-width:280px; min-width:0; width:auto; box-sizing:border-box; }
/* side nav buttons removed per request — the row still scrolls via wheel/drag/touch
   (initCrossSliders in main2026.js), just without the overlay arrow buttons. */
.wp-product-cross .button-slider-tiles-prev, .wp-product-cross .button-slider-tiles-next{ display:none; }
/* carousel rule differs by variant (initCrossSliders() in main2026.js toggles this class):
   "С этим товаром покупают" (--related) only below 1320px; "Вы смотрели" (--history) below
   1320px OR when there are more than 5 items. Otherwise falls back to a wrapping grid. */
/* overflow-y:hidden from the base (carousel/single-row) rule clips row 2+ once wrapped —
   same fix as .wp-popular above. */
.wp-product-cross .slider-wrap.swiper.is-grid{ overflow:visible; }
.wp-product-cross .slider-wrap.swiper.is-grid .slider.swiper-wrapper{ flex-wrap:wrap; }
.wp-product-cross .button-slider-tiles-prev::before, .wp-product-cross .button-slider-tiles-next::before{
  content:""; width:8px; height:8px; border:solid var(--wp-text); border-width:0 2px 2px 0; display:block;
}
.wp-product-cross .button-slider-tiles-prev::before{ transform:rotate(135deg); margin-left:3px; }
.wp-product-cross .button-slider-tiles-next::before{ transform:rotate(-45deg); margin-right:3px; }
.wp-product-cross .slider-scrollbar-tiles{ display:none; }
.wp-product-cross .more-box{ text-align:center; margin-top:20px; }
.wp-product-cross .more-box .button-link{ justify-content:center; }

/* full product-card component (same markup as .wp-catalog-page/.wp-popular, see there for the
   reference design) — .wp-product-cross only had the outer card shell duplicated, so titles,
   prices, photo, stickers, fav button and the stepper/buy-button row all fell back to
   unstyled browser defaults (blue underlined title link, no photo sizing, no button styling). */
.wp-product-cross .item-tile-catalog{
  position:relative; height:100%; display:flex; flex-direction:column; gap:8px; background:#fff;
  border:1px solid var(--wp-border); border-radius:var(--wp-radius); padding:16px; box-sizing:border-box;
  transition:box-shadow .25s ease,border-color .25s ease;
}
.wp-product-cross .item-tile-catalog:hover{ box-shadow:var(--wp-shadow-card); border-color:var(--wp-border-hover); }
.wp-product-cross .item-wrap.notStock .item-tile-catalog{ opacity:.9; }

.wp-product-cross .tile-photo-wrap{ position:relative; border-radius:6px; overflow:hidden; background:#fff; }
.wp-product-cross .tile-slider-wrap{ display:block; position:relative; }
.wp-product-cross .tile-slider{ display:flex; }
.wp-product-cross .tile-sl-wrap{ flex:none; width:100%; }
.wp-product-cross .tile-photo{ display:flex; align-items:center; justify-content:center; height:225px; }
.wp-product-cross .tile-photo img{ max-width:100%; max-height:100%; object-fit:contain; display:block; }
.wp-product-cross .tile-slider-catalog-pagination{ display:flex; gap:4px; margin-top:8px; padding:0 2px; }
.wp-product-cross .tile-slider-catalog-pagination .tile-bullet{ flex:1; height:3px; border-radius:2px; background:var(--wp-border); }
.wp-product-cross .tile-slider-catalog-pagination .tile-bullet.is-active{ background:var(--wp-blue); }

.wp-product-cross .tile-stickers-wrap, .wp-catalog-page .tile-stickers-wrap{ position:absolute; top:8px; left:8px; z-index:2; display:flex; flex-direction:column; gap:4px; }
/* sticker badge — identical on .wp-catalog-page (same component, product tiles reused there) */
.wp-product-cross .tile-sticker, .wp-product-cross .elm-sticker,
.wp-catalog-page .tile-sticker, .wp-catalog-page .elm-sticker{
  display:flex; align-items:center; gap:4px; padding:3px 8px; border-radius:20px; font-size:var(--fs-11); font-weight:700; color:#fff;
}
.wp-product-cross .tile-sticker.bg-alert, .wp-catalog-page .tile-sticker.bg-alert{ background:#E4483E; }
.wp-product-cross .elm-sticker.bg-att, .wp-catalog-page .elm-sticker.bg-att{ background:var(--wp-blue); }
.wp-product-cross .tile-sticker img, .wp-product-cross .elm-sticker img,
.wp-catalog-page .tile-sticker img, .wp-catalog-page .elm-sticker img{ width:12px; height:12px; filter:brightness(0) invert(1); }
/* product tile component (actions/fav/title/price/buy-button) — duplicated near-verbatim
   between .wp-catalog-page and .wp-product-cross (same product.tpl tile markup on both).
   Consolidated below (tile-stickers-wrap/sticker badge already merged just above); the
   counter stepper (+/- buttons) that follows is NOT merged — it genuinely differs in
   size/behavior between the two contexts. */
.wp-catalog-page .tile-actions-wrap, .wp-product-cross .tile-actions-wrap{ position:absolute; top:8px; right:8px; z-index:2; display:flex; gap:6px; }
.wp-catalog-page .tile-button-fav, .wp-product-cross .tile-button-fav{
  width:30px; height:30px; border-radius:50%; background:#fff; display:flex; align-items:center; justify-content:center;
  box-shadow:0 2px 6px rgba(27,29,34,.15); cursor:pointer; position:relative;
  transition:transform .2s ease, box-shadow .2s ease;
}
.wp-catalog-page .tile-button-fav::before, .wp-product-cross .tile-button-fav::before{ content:"\2661"; font-size:var(--fs-15); color:var(--wp-text-muted); line-height:1; transition:color .2s ease, transform .2s ease; }
.wp-catalog-page .tile-button-fav:hover, .wp-product-cross .tile-button-fav:hover{ transform:scale(1.12); box-shadow:0 4px 10px rgba(27,29,34,.2); }
.wp-catalog-page .tile-button-fav:hover::before, .wp-product-cross .tile-button-fav:hover::before{ color:#E4483E; }
.wp-catalog-page .tile-button-fav.active::before, .wp-product-cross .tile-button-fav.active::before{ content:"\2665"; color:#E4483E; }
.wp-catalog-page .tile-button-fav.active:hover::before, .wp-product-cross .tile-button-fav.active:hover::before{ transform:scale(1.15); }
.wp-catalog-page .tile-actions-wrap a.tile-ico, .wp-product-cross .tile-actions-wrap a.tile-ico{
  width:30px; height:30px; border-radius:50%; background:#fff; display:flex; align-items:center; justify-content:center;
  box-shadow:0 2px 6px rgba(27,29,34,.15);
}

.wp-catalog-page .tile-info-row-wrap, .wp-product-cross .tile-info-row-wrap{ display:flex; align-items:center; justify-content:space-between; gap:8px; font-size:var(--fs-13); margin-bottom:8px; }
.wp-catalog-page .tile-art, .wp-product-cross .tile-art{ color:var(--wp-text-muted); font-weight:500; }
.wp-catalog-page .tile-stock, .wp-product-cross .tile-stock{ color:var(--wp-green); font-weight:600; white-space:nowrap; }
.wp-catalog-page .tile-stock.stock-wait, .wp-catalog-page .tile-stock.stock-out,
.wp-product-cross .tile-stock.stock-wait, .wp-product-cross .tile-stock.stock-out{ color:#C9750C; }
.wp-catalog-page .tooltip-content-box{ display:none; } /* consumed by tippy via innerHTML, portalled elsewhere */
/* .item-tile-product-tooltip card itself is styled globally near .tippy-box[data-theme] above —
   tippy portals it to <body>, so a .wp-catalog-page-scoped rule here would never match it. */

.wp-catalog-page .tile-title-wrap, .wp-product-cross .tile-title-wrap{ flex:1; }
.wp-catalog-page .tile-title, .wp-product-cross .tile-title{
  font-size:var(--fs-14); font-weight:600; line-height:1.45;
  display:-webkit-box; -webkit-box-orient:vertical; -webkit-line-clamp:2; overflow:hidden; min-height:calc(1.35em * 2);
}
.wp-catalog-page .tile-title a, .wp-product-cross .tile-title a{ color:var(--wp-ink); }
.wp-catalog-page .tile-title a:hover, .wp-product-cross .tile-title a:hover{ color:var(--wp-blue); }

.wp-catalog-page .wp-eta, .wp-product-cross .wp-eta{ display:flex; align-items:flex-start; gap:8px; background:var(--wp-bg-panel); border-radius:6px; padding:8px 10px; font-size:var(--fs-11); color:var(--wp-text-muted); margin:2px 0; }
.wp-catalog-page .wp-eta img, .wp-product-cross .wp-eta img{ width:16px; height:16px; flex:none; margin-top:1px; }
.wp-catalog-page .wp-eta__text b, .wp-product-cross .wp-eta__text b{ color:var(--wp-ink); }

.wp-catalog-page .tile-bottom-wrap, .wp-product-cross .tile-bottom-wrap{ margin-top:auto; }
/* .tile-price-wrap merged into the shared .wp-popular/.wp-product-cross/.wp-catalog-page group
   near the top of this file */
.wp-catalog-page .tile-price, .wp-product-cross .tile-price{ font-size:var(--fs-20); font-weight:800; color:var(--wp-ink); white-space:nowrap; }
.wp-catalog-page .tile-price-info, .wp-product-cross .tile-price-info{ font-size:var(--fs-13); color:var(--wp-text-muted); font-weight:500; white-space:nowrap; }
.wp-catalog-page .tile-price-info-wrap, .wp-product-cross .tile-price-info-wrap{ margin-bottom:4px; }
.wp-catalog-page .price-label, .wp-product-cross .price-label{ font-size:var(--fs-13); color:var(--wp-text-muted); font-weight:500; margin-bottom:2px; }
.wp-catalog-page .price-label b, .wp-product-cross .price-label b{ color:var(--wp-ink); font-weight:700; }

.wp-catalog-page .tile-action-wrap.buy-btn, .wp-product-cross .tile-action-wrap.buy-btn{ display:flex; align-items:center; gap:8px; margin-top:10px; }
.wp-catalog-page .tile-action-wrap .btn, .wp-product-cross .tile-action-wrap .btn{
  order:2; flex:1; min-width:0; height:42px; border-radius:var(--wp-radius);
  background:linear-gradient(180deg,var(--wp-blue-grad-top),var(--wp-blue-grad-bottom));
  color:#fff; font-size:var(--fs-13); font-weight:700; border:none; cursor:pointer; white-space:nowrap; overflow:hidden;
  text-overflow:ellipsis; padding:0 8px; transition:filter .25s ease;
}
.wp-catalog-page .tile-action-wrap .btn:hover, .wp-product-cross .tile-action-wrap .btn:hover{ filter:brightness(1.12) saturate(1.1); }
/* counter stepper (+/- buttons) below genuinely differs in size/hover behavior between the two
   pages — NOT merged, kept as separate .wp-catalog-page-only and .wp-product-cross-only rules. */
.wp-product-cross .frm-field-counter.js-counter {
order: 1;
display: flex;
align-items: center;
/* gap: 2px; */
border: 1px solid var(--wp-border);
border-radius: var(--wp-radius);
padding: 0 4px;
height: 42px;
flex: none;
box-sizing: border-box;
}
/* .wp-page-content .form-input{width:100%} (quote-form styling further down this file) has
   the same specificity as a bare ".wp-product-cross .js-input-counter" and comes later in
   the cascade, so it was winning and stretching this input to fill the card — the same
   fix as .wp-catalog-page's counter input: re-scope under .tile-action-wrap for higher
   specificity, and set height so the focus ring/box fills the 42px pill. */
.wp-product-cross .tile-action-wrap .js-input-counter {
order: 2;
border: none;
outline: none;
height: 100%;
box-sizing: border-box;
text-align: center;
font-size:var(--fs-13);
font-weight: 700;
color: var(--wp-ink);
width: 34px;
font-family: inherit;
background: none;
}
/* these buttons also carry the generic ".btn" class, which ".tile-action-wrap .btn" above
   (meant only for the "В корзину" button) also matches at equal specificity — its flex:1,
   min-width:0 and padding weren't redeclared here, so they leaked through and let each
   stepper button balloon to fill the pill, crushing the buy button. Redeclare them. */
.wp-product-cross .tile-action-wrap .js-button-counter-plus,
.wp-product-cross .tile-action-wrap .js-button-counter-minus{
  flex:none; min-width:auto; padding:0;
  width:24px; height:28px; border:none; background:none; color:var(--wp-text); font-weight:700; cursor:pointer; font-size:var(--fs-15);
}
.wp-product-cross .tile-action-wrap .js-button-counter-minus{ order:1; }
.wp-product-cross .tile-action-wrap .js-button-counter-plus{ order:3; }
.wp-product-cross .js-button-counter-plus::before{ content:"+"; }
.wp-product-cross .js-button-counter-minus::before{ content:"\2212"; }
.wp-product-cross .js-button-counter-plus.button-disabled, .wp-product-cross .js-button-counter-minus.button-disabled{ opacity:.35; cursor:not-allowed; }
.wp-product-cross .field-total{ display:none; }

/* ---------- product page responsive ---------- */
@media (max-width: 1100px){
  .wp-product-top{ grid-template-columns:1fr; }
  .wp-product .photos-inner-wrap{ width:100%; max-width:440px; margin:0 auto; }
  .wp-product [data-tab="tab01"] .box-inner-wrap{ grid-template-columns:1fr; gap:0; }
}
@media (max-width: 700px){
  .wp-product{ padding-left:16px; padding-right:16px; }
  .wp-product .breadcrumbs-box .menu{ font-size:var(--fs-12); }
  .wp-product .h1-title{ font-size:var(--fs-20); }
  .wp-product-price-panel{
    display:flex; flex-direction:column; align-items:stretch; row-gap:10px; padding:16px;
  }
  .wp-product .delivery-info-wrap{ grid-template-columns:1fr; }
  .wp-product .info-variants-box{ padding:16px; }
  .wp-product [data-tab] table{ font-size:var(--fs-13); }
  .wp-product .tabs-box .menu{ gap:18px; }
  .wp-row{ flex-wrap:wrap; }
  .wp-row__price{ margin-left:auto; }
  .wp-product-cross .slider-tiles .sl-wrap{ flex-basis:220px; width:220px; }
  /* at this width (minus 32px card padding) there isn't room for the stepper at its full
     desktop size next to the button — narrow the stepper (smaller input, tighter
     padding/gaps) instead of stacking them, so both stay on one row. */
  .wp-product-cross .frm-field-counter.js-counter{ order:1; padding:0 2px; gap:0; }
  .wp-product-cross .tile-action-wrap .js-input-counter{ width:22px; font-size:var(--fs-12); }
  .wp-product-cross .tile-action-wrap .js-button-counter-plus,
  .wp-product-cross .tile-action-wrap .js-button-counter-minus{ width:16px; }
  .wp-product-cross .tile-action-wrap .btn{ order:2; padding:0 4px; font-size:var(--fs-11); }
}

/* ==========================================================================
   CATALOG CATEGORY PAGE — modules/catalog/templates_2025/catalog.tpl
   (product list of a category: sidebar + breadcrumbs + subcategory tiles +
   filters + product grid + pagination + SEO text + FAQ). Scoped under
   .wp-catalog-page, which is added (together with .wp-root, for the base
   font/color reset and the generic "LEGACY CONTENT RE-SKIN" rules above) to
   catalog.tpl's own outer .content-outer-wrap — nothing else on the site is
   touched. Real markup/classes from menu_catalog.tpl (category tree),
   podbor_lady.tpl/podbor_reset.tpl/podbor_lady_checkbox.tpl (working
   characteristic filters), navigate.tpl (pagination) and
   getProduct.tpl/product.tpl (product card, incl. js-input-counter /
   js-btn-tgl / js-counter add-to-basket hooks used site-wide) are kept
   1:1 and only re-skinned by class — product.tpl especially is reused on
   14+ other pages, so its markup itself is never edited.
   ========================================================================== */

/* light gray page background around the catalog's white card (SPEC-exact.md §"Общий
   контейнер страницы"). Scoped via a real class on <body> (set server-side from
   $is_open_catalog in main.tpl) rather than :has(.wp-catalog-page) — :has() can only match
   once the browser has parsed that far-later descendant into the DOM, so body painted its
   default background first and visibly flashed to gray once the match caught up. A class
   present in <body>'s own opening tag has no such delay. */
body.is-catalog-page{ background:var(--wp-bg-soft); }
/* on mobile the gray page-edge shows through much more (tiles stack single-column with visible
   margins, instead of desktop's cards filling the width) — white requested there specifically;
   desktop keeps the gray. (is-catalog-page covers both the catalog grid and the product page —
   same class, see comment above.) */
@media (max-width:900px){
  body.is-catalog-page{ background:#fff; }
}
body.is-basket-page{ background:#fff; }
.wp-catalog-page{ padding-bottom:8px; }
/* grid, not flex — matches the ~/Сигма-ИС reference project's .content-with-sidebar. With
   flex + align-items:flex-start, a sticky sidebar's containing block is only as tall as the
   sidebar's OWN content (its flex line never stretches to match the content column), so it
   stops sticking and scrolls away as soon as you pass that height — long before you're done
   scrolling the (much taller) product grid. A grid row's track height is still driven by
   its tallest cell regardless of alignment, so align-self:start keeps the sidebar visually
   compact at the top while its containing block stays exactly as tall as .content-wrap,
   letting it stay stuck for the entire scroll. */
/* box model (max-width/padding/grid/background/shadow) lives on the shared
   .wp-content-shell class — see its definition near .wp-product. */
/* no flex "order" here — .side-wrap now comes first in the actual HTML (catalog.tpl), not
   just visually via CSS reordering. It used to be last in the source with order:1 pulling
   it left only visually, which meant on a slow connection the browser had streamed and
   painted the entire main content column before it ever reached the sidebar's markup —
   the sidebar would visibly pop in late/blank despite "belonging" at the top-left. */
.wp-catalog-page .content-wrap{ min-width:0; }
.wp-catalog-page .side-wrap{ min-width:0; }

/* ---------- breadcrumbs ---------- */
.wp-catalog-page .breadcrumbs-box{ margin-bottom:16px; }
.wp-catalog-page .breadcrumbs-box .menu{
  display:flex; flex-wrap:wrap; align-items:center; gap:8px; list-style:none; margin:0; padding:0;
  font-size:var(--fs-13); color:var(--wp-text-muted);
}
.wp-catalog-page .breadcrumbs-box li{ display:flex; align-items:center; gap:8px; }
.wp-catalog-page .breadcrumbs-box li:not(:last-child)::after{ content:"\203A"; color:var(--wp-border-hover); }
.wp-catalog-page .breadcrumbs-box a{ color:var(--wp-text-muted); font-weight:500; transition:color .2s ease; }
.wp-catalog-page .breadcrumbs-box a:hover{ color:var(--wp-blue); }
.wp-catalog-page .breadcrumbs-box li:last-child{ color:var(--wp-ink); font-weight:600; }

/* ---------- page header ---------- */
.wp-catalog-page .title-box.mb-small{ margin-bottom:20px; }
.wp-basket .title-box.mb-small{ margin-bottom:12px; }
.wp-catalog-page .title-wrap, .wp-basket .title-wrap{ display:flex; align-items:baseline; gap:14px; flex-wrap:wrap; }
.wp-catalog-page .title-wrap .h1-title, .wp-basket .title-wrap .h1-title{ margin:0; }
.wp-catalog-page .section-counter, .wp-basket .section-counter{ font-size:var(--fs-14); font-weight:600; color:var(--wp-text-muted); }

/* ---------- subcategory pill row (child_categoryes) — same pill look as .tags-box
   .button-tag below, so subcategory navigation and characteristic filters read as one
   consistent pattern; icon/count dropped for a single-line pill matching the mockup. */
.wp-catalog-page .tiles-categories-box{ margin-bottom:20px; }
.wp-catalog-page .tiles-categories-box .main-catalog-wrap{ display:flex; flex-wrap:wrap; gap:10px; }
.wp-catalog-page .tiles-categories-box .main-catalog-item{
  display:flex; align-items:center; height:38px; padding:0 18px; border:1px solid var(--wp-border);
  border-radius:var(--wp-radius); text-decoration:none; color:var(--wp-ink); font-size:var(--fs-14); font-weight:600;
  transition:background-color .25s ease,border-color .25s ease,box-shadow .25s ease,color .25s ease;
}
.wp-catalog-page .tiles-categories-box .main-catalog-item:hover{
  background:var(--wp-bg-panel); border-color:var(--wp-border-hover); box-shadow:var(--wp-shadow-card); color:var(--wp-blue);
}
.wp-catalog-page .tiles-categories-box .main-catalog-icon{ display:none; }
.wp-catalog-page .tiles-categories-box .child-catalog-title{ font-size:inherit; font-weight:inherit; color:inherit; line-height:1.25; }
.wp-catalog-page .tiles-categories-box .main-catalog-quantity{ display:none; }

/* ---------- filters: mobile trigger row (podbor_lady.tpl) ---------- */
.wp-catalog-page .filter-action-box{ display:none; gap:10px; margin-bottom:16px; }
.wp-catalog-page .filter-action-box .btn{
  display:flex; align-items:center; gap:8px; height:40px; padding:0 16px; border:1px solid var(--wp-border);
  border-radius:var(--wp-radius); background:#fff; color:var(--wp-ink); font-size:var(--fs-13); font-weight:700; cursor:pointer;
}
.wp-catalog-page .filter-action-box .button-ico img{ width:16px; height:16px; }

/* selected filter chips (podbor_reset.tpl — shown when filters are applied) */
.wp-catalog-page .filter-box .filter-actions-wrap{
  display:flex; align-items:center; flex-wrap:wrap; gap:14px; background:var(--wp-bg-panel);
  border-radius:var(--wp-radius); padding:12px 16px; margin-bottom:20px;
}
.wp-catalog-page .filter-selected-wrap{ display:flex; flex-wrap:wrap; gap:8px; flex:1; }
.wp-catalog-page .button-selected{
  display:flex; align-items:center; gap:8px; height:32px; padding:0 6px 0 12px; border-radius:20px;
  background:#fff; border:1px solid var(--wp-border); font-size:var(--fs-13); font-weight:600; color:var(--wp-ink);
}
.wp-catalog-page .button-selected .button-value{ color:var(--wp-blue); }
.wp-catalog-page .button-selected .ico-clear{
  width:20px; height:20px; border-radius:50%; position:relative; color:var(--wp-text-muted); cursor:pointer;
}
.wp-catalog-page .button-selected .ico-clear::before, .wp-catalog-page .button-selected .ico-clear::after{
  content:""; position:absolute; width:10px; height:2px; background:currentColor; top:50%; left:50%;
}
.wp-catalog-page .button-selected .ico-clear::before{ transform:translate(-50%,-50%) rotate(45deg); }
.wp-catalog-page .button-selected .ico-clear::after{ transform:translate(-50%,-50%) rotate(-45deg); }
.wp-catalog-page .button-selected .ico-clear:hover{ background:var(--wp-bg-panel); color:var(--wp-ink); }
.wp-catalog-page .filter-reset-wrap .button-link{
  display:flex; align-items:center; gap:6px; background:none; border:none; color:var(--wp-blue);
  font-size:var(--fs-13); font-weight:700; cursor:pointer; white-space:nowrap;
}
.wp-catalog-page .filter-reset-wrap .button-link:hover{ color:var(--wp-blue-dark); }
.wp-catalog-page .filter-reset-wrap .button-ico img{ width:12px; height:12px; }

/* real characteristic filter panel (podbor_lady.tpl + podbor_lady_checkbox.tpl) */
.wp-catalog-page .filter-box.popup-mobile-box{ margin-bottom:20px; }
.wp-catalog-page .filter-content-wrap{
  display:flex; flex-wrap:wrap; align-items:center; gap:12px; background:var(--wp-bg-panel);
  border-radius:var(--wp-radius); padding:14px 16px;
}
.wp-catalog-page .filter-label{ font-size:var(--fs-14); font-weight:700; color:var(--wp-ink); flex:none; }
.wp-catalog-page .filter-section-wrap{ position:relative; }
.wp-catalog-page .btn-filter-toggle{
  display:flex; align-items:center; gap:10px; height:38px; padding:0 16px; border:1px solid var(--wp-border);
  border-radius:var(--wp-radius); background:#fff; color:var(--wp-ink); font-size:var(--fs-14); font-weight:600; cursor:pointer;
  transition:border-color .2s ease,color .2s ease,box-shadow .2s ease;
}
.wp-catalog-page .btn-filter-toggle__chevron{ flex:none; transition:transform .25s ease; }
.wp-catalog-page .btn-filter-toggle:hover{ border-color:var(--wp-border-hover); color:var(--wp-blue); box-shadow:var(--wp-shadow-card); }
.wp-catalog-page .btn-filter-toggle.active{ border-color:var(--wp-blue); color:var(--wp-blue); }
.wp-catalog-page .btn-filter-toggle.active .btn-filter-toggle__chevron{ transform:rotate(180deg); }
.wp-catalog-page .select-content-block.js-popup-block{
  display:none; position:absolute; top:calc(100% + 8px); left:0; width:320px; max-width:calc(100vw - 64px); max-height:360px;
  /* overflow-x must be set explicitly alongside overflow-y — per the CSS overflow spec, leaving
     one axis at its 'visible' default while the other is 'auto' makes the browser silently
     compute the 'visible' one as 'auto' too. That accidental horizontal auto-scroll is what was
     clipping the dense 5/6-column size grids below: content too wide for the 320/480/560px box
     scrolled inside a scrollbar nobody could see, instead of just fitting (fixed together with
     the .frm-select min-width:0 grid-shrink fix further down — that's what was making the grid
     wider than the box in the first place). */
  overflow-y:auto; overflow-x:hidden; background:#fff; border:1px solid var(--wp-border); border-radius:var(--wp-radius-lg);
  box-shadow:0 14px 28px rgba(27,29,34,.14); padding:16px; z-index:30; box-sizing:border-box;
}
.wp-catalog-page .select-content-block.js-popup-block.active{ display:block; }
/* left:0 anchors the panel to its toggle button, not the viewport — fine for narrow panels,
   but the 560px/480px dense grids below (.select-content-wrap-6/-5, e.g. "Размер, см") can
   then run past the right edge of the browser window on the desktop widths where this panel
   is used (900–1360px). html/body use overflow-x:clip site-wide, so that overflow is silently
   cut off with no scrollbar to reveal it — looks like "part of the filter doesn't fit".
   initCatalogFilterToggle (main2026.js) adds this class on open when the left-aligned
   position would overflow, flipping the panel to hang from the button's right edge instead. */
.wp-catalog-page .select-content-block.js-popup-block.align-right{ left:auto; right:0; }
/* redundant on desktop too — clicking the toggle button again, or clicking outside the
   dropdown, already closes it (initCatalogFilterToggle in main2026.js). */
.wp-catalog-page .select-content-block .js-btn-popup-close{ display:none; }
/* default: single-column checkbox list ("Подкатегория"-style groups) */
.wp-catalog-page .select-content-wrap{ display:flex; flex-direction:column; gap:11px; margin-bottom:16px; }
.wp-catalog-page .frm-select{ display:flex; align-items:center; gap:9px; cursor:pointer; }
.wp-catalog-page .frm-select input[type=checkbox]{ width:16px; height:16px; accent-color:var(--wp-blue); cursor:pointer; flex:none; }
.wp-catalog-page .frm-select label{ font-size:var(--fs-14); color:var(--wp-text); cursor:pointer; white-space:nowrap; }
/* dense size-style groups (data-driven — see $id checks in podbor_lady_checkbox.tpl) use a
   6- or 5-column checkbox grid instead of the default single-column list */
.wp-catalog-page .select-content-block.select-content-wrap-6{ width:560px; }
.wp-catalog-page .select-content-block.select-content-wrap-5{ width:480px; }
.wp-catalog-page .select-content-block.select-content-wrap-6 .select-content-wrap{ display:grid; grid-template-columns:repeat(6,1fr); gap:8px 16px; }
.wp-catalog-page .select-content-block.select-content-wrap-5 .select-content-wrap{ display:grid; grid-template-columns:repeat(5,1fr); gap:8px 16px; }
/* min-width:0 is load-bearing: a grid item's automatic minimum size defaults to its content's
   max-content width (ignoring the label's own overflow:hidden/ellipsis below) unless the item
   itself opts out via min-width:0 or overflow!=visible — without this, a single long label
   (e.g. "14x9.5x30.5") forces its whole column wider than an equal 1fr share, pushing the grid
   past the panel's fixed 480/560px width instead of letting the label ellipsis as intended. */
.wp-catalog-page .select-content-block.select-content-wrap-6 .frm-select,
.wp-catalog-page .select-content-block.select-content-wrap-5 .frm-select{ gap:6px; padding:2px 0; min-width:0; }
.wp-catalog-page .select-content-block.select-content-wrap-6 .frm-select input[type=checkbox],
.wp-catalog-page .select-content-block.select-content-wrap-5 .frm-select input[type=checkbox]{ width:17px; height:17px; border-radius:4px; }
.wp-catalog-page .select-content-block.select-content-wrap-6 .frm-select label,
.wp-catalog-page .select-content-block.select-content-wrap-5 .frm-select label{ overflow:hidden; text-overflow:ellipsis; }

/* Применить / Сбросить action row — geometry differs for the dense grid panels (narrower,
   34px-tall "Применить") vs the default list panels (full-width, 38px). */
.wp-catalog-page .select-actions-row{ display:flex; align-items:center; gap:16px; }
.wp-catalog-page .btn-filter-apply{
  flex:1; display:flex; align-items:center; justify-content:center; height:38px; border-radius:var(--wp-radius);
  background:linear-gradient(180deg,var(--wp-blue-grad-top),var(--wp-blue-grad-bottom)); color:#fff;
  font-size:var(--fs-13); font-weight:700; border:none; cursor:pointer; transition:filter .45s ease;
}
.wp-catalog-page .btn-filter-apply:hover{ filter:brightness(1.12) saturate(1.1); }
.wp-catalog-page .btn-filter-reset{
  background:none; border:none; padding:0; font-size:var(--fs-13); font-weight:600; color:var(--wp-blue);
  white-space:nowrap; cursor:pointer; transition:color .25s ease;
}
.wp-catalog-page .btn-filter-reset:hover{ color:var(--wp-blue-dark); }
.wp-catalog-page .select-content-block.select-content-wrap-6 .btn-filter-apply,
.wp-catalog-page .select-content-block.select-content-wrap-5 .btn-filter-apply{ flex:none; height:34px; padding:0 20px; }
.wp-catalog-page .select-content-block .btn-popup-close{
  position:absolute; top:10px; right:10px; width:24px; height:24px; border-radius:50%; border:none;
  background:var(--wp-bg-panel); cursor:pointer;
}
.wp-catalog-page .select-content-block .btn-popup-close::before, .wp-catalog-page .select-content-block .btn-popup-close::after{
  content:""; position:absolute; width:12px; height:2px; background:var(--wp-text); top:50%; left:50%;
}
.wp-catalog-page .select-content-block .btn-popup-close::before{ transform:translate(-50%,-50%) rotate(45deg); }
.wp-catalog-page .select-content-block .btn-popup-close::after{ transform:translate(-50%,-50%) rotate(-45deg); }

/* tag-pill filters shown lower on the page (podbor_char_lady.tpl) */
.wp-catalog-page .tags-box{ margin:28px 0; }
.wp-catalog-page .tags-box .tile-title.h3-title{ font-size:var(--fs-16); font-weight:700; color:var(--wp-ink); margin:0 0 10px; }
.wp-catalog-page .tags-box ul.menu{ display:flex; flex-wrap:wrap; gap:8px; list-style:none; margin:0 0 20px; padding:0; }
.wp-catalog-page .tags-box .btn.button-tag{
  display:flex; align-items:center; height:36px; padding:0 16px; border:1px solid var(--wp-border);
  border-radius:var(--wp-radius); color:var(--wp-ink); font-size:var(--fs-13); font-weight:600; text-decoration:none;
  transition:background-color .2s ease,border-color .2s ease,box-shadow .2s ease,color .2s ease;
}
.wp-catalog-page .tags-box .btn.button-tag:hover{ background:var(--wp-bg-panel); border-color:var(--wp-border-hover); box-shadow:var(--wp-shadow-card); color:var(--wp-blue); }
.wp-catalog-page .tags-box .btn.button-tag.active{ background:var(--wp-blue); border-color:var(--wp-blue); color:#fff; }

/* ---------- product grid (getProduct.tpl / product.tpl) ---------- */
.wp-catalog-page .tiles-catalog-box .items-wrap{ display:grid; grid-template-columns:repeat(4,minmax(0,1fr)); gap:16px; }
.wp-catalog-page .item-wrap{ min-width:0; }
/* matched to .wp-popular's card (the homepage "Популярные товары" section) — that's the
   reference design; this page's card had drifted from it (different padding/gap/photo
   height/background/hover) since the two were styled in separate passes. */
.wp-catalog-page .item-tile-catalog{
  position:relative; height:100%; display:flex; flex-direction:column; gap:8px; background:#fff;
  border:1px solid var(--wp-border); border-radius:var(--wp-radius); padding:16px;
  transition:box-shadow .25s ease,border-color .25s ease;
}
.wp-catalog-page .item-tile-catalog:hover{ box-shadow:var(--wp-shadow-card); border-color:var(--wp-border-hover); }
.wp-catalog-page .item-wrap.notStock .item-tile-catalog{ opacity:.9; }

.wp-catalog-page .tile-photo-wrap{ position:relative; border-radius:6px; overflow:hidden; background:#fff; }
.wp-catalog-page .tile-slider-wrap{ display:block; position:relative; }
.wp-catalog-page .tile-slider{ display:flex; }
.wp-catalog-page .tile-sl-wrap{ flex:none; width:100%; }
.wp-catalog-page .tile-photo{ display:flex; align-items:center; justify-content:center; height:225px; }
.wp-catalog-page .tile-photo img{ max-width:100%; max-height:100%; object-fit:contain; display:block; }
.wp-catalog-page .tile-slider-catalog-pagination{ display:flex; gap:4px; margin-top:8px; padding:0 2px; }
.wp-catalog-page .tile-slider-catalog-pagination .tile-bullet{ flex:1; height:3px; border-radius:2px; background:var(--wp-border); }
.wp-catalog-page .tile-slider-catalog-pagination .tile-bullet.is-active{ background:var(--wp-blue); }

/* product tile component (actions/fav/title/price/buy-button) merged into the shared
   .wp-catalog-page/.wp-product-cross group near the .wp-product-cross section (top of this
   file, right after the sticker badge merge). Counter stepper (+/- buttons) below is kept
   separate — it genuinely differs in size/behavior between the two contexts. */
.wp-catalog-page .frm-field-counter.js-counter{
  order:1; display:flex; align-items:center; gap:0; border:1px solid var(--wp-border); border-radius:var(--wp-radius);
  padding:0; height:42px; flex:none; box-sizing:border-box;
}
/* height:100% + outline:none — the outer pill is a fixed 42px, but the input itself had no
   height set (just its natural, shorter line-height-based size), so focusing it showed the
   browser's default blue focus ring around that smaller box instead of filling the pill. */
.wp-catalog-page .js-input-counter {
order: 2;
border: none;
outline: none;
height: 100%;
box-sizing: border-box;
text-align: center;
font-size:var(--fs-13);
font-weight: 700;
color: var(--wp-ink);
width: 32px;
font-family: inherit;
background: none;
}
.wp-catalog-page .js-input-counter:focus{ outline:none; box-shadow:none; }
/* both counter buttons also carry the generic ".btn" class, which ".tile-action-wrap .btn"
   above (meant only for the "В корзину" button) matches too — 3 classes of specificity
   there beats these plain ".js-button-counter-*" rules (2 classes), so it was winning and
   painting the stepper buttons with the cart button's blue gradient/height/order. Re-scope
   under ".tile-action-wrap" too so these clearly out-specificity it instead. */
.wp-catalog-page .tile-action-wrap .js-button-counter-plus,
.wp-catalog-page .tile-action-wrap .js-button-counter-minus{
  width:26px; height:40px; padding:0; border:none; background:none; color:var(--wp-text); font-weight:700; cursor:pointer; font-size:var(--fs-15);
  border-radius:var(--wp-radius); box-sizing:border-box; transition:background-color .2s ease, color .2s ease;
}
/* same hover highlight as the product page's stepper (.wp-product .frm-field-counter .button-plus/minus:hover).
   !important on background only: these buttons also carry the plain ".btn" class, which
   ".wp-catalog-page .tile-action-wrap .btn" (meant for the "В корзину" button) sets a blue
   gradient background on — same-specificity fight as the color/order rules above, but for
   background specifically it was apparently still winning, so force it here rather than keep
   chasing the exact cascade order blind. */
.wp-catalog-page .tile-action-wrap .js-button-counter-plus:hover,
.wp-catalog-page .tile-action-wrap .js-button-counter-minus:hover{
  /* confirmed visible on a small 26x36px button — the light near-white grays
     (--wp-bg-panel, --wp-bg-soft) are not, so don't swap this out again. */
  background:rgba(46,127,203,.12) !important; color:var(--wp-blue);
}
.wp-catalog-page .tile-action-wrap .js-button-counter-minus{ order:1; border-radius:var(--wp-radius) 0 0 var(--wp-radius); }
.wp-catalog-page .tile-action-wrap .js-button-counter-plus{ order:3; border-radius:0 var(--wp-radius) var(--wp-radius) 0; }
.wp-catalog-page .js-button-counter-plus::before{ content:"+"; }
.wp-catalog-page .js-button-counter-minus::before{ content:"\2212"; }
.wp-catalog-page .js-button-counter-plus.button-disabled, .wp-catalog-page .js-button-counter-minus.button-disabled{ opacity:.35; cursor:not-allowed; }
.wp-catalog-page .field-total{ display:none; } /* matches .wp-popular — compact card, no live total next to the stepper */

/* ---------- pagination (navigate.tpl) ---------- */
.wp-catalog-page .pagenav-box{ display:flex; align-items:center; justify-content:center; gap:8px; margin-top:40px; flex-wrap:wrap; }
.wp-catalog-page .btn-page-nav{
  width:36px; height:36px; border-radius:var(--wp-radius); display:flex; align-items:center; justify-content:center;
  color:var(--wp-text-muted); cursor:pointer; transition:background-color .2s ease; position:relative; text-decoration:none;
}
.wp-catalog-page .btn-page-nav:hover{ background:var(--wp-bg-panel); }
.wp-catalog-page .btn-page-nav::before{ content:""; width:8px; height:8px; border-right:2px solid currentColor; border-bottom:2px solid currentColor; }
.wp-catalog-page .button-nav-prev::before{ transform:rotate(135deg); margin-left:3px; }
.wp-catalog-page .button-nav-next::before{ transform:rotate(-45deg); margin-right:3px; }
.wp-catalog-page .btn-page-nav.button-disabled{ opacity:.3; pointer-events:none; }
.wp-catalog-page .pages-wrap{ display:flex; align-items:center; gap:6px; flex-wrap:wrap; justify-content:center; max-width:640px; }
.wp-catalog-page .btn-page{
  width:36px; height:36px; border-radius:var(--wp-radius); display:flex; align-items:center; justify-content:center;
  color:var(--wp-ink); font-weight:600; font-size:var(--fs-14); cursor:pointer; transition:background-color .2s ease; text-decoration:none;
}
.wp-catalog-page .btn-page:hover{ background:var(--wp-bg-panel); }
.wp-catalog-page .btn-page.active{ background:var(--wp-blue); color:#fff; font-weight:700; }
.wp-catalog-page .show-more{ display:flex; justify-content:center; margin-top:20px; }
.wp-catalog-page .show-more.hide{ display:none; }
.wp-catalog-page .show-more .btn.button-link{
  display:flex; align-items:center; justify-content:center; gap:8px; height:44px; padding:0 28px; border:1px solid var(--wp-border);
  border-radius:var(--wp-radius); color:var(--wp-ink); font-size:var(--fs-14); font-weight:700; cursor:pointer; background:none;
  transition:background-color .2s ease,border-color .2s ease,box-shadow .2s ease,color .2s ease;
}
.wp-catalog-page .show-more .btn.button-link:hover{ background:var(--wp-bg-panel); border-color:var(--wp-border-hover); box-shadow:var(--wp-shadow-card); color:var(--wp-blue); }

/* ---------- "order custom production" CTA banner ---------- */
.wp-catalog-page .action-inner-box{ margin:32px 0; border-radius:var(--wp-radius-lg); overflow:hidden; position:relative; background:var(--wp-dark); }
.wp-catalog-page .action-inner-box .box-inner-wrap{ position:relative; display:flex; align-items:center; min-height:160px; }
.wp-catalog-page .action-inner-box .photo-bg{ position:absolute; inset:0; z-index:0; }
.wp-catalog-page .action-inner-box .photo-bg img{ width:100%; height:100%; object-fit:cover; display:block; opacity:.55; }
.wp-catalog-page .action-inner-box .info-inner-wrap{ position:relative; z-index:1; padding:32px; color:#fff; max-width:460px; }
.wp-catalog-page .action-inner-box .section-title{ font-size:var(--fs-22); font-weight:700; margin:0 0 8px; color:#fff; }
.wp-catalog-page .action-inner-box p{ margin:0 0 16px; font-size:var(--fs-14); color:rgba(255,255,255,.85); }
.wp-catalog-page .action-inner-box .btn{
  display:inline-flex; align-items:center; height:44px; padding:0 24px; border-radius:var(--wp-radius);
  background:#fff; color:var(--wp-ink); font-size:var(--fs-14); font-weight:700;
}
.wp-catalog-page .action-inner-box .btn:hover{ background:var(--wp-bg-panel); color:var(--wp-ink); }

/* "Упаковка на заказ" SEO text block (catalog_page_category.tpl, /catalog/?tab=custom) — sat
   directly on body.is-catalog-page's gray background with no card of its own. */
.wp-catalog__custom-text{ background:#fff; border-radius:var(--wp-radius-lg); padding:32px; }
@media (max-width:600px){
  .wp-catalog__custom-text{ padding:24px 16px; }
}

/* ---------- SEO text + FAQ ---------- */
.wp-catalog-page .article-box{ max-width:900px; margin-top:8px; }
.wp-catalog-page .wp-faq{ margin-top:16px; }
.wp-catalog-page .wp-faq__grid{ display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:16px; }
.wp-catalog-page .wp-faq__card{ background:#fff; border:1px solid var(--wp-border); border-radius:var(--wp-radius); padding:20px; }
.wp-catalog-page .wp-faq__badge{ display:inline-flex; align-items:center; height:22px; padding:0 10px; border-radius:20px; font-size:var(--fs-11); font-weight:700; margin-bottom:10px; color:#fff; }
.wp-catalog-page .wp-faq__badge--product{ background:var(--wp-blue); }
.wp-catalog-page .wp-faq__badge--usage{ background:var(--wp-green); }
.wp-catalog-page .wp-faq__badge--top{ background:#C9750C; }
.wp-catalog-page .wp-faq__badge--order{ background:#7B5CC9; }
.wp-catalog-page .wp-faq__question{ font-size:var(--fs-15); font-weight:700; color:var(--wp-ink); margin:0 0 8px; }
.wp-catalog-page .wp-faq__answer{ font-size:var(--fs-14); line-height:1.6; color:var(--wp-text); margin:0; }

/* ---------- sidebar: category tree (menu_catalog.tpl) ---------- */
/* .side-menu-box/.filter-box both carry ".popup-mobile-box", which the global rule above
   (".wrap .popup-mobile-box{display:none}") now hides everywhere by default — correct for
   product/other pages, but on the catalog page itself these two ARE the permanent desktop
   sidebar/filter bar (nested directly inside .wp-catalog-page, not the off-canvas popup used
   elsewhere), so re-show them here. The @media(max-width:900px) block further down still
   turns both back into the real hidden off-canvas popups on mobile. */
/* .wp-catalog-page.content-outer-wrap (2 classes on one element) + .popup-mobile-box = 3
   classes of specificity — reliably beats ".wrap .popup-mobile-box{display:none}" (2
   classes) regardless of source order, instead of relying on both being equal-specificity
   and this one merely appearing later in the file. */
.wp-catalog-page.content-outer-wrap .popup-mobile-box{
  display:block; position:static; inset:auto; z-index:auto; background:transparent; overflow-y:visible;
}
/* this selector's 3-class specificity would otherwise also beat .side-menu-box's own
   "padding:0 8px" below (product page's equivalent rule is only 2 classes, so there
   .side-menu-box wins on source order alone) — dropping padding here lets that one rule
   be the single source of truth for both pages again, matching product's actual result. */
.wp-catalog-page .side-wrap{ position:sticky; top:130px; align-self:start; }
/* values below are lifted 1:1 from the design source (.dc.html canvas export) rather than
   eyeballed — borderless, flush against the page, no card box. */
.wp-catalog-page .side-menu-box{ background:#fff; border:none; border-radius:0; }
.wp-catalog-page .side-menu-box .popup-title-wrap,
.wp-catalog-page .filter-box.popup-mobile-box > .popup-title-wrap{ display:none; }
.wp-catalog-page #category-head.btn-menu{
  display:block; padding:0 0 10px; margin-bottom:14px; border-bottom:1px solid var(--wp-border);
}
.wp-catalog-page #category-head .button-ico{ display:none; }
.wp-catalog-page #category-head .button-title{ font-size:var(--fs-14); font-weight:700; letter-spacing:2px; text-transform:uppercase; color:var(--wp-text-muted); }

/* Sidebar category tree (menu_catalog.tpl) + price-list dropdown + calculator button — this
   whole component was duplicated near-verbatim between .wp-catalog-page and .wp-product (same
   sidebar markup on both pages). Consolidated into grouped selectors below; .wp-product's own
   copy of this block (further down this file) now just points back here. */
.wp-catalog-page .menu-inner-wrap ul.menu, .wp-product .menu-inner-wrap ul.menu{ list-style:none; margin:0; padding:0; }
.wp-catalog-page .menu-inner-wrap ul.menu.menu-main, .wp-product .menu-inner-wrap ul.menu.menu-main{ display:flex; flex-direction:column; }
.wp-catalog-page .menu-inner-wrap ul.menu.menu-main > li > a.btn-menu, .wp-product .menu-inner-wrap ul.menu.menu-main > li > a.btn-menu{
  display:flex; align-items:center; justify-content:space-between; gap:8px;
  padding:7px 8px 7px 0; font-size:var(--fs-14); font-weight:600; color:var(--wp-text);
  text-decoration:none; transition:color .25s ease;
}
.wp-catalog-page .menu-inner-wrap ul.menu.menu-main > li > a.btn-menu:hover,
.wp-product .menu-inner-wrap ul.menu.menu-main > li > a.btn-menu:hover{ color:var(--wp-blue); }
.wp-catalog-page .menu-inner-wrap ul.menu.menu-main > li > a.btn-menu.active,
.wp-catalog-page .menu-inner-wrap ul.menu.menu-main > li > a.btn-menu.active-parent,
.wp-catalog-page .menu-inner-wrap li.open > a.btn-menu,
.wp-product .menu-inner-wrap ul.menu.menu-main > li > a.btn-menu.active,
.wp-product .menu-inner-wrap ul.menu.menu-main > li > a.btn-menu.active-parent,
.wp-product .menu-inner-wrap li.open > a.btn-menu{ color:var(--wp-blue); font-weight:700; }
/* active/expanded top-level category gets 3px more bottom padding (7/10 vs the default 7/7) */
.wp-catalog-page .menu-inner-wrap ul.menu.menu-main > li > a.btn-menu.active,
.wp-product .menu-inner-wrap ul.menu.menu-main > li > a.btn-menu.active{ padding-bottom:10px; }
/* expand/collapse chevron for any category that has children ("child" class from
   menu_catalog.tpl) — rotates 90° when its <li> carries .open */
.wp-catalog-page .menu-inner-wrap .btn-menu.child::after, .wp-product .menu-inner-wrap .btn-menu.child::after{
  content:"›"; display:inline-flex; flex:none; font-size:var(--fs-16); line-height:1; color:inherit;
  transition:transform .25s ease;
}
.wp-catalog-page .menu-inner-wrap li.open > .btn-menu.child::after,
.wp-product .menu-inner-wrap li.open > .btn-menu.child::after{ transform:rotate(90deg); }
.wp-catalog-page .menu-inner-wrap li ul.menu, .wp-product .menu-inner-wrap li ul.menu{ padding-left:15px; margin:0; display:flex; flex-direction:column; }
.wp-catalog-page .menu-inner-wrap li ul.menu a.btn-menu, .wp-product .menu-inner-wrap li ul.menu a.btn-menu{
  display:block; padding:7px 8px 10px 0; font-size:var(--fs-14); font-weight:600; color:var(--wp-text);
  text-decoration:none; transition:color .25s ease;
}
/* deepest level (leaves with no further children of their own) go back to symmetric 7/7 */
.wp-catalog-page .menu-inner-wrap li ul.menu li ul.menu li ul.menu a.btn-menu,
.wp-product .menu-inner-wrap li ul.menu li ul.menu li ul.menu a.btn-menu{ padding-bottom:7px; }
.wp-catalog-page .menu-inner-wrap li ul.menu a.btn-menu:hover,
.wp-product .menu-inner-wrap li ul.menu a.btn-menu:hover{ color:var(--wp-blue); }
.wp-catalog-page .menu-inner-wrap li ul.menu a.btn-menu.active,
.wp-catalog-page .menu-inner-wrap li ul.menu a.btn-menu.active-parent,
.wp-product .menu-inner-wrap li ul.menu a.btn-menu.active,
.wp-product .menu-inner-wrap li ul.menu a.btn-menu.active-parent{ color:var(--wp-blue); font-weight:700; }
/* nested items that themselves have children (e.g. "БОПП пакеты") behave like top-level
   ones — chevron + plain color change. */
.wp-catalog-page .menu-inner-wrap li ul.menu a.btn-menu.child, .wp-product .menu-inner-wrap li ul.menu a.btn-menu.child{
  display:flex; align-items:center; justify-content:space-between; gap:8px;
}

/* Left accent bar — nested levels (2+) only, never on top-level categories. One row tall
   (not the whole branch), always flush at the sidebar's own left edge (x=0) no matter how
   deep the row is nested. Each row's <a> gets its own ::before, positioned relative to
   that row's own box; the more ancestor <ul class="menu"> wrappers it sits inside (each
   adds 20px of padding-left), the further left (negative) the bar has to sit to land back
   at x=0. */
.wp-catalog-page .menu-inner-wrap li ul.menu a.btn-menu, .wp-product .menu-inner-wrap li ul.menu a.btn-menu{ position:relative; }
.wp-catalog-page .menu-inner-wrap li ul.menu a.btn-menu::before, .wp-product .menu-inner-wrap li ul.menu a.btn-menu::before{
  content:""; position:absolute; top:0; bottom:0; left:0; width:3px; background:transparent;
  transition:background-color .25s ease;
}
.wp-catalog-page .menu-inner-wrap li ul.menu a.btn-menu:hover::before,
.wp-catalog-page .menu-inner-wrap li ul.menu a.btn-menu.active::before,
.wp-product .menu-inner-wrap li ul.menu a.btn-menu:hover::before,
.wp-product .menu-inner-wrap li ul.menu a.btn-menu.active::before{ background:var(--wp-blue); }
.wp-catalog-page .menu-inner-wrap li ul.menu a.btn-menu::before, .wp-product .menu-inner-wrap li ul.menu a.btn-menu::before{ left:-15px; }
.wp-catalog-page .menu-inner-wrap li ul.menu li ul.menu a.btn-menu::before,
.wp-product .menu-inner-wrap li ul.menu li ul.menu a.btn-menu::before{ left:-30px; }
.wp-catalog-page .menu-inner-wrap li ul.menu li ul.menu li ul.menu a.btn-menu::before,
.wp-product .menu-inner-wrap li ul.menu li ul.menu li ul.menu a.btn-menu::before{ left:-45px; }

/* price-list dropdown + packaging calculator button */
.wp-catalog-page .action-inner-wrap, .wp-product .action-inner-wrap{ margin-top:20px; display:flex; flex-direction:column; gap:10px; }
.wp-catalog-page .frm-field-select.js-popup-select, .wp-product .frm-field-select.js-popup-select{ position:relative; }
/* Материал/Размер/Толщина filter dropdowns (.js-popup-wrap, not .js-popup-select) need the same
   anchor — without it their .select-content-block (position:absolute) positions against
   whatever ancestor happens to be positioned instead of sitting under its own toggle button.
   Catalog-page only — the product page's own action-inner-wrap has no such filter dropdowns. */
.wp-catalog-page .frm-field-select.js-popup-wrap{ position:relative; }
.wp-catalog-page .btn-popup.button-white, .wp-product .btn-popup.button-white{
  display:flex; align-items:center; justify-content:center; gap:8px; width:100%; min-height:44px; padding:10px 14px; border-radius:6px;
  border:none; background:linear-gradient(180deg,var(--wp-blue-grad-top),var(--wp-blue-grad-bottom)); color:#fff;
  font-size:var(--fs-14); font-weight:700; cursor:pointer; box-shadow:0 4px 12px -2px rgba(0,119,191,.4); transition:filter .35s ease;
  box-sizing:border-box;
}
.wp-catalog-page .btn-popup.button-white:hover, .wp-product .btn-popup.button-white:hover{ filter:brightness(1.12) saturate(1.1); }
/* the 270px sidebar column can be too narrow for this icon+"Скачать прайс-лист" label at
   nowrap — it used to just overflow past the button's edge instead of wrapping. */
.wp-catalog-page .btn-popup.button-white .button-title, .wp-product .btn-popup.button-white .button-title{ white-space:normal; text-align:center; line-height:1.3; }
.wp-catalog-page .btn-popup .button-ico svg, .wp-product .btn-popup .button-ico svg{ width:17px; height:17px; flex:none; }
/* images/web/icons/doc.svg 404s (file doesn't exist on the server) — a fixed CSS width/height
   doesn't reliably contain a broken <img>'s alt-text fallback box in Chrome, so it was
   rendering as an oversized blob squeezing "Скачать прайс-лист" into a sliver. No working
   replacement icon is available, so just hide it. */
.wp-catalog-page .btn-popup .button-ico img, .wp-product .btn-popup .button-ico img{ display:none; }
.wp-catalog-page .action-inner-wrap .select-content-block, .wp-product .action-inner-wrap .select-content-block{
  display:none; position:absolute; top:auto; bottom:calc(100% + 8px); left:0; right:0; background:#fff; border:1px solid var(--wp-border);
  border-radius:var(--wp-radius-lg); box-shadow:0 14px 28px rgba(27,29,34,.14); padding:8px; z-index:30;
}
.wp-catalog-page .action-inner-wrap .select-content-block.active, .wp-product .action-inner-wrap .select-content-block.active{ display:block; }
.wp-catalog-page .action-inner-wrap .select-content-block .menu, .wp-product .action-inner-wrap .select-content-block .menu{ list-style:none; margin:0; padding:0; }
.wp-catalog-page .action-inner-wrap .select-content-block li.hide, .wp-product .action-inner-wrap .select-content-block li.hide{ display:none; }
.wp-catalog-page .action-inner-wrap .select-content-block a.btn-menu, .wp-product .action-inner-wrap .select-content-block a.btn-menu{
  display:flex; align-items:center; gap:8px; padding:9px 10px; border-radius:6px; color:var(--wp-ink); font-size:var(--fs-13);
  font-weight:600; text-decoration:none;
}
.wp-catalog-page .action-inner-wrap .select-content-block a.btn-menu:hover,
.wp-product .action-inner-wrap .select-content-block a.btn-menu:hover{ background:var(--wp-bg-panel); color:var(--wp-blue); }
.wp-catalog-page .action-inner-wrap .select-content-block .button-ico img,
.wp-product .action-inner-wrap .select-content-block .button-ico img{ width:16px; height:16px; }
/* #calc-btn-wrap / .wp-calc-btn* below (near .wp-product's own section further down this file)
   are already bare, unprefixed selectors reused as-is on both pages — the .wp-catalog-page-
   prefixed copy that used to sit here was a pure redundant duplicate of those bare rules. */

/* ---------- mobile off-canvas popups (side-menu-box + filter-box share
   .popup-mobile-box; toggled by the site's existing legacy JS via
   .js-popup-mobile-open/.js-popup-mobile-close — this CSS assumes it flips
   an "active" class on the .popup-mobile-box target, matching the
   .active convention used everywhere else in this codebase (js-btn-tgl,
   js-tabs-nav, etc.); verify on a live page and adjust the selector below
   if the real toggle uses a different class ---------- */
@media (max-width:900px){
  .wp-catalog-page .side-wrap{ width:100%; position:static; }
  .wp-catalog-page .filter-action-box{ display:flex; }
  /* "Все категории товаров" trigger removed from the mobile action bar per request — only
     "Фильтры" stays. The button lives in podbor_lady.tpl's own .action-wrap (separate from
     .filter-wrap, which holds the filters button), so hiding that wrapper is enough; the
     #sidemenu popup it used to open is simply unreachable now, no need to touch it too. */
  .wp-catalog-page .filter-action-box .action-wrap{ display:none; }
  /* "Сбросить все фильтры" is a flex sibling of the chip row (.filter-selected-wrap,
     flex:1) inside .filter-actions-wrap (flex-wrap). When enough chips wrap onto a second
     line on narrow screens, the reset link doesn't wait for them — it just gets squeezed
     onto whatever room is left at the end of that line instead of getting its own row.
     Force it onto its own line, mobile only (desktop has enough width that this never
     wrapped awkwardly to begin with). */
  .wp-catalog-page .filter-reset-wrap{ flex-basis:100%; }

  /* must match (or beat) the non-media ".wp-catalog-page.content-outer-wrap .popup-mobile-box"
     rule's 3-class specificity above — at 2 classes, this used to silently lose to that rule
     at this exact breakpoint, leaving the "Категории товаров" panel permanently open (display:
     block/position:static) above the product grid on mobile instead of collapsing into the
     off-canvas popup it's meant to be here. */
  .wp-catalog-page.content-outer-wrap .popup-mobile-box{
    display:none; position:fixed; inset:0; z-index:70; background:#fff; overflow-y:auto; padding:0 0 24px;
  }
  .wp-catalog-page.content-outer-wrap .popup-mobile-box.active{ display:block; }
  .wp-catalog-page .side-menu-box.popup-mobile-box, .wp-catalog-page .filter-box.popup-mobile-box{ border:none; border-radius:0; padding:0; margin-bottom:0; }
  .wp-catalog-page .popup-mobile-box .popup-title-wrap{
    display:flex !important; align-items:center; justify-content:space-between; padding:16px; border-bottom:1px solid var(--wp-border);
    position:sticky; top:0; background:#fff; z-index:2;
  }
  /* .popup-title typography already covered by the base ".wrap .popup-mobile-box .popup-title"
     rule (identical values) — #sidemenu here is inside .wrap too, so this was dead duplication. */
  .wp-catalog-page .popup-mobile-box .btn-popup-close{ width:32px; height:32px; border-radius:50%; border:none; background:var(--wp-bg-panel); cursor:pointer; position:relative; }
  .wp-catalog-page .popup-mobile-box .btn-popup-close::before, .wp-catalog-page .popup-mobile-box .btn-popup-close::after{
    content:""; position:absolute; width:14px; height:2px; background:var(--wp-text); top:50%; left:50%;
  }
  .wp-catalog-page .popup-mobile-box .btn-popup-close::before{ transform:translate(-50%,-50%) rotate(45deg); }
  .wp-catalog-page .popup-mobile-box .btn-popup-close::after{ transform:translate(-50%,-50%) rotate(-45deg); }
  .wp-catalog-page .popup-mobile-box .popup-content-wrap{ padding:16px; }
  .wp-catalog-page .popup-mobile-box #category-head.btn-menu{ display:none; }
  .wp-catalog-page .filter-box.popup-mobile-box .filter-content-wrap{ flex-direction:column; align-items:stretch; background:none; padding:16px; }
  /* "Фильтры:" label and the dropdown's own small close X are redundant inside the mobile
     popup — the popup already has its own "Фильтры" title and big close X at the top (desktop
     keeps both: there the dropdown is a standalone floating panel with no other close control
     and no other "Фильтры" heading nearby). */
  .wp-catalog-page .filter-box.popup-mobile-box .filter-label{ display:none; }
  .wp-catalog-page .filter-box.popup-mobile-box .select-content-block.js-popup-block{ position:static; box-shadow:none; border:none; padding:12px 0 0; max-height:none; width:auto; max-width:none; }
  /* the desktop "Материал/Размер/Толщина" dropdown panel (.select-content-block) sets a fixed
     pixel width and a 5/6-column CSS grid for its .select-content-wrap when the option count
     needs .select-content-wrap-5/-6 (getCharsPodbor's own column-count classes) — same
     specificity as the plain ".select-content-wrap{gap:...}" reset above, so grid-template-
     columns survived unbeaten inside the narrow mobile popup and squeezed every checkbox
     label down to one visible character. Re-target the exact -5/-6 variants so this reliably
     wins, and switch back to flex-wrap so ".frm-select{width:calc(50% - 6px)}" below (a plain
     width, meaningless as a grid item) actually produces the intended 2-per-row layout. */
  .wp-catalog-page .filter-box.popup-mobile-box .select-content-wrap,
  .wp-catalog-page .filter-box.popup-mobile-box .select-content-block.select-content-wrap-5 .select-content-wrap,
  .wp-catalog-page .filter-box.popup-mobile-box .select-content-block.select-content-wrap-6 .select-content-wrap{
    display:flex; flex-wrap:wrap; gap:4px 12px;
  }
  .wp-catalog-page .filter-box.popup-mobile-box .frm-select{ width:calc(50% - 6px); }
  .wp-catalog-page .filter-box.popup-mobile-box .frm-select label{ overflow:visible; text-overflow:clip; white-space:normal; }

  .wp-catalog-page .tiles-catalog-box .items-wrap{ grid-template-columns:repeat(2,minmax(0,1fr)); gap:10px; }
  .wp-catalog-page .item-tile-catalog{ padding:8px; }
  .wp-catalog-page .wp-faq__grid{ grid-template-columns:1fr; }
  .wp-catalog-page .action-inner-box .info-inner-wrap{ max-width:100%; }

  /* subcategory pills (.tiles-categories-box .main-catalog-item) — gray fill + border on
     mobile, per request; desktop keeps the plain white/border-only look. */
  .wp-catalog-page .tiles-categories-box .main-catalog-item{ background:var(--wp-bg-panel); }
}

@media (max-width:600px){
  .wp-catalog-page .tiles-catalog-box .items-wrap{ grid-template-columns:1fr; }
  .wp-catalog-page .tiles-categories-box .main-catalog-wrap{ gap:8px; }
  .wp-catalog-page .action-inner-box .info-inner-wrap{ padding:20px; }
  .wp-catalog-page .title-wrap, .wp-basket .title-wrap{ gap:8px; }
}

/* ---------- "Добавлено в корзину" snackbar (#sb, templates_2025/main.tpl) ----------
   site-wide toast, toggled by the legacy scripts.min.js via a plain ".is-in" class
   (hideSB()/showSB() from js/web/scripts.min.js) — had no styling at all since the
   old CSS it depended on was removed, so it rendered as bare static text at the very
   end of the page (right under the footer) instead of a floating notification. */
.sb{
  position:fixed; left:50%; bottom:24px; z-index:200; display:flex; align-items:center; gap:12px;
  background:#fff; border:1px solid var(--wp-border); border-radius:var(--wp-radius-lg); box-shadow:var(--wp-shadow-card), 0 20px 40px rgba(27,29,34,.16);
  padding:14px 16px; max-width:540px; box-sizing:border-box; opacity:0; visibility:hidden; transform:translate(-50%, 12px);
  transition:opacity .25s ease, transform .25s ease, visibility .25s; pointer-events:none; overflow:hidden;
  font-family:'Manrope',system-ui,-apple-system,'Segoe UI',Arial,sans-serif;
}
.sb.is-in{ opacity:1; visibility:visible; transform:translate(-50%, 0); pointer-events:auto; }
.sb__check{ flex:none; width:28px; height:28px; border-radius:50%; background:var(--wp-blue); color:#fff; display:flex; align-items:center; justify-content:center; }
.sb__col{ flex:1; min-width:0; display:flex; flex-direction:column; gap:2px; }
.sb__cap{ font-size:var(--fs-15); font-weight:600; color:var(--wp-ink); }
.sb__name{ font-size:var(--fs-14); color:var(--wp-text-muted); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.sb__btn{
  flex:none; display:inline-flex; align-items:center; gap:6px; height:34px; padding:0 14px; border:none; border-radius:10px;
  background:linear-gradient(135deg,var(--wp-btn-grad-a),var(--wp-btn-grad-b)); color:#fff; font-size:var(--fs-15); font-weight:700; cursor:pointer; transition:filter .2s ease; white-space:nowrap;
}
.sb__btn:hover{ filter:brightness(1.12) saturate(1.1); }
.sb__x{ flex:none; width:24px; height:24px; border:none; background:none; color:var(--wp-text-muted); cursor:pointer; display:flex; align-items:center; justify-content:center; }
.sb__x:hover{ color:var(--wp-ink); }
.sb__timer{ position:absolute; left:0; right:0; bottom:0; height:3px; background:var(--wp-border); }
.sb__timerfill{ display:block; height:100%; width:100%; background:var(--wp-blue); transform:scaleX(0); transform-origin:left; }
.sb.is-in .sb__timerfill{ animation:sbTimerFill 3s linear forwards; }
@keyframes sbTimerFill{ from{ transform:scaleX(1); } to{ transform:scaleX(0); } }
@media (max-width:600px){
  .sb{ left:16px; right:16px; max-width:none; transform:translateY(12px); }
  .sb.is-in{ transform:translateY(0); }
}
/* #left_menu (the fixed bottom icon tab bar, see its own @media(max-width:900px) rule
   above) covers the same 900px range as this snackbar's bottom:16px position — without
   this, the snackbar rendered flush against the screen edge right on top of the tab bar,
   burying "Добавлено в корзину" behind/under the nav icons instead of floating above them. */
@media (max-width:900px){
  .sb{ bottom:calc(56px + 12px); }
}

/* ---------- Калькулятор скотча (modules/catalog/templates_2025/search_tape.tpl) ----------
   Markup/PHP/AJAX (SearchCalc.php, catalog/search/tape/result/) are pre-existing and untouched —
   this only restyles the already-working legacy calculator to the wp-2026 design system. */
/* On the catalog page this sits inside .wp-catalog-page/.wp-root (inherits Manrope + link
   reset from there); on the product page it's included via a bare content-full-wrap with no
   such ancestor, so headings fell back to the browser's default serif font and links showed
   underlines. Setting the base typography directly on .wp-calc makes it correct everywhere
   regardless of what wraps it. */
.wp-calc{
  margin:24px auto; padding:32px; box-sizing:border-box; scroll-margin-top:100px;
  background:#fff; border-radius:var(--wp-radius-lg); box-shadow:var(--wp-shadow-card);
  max-width:1360px; font-family:'Manrope',system-ui,-apple-system,'Segoe UI',Arial,sans-serif; color:var(--wp-ink);
}
@media (max-width:900px){
  .wp-calc{ padding:24px 16px; }
}
.wp-calc a{ text-decoration:none; }
.wp-calc__head{ display:flex; align-items:baseline; gap:16px; flex-wrap:wrap; margin-bottom:24px; }
.wp-calc__title{ font-size:var(--fs-22); font-weight:700; color:var(--wp-ink); margin:0; }

.wp-calc__other{ position:relative; }
.wp-calc__other-link{
  display:flex; align-items:center; gap:6px; color:var(--wp-blue); font-size:var(--fs-15); font-weight:600; cursor:pointer; transition:color .25s ease;
}
.wp-calc__other-link:hover{ color:var(--wp-blue-dark); }
.wp-calc__chevron{ width:13px; height:13px; flex:none; transition:transform .25s ease; }
.wp-calc__other.active .wp-calc__chevron{ transform:rotate(180deg); }
.wp-calc__other-dropdown{
  display:none; position:absolute; top:calc(100% + 8px); left:0; background:#fff; border-radius:8px;
  box-shadow:0 12px 28px rgba(27,29,34,.16); padding:8px; min-width:240px; z-index:30;
}
.wp-calc__other.active .wp-calc__other-dropdown{ display:block; }
/* search_calc_cards.tpl is a shared partial reused by 17 other calculator pages and keeps its
   own pill-grid styling there — inside this dropdown it only needs to lay out as a plain list. */
.wp-calc__other-dropdown .calc-menu-cards .menu{ flex-direction:column; gap:2px; flex-wrap:nowrap; }
.wp-calc__other-dropdown .calc-menu-card{
  display:block; width:100%; text-align:left; padding:9px 14px; border-radius:6px; border:none; background:none;
  color:var(--wp-ink); font-size:var(--fs-14); font-weight:600;
}
.wp-calc__other-dropdown .calc-menu-card:hover{ background:var(--wp-bg-panel); color:var(--wp-blue); border-color:transparent; }
.wp-calc__other-dropdown .calc-menu-card.active{ background:var(--wp-bg-panel); color:var(--wp-blue); font-weight:700; border-color:transparent; }
.wp-calc__other-dropdown .calc-menu-card svg{ display:none; }

.wp-calc__tabs{ display:flex; gap:32px; border-bottom:1px solid var(--wp-border); margin-bottom:24px; flex-wrap:wrap; }
.wp-calc__tab{ position:relative; padding:0 0 14px; font-size:var(--fs-16); font-weight:600; color:var(--wp-ink); cursor:pointer; }
/* ::after/:hover/.active underline behavior shared with .wp-product .button-tab-line etc. — see
   that rule (near the top of this file) for the grouped selector. */

.wp-calc__panel.js-tab-block{ display:none; }
.wp-calc__panel.js-tab-block.active{ display:block; }
.wp-calc__panel-title{ font-size:var(--fs-22); font-weight:700; color:var(--wp-ink); margin:0 0 16px; }

.wp-calc__info{ border-left:3px solid var(--wp-blue); background:var(--wp-bg-panel); border-radius:0 6px 6px 0; padding:18px 20px; margin-bottom:24px; }
.wp-calc__info p{ font-size:var(--fs-15); line-height:1.6; color:var(--wp-ink); margin:0 0 10px; }
.wp-calc__info p:last-of-type{ margin-bottom:0; }
.wp-calc__how{ display:inline-flex; align-items:center; gap:6px; color:var(--wp-blue); font-size:var(--fs-14); font-weight:600; cursor:pointer; transition:color .25s ease; }
.wp-calc__how:hover{ color:var(--wp-blue-dark); }
.wp-calc__how svg{ width:12px; height:12px; flex:none; transition:transform .25s ease; }
.wp-calc__how.active svg{ transform:rotate(180deg); }
.wp-calc__how-content{ display:none; margin-top:12px; font-size:var(--fs-14); line-height:1.7; color:var(--wp-text); }
.wp-calc__how-content.active{ display:block; }
.wp-calc__how-content p{ margin:0 0 10px; }
.wp-calc__how-content strong{ display:block; color:var(--wp-ink); font-weight:700; margin-bottom:6px; }
.wp-calc__how-content ul{ margin:0; padding-left:20px; }
.wp-calc__how-content li{ margin-bottom:4px; }

.wp-calc__card{ background:var(--wp-bg-panel); border-radius:10px; padding:28px 28px 24px; }
.wp-calc__row{ display:flex; gap:32px; flex-wrap:wrap; margin-bottom:24px; }
.wp-calc__row--pack{ display:grid; grid-template-columns:repeat(3,1fr); gap:20px 24px; }
.wp-calc__field{ flex:1 1 220px; min-width:200px; }
.wp-calc__label{ font-size:var(--fs-14); color:var(--wp-ink); font-weight:600; margin-bottom:10px; }
.wp-calc__input, .wp-calc__select{
  width:100%; height:52px; border:none; border-radius:8px; background:#fff; padding:0 16px; outline:none;
  color:var(--wp-ink); font-size:var(--fs-16); font-weight:600; font-family:inherit; box-sizing:border-box;
}
.wp-calc__select{ cursor:pointer; }
/* hide native number-input spinner arrows — they don't match the flat design used everywhere else */
.wp-calc__input::-webkit-outer-spin-button, .wp-calc__input::-webkit-inner-spin-button{ -webkit-appearance:none; margin:0; }
.wp-calc__input[type="number"]{ -moz-appearance:textfield; appearance:textfield; }
.wp-calc__hint{ margin-top:8px; font-size:var(--fs-13); color:var(--wp-text); }
.wp-calc__field-note{ margin-top:8px; font-size:var(--fs-12); color:var(--wp-text-muted); }
.wp-calc__aside{ font-size:var(--fs-13); line-height:1.6; color:var(--wp-text-muted); margin:-4px 0 20px; }
.wp-calc__group-title{ font-size:var(--fs-13); font-weight:700; text-transform:uppercase; letter-spacing:.04em; color:var(--wp-text-muted); margin:0 0 14px; }
.wp-calc__group + .wp-calc__group{ margin-top:24px; padding-top:24px; border-top:1px solid var(--wp-border); }
.wp-calc__check{ display:inline-flex; align-items:center; gap:8px; height:44px; padding:0 16px; border-radius:8px; background:#fff; color:var(--wp-ink); font-size:var(--fs-14); font-weight:600; cursor:pointer; }
.wp-calc__check input{ accent-color:var(--wp-blue); width:16px; height:16px; }
.wp-calc__submit{
  display:inline-flex; align-items:center; justify-content:center; height:48px; padding:0 32px; border:none; border-radius:8px;
  background:linear-gradient(180deg,var(--wp-blue-grad-top),var(--wp-blue-grad-bottom)); color:#fff; font-size:var(--fs-15); font-weight:700;
  cursor:pointer; transition:filter .25s ease; font-family:inherit;
}
.wp-calc__submit:hover{ filter:brightness(1.1); }

/* shared calc-result card — every search_*_result.tpl AJAX partial ({calc}-result-summary
   markup) reuses this instead of its own embedded <style> block */
.wp-calc-result{ font-size:var(--fs-15); margin-top:16px; }
.wp-calc-result-summary{ display:flex; align-items:center; gap:18px; background:#fff; border:1px solid var(--wp-border); border-radius:12px; padding:14px 20px; margin-bottom:10px; flex-wrap:wrap; }
.wp-calc-result-summary-left{ display:flex; flex-direction:column; gap:2px; }
.wp-calc-result-summary-label{ font-size:var(--fs-12); text-transform:uppercase; letter-spacing:.05em; color:var(--wp-text-muted); }
.wp-calc-result-summary-count{ font-size:var(--fs-32); font-weight:700; line-height:1; color:var(--wp-blue); white-space:nowrap; }
.wp-calc-result-summary-count span{ font-size:var(--fs-15); font-weight:500; color:var(--wp-text-muted); }
.wp-calc-result-summary-meta{ display:flex; align-items:center; gap:10px; color:var(--wp-text); font-size:var(--fs-14); flex-wrap:wrap; }
.wp-calc-result-summary-meta i{ display:block; width:1px; height:14px; background:var(--wp-border); }
.wp-calc-result-summary-meta--col{ flex-direction:column; align-items:flex-start; gap:4px; }
.wp-calc-result-fits{ background:#fff; border:1px solid var(--wp-border); border-radius:12px; padding:14px 20px; }
.wp-calc-result-fits-title{ font-weight:700; font-size:var(--fs-14); color:var(--wp-ink); margin-bottom:6px; }
.wp-calc-result-fits-row{ display:flex; justify-content:space-between; gap:10px; padding:3px 0; color:var(--wp-text); font-size:var(--fs-14); border-bottom:1px solid var(--wp-bg-panel); }
.wp-calc-result-fits-row:last-child{ border-bottom:none; }
.wp-calc-result-fits-row b{ color:var(--wp-ink); }
.wp-calc-result-warning{ background:#FDF3F4; border:1px solid #F3C9CD; border-radius:12px; padding:12px 20px; margin-top:10px; color:#A3444E; font-size:var(--fs-14); line-height:1.4; }
.wp-calc-result-note{ background:var(--wp-bg-panel); border-radius:12px; padding:12px 20px; margin-top:10px; color:var(--wp-text); font-size:var(--fs-14); line-height:1.4; }

/* box/pallet packing visualization (search_box_result.tpl only — grid diagram + dims cards) */
.wp-box-result{ font-size:var(--fs-15); margin-top:16px; }
.wp-box-result-body{ display:flex; gap:10px; flex-wrap:wrap; }
.wp-box-result-col{ background:#fff; border:1px solid var(--wp-border); border-radius:12px; padding:16px 18px; display:flex; align-items:flex-start; gap:14px; }
.wp-box-result-dims-col{ flex:1; min-width:200px; flex-direction:column; gap:10px; justify-content:center; }
.wp-box-grid{ display:flex; flex-direction:column; gap:3px; flex-shrink:0; }
.wp-box-grid-row{ display:flex; gap:3px; }
.wp-box-grid-cell{ width:20px; height:20px; border-radius:4px; background:var(--wp-bg-panel); border:1px solid var(--wp-border); }
.wp-box-result-layout-title{ font-weight:700; font-size:var(--fs-14); color:var(--wp-ink); margin-bottom:4px; }
.wp-box-result-layout-row{ color:var(--wp-text-muted); font-size:var(--fs-13); line-height:1.6; }
.wp-box-result-dim{ display:flex; align-items:center; gap:12px; }
.wp-box-result-dim + .wp-box-result-dim{ padding-top:10px; border-top:1px solid var(--wp-bg-panel); }
.wp-box-result-dim-text{ flex:1; min-width:0; }
.wp-box-result-dim-label{ color:var(--wp-text-muted); font-size:var(--fs-12); margin-bottom:2px; }
.wp-box-result-dim-value{ font-weight:700; font-size:var(--fs-16); color:var(--wp-ink); }
.wp-box-result-dim-value span{ font-weight:500; font-size:var(--fs-13); color:var(--wp-text-muted); }
.wp-box-result-badge{ background:var(--wp-bg-panel); color:var(--wp-text); border-radius:20px; padding:4px 12px; font-size:var(--fs-12); white-space:nowrap; flex-shrink:0; }
@media (max-width:768px){
  .wp-box-result-body{ flex-direction:column; }
  .wp-box-result-dims-col{ width:100%; }
}
@media (max-width:768px){
  .wp-calc-result-summary{ flex-direction:column; align-items:flex-start; }
}

@media (max-width:600px){
  .wp-calc__card{ padding:20px; }
  .wp-calc__row--pack{ grid-template-columns:1fr; }
  .wp-calc__tabs{ gap:20px; }
}

/* ---------- sidebar: category tree, product page (modules/products/templates_2025/product.tpl)
   Same component/markup as the catalog page's .wp-catalog-page sidebar (menu_catalog.tpl,
   .side-wrap/.side-menu-box/.popup-mobile-box) — duplicated here under .wp-product since the
   two pages' root classes differ and CSS has no "OR" combinator across that many rules. Keep
   both blocks in sync if the sidebar design changes. ---------- */
.wp-product .popup-mobile-box{
  display:block; position:static; inset:auto; z-index:auto; background:transparent; overflow-y:visible;
}
/* no padding override here (catalog's copy of this rule doesn't set one either) — letting
   ".wrap .popup-mobile-box{padding:0 0 24px}" show through keeps the sidebar's bottom
   spacing identical between both pages. */
.wp-product .side-menu-box{ background:#fff; border:none; border-radius:0; }
.wp-product .side-menu-box .popup-title-wrap{ display:none; }
.wp-product #category-head.btn-menu{
  display:block; padding:0 0 10px; margin-bottom:14px; border-bottom:1px solid var(--wp-border);
}
.wp-product #category-head .button-ico{ display:none; }
.wp-product #category-head .button-title{ font-size:var(--fs-14); font-weight:700; letter-spacing:2px; text-transform:uppercase; color:var(--wp-text-muted); }

/* sidebar category tree + price-list dropdown/calculator button — merged into the shared
   .wp-catalog-page/.wp-product group near the top of this file; #calc-btn-wrap/.wp-calc-btn*
   below are bare selectors kept here as-is (also used unprefixed elsewhere on this page). */
#calc-btn-wrap{ margin-top:2px; }
.wp-calc-btn{
  display:flex; align-items:center; gap:10px; width:100%; height:52px; padding:0 16px; border:none; border-radius:var(--wp-radius);
  background:linear-gradient(180deg,var(--wp-blue-grad-top),var(--wp-blue-grad-bottom)); color:#fff; cursor:pointer;
  box-shadow:0 4px 12px -2px rgba(0,119,191,.4); transition:filter .3s ease;
}
.wp-calc-btn:hover{ filter:brightness(1.1) saturate(1.1); }
.wp-calc-btn__icon{ flex:none; width:24px; height:24px; }
.wp-calc-btn__icon svg{ width:100%; height:100%; display:block; }
.wp-calc-btn__body{ display:flex; flex-direction:column; align-items:flex-start; line-height:1.25; text-align:left; }
.wp-calc-btn__title{ font-size:var(--fs-13); font-weight:700; }
.wp-calc-btn__sub{ font-size:var(--fs-11); color:rgba(255,255,255,.85); font-weight:600; }

@media (max-width:900px){
  .wp-product .popup-mobile-box{
    display:none; position:fixed; inset:0; z-index:70; background:#fff; overflow-y:auto; padding:0 0 24px;
  }
  .wp-product .popup-mobile-box.active{ display:block; }
  .wp-product .side-menu-box.popup-mobile-box{ border:none; border-radius:0; padding:0; margin-bottom:0; }
  .wp-product .popup-mobile-box .popup-title-wrap{
    display:flex !important; align-items:center; justify-content:space-between; padding:16px; border-bottom:1px solid var(--wp-border);
    position:sticky; top:0; background:#fff; z-index:2;
  }
  /* .popup-title typography already covered by the base ".wrap .popup-mobile-box .popup-title"
     rule (identical values) — dead duplication, see the same note on .wp-catalog-page's copy. */
  .wp-product .popup-mobile-box .btn-popup-close{ width:32px; height:32px; border-radius:50%; border:none; background:var(--wp-bg-panel); cursor:pointer; position:relative; }
  .wp-product .popup-mobile-box .btn-popup-close::before, .wp-product .popup-mobile-box .btn-popup-close::after{
    content:""; position:absolute; width:14px; height:2px; background:var(--wp-text); top:50%; left:50%;
  }
  .wp-product .popup-mobile-box .btn-popup-close::before{ transform:translate(-50%,-50%) rotate(45deg); }
  .wp-product .popup-mobile-box .btn-popup-close::after{ transform:translate(-50%,-50%) rotate(-45deg); }
  .wp-product .popup-mobile-box .popup-content-wrap{ padding:16px; }
  .wp-product .popup-mobile-box #category-head.btn-menu{ display:none; }
}

/* ==========================================================================
   Shared "info page" shell — Contacts / Delivery / Payment / Return / About
   pages (modules/page/templates_2025/{contacts,delivery,oplata,return,about}.tpl).
   Each page has its own .wp-X wrapper + .wp-X__breadcrumbs/__title/__intro/__cta
   family that used to be duplicated near-verbatim under every page's own block
   (5 copies of the same shell/breadcrumbs/CTA rules). Consolidated here under
   one grouped selector per shared piece so a future change only needs editing
   once; genuinely page-specific pieces (grids, tabs, cards unique to one page)
   stay under their own .wp-X__ selectors in each page's own section below.
   ========================================================================== */
.wp-contacts, .wp-delivery, .wp-oplata, .wp-return, .wp-about2026{
  background:var(--wp-bg-soft); padding:32px 0 56px;
}
.wp-contacts__shell, .wp-delivery__shell, .wp-oplata__shell, .wp-return__shell, .wp-about2026__shell{
  max-width:1360px; margin:0 auto; padding:32px; background:#fff; border-radius:var(--wp-radius); box-sizing:border-box;
}
.wp-contacts__breadcrumbs, .wp-delivery__breadcrumbs, .wp-oplata__breadcrumbs, .wp-return__breadcrumbs, .wp-about2026__breadcrumbs{
  display:flex; gap:8px; font-size:var(--fs-13); color:var(--wp-text-muted); margin-bottom:20px;
}
.wp-contacts__breadcrumbs a, .wp-delivery__breadcrumbs a, .wp-oplata__breadcrumbs a, .wp-return__breadcrumbs a, .wp-about2026__breadcrumbs a{
  color:var(--wp-text-muted);
}
.wp-contacts__breadcrumbs a:hover, .wp-delivery__breadcrumbs a:hover, .wp-oplata__breadcrumbs a:hover, .wp-return__breadcrumbs a:hover, .wp-about2026__breadcrumbs a:hover{
  color:var(--wp-blue);
}
.wp-contacts__breadcrumbs .current, .wp-delivery__breadcrumbs .current, .wp-oplata__breadcrumbs .current, .wp-return__breadcrumbs .current, .wp-about2026__breadcrumbs .current{
  color:var(--wp-ink); font-weight:600;
}
.wp-delivery__title, .wp-oplata__title, .wp-return__title, .wp-about2026__title{ margin:0 0 12px; font-size:var(--fs-28); font-weight:700; color:var(--wp-ink); }
.wp-contacts__title{ margin:0 0 32px; font-size:var(--fs-28); font-weight:700; color:var(--wp-ink); }

.wp-delivery__intro{ margin:0 0 40px; font-size:var(--fs-15); line-height:1.7; color:var(--wp-text); max-width:760px; }
.wp-oplata__intro{ margin:0 0 32px; font-size:var(--fs-15); line-height:1.7; color:var(--wp-text); max-width:760px; }
.wp-return__intro, .wp-about2026__intro{ margin:0 0 28px; font-size:var(--fs-15); line-height:1.7; color:var(--wp-text); max-width:760px; }

/* CTA band ("Остались вопросы?" / "Написать в WhatsApp") — identical across all five pages,
   including the two specificity-collision fixes (.wp-root prefix on the button's color rules,
   needed to beat ".wp-root a"/".wp-root a:hover" — see PR/commit history for how this was
   originally diagnosed on the oplata page, where blue text was unreadable on the blue button). */
.wp-contacts__cta, .wp-delivery__cta, .wp-oplata__cta, .wp-return__cta, .wp-about2026__cta{
  background:var(--wp-bg-panel); border:1px solid var(--wp-border); border-radius:10px; padding:28px;
  display:flex; justify-content:space-between; align-items:center; gap:24px; flex-wrap:wrap;
}
.wp-contacts__cta-title, .wp-delivery__cta-title, .wp-oplata__cta-title, .wp-return__cta-title, .wp-about2026__cta-title{
  font-size:var(--fs-18); font-weight:700; color:var(--wp-ink); margin-bottom:6px;
}
.wp-contacts__cta-text, .wp-delivery__cta-text, .wp-oplata__cta-text, .wp-return__cta-text, .wp-about2026__cta-text{
  font-size:var(--fs-14); color:var(--wp-text-muted);
}
.wp-return__cta-text a{ color:var(--wp-blue); }
.wp-contacts__cta-btn, .wp-delivery__cta-btn, .wp-oplata__cta-btn, .wp-return__cta-btn, .wp-about2026__cta-btn{
  height:48px; padding:0 26px; border-radius:10px; background:linear-gradient(180deg,var(--wp-blue-grad-top),var(--wp-blue-grad-bottom));
  color:#fff; font-size:var(--fs-15); font-weight:700; display:flex; align-items:center; transition:filter .2s ease; cursor:pointer;
}
.wp-root .wp-contacts__cta-btn, .wp-root .wp-delivery__cta-btn, .wp-root .wp-oplata__cta-btn, .wp-root .wp-return__cta-btn, .wp-root .wp-about2026__cta-btn{
  color:#fff;
}
.wp-root .wp-contacts__cta-btn:hover, .wp-root .wp-delivery__cta-btn:hover, .wp-root .wp-oplata__cta-btn:hover, .wp-root .wp-return__cta-btn:hover, .wp-root .wp-about2026__cta-btn:hover{
  filter:brightness(1.12) saturate(1.1); color:#fff;
}

/* shared mobile (≤900px) shell/CTA responsive rules, same grouping as above */
@media (max-width:900px){
  .wp-contacts, .wp-delivery, .wp-oplata, .wp-return, .wp-about2026{ padding:16px 0 40px; }
  .wp-contacts__shell, .wp-delivery__shell, .wp-oplata__shell, .wp-return__shell, .wp-about2026__shell{ padding:20px 16px; border-radius:0; }
  .wp-delivery__title, .wp-oplata__title, .wp-return__title, .wp-about2026__title{ font-size:var(--fs-22); }
  .wp-contacts__title{ font-size:var(--fs-22); margin-bottom:20px; }
}

/* ==========================================================================
   Contacts page (modules/page/templates_2025/contacts.tpl)
   Single-office (Almaty) redesign per design_handoff_contacts_content/SPEC-contacts.md.
   Shell/breadcrumbs/title/CTA rules shared above.
   ========================================================================== */
.wp-contacts__subtitle{ font-size:var(--fs-18); font-weight:700; color:var(--wp-ink); margin-bottom:24px; }

.wp-contacts__grid{ display:grid; grid-template-columns:1fr 1fr; gap:40px; margin-bottom:40px; }

/* same "Позвоните / Напишите на почту / Мессенджеры" card pattern as the custom-order pages'
   .wp-contact-cards (style2026-custom.css, .wp-page-content-scoped) — copied here under
   .wp-contacts's own BEM names rather than reusing that file's classes directly, since the
   two stylesheets are edited independently (see the split note at the top of this file). */
.wp-contacts__cards{ display:flex; flex-wrap:wrap; gap:12px; margin-bottom:24px; }
.wp-contacts__card-link{
  flex:1 1 230px; min-width:220px; display:flex; align-items:center; gap:12px;
  background:#fff; border:1px solid var(--wp-border); border-radius:var(--wp-radius); padding:14px 16px;
  text-decoration:none; box-sizing:border-box;
}
.wp-contacts__card-icon{
  flex:none; width:48px; height:48px; border-radius:var(--wp-radius); background:var(--wp-bg-panel);
  display:flex; align-items:center; justify-content:center;
}
.wp-contacts__card-icon img{ width:32px; height:32px; }
.wp-contacts__card-label{ font-size:var(--fs-13); font-weight:600; color:var(--wp-text-muted); display:block; }
.wp-contacts__card-value{ font-size:var(--fs-15); font-weight:800; color:var(--wp-ink); display:block; white-space:nowrap; }
.wp-contacts__card-link:hover .wp-contacts__card-value{ color:var(--wp-blue); }

.wp-contacts__card{
  background:var(--wp-bg-panel); border:1px solid var(--wp-border); border-radius:10px; padding:20px 22px;
  display:flex; flex-direction:column; gap:10px; font-size:var(--fs-14); color:var(--wp-ink);
}
.wp-contacts__card-note{ font-size:var(--fs-13); color:var(--wp-green); font-weight:600; }

.wp-contacts__photos{ display:flex; gap:10px; margin-top:16px; }
.wp-contacts__photos img{
  width:100%; height:110px; object-fit:cover; border-radius:10px; border:1px solid var(--wp-border);
}

.wp-contacts__map{
  width:100%; height:260px; border-radius:10px; overflow:hidden; background:var(--wp-bg-panel);
}
/* Contacts page only — shared with #wp-delivery-map (dostavka), which keeps the base 260px. */
.wp-contacts .wp-contacts__map{ height:485px; }
.wp-contacts__scheme-link{
  display:inline-flex; align-items:center; gap:6px; margin-top:14px; font-size:var(--fs-14); font-weight:600;
  color:var(--wp-blue); transition:color .2s ease;
}
.wp-contacts__scheme-link:hover{ color:var(--wp-blue-dark); }
.wp-contacts__scheme-link svg{ transition:transform .2s ease; }
.wp-contacts__scheme-link:hover svg{ transform:translateX(3px); }

.wp-contacts__requisites{ margin-bottom:40px; }
.wp-contacts__requisites-title{ font-size:var(--fs-18); font-weight:700; color:var(--wp-ink); margin-bottom:16px; }
.wp-contacts__requisites-list{ display:flex; flex-direction:column; border-top:1px solid var(--wp-border); }
.wp-contacts__requisites-row{
  display:grid; grid-template-columns:220px 1fr; padding:12px 0; border-bottom:1px solid var(--wp-border); font-size:var(--fs-14);
}
.wp-contacts__requisites-label{ color:var(--wp-text-muted); }
.wp-contacts__requisites-value{ color:var(--wp-ink); font-weight:600; }

@media (max-width:900px){
  .wp-contacts__grid{ grid-template-columns:1fr; gap:28px; margin-bottom:32px; }
  .wp-contacts__requisites-row{ grid-template-columns:1fr; gap:2px; }
}

/* ==========================================================================
   Delivery page (modules/page/templates_2025/delivery.tpl)
   Per design_handoff_product_content/SPEC-delivery.md.
   Shell/breadcrumbs/title/intro/CTA rules shared above.
   ========================================================================== */
.wp-delivery__tabs{ display:flex; gap:28px; border-bottom:1px solid var(--wp-border); margin-bottom:28px; }
.wp-delivery__tab, .wp-return__tab{
  position:relative; padding:0 0 14px; font-size:var(--fs-16); font-weight:600; color:var(--wp-ink);
  cursor:pointer; background:none; border:none; font-family:inherit;
}
/* ::after/:hover/.active underline behavior shared with .wp-product .button-tab-line etc. — see
   that rule (near the top of this file) for the grouped selector. */

.wp-delivery__panel{ display:none; margin-bottom:56px; }
.wp-delivery__panel.active{ display:block; }

.wp-delivery__pickup-grid{ display:grid; grid-template-columns:1fr 1fr; gap:20px; }
.wp-delivery__card{ background:var(--wp-bg-panel); border:1px solid var(--wp-border); border-radius:10px; padding:24px; }
.wp-delivery__card-title{ font-size:var(--fs-16); font-weight:700; color:var(--wp-ink); margin-bottom:10px; }
.wp-delivery__card p{ margin:0 0 6px; font-size:var(--fs-14); color:var(--wp-text); line-height:1.6; }
.wp-delivery__card p:last-child{ margin-bottom:0; }
.wp-delivery__card b{ color:var(--wp-ink); }
.wp-delivery__free{ color:var(--wp-green); font-weight:600; }

.wp-delivery__intro-text{ margin:0 0 16px; font-size:var(--fs-14); line-height:1.8; color:var(--wp-text); }
.wp-delivery__intro-text b{ color:var(--wp-ink); }
.wp-delivery__table-head{ display:grid; grid-template-columns:1fr 1fr; max-width:800px; padding-bottom:12px; border-bottom:1px solid var(--wp-border); }
.wp-delivery__table-head span{ font-size:var(--fs-15); font-weight:700; color:var(--wp-ink); }
.wp-delivery__table-head span:last-child{ text-align:right; }
.wp-delivery__table-row{ display:grid; grid-template-columns:1fr 1fr; max-width:800px; padding:14px 0; border-bottom:1px solid var(--wp-border); font-size:var(--fs-14); color:var(--wp-text); }
.wp-delivery__table-row span:last-child{ text-align:right; color:var(--wp-ink); font-weight:600; }
.wp-delivery__note{ margin:16px 0 0; font-size:var(--fs-13); color:var(--wp-text-muted); line-height:1.6; }

.wp-delivery__tk-section{ display:flex; flex-direction:column; gap:20px; }
.wp-delivery__tk-title{ font-size:var(--fs-16); font-weight:700; color:var(--wp-ink); margin-bottom:8px; }
.wp-delivery__tk-text{ margin:0; font-size:var(--fs-14); line-height:1.8; color:var(--wp-text); }
.wp-delivery__tk-price{
  display:flex; justify-content:space-between; align-items:center; background:var(--wp-bg-panel);
  border-radius:10px; padding:16px 20px; margin-top:10px;
}
.wp-delivery__tk-price span:first-child{ font-size:var(--fs-14); color:var(--wp-ink); font-weight:600; }
.wp-delivery__tk-price span:last-child{ font-size:var(--fs-16); color:var(--wp-ink); font-weight:800; }

.wp-delivery__steps-title, .wp-oplata__steps-title{ font-size:var(--fs-20); font-weight:700; color:var(--wp-ink); margin-bottom:20px; }
.wp-delivery__steps-wrap, .wp-oplata__steps-wrap{ margin-bottom:56px; }
.wp-delivery__steps, .wp-oplata__steps{ display:grid; grid-template-columns:repeat(3,1fr); gap:20px; }
.wp-delivery__step, .wp-oplata__step{ background:var(--wp-bg-panel); border:1px solid var(--wp-border); border-radius:10px; padding:22px; }
.wp-delivery__step-title{ font-size:var(--fs-16); font-weight:700; color:var(--wp-ink); margin-bottom:10px; }
.wp-oplata__step-title{ font-size:var(--fs-16); font-weight:700; color:var(--wp-ink); margin-bottom:4px; }
.wp-delivery__step p, .wp-oplata__step p{ margin:0; font-size:var(--fs-14); color:var(--wp-text); line-height:1.6; }

@media (max-width:900px){
  .wp-delivery__tabs{ gap:16px; overflow-x:auto; }
  .wp-delivery__pickup-grid{ grid-template-columns:1fr; }
  .wp-delivery__steps, .wp-oplata__steps{ grid-template-columns:1fr; }
}

/* ==========================================================================
   Payment page (modules/page/templates_2025/oplata.tpl) — same visual language as
   .wp-delivery/.wp-contacts. Content per webpack.kz/oplata/ (Kaspi QR, card, cashless,
   cash) — this page has no dedicated design_handoff spec, styled to match the sibling pages.
   Shell/breadcrumbs/title/intro/CTA rules shared above; steps-* shared with .wp-delivery above.
   ========================================================================== */
.wp-oplata__grid{ display:grid; grid-template-columns:1fr 1fr; gap:16px; margin-bottom:56px; }
.wp-oplata__card{ display:flex; align-items:flex-start; gap:16px; background:var(--wp-bg-panel); border:1px solid var(--wp-border); border-radius:10px; padding:22px; }
.wp-oplata__icon{ flex:none; width:44px; height:44px; border-radius:50%; background:#fff; display:flex; align-items:center; justify-content:center; box-shadow:var(--wp-shadow-card); }
.wp-oplata__card-title{ font-size:var(--fs-16); font-weight:700; color:var(--wp-ink); margin-bottom:4px; }
.wp-oplata__card p{ margin:0; font-size:var(--fs-14); color:var(--wp-text); line-height:1.6; }

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

/* ==========================================================================
   Return page (modules/page/templates_2025/return.tpl). Content per
   webpack.kz/vozvrat-tovara/ (already KZ law-referenced — "Закон РК", not РФ).
   Shell/breadcrumbs/title/intro/CTA rules shared above.
   ========================================================================== */
.wp-return__advantages{ display:grid; grid-template-columns:repeat(3,1fr); gap:16px; margin-bottom:40px; }
.wp-return__advantage{ background:var(--wp-bg-panel); border:1px solid var(--wp-border); border-radius:10px; padding:18px 20px; font-size:var(--fs-14); color:var(--wp-text); line-height:1.5; }
.wp-return__advantage b{ color:var(--wp-ink); }

.wp-return__tabs{ display:flex; gap:28px; border-bottom:1px solid var(--wp-border); margin-bottom:28px; flex-wrap:wrap; }
/* .wp-return__tab base rule + ::after/:hover/.active underline merged into the shared
   .wp-delivery__tab, .wp-return__tab group near the Delivery page section above. */

.wp-return__panel{ display:none; margin-bottom:40px; }
.wp-return__panel.active{ display:block; }
.wp-return__list{ margin:0; padding-left:20px; }
.wp-return__list li{ font-size:var(--fs-15); line-height:1.8; color:var(--wp-text); margin-bottom:10px; }
.wp-return__list li:last-child{ margin-bottom:0; }
/* was declared 14px, but the single-class selector here is lower specificity than the site-wide
   ".wp-root p{font-size:var(--fs-15)}" (1 class + element), so this <p> was already rendering at 15px
   regardless — written explicitly now so the declared value matches what actually shows. */
.wp-return__text{ margin:0 0 14px; font-size:var(--fs-15); line-height:1.8; color:var(--wp-text); }
.wp-return__text:last-child{ margin-bottom:0; }

@media (max-width:900px){
  .wp-return__advantages{ grid-template-columns:1fr; }
  .wp-return__tabs{ gap:16px; }
}

/* ==========================================================================
   About page (modules/page/templates_2025/about.tpl). Namespaced "wp-about2026" — the
   unprefixed "wp-about" classes already belong to the homepage's own about teaser section.
   Content per webpack.kz/o-kompanii/.
   Shell/breadcrumbs/title/intro/CTA rules shared above.
   ========================================================================== */
.wp-about2026__mission-row{ display:grid; grid-template-columns:1fr 360px; gap:40px; align-items:start; margin-bottom:48px; }
.wp-about2026__mission p{ margin:0 0 16px; font-size:var(--fs-14); line-height:1.8; color:var(--wp-text); }
.wp-about2026__mission p:last-child{ margin-bottom:0; }
.wp-about2026__mission-photo{ border-radius:var(--wp-radius-lg); overflow:hidden; border:1px solid var(--wp-border); }
.wp-about2026__mission-photo img{ display:block; width:100%; height:100%; object-fit:cover; }
@media (max-width:900px){
  .wp-about2026__mission-row{ grid-template-columns:1fr; gap:20px; }
  .wp-about2026__mission-photo{ order:-1; }
}

.wp-about2026__advantages{ margin-bottom:48px; }
.wp-about2026__advantages-grid{ display:grid; grid-template-columns:1fr 1fr; gap:16px; margin:20px 0 16px; }
.wp-about2026__advantage{
  display:flex; align-items:flex-start; gap:14px; background:#fff; border:1px solid var(--wp-border);
  border-radius:10px; padding:20px;
}
.wp-about2026__advantage-icon{
  flex:none; width:44px; height:44px; border-radius:10px; background:rgba(46,127,203,.1); color:var(--wp-blue);
  display:flex; align-items:center; justify-content:center;
}
.wp-about2026__advantage-title{ font-size:var(--fs-15); font-weight:700; color:var(--wp-ink); margin-bottom:4px; }
.wp-about2026__advantage p{ margin:0; font-size:var(--fs-13); color:var(--wp-text); line-height:1.55; }
.wp-about2026__advantages-notice{
  background:rgba(46,127,203,.06); border:1px solid rgba(46,127,203,.2); border-radius:10px; padding:16px 20px;
  font-size:var(--fs-14); color:var(--wp-text); line-height:1.6;
}
.wp-about2026__advantages-notice a{ font-weight:700; }
@media (max-width:900px){
  .wp-about2026__advantages-grid{ grid-template-columns:1fr; }
}

.wp-about2026__assortment{ margin-bottom:40px; }
.wp-about2026__assortment-title{ font-size:var(--fs-20); font-weight:700; color:var(--wp-ink); margin-bottom:16px; }
.wp-about2026__notice{ background:var(--wp-bg-panel); border:1px solid var(--wp-border); border-radius:10px; padding:16px 20px; font-size:var(--fs-14); color:var(--wp-text); line-height:1.6; margin-bottom:24px; }
.wp-about2026__grid{ display:grid; grid-template-columns:repeat(3,1fr); gap:16px; }
.wp-about2026__item{
  display:block; background:var(--wp-bg-panel); border:1px solid var(--wp-border); border-radius:10px;
  padding:20px; text-decoration:none; transition:border-color .2s ease, box-shadow .2s ease;
}
.wp-about2026__item:hover{ border-color:var(--wp-border-hover); box-shadow:var(--wp-shadow-card); }
.wp-about2026__item-title{ font-size:var(--fs-15); font-weight:700; color:var(--wp-ink); margin-bottom:6px; }
.wp-about2026__item p{ margin:0; font-size:var(--fs-13); color:var(--wp-text); line-height:1.55; }

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

/* Scroll-to-top button — replaces the removed Bitrix24 chat widget button, same bottom-right
   corner. Hidden by default; .is-visible toggled by scroll position in main2026.js. */
.wp-scroll-top{
  position:fixed; right:24px; bottom:24px; width:48px; height:48px; border-radius:50%; border:none;
  background:var(--wp-blue); color:#fff; display:flex; align-items:center; justify-content:center;
  box-shadow:0 6px 18px rgba(27,29,34,.22); cursor:pointer; z-index:40;
  opacity:0; visibility:hidden; transform:translateY(8px);
  transition:opacity .2s ease, transform .2s ease, visibility .2s, background .2s ease;
}
.wp-scroll-top.is-visible{ opacity:1; visibility:visible; transform:translateY(0); }
.wp-scroll-top:hover{ background:var(--wp-blue-dark); }
@media (max-width:600px){
  .wp-scroll-top{ right:16px; bottom:16px; width:44px; height:44px; }
}

/* ==========================================================================
   BASKET / CHECKOUT PAGE — modules/basket/templates_2025/basket_detailed_new.tpl
   First pass, scoped to .wp-basket: page shell (breadcrumbs/title/two-column grid),
   empty-cart state, and the cart item rows (basket_items.tpl) + order-summary sidebar
   (basket_info.tpl/basket_bonus.tpl). The contact/payment/delivery form sections inside
   #form-order-box are NOT covered here (separate pass) — they'll render unstyled below
   the cart items for now. Quantity +/- and the per-item delete button rely on
   window.Basket / initCounter, the same legacy scripts.min.js functions already found
   missing elsewhere on the site this session — not wired up here either, this pass is
   visual only. .wp-basket also carries .wp-root (see basket_detailed_new.tpl) for the
   site's Manrope font-family/box-sizing/link-color base rules, plus the already-generic
   .wp-root .title-box/.h1-title rules — both reused here rather than redefined. */
.wp-basket{
  max-width:1360px; margin:24px auto 60px; padding:32px; box-sizing:border-box;
  display:grid; grid-template-columns:1fr 380px; gap:24px; align-items:start;
  /* One shell for the whole page, matching .wp-content-shell (catalog/product) — the
     individual sections (.tiles-order-box/.side-total-box/.section-inner-wrap/
     .wp-basket-empty) no longer carry their own background/radius/shadow, see below. */
  background:#fff; border-radius:var(--wp-radius-lg); box-shadow:var(--wp-shadow-card);
}
.wp-basket .content-full-wrap{ grid-column:1/-1; }
.wp-basket .content-wrap{ min-width:0; }
.wp-basket .side-wrap{ position:sticky; top:130px; align-self:start; min-width:0; }
@media (max-width:900px){
  .wp-basket{ grid-template-columns:1fr; gap:20px; padding:0 16px 40px; background:none; box-shadow:none; }
  .wp-basket .side-wrap{ position:static; }
}

/* breadcrumbs — merged into the shared .wp-product/.wp-basket group (near the top of this file) */
.wp-basket .breadcrumbs-box li{ display:flex; align-items:center; gap:4px; }
.wp-basket .breadcrumbs-box li:not(:last-child)::after{ content:"\203A"; margin-left:4px; color:var(--wp-border-hover); }
.wp-basket .breadcrumbs-box a{ color:var(--wp-text-muted); font-weight:500; }
.wp-basket .breadcrumbs-box a:hover{ color:var(--wp-blue); }
.wp-basket .breadcrumbs-box li:last-child{ color:var(--wp-ink); font-weight:600; }
.wp-basket .section-counter{ font-size:var(--fs-14); font-weight:600; color:var(--wp-text-muted); }
/* .wp-root .h1-title has a generic margin-top:32px (for headings with no breadcrumb above
   them) — .breadcrumbs-box .menu already adds its own margin-bottom:20px right before this
   h1, so the two stacked to an oversized ~52px gap. Same fix as .wp-product's own
   .h1-title{margin-top:0} override. */
.wp-basket .h1-title{ margin-top:0; }

/* ---------- 404 page (templates_2025/404.tpl) ---------- */
/* content/copy and the open-box illustration match webpack.ru/404/ (this site's RU original —
   see lib/Controller.php's wp_loc doc comment on this whole project being built off it),
   restyled with this redesign's own tokens instead of the legacy theme's. */
.wp-404{ display:flex; align-items:center; gap:32px; padding:40px 0 56px; }
.wp-404__col{ flex:1 1 420px; min-width:0; }
.wp-404__title{ margin:0 0 12px; font-size:var(--fs-28); font-weight:700; color:var(--wp-ink); }
.wp-404__subtitle{ margin:0 0 12px; font-size:var(--fs-20); font-weight:700; color:var(--wp-ink); }
.wp-404__text{ margin:0 0 16px; color:var(--wp-text); line-height:1.6; }
.wp-404__list{ margin:0; padding:0 0 0 20px; color:var(--wp-text); line-height:1.8; }
.wp-404__list a{ color:var(--wp-blue); font-weight:600; }
.wp-404__list a:hover{ color:var(--wp-blue-dark); }
.wp-404__list b{ color:var(--wp-ink); }
.wp-404__photo{ flex:none; width:340px; }
.wp-404__photo img{
  display:block; width:100%; filter:grayscale(100%); transition:filter .5s ease;
}
.wp-404__photo:hover img{ filter:grayscale(0%); }
@media (max-width:900px){
  .wp-404{ flex-direction:column-reverse; gap:20px; padding:24px 0 40px; }
  .wp-404__photo{ width:220px; }
}
/* catalog_page_category.tpl (included below for the "browse the catalog instead" section)
   carries its own "Главная / Каталог" breadcrumb — redundant with this page's own
   "Главная / Страница не найдена" one right above it. */
#wp-404-page .wp-container:not(.wp-404-container) .breadcrumbs-box{ display:none; }
/* nothing above this page's own breadcrumb pushes it down from the sticky header the way a
   hero/banner does on other pages that reuse this same bare .wp-container pattern. */
.wp-404-container{ padding-top:32px; }
@media (max-width:600px){
  .wp-404-container{ padding-top:20px; }
}

/* empty cart */
.wp-basket-empty{
  grid-column:1/-1; text-align:center; padding:60px 20px;
}
.wp-basket-empty__icon{ color:var(--wp-border-hover); margin-bottom:16px; }
.wp-basket-empty h1{ margin:0 0 8px; }
.wp-basket-empty p{ color:var(--wp-text-muted); margin:0 0 24px; }
.wp-basket-empty a{ color:var(--wp-blue); }
.wp-basket-empty__btn{
  display:inline-flex; align-items:center; justify-content:center; height:48px; padding:0 28px;
  border-radius:10px; background:linear-gradient(135deg,var(--wp-btn-grad-a),var(--wp-btn-grad-b));
  color:#fff !important; font-weight:700; text-decoration:none;
}
.wp-basket-empty__btn:hover{ filter:brightness(1.12) saturate(1.1); }

/* cart items list */
.wp-basket .tiles-order-box{
  padding:4px 0; margin-bottom:24px; box-sizing:border-box;
}
.wp-basket .item-wrap{ border-top:1px solid var(--wp-border); }
.wp-basket .item-wrap:first-child{ border-top:none; }
.wp-basket .item-tile-order{ display:flex; align-items:center; gap:16px; padding:16px 0; }
.wp-basket .tile-photo-wrap{ flex:none; }
.wp-basket .tile-photo{
  display:block; width:80px; height:80px; border-radius:var(--wp-radius); border:1px solid var(--wp-border);
  overflow:hidden; background:#fff;
}
.wp-basket .tile-photo img{ width:100%; height:100%; object-fit:contain; }
.wp-basket .tile-info-wrap{ flex:1; min-width:0; }
.wp-basket .tile-title{ font-size:var(--fs-15); font-weight:600; color:var(--wp-ink); line-height:1.4; margin-bottom:4px; }
.wp-basket .order-progress__seg.is-done .order-progress__bar {
  background: #2d7fcb;
}
.wp-basket .tile-title a{ color:var(--wp-ink); }
.wp-basket .tile-title a:hover{ color:var(--wp-blue); }
.wp-basket .tile-info{ font-size:var(--fs-13); color:var(--wp-text-muted); }
.wp-basket .tile-info b{ color:var(--wp-ink); font-weight:600; }
.wp-basket .tile-counter-wrap{ flex:none; display:flex; flex-direction:column; align-items:center; }
.wp-basket .frm-field-counter{
  display:flex; align-items:center; gap:4px; border:1px solid var(--wp-border); border-radius:var(--wp-radius);
  padding:0 6px; height:40px; box-sizing:border-box;
}
.wp-basket .frm-field-counter .button-plus, .wp-basket .frm-field-counter .button-minus{
  width:26px; height:100%; border:none; background:none; color:var(--wp-text); font-weight:700;
  cursor:pointer; position:relative; flex:none; border-radius:6px; transition:background-color .15s ease;
}
.wp-basket .frm-field-counter .button-plus:hover, .wp-basket .frm-field-counter .button-minus:hover{
  background:var(--wp-bg-panel);
}
/* HTML order is plus/minus/input (basket_items.tpl) — reorder visually to the usual
   [minus][input][plus] stepper layout, same as .wp-product/.wp-popular's own counters. */
.wp-basket .frm-field-counter .button-minus{ order:1; }
.wp-basket .frm-field-counter .button-plus{ order:3; }
.wp-basket .frm-field-counter .button-plus::before{ content:"+"; }
.wp-basket .frm-field-counter .button-minus::before{ content:"\2212"; }
.wp-basket .frm-field-counter .button-plus:hover, .wp-basket .frm-field-counter .button-minus:hover{ color:var(--wp-blue); }
/* .wp-basket .form-input{width:100%} (below) has the same specificity as a bare
   .wp-basket .js-input-counter and comes later in the cascade, so it was winning and
   stretching the field back out full-width — the extra .frm-field-counter ancestor here
   outranks it. flex:none stops it growing to fill the stepper box, same as .wp-product's
   counter input. */
.wp-basket .frm-field-counter .js-input-counter{
  order:2; width:16px; flex:none; border:none; outline:none; text-align:center; font-size:var(--fs-13);
  font-weight:600; color:var(--wp-ink); font-family:inherit; background:none; padding:0;
}
/* the unit ("уп."/"шт.") used to be typed into the input's own value (e.g. "2 уп.") — it's a
   separate, non-editable span right after the (now much narrower) input instead, same order:2
   so it renders in the same visual slot without being part of the editable field, matching
   products/templates_2025/product.tpl's .js-counter-unit pattern. */
.wp-basket .frm-field-counter .js-counter-unit{
  order:2; flex:none; font-size:var(--fs-13); font-weight:600; color:var(--wp-ink); white-space:nowrap;
}
.wp-basket .field-total{ font-size:var(--fs-13); color:var(--wp-text-muted); text-align:right; margin-top:4px; white-space:nowrap; }
.wp-basket .field-total .unit-info{ display:block; }
.wp-basket .tile-price-wrap{ flex:none; min-width:110px; text-align:right; }
.wp-basket .tile-price{ font-size:var(--fs-16); font-weight:700; color:var(--wp-ink); white-space:nowrap; }
.wp-basket .tile-action-wrap{ flex:none; }
.wp-basket .tile-button.ico-del{
  display:block; width:32px; height:32px; border-radius:50%; border:none; background:var(--wp-bg-panel);
  cursor:pointer; position:relative; opacity:.7;
}
.wp-basket .tile-button.ico-del:hover{ opacity:1; background:#fde8e8; }
/* merged into the shared .popup-cart-header/.wp-basket group near the top of this file */
.wp-basket .frm-message.text-alert{ font-size:var(--fs-13); color:var(--wp-red); padding:0 0 12px; line-height:1.5; }
.wp-basket .frm-message.stock-wait{ font-size:var(--fs-13); color:var(--wp-amber); padding:0 0 12px; line-height:1.5; }
@media (max-width:600px){
  /* One flex row (photo/title/counter/price/delete side by side) had nowhere to go on a
     narrow screen — .tile-info-wrap (flex:1; min-width:0) just absorbed all the missing
     space instead of wrapping, squeezing the title into a many-line sliver next to the
     other, non-shrinking siblings. Grid + named areas: photo+title+delete on row 1,
     photo+counter+price on row 2 (photo spans both via grid-row). */
  .wp-basket .item-tile-order{
    display:grid; grid-template-columns:64px 1fr auto; grid-template-areas:"photo info action" "photo counter price";
    column-gap:12px; row-gap:8px; align-items:center; flex-wrap:unset;
  }
  .wp-basket .tile-photo-wrap{ grid-area:photo; grid-row:1/3; align-self:start; }
  .wp-basket .tile-photo{ width:64px; height:64px; }
  .wp-basket .tile-info-wrap{ grid-area:info; }
  .wp-basket .tile-action-wrap{ grid-area:action; justify-self:end; align-self:start; }
  .wp-basket .tile-counter-wrap{ grid-area:counter; align-items:flex-start; }
  .wp-basket .tile-price-wrap{ grid-area:price; min-width:0; text-align:right; }
}

/* order-summary sidebar (basket_info.tpl / basket_bonus.tpl) */
.wp-basket .side-total-box{
  box-sizing:border-box;
}
.wp-basket .rows-inner-wrap{ display:flex; flex-direction:column; margin-bottom:16px; }
.wp-basket .elm-row{
  display:flex; align-items:center; justify-content:space-between; gap:12px; padding:8px 0;
  border-bottom:1px solid var(--wp-border); font-size:var(--fs-15);
}
.wp-basket .elm-row:last-child{ border-bottom:none; }
.wp-basket .elm-row.hide{ display:none; }
.wp-basket .elm-row .row-title{ color:var(--wp-text-muted); }
.wp-basket .elm-row .row-value{ color:var(--wp-ink); font-weight:600; text-align:right; }
.wp-basket .elm-row.row-total{ /* border-top: 2px solid var(--wp-border); */ border-bottom:medium; margin-top:8px; padding-top:14px; }
.wp-basket .elm-row.row-total .row-title{ color:var(--wp-ink); font-weight:600; font-size:var(--fs-15); }
.wp-basket .elm-row.row-total .row-value{ font-size:var(--fs-20); font-weight:800; color:var(--wp-ink); }
.wp-basket .button-link .button-title-border{
  border-bottom:1px dashed var(--wp-blue); color:var(--wp-blue); font-weight:600; cursor:pointer;
}
.wp-basket #bonus-wrap{ display:none; padding-top:4px; }
.wp-basket #bonus-wrap.active{ display:block; }
.wp-basket #bonus_sum{
  width:100%; height:38px; border:1px solid var(--wp-border); border-radius:8px; padding:0 10px;
  font-size:var(--fs-13); font-family:inherit; box-sizing:border-box;
}

.wp-basket .frm-row-submit .frm-field{ margin-bottom:14px; }
.wp-basket #add-order-btn{
  display:flex; align-items:center; justify-content:center; width:100%; height:52px; border:none;
  border-radius:10px; cursor:pointer; background:linear-gradient(135deg,var(--wp-btn-grad-a),var(--wp-btn-grad-b));
  color:#fff; font-size:var(--fs-16); font-weight:700;
}
.wp-basket #add-order-btn:hover{ filter:brightness(1.12) saturate(1.1); }
.wp-basket #add-order-btn.button-disabled{ opacity:.5; cursor:not-allowed; }
/* .order-progress/.order-progress__* styling lives in basket_detailed_new.tpl's own inline
   <style> block (it has its own grid layout, unlike the flex column here) — this duplicate,
   lower-in-the-cascade-losing set was stale and had drifted to a different green/11px look,
   silently overriding the template's colors since it shares the same .wp-basket prefix and
   selector depth. Removed rather than reconciled, so there's one source of truth again. */
.wp-basket .frm-field .frm-message{ font-size:var(--fs-13); color:var(--wp-text-muted); line-height:1.5; }
.wp-basket .frm-field .frm-message.text-alert{ color:var(--wp-red); margin-bottom:8px; }
.wp-basket .frm-field .frm-message a.link-main{ color:var(--wp-blue); }

/* ---------------- checkout form: contact / payment / delivery ----------------
   modules/basket/templates_2025/basket_detailed_new.tpl (contact + payment sections),
   basket_delivery.tpl, basket_delivery_tk.tpl, delivery_unloading.tpl. All 4 share one
   markup convention: a radio/checkbox with data-content="X" toggles a sibling-somewhere
   .frm-content[data-content="X"] panel — visibility is handled by main2026.js's
   initCheckoutFormTabs() (delegated 'change' listener), the selected-card highlight
   below is pure CSS via :checked, no JS needed for that part. Two broken inline <style>
   blocks that used to live in these templates (undefined --clr-base-light/--clr-att/
   --mainRadius/--clr-border custom properties, same dead-legacy-var pattern found
   elsewhere this session) were removed in favor of this stylesheet. */
.wp-basket .section-inner-wrap{
  padding:20px 0; margin-bottom:20px; box-sizing:border-box;
  border-bottom:1px solid var(--wp-border);
}
.wp-basket .section-inner-wrap:last-of-type{ border-bottom:none; margin-bottom:0; padding-bottom:0; }
.wp-basket .section-title-wrap{ margin-bottom:16px; scroll-margin-top:24px; }
.wp-basket .section-title.h3-title{ font-size:var(--fs-18); font-weight:700; color:var(--wp-ink); margin:0; }
.wp-basket .section-subtitle{ font-size:var(--fs-15); font-weight:600; color:var(--wp-ink); margin:0 0 8px; }
.wp-basket .section-content{ display:flex; flex-wrap:wrap; }

.wp-basket .frm-row, .popup-form-cols .frm-row{ display:flex; flex-wrap:wrap; gap:12px; margin-bottom:12px; }
.wp-basket .frm-row:last-child, .popup-form-cols .frm-row:last-child{ margin-bottom:0; }
.wp-basket .frm-field, .popup-form-cols .frm-field{ flex:1 1 100%; min-width:0; }
.wp-basket .frm-field.field-half, .popup-form-cols .frm-field.field-half{ flex:1 1 calc(50% - 6px); }
.wp-basket .frm-field.field-half-small, .popup-form-cols .frm-field.field-half-small{ flex:0 1 110px; }
.wp-basket .frm-field.field-half-main, .popup-form-cols .frm-field.field-half-main{ flex:1 1 180px; }
@media (max-width:600px){
  .wp-basket .frm-field.field-half, .wp-basket .frm-field.field-half-small, .wp-basket .frm-field.field-half-main,
  .popup-form-cols .frm-field.field-half, .popup-form-cols .frm-field.field-half-small, .popup-form-cols .frm-field.field-half-main{ flex-basis:100%; }
}

/* merged into the shared .wp-account-shell/.wp-basket group above */
.wp-basket textarea.form-input, .popup-form-cols textarea.form-input{ height:90px; padding:12px 14px; resize:vertical; }
.wp-basket select.form-input, .popup-form-cols select.form-input{ cursor:pointer; }
.wp-basket .form-input:focus, .popup-form-cols .form-input:focus{ border-color:var(--wp-blue); }
.wp-basket .form-input::placeholder, .popup-form-cols .form-input::placeholder{ color:var(--wp-text-muted); }
/* Validation hints (e.g. "Номер телефона должен содержать не менее 8 символов") were always
   in the DOM with no hide-by-default — same bug as the wholesale popup fixed earlier this
   session — permanently visible instead of only-on-error. */
.wp-basket .frm-field .frm-message.text-alert, .popup-form-cols .frm-field .frm-message.text-alert{ display:none; }
.wp-basket .frm-field.inp-valid .frm-message.text-alert, .popup-form-cols .frm-field.inp-valid .frm-message.text-alert{ display:block; }

/* payment/delivery method cards — .frm-select-panel wraps a radio + label, label is the
   radio's next sibling so :checked can drive the selected look with no JS. */
.wp-basket .frm-row.row-tabs, .popup-form-cols .frm-row.row-tabs{ display:flex; gap:12px; flex-wrap:wrap; margin-bottom:20px; }
.wp-basket .frm-row.row-tabs .frm-field, .popup-form-cols .frm-row.row-tabs .frm-field{ flex:1 1 220px; }
/* "Банковской картой / Kaspi QR" has the longest label of the three payment options and was
   wrapping/cramped at an equal 1/3 share — give it more room, and shrink "При получении" +
   "Безналичный расчет" to compensate. Scoped by :has() on each option's own radio id so this
   only touches the payment row, not the (differently-ided) delivery-method row above that
   reuses the same .row-tabs/.frm-field markup. */
.wp-basket .frm-row.row-tabs .frm-field:has(#pay-card){ flex:1.6 1 110px; }
.wp-basket .frm-row.row-tabs .frm-field:has(#pay-cash),
.wp-basket .frm-row.row-tabs .frm-field:has(#pay-card-2){ flex:0.8 1 160px; }
.wp-basket .frm-select-panel input[type="radio"], .popup-form-cols .frm-select-panel input[type="radio"]{ position:absolute; opacity:0; width:1px; height:1px; }
.wp-basket .frm-select-panel label, .popup-form-cols .frm-select-panel label{
  display:flex; align-items:center; gap:12px; border:1.5px solid var(--wp-border); border-radius:var(--wp-radius-lg);
  padding:14px; cursor:pointer; height:100%; box-sizing:border-box; transition:border-color .15s ease, background .15s ease;
}
.wp-basket .frm-select-panel input:checked + label, .popup-form-cols .frm-select-panel input:checked + label{ border-color:var(--wp-blue); background:rgba(46,127,203,.06); }
.wp-basket .frm-select-panel input:focus-visible + label, .popup-form-cols .frm-select-panel input:focus-visible + label{ outline:2px solid var(--wp-blue); outline-offset:2px; }
.wp-basket .frm-select-panel input:disabled + label, .popup-form-cols .frm-select-panel input:disabled + label{ opacity:.45; cursor:not-allowed; }
.wp-basket .frm-select-panel .lbl-ico, .popup-form-cols .frm-select-panel .lbl-ico{ flex:none; width:36px; height:36px; display:flex; align-items:center; justify-content:center; }
.wp-basket .frm-select-panel .lbl-ico img, .popup-form-cols .frm-select-panel .lbl-ico img{ width:28px; height:28px; }
/* .lbl-info-wrap had no rule anywhere: as a plain flex-item div (no min-width:0) its title+info
   text fought for the same line inside the flex row instead of stacking, so the two overlapped
   instead of the title sitting above the info line. */
.wp-basket .frm-select-panel .lbl-info-wrap, .popup-form-cols .frm-select-panel .lbl-info-wrap{
  display:flex; flex-direction:column; min-width:0;
}
/* stat/delivery.tpl's own inline <style> sets ".form-order-box .frm-field{ line-height:0 }"
   (meant to collapse whitespace under its Choices.js select), which these labels sit inside and
   inherit — a 0 line-height collapses their box to 0 height, so title/info still painted (via
   overflow:visible) but on top of each other instead of stacked. Restore a real line-height. */
.wp-basket .frm-select-panel .lbl-title, .popup-form-cols .frm-select-panel .lbl-title{ font-size:var(--fs-15); font-weight:600; color:var(--wp-ink); line-height:1.4; }
.wp-basket .frm-select-panel .lbl-info, .popup-form-cols .frm-select-panel .lbl-info{ font-size:var(--fs-13); color:var(--wp-text-muted); margin-top:2px; line-height:1.4; }

/* toggleable content panels — hidden unless server-rendered .active (matches session state
   on load) or flipped by initCheckoutFormTabs() on change */
.wp-basket .frm-content, .popup-form-cols .frm-content{ display:none; }
.wp-basket .frm-content.active, .popup-form-cols .frm-content.active{ display:block; }

/* simple radio/checkbox rows — pickup city choice, TK sub-type, "save address", unloading
   checkbox — plain .frm-select (not the card-style .frm-select-panel above) */
.wp-basket .row-select, .popup-form-cols .row-select{ flex-direction:column; gap:0; }
.wp-basket .row-select > .frm-field, .popup-form-cols .row-select > .frm-field{ padding:12px 0; border-bottom:1px solid var(--wp-border); }
.wp-basket .row-select > .frm-field:last-child, .popup-form-cols .row-select > .frm-field:last-child{ border-bottom:none; }
.wp-basket .row-selects .frm-field, .popup-form-cols .row-selects .frm-field{ display:flex; gap:20px; flex-wrap:wrap; }
.wp-basket .frm-select, .popup-form-cols .frm-select{ display:flex; align-items:center; gap:8px; }
.wp-basket .frm-select input[type="radio"], .wp-basket .frm-select input[type="checkbox"],
.popup-form-cols .frm-select input[type="radio"], .popup-form-cols .frm-select input[type="checkbox"]{
  width:18px; height:18px; accent-color:var(--wp-blue); cursor:pointer; flex:none; margin:0;
}
.wp-basket .frm-select label, .popup-form-cols .frm-select label{ font-size:var(--fs-15); color:var(--wp-ink); cursor:pointer; font-weight:600; }
.wp-basket .desc-wrap, .popup-form-cols .desc-wrap{ font-size:var(--fs-13); color:var(--wp-text-muted); margin:4px 0 0 26px; line-height:1.5; }
.wp-basket .desc-wrap p, .popup-form-cols .desc-wrap p{ margin:0; }
.wp-basket .desc-wrap b, .popup-form-cols .desc-wrap b{ color:var(--wp-ink); }
.wp-basket .form-wrap, .popup-form-cols .form-wrap{ margin:12px 0px 0px 26px; padding:22px 22px; background:var(--wp-bg-panel); border-radius:var(--wp-radius); }
.wp-basket .form-wrap .frm-row:last-child, .popup-form-cols .form-wrap .frm-row:last-child{ margin-bottom:0; }
.popup-form-cols .form-wrap.width-max{ margin-left:0; }
/* company requisites fields (Безналичный расчет → Заполнить) — same panel treatment as
   .form-wrap above, just not indented under a radio option since #requisites-wrap sits at
   the top level of its .frm-content, not nested under one. */
.wp-basket #requisites-wrap{ margin-top:12px; padding:18px 22px; background:var(--wp-bg-panel); border-radius:var(--wp-radius); }
.wp-basket #requisites-wrap .frm-row:last-child{ margin-bottom:0; }
@media (max-width:600px){
  .wp-basket .desc-wrap, .wp-basket .form-wrap{ margin-left:0; }
}

/* "Заполнить способ оплаты/доставки →" prompt + sidebar's own dashed-underline links —
   shared .button-link/.button-title-border classes, same look wherever they appear */
.wp-basket .filled-delivery-pay{ margin-top:16px; }
.wp-basket .button-link{ display:inline-flex; align-items:center; gap:8px; color:var(--wp-blue); font-weight:600; font-size:var(--fs-14); cursor:pointer; text-decoration:none; background:none; border:none; padding:0; }
.wp-basket .button-link .button-title-border{ border-bottom:1px dashed var(--wp-blue); }
/* plain "&rarr;" character, same hover-slide arrow as .wp-popular__more (main_page.tpl) —
   was a fixed-size custom SVG icon file before, which couldn't follow the link's own
   color/hover state and didn't animate. */
.wp-basket .button-link .button-ico span{ display:inline-block; transition:transform .25s ease; }
.wp-basket .button-link:hover{ color:var(--wp-blue-dark); }
.wp-basket .button-link:hover .button-title-border{ border-color:var(--wp-blue-dark); }
.wp-basket .button-link:hover .button-ico span{ transform:translateX(4px); }

/* saved company requisites (bank-transfer payment) */
.wp-basket .info-variants-company{ margin-bottom:16px; }
.wp-basket .requsite-company{
  display:inline-flex; margin:0 8px 8px 0; padding:8px 14px; border:1px solid var(--wp-border); border-radius:20px;
  font-size:var(--fs-13); color:var(--wp-ink); cursor:pointer; text-decoration:none;
}
.wp-basket .requsite-company:hover{ border-color:var(--wp-blue); color:var(--wp-blue); }

/* file upload (bank-transfer "attach requisites card") */
.wp-basket .field-upload .action-wrap{ margin-bottom:8px; }
.wp-basket .field-upload label.btn{
  display:inline-flex; align-items:center; gap:8px; height:44px; padding:0 18px; border:1px dashed var(--wp-border-hover);
  border-radius:8px; cursor:pointer; color:var(--wp-ink); font-size:var(--fs-14); font-weight:600; background:none;
}
.wp-basket .field-upload label.btn:hover{ border-color:var(--wp-blue); color:var(--wp-blue); }
.wp-basket .field-upload .info-wrap{ font-size:var(--fs-13); color:var(--wp-text-muted); margin:0 0 8px; }
.wp-basket .field-upload .desc-wrap{ margin-left:0; font-size:var(--fs-13); }
.wp-basket .field-upload .desc-wrap .asterix{ color:var(--wp-red); }

/* saved delivery addresses (basket_delivery.tpl) */
.wp-basket .saved-address-box{ margin-bottom:16px; }
.wp-basket .saved-address-title{ font-size:var(--fs-15); font-weight:600; margin-bottom:10px; color:var(--wp-ink); }
.wp-basket .saved-address-list{ display:flex; flex-wrap:wrap; gap:10px; }
.wp-basket .saved-address-item{
  display:block; max-width:260px; background:#fff; border:1px solid var(--wp-border); border-radius:var(--wp-radius);
  padding:10px 14px; color:var(--wp-ink); text-decoration:none; transition:border-color .15s ease; cursor:pointer; box-sizing:border-box;
}
.wp-basket .saved-address-item:hover, .wp-basket .saved-address-item.active{ border-color:var(--wp-blue); }
.wp-basket .saved-address-item .sa-title{ display:block; font-size:var(--fs-13); font-weight:600; }
.wp-basket .saved-address-item .sa-line{ display:block; font-size:var(--fs-13); color:var(--wp-text-muted); margin-top:2px; }
/* basket_detailed_new.tpl's "Мои компании" quick-fill list reuses this address-card look (was
   the pill-style ".requsite-company" alone — see that rule above, still used as-is by
   order/add.tpl and stat/orders_payment_company.tpl's own company pickers). Only its own
   inline 8px margin needs zeroing so it doesn't stack with .saved-address-list's flex gap. */
.wp-basket .requsite-company.saved-address-item{ margin:0; }

/* ---------------- order confirmation page ----------------
   modules/order/templates_2025/add.tpl. Reuses most .wp-basket component classes verbatim
   (tiles-order-box/item-tile-order/section-inner-wrap/frm-* /side-total-box/elm-row etc,
   already styled above) — these are just this page's own unique bits. */
/* add.tpl's own product-photo branch for pseudo_dir==="" renders a bare <img> straight into
   .tile-photo-wrap (no .tile-photo anchor wrapper, unlike every other page reusing this
   markup) — give it the same boxed look as .tile-photo so it doesn't look unstyled. */
.wp-basket .tile-photo-wrap > img{
  display:block; width:80px; height:80px; border-radius:var(--wp-radius); border:1px solid var(--wp-border);
  object-fit:contain; background:#fff; box-sizing:border-box;
}

/* "Ваш заказ подтвержден!" messenger links (confirm_order.tpl) — .btn-action-ico/.button-soc-att
   never had any CSS anywhere on the site (same gap noted for the password-toggle icon class
   earlier), so these rendered as bare unstyled/uneven inline <img>s. */
.wp-basket .field-soc{ display:flex; gap:14px; margin-top:12px; }
.wp-basket .btn-action-ico.button-soc-att{
  display:flex; width:40px; height:40px; align-items:center; justify-content:center;
  border-radius:50%; background:var(--wp-bg-panel); transition:background-color .15s ease;
}
.wp-basket .btn-action-ico.button-soc-att img{ width:22px; height:22px; }
.wp-basket .btn-action-ico.button-soc-att:hover{ background:var(--wp-border); }

.wp-basket .info-order-box{ margin-bottom:24px; }
.wp-basket .info-order-box .box-inner-wrap{
  display:flex; align-items:flex-start; gap:20px; padding:24px;
  background:var(--wp-bg-panel); border-radius:var(--wp-radius-lg);
}
.wp-basket .info-order-box .elm-ico{ flex:none; width:52px; height:52px; }
.wp-basket .info-order-box .elm-ico img{ width:100%; height:100%; object-fit:contain; }
.wp-basket .info-order-box .title-inner-wrap{ flex:1; min-width:0; }
.wp-basket .info-order-box .section-title.h3-title{ margin:0 0 8px; font-size:var(--fs-20); }
.wp-basket .info-order-box p{ font-size:var(--fs-14); color:var(--wp-text-muted); line-height:1.5; margin:0; }
.wp-basket .info-order-box .link-phone{ color:var(--wp-ink); font-weight:600; }
.wp-basket .info-order-box .link{ color:var(--wp-blue); }
.wp-basket .info-order-box .link:hover{ color:var(--wp-blue-dark); }

.wp-basket .tiles-order-box.section-border,
.wp-basket .info-panel-box.section-border{ border-bottom:1px solid var(--wp-border); padding-bottom:24px; }

.wp-basket .info-panel-box{ margin-bottom:24px; }
.wp-basket .info-panel-box .section-title.h3-title{ margin:0 0 14px; }
.wp-basket .info-panel-box .list-dots{ list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:10px; }
.wp-basket .info-panel-box .list-dots li{ font-size:var(--fs-14); color:var(--wp-text-muted); line-height:1.5; }
.wp-basket .info-panel-box .list-dots li b{ color:var(--wp-ink); font-weight:600; }
.wp-basket .info-panel-box .list-dots .link{ color:var(--wp-blue); }
.wp-basket .info-panel-box .list-dots .link:hover{ color:var(--wp-blue-dark); }

.wp-basket .links-inner-wrap{ display:flex; flex-wrap:wrap; gap:12px; margin-top:16px; }
.wp-basket .link-wrap .btn.button-link{
  display:inline-flex; align-items:center; gap:10px; height:44px; padding:0 18px; border:1px solid var(--wp-border);
  border-radius:var(--wp-radius); background:none; color:var(--wp-ink); font-size:var(--fs-14); font-weight:600; text-decoration:none;
  transition:border-color .15s ease, color .15s ease;
}
.wp-basket .link-wrap .btn.button-link:hover{ border-color:var(--wp-blue); color:var(--wp-blue); background:none; filter:none; }
.wp-basket .link-wrap .button-ico{ flex:none; width:20px; height:20px; display:flex; align-items:center; justify-content:center; }
.wp-basket .link-wrap .button-ico img{ width:100%; height:100%; }
.wp-basket .link-wrap .button-title-border{ border-bottom:1px dashed currentColor; }

/* generic gradient CTA — add.tpl's various submit buttons ("Сохранить", "Поиск", "Оплатить
   банковской картой", "Сформировать счет" etc) use plain .btn, unlike the basket checkout
   form which only ever targets its one #add-order-btn by id. */
/* merged into the shared .wp-account-shell/.wp-basket group above */

.wp-basket .side-qr-box{ margin-bottom:20px; }
.wp-basket .info-payment{ padding:20px; background:var(--wp-bg-panel); border-radius:var(--wp-radius-lg); }
.wp-basket .info-payment-text{ font-size:var(--fs-14); color:var(--wp-ink); text-align:center; margin:0 0 12px; }
.wp-basket .info-payment .error-stock{ font-size:var(--fs-13); color:var(--wp-red); text-align:center; line-height:1.5; }
.wp-basket .info-payment #qr-form img{ display:block; max-width:220px; margin:0 auto 12px; }
.wp-basket .info-payment form{ display:flex; flex-direction:column; gap:10px; align-items:stretch; }
.wp-basket .info-payment .btn{ width:100%; }
@media (max-width:600px){
  .wp-basket .info-order-box .box-inner-wrap{ flex-direction:column; align-items:flex-start; gap:12px; }
  .wp-basket .links-inner-wrap{ flex-direction:column; align-items:stretch; }
}

/* ---------- "Схема проезда" modal (modules/page/templates_2025/contacts_scheme_almaty.tpl) ----------
   Opened via Fancybox (data-fancybox + data-type="ajax") from the Contacts and Delivery pages'
   "Схема проезда" links — main.tpl's global Fancybox.bind forces type:'iframe' regardless of
   data-type, so this renders as a full standalone document inside an <iframe>, not injected
   markup. It gets its own is_modal==1 <head> (see main.tpl) which already loads style2026.css,
   so no separate stylesheet is needed here — just real classes instead of the unstyled legacy
   .popup-box/.article-box/.title-box markup this used to ship with. */
.wp-scheme{ max-width:640px; margin:0 auto; padding:32px 24px 40px; box-sizing:border-box; position:relative; }
.wp-scheme .wp-scheme__title{ margin-top:0; padding-right:40px; }
.wp-scheme__close{
  position:absolute; top:16px; right:16px; width:32px; height:32px; border-radius:50%; border:none;
  background:var(--wp-bg-panel); cursor:pointer; transition:background .2s ease;
}
.wp-scheme__close:hover{ background:var(--wp-border); }
.wp-scheme__close::before, .wp-scheme__close::after{
  content:""; position:absolute; top:50%; left:50%; width:14px; height:2px; background:var(--wp-text);
}
.wp-scheme__close::before{ transform:translate(-50%,-50%) rotate(45deg); }
.wp-scheme__close::after{ transform:translate(-50%,-50%) rotate(-45deg); }

.wp-scheme__info{ margin-bottom:24px; }
.wp-scheme__info p{ margin:0 0 6px; font-size:var(--fs-15); color:var(--wp-text); line-height:1.5; }
.wp-scheme__info p:last-child{ margin-bottom:0; }
.wp-scheme__info b{ color:var(--wp-ink); }

.wp-scheme__map{ border-radius:var(--wp-radius-lg); overflow:hidden; border:1px solid var(--wp-border); }
.wp-scheme__map img{ display:block; width:100%; }

.wp-scheme__photos{ display:flex; flex-direction:column; gap:12px; margin-bottom:8px; }
.wp-scheme__photos img{ display:block; width:100%; border-radius:var(--wp-radius-lg); border:1px solid var(--wp-border); }

@media (max-width:600px){
  .wp-scheme{ padding:24px 16px 32px; }
}

/* ==========================================================================
   AUTH PAGE — modules/auth/templates_2025/auth.tpl, visited directly as
   /auth/auth/ (not via ?is_modal=1 fancybox iframe, which gets its own inline
   .popup-box styling from main.tpl's <head>). Standalone visits fell through
   to the plain full-page branch with no .wp-root wrap and no styled parent
   scope for .popup-box/.form-input/.button-password-toggle/etc (those only
   exist scoped under #popup-form or .wp-account-shell elsewhere in this
   file) — rendered as bare unstyled browser-default HTML. Values below are
   deliberately copied from #popup-form's and .wp-account-shell's existing
   rules rather than reinvented, so this matches the rest of the site. */
.wp-auth-container{ max-width:460px; padding:48px 20px 64px; margin:0 auto; }
#wp-auth-page .popup-box{
  background:#fff; border:1px solid var(--wp-border); border-radius:var(--wp-radius-lg);
  box-shadow:0 4px 24px rgba(27,29,34,.06); padding:32px; box-sizing:border-box;
}
#wp-auth-page .popup-title{ font-size:var(--fs-20); font-weight:700; color:var(--wp-ink); }
#wp-auth-page .popup-title-wrap{ margin-bottom:20px; }
#wp-auth-page .frm-row{ margin-bottom:14px; }
#wp-auth-page .form-input{
  width:100%; height:46px; border:1px solid var(--wp-border); border-radius:8px; padding:0 14px;
  font-size:var(--fs-14); font-family:inherit; color:var(--wp-ink); box-sizing:border-box; outline:none; background:#fff;
}
#wp-auth-page .form-input:focus{ border-color:var(--wp-blue); }
#wp-auth-page .frm-field-password{ position:relative; }
#wp-auth-page .frm-field-password .form-input{ padding-right:44px; }
#wp-auth-page .button-password-toggle{
  position:absolute; top:0; right:0; width:46px; height:46px; display:flex; align-items:center; justify-content:center;
  color:var(--wp-text-muted); cursor:pointer; font-size:var(--fs-16);
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none'%3E%3Cpath d='M1 12C1 12 5 4 12 4C19 4 23 12 23 12C23 12 19 20 12 20C5 20 1 12 1 12Z' stroke='%232F87CC' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M12 15C13.6569 15 15 13.6569 15 12C15 10.3431 13.6569 9 12 9C10.3431 9 9 10.3431 9 12C9 13.6569 10.3431 15 12 15Z' stroke='%232F87CC' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat:no-repeat; background-position:center; background-size:20px 20px;
}
#wp-auth-page .button-password-toggle.active{
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none'%3E%3Cpath d='M17.94 17.94C16.2306 19.243 14.1491 19.9649 12 20C5 20 1 12 1 12C2.24389 9.68192 3.96914 7.65663 6.06 6.06003M9.9 4.24002C10.5883 4.0789 11.2931 3.99836 12 4.00003C19 4.00003 23 12 23 12C22.393 13.1356 21.6691 14.2048 20.84 15.19M14.12 14.12C13.8454 14.4148 13.5141 14.6512 13.1462 14.8151C12.7782 14.9791 12.3809 15.0673 11.9781 15.0744C11.5753 15.0815 11.1752 15.0074 10.8016 14.8565C10.4281 14.7056 10.0887 14.4811 9.80385 14.1962C9.51897 13.9113 9.29439 13.572 9.14351 13.1984C8.99262 12.8249 8.91853 12.4247 8.92563 12.0219C8.93274 11.6191 9.02091 11.2219 9.18488 10.8539C9.34884 10.4859 9.58525 10.1547 9.88 9.88003' stroke='%232F87CC' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3Cpath d='M1 1L23 23' stroke='%232F87CC' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
}
#wp-auth-page .frm-message.text-alert{ font-size:var(--fs-13); color:var(--wp-red); margin-top:6px; line-height:1.5; }
#wp-auth-page .frm-row-submit{ display:flex; flex-direction:column; gap:12px; margin-top:6px; }
#wp-auth-page .btn.button-main{
  width:100%; height:48px; border:none; border-radius:10px; cursor:pointer; box-sizing:border-box;
  background:linear-gradient(135deg,var(--wp-btn-grad-a),var(--wp-btn-grad-b)); color:#fff; font-size:var(--fs-15); font-weight:700;
  display:flex; align-items:center; justify-content:center; text-decoration:none; transition:filter .2s ease;
}
#wp-auth-page .btn.button-main:hover{ filter:brightness(1.1) saturate(1.1); color:#fff; }
#wp-auth-page .btn.button-border.button-main{ background:#fff; color:var(--wp-ink); border:1px solid var(--wp-border); }
#wp-auth-page .btn.button-border.button-main:hover{ filter:none; background:var(--wp-bg-panel); }
#wp-auth-page .btn.button-link{ display:flex; align-items:center; justify-content:center; color:var(--wp-blue); font-weight:600; font-size:var(--fs-14); text-decoration:none; }
#wp-auth-page .btn.button-link:hover{ color:var(--wp-blue-dark); }
#wp-auth-page .button-title-border.border-style-dashed{ border-bottom:1px dashed currentColor; }
#wp-auth-page p{ font-size:var(--fs-14); color:var(--wp-text); line-height:1.6; }
/* register.tpl's "я соглашаюсь с офертой" checkbox row + link, and the submit button's
   disabled state while it's unchecked. */
#wp-auth-page .frm-field.field-info{ margin-top:4px; }
#wp-auth-page .frm-select{ display:flex; align-items:flex-start; gap:8px; cursor:pointer; }
#wp-auth-page .frm-select input[type=checkbox]{ margin-top:3px; accent-color:var(--wp-blue); cursor:pointer; flex:none; }
#wp-auth-page .frm-select label{ font-size:var(--fs-13); color:var(--wp-text-muted); line-height:1.5; cursor:pointer; }
#wp-auth-page .link-main{ color:var(--wp-blue); }
#wp-auth-page .link-main:hover{ color:var(--wp-blue-dark); }
#wp-auth-page .btn.button-disabled{ opacity:.5; cursor:not-allowed; pointer-events:none; }
#wp-auth-page .frm-field.inp-valid .frm-message.text-alert{ display:block; }
/* recovery.tpl's "письмо отправлено" success state (row-info) + "Изменить" link back to
   the plain form. */
#wp-auth-page .row-info .field-text{ font-size:var(--fs-14); color:var(--wp-text); line-height:1.6; margin-bottom:12px; }
#wp-auth-page .field-link .btn.button-link{ justify-content:flex-start; }
@media (max-width:600px){
  .wp-auth-container{ padding:24px 16px 40px; }
  #wp-auth-page .popup-box{ padding:24px 20px; }
}

