/* PP Neue Montreal — текстовый шрифт сайта. В репозитории лежат веб-версии из
   купленного набора: woff2 и woff, как их отдал поставщик. Раньше здесь были
   файлы, сконвертированные нами из набора «для личного использования», — их
   больше нет.

   Начертание Light отвечает и за 300, и за 400: тема набрана преимущественно
   четырёхсотым, и без этого обычный текст шёл бы Regular'ом вместо светлого. */
@font-face { font-family: 'PP Neue Montreal'; font-style: normal; font-weight: 300; font-display: swap; src: url('fonts/PPNeueMontreal-Light.woff2') format('woff2'), url('fonts/PPNeueMontreal-Light.woff') format('woff'); }
@font-face { font-family: 'PP Neue Montreal'; font-style: normal; font-weight: 400; font-display: swap; src: url('fonts/PPNeueMontreal-Light.woff2') format('woff2'), url('fonts/PPNeueMontreal-Light.woff') format('woff'); }
@font-face { font-family: 'PP Neue Montreal'; font-style: italic; font-weight: 300; font-display: swap; src: url('fonts/PPNeueMontreal-LightItalic.woff2') format('woff2'), url('fonts/PPNeueMontreal-LightItalic.woff') format('woff'); }
@font-face { font-family: 'PP Neue Montreal'; font-style: italic; font-weight: 400; font-display: swap; src: url('fonts/PPNeueMontreal-LightItalic.woff2') format('woff2'), url('fonts/PPNeueMontreal-LightItalic.woff') format('woff'); }
/* Тяжёлых начертаний у гарнитуры не куплено: здесь были Regular и Semibold,
   сконвертированные из набора «для личного использования». Файлы удалены, а
   вместе с ними и объявления — веса 500, 600 и 700 браузер теперь подделывает
   сам там, где это разрешено (см. fonts-light-faux.css). */
@font-face { font-family: 'Prata'; font-style: normal; font-weight: 400; font-display: swap; src: url('fonts/Prata-Regular-latin.woff2') format('woff2'); unicode-range: U+0000-00FF, U+2000-206F, U+20AC, U+2122; }
@font-face { font-family: 'Prata'; font-style: normal; font-weight: 400; font-display: swap; src: url('fonts/Prata-Regular-cyrillic.woff2') format('woff2'); unicode-range: U+0400-045F, U+0490-0491, U+2116; }
@font-face { font-family: 'Inter'; font-style: normal; font-weight: 300; font-display: swap; src: url('fonts/Inter-Light-latin.woff2') format('woff2'); unicode-range: U+0000-00FF, U+2000-206F, U+20AC, U+2122; }
@font-face { font-family: 'Inter'; font-style: normal; font-weight: 300; font-display: swap; src: url('fonts/Inter-Light-cyrillic.woff2') format('woff2'); unicode-range: U+0400-045F, U+0490-0491, U+2116; }
@font-face { font-family: 'Inter'; font-style: normal; font-weight: 400; font-display: swap; src: url('fonts/Inter-Regular-latin.woff2') format('woff2'); unicode-range: U+0000-00FF, U+2000-206F, U+20AC, U+2122; }
@font-face { font-family: 'Inter'; font-style: normal; font-weight: 400; font-display: swap; src: url('fonts/Inter-Regular-cyrillic.woff2') format('woff2'); unicode-range: U+0400-045F, U+0490-0491, U+2116; }
@font-face { font-family: 'Inter'; font-style: normal; font-weight: 500; font-display: swap; src: url('fonts/Inter-Medium-latin.woff2') format('woff2'); unicode-range: U+0000-00FF, U+2000-206F, U+20AC, U+2122; }
@font-face { font-family: 'Inter'; font-style: normal; font-weight: 500; font-display: swap; src: url('fonts/Inter-Medium-cyrillic.woff2') format('woff2'); unicode-range: U+0400-045F, U+0490-0491, U+2116; }
@font-face { font-family: 'Inter'; font-style: normal; font-weight: 600; font-display: swap; src: url('fonts/Inter-SemiBold-latin.woff2') format('woff2'); unicode-range: U+0000-00FF, U+2000-206F, U+20AC, U+2122; }
@font-face { font-family: 'Inter'; font-style: normal; font-weight: 600; font-display: swap; src: url('fonts/Inter-SemiBold-cyrillic.woff2') format('woff2'); unicode-range: U+0400-045F, U+0490-0491, U+2116; }

:root {
  /* Стек в одном месте: шрифт меняется правкой одной строки, а не сотни.
     Inter остаётся запасным на случай, если основной не отдался. */
  --pepfer-sans: 'PP Neue Montreal', 'Inter', system-ui, sans-serif;
  --pepfer-serif: 'Prata', Georgia, serif;

  --pepfer-ink: #201B14;
  --pepfer-muted: #6E6353;
  /* Neutral, not warm beige: on a white canvas a beige rule reads as dirty. */
  --pepfer-line: #E4E4E4;
  /* White canvas: product and editorial photography is shot on pure #FFFFFF
     (verified by sampling image corners), so any warmer page colour draws a
     visible rectangle around every photo. */
  --pepfer-paper: #FFFFFF;
  --pepfer-soft: #FCFBF8;
  --pepfer-accent: #E14E1D;
  --pepfer-accent-deep: #9A3413;
  /* Must match .container padding in style.css; the inset dividers key off it. */
  --pepfer-gutter: 12px;
}
body { color: var(--pepfer-ink); background: var(--pepfer-paper); }
.container { max-width: 1320px; }
/* Height comes from min-height, never padding, so the bar stays a predictable
   30px while the icons sit outside the flow (see .notice-bar__arrow below). */
/* Zero-height layer holding both the bar and the tab. Because they are absolutely
   positioned inside it, neither contributes to the header's height, so swapping a
   30px bar for a 20px tab can no longer move the page. */
.notice-layer { position: relative; height: 0; z-index: 30; }
/* The layer is an empty box, so it no longer blocks margin collapsing the way the
   in-flow bar did: .info_logo_personal's margin-top would escape through the
   header's top edge and push the whole header down. flow-root contains it. */
#header { display: flow-root; }
/* No height here at all: the title sits in normal flow and its line box is what
   sizes the bar, so the height follows font-size (e.g. 10px on mobile) instead of
   a hard-coded px. line-height is unitless so it scales with the font. */
.notice-bar { box-sizing: border-box; position: absolute; top: 0; left: 0; right: 0; display: flex; align-items: center; justify-content: center; padding: 0; line-height: 1.8; border-bottom: 1px solid var(--pepfer-line); background: var(--pepfer-ink); color: var(--pepfer-paper); font-family: var(--pepfer-sans); font-size: 11px; letter-spacing: .08em; text-transform: uppercase; }
/* The clipping lives here, not on the bar, so tooltips can escape downward. It
   spans the full bar width, so the title still slides the whole way out of view. */
.notice-bar__viewport { flex: 1 1 auto; min-width: 0; display: flex; justify-content: center; overflow: hidden; }
/* Slides out of view rather than collapsing: height is auto now and auto is not
   animatable. It costs nothing, since the bar is out of flow either way. */
.notice-bar.is-hidden { transform: translateY(-100%); opacity: 0; visibility: hidden; pointer-events: none; }
/* Stands in for the dismissed bar: a bell (what comes back) plus a chevron
   (which way it comes back). Sits in the right corner, clear of the edge, and
   collapses to zero height so it takes no space while the bar is showing. */
/* width:max-content and the auto left margin are belt-and-braces: a flex container
   that loses its absolute positioning would otherwise become block-level and
   stretch to the full page width. Both keep it shrink-wrapped and right-aligned. */
.notice-restore { position: absolute; top: 0; right: 24px; width: max-content; display: flex; align-items: center; justify-content: center; gap: 5px; padding: 3px 12px; margin: 0 0 0 auto; border: 0; background: var(--pepfer-ink); color: var(--pepfer-paper); cursor: pointer; transform: translateY(-100%); opacity: 0; visibility: hidden; }
.notice-restore.is-shown { transform: translateY(0); opacity: 1; visibility: visible; }
.notice-restore[hidden] { display: none; }
/* Transitions are gated behind .is-animated, added a frame after load, so a bar
   that starts collapsed does not replay the collapse on every page view.
   visibility is delayed to the end of the collapse so it cannot cut the fade. */
.notice-bar.is-animated,
.notice-restore.is-animated { transition: transform .3s ease, opacity .22s ease, visibility 0s linear .3s; }
.notice-bar.is-animated:not(.is-hidden),
.notice-restore.is-animated.is-shown { transition: transform .3s ease, opacity .22s ease, visibility 0s linear 0s; }
@media (prefers-reduced-motion: reduce) {
  .notice-bar.is-animated,
  .notice-restore.is-animated { transition: none; }
}
.notice-restore svg { width: 12px; height: 12px; display: block; stroke-width: 2; }
.notice-restore svg + svg { width: 10px; height: 10px; stroke-width: 2.4; }
/* Pinned to the same ink, not left unset: the theme's global button:hover paints
   every button green, which would show through here. */
.notice-restore:hover,
.notice-restore:focus { background: var(--pepfer-ink); color: var(--pepfer-paper); outline: none; }

/* Tooltips are the browser's own (title attribute): the OS styles them, and it
   keeps them inside the window, which hand-positioned ones near the right edge
   could not do. */
/* Back in normal flow, because something must generate the line box that gives the
   bar its height. It is the only in-flow child (the icons are absolute), so the
   parent's justify-content centres it with no gutter arithmetic involved.
   max-width keeps the title clear of the icons: 48px covers one on the left, two
   on the right. line-height is restated because `font: inherit` resets it. */
.notice-bar__text { appearance: none; margin: 0; border: 0; background: transparent; color: inherit; font: inherit; line-height: inherit; display: block; max-width: calc(100% - 96px); padding: 0 4px; text-align: center; text-decoration: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer; transition: transform .32s cubic-bezier(.4, 0, .2, 1); }
/* Notification swap: JS sets --notice-shift far enough to clear the bar edge, so
   the title visibly travels out rather than dissolving. No opacity change — the
   bar's overflow does the hiding, which is what makes it read as movement.
   .is-instant suppresses the transition for the off-view repositioning step. */
.notice-bar__text.is-shifted { transform: translateX(var(--notice-shift, 0)); }
.notice-bar__text.is-instant { transition: none; }
@media (prefers-reduced-motion: reduce) { .notice-bar__text { transition: none; } }
.notice-bar__text:hover,
.notice-bar__text:focus {
  background: transparent;
  text-decoration: none;
  outline: none;
}

.notice-panel { position: fixed; inset: 0; z-index: 300; display: flex; align-items: center; justify-content: center; background: rgba(22, 20, 15, .55); padding: 24px; }
.notice-panel[hidden] { display: none; }
.notice-panel__card { position: relative; width: min(480px, 100%); background: var(--pepfer-soft); border: 1px solid var(--pepfer-line); padding: 40px 32px 32px; }
.notice-panel__close { position: absolute; top: 14px; right: 14px; width: 32px; height: 32px; display: flex; align-items: center; justify-content: center; border: 0; background: transparent; color: var(--pepfer-ink); cursor: pointer; }
.notice-panel__close svg { width: 14px; height: 14px; }
.notice-panel__title { font-family: var(--pepfer-serif); font-size: 22px; line-height: 1.2; color: var(--pepfer-ink); margin-bottom: 14px; }
.notice-panel__content { font-family: var(--pepfer-sans); font-size: 15px; line-height: 1.65; color: var(--pepfer-muted); }
.notice-panel__link { display: inline-block; margin-top: 20px; font-family: var(--pepfer-sans); font-size: 12px; font-weight: 600; letter-spacing: .08em; text-transform: uppercase; color: var(--pepfer-accent-deep); text-decoration: none; }
.notice-panel__link:hover { text-decoration: underline; }
.notice-panel__link[hidden] { display: none; }
/* Height follows the logo instead of a 96px floor, so the block is no longer
   mostly empty space above and below the mark. */
/* minmax(0, ...) on every track: an `auto` middle column keeps its content width
   and pushes the neighbours out when the header narrows, which is what made the
   logo ride over the search field. A 0 floor lets all three give way instead. */
/* The middle track is a definite 319px rather than `auto`. With `auto` the column
   sized itself to the logo, while the logo's max-width:100% sized itself to the
   column — a circular dependency the browser resolved arbitrarily. A definite max
   with a 0 floor breaks the cycle and lets all three tracks give way when the
   header narrows, instead of the logo riding over the search. */
.info_logo_personal { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 319px) minmax(0, 1fr); align-items: center; gap: 24px; min-height: 0; margin-top: 10px; padding-bottom: 10px; font-family: var(--pepfer-sans); }
/* max-width:none clears the legacy 40% cap, which held the logo to 40% of its
   column (127.6px of 319px) and was the real reason it rendered small. */
.info_logo_personal .logo { justify-self: stretch; min-width: 0; max-width: none; text-align: center; }
/* Поле повторяет пропорции самого файла — 357 к 113. Прежний знак был обрезан
   с запасом по краям и в поле 11:3 ложился с полями; новый обрезан вплотную,
   поэтому при прежнем поле слово вышло бы заметно крупнее.

   Ширина 190 даёт высоту 60 — примерно тот же оптический размер, что и раньше,
   когда в 87 пикселей помещался знак вместе с монограммой. */
.info_logo_personal .logo img { width: 100%; max-width: 190px; height: auto; aspect-ratio: 357 / 113; object-fit: contain; }

/* Right column: language switcher stacked above the action row. */
/* stretch, not flex-end: with flex-end the action row shrink-wrapped to its content
   and simply overflowed its column on narrow screens, sliding under the logo.
   Stretched, it fills the column and its children compress instead. */
.personal-stack { display: flex; flex-direction: column; align-items: stretch; gap: 8px; min-width: 0; }
.lang-switch { align-self: flex-end; }
.lang-switch { display: flex; align-items: center; gap: 2px; margin: 0; padding: 0; }
.lang-switch__item { appearance: none; border: 0; background: transparent; padding: 2px 5px; font-family: var(--pepfer-sans); font-size: 11px; line-height: 1; letter-spacing: .08em; text-transform: uppercase; color: var(--pepfer-muted); cursor: pointer; }
.lang-switch__item.is-active { color: var(--pepfer-ink); font-weight: 600; cursor: default; }
/* Explicit, because the theme's global button:hover paints every button green. */
.lang-switch__item:hover,
.lang-switch__item:focus { background: transparent; color: var(--pepfer-ink); outline: none; }
.info_logo_personal .info, .info_logo_personal .personal { display: flex; align-items: center; gap: 20px; }
.info_logo_personal img[src*="menu.svg"],
.info_logo_personal img[src*="login.svg"],
.info_logo_personal img[src*="favorite.svg"] { width: 20px; height: 20px; }
#search { font-family: var(--pepfer-sans); }
/* The legacy rule caps this column at 30% and sets flex-flow:wrap, which is what
   broke the four controls onto three lines. Same specificity, later file wins. */
.info_logo_personal .personal { display: flex; align-items: center; flex-wrap: nowrap; justify-content: flex-end; gap: 18px; width: auto; max-width: none; min-width: 0; position: relative; }
.info_logo_personal .personal .header_search,
.info_logo_personal .personal .wishlist,
.info_logo_personal .personal .login_url,
.info_logo_personal .personal .cart_header { display: flex; align-items: center; margin-left: 0; width: auto; max-width: none; height: auto; flex: none; }
/* Only the search gives ground when space runs out; the icons keep their size. */
.info_logo_personal .personal .header_search { flex: 0 1 auto; min-width: 0; }

/* ---- Search ---- */
#search .search { position: relative; display: block; width: 100%; }
/* ID selector so it outranks the legacy .info_logo_personal .personal .header_search .search input chain. */
/* Transparent rather than a named surface colour: the field then sits on whatever
   the header background happens to be, with nothing to keep in sync. */
#search input { box-sizing: border-box; width: 138px; max-width: 100%; height: 30px; padding: 0 26px 0 0; background: transparent; border: 0; border-bottom: 1px solid var(--pepfer-line); border-radius: 0; color: var(--pepfer-ink); font-family: var(--pepfer-sans); font-size: 13px; line-height: 1.4; transition: width .25s ease, border-color .25s ease; }
#search input:focus { outline: none; }
#search input::placeholder { color: var(--pepfer-muted); }
/* Widens while focused, and stays wide as long as it holds a query. */
#search.is-active input,
#search.is-filled input { width: 238px; max-width: 100%; border-bottom-color: var(--pepfer-ink); }
/* Both icons are painted as masks filled with currentColor, so their colour comes
   from the theme rather than from the asset (search.svg is hard-coded #000) or
   from a hex baked into a data URI. */
#search .search button { position: absolute; top: 50%; right: 0; transform: translateY(-50%); width: 22px; height: 22px; margin: 0; padding: 0; border: 0; color: var(--pepfer-ink); background-color: currentColor; background-image: none; -webkit-mask: url('../image/search.svg') no-repeat center / 16px 16px; mask: url('../image/search.svg') no-repeat center / 16px 16px; cursor: pointer; }
#search .search button:hover,
#search .search button:focus { background-color: currentColor; outline: none; }
/* Once there is a query the same button becomes a reset. */
#search.is-filled .search button { -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round'%3E%3Cline x1='6' y1='6' x2='18' y2='18'/%3E%3Cline x1='18' y1='6' x2='6' y2='18'/%3E%3C/svg%3E"); mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round'%3E%3Cline x1='6' y1='6' x2='18' y2='18'/%3E%3Cline x1='18' y1='6' x2='6' y2='18'/%3E%3C/svg%3E"); -webkit-mask-size: 12px 12px; mask-size: 12px 12px; }

/* ---- Cart ---- */
/* Count and total sit to the left of the bag; the icon moves to a pseudo-element
   so the label is normal flow text instead of an absolutely positioned overlay. */
.info_logo_personal .personal .cart_header .cart_button { display: inline-flex; align-items: center; gap: 8px; width: auto; height: auto; background: none; color: var(--pepfer-ink); font-family: var(--pepfer-sans); font-size: 12px; line-height: 1; text-decoration: none; white-space: nowrap; }
.info_logo_personal .personal .cart_header .cart_button::before { content: ''; flex: none; width: 22px; height: 22px; background: url('../image/shop.svg') no-repeat center / contain; }
.info_logo_personal .personal .cart_header .cart_button span { position: static; left: auto; right: auto; top: auto; width: auto; height: auto; }
/* Two lines: count over price. Smaller type so the pair stays no taller than the icon. */
.info_logo_personal .personal .cart_header .cart_button #cart-total { display: flex; flex-direction: column; align-items: flex-start; line-height: 1.2; }
.info_logo_personal .personal .cart_header .cart_button .cart_button__count { font-size: 10px; color: var(--pepfer-ink); }
/* Accent only when the cart is not empty: a grey zero needs no attention, and it
   also stops the count reading as the same grey as the inactive language code. */
.info_logo_personal .personal .cart_header .cart_button .cart_button__count.has-items { color: var(--pepfer-accent); font-weight: 600; }
.info_logo_personal .personal .cart_header .cart_button .cart_button__sum { font-size: 11px; font-weight: 500; }
.menu_head { border-top: 1px solid var(--pepfer-line); border-bottom: 1px solid var(--pepfer-line); background: var(--pepfer-paper); }
.menu_head .categories_list { display: flex; justify-content: center; gap: clamp(18px, 3vw, 46px); min-height: 48px; margin: 0; }
.menu_head .categories_list > li > a { min-height: 48px; display: inline-flex; align-items: center; font-size: 13px; letter-spacing: .08em; text-transform: uppercase; }
.menu_head .categories_list .dropdown .dropdown-menu { left: 0; right: 0; width: 100vw; margin-left: calc(50% - 50vw); padding: 22px 0 32px; border-top: 1px solid var(--pepfer-line); background: var(--pepfer-paper); box-shadow: 0 18px 38px rgba(0, 0, 0, .08); }
.menu_head .categories_list .dropdown .dropdown-menu .dropdown-inner { max-width: 1180px; margin: 0 auto; display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 18px 36px; }
.header_full.header_full.fixed_menu { box-shadow: 0 8px 22px rgba(0, 0, 0, .07); }
.banner, .banner .swiper, .banner .swiper-slide { min-height: clamp(420px, 62vw, 720px); }
.banner img { width: 100%; height: clamp(420px, 62vw, 720px); object-fit: cover; }
.big_cats, .services_home, .products_related_home { margin-top: clamp(48px, 7vw, 96px); margin-bottom: clamp(48px, 7vw, 96px); }
.big_cats .block { display: grid; grid-template-columns: minmax(0, 1.25fr) minmax(280px, .75fr); gap: clamp(28px, 5vw, 72px); align-items: center; }
.big_cats .image img { width: 100%; aspect-ratio: 4 / 5; object-fit: cover; }
.big_cats h2 { font-size: clamp(30px, 5vw, 64px); line-height: 1.04; margin: 0 0 18px; letter-spacing: 0; }
.big_cats .sub_title { color: var(--pepfer-muted); font-size: 16px; line-height: 1.7; }
/* max-width:none for the same reason as .products .block: style.css caps the grid
   at 80%, so a fifth of the content width sat unused on every listing page. */
.products { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 42px 28px; align-items: start; max-width: none; }
/* max-width:none matters: style.css caps .products .block at 24% — a leftover from
   the old float layout that put four cards per row. Inside the grid that 24% is
   measured against the cell, shrinking every product card to a quarter of its
   column. width alone did not undo it. */
.products .block { width: auto; max-width: none; margin: 0; position: relative; }
.products .block .images, .products .block .image, .product-thumb .image { display: block; visibility: visible; opacity: 1; overflow: hidden; background: var(--pepfer-soft); aspect-ratio: 3 / 4; }
.products .block .images a, .products .block .image a, .product-thumb .image a { display: block; height: 100%; }
.products .block .images img, .products .block .image img, .product-thumb .image img { display: block; visibility: visible; opacity: 1; width: 100%; max-width: 100%; height: 100%; object-fit: cover; }
.products .block .images img.swap-image, .products .block .images img.hover-image, .products .block .image img.hover-image { opacity: 0; }
.products .block .images:hover img.swap-image, .products .block .images:hover img.hover-image, .products .block .image:hover img.hover-image { opacity: 1; }
.quickview, .quickview_button { display: none !important; }
.products .block .title { margin-top: 14px; }
.products .block .title a, .product-thumb .caption h4 a { color: var(--pepfer-ink); font-size: 15px; line-height: 1.45; text-decoration: none; }
.products .block .price, .product-thumb .price { margin-top: 8px; font-size: 14px; letter-spacing: .03em; }
.price-old { color: var(--pepfer-muted); text-decoration: line-through; margin-left: 8px; }
.price-new { color: var(--pepfer-accent); }
/* A listing card is a photo, a name and a price. Buying happens on the product
   page, where sizes and colours can actually be chosen; comparison lives there
   too. Any button-group the default markup still emits stays out of sight. */
.products .button-group, .product-thumb .button-group { display: none; }
/* Верхнее поле — двадцать пикселей: линия отчёркивает подвал от страницы, и
   отходить от неё на полсотни незачем. Нижнее оставлено прежним: под колонками
   идёт подписка, и там воздух работает. */
.footer_menu { border-top: 1px solid var(--pepfer-line); border-bottom: 1px solid var(--pepfer-line); padding: 20px 0 56px; }
.footer_menu .blocks.footer-columns {
  display: grid !important;
  /* Колонок четыре: соцсети и подписка съехались в одну. Последняя шире
     остальных — в ней форма с полем ввода и кнопкой, и в равной доле поле
     сжималось до нечитаемого. */
  grid-template-columns: repeat(3, minmax(0, 1fr)) 1.55fr;
  gap: 32px;
}
.footer-column { width: auto !important; max-width: none !important; }
.footer-column .title {
  /* Заголовочная гарнитура: столбцы подвала — это названия разделов, и набирать
     их тем же шрифтом, что и ссылки под ними, значит не отличать их вовсе. */
  font-family: var(--pepfer-serif);
  font-size: 11px;
  font-weight: 400;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--pepfer-ink) !important;
  margin-bottom: 18px;
}
.footer-column ul { margin: 0; padding: 0; list-style: none; }
.footer-column li { margin-bottom: 10px; }
.footer-column li:last-child { margin-bottom: 0; }
.footer-column a,
.footer-column li {
  font-family: var(--pepfer-sans);
  font-size: 13px;
  line-height: 1.5;
  color: var(--pepfer-muted);
}
.footer-column a { text-decoration: none; }
.footer-column a:hover { color: var(--pepfer-ink); text-decoration: underline; text-underline-offset: 3px; }
.footer-contacts li { color: var(--pepfer-muted); }
@media (max-width: 1024px) {
  .footer_menu .blocks.footer-columns { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 28px 24px; }
}
/* На телефоне столбцы идут один под другим: в две колонки по 164 пикселя
   названия разделов переносились по два-три слова и читались тяжелее,
   чем один длинный список. */
@media (max-width: 640px) {
  .footer_menu { padding: 20px 0 32px; }

  .footer_menu .blocks.footer-columns { grid-template-columns: minmax(0, 1fr); gap: 28px; }
}
.copyright {
  padding: 24px 0 36px;
  color: var(--pepfer-muted);
  font-family: var(--pepfer-sans);
  font-size: 12px;
  letter-spacing: .04em;
}
/* 242 and 132 are multiples of 11 too, so the height stays whole (66 and 36). */
@media (max-width: 1024px) { .info_logo_personal { grid-template-columns: minmax(0, 1fr) minmax(0, 242px) minmax(0, 1fr); gap: 16px; } .info_logo_personal .logo img { max-width: 160px; } .products { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
@media (max-width: 767px) { .notice-bar { font-size: 10px; } .info_logo_personal { min-height: 72px; grid-template-columns: 44px 1fr auto; } .info_logo_personal .logo { justify-self: start; } .info_logo_personal .logo img { max-width: 124px; } .info_logo_personal .personal { gap: 12px; } .menu_head { display: none; } .products { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 30px 14px; } .products_filter { display: block; } .big_cats .block { grid-template-columns: 1fr; } .banner, .banner .swiper, .banner .swiper-slide, .banner img { min-height: 420px; height: 420px; } .pepfer-card-actions, .products .button-group { flex-direction: column; align-items: stretch; } }
@media (max-width: 420px) { .products { grid-template-columns: 1fr; } }

/* Keep the base OpenCart category menu visible as a separate header row. */
.header_full .menu_head {
  display: block !important;
  position: relative;
  z-index: 30;
  min-height: 56px;
  overflow: visible;
  border-top: 1px solid var(--pepfer-line);
  border-bottom: 1px solid var(--pepfer-line);
  background: var(--pepfer-paper);
}
.header_full .menu_head > .container {
  max-width: 1650px;
  margin: 0 auto;
}
.header_full .menu_head .categories_list {
  display: flex !important;
  align-items: center;
  justify-content: center;
  gap: clamp(18px, 2.7vw, 44px);
  min-height: 56px;
  margin: 0;
  padding: 0;
  list-style: none;
  overflow: visible;
}
.header_full .menu_head .categories_list > li {
  display: flex;
  align-items: center;
  min-height: 56px;
  margin: 0;
  padding: 0;
  position: static;
}
.header_full .menu_head .categories_list > li > a {
  display: inline-flex !important;
  align-items: center;
  min-height: 56px;
  color: var(--pepfer-ink) !important;
  opacity: 1 !important;
  visibility: visible !important;
  /* Текстовая гарнитура: меню читают, а не разглядывают, и рядом с
     засечками логотипа сплошная строка заглавных набиралась тяжело. */
  font-family: var(--pepfer-sans);
  font-size: 13px;
  /* Веса здесь нет намеренно: купленное начертание одно — Light. Обводка в
     треть пикселя утолщала штрих, но съедала чёткость букв, а подделка веса
     браузером заплывает в просветах. Настоящий вес появится, когда купят
     Medium; до тех пор меню набрано светлым, только крупнее. */
  font-weight: 400;
  line-height: 1.2;
  letter-spacing: .1em;
  text-transform: uppercase;
  text-decoration: none;
  white-space: nowrap;
  transition: border-color 160ms ease;
}
.header_full .menu_head .categories_list .dropdown .dropdown-menu {
  top: 100% !important;
  left: 0 !important;
  right: 0 !important;
  width: 100vw !important;
  max-height: none;
  margin-left: calc(50% - 50vw);
  /* Восемнадцать сверху вместо тридцати четырёх: подпункты отходили от
     линии на полсотни пикселей вместе с полем самой сетки, и связь с
     разделом, под которым они висят, терялась. */
  padding: 18px 0 32px;
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  background: var(--pepfer-paper);
  border: 0;
  border-top: 1px solid var(--pepfer-line);
  box-shadow: 0 18px 38px rgba(0, 0, 0, .08);
  transition: opacity .2s ease, visibility .2s ease;
}
.header_full .menu_head .categories_list .dropdown:hover .dropdown-menu,
.header_full .menu_head .categories_list .dropdown:focus-within .dropdown-menu {
  opacity: 1;
  visibility: visible;
  pointer-events: auto;
}
.header_full .menu_head .categories_list .dropdown .dropdown-menu .container {
  max-width: 1180px;
}
.header_full .menu_head .categories_list .dropdown .dropdown-menu .dropdown-inner {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  gap: 18px 36px;
}
@media (max-width: 767px) {
  .header_full .menu_head { display: none !important; }
}

.notice-bar__arrow,
.notice-bar__close {
  appearance: none;
  position: absolute;
  top: 0;
  bottom: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 24px;
  margin: 0;
  padding: 0;
  border: 0;
  background: transparent;
  color: var(--pepfer-paper);
  cursor: pointer;
}
/* Out of flow on purpose: the title then centres on the bar itself, so the
   lopsided gutters (one icon left, two right) can no longer pull it off-centre. */
.notice-bar__arrow[data-notice-prev] { left: 0; }
.notice-bar__arrow[data-notice-next] { right: 24px; }
.notice-bar__close { right: 0; }
/* Stroke weight lives here, not in the markup, so it can be tuned in one place.
   At a 24-unit viewBox drawn 12px wide, stroke-width 2 lands on exactly 1px —
   a whole pixel renders crisp, where fractional widths blur and read as thin. */
.notice-bar__arrow svg,
.notice-bar__close svg {
  width: 12px;
  height: 12px;
  display: block;
  stroke-width: 2;
}
/* The cross is drawn 10px, so it needs a proportionally heavier stroke to hit
   the same 1px optical weight as the 12px arrows. */
.notice-bar__close svg {
  width: 10px;
  height: 10px;
  stroke-width: 2.4;
}
.notice-bar__arrow:hover,
.notice-bar__close:hover,
.notice-bar__arrow:focus,
.notice-bar__close:focus {
  background: transparent;
  color: var(--pepfer-paper);
  outline: none;
}

/* The header scrolls away with the page. It was sticky and 153px tall, which
   parked it on top of everything in the first screen of content — the
   breadcrumbs sat 24px below it and were covered outright on a narrow viewport,
   where the controls wrap and the header grows taller still. */
#header {
  position: static;
  background: var(--pepfer-paper);
}
/* style.css bolts .header_fixed on during scroll; neutralise it so nothing
   re-pins the header behind our back. */
#header.header_fixed {
  position: static !important;
  top: auto !important;
  padding-top: 0 !important;
  background: var(--pepfer-paper) !important;
  box-shadow: none !important;
}
#header .header_full,
#header .header_full.fixed_menu,
#header.header_fixed .header_full,
#header.header_fixed .header_full.fixed_menu {
  position: relative !important;
  top: auto !important;
  left: auto !important;
  right: auto !important;
  width: 100% !important;
  max-width: none !important;
  z-index: auto !important;
  background: var(--pepfer-paper) !important;
  box-shadow: none !important;
}
#header .container_full,
#header.header_fixed .container_full {
  background: var(--pepfer-paper) !important;
}
#header .notice-bar {
  width: 100%;
  box-shadow: none !important;
}
#header .info_logo_personal,
#header .menu_head {
  background: var(--pepfer-paper) !important;
}

/* Final header cleanup: no inner shadows or stray horizontal rules. */
#header,
#header.header_fixed {
  box-shadow: none !important;
  border: 0 !important;
  background: var(--pepfer-paper) !important;
}
#header .container,
#header .container_full,
#header .header_full,
#header .header_full.fixed_menu,
#header .info_logo_personal,
#header .menu_head,
#header .menu_head > .container {
  box-shadow: none !important;
  border-top: 0 !important;
  border-bottom: 0 !important;
  background: var(--pepfer-paper) !important;
}
#header .notice-bar {
  border-bottom: 0 !important;
  box-shadow: none !important;
}


/* No visual divider under sticky header. */
#header,
#header.header_fixed,
#header .header_full,
#header .header_full.fixed_menu,
#header .container_full,
#header .menu_head,
#header .info_logo_personal {
  -webkit-box-shadow: none !important;
  -moz-box-shadow: none !important;
  box-shadow: none !important;
  border-bottom: 0 !important;
}
#header::before,
#header::after,
#header .header_full::before,
#header .header_full::after,
#header .menu_head::before,
#header .menu_head::after {
  display: none !important;
  content: none !important;
  box-shadow: none !important;
  border: 0 !important;
}

/* Dropdown panel must open without an extra horizontal divider. */
#header .menu_head .categories_list .dropdown .dropdown-menu,
#header .menu_head .categories_list .dropdown:hover .dropdown-menu,
#header .menu_head .categories_list .dropdown:focus-within .dropdown-menu {
  border-top: 0 !important;
  border-bottom: 0 !important;
  -webkit-box-shadow: none !important;
  -moz-box-shadow: none !important;
  box-shadow: none !important;
}
#header .menu_head .categories_list .dropdown .dropdown-menu::before,
#header .menu_head .categories_list .dropdown .dropdown-menu::after,
#header .menu_head .categories_list .dropdown:hover .dropdown-menu::before,
#header .menu_head .categories_list .dropdown:hover .dropdown-menu::after {
  display: none !important;
  content: none !important;
  border: 0 !important;
  -webkit-box-shadow: none !important;
  -moz-box-shadow: none !important;
  box-shadow: none !important;
}

/* Anya Hindmarch-style category mega panel. */
#header .menu_head {
  position: relative !important;
  overflow: visible !important;
}
#header .menu_head .categories_list > li {
  position: static !important;
}
#header .menu_head .categories_list > li > a {
  border-bottom: 1px solid transparent !important;
  padding-top: 1px;
}
#header .menu_head .categories_list > li:hover > a,
#header .menu_head .categories_list > li:focus-within > a,
#header .menu_head .categories_list > li.active > a {
  border-bottom-color: var(--pepfer-ink) !important;
}
#header .menu_head .categories_list .dropdown .dropdown-menu,
#header .menu_head .categories_list .dropdown:hover .dropdown-menu,
#header .menu_head .categories_list .dropdown:focus-within .dropdown-menu {
  display: block !important;
  position: absolute !important;
  top: 100% !important;
  left: 50% !important;
  right: auto !important;
  width: 100vw !important;
  max-height: none !important;
  margin: 0 !important;
  /* Восемнадцать сверху вместо сорока шести: подпункты отходили от линии,
     которой заканчивается ряд разделов, на полсотни пикселей — связь с
     разделом, под которым они висят, терялась. Снизу поле оставлено больше:
     там список кончается, и воздух отделяет его от страницы. */
  padding: 18px 0 40px !important;
  transform: translateX(-50%) !important;
  background: var(--pepfer-paper) !important;
  border-top: 1px solid var(--pepfer-line) !important;
  border-bottom: 0 !important;
  box-shadow: none !important;
  overflow: visible !important;
  z-index: 90 !important;
}
#header .menu_head .categories_list .dropdown .dropdown-menu::before,
#header .menu_head .categories_list .dropdown .dropdown-menu::after {
  display: none !important;
  content: none !important;
}
#header .menu_head .categories_list .dropdown .dropdown-menu > .container {
  max-width: 1710px !important;
  margin: 0 auto !important;
  padding: 0 clamp(40px, 5vw, 96px) !important;
  border: 0 !important;
  box-shadow: none !important;
  background: transparent !important;
}
#header .menu_head .categories_list .dropdown .dropdown-menu .see-all {
  display: inline-block !important;
  margin: 0 0 22px !important;
  min-height: 0 !important;
  padding: 0 !important;
  color: var(--pepfer-ink) !important;
  font-size: 14px !important;
  line-height: 1.35 !important;
  letter-spacing: .04em !important;
  text-transform: uppercase !important;
  text-decoration: none !important;
  border: 0 !important;
}
#header .menu_head .categories_list .dropdown .dropdown-menu .dropdown-inner {
  display: block !important;
  max-width: 980px !important;
  margin: 0 !important;
  padding: 0 !important;
}
#header .menu_head .categories_list .dropdown .dropdown-menu .dropdown-inner ul {
  columns: 3 220px;
  column-gap: clamp(44px, 7vw, 120px);
  width: 100% !important;
  max-width: none !important;
  margin: 0 !important;
  padding: 0 !important;
  list-style: none !important;
}
#header .menu_head .categories_list .dropdown .dropdown-menu li {
  break-inside: avoid;
  margin: 0 0 13px !important;
  padding: 0 !important;
}
#header .menu_head .categories_list .dropdown .dropdown-menu li a {
  display: inline !important;
  min-height: 0 !important;
  padding: 0 !important;
  color: var(--pepfer-ink) !important;
  font-family: inherit !important;
  font-size: 16px !important;
  line-height: 1.45 !important;
  letter-spacing: .01em !important;
  text-transform: none !important;
  text-decoration: none !important;
  border: 0 !important;
}
#header .menu_head .categories_list .dropdown .dropdown-menu li a:hover {
  text-decoration: underline !important;
  text-underline-offset: 4px;
}
#header .menu_head .categories_list .dropdown .dropdown-menu li a::after,
#header .menu_head .categories_list .dropdown .dropdown-menu .see-all::after {
  display: none !important;
  content: none !important;
}
@media (max-width: 1024px) {
  #header .menu_head .categories_list .dropdown .dropdown-menu .dropdown-inner ul {
    columns: 2 220px;
  }
}

/* Keep mega menu content aligned with the main header container. */
#header .menu_head .categories_list .dropdown .dropdown-menu > .container {
  width: min(100% - 88px, 1708px) !important;
  max-width: 1708px !important;
  margin-left: auto !important;
  margin-right: auto !important;
  padding-left: 0 !important;
  padding-right: 0 !important;
}
#header .menu_head .categories_list .dropdown .dropdown-menu .dropdown-inner {
  max-width: 1260px !important;
}
#header .menu_head .categories_list .dropdown .dropdown-menu .dropdown-inner ul {
  columns: 3 260px;
  column-gap: clamp(72px, 9vw, 180px);
}
@media (max-width: 1200px) {
  #header .menu_head .categories_list .dropdown .dropdown-menu > .container {
    width: calc(100% - 48px) !important;
  }
  #header .menu_head .categories_list .dropdown .dropdown-menu .dropdown-inner ul {
    column-gap: 56px;
  }
}

/* Match dropdown content width to the visible header/nav container. */
#header .menu_head .categories_list .dropdown .dropdown-menu > .container {
  width: min(calc(100vw - 248px), 1650px) !important;
  max-width: 1650px !important;
  margin-left: auto !important;
  margin-right: auto !important;
  padding-left: 0 !important;
  padding-right: 0 !important;
}
#header .menu_head .categories_list .dropdown .dropdown-menu .see-all,
#header .menu_head .categories_list .dropdown .dropdown-menu .dropdown-inner {
  margin-left: 0 !important;
}
#header .menu_head .categories_list .dropdown .dropdown-menu .dropdown-inner {
  width: min(100%, 1080px) !important;
  max-width: 1080px !important;
}
#header .menu_head .categories_list .dropdown .dropdown-menu .dropdown-inner ul {
  columns: 3 220px !important;
  column-gap: clamp(56px, 7vw, 130px) !important;
}
@media (max-width: 1400px) {
  #header .menu_head .categories_list .dropdown .dropdown-menu > .container {
    width: calc(100vw - 96px) !important;
  }
}
@media (max-width: 900px) {
  #header .menu_head .categories_list .dropdown .dropdown-menu > .container {
    width: calc(100vw - 40px) !important;
  }
}

/* Constrain the mega menu divider to the content width. */
#header .menu_head .categories_list .dropdown .dropdown-menu,
#header .menu_head .categories_list .dropdown:hover .dropdown-menu,
#header .menu_head .categories_list .dropdown:focus-within .dropdown-menu {
  border-top: 0 !important;
}
#header .menu_head .categories_list .dropdown .dropdown-menu::before,
#header .menu_head .categories_list .dropdown:hover .dropdown-menu::before,
#header .menu_head .categories_list .dropdown:focus-within .dropdown-menu::before {
  content: '' !important;
  display: block !important;
  position: absolute !important;
  top: 0 !important;
  left: 50% !important;
  width: min(calc(100vw - 248px), 1650px) !important;
  height: 1px !important;
  transform: translateX(-50%) !important;
  border: 0 !important;
  border-top: 1px solid var(--pepfer-line) !important;
  box-shadow: none !important;
  pointer-events: none !important;
}
@media (max-width: 1400px) {
  #header .menu_head .categories_list .dropdown .dropdown-menu::before,
  #header .menu_head .categories_list .dropdown:hover .dropdown-menu::before,
  #header .menu_head .categories_list .dropdown:focus-within .dropdown-menu::before {
    width: calc(100vw - 96px) !important;
  }
}
@media (max-width: 900px) {
  #header .menu_head .categories_list .dropdown .dropdown-menu::before,
  #header .menu_head .categories_list .dropdown:hover .dropdown-menu::before,
  #header .menu_head .categories_list .dropdown:focus-within .dropdown-menu::before {
    width: calc(100vw - 40px) !important;
  }
}

/* Prevent mega menu from creating page-level horizontal overflow. */
html,
body {
  overflow-x: clip;
}
@supports not (overflow-x: clip) {
  html,
  body {
    overflow-x: hidden;
  }
}
#header .menu_head .categories_list .dropdown .dropdown-menu,
#header .menu_head .categories_list .dropdown:hover .dropdown-menu,
#header .menu_head .categories_list .dropdown:focus-within .dropdown-menu {
  left: 0 !important;
  right: 0 !important;
  width: 100% !important;
  max-width: 100% !important;
  margin-left: 0 !important;
  margin-right: 0 !important;
  transform: none !important;
}
#header .menu_head .categories_list .dropdown .dropdown-menu > .container {
  width: min(calc(100% - 248px), 1650px) !important;
}
#header .menu_head .categories_list .dropdown .dropdown-menu::before,
#header .menu_head .categories_list .dropdown:hover .dropdown-menu::before,
#header .menu_head .categories_list .dropdown:focus-within .dropdown-menu::before {
  width: min(calc(100% - 248px), 1650px) !important;
}
@media (max-width: 1400px) {
  #header .menu_head .categories_list .dropdown .dropdown-menu > .container,
  #header .menu_head .categories_list .dropdown .dropdown-menu::before,
  #header .menu_head .categories_list .dropdown:hover .dropdown-menu::before,
  #header .menu_head .categories_list .dropdown:focus-within .dropdown-menu::before {
    width: calc(100% - 96px) !important;
  }
}
@media (max-width: 900px) {
  #header .menu_head .categories_list .dropdown .dropdown-menu > .container,
  #header .menu_head .categories_list .dropdown .dropdown-menu::before,
  #header .menu_head .categories_list .dropdown:hover .dropdown-menu::before,
  #header .menu_head .categories_list .dropdown:focus-within .dropdown-menu::before {
    width: calc(100% - 40px) !important;
  }
}

/* Fast mega-menu reveal with the theme typography. */
#header .menu_head .categories_list .dropdown .dropdown-menu {
  opacity: 0 !important;
  visibility: hidden !important;
  pointer-events: none !important;
  clip-path: inset(0 0 100% 0) !important;
  transition:
    opacity 200ms ease-out,
    clip-path 320ms cubic-bezier(.4, 0, .2, 1),
    visibility 0s linear 320ms !important;
  will-change: clip-path, opacity;
}
#header .menu_head .categories_list .dropdown:hover .dropdown-menu,
#header .menu_head .categories_list .dropdown:focus-within .dropdown-menu {
  opacity: 1 !important;
  visibility: visible !important;
  pointer-events: auto !important;
  clip-path: inset(0 0 0 0) !important;
  transition:
    opacity 200ms ease-out,
    clip-path 320ms cubic-bezier(.4, 0, .2, 1),
    visibility 0s linear 0s !important;
}
#header .menu_head .categories_list .dropdown .dropdown-menu,
#header .menu_head .categories_list .dropdown .dropdown-menu * {
  font-family: var(--pepfer-sans) !important;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}
#header .menu_head .categories_list .dropdown .dropdown-menu .see-all,
#header .menu_head .categories_list .dropdown .dropdown-menu li a {
  font-weight: 400 !important;
  font-synthesis: none;
  letter-spacing: .01em !important;
}
#header .menu_head .categories_list .dropdown .dropdown-menu .see-all {
  font-size: 12px !important;
  line-height: 1.45 !important;
  font-weight: 400 !important;
  /* Курсивом: строка стоит над списком и говорит не о разделе, а о том, что
     со списком делать. Начертание куплено, подделывать наклон не нужно. */
  font-style: italic !important;
  letter-spacing: .06em !important;
  margin-bottom: 14px !important;
}
#header .menu_head .categories_list .dropdown .dropdown-menu li a {
  font-size: 12px !important;
  line-height: 1.55 !important;
}
@media (prefers-reduced-motion: reduce) {
  #header .menu_head .categories_list .dropdown .dropdown-menu,
  #header .menu_head .categories_list .dropdown:hover .dropdown-menu,
  #header .menu_head .categories_list .dropdown:focus-within .dropdown-menu {
    transition: none !important;
    transform: none !important;
  }
}

/* Block 7 — Новинки (new arrivals single-row carousel). */
.new-arrivals {
  margin-top: clamp(48px, 7vw, 96px);
  margin-bottom: clamp(48px, 7vw, 96px);
}
.new-arrivals__head {
  display: flex;
  align-items: baseline;
  gap: 24px;
  margin-bottom: 32px;
}
.new-arrivals__title {
  font-family: var(--pepfer-serif);
  font-weight: 400;
  font-size: clamp(24px, 2.6vw, 32px);
  line-height: 1.15;
  margin: 0;
  color: var(--pepfer-ink);
}
/* The slider is inset so the arrows have their own gutters and never cover a
   product image. */
.new-arrivals__viewport {
  position: relative;
  padding: 0 52px;
}
/* Centred on the slider, not the head: top:50% of the viewport wrapper. */
/* Стрелки ленты — ниже, в своём разделе: они собраны из чёрточек, и правил у
   них больше, чем помещается между соседними блоками. */
.carousel-arrow.swiper-button-disabled {
  opacity: .3;
  cursor: default;
  pointer-events: none;
}
.new-arrivals__slider {
  overflow: hidden;
}
.new-arrivals__card {
  display: flex;
  flex-direction: column;
}
.new-arrivals__image {
  display: block;
  aspect-ratio: 3 / 4;
  background: var(--pepfer-soft);
  overflow: hidden;
  margin-bottom: 16px;
}
.new-arrivals__image img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  transition: transform 400ms ease;
}
.new-arrivals__image:hover img {
  transform: scale(1.03);
}
.new-arrivals__name {
  font-family: var(--pepfer-sans);
  font-size: 14px;
  font-weight: 400;
  line-height: 1.4;
  color: var(--pepfer-ink);
  text-decoration: none;
  text-align: left;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.new-arrivals__price {
  font-family: var(--pepfer-sans);
  font-size: 14px;
  font-weight: 600;
  color: var(--pepfer-ink);
  margin-top: 6px;
  text-align: left;
  font-variant-numeric: tabular-nums;
}
.new-arrivals__price-new {
  color: var(--pepfer-accent-deep);
}
.new-arrivals__price-old {
  color: var(--pepfer-muted);
  text-decoration: line-through;
  margin-left: 6px;
  font-weight: 400;
}
@media (max-width: 767px) {
  .new-arrivals__head { margin-bottom: 20px; }
}

/* Block 5 — Блог/журнал (editorial full-width rows, reused for collections). */
.editorial-block {
  margin-top: clamp(48px, 7vw, 96px);
  margin-bottom: clamp(48px, 7vw, 96px);
}
.editorial-row {
  position: relative;
  display: grid;
  grid-template-columns: 1.1fr 1fr;
  align-items: center;
  /* Просвет внутри строки меньше просвета между строками — иначе описание
     висит ровно посередине между своим снимком и чужим заголовком, и
     непонятно, к чему оно относится. Здесь примерно втрое меньше. */
  gap: clamp(20px, 2.6vw, 40px);
  text-decoration: none;
  color: var(--pepfer-ink);
}
.editorial-row + .editorial-row {
  margin-top: clamp(72px, 9vw, 128px);
}
.editorial-row__media {
  aspect-ratio: 4 / 3;
  background: var(--pepfer-soft);
  overflow: hidden;
}
.editorial-row__media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  transition: transform 500ms ease;
}
.editorial-row:hover .editorial-row__media img {
  transform: scale(1.02);
}
.editorial-row__eyebrow {
  display: block;
  font-family: var(--pepfer-sans);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--pepfer-muted);
  margin-bottom: 16px;
}
.editorial-row__title {
  font-family: var(--pepfer-serif);
  font-weight: 400;
  font-size: clamp(26px, 3vw, 40px);
  line-height: 1.15;
  margin: 0 0 16px;
  color: var(--pepfer-ink);
}
.editorial-row__subtitle {
  font-family: var(--pepfer-sans);
  font-size: 15px;
  line-height: 1.65;
  color: var(--pepfer-muted);
  margin: 0 0 20px;
  max-width: 44ch;
}
/* «Далее» под текстом коллекции.
   -----------------------------------------------------------------------
   Черта стояла в восьми пикселях от букв: межстрочный интервал строки — 24
   пикселя при кегле 12, и шесть из них приходились на пустоту под глифами,
   куда и опускалась граница. Интерлиньяж сведён к кеглю, и остаётся только
   заданный просвет.

   Подчёркивание здесь то же, что у ссылок всего сайта: бледная линия в покое
   и своя краска, набегающая слева при наведении. Своим правилом, а не общим:
   ссылка — вся строка целиком, и система подчёркиваний её намеренно обходит,
   иначе черта тянулась бы под всей карточкой. */
.editorial-row__link {
  display: inline-block;
  font-family: var(--pepfer-sans);
  font-size: 12px;
  font-weight: 600;
  line-height: 1;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--pepfer-ink);
  background-image:
    linear-gradient(to right, currentColor, currentColor),
    linear-gradient(to right, var(--pepfer-underline-rest), var(--pepfer-underline-rest));
  background-size: 0 1px, 100% 1px;
  background-position: 0 100%, 0 100%;
  background-repeat: no-repeat;
  padding-bottom: 3px;
  transition: background-size var(--pepfer-underline-speed, 240ms) ease-out;
}

/* Линия набегает, когда указатель на самой надписи, а не где угодно в строке:
   строка — ссылка целиком, и от наведения на снимок черта дёргалась бы в
   стороне от курсора.

   Клавиатурный обход — исключение: там рамку получает вся строка, и подсветить
   надпись больше нечем. */
/* Нажатие по всей строке. Раньше строка сама была ссылкой; теперь её роль
   играет невидимая область, растянутая от «Далее» на всю строку. Так внутри
   строки может стоять проигрыватель — ссылка в ссылке недопустима, и браузер
   разбирал такую строку на куски. */
.editorial-row__link::after {
  content: '';
  position: absolute;
  inset: 0;
  z-index: 1;
}

/* Подчёркивание отзывается и на наведение мышью где угодно по строке — раньше
   это делала сама ссылка-обёртка. */
.editorial-row:hover .editorial-row__link,
.editorial-row__link:hover,
.editorial-row__link:focus-visible {
  background-size: 100% 1px, 100% 1px;
}

/* Проигрыватель лежит выше области нажатия: иначе его кнопки не нажать. */
.editorial-row--video .editorial-row__media {
  position: relative;
  z-index: 2;
}

@media (prefers-reduced-motion: reduce) {
  .editorial-row__link { transition: none; }
}
@media (max-width: 767px) {
  .editorial-row { grid-template-columns: 1fr; gap: 16px; }
  .editorial-row + .editorial-row { margin-top: 56px; }
}

/* Blog article page. */
/* Full content width, aligned to the site gutter like every other block. */
.blog-article__body { max-width: none; margin: 0; padding: 32px 0 64px; }
.blog-article__meta {
  font-family: var(--pepfer-sans);
  font-size: 12px;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--pepfer-muted);
  margin-bottom: 12px;
}
.blog-article__title {
  font-family: var(--pepfer-serif);
  font-weight: 400;
  font-size: clamp(28px, 4vw, 44px);
  line-height: 1.12;
  margin: 0 0 16px;
  color: var(--pepfer-ink);
}
.blog-article__subtitle {
  font-family: var(--pepfer-sans);
  font-size: 17px;
  line-height: 1.6;
  color: var(--pepfer-muted);
  margin: 0 0 32px;
}
.blog-article__image { margin-bottom: 32px; }
.blog-article__image img { width: 100%; height: auto; display: block; }
.blog-article__content {
  font-family: var(--pepfer-sans);
  font-size: 16px;
  line-height: 1.75;
  color: var(--pepfer-ink);
}
.blog-article__content img { max-width: 100%; height: auto; }
.blog-article__content p { margin: 0 0 20px; }

/* Block 6 — Страница коллекции. */
/* Разворот в две половины, как в карточке товара: слово слева, галерея
   справа — или наоборот, как выбрано в админке.
   -----------------------------------------------------------------------
   Прежде описание шло полосой во всю ширину, а плавающий снимок внутри
   текста то оставлял под собой поле в пол-экрана, то растягивал строку на
   полтораста знаков. Две колонки снимают и то и другое: текст держит свою
   меру сам, а высоту разворота задаёт та половина, которой больше.

   Порядок колонок меняется классом, а не порядком в разметке: в исходнике
   сначала заголовок и текст, и читалке достаётся связный документ, какую бы
   сторону ни выбрал сотрудник. */
.collection-spread {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: clamp(24px, 3vw, 56px);
  align-items: start;
  padding: 10px 0;
}

.collection-spread--left .collection-intro { order: 2; }
.collection-spread--left .collection-gallery { order: 1; }

/* Без галереи делить нечего: текст занимает полосу целиком, но меру строки
   держит — иначе вернулись бы те же полтораста знаков. */
.collection-spread:not(:has(.collection-gallery)) {
  display: block;
  max-width: 71ch;
}

@media (max-width: 767px) {
  .collection-spread {
    display: block;
    padding: 10px 0;
  }
}

.collection-intro {
  font-size: 15px;
  text-align: left;
}
.collection-intro::after { content: ''; display: block; clear: both; }

.collection-intro__text {
  --pepfer-gutter: clamp(20px, 2vw, 32px);

  font-family: var(--pepfer-sans);
  font-size: 15px;
  line-height: 1.6;
  color: var(--pepfer-ink);
}
.collection-intro__text p { margin: 0 0 1em; }
.collection-intro__text p:last-child { margin-bottom: 0; }

/* Внутри текста ролик и картинка обтекаются по-прежнему: сотрудник ставит их
   меткой со стороной или кнопкой выравнивания. В половине разворота они
   занимают её долю, а не полполосы — колонка здесь и так вдвое уже. */
.collection-intro__text .pepfer-video.pepfer-video--left,
.collection-intro__text .pepfer-video.pepfer-video--right,
.collection-intro__text img[style*="float"],
.collection-intro__text img.pepfer-float-left,
.collection-intro__text img.pepfer-float-right {
  width: 46% !important;
  max-width: none !important;
  height: auto !important;
  margin-top: 6px;
  margin-bottom: 18px;
}

.collection-intro__text img[style*="float: left"],
.collection-intro__text img[style*="float:left"],
.collection-intro__text img.pepfer-float-left {
  float: left;
  margin-left: 0;
  margin-right: var(--pepfer-gutter);
}

.collection-intro__text img[style*="float: right"],
.collection-intro__text img[style*="float:right"],
.collection-intro__text img.pepfer-float-right {
  float: right;
  margin-right: 0;
  margin-left: var(--pepfer-gutter);
}

@media (max-width: 767px) {
  .collection-intro__text .pepfer-video.pepfer-video--left,
  .collection-intro__text .pepfer-video.pepfer-video--right,
  .collection-intro__text img[style*="float"],
  .collection-intro__text img.pepfer-float-left,
  .collection-intro__text img.pepfer-float-right {
    float: none !important;
    width: 100% !important;
    margin: 0 0 18px !important;
  }
}

.collection-intro__title {
  font-family: var(--pepfer-serif);
  font-weight: 400;
  font-size: clamp(28px, 3.4vw, 42px);
  line-height: 1.15;
  margin: 0 0 16px;
  color: var(--pepfer-ink);
}
.collection-intro__subtitle {
  font-family: var(--pepfer-sans);
  font-size: 16px;
  color: var(--pepfer-muted);
  margin: 0 0 24px;
}

/* Галерея: плитки в строку, доля ширины у каждой своя.
   -----------------------------------------------------------------------
   Раскладку считает браузер: плитки идут подряд, пока хватает места, и
   переносятся, когда доли перестают складываться в сотню. Ровно этого и
   ждёт сотрудник, ставя 50 и 50 или 50 и 51.

   Просвет сделан полями внутри плиток, а не свойством gap: с gap две доли по
   пятьдесят уже не помещались бы в строку — сотня процентов плюс просвет
   шире колонки, и вторая плитка уезжала бы вниз вопреки написанному. Поля
   же входят в саму долю, а лишнее по краям снимает отрицательное поле
   галереи. Доли складываются ровно так, как их задал сотрудник. */
.collection-gallery {
  --pepfer-tile-gap: 12px;

  display: flex;
  flex-wrap: wrap;
  align-items: flex-start;
  margin: 0 calc(var(--pepfer-tile-gap) / -2);
}

.collection-gallery__tile {
  flex: 0 0 var(--pepfer-tile, 100%);
  max-width: var(--pepfer-tile, 100%);
  min-width: 0;
  padding: 0 calc(var(--pepfer-tile-gap) / 2);
  margin-bottom: var(--pepfer-tile-gap);
  box-sizing: border-box;
}

.collection-gallery__tile img {
  display: block;
  width: 100%;
  height: auto;
}

/* Ролик в плитке — во всю её ширину и без своих полей: рамку задаёт плитка.
   Класс продублирован: вертикальным роликам в pepfer-video.css задан свой
   предел ширины селектором с атрибутом, а тот весит больше одного класса. */
.collection-gallery__tile .pepfer-video.pepfer-video {
  width: 100%;
  max-width: none;
  margin: 0;
}

/* Plyr держит за проигрывателем двести пикселей ширины — при доле в четверть
   колонки он вылезал за плитку и накрывал соседнюю. Ширину задаёт плитка, а
   не проигрыватель: доля, написанная сотрудником, должна значить ровно то,
   что написано. */
.collection-gallery__tile .plyr {
  min-width: 0;
  max-width: 100%;
}

/* Узкой плитке нечем показывать время и громкость — кнопки налезли бы друг
   на друга. Прячутся они по ширине самой плитки, а не окна: в широком окне
   плитка бывает и в четверть колонки, а в узком — во всю. Широкая плитка
   сохраняет полный набор кнопок. */
.collection-gallery__tile {
  container-type: inline-size;
}

@container (max-width: 320px) {
  .plyr__time,
  .plyr__volume,
  .plyr__menu {
    display: none;
  }
}

@media (max-width: 767px) {
  .collection-gallery { margin-top: 24px; }

  /* На телефоне доли не делятся: плитка в треть ширины на экране в триста
     пикселей — это сто пикселей, разглядеть нечего. */
  .collection-gallery__tile {
    flex-basis: 100%;
    max-width: 100%;
  }
}

/* Коллекция на главной, у которой ещё нет обложки: пустая половина строки
   читалась бы как несработавшая картинка. Пока обложки нет, слово занимает
   строку целиком. */
/* Коллекция, у которой ещё нет обложки.
   -----------------------------------------------------------------------
   Строка развёрнута под большой снимок: без него половина её пустует, а
   чередование сторон разбрасывает заголовки по всей ширине — читается как
   поломка, а не как замысел.

   Пока обложки нет, строка становится короткой записью в столбик: одна
   колонка, выключка влево, шаг между строками вдвое меньше. Появится снимок
   — строка сама вернётся к развороту, править ничего не нужно. */
.editorial-row--textonly {
  grid-template-columns: minmax(0, 1fr);
  gap: 0;
  padding-bottom: 20px;
  border-bottom: 1px solid var(--pepfer-line);
}

.editorial-row--textonly .editorial-row__media { display: none; }

.editorial-row--textonly .editorial-row__text {
  width: 100%;
  max-width: 100%;
  text-align: left;
}

/* Чередование сторон задаётся скриптом; здесь оно ни к чему — колонка одна.
   Селектор длиннее, чем хотелось бы: правило чередования ниже по файлу и
   весит четыре класса, коротким его не перебить. */
.editorial-block .editorial-row.editorial-row--textonly.is-reversed .editorial-row__text {
  text-align: left;
}

.editorial-row--textonly + .editorial-row--textonly {
  margin-top: 20px;
}

/* ---- Просветы блока коллекций -------------------------------------------
   Вдвое меньше, чем у журнала: у журнала строк три-четыре и каждая с большой
   обложкой, а коллекций дюжина, и прежний воздух растягивал главную на
   несколько экранов пустоты.

   Значения повторяют журнальные, поделённые пополам: 96 → 48 сверху и снизу
   блока, 88 → 44 между строками. Мера в vw уменьшена так же, чтобы на широком
   экране просветы не разъезжались обратно. */
.editorial-block--collection {
  margin-top: clamp(24px, 3.5vw, 48px);
  margin-bottom: clamp(24px, 3.5vw, 48px);
}

/* Между строками — вдвое больше, чем внутри строки (там 33 пикселя на
   тысяче двухсот). Пока эти два просвета были почти равны, описание висело
   ровно посередине между своим снимком и чужим заголовком, и к чему оно
   относится, приходилось догадываться.

   До прежних восьмидесяти восьми не возвращаемся: коллекций дюжина, и такой
   воздух растягивал главную на несколько экранов пустоты. */
.editorial-block--collection .editorial-row + .editorial-row {
  margin-top: clamp(40px, 5vw, 72px);
}

/* Строки без обложки идут своим, ещё более тесным шагом — правило ниже по
   файлу, но вес у него меньше нового, поэтому оно повторено с той же
   приставкой блока. */
.editorial-block--collection .editorial-row--textonly + .editorial-row--textonly {
  margin-top: 32px;
}

@media (max-width: 767px) {
  /* На телефоне снимок и текст стоят друг под другом с просветом в
     шестнадцать пикселей — между коллекциями нужно заметно больше, иначе
     лента читается сплошняком. */
  .editorial-block--collection .editorial-row + .editorial-row {
    margin-top: 44px;
  }
}

/* ---- Коллекция на главной с описанием ------------------------------------
   Флаг в форме коллекции добавляет к строке вводный текст. Без обложки такая
   строка занимает всю ширину — но текст держит свою меру, иначе строка
   растянулась бы на полтораста знаков и читать её стало бы нечем. */
.editorial-row--wide .editorial-row__intro {
  margin: 12px 0 0;
  max-width: 62ch;
  font-family: var(--pepfer-sans);
  font-size: 15px;
  line-height: 1.6;
  color: var(--pepfer-ink);
}

.editorial-row--wide .editorial-row__intro p { margin: 0 0 .8em; }
.editorial-row--wide .editorial-row__intro p:last-child { margin-bottom: 0; }

/* С описанием строка перестаёт быть короткой записью: ей нужен воздух, но не
   тот, что у строки с большим снимком. */
.editorial-row--textonly.editorial-row--wide {
  padding-bottom: 28px;
}

.editorial-block--collection .editorial-row--textonly.editorial-row--wide + .editorial-row--textonly,
.editorial-row--textonly.editorial-row--wide + .editorial-row--textonly {
  margin-top: 28px;
}

/* ---- Вложенные подборки на странице коллекции ---------------------------- */
.collection-children {
  padding: 8px 0 12px;
}

.collection-children .editorial-row + .editorial-row {
  margin-top: 28px;
}

/* ---- Блок «Коллекция» в карточке товара ---------------------------------- */
.products_related_collection .products_related__title a {
  color: inherit;
  text-decoration: none;
  border-bottom: 1px solid var(--pepfer-line);
}

.products_related_collection .products_related__title a:hover {
  border-bottom-color: var(--pepfer-ink);
}

.collection-products {
  padding-top: 20px;
  padding-bottom: clamp(48px, 7vw, 96px);
}
.collection-products__title {
  font-family: var(--pepfer-serif);
  font-weight: 400;
  font-size: clamp(22px, 2.4vw, 28px);
  /* Поля нет вовсе: у карточек товара свой отступ сверху, и вместе с полем
     заголовка он читался как разрыв между заголовком и тем, что он называет. */
  margin: 0;
  color: var(--pepfer-ink);
}

/* ---- Main menu rules ------------------------------------------------------ */
/* Both dividers are permanent. The bottom one especially: if it only appeared
   with an open panel, the page would shift by a pixel on every hover.
   !important because an earlier cleanup block zeroes borders across the header. */
#header .menu_head {
  border-top: 1px solid var(--pepfer-line) !important;
  border-bottom: 1px solid var(--pepfer-line) !important;
}
/* The links span the full height of the bar, so their underline can be pinned to
   the bar's own bottom edge rather than floating somewhere above it. */
#header .menu_head > .container {
  padding-top: 0 !important;
  padding-bottom: 0 !important;
}
#header .menu_head .categories_list {
  align-items: stretch !important;
  min-height: 0 !important;
}
#header .menu_head .categories_list > li {
  display: flex !important;
  align-items: stretch !important;
}
#header .menu_head .categories_list > li > a {
  position: relative !important;
  border-bottom: 0 !important;
  padding-top: 0 !important;
}
/* Полоса меню была на 10px выше своего содержимого: пункты укоротили до 46px
   («Slightly shorter menu bar» ниже), а саму полосу оставили 56px, и запас снизу
   стоял пустым. Выпадающая панель раскрывается от низа полосы, метка же лежала у
   низа пункта — на те самые 10px выше. Отсюда и впечатление, что тонкая линия
   «расширяется вниз»: сразу под ней начинала разворачиваться панель. Полоса
   укорочена до высоты пунктов — метка и панель теперь на одной черте. */
#header .menu_head {
  min-height: 46px;
}

/* Ни растягивания слева направо, ни изменения толщины: линия появляется целиком
   и сразу на своём месте. Меняется только её видимость. */
#header .menu_head .categories_list > li > a::after {
  content: '' !important;
  display: block !important;
  position: absolute !important;
  left: 0 !important;
  right: 0 !important;
  /* Черту покоя под полосой рисует псевдоэлемент контейнера: нулевая высота
     плюс верхняя граница в пиксель, прижатая к низу. Метка сделана точно так же
     и с тем же прижатием — значит, ложится в те же самые пиксели экрана, а не
     соседние. Прежде она была на пиксель ниже, и две черты впритык читались как
     одна вдвое толще. Черта на экране остаётся одна: под наведённым пунктом она
     просто темнее. */
  bottom: 0 !important;
  height: 0 !important;
  border-top: 1px solid var(--pepfer-ink) !important;
  background: none !important;
  transform: none;
  opacity: 0;
  transition: opacity 180ms ease-out;
}
#header .menu_head .categories_list > li:hover > a::after,
#header .menu_head .categories_list > li:focus-within > a::after,
#header .menu_head .categories_list > li.active > a::after {
  opacity: 1;
}
@media (prefers-reduced-motion: reduce) {
  #header .menu_head .categories_list > li > a::after { transition: none; }
  #header .menu_head .categories_list .dropdown .dropdown-menu,
  #header .menu_head .categories_list .dropdown:hover .dropdown-menu,
  #header .menu_head .categories_list .dropdown:focus-within .dropdown-menu { transition: none !important; }
}

/* The menu bar now owns the divider (border-bottom above), so the panel's own
   inset rule is redundant: it rendered as a second, shorter line whose ends
   showed as stray segments beside the bar. */
#header .menu_head .categories_list .dropdown .dropdown-menu::before,
#header .menu_head .categories_list .dropdown:hover .dropdown-menu::before,
#header .menu_head .categories_list .dropdown:focus-within .dropdown-menu::before {
  display: none !important;
  content: none !important;
}

/* The divider is now drawn inside .menu_head > .container (see below), so the bar
   itself has no border and the panel can sit flush at 100%: the line stays visible
   above it and no gap opens between them. */
#header .menu_head .categories_list .dropdown .dropdown-menu,
#header .menu_head .categories_list .dropdown:hover .dropdown-menu,
#header .menu_head .categories_list .dropdown:focus-within .dropdown-menu {
  top: 100% !important;
}

/* ---- Divider alignment ----------------------------------------------------
   The outer .container_full has no horizontal padding while the inner .container
   has 15px, so a border on the outer element ran 15px wider than the content on
   each side. Moving the border to the inner container would not help: padding sits
   inside the border box. Drawing the rules as inset pseudo-elements instead makes
   them start and end exactly where the content does. */
#header .menu_head {
  border-top: 0 !important;
  border-bottom: 0 !important;
}
#header .menu_head > .container {
  position: relative !important;
}
#header .menu_head > .container::before,
#header .menu_head > .container::after {
  content: '' !important;
  display: block !important;
  position: absolute !important;
  left: var(--pepfer-gutter) !important;
  right: var(--pepfer-gutter) !important;
  height: 0 !important;
  border-top: 1px solid var(--pepfer-line) !important;
  background: none !important;
  pointer-events: none;
}
#header .menu_head > .container::before { top: 0 !important; }
#header .menu_head > .container::after { bottom: 0 !important; }

/* Подвал не должен начинаться сразу за последней карточкой: на странице
   каталога между списком товаров и линией подвала оставался один пиксель.
   Двадцать — минимум, при котором линия читается как граница раздела, а не
   как подчёркивание последней цены.

   Поле у самого подвала, а не у списка: списков на сайте несколько, и у
   каждого свои отступы снизу; граница же одна. */
footer { margin-top: 20px; }

.footer_menu {
  position: relative;
  border-top: 0 !important;
}
.footer_menu::before {
  content: '';
  position: absolute;
  top: 0;
  left: var(--pepfer-gutter);
  right: var(--pepfer-gutter);
  height: 0;
  border-top: 1px solid var(--pepfer-line);
  background: none;
  pointer-events: none;
}

/* Общий зелёный ховер кнопок темы стрелкам ленты не нужен: они не залиты. */
.carousel-arrow:hover,
.carousel-arrow:focus { background: transparent; color: var(--pepfer-ink); outline: none; }

/* Social links as icons. */
.footer_menu .footer-column .footer-social { display: flex; flex-wrap: wrap; gap: 14px; align-items: center; }
.footer-social__link { display: inline-flex; align-items: center; justify-content: center; width: 22px; height: 22px; color: var(--pepfer-ink); transition: opacity 160ms ease; }
.footer-social__link svg { width: 20px; height: 20px; display: block; }
/* Hover moves opacity, not colour: the brand marks carry their colour in the file,
   so a colour change would apply to the VK glyph only and break the match. */
.footer-social__link:hover,
.footer-social__link:focus { opacity: .65; outline: none; }

/* 2. Slightly shorter menu bar. */
#header .menu_head .categories_list,
#header .menu_head .categories_list > li,
#header .menu_head .categories_list > li > a { min-height: 46px !important; }

@media (max-width: 767px) {
  .new-arrivals__viewport { padding: 0 40px; }
}

/* The panel is full-bleed, but its contents must line up with the page grid.
   Previously its inner container used fixed 48px side margins while page content
   is centred inside max-width:1320px — so the two only agreed at one viewport
   width and drifted badly on wide screens. Give it the same geometry as
   .container instead: same cap, same auto margins, same gutter. */
#header .menu_head .categories_list .dropdown .dropdown-menu > .container {
  width: 100% !important;
  max-width: 1320px !important;
  margin-left: auto !important;
  margin-right: auto !important;
  padding-left: var(--pepfer-gutter) !important;
  padding-right: var(--pepfer-gutter) !important;
}
/* Left-aligned inside that container: the max-width stays for readability, but
   the block starts at the content edge rather than being centred. */
#header .menu_head .categories_list .dropdown .dropdown-menu .dropdown-inner {
  margin-left: 0 !important;
  margin-right: 0 !important;
}
#header .menu_head .categories_list .dropdown .dropdown-menu .see-all {
  margin-left: 0 !important;
}

/* ---- Footer newsletter ---------------------------------------------------- */
.footer-subscribe__form { margin-top: 4px; }
.footer-subscribe__row {
  display: flex;
  align-items: center;
  gap: 8px;
  border-bottom: 1px solid var(--pepfer-line);
  padding-bottom: 6px;
}
.footer-subscribe__input {
  flex: 1 1 auto;
  min-width: 0;
  box-sizing: border-box;
  background: transparent;
  border: 0;
  padding: 0;
  color: var(--pepfer-ink);
  font-family: var(--pepfer-sans);
  font-size: 13px;
  line-height: 1.6;
}
.footer-subscribe__input:focus { outline: none; }
.footer-subscribe__input::placeholder { color: var(--pepfer-muted); }
/* Explicit background/colour: the theme's global button rule paints every button
   dark with a green hover, which would swamp a bare arrow here. */
.footer-subscribe__submit {
  flex: none;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 24px;
  height: 24px;
  margin: 0;
  padding: 0;
  border: 0;
  background: transparent;
  color: var(--pepfer-ink);
  cursor: pointer;
}
.footer-subscribe__submit:hover,
.footer-subscribe__submit:focus { background: transparent; color: var(--pepfer-accent); outline: none; }
.footer-subscribe__submit[disabled] { opacity: .4; cursor: default; }
.footer-subscribe__submit svg { width: 16px; height: 16px; display: block; }
.footer-subscribe__consent {
  display: flex;
  align-items: flex-start;
  gap: 8px;
  margin-top: 12px;
  color: var(--pepfer-muted);
  font-family: var(--pepfer-sans);
  font-size: 11px;
  line-height: 1.45;
  cursor: pointer;
}
.footer-subscribe__consent input { flex: none; margin: 2px 0 0; }
.footer-subscribe__message {
  margin-top: 10px;
  font-family: var(--pepfer-sans);
  font-size: 11px;
  line-height: 1.45;
  min-height: 1em;
}
.footer-subscribe__message.is-error { color: var(--pepfer-accent-deep); }
.footer-subscribe__message.is-success { color: var(--pepfer-ink); }

/* Text-label social entries (MAX, Сделано в Москве) until their official logo
   files are supplied. Deliberately not borrowing another brand's glyph. */
.footer-social__link--text {
  width: auto;
  height: auto;
  font-family: var(--pepfer-sans);
  font-size: 11px;
  line-height: 1.4;
  letter-spacing: .04em;
  white-space: nowrap;
}

/* Brand marks are supplied as files and rendered as <img>, not inlined: MAX ships
   with a mask, clip-path and filter carrying fixed ids, and the social list is
   output twice (desktop footer + mobile menu), which would duplicate those ids.
   Colours are left as delivered — MAX is monochrome black, the Moscow badge is a
   certification mark whose red is part of its meaning. */
.footer-social__link { width: auto; }
.footer-social__link img { display: block; width: auto; }
.footer-social__link[aria-label="MAX"] img { height: 18px; }
.footer-social__link[aria-label="Сделано в Москве"] img { height: 26px; }
.footer-social__link[aria-label="MAX"],
.footer-social__link[aria-label="Сделано в Москве"] { height: auto; }
.footer_menu .footer-column .footer-social { align-items: center; gap: 16px; }

/* ---- Newsletter form: override the theme's global form styling ---------------
   style.css styles inputs by attribute (input[type="email"] etc), which outranks a
   plain class — the field was picking up its border, white fill, 17px type and
   padding. These selectors match that specificity and win on order. Checkboxes are
   caught by a width:100% rule elsewhere, which is what stretched the consent box
   across the whole column. */
.footer-subscribe .footer-subscribe__form input[type="email"] {
  width: 100%;
  box-sizing: border-box;
  background: transparent;
  border: 0;
  border-radius: 0;
  padding: 0;
  color: var(--pepfer-ink);
  font-family: var(--pepfer-sans);
  font-size: 13px;
  line-height: 1.6;
  transition: none;
}
.footer-subscribe .footer-subscribe__form input[type="email"]:hover,
.footer-subscribe .footer-subscribe__form input[type="email"]:focus {
  border: 0;
  box-shadow: none;
  outline: none;
  background: transparent;
}
.footer-subscribe .footer-subscribe__form input[type="checkbox"] {
  width: 13px;
  height: 13px;
  min-width: 13px;
  flex: none;
  margin: 1px 0 0;
  padding: 0;
  accent-color: var(--pepfer-ink);
}
.footer-subscribe__consent { align-items: flex-start; }
.footer-subscribe__consent span { flex: 1 1 auto; min-width: 0; }

/* Stray rule colours normalised onto the theme token, so every hairline on the
   page is the same 1px in the same grey. style.css uses #e2e8f0 in three places,
   one of them with !important, so these match its specificity and follow it. */
.mobile_menu .footer_mobile_menu .block_other,
.mobile_menu .footer_mobile_menu .block .accordion { border-color: var(--pepfer-line) !important; }

/* Social links sit inside .footer-column, whose `a` rule (a class plus an element,
   so heavier than a bare class) was colouring the VK glyph muted and adding an
   underline on hover — which is why it looked different from the image marks and
   appeared to flicker between states. */
.footer_menu .footer-column .footer-social .footer-social__link {
  color: var(--pepfer-ink);
  text-decoration: none;
}
.footer_menu .footer-column .footer-social .footer-social__link:hover,
.footer_menu .footer-column .footer-social .footer-social__link:focus {
  color: var(--pepfer-ink);
  text-decoration: none;
  opacity: .65;
}

/* Third-level categories in the mega menu. */
.menu_head .categories_list .dropdown .dropdown-menu .sub-children {
  list-style: none;
  margin: 6px 0 0;
  padding: 0 0 0 12px;
}
#header .menu_head .categories_list .dropdown .dropdown-menu .sub-children li {
  margin: 0 0 4px;
}
#header .menu_head .categories_list .dropdown .dropdown-menu .sub-children li a {
  color: var(--pepfer-muted) !important;
  font-size: 12px !important;
}
#header .menu_head .categories_list .dropdown .dropdown-menu .sub-children li a:hover {
  color: var(--pepfer-ink) !important;
}

/* The legacy rule pins .sub-children as an absolutely positioned flyout
   (left:310px, width:500px, min-height:400px) left over from the old design —
   that is what threw the third-level items across the other columns. It carries
   six classes, so this needs the #header prefix to outrank it. Third level is now
   a plain nested list under its parent: no overlap, and nothing to show or hide. */
#header .menu_head .categories_list .dropdown .dropdown-menu .dropdown-inner ul li .sub-children {
  position: static !important;
  display: block !important;
  left: auto !important;
  top: auto !important;
  width: auto !important;
  min-height: 0 !important;
  background: none !important;
  list-style: none !important;
  margin: 6px 0 10px !important;
  padding: 0 0 0 12px !important;
  border-left: 1px solid var(--pepfer-line);
}

/* ---- Editorial rows -------------------------------------------------------- */
/* Title aligns with the top of the image instead of being centred against it. */
.editorial-block .editorial-row { align-items: start; }
/* Alternating sides. The class is assigned in JS by document order rather than by
   :nth-child, because blog and collections are separate <section>s — nth-child
   restarts in each one and would put two images on the same side at the seam. */
.editorial-block .editorial-row.is-reversed .editorial-row__media { grid-column: 2; grid-row: 1; }
.editorial-block .editorial-row.is-reversed .editorial-row__text { grid-column: 1; grid-row: 1; }
@media (max-width: 767px) {
  .editorial-block .editorial-row.is-reversed .editorial-row__media,
  .editorial-block .editorial-row.is-reversed .editorial-row__text { grid-column: 1; grid-row: auto; }
}

/* ---- Editorial rows: natural image proportions ------------------------------
   The 4/3 box with object-fit:cover forced every photo into the same crop. Images
   now keep their own ratio, so the column height follows the picture and the two
   columns simply start together at the top. */
.editorial-block .editorial-row__media {
  aspect-ratio: auto;
  background: none;
}
.editorial-block .editorial-row__media img {
  width: 100%;
  height: auto;
  object-fit: fill;
}
/* Mirrored rows mirror their text too, otherwise the copy drifts away from the
   image it belongs to. */
.editorial-block .editorial-row.is-reversed .editorial-row__text { text-align: right; }
.editorial-block .editorial-row.is-reversed .editorial-row__subtitle { margin-left: auto; }
@media (max-width: 767px) {
  .editorial-block .editorial-row.is-reversed .editorial-row__text { text-align: left; }
  .editorial-block .editorial-row.is-reversed .editorial-row__subtitle { margin-left: 0; }
}

/* Коллекция со снимком справа: всё прижато к правому краю колонки.
   -----------------------------------------------------------------------
   Выключка вправо в такой строке была всегда, но в одну линию текст не
   вставал: у вводного текста своя мера (62 знака), а коробка с ней прижималась
   к левому краю колонки. Строки внутри выключались вправо — но по правому
   краю этой коробки, а он на сотню пикселей левее заголовка. Получалось две
   правые границы вместо одной.

   Коробка отправлена вправо автоматическим полем — мера сохраняется, а край
   совпадает с заголовком, подзаголовком и «Далее».

   Пять классов в отборе — против правила выше: оно тоже длинное и стоит
   позже, коротким его не перебить. */
.editorial-block.editorial-block--collection .editorial-row.is-reversed .editorial-row__intro {
  margin-left: auto;
  margin-right: 0;
}

@media (max-width: 767px) {
  /* На телефоне снимок и текст идут друг под другом, зеркалить нечего. */
  .editorial-block.editorial-block--collection .editorial-row.is-reversed .editorial-row__intro {
    margin-left: 0;
  }
}

/* Collection page cards: slightly quieter type so the photography leads. */
.collection-products .products .block .title a { font-size: 13px; line-height: 1.4; }
.collection-products .products .block .price { font-size: 13px; margin-top: 6px; }

/* ---- Category page --------------------------------------------------------
   The heading repeated the menu item the visitor just clicked and, at 38px, read
   as a second logo. It stays in the markup for document structure and search
   engines, but is removed from view; the breadcrumb now carries the wayfinding. */
#product-category h1 {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}
/* Breadcrumbs, not scoped to the category page: every route draws the same list,
   and they should read alike. style.css had them uppercase at 14px with 1px of
   tracking — that is what made them look heavy. Sentence case, lighter, wider. */
.breadcrumb {
  align-items: center;
  gap: 14px;
  /* Сверху поля не было вовсе — строка прижималась к полосе меню, а снизу
     висело 20px. Поля равные, по 10px: строка стоит в своём просвете, а не
     липнет ни к меню сверху, ни к тексту снизу. */
  margin: 10px 0;
  padding: 0;
  list-style: none;
  font-family: var(--pepfer-sans);
}
.breadcrumb li {
  align-items: center;
  font-size: 11px;
  font-weight: 300;
  line-height: 1.4;
  letter-spacing: .02em;
  text-transform: none;
}
/* style.css already draws a separator with li::after; adding one of our own gave
   "ГЛАВНАЯ / / СУМКИ". Restyle the existing one instead of adding a second.
   A glyph chevron is only as thin as the font cuts it, so draw it instead: two
   1px borders on a rotated square give an exact stroke width and an exact
   height, independent of whichever face ends up loading. */
.breadcrumb li::after {
  content: '';
  width: 6px;
  height: 6px;
  margin: 0 0 0 16px;
  border-right: 1px solid #C4C0BA;
  border-top: 1px solid #C4C0BA;
  transform: rotate(45deg);
  transform-origin: center;
  align-self: center;
  position: relative;
  top: -1px; /* optical centring: the rotated square hangs slightly low */
}
.breadcrumb a { color: var(--pepfer-muted); text-decoration: none; transition: color .2s ease; }
.breadcrumb li:last-child a { color: var(--pepfer-ink); }
.breadcrumb a:hover { color: var(--pepfer-ink); }

/* The sidebar is gone, so the filter row is a plain stack again: sort bar on top,
   grid below, both full width. */
#product-category .products_filter { display: block; }
#product-category .results_sort {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  flex-wrap: wrap;
  margin: 0 0 5px;
  font-family: var(--pepfer-sans);
  font-size: 13px;
  color: var(--pepfer-muted);
}
#product-category .results_sort .sort { display: flex; align-items: center; gap: 10px; }
#product-category .results_sort .sort select {
  border: 0;
  border-bottom: 1px solid var(--pepfer-line);
  border-radius: 0;
  background: transparent;
  padding: 4px 0;
  font-family: var(--pepfer-sans);
  font-size: 13px;
  color: var(--pepfer-ink);
}

/* Product names sat in FuturaNowHeadline-Medium, the same face and weight as the
   main menu, so the grid shouted as loudly as the navigation. */
.products .block .title a,
.product-thumb .caption h4 a {
  font-family: var(--pepfer-sans);
  font-size: 13px;
  font-weight: 400;
  line-height: 1.45;
  letter-spacing: .02em;
  text-transform: none;
}
.products .block .price {
  font-family: var(--pepfer-sans);
  font-weight: 500;
  letter-spacing: .02em;
}

/* Подложка под фотографией товара.
   -----------------------------------------------------------------------
   Была тёплая кремовая (#FCFBF8): рядом со снимками на чистом белом она
   отдавала желтизной, поэтому её сделали нейтральной, как и волосяные линии.

   Теперь она белая. Причина не в цвете, а в том, что сквозь неё видно: часть
   снимков каталога — PNG с прозрачностью, и квадратный кадр OpenCart дополняет
   до пропорций плитки прозрачными полями. Серая подложка проступала в них
   полосами сверху и снизу — так, будто у вещи обрезан фон. Белая совпадает и
   с полем страницы, и с фоном самих съёмок, и полос не видно.

   Снимки, которые заполняют кадр целиком, подложку закрывают: для них ничего
   не изменилось. */
.products .block .images,
.products .block .image,
.product-thumb .image {
  background: var(--pepfer-paper, #FFFFFF);
}

/* style.css fades the main image out on hover so a second photo can take its
   place — but it does that whether or not a second photo exists. Where there is
   none the card simply empties out onto the placeholder. Restore the fade only
   for cards that actually carry a swap image. */
.products .block .images:hover img.main-image {
  opacity: 1;
}
.products .block .images:has(img.swap-image):hover img.main-image {
  opacity: 0;
}

/* Wishlist toggle: was a 34px solid-black heart sitting flush in the corner and
   competing with the product itself. Smaller, inset, and quiet until pointed at. */
.products .block .favorite_button {
  width: 20px;
  height: 20px;
  top: 10px;
  right: 10px;
  opacity: .38;
  transition: opacity .2s ease;
}
.products .block .favorite_button:hover,
.products .block:hover .favorite_button {
  opacity: .75;
}
.products .block .favorite_button:hover {
  opacity: 1;
}

/* style.css sets the card price in FuturaNowHeadline-Medium with 1px tracking —
   a display weight on a number, which shouted over the product name. The price
   is information, not a headline: same family as the name, one step quieter. */
.products .block .price,
.product-thumb .price {
  font-family: var(--pepfer-sans);
  font-size: 13px;
  font-weight: 400;
  line-height: 1.4;
  letter-spacing: .01em;
  color: var(--pepfer-muted);
}

/* Discounted products: the old price stays, struck through and receding; the new
   price carries the accent so the reduction reads at a glance. */
.products .block .price .price-new,
.product-thumb .price .price-new {
  color: var(--pepfer-accent);
  margin-right: 8px;
}
.products .block .price .price-old,
.product-thumb .price .price-old {
  color: var(--pepfer-line);
  text-decoration: line-through;
}

/* style.css nails .header_full to 143px (media.css to 100px). The block inside
   is a logo row plus a menu row whose real height depends on the viewport — on
   a narrow window it outgrows the box and spills over whatever follows, which
   is what buried the breadcrumbs even at zero scroll. Let it size itself. */
.header_full,
#header .header_full,
#header .header_full.fixed_menu {
  height: auto !important;
  overflow: visible;
}

/* Comparison on the product page: a text link, not a third button competing
   with "Купить". It is the only entry point left now the listings dropped it. */
.pepfer-compare-link {
  display: inline-block;
  margin-top: 14px;
  padding: 0;
  border: 0;
  background: none;
  font-family: var(--pepfer-sans);
  font-size: 12px;
  letter-spacing: .04em;
  color: var(--pepfer-muted);
  text-decoration: none;
  border-bottom: 1px solid var(--pepfer-line);
  cursor: pointer;
  transition: color .2s ease, border-color .2s ease;
}
.pepfer-compare-link:hover {
  color: var(--pepfer-ink);
  border-bottom-color: var(--pepfer-ink);
}

/* Wishlist stays permanently visible, so its purpose is discoverable without
   hovering — just held below the product in contrast. */
.products .block .favorite_button {
  opacity: .55;
}
.products .block:hover .favorite_button {
  opacity: .8;
}
.products .block .favorite_button:hover {
  opacity: 1;
}

/* The struck-through price was set in --pepfer-line (#E4E4E4) — a colour meant
   for hairlines, not text; on white it was barely legible. It should recede,
   not vanish: the customer needs to read what the saving is. */
.products .block .price .price-old,
.product-thumb .price .price-old,
.product_block .right .price_list .price-old {
  color: #A8A29A;
  font-size: 12px;
}

/* Product page: the reduced price carries the same accent as in the grid. */
.product_block .right .price_list .special-price {
  color: var(--pepfer-accent);
}

/* ---- Filter bar ------------------------------------------------------- */
#product-category .results_sort {
  align-items: flex-start;
}
.pepfer-filters {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 8px;
}
.pepfer-filter {
  position: relative;
}
.pepfer-filter__toggle {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 9px 14px;
  border: 1px solid var(--pepfer-line);
  background: transparent;
  font-family: var(--pepfer-sans);
  font-size: 12px;
  font-weight: 400;
  letter-spacing: .04em;
  color: var(--pepfer-ink);
  cursor: pointer;
  transition: border-color .2s ease;
}
.pepfer-filter__toggle::after {
  content: '';
  width: 5px;
  height: 5px;
  margin-top: -3px;
  border-right: 1px solid var(--pepfer-muted);
  border-bottom: 1px solid var(--pepfer-muted);
  transform: rotate(45deg);
  transition: transform .2s ease, margin-top .2s ease;
}
.pepfer-filter.is-open .pepfer-filter__toggle::after {
  margin-top: 2px;
  transform: rotate(-135deg);
}
.pepfer-filter__toggle:hover { border-color: var(--pepfer-muted); }
.pepfer-filter.is-active .pepfer-filter__toggle {
  border-color: var(--pepfer-ink);
}

.pepfer-filter__panel {
  position: absolute;
  top: calc(100% + 6px);
  left: 0;
  z-index: 40;
  min-width: 200px;
  padding: 8px 0;
  border: 1px solid var(--pepfer-line);
  background: var(--pepfer-paper);
  box-shadow: 0 12px 28px rgba(0, 0, 0, .07);
  /* Collapsed by default so the bar reads as one row, not a wall of options. */
  display: none;
}
.pepfer-filter.is-open .pepfer-filter__panel { display: block; }

.pepfer-filter__option {
  display: block;
  padding: 8px 16px;
  font-family: var(--pepfer-sans);
  font-size: 12px;
  letter-spacing: .02em;
  color: var(--pepfer-muted);
  text-decoration: none;
  transition: color .2s ease, background-color .2s ease;
}
.pepfer-filter__option:hover { color: var(--pepfer-ink); background: var(--pepfer-soft); }
.pepfer-filter__option.is-selected {
  color: var(--pepfer-ink);
}
.pepfer-filter__option.is-selected::before {
  content: '×';
  margin-right: 8px;
  color: var(--pepfer-accent);
}

.pepfer-filter__reset {
  font-family: var(--pepfer-sans);
  font-size: 12px;
  letter-spacing: .04em;
  color: var(--pepfer-muted);
  text-decoration: none;
  border-bottom: 1px solid var(--pepfer-line);
  padding-bottom: 2px;
  margin-left: 6px;
}
.pepfer-filter__reset:hover { color: var(--pepfer-ink); border-bottom-color: var(--pepfer-ink); }

/* With no filters configured the bar is absent, so the sort control would drift
   left; keep it pinned right either way. */
#product-category .results_sort .sort { margin-left: auto; }

/* ---- Infinite scroll -------------------------------------------------- */
.pepfer-infinite-sentinel {
  width: 100%;
  height: 1px;
}
.pepfer-loading {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 12px;
  padding: 40px 0;
  font-family: var(--pepfer-sans);
  font-size: 12px;
  letter-spacing: .06em;
  color: var(--pepfer-muted);
}
.pepfer-loading[hidden] { display: none; }
.pepfer-loading__ring {
  width: 18px;
  height: 18px;
  border: 1px solid var(--pepfer-line);
  border-top-color: var(--pepfer-accent);
  border-radius: 50%;
  animation: pepfer-spin .7s linear infinite;
}
@keyframes pepfer-spin { to { transform: rotate(360deg); } }
@media (prefers-reduced-motion: reduce) {
  .pepfer-loading__ring { animation-duration: 2.4s; }
}

/* ---- PhotoSwipe ------------------------------------------------------- */
/* The stock chrome is a dark bar with filled icon buttons. Strip it back to
   hairline glyphs on the backdrop itself, so nothing frames the photograph.

   Класс назван дважды не для красоты: photoswipe.css подключается в шаблоне
   карточки, то есть после наших стилей, и при равном весе его чёрный фон
   побеждал. Отбор из двух классов тяжелее, и порядок подключения больше
   ничего не решает. */
.pswp.pswp {
  --pswp-bg: #FFFFFF;
  /* Заглушка на время загрузки — тоже белая: серый прямоугольник мигал на
     белом полноэкранном фоне. */
  --pswp-placeholder-bg: #FFFFFF;
  --pswp-icon-color: var(--pepfer-ink);
  --pswp-icon-color-secondary: transparent;
  --pswp-icon-stroke-color: transparent;
  --pswp-icon-stroke-width: 0;
  --pswp-error-text-color: var(--pepfer-muted);
}
.pswp__top-bar {
  background: none;
  padding: 8px 8px 0 0;
}
.pswp__button {
  opacity: .45;
  transition: opacity .2s ease;
}
.pswp__button:hover,
.pswp__button:focus-visible {
  opacity: 1;
}
/* Arrows sit clear of the image rather than on top of it. */
.pswp__button--arrow {
  width: 64px;
}
.pswp__counter {
  font-family: var(--pepfer-sans);
  font-size: 12px;
  font-weight: 400;
  letter-spacing: .06em;
  color: var(--pepfer-muted);
  opacity: 1;
  height: auto;
  margin: 14px 0 0 18px;
}

/* The gallery link is a plain image holder — no focus ring box, no underline. */
#pepfer-gallery a {
  display: block;
  cursor: zoom-in;
}
#pepfer-gallery a img {
  display: block;
  width: 100%;
  height: auto;
}

@media (max-width: 767px) {
  /* Thumb-sized targets, and arrows out of the way of a swipe. */
  .pswp__button--arrow { display: none; }
  .pswp__button { opacity: .6; }
}

/* ---- Live Search dropdown --------------------------------------------- */
/* The module anchors its panel to the search box itself, so it inherited that
   box's ~300px width: three float columns at 23%/49%/17% left the name and the
   price stacked on top of each other. Re-anchor it to the header's content
   container instead, so it spans exactly the page gutters. */
#search.ps-live-search-container {
  position: static;
}
/* .personal is relative, so it — not the header row — was the containing block,
   which is where the 437px came from. The panel is moved into this row by
   pepfer-theme.js; its box is already the page content width. */
.info_logo_personal {
  position: relative;
}
#ps-live-search.ps-live-search-list {
  left: 0;
  right: 0;
  width: auto;
  top: 100%;
  margin-top: 0;
  padding: 8px 0 12px;
  border: 0;
  border-top: 1px solid var(--pepfer-line);
  border-radius: 0;
  background: var(--pepfer-paper);
  box-shadow: 0 18px 34px -24px rgba(0, 0, 0, .35);
  font-family: var(--pepfer-sans);
  color: var(--pepfer-ink);
  max-height: 70vh;
  overflow-y: auto;
}

/* Floats cannot hold a row together across widths; a three-track grid can. */
#ps-live-search.ps-live-search-list .ps-live-search-item {
  display: grid;
  grid-template-columns: 64px minmax(0, 1fr) auto;
  align-items: start;
  column-gap: 20px;
  padding: 8px var(--pepfer-gutter);
}
#ps-live-search.ps-live-search-list .ps-live-search-item .thumb,
#ps-live-search.ps-live-search-list .ps-live-search-item .info,
#ps-live-search.ps-live-search-list .ps-live-search-item .prices {
  float: none;
  width: auto;
  margin: 0;
  text-align: left;
}
#ps-live-search.ps-live-search-list .ps-live-search-item .thumb img {
  display: block;
  width: 100%;
  height: auto;
  background: var(--pepfer-paper, #FFFFFF);
}
#ps-live-search.ps-live-search-list .ps-live-search-item .info > *,
#ps-live-search.ps-live-search-list .ps-live-search-item .prices > * {
  margin-bottom: 4px;
}
#ps-live-search.ps-live-search-list .ps-live-search-item strong.name {
  font-size: 13px;
  font-weight: 400;
  letter-spacing: .02em;
  color: var(--pepfer-ink);
  text-transform: uppercase;
}
/* Descriptions are a whole paragraph of copy; two lines is enough to recognise
   the item, and it keeps every row the same height. */
#ps-live-search.ps-live-search-list .ps-live-search-item .description {
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  font-size: 12px;
  line-height: 1.5;
  color: var(--pepfer-muted);
}
#ps-live-search.ps-live-search-list .ps-live-search-item .prices {
  text-align: right;
  white-space: nowrap;
  font-size: 13px;
}
#ps-live-search.ps-live-search-list .ps-live-search-item .price-new { color: var(--pepfer-ink); }
#ps-live-search.ps-live-search-list .ps-live-search-item .price-old {
  color: #A8A29A;
  text-decoration: line-through;
  font-size: 12px;
}
#ps-live-search.ps-live-search-list .ps-live-search-item:hover,
#ps-live-search.ps-live-search-list .ps-live-search-item:focus {
  background: var(--pepfer-soft);
}

/* Section headings and the "results for …" line share the row padding. */
#ps-live-search.ps-live-search-list .ps-live-search-item-text {
  padding: 4px var(--pepfer-gutter) 8px;
}
#ps-live-search.ps-live-search-list .ps-live-search-subheader {
  display: block;
  padding: 8px var(--pepfer-gutter);
  font-size: 12px;
  letter-spacing: .04em;
  color: var(--pepfer-muted);
}
/* Линия рисуется по верхней границе заголовка: поле сверху — это просвет
   до линии, внутренний отступ — от линии до самой надписи. Оба были
   заметно шире, чем расстояние от надписи до её содержимого, и раздел
   зрительно прилипал к чужому списку. */
#ps-live-search.ps-live-search-list .ps-live-search-header {
  margin: 8px 0 0;
  padding: 10px var(--pepfer-gutter) 2px;
  font-family: var(--pepfer-sans);
  font-size: 11px;
  font-weight: 400;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--pepfer-muted);
}

@media (max-width: 767px) {
  #ps-live-search.ps-live-search-list .ps-live-search-item {
    grid-template-columns: 52px minmax(0, 1fr);
    row-gap: 6px;
  }
  /* The price moves under the text rather than squeezing a third column. */
  #ps-live-search.ps-live-search-list .ps-live-search-item .prices,
  #ps-live-search .ps-live-search-item .prices {
    grid-column: 2;
    justify-self: start;
    text-align: left;
  }
}

/* Moving the panel into .info_logo_personal put it inside the header's own
   scope, where `.info` and `.thumb` are already taken by the mobile-menu block.
   Those rules were landing on the result rows — `.info` came out display:flex
   and would not fill its grid track. Reset the three parts explicitly. */
#ps-live-search .ps-live-search-item .thumb,
#ps-live-search .ps-live-search-item .info,
#ps-live-search .ps-live-search-item .prices {
  display: block;
  float: none;
  width: auto;
  /* The header carries percentage max-width caps left over from the float era —
     .info was capped at 30%, which is where the 318px came from. */
  max-width: none;
  min-width: 0;
  margin: 0;
  padding: 0;
  justify-self: stretch;
}
#ps-live-search .ps-live-search-item .prices {
  justify-self: end;
}

/* ======================================================================
   Product page
   ====================================================================== */

/* 1. Article number: an identifier, not a headline. Sits above the title in
      the same grey as secondary copy. */
.product_block .right .product-sku {
  font-family: var(--pepfer-sans);
  font-size: 13px;
  font-weight: 300;
  letter-spacing: .06em;
  color: var(--pepfer-muted);
  margin-bottom: 10px;
}

/* 2. The title was 25px in the display face. It stays the largest thing in the
      column, but stops competing with the photograph. */
.product_block .right h1 {
  font-family: var(--pepfer-sans);
  font-size: 20px;
  font-weight: 400;
  line-height: 1.3;
  letter-spacing: .02em;
  margin: 0 0 12px;
  color: var(--pepfer-ink);
}

/* 3. Price: was 24px, a hair under the title and in a different face again.
      Clearly subordinate now. */
.product_block .right .price_list {
  display: flex;
  align-items: baseline;
  gap: 10px;
  margin: 0 0 24px;
  padding: 0;
  list-style: none;
}
.product_block .right .price_list .price,
.product_block .right .price_list .special-price {
  font-family: var(--pepfer-sans);
  font-size: 15px;
  font-weight: 400;
  line-height: 1.4;
  letter-spacing: .02em;
  color: var(--pepfer-ink);
}
.product_block .right .price_list .special-price { color: var(--pepfer-accent); }
.product_block .right .price_list .price-old {
  font-family: var(--pepfer-sans);
  font-size: 13px;
  color: #A8A29A;
  text-decoration: line-through;
}

/* 4. Variant chips. The markup is OpenCart's radio option; the native input is
      hidden and :checked drives the selected state, so no script is involved. */
.product_block .right .radio_full { margin-top: 0; margin-bottom: 22px; }
.product_block .right .radio_full > .title {
  font-family: var(--pepfer-sans);
  font-size: 11px;
  font-weight: 400;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--pepfer-muted);
  margin-bottom: 10px;
}
.product_block .right .radio_list {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}
.product_block .right .radio_product {
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  min-width: 46px;
  padding: 9px 14px;
  border: 1px solid var(--pepfer-line);
  font-family: var(--pepfer-sans);
  font-size: 13px;
  line-height: 1;
  color: var(--pepfer-ink);
  cursor: pointer;
  transition: border-color .2s ease;
}
.product_block .right .radio_product input[type="radio"] {
  position: absolute;
  opacity: 0;
  pointer-events: none;
}
.product_block .right .radio_product:hover { border-color: var(--pepfer-muted); }
.product_block .right .radio_product:has(input:checked) {
  border-color: var(--pepfer-ink);
  box-shadow: inset 0 0 0 1px var(--pepfer-ink);
}
.product_block .right .radio_product__price { color: var(--pepfer-muted); font-size: 12px; }
.product_block .right .radio_product img { width: 22px; height: 22px; object-fit: cover; }

/* 5. Buy button owns the column: full width, quantity beside it, ink-coloured
      like the notice bar but a touch warmer. */
.product_block .right .count_button.cart {
  /* Quantity now sits on the variants row, so this holds nothing but the
     button and the button takes the whole column. */
  display: block;
  margin: 0 0 14px;
}
.product_block .right .count_button [type="button"]#button-cart {
  width: 100%;
  max-width: none;
  margin: 0;
  min-height: 46px;
  padding: 0 20px;
  /* Рамка есть и в покое — того же цвета, что заливка. Иначе на ховере она
     появлялась бы из ниоткуда и сдвигала подпись на пиксель. */
  border: 1px solid #241F1A;
  border-radius: 0;
  background-color: #241F1A;
  color: var(--pepfer-paper);
  font-family: var(--pepfer-sans);
  font-size: 12px;
  font-weight: 400;
  letter-spacing: .1em;
  text-transform: uppercase;
  cursor: pointer;
  transition: background-color .2s ease, color .2s ease;
}

/* Инверсия, а не осветление. Прежний ховер менял #241F1A на #3A322A — тот же
   коричневый чуть светлее, разницу почти не видно. Здесь заливка и текст
   меняются местами: тёмная кнопка становится светлой с тёмной рамкой. */
.product_block .right .count_button [type="button"]#button-cart:hover,
.product_block .right .count_button [type="button"]#button-cart:focus-visible {
  background-color: var(--pepfer-paper);
  color: #241F1A;
}

/* Нажатие возвращает тёмное: щелчок должен ощущаться как нажатие, а не как
   вторая половина того же ховера. */
.product_block .right .count_button [type="button"]#button-cart:active {
  background-color: #241F1A;
  color: var(--pepfer-paper);
}

.product_block .right .count_button [type="button"]#button-cart:focus-visible {
  outline: 2px solid var(--pepfer-accent);
  outline-offset: 2px;
}

/* 6-8. Secondary actions on one quiet row: wishlist, compare, share, contact. */
.product-actions {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 6px;
  margin-bottom: 26px;
}
.product-action {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  height: 34px;
  padding: 0 10px;
  border: 0;
  background: none;
  font-family: var(--pepfer-sans);
  font-size: 12px;
  font-weight: 400;
  letter-spacing: .04em;
  color: var(--pepfer-muted);
  cursor: pointer;
  transition: color .2s ease;
}
.product-action:hover { color: var(--pepfer-ink); }
.product-action--icon {
  width: 34px;
  padding: 0;
  justify-content: center;
}
/* The wishlist glyph is a background image inherited from the grid card. */
.product_block .right .product-action.favorite_button {
  position: static;
  width: 34px;
  height: 34px;
  background-image: url("/catalog/view/theme/pepfer/image/favorite.svg");
  background-size: 20px 20px;
  background-position: center;
  background-repeat: no-repeat;
  background-color: transparent;
  opacity: .55;
  transition: opacity .2s ease;
}
.product_block .right .product-action.favorite_button:hover { opacity: 1; }
.product-action--compare svg { width: 20px; height: 20px; opacity: .75; }
.product-action--compare:hover svg { opacity: 1; }

/* Dropdowns for sharing and contact. */
.product-menu { position: relative; }
.product-menu [data-menu-toggle]::after {
  content: '';
  width: 5px;
  height: 5px;
  margin-top: -3px;
  border-right: 1px solid currentColor;
  border-bottom: 1px solid currentColor;
  transform: rotate(45deg);
  transition: transform .2s ease, margin-top .2s ease;
}
.product-menu.is-open [data-menu-toggle]::after {
  margin-top: 2px;
  transform: rotate(-135deg);
}
.product-menu__panel {
  display: none;
  position: absolute;
  top: calc(100% + 4px);
  left: 0;
  z-index: 60;
  min-width: 200px;
  padding: 6px 0;
  border: 1px solid var(--pepfer-line);
  background: var(--pepfer-paper);
  box-shadow: 0 12px 28px rgba(0, 0, 0, .07);
}
.product-menu.is-open .product-menu__panel { display: block; }
.product-menu__item {
  display: block;
  width: 100%;
  padding: 9px 16px;
  border: 0;
  background: none;
  font-family: var(--pepfer-sans);
  font-size: 12px;
  letter-spacing: .02em;
  text-align: left;
  color: var(--pepfer-muted);
  text-decoration: none;
  cursor: pointer;
  transition: color .2s ease, background-color .2s ease;
}
.product-menu__item:hover { color: var(--pepfer-ink); background: var(--pepfer-soft); }
.product-menu__item.is-copied { color: var(--pepfer-accent); }

/* 9. Section headings were 15px in the display face; same quiet weight as the
      rest of the column now. */
.product_block .right .accordion {
  font-family: var(--pepfer-sans);
  font-size: 12px;
  font-weight: 400;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--pepfer-muted);
  border-top: 1px solid var(--pepfer-line) !important;
}

/* 10. Specifications as two columns: label, value. `display: contents` on the
       row lets the label and value become cells of the outer grid. */
.product_block .right .info_list {
  display: grid;
  grid-template-columns: minmax(120px, 38%) 1fr;
  margin: 4px 0 18px;
  padding: 0;
  list-style: none;
}
.product_block .right .info_list li {
  display: contents;
  font-family: var(--pepfer-sans);
  font-size: 13px;
}
.product_block .right .info_list li > span {
  display: block;
  margin: 0;
  padding: 9px 16px 9px 0;
  border-top: 1px solid var(--pepfer-line);
  font-weight: 400;
  text-transform: none;
  color: var(--pepfer-muted);
}
.product_block .right .info_list li > a,
.product_block .right .info_list li > strong,
.product_block .right .info_list li > em {
  padding: 9px 0;
  border-top: 1px solid var(--pepfer-line);
  color: var(--pepfer-ink);
}

/* 11. Gallery arrows, vertically centred over the photograph. */
.gallery-top-wrap { position: relative; }
.gallery-nav {
  position: absolute;
  top: 50%;
  z-index: 5;
  width: 44px;
  height: 44px;
  transform: translateY(-50%);
  border: 0;
  background: none;
  cursor: pointer;
  opacity: .5;
  transition: opacity .2s ease;
}
.gallery-nav:hover { opacity: 1; }
.gallery-nav--prev { left: 6px; }
.gallery-nav--next { right: 6px; }
.gallery-nav::before {
  content: '';
  position: absolute;
  top: 50%;
  left: 50%;
  width: 12px;
  height: 12px;
  border-top: 1px solid var(--pepfer-ink);
  border-right: 1px solid var(--pepfer-ink);
}
.gallery-nav--next::before { transform: translate(-70%, -50%) rotate(45deg); }
.gallery-nav--prev::before { transform: translate(-30%, -50%) rotate(-135deg); }

/* 12. Related products read like the catalogue grid. */
.products.products_related .products_related__title {
  margin: 0 0 14px;
  font-family: var(--pepfer-sans);
  font-size: 16px;
  font-weight: 400;
  letter-spacing: .06em;
  text-align: center;
  color: var(--pepfer-ink);
}
.products.products_related .block { width: auto; max-width: none; margin: 0; }
.products.products_related .block .images,
.products.products_related .block .image {
  aspect-ratio: 3 / 4;
  overflow: hidden;
  /* Белая по той же причине, что и в каталоге: сквозь серую проступали
     прозрачные поля снимков. */
  background: var(--pepfer-paper, #FFFFFF);
}
.products.products_related .block .images img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.products.products_related .block .title a {
  font-family: var(--pepfer-sans);
  font-size: 13px;
  font-weight: 400;
  line-height: 1.45;
  letter-spacing: .02em;
  text-transform: none;
  color: var(--pepfer-ink);
  text-decoration: none;
}
.products.products_related .block .price {
  font-family: var(--pepfer-sans);
  font-size: 13px;
  font-weight: 400;
  letter-spacing: .01em;
  color: var(--pepfer-muted);
}

/* The share toggle is an icon now, so the chevron would only add clutter. */
.product-menu [data-menu-toggle].product-action--icon::after { content: none; }
.product-menu [data-menu-toggle].product-action--icon svg { width: 20px; height: 20px; opacity: .75; }
.product-menu [data-menu-toggle].product-action--icon:hover svg { opacity: 1; }

/* The related block carries the .products class, so it inherited the catalogue
   grid: `display: grid` with four columns turned its heading and its slider into
   two 289px cells sitting side by side. It is a carousel, not a grid — the
   listing rules have to stop at its door. */
.products.products_related {
  display: block;
  width: 100%;
  max-width: none;
  margin: 64px 0 0;
}
.products.products_related .slider_products_related {
  width: 100%;
}
/* Swiper sizes the slides itself; the grid-cell rules must not fight it. */
.products.products_related .swiper-wrapper {
  display: flex;
  align-items: stretch;
}
.products.products_related .swiper-slide {
  height: auto;
}
.products.products_related .block {
  width: 100%;
  max-width: none;
  margin: 0;
}

/* The prev/next arrows were sitting at the page edges, far from the carousel. */
.products_related .swiper-button-prev,
.products_related .swiper-button-next {
  width: 40px;
  height: 40px;
  margin-top: 0;
  color: var(--pepfer-ink);
  opacity: .45;
  transition: opacity .2s ease;
}
.products_related .swiper-button-prev:hover,
.products_related .swiper-button-next:hover { opacity: 1; }
.products_related .swiper-button-prev::after,
.products_related .swiper-button-next::after {
  font-size: 18px;
}

/* Specification rows: no rules between them, and values are not italic —
   the <em> was mine, and it read as emphasis where none was meant. */
.product_block .right .info_list li > span,
.product_block .right .info_list li > .value {
  border-top: 0;
  padding: 7px 16px 7px 0;
  font-style: normal;
}
.product_block .right .info_list li > .value {
  padding-right: 0;
  color: var(--pepfer-ink);
}

/* The arrows sit outside .slider_products_related, so Swiper's absolute
   positioning resolved against the page instead of the carousel and threw
   them out to the screen edges. Anchor them to the block. */
.products.products_related { position: relative; }
.products_related .swiper-button-prev,
.products_related .swiper-button-next {
  top: 50%;
  transform: translateY(-50%);
}
.products_related .swiper-button-prev { left: -10px; }
.products_related .swiper-button-next { right: -10px; }

/* ---- Product page: reclaim the first screen ---------------------------- */

/* Breadcrumbs sat 32px below the menu and 24px above the product, spending
   71px of the fold on one 15px line. */
#product-product .breadcrumb {
  margin: 8px 0 12px;
}

/* The big photograph was as tall as its own 3:4 ratio allowed — around 800px
   in a 600px column — so the buy button fell below the fold on a laptop.
   Capping it against the viewport keeps the whole card on one screen; the
   full-size shot is one click away in the lightbox. */
.gallery-top .swiper-slide img {
  max-height: calc(100vh - 260px);
  width: auto;
  max-width: 100%;
  margin: 0 auto;
  object-fit: contain;
}
.gallery-top .swiper-slide a {
  display: flex;
  justify-content: center;
}

/* Thumbnails were generated 74×74 — a square crop box for a 3:4 photograph, so
   OpenCart padded them and `object-fit: fill` then stretched the result. Now
   generated 90×120 and cropped, not squashed. */
.gallery-thumbs .swiper-slide img {
  width: 100%;
  height: auto;
  aspect-ratio: 3 / 4;
  object-fit: cover;
  display: block;
}
.gallery-thumbs .swiper-slide span {
  display: block;
}

/* Gallery arrows: they existed but at 50% opacity over a photograph they read
   as part of the image. A soft disc lifts them off it. */
.gallery-nav {
  width: 40px;
  height: 40px;
  border-radius: 50%;
  background: rgba(255, 255, 255, .82);
  box-shadow: 0 2px 10px rgba(0, 0, 0, .10);
  opacity: 1;
}
.gallery-nav:hover {
  background: #fff;
}
.gallery-nav::before {
  width: 10px;
  height: 10px;
  border-top-width: 1.5px;
  border-right-width: 1.5px;
}
.gallery-nav--prev { left: 12px; }
.gallery-nav--next { right: 12px; }

/* ---- Spacing around the related block ---------------------------------- */
/* The white space was all above the block and none below it: the heading floated
   away from the products it introduces while the carousel sat flush against the
   footer. Moved to the other end — the heading now belongs to its row, and the
   block has room to end before the footer starts. */
.products.products_related {
  margin: 24px 0 64px;
}
/* Swiper measures its own height from the slides; anything fixed here leaves a
   band of empty page under the carousel. */
.products.products_related .slider_products_related {
  height: auto;
}
.products.products_related .swiper-wrapper {
  height: auto;
}

/* style.css pins these arrows 47px outside the block with !important, which put
   them at the very edges of the window once the block became full width. */
.products_related .swiper-button-prev {
  left: 0 !important;
}
.products_related .swiper-button-next {
  right: 0 !important;
}

/* The related block is the last thing on the page; the footer brings its own
   56px of breathing room, so nothing extra is needed here. */
.product_page > .container:last-of-type {
  margin-bottom: 0;
  padding-bottom: 0;
}
.product_page {
  margin-bottom: 0;
  padding-bottom: 0;
}

/* style.css puts a 103px top margin on .footer_menu. It collapses out through
   the footer and shows up as a band of empty page above it — the gap that
   survived every other adjustment. The block already carries 56px of its own
   padding, which is separation enough. */
.footer_menu {
  margin-top: 0;
}

/* ---- Product actions: one hover behaviour for all four ------------------ */

/* style.css paints every <button> green on hover (#427e2b). The wishlist escaped
   it only because it had its own background rule — hence compare lighting up
   green while its neighbour merely faded. Nothing in this row gets a fill. */
.product-actions .product-action,
.product-actions .product-action:hover,
.product-actions .product-action:focus,
.product-actions [type="button"]:hover {
  background-color: transparent !important;
}
/* Left over from the earlier, inverted convention: every control in this row
   sat at .55 and cleared on hover. The heart was later pinned to 1 on its own,
   which is why only it looked solid — and why the red compare glyph came out
   washed, a veil over the whole button rather than a colour problem. */
.product-actions .product-action {
  opacity: 1;
  transition: opacity .2s ease;
  color: var(--pepfer-ink);
}
.product-actions .product-action:hover,
.product-actions .product-action:focus-visible {
  opacity: .55;
}
.product_block .right .product-action.favorite_button {
  opacity: 1;
}
.product_block .right .product-action.favorite_button:hover {
  opacity: 1;
}
.product-action--compare svg,
.product-action--menu svg {
  opacity: 1;
}

/* A chevron ahead of the icon says "this opens a list" — without it the two
   command buttons looked identical to the two that act immediately. */
.product-action--menu {
  width: auto;
  gap: 5px;
  padding: 0 8px;
}
.product-action--menu::before {
  content: '';
  width: 5px;
  height: 5px;
  margin-top: -3px;
  border-right: 1px solid currentColor;
  border-bottom: 1px solid currentColor;
  transform: rotate(45deg);
  transition: transform .2s ease, margin-top .2s ease;
}
.product-menu.is-open .product-action--menu::before {
  margin-top: 2px;
  transform: rotate(-135deg);
}
/* (снято: шеврон вернулся справа, см. ниже) */

/* ---- Tighten the right column ------------------------------------------ */

/* The price sat 24px above a row that itself carried 20px of legacy top margin:
   44px of nothing between the price and the quantity field. */
.product_block .right .price_list {
  margin-bottom: 14px;
}
.product_block .right #product {
  margin-top: 0;
}
.product_block .right .count_button.cart {
  margin-top: 0;
}
.product_block .right .radio_full {
  margin-bottom: 16px;
}
.product-actions {
  margin-bottom: 14px;
}
.product_block .right .accordion {
  padding-top: 14px;
  padding-bottom: 14px;
}

/* ---- Dropdown menus, second pass --------------------------------------- */

/* The chevron belongs after the icon, not before it. */
.product-action--menu::before { content: none; }
.product-menu [data-menu-toggle].product-action--menu::after {
  content: '';
  width: 5px;
  height: 5px;
  margin-top: -3px;
  border-right: 1px solid currentColor;
  border-bottom: 1px solid currentColor;
  transform: rotate(45deg);
  transition: transform .2s ease, margin-top .2s ease;
}
.product-menu.is-open [data-menu-toggle].product-action--menu::after {
  margin-top: 2px;
  transform: rotate(-135deg);
}

.product-menu__panel {
  min-width: 226px;
  padding: 6px 0;
}
.product-menu__panel--wide { min-width: 268px; }

.product-menu__lead {
  padding: 10px 16px 12px;
  font-family: var(--pepfer-sans);
  font-size: 12px;
  line-height: 1.45;
  color: var(--pepfer-muted);
  border-bottom: 1px solid var(--pepfer-line);
  margin-bottom: 6px;
}

/* The row is a <button> in one case and an <a> in the others; style.css gives
   buttons uppercase text, a dark fill and centred alignment, which is why
   "Скопировать ссылку" came out shouting and looking unlike its neighbours. */
.product-menu__item {
  display: flex;
  align-items: center;
  gap: 10px;
  box-sizing: border-box;   /* padding was widening the row past the panel */
  width: 100%;
  padding: 9px 16px;
  border: 0;
  background: none;
  font-family: var(--pepfer-sans);
  font-size: 13px;
  font-weight: 400;
  line-height: 1.3;
  letter-spacing: .01em;
  text-transform: none;
  text-align: left;
  text-decoration: none;
  color: var(--pepfer-muted);
  cursor: pointer;
}
/* --pepfer-soft is #FCFBF8 — invisible against a white panel. A grey that can
   actually be seen, and the label darkens with it. */
.product-menu__item:hover,
.product-menu__item:focus-visible,
.product-menu .product-menu__item:hover {
  background-color: #F0EEEA !important;
  color: var(--pepfer-ink);
}
.product-menu__item:hover .product-menu__label { color: var(--pepfer-ink); }

.product-menu__label { flex: 1 1 auto; min-width: 0; }

.product-menu__mark {
  flex: 0 0 18px;
  width: 18px;
  height: 18px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  color: var(--pepfer-muted);
}
.product-menu__mark svg,
.product-menu__mark img {
  width: 100%;
  height: 100%;
  object-fit: contain;
  display: block;
}
/* Brand colour is the whole cue for these two, so the square carries it. */
.product-menu__mark--swatch {
  border-radius: 3px;
}

.product-menu__item.is-copied,
.product-menu__item.is-copied .product-menu__label { color: var(--pepfer-accent); }

/* ---- Callback request --------------------------------------------------- */

/* A word, not a pictogram: nothing draws "we will ring you back". */
.product-action--text {
  padding: 0 12px;
  white-space: nowrap;
}
.product-action--text::after { content: none; }

.callback {
  position: fixed;
  inset: 0;
  z-index: 300;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 20px;
  background: rgba(32, 27, 20, .38);
}
.callback[hidden] { display: none; }

.callback__card {
  position: relative;
  width: min(420px, 100%);
  padding: 34px 32px 28px;
  background: var(--pepfer-paper);
  border: 1px solid var(--pepfer-line);
}

.callback__close {
  position: absolute;
  top: 10px;
  right: 10px;
  width: 34px;
  height: 34px;
  padding: 0;
  border: 0;
  background: none;
  cursor: pointer;
}
.callback__close:hover { background: none; }
.callback__close::before,
.callback__close::after {
  content: '';
  position: absolute;
  top: 50%;
  left: 50%;
  width: 14px;
  height: 1px;
  background: var(--pepfer-ink);
}
.callback__close::before { transform: translate(-50%, -50%) rotate(45deg); }
.callback__close::after { transform: translate(-50%, -50%) rotate(-45deg); }

.callback__title {
  font-family: var(--pepfer-sans);
  font-size: 17px;
  font-weight: 400;
  letter-spacing: .02em;
  color: var(--pepfer-ink);
  margin-bottom: 8px;
}

/* У окон мессенджеров заголовка нет — остаётся одна поясняющая строка. */
.callback__title[hidden] { display: none; }
.callback__lead {
  margin: 0 0 22px;
  font-family: var(--pepfer-sans);
  font-size: 13px;
  line-height: 1.5;
  color: var(--pepfer-muted);
}

/* Подписи полей — те же плавающие, что в корзине: в пустом поле на месте
   текста, в заполненном наверху и мельче. Правила свои, а не общие с
   оформлением заказа: там разметку строит закрытый модуль, и подписи ловятся
   скриптом по его классам — здесь разметка наша, и подпись стоит в ней сразу. */
.callback__field {
  display: block;
  position: relative;
  margin-bottom: 16px;
}

.callback__label {
  position: absolute;
  top: 23px;
  left: 15px;
  right: 15px;
  transform: translateY(-50%);
  font-family: var(--pepfer-sans);
  font-size: 14px;
  line-height: 1.2;
  color: var(--pepfer-muted);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  pointer-events: none;
  transition: transform .16s ease-out, font-size .16s ease-out;
}

.callback__field.is-floated .callback__label {
  transform: translateY(-17px);
  font-size: 10px;
}

/* У поля вопроса подпись стоит наверху, а не по середине: середина у него
   далеко внизу, и подпись висела бы посреди пустоты. */
.callback__field--area .callback__label {
  top: 22px;
  transform: none;
}

.callback__field--area.is-floated .callback__label {
  top: 11px;
  transform: none;
  font-size: 10px;
}

.callback__field input,
.callback__field textarea {
  box-sizing: border-box;
  width: 100%;
  height: 46px;
  /* Отступ сверху — место поднятой подписи. */
  padding: 18px 14px 0;
  border: 1px solid var(--pepfer-line);
  border-radius: 0;
  background: var(--pepfer-paper);
  font-family: var(--pepfer-sans);
  font-size: 14px;
  color: var(--pepfer-ink);
}

.callback__field textarea {
  height: 84px;
  padding: 26px 14px 10px;
  line-height: 1.5;
  resize: vertical;
}

.callback__field input:focus,
.callback__field textarea:focus {
  outline: none;
  border-color: var(--pepfer-ink);
}

/* Образец формата не спорит с подписью: он проступает, только когда поле в
   работе, а подпись к этому времени уже наверху. */
.callback__field input::placeholder { color: transparent; }
.callback__field input:focus::placeholder { color: var(--pepfer-line); }

.callback__consent {
  display: flex;
  align-items: flex-start;
  gap: 9px;
  margin-bottom: 20px;
  font-family: var(--pepfer-sans);
  font-size: 12px;
  line-height: 1.45;
  color: var(--pepfer-muted);
  cursor: pointer;
}
.callback__consent input { margin-top: 2px; }

.callback__submit {
  box-sizing: border-box;
  width: 100%;
  min-height: 46px;
  /* Рамка того же цвета, что заливка: в покое её не видно, а при инверсии она
     держит края кнопки. Без неё светлая кнопка на светлом окне теряет форму,
     а дорисованная только на наведении — двигала бы вёрстку. */
  border: 1px solid #241F1A;
  border-radius: 0;
  background-color: #241F1A;
  color: var(--pepfer-paper);
  font-family: var(--pepfer-sans);
  font-size: 12px;
  font-weight: 400;
  letter-spacing: .1em;
  text-transform: uppercase;
  cursor: pointer;
  transition: background-color .2s ease, color .2s ease;
}

/* Инверсия — так ведут себя главные кнопки во всей теме: заливка и текст
   меняются местами. Прежний ховер осветлял коричневый до #3A322A, разницу
   почти не было видно. */
.callback__submit:hover,
.callback__submit:focus-visible {
  background-color: var(--pepfer-paper);
  color: #241F1A;
}

/* Нажатие возвращает тёмное: щелчок должен ощущаться нажатием, а не второй
   половиной того же наведения. */
.callback__submit:active {
  background-color: #241F1A;
  color: var(--pepfer-paper);
}
.callback__submit:disabled { opacity: .55; cursor: default; }

.callback__message {
  margin-top: 12px;
  min-height: 18px;
  font-family: var(--pepfer-sans);
  font-size: 12px;
  line-height: 1.45;
}
.callback__message.is-error { color: var(--pepfer-accent); }
.callback__message.is-success { color: var(--pepfer-ink); }

/* Off-screen rather than display:none — some bots skip hidden fields. */
.callback__trap {
  position: absolute;
  left: -9999px;
  width: 1px;
  height: 1px;
  overflow: hidden;
}

/* The row must stay on one line. Rather than chase what pushed the text button
   onto a second one, the wrap is switched off outright and every item is told
   not to grow or shrink — the four controls need ~270px of a ~420px column, so
   there is room to spare. */
.product-actions {
  flex-wrap: nowrap;
  gap: 4px;
}
.product-actions > * {
  flex: 0 0 auto;
}
.product-action--text {
  flex: 0 0 auto;
  margin-left: 6px;
  white-space: nowrap;
}

/* The consent row sat centred: a <label> shrinks to its content, and something
   above it centres inline boxes. Made block-level and pinned left. */
.callback .callback__consent {
  display: flex;
  width: 100%;
  justify-content: flex-start;
  align-items: flex-start;
  text-align: left;
}
.callback .callback__consent input {
  flex: 0 0 auto;
  margin: 2px 0 0;
}
.callback .callback__consent span {
  flex: 1 1 auto;
  text-align: left;
}
/* The card centres its own inline content elsewhere; the form must not. */
.callback__form { text-align: left; }

/* Swiper marks an edge arrow .swiper-button-disabled and gives it
   pointer-events: none — which is why a click on the dead left arrow fell
   through to the product card underneath. Its own opacity: .35 also lost to
   our .products_related rule, so the arrow looked perfectly usable. Hidden
   outright: nothing to click, nothing to mislead. */
.products_related .swiper-button-prev.swiper-button-disabled,
.products_related .swiper-button-next.swiper-button-disabled {
  opacity: 0;
  visibility: hidden;
}

/* The compare glyph sat a pixel above its neighbours: an inline <svg> rides
   the text baseline, which leaves room for descenders under it. */
.product-action--compare svg,
.product-action--menu svg {
  display: block;
}
.product-actions > * {
  align-self: center;
}

/* Centres matched but the boxes did not: the compare button measured a pixel
   shorter than its neighbours, so its top edge sat higher. One height for
   every control in the row settles both. */
.product-actions > *,
.product-actions .product-action {
  height: 34px;
}
.product-actions .product-menu {
  display: flex;
  align-items: center;
}

/* Belt and braces on the dead arrow: visibility already removes it from the
   page and from hit-testing, but the opacity kept losing to an earlier rule. */
.products_related .swiper-button-prev.swiper-button-disabled,
.products_related .swiper-button-next.swiper-button-disabled {
  opacity: 0 !important;
}

/* One convention for every control on the product page, taken from the buy
   button: dark at rest, lighter under the pointer. The carousel arrows and
   the action icons were doing the opposite — muted until hovered — which is
   what made the page look inconsistent. Catalogue cards keep their quiet
   heart: there the control must not compete with the photograph. */

/* Related carousel arrows */
.products_related .swiper-button-prev,
.products_related .swiper-button-next {
  opacity: 1;
}
.products_related .swiper-button-prev:hover,
.products_related .swiper-button-next:hover {
  opacity: .45;
}

/* Main gallery arrows */
.gallery-nav { opacity: 1; }
.gallery-nav:hover { opacity: .55; background: rgba(255, 255, 255, .82); }

/* Wishlist, compare, share, callback */
.product-actions .product-action {
  color: var(--pepfer-ink);
}
.product-actions .product-action:hover {
  color: var(--pepfer-muted);
}
.product-actions .product-action--compare svg,
.product-actions .product-action--menu svg {
  opacity: 1;
}
.product-actions .product-action--compare:hover svg,
.product-actions .product-action--menu:hover svg {
  opacity: .55;
}
.product_block .right .product-action.favorite_button {
  opacity: 1;
}
.product_block .right .product-action.favorite_button:hover {
  opacity: .55;
}

/* The heart is a filled glyph; compare and share are outlines drawn with a
   1.2px hairline. Same colour, very different weight — a filled shape always
   reads denser than a thin contour. Thickening the stroke evens them out, and
   the label gets a touch more weight for the same reason. */
.product-actions .product-action--compare svg,
.product-actions .product-action--menu svg {
  stroke-width: 1.7;
  color: var(--pepfer-ink);
  opacity: 1;
}
.product-actions .product-action--text {
  color: var(--pepfer-ink);
  font-weight: 500;
}
/* Hover keeps the page-wide convention: lighter, not darker. */
.product-actions .product-action--compare:hover svg,
.product-actions .product-action--menu:hover svg {
  opacity: .55;
}
.product-actions .product-action--text:hover {
  color: var(--pepfer-muted);
}

/* An earlier rule left the share glyph at .75 and outranked the new one, so it
   stayed a shade lighter than its neighbours. Matched on specificity. */
.product-actions .product-menu [data-menu-toggle].product-action--menu svg {
  opacity: 1;
}
.product-actions .product-menu [data-menu-toggle].product-action--menu:hover svg {
  opacity: .55;
}

/* ---- Wishlist heart as a toggle ---------------------------------------- */
/* Filled red once the product is saved. The outline file stays the resting
   state; only the active one is swapped in, so nothing changes for a visitor
   who has saved nothing. */
.favorite_button.is-active {
  background-image: url("/catalog/view/theme/pepfer/image/favorite-active.svg") !important;
}
.products .block .favorite_button.is-active {
  opacity: 1;
}
.product_block .right .product-action.favorite_button.is-active {
  opacity: 1;
}

/* The stock alert is no longer produced for the wishlist, but cart and compare
   still emit it; it must at least be dismissible. */
.alert-dismissible .close {
  background: none;
  border: 0;
  color: inherit;
  font-size: 20px;
  line-height: 1;
  cursor: pointer;
  padding: 0 4px;
}

/* A saved heart is a statement, not a hint: full strength wherever it appears.
   The muted resting opacity of the catalogue card keeps losing to nothing in
   particular, so this one is forced. */
.favorite_button.is-active,
.products .block .favorite_button.is-active,
.products .block:hover .favorite_button.is-active,
.product_block .right .product-action.favorite_button.is-active {
  opacity: 1 !important;
}

/* ---- Sold out ----------------------------------------------------------- */
/* Availability is a fact about the product, so it sits with the other one — the
   price — instead of taking a control's worth of column. Quiet: the price stays
   the loud thing on the line. */
.product_block .right .price_list .price-stock {
  font-family: var(--pepfer-sans);
  font-size: 11px;
  font-weight: 400;
  letter-spacing: .1em;
  text-transform: uppercase;
  color: var(--pepfer-muted);
}
/* On one line with the price, separated by a middot rather than by distance. */
.product_block .right .price_list:has(.price-stock) {
  display: flex;
  align-items: baseline;
  gap: 10px;
  flex-wrap: wrap;
}
.product_block .right .price_list .price-stock::before {
  content: '·';
  margin-right: 10px;
  color: var(--pepfer-line);
}
.product_block .right .count_button .button-preorder {
  /* style.css:1977 caps every [type="button"] here at 65% — written for the old
     buy button. */
  width: 100%;
  max-width: none;
  min-height: 46px;
  margin: 0;
  padding: 0 20px;
  border: 1px solid var(--pepfer-ink);
  border-radius: 0;
  background: transparent;
  color: var(--pepfer-ink);
  font-family: var(--pepfer-sans);
  font-size: 12px;
  letter-spacing: .1em;
  text-transform: uppercase;
  cursor: pointer;
  transition: background-color .2s ease, color .2s ease;
}
.product_block .right .count_button .button-preorder:hover {
  background: var(--pepfer-ink);
  color: var(--pepfer-paper);
}
.stock-expected {
  margin-top: 8px;
  font-family: var(--pepfer-sans);
  font-size: 12px;
  color: var(--pepfer-muted);
}
/* ---- The buy button as a counter ---------------------------------------- */
/* The stepper inherits the button's box exactly — same height, same ink, same
   full width — so swapping one for the other moves nothing on the page. */
/* Тот же короб, что и «Добавить в корзину»: высота задана жёстко, а не
   минимумом, — глобальные отступы кнопок темы растягивали его до 52px, и
   переключение состояния дёргало страницу. */
.product_block .right .count_button .cart-stepper {
  display: flex;
  align-items: stretch;
  /* Короб — <div>, а кнопка покупки — <button>: кнопкам тема задала border-box,
     блокам нет, и рамка добавлялась к высоте сверху. */
  box-sizing: border-box;
  width: 100%;
  max-width: none;
  height: 46px;
  margin: 0;
  border: 1px solid #241F1A;
  background-color: #241F1A;
  color: var(--pepfer-paper);
}
.product_block .right .count_button .cart-stepper[hidden] { display: none; }

/* Знаки и середина — три самостоятельные кнопки внутри одного короба. У каждой
   своя инверсия: раньше знаки лишь чуть светлели на чёрном и почти не читались
   как наведённые. */
.product_block .right .count_button .cart-stepper__step,
.product_block .right .count_button .cart-stepper__count {
  margin: 0;
  max-width: none;
  border: 0;
  border-radius: 0;
  background: transparent;
  color: var(--pepfer-paper);
  font-family: var(--pepfer-sans);
  cursor: pointer;
  transition: background-color .2s ease, color .2s ease;
}

.product_block .right .count_button .cart-stepper__step {
  flex: 0 0 52px;
  padding: 0;
  font-size: 18px;
  line-height: 1;
}

.product_block .right .count_button .cart-stepper__count {
  flex: 1 1 auto;
  padding: 0 8px;
  font-size: 12px;
  letter-spacing: .1em;
  text-transform: uppercase;
}

.product_block .right .count_button .cart-stepper__step:hover,
.product_block .right .count_button .cart-stepper__step:focus-visible,
.product_block .right .count_button .cart-stepper__count:hover,
.product_block .right .count_button .cart-stepper__count:focus-visible {
  background-color: var(--pepfer-paper);
  color: #241F1A;
}

.product_block .right .count_button .cart-stepper__step:focus-visible,
.product_block .right .count_button .cart-stepper__count:focus-visible {
  outline: 2px solid var(--pepfer-accent);
  outline-offset: -2px;
}

/* Двоеточие и число слипались: одиночный пробел проигрывает разрядке. */
.cart-stepper [data-cart-quantity] { margin-left: .5em; }
/* While the server is answering, the control is still readable but declines
   further clicks — the number on screen is not yet the number in the cart. */
.cart-stepper.is-busy { opacity: .6; pointer-events: none; }
.product_block .right .count_button #button-cart[hidden] { display: none; }

/* ---- Product page heart: same weight as its neighbours ------------------ */
/* The background-image heart is a filled even-odd shape whose contour is about
   0.9px — half the 1.7px hairline of compare and share, which is why it read as
   the thin one in the row. On this page the glyph is inline SVG instead, so it
   takes the row's stroke width literally. The background image must be called
   off, including the !important swap that marks a saved product. */
.product-actions .product-action--wishlist,
.product-actions .product-action--wishlist.is-active {
  background-image: none !important;
}
.product-actions .product-action--wishlist svg {
  width: 20px;
  height: 20px;
  stroke-width: 1.7;
  color: var(--pepfer-ink);
  opacity: 1;
}
.product-actions .product-action--wishlist:hover svg {
  opacity: .55;
}
/* Saved: the shape fills, matching the red already used by the catalogue card
   and the header counter. */
.product-actions .product-action--wishlist.is-active svg {
  color: #D62B1F;
  fill: #D62B1F;
}
.product-actions .product-action--wishlist.is-active:hover svg {
  opacity: .7;
}

/* ---- Typed characteristics ---------------------------------------------- */
/* Group headings inside the specification list. Quiet — they organise the rows
   rather than competing with them.

   The list is a two-column grid whose rows are `display: contents`, so a label
   and a value become cells of the outer grid. A heading has no such pair: left
   as one cell it consumed a single column and pushed every following label and
   value one place along, which is what tore the block apart. It has to span the
   whole row. */
.product_block .right .info_list .info_list__group {
  display: block;
  grid-column: 1 / -1;
  margin: 18px 0 6px;
  padding: 0;
  border: 0;
  font-family: var(--pepfer-sans);
  font-size: 10px;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--pepfer-muted);
}
.product_block .right .info_list .info_list__group:first-child { margin-top: 0; }

/* Separates the product's own figures from the grouped characteristics above.
   Spans the row for the same reason the headings do. */
.product_block .right .info_list .info_list__break {
  display: block;
  grid-column: 1 / -1;
  height: 0;
  margin: 14px 0 6px;
  border-top: 1px solid var(--pepfer-line);
}

/* The hint marker. A button because it has to be reachable from the keyboard;
   sized down so it reads as a footnote against the attribute name. */
.info-hint {
  width: 14px;
  height: 14px;
  margin-left: 5px;
  padding: 0;
  border: 1px solid var(--pepfer-line);
  border-radius: 50%;
  background: transparent;
  color: var(--pepfer-muted);
  font-family: var(--pepfer-sans);
  font-size: 9px;
  line-height: 1;
  vertical-align: 1px;
  cursor: help;
}
.info-hint:hover,
.info-hint:focus-visible {
  border-color: var(--pepfer-ink);
  color: var(--pepfer-ink);
}

/* ---- Cart hover panel --------------------------------------------------- */
/* Still on the old theme's dress: Thoma at 17-19px, red prices, rounded
   buttons, a scrollbar always present. Brought onto the same footing as the
   product page — Inter, ink, hairlines, square buttons. The selectors mirror
   style.css's own depth because that is the specificity they have to beat. */
.info_logo_personal .personal .cart_header .list_products {
  width: 340px;
  padding: 20px;
  border: 1px solid var(--pepfer-line);
  background: var(--pepfer-paper);
  font-family: var(--pepfer-sans);
  color: var(--pepfer-ink);
}
.info_logo_personal .personal .cart_header .list_products .title {
  padding-bottom: 12px;
  border-bottom: 1px solid var(--pepfer-line);
  font-family: var(--pepfer-sans);
  font-size: 11px;
  line-height: 1.4;
  letter-spacing: .1em;
  text-transform: uppercase;
}
.info_logo_personal .personal .cart_header .list_products .title .name::after {
  height: 12px;
  background-color: var(--pepfer-line);
}
.info_logo_personal .personal .cart_header .list_products .title .count {
  color: var(--pepfer-muted);
  letter-spacing: .04em;
  text-transform: none;
}
/* The scrollbar was reserved whether or not it was needed, so a cart of one
   item still showed a track down the side. */
.info_logo_personal .personal .cart_header .list_products .products_cart {
  overflow-y: auto;
}
.info_logo_personal .personal .cart_header .list_products .products_cart .block {
  align-items: flex-start;
  margin-top: 14px;
  padding-bottom: 14px;
  border-bottom: 1px solid var(--pepfer-line);
}
.info_logo_personal .personal .cart_header .list_products .products_cart .block:last-child {
  border-bottom: 0;
}
.info_logo_personal .personal .cart_header .list_products .products_cart .block .name a {
  font-family: var(--pepfer-sans);
  font-size: 12px;
  line-height: 1.4;
  letter-spacing: .04em;
  margin-bottom: 6px;
  color: var(--pepfer-ink);
  text-decoration: none;
}
.info_logo_personal .personal .cart_header .list_products .products_cart .block .info .options ul li {
  font-size: 10px;
  line-height: 1.4;
  letter-spacing: .06em;
  color: var(--pepfer-muted);
}
/* Red was the old sale colour; here it would read as a discount that is not
   there. Price and title share the same ink, the price a shade heavier. */
.info_logo_personal .personal .cart_header .list_products .products_cart .block .info .price {
  margin-top: 8px;
  font-family: var(--pepfer-sans);
  font-size: 13px;
  font-weight: 500;
  line-height: 1.2;
  color: var(--pepfer-ink);
}
.info_logo_personal .personal .cart_header .list_products .buttons {
  margin-top: 20px;
}
.info_logo_personal .personal .cart_header .list_products .buttons a {
  padding: 14px 20px;
  margin-bottom: 8px;
  border: 1px solid var(--pepfer-ink);
  border-radius: 0;
  font-family: var(--pepfer-sans);
  font-size: 11px;
  line-height: 1;
  letter-spacing: .1em;
  text-decoration: none;
  transition: background-color .2s ease, color .2s ease;
}
.info_logo_personal .personal .cart_header .list_products .buttons .button_1 {
  background-color: #241F1A;
  border-color: #241F1A;
  color: var(--pepfer-paper);
}
.info_logo_personal .personal .cart_header .list_products .buttons .button_1:hover {
  background-color: #3A322A;
  border-color: #3A322A;
}
.info_logo_personal .personal .cart_header .list_products .buttons .button_2 {
  background: transparent;
  color: var(--pepfer-ink);
}
.info_logo_personal .personal .cart_header .list_products .buttons .button_2:hover {
  background-color: var(--pepfer-ink);
  color: var(--pepfer-paper);
}

/* Hidden from sight, still read aloud and still indexed. Used where the visible
   design says something the markup must state anyway — a page heading the
   breadcrumbs already cover, a column header two icons already explain. */
.visually-hidden {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

/* ---- Wishlist page ------------------------------------------------------ */
/* No account menu is rendered on this page, so the 74% column left a quarter of
   the width empty. The table takes the container. */
.account_page.account_page--wide { display: block; }
.account_page.account_page--wide .block_info {
  width: 100%;
  max-width: none;
}

.wishlist-table {
  width: 100%;
  margin: 0;
  border: 0;
  border-collapse: collapse;
  font-family: var(--pepfer-sans);
  font-size: 13px;
  color: var(--pepfer-ink);
}
.wishlist-table thead td {
  padding: 0 12px 10px;
  border: 0;
  border-bottom: 1px solid var(--pepfer-line);
  font-size: 10px;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--pepfer-muted);
  /* Long headers wrap instead of forcing their column wider than its
     contents need. */
  white-space: normal;
  vertical-align: bottom;
}
.wishlist-table tbody td {
  padding: 14px 12px;
  border: 0;
  border-bottom: 1px solid var(--pepfer-line);
  vertical-align: middle;
}
.wishlist-table tbody tr:hover td { background: rgba(0, 0, 0, .015); }
.wishlist-table thead td:first-child,
.wishlist-table tbody td:first-child { padding-left: 0; }
.wishlist-table thead td:last-child,
.wishlist-table tbody td:last-child { padding-right: 0; }

.wishlist-table__image { width: 90px; }
.wishlist-table__image img { display: block; width: 70px; height: auto; }
.wishlist-table__model { width: 120px; color: var(--pepfer-muted); }
.wishlist-table__stock { width: 90px; }
.wishlist-table__price { width: 140px; }
.wishlist-table__action { width: 90px; white-space: nowrap; }

.wishlist-table__name {
  color: var(--pepfer-ink);
  text-decoration: none;
  letter-spacing: .02em;
}
.wishlist-table__name:hover { color: var(--pepfer-muted); }
.wishlist-table__special { font-weight: 500; }
.wishlist-table s { color: var(--pepfer-muted); margin-left: 6px; }

/* Availability as one mark rather than a sentence. */
.stock-flag {
  display: inline-flex;
  color: var(--pepfer-ink);
}
.stock-flag svg { width: 16px; height: 16px; }
.stock-flag.is-out { color: var(--pepfer-line); }

.wishlist-action {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 32px;
  height: 32px;
  padding: 0;
  border: 0;
  background: transparent;
  color: var(--pepfer-ink);
  cursor: pointer;
  transition: opacity .2s ease;
  text-decoration: none;
}
.wishlist-action svg { width: 18px; height: 18px; }
/* style.css:80 paints every button green on hover — the theme's old accent,
   applied to `button` globally. The <a> beside it is not a button and never got
   it, so the pair behaved differently. Both fade instead. */
.wishlist-action:hover,
.wishlist-action:focus,
.wishlist-action:active {
  background: transparent;
  opacity: .55;
}
.wishlist-action--remove { color: var(--pepfer-muted); }
.wishlist-action--remove:hover,
.wishlist-action--remove:focus {
  background: transparent;
  color: var(--pepfer-accent);
  opacity: 1;
}

.wishlist-total td {
  padding: 16px 12px 0;
  border: 0;
  font-size: 12px;
  letter-spacing: .06em;
  color: var(--pepfer-muted);
}
.wishlist-total td:first-child { padding-left: 0; }
.wishlist-total__label { text-transform: uppercase; font-size: 10px; letter-spacing: .12em; }
.wishlist-total__value {
  margin-left: 8px;
  font-size: 15px;
  font-weight: 500;
  color: var(--pepfer-ink);
}

.wishlist-empty {
  margin: 0;
  font-family: var(--pepfer-sans);
  font-size: 14px;
  color: var(--pepfer-muted);
}

/* ---- Notices ------------------------------------------------------------ */
/* style.css draws these as dashed boxes — green for success, pure red for
   failure. Both are the old theme speaking. A notice says what happened; it
   does not need a colour of its own or a dashed frame to be understood. */
.alert.alert-success,
.alert.alert-danger,
.alert.alert-info,
.alert.alert-warning {
  margin: 0 0 20px;
  padding: 12px 16px;
  border: 0;
  border-left: 2px solid var(--pepfer-line);
  border-radius: 0;
  background: transparent;
  font-family: var(--pepfer-sans);
  font-size: 13px;
  line-height: 1.5;
  color: var(--pepfer-ink);
}
.alert.alert-success { border-left-color: var(--pepfer-ink); }
.alert.alert-danger { border-left-color: var(--pepfer-accent); }
.alert a {
  color: var(--pepfer-ink);
  text-decoration: underline;
  text-underline-offset: 2px;
}
.alert .fa { display: none; }

/* ---- Compare page ------------------------------------------------------- */
/* The page came straight from core: Bootstrap grid, bordered table, blue and red
   buttons, <strike> prices. Same treatment as the wishlist — hairlines, Inter,
   the theme's own buttons. */
.compare-table {
  width: 100%;
  margin: 0;
  border-collapse: collapse;
  font-family: var(--pepfer-sans);
  font-size: 13px;
  color: var(--pepfer-ink);
}
.compare-table td {
  padding: 12px 14px;
  border: 0;
  border-bottom: 1px solid var(--pepfer-line);
  vertical-align: middle;
  text-align: left;
}
.compare-table thead td {
  padding-bottom: 16px;
  vertical-align: bottom;
}
.compare-table__label {
  width: 190px;
  font-size: 10px;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--pepfer-muted);
}
.compare-table__image { display: block; margin-bottom: 10px; }
.compare-table__image img { display: block; width: 100%; max-width: 180px; height: auto; }
.compare-table__name {
  color: var(--pepfer-ink);
  text-decoration: none;
  letter-spacing: .02em;
}
.compare-table__name:hover { color: var(--pepfer-muted); }
.compare-table__price { font-size: 15px; }
.compare-table__special { font-weight: 500; }
.compare-table s { color: var(--pepfer-muted); margin-left: 6px; }
.compare-table__muted { color: var(--pepfer-muted); }

/* A section heading inside the table, not another comparison row. */
.compare-table__group td {
  padding-top: 26px;
  border-bottom: 1px solid var(--pepfer-ink);
  font-size: 10px;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--pepfer-ink);
}

.compare-table tfoot td { border-bottom: 0; padding-top: 20px; }
.compare-table__actions { white-space: nowrap; }

.compare-buy {
  display: block;
  width: 100%;
  max-width: 220px;
  min-height: 44px;
  margin: 0 0 8px;
  padding: 0 18px;
  border: 0;
  border-radius: 0;
  background-color: #241F1A;
  color: var(--pepfer-paper);
  font-family: var(--pepfer-sans);
  font-size: 11px;
  letter-spacing: .1em;
  text-transform: uppercase;
  cursor: pointer;
  transition: background-color .2s ease;
}
/* style.css:80 turns any button green on hover; stated here so the two controls
   in this cell behave the same way. */
.compare-buy:hover,
.compare-buy:focus { background-color: #3A322A; }

.compare-remove,
.compare-continue {
  display: inline-block;
  font-family: var(--pepfer-sans);
  font-size: 11px;
  letter-spacing: .1em;
  text-transform: uppercase;
  color: var(--pepfer-muted);
  text-decoration: none;
  border-bottom: 1px solid var(--pepfer-line);
  padding-bottom: 2px;
  transition: color .2s ease, border-color .2s ease;
}
.compare-remove:hover,
.compare-continue:hover {
  color: var(--pepfer-accent);
  border-color: var(--pepfer-accent);
}

/* Guest notice on the wishlist page: a quiet remark, not an alert bar. The soft
   fill read as a warning banner; the accent rule alone carries it. */
.wishlist-notice {
  margin: 0 0 24px;
  padding: 2px 0 2px 14px;
  border-left: 2px solid var(--pepfer-accent);
  background: transparent;
  font-family: var(--pepfer-sans);
  font-size: 13px;
  line-height: 1.5;
  color: var(--pepfer-muted);
}
.wishlist-notice a {
  color: var(--pepfer-ink);
  text-decoration: underline;
  text-underline-offset: 2px;
}
.wishlist-notice a:hover { color: var(--pepfer-accent); }

/* ---- Saved and compared: active states ---------------------------------- */
/* The heart swaps to a solid silhouette — the resting icon is an outline, so
   recolouring it only tinted the contour. */
.favorite_button.is-active {
  background-image: url("/catalog/view/theme/pepfer/image/favorite-active.svg") !important;
}

/* The compare glyph is drawn in strokes, so "filled" means heavier and red. */
.product-actions .product-action--compare.is-active svg,
.product-action--compare.is-active svg {
  stroke: #D62B1F;
  stroke-width: 2.6;
  opacity: 1;
}
.product-actions .product-action--compare.is-active:hover svg {
  stroke: #D62B1F;
  opacity: .7;
}

/* Header link to the comparison table, with a count once something is in it. */
.compare-link {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 20px;
  height: 20px;
  color: var(--pepfer-ink);
  transition: opacity .2s ease;
}
.compare-link svg { width: 20px; height: 20px; display: block; }
.compare-link:hover { opacity: .55; }
.compare-link.has-items { color: #D62B1F; }
.compare-link.has-items::after {
  content: attr(data-count);
  position: absolute;
  top: -6px;
  right: -8px;
  min-width: 14px;
  height: 14px;
  padding: 0 3px;
  border-radius: 7px;
  background: #D62B1F;
  color: #fff;
  font-family: var(--pepfer-sans);
  font-size: 9px;
  line-height: 14px;
  text-align: center;
}

/* Wishlist counter in the header, matching the compare one. The script already
   writes data-count and has-items onto #wishlist-total; only the badge was
   missing. */
.info_logo_personal .personal .wishlist {
  position: relative;
}
.info_logo_personal .personal .wishlist.has-items::after,
.compare-link.has-items::after {
  content: attr(data-count);
  position: absolute;
  top: -6px;
  right: -8px;
  min-width: 14px;
  height: 14px;
  padding: 0 3px;
  border-radius: 7px;
  background: #D62B1F;
  color: #fff;
  font-family: var(--pepfer-sans);
  font-size: 9px;
  font-weight: 400;
  line-height: 14px;
  letter-spacing: 0;
  text-align: center;
}
/* The header heart is swapped by the script instead: replacing an <img> via
   `content` drops its intrinsic size and collapsed the link to nothing. */

/* normalize.css in this theme carries `button, input { width: 100% }`, which is
   not something normalize does — it was added here. It catches checkboxes and
   radios too, so the consent box grew to the full width of its row and shoved
   the label out of the dialog. Tick boxes are never full-width. */
input[type="checkbox"],
input[type="radio"] {
  width: auto;
  flex: none;
}
.callback .callback__consent input[type="checkbox"] {
  width: 15px;
  height: 15px;
  flex: 0 0 15px;
  margin: 2px 0 0;
}

/* The compare glyph in the product column carries stroke and stroke-width as
   presentation attributes on its <path>, not on the <svg>. A value inherited
   from the parent loses to an attribute on the element itself, so styling the
   svg changed nothing visible — the path kept painting itself grey and thin.
   CSS on the path does beat its own attribute. (The header icon puts the same
   attributes on the <svg>, which is why that one worked all along.) */
.product-action--compare svg path {
  stroke: var(--pepfer-ink);
  stroke-width: 1.7;
}
.product-action--compare.is-active svg path {
  stroke: #D62B1F;
  stroke-width: 2.6;
}
.product-action--compare:hover svg path {
  stroke: var(--pepfer-muted);
}
.product-action--compare.is-active:hover svg path {
  stroke: #D62B1F;
  opacity: .7;
}
/* Same trap for the share glyph: its circles and lines are attribute-painted. */
.product-action--menu svg circle,
.product-action--menu svg path {
  stroke: var(--pepfer-ink);
  stroke-width: 1.7;
}
.product-action--menu:hover svg circle,
.product-action--menu:hover svg path {
  stroke: var(--pepfer-muted);
}

/* ---- Variant switcher --------------------------------------------------- */

.product-variants { margin: 0 0 14px; }
/* The strip wraps onto a second line rather than scrolling or paging. A
   carousel would hide half the choice behind an arrow and ask the visitor to
   remember what was on the other side — the wrong trade for a group that is
   almost never larger than five. Wrapping costs 70px of height in the rare case
   and nothing at all in the usual one.

   A grid rather than a flex row: with fixed 60px thumbnails the leftover space
   piled up on the right (0 on the left, 12 on the right in a 422px column), and
   the strip read as misaligned with the heading and price above it. Tracks of
   1fr divide the column exactly, so a full row is flush at both edges, and
   because every track in the grid is the same width the second row's thumbnails
   match the first row's instead of being sized on their own. */
.product-variants__list {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(60px, 1fr));
  gap: 10px;
  margin: 0;
  padding: 0;
  list-style: none;
}
.product-variant {
  display: block;
  position: relative;
  /* The cap lives on the link, not on the image: the ring and the sold-out rule
     are drawn on the link, and if the image were the narrower of the two they
     would sit around empty space beside the picture. */
  max-width: 96px;
  text-decoration: none;
  color: var(--pepfer-muted);
}
.product-variant img {
  display: block;
  /* The thumbnail fills its track, so the row divides the column evenly. */
  width: 100%;
  height: auto;
  aspect-ratio: 1;
  object-fit: cover;
  /* Белая, как и остальные подложки под снимками: сквозь серую проступали
     прозрачные поля файлов PNG. */
  background: var(--pepfer-paper, #FFFFFF);
  /* Full strength at rest. These thumbnails exist to show the colour and the
     print — that is their entire content — so fading them takes away the thing
     the visitor came to the row to read. It also fails outright on a phone,
     where there is no hover to restore it. Which one is open gets said by the
     ring instead, and the ring costs the pictures nothing. */
  transition: box-shadow .2s ease, opacity .2s ease;
}
/* The current variant is marked by its frame, not by removing the link: the
   page it points at is the page you are on, and that should still be obvious.
   A border sitting on the artwork disappears into it whenever the print runs
   edge to edge and carries its own dark lines — which is exactly what these
   scarves do. So the ring is drawn outside the image, separated from it by a
   gap of page background: the thumbnail is cut out of the row rather than
   outlined on top of itself, and that reads against any picture.

   Drawn inside the thumbnail rather than around it. Outside the box the ring
   needed 4px of breathing room from the list, which pushed the whole strip past
   the edges of the description column — it crossed the left margin that the
   heading, the price and the buy button all line up against. Inside, the same
   two bands sit within the grid track and nothing overhangs.

   As an overlay, not an inset shadow on the <img>: an inset shadow is painted
   just above the background, and the replaced content of an image paints above
   that, so the ring could disappear under the photo. A positioned pseudo-element
   is always painted over it. */
.product-variant.is-current::before {
  content: '';
  position: absolute;
  inset: 0;
  box-sizing: border-box;
  border: 1px solid var(--pepfer-ink);
  box-shadow: inset 0 0 0 3px var(--pepfer-paper);
  pointer-events: none;
}
/* Отсутствующий вариант приглушается, а не перечёркивается: две жирные линии
   поверх рисунка спорили с самим рисунком, ради которого миниатюра и стоит.
   Приглушение мягче и не закрывает расцветку. */
.product-variant.is-out-of-stock img {
  opacity: .45;
  filter: saturate(.35);
}
.product-variant.is-out-of-stock:hover img,
.product-variant.is-out-of-stock:focus-visible img {
  opacity: .8;
  filter: saturate(.7);
}

/* Знак предзаказа: не запрет, а срок. Часы на светлой подложке в углу — читается
   поверх любой расцветки, в отличие от знака прямо на рисунке. */
.product-variant__mark {
  position: absolute;
  right: 4px;
  bottom: 4px;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 22px;
  height: 22px;
  background: var(--pepfer-paper);
  color: var(--pepfer-ink);
  pointer-events: none;
}
.product-variant__mark svg { display: block; }
.product-variant:focus-visible img { outline: 2px solid var(--pepfer-ink); outline-offset: 2px; }

/* ---- Активная миниатюра галереи ----------------------------------------- */
/* style.css:2124 подсвечивает .swiper-slide-active — этот класс лента ставит
   своему первому видимому слайду, а не тому, что открыт в главном окне. Пока
   карусели связывались взаимным controller, эти два понятия почти совпадали;
   с модулем thumbs открытую миниатюру отмечает .swiper-slide-thumb-active,
   и подсвечивать нужно именно её. */
.product_block .left .images .gallery-thumbs .swiper-slide-active {
  border-color: transparent;
  opacity: .6;
}
.product_block .left .images .gallery-thumbs .swiper-slide-thumb-active,
.product_block .left .images .gallery-thumbs .swiper-slide-thumb-active:hover {
  border: 1px solid var(--pepfer-ink);
  opacity: 1;
}

/* ---- Описание товара ----------------------------------------------------
   Тексты набираются не в редакторе, а вставляются готовыми, и вместе с ними
   приезжает чужая типографика: font-family в 233 описаниях из 434, color в 228,
   font-size в 212, устаревший <font> в 63. Переписывать базу ради этого не
   нужно — достаточно не пускать чужие объявления до экрана.

   Гасится только оформление: семейство, кегль, цвет, фон, разрядка. Начертание
   остаётся — <strong>, <em>, списки и ссылки работают как задумано, но шрифтом
   темы. !important здесь по делу: инлайновый style перебивается только им. */

.product-description {
  font-family: var(--pepfer-sans);
  font-size: 15px;
  line-height: 1.7;
  color: var(--pepfer-ink);
}

/* Только `*`. Перечислять здесь ещё и [style] было ошибкой: селектор с
   атрибутом весит больше, чем `.product-description a`, и сбрасывал цвет
   ссылки и начертание заголовка на всех элементах с инлайновым стилем.
   Нужды в нём нет — !important в таблице и так побеждает атрибут style. */
.pepfer-rich * {
  font-family: inherit !important;
  font-size: inherit !important;
  line-height: inherit !important;
  letter-spacing: normal !important;
  color: inherit !important;
  background: transparent !important;
}

/* Ритм абзацев задаёт тема, а не количество <br> в исходнике. Величина —
   контекстная: у статьи свой, более просторный шаг, он объявлен отдельно. */
.product-description p { margin: 0 0 1em; }
.pepfer-rich p:last-child { margin-bottom: 0; }

/* Пустые абзацы — след от вставки, а не пауза, задуманная автором. */
.pepfer-rich p:empty,
.pepfer-rich div:empty { display: none; }

.pepfer-rich strong,
.pepfer-rich b { font-weight: 600; }

.pepfer-rich ul,
.pepfer-rich ol { margin: 0 0 1em; padding-left: 20px; }
.pepfer-rich li { margin-bottom: .3em; }

/* Ссылка обязана остаться отличимой: цвет ей возвращается после общего сброса. */
.pepfer-rich a {
  color: var(--pepfer-accent-deep) !important;
  text-decoration: underline;
  text-underline-offset: 2px;
}

.pepfer-rich h1,
.pepfer-rich h2,
.pepfer-rich h3,
.pepfer-rich h4,
.pepfer-rich h5,
.pepfer-rich h6 {
  font-family: var(--pepfer-serif) !important;
  /* Относительно, а не 18px: в статье с кеглем 16 подзаголовок в 18 читался бы
     не заголовком, а случайно потолстевшей строкой. */
  font-size: 1.25em !important;
  line-height: 1.3 !important;
  font-weight: 400;
  margin: 1.4em 0 .5em;
}

.pepfer-rich hr {
  margin: 1.4em 0;
  border: 0;
  border-top: 1px solid var(--pepfer-line);
}

.pepfer-rich img { max-width: 100%; height: auto; }

/* ---- Обтекание картинки текстом -----------------------------------------
   Редактор в админке ставит выравнивание изображения инлайновым стилем
   `float`, а собственного отступа не даёт — буквы прилипают к краю снимка.
   Отступы дописываются здесь, для обеих сторон, и заодно для тех, кто
   поставит классы руками.

   Ширина не задаётся: её редактор выставляет сам, и навязывать свою значило
   бы ломать уже набранные страницы. Ограничение одно — половина колонки,
   иначе «обтекание» превращается в одно слово на строку. */
.pepfer-rich img[style*="float"],
.pepfer-rich img.pepfer-float-left,
.pepfer-rich img.pepfer-float-right,
.collection-intro__text img[style*="float"],
.collection-intro__text img.pepfer-float-left,
.collection-intro__text img.pepfer-float-right {
  max-width: min(50%, 460px);
  margin-bottom: 12px;
}

.pepfer-rich img.pepfer-float-left,
.collection-intro__text img.pepfer-float-left { float: left; }

.pepfer-rich img.pepfer-float-right,
.collection-intro__text img.pepfer-float-right { float: right; }

.pepfer-rich img[style*="float: left"],
.pepfer-rich img[style*="float:left"],
.pepfer-rich img.pepfer-float-left,
.collection-intro__text img[style*="float: left"],
.collection-intro__text img[style*="float:left"],
.collection-intro__text img.pepfer-float-left {
  margin-right: clamp(20px, 3vw, 36px);
}

.pepfer-rich img[style*="float: right"],
.pepfer-rich img[style*="float:right"],
.pepfer-rich img.pepfer-float-right,
.collection-intro__text img[style*="float: right"],
.collection-intro__text img[style*="float:right"],
.collection-intro__text img.pepfer-float-right {
  margin-left: clamp(20px, 3vw, 36px);
}

/* Текст, обтекающий картинку, кончается раньше её самой — и следующий блок
   налезал бы на снимок. Обрыв ставится там, где текст закончился. */
.pepfer-rich::after,
.collection-intro__text::after {
  content: '';
  display: block;
  clear: both;
}

/* На телефоне колонка узкая: обтекание оставило бы по два слова в строке.
   Инлайновый стиль редактора перебивается только !important. */
@media (max-width: 767px) {
  .pepfer-rich img[style*="float"],
  .pepfer-rich img.pepfer-float-left,
  .pepfer-rich img.pepfer-float-right,
  .collection-intro__text img[style*="float"],
  .collection-intro__text img.pepfer-float-left,
  .collection-intro__text img.pepfer-float-right {
    float: none !important;
    max-width: 100%;
    margin: 0 0 18px !important;
  }
}

/* ---- Журнал: список статей ---------------------------------------------
   Обложки сняты в разных пропорциях, поэтому плитка не задаёт им общую высоту:
   строка выравнивается по верху, а карточка занимает столько, сколько нужно её
   изображению. Общая рамка резала бы половине обложек край. */

.blog-list { padding-bottom: 60px; }

.blog-list__title {
  font-family: var(--pepfer-serif);
  font-size: 34px;
  line-height: 1.15;
  font-weight: 400;
  color: var(--pepfer-ink);
  margin: 0 0 36px;
}

.blog-list__grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 44px var(--pepfer-gutter);
  align-items: start;
}

.blog-list__card { display: block; text-decoration: none; color: inherit; }
.blog-list__card:hover,
.blog-list__card:focus { text-decoration: none; color: inherit; }

.blog-list__image { overflow: hidden; background: var(--pepfer-soft); }
.blog-list__image img {
  display: block;
  width: 100%;
  height: auto;
  transition: transform .5s ease;
}
.blog-list__card:hover .blog-list__image img { transform: scale(1.03); }

.blog-list__body { padding-top: 16px; }

.blog-list__date {
  font-family: var(--pepfer-sans);
  font-size: 11px;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--pepfer-muted);
  margin-bottom: 8px;
}

.blog-list__heading {
  font-family: var(--pepfer-serif);
  font-size: 19px;
  line-height: 1.25;
  font-weight: 400;
  color: var(--pepfer-ink);
  margin: 0 0 8px;
}

.blog-list__lead {
  font-family: var(--pepfer-sans);
  font-size: 14px;
  line-height: 1.6;
  color: var(--pepfer-muted);
  margin: 0 0 12px;
}

/* Подпись-приглашение, а не кнопка: карточка кликабельна целиком. */
.blog-list__more {
  display: inline-block;
  font-family: var(--pepfer-sans);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .1em;
  text-transform: uppercase;
  color: var(--pepfer-ink);
  border-bottom: 1px solid var(--pepfer-ink);
  padding-bottom: 2px;
}
.blog-list__card:hover .blog-list__more {
  color: var(--pepfer-accent-deep);
  border-bottom-color: var(--pepfer-accent-deep);
}

.blog-list__pagination {
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 12px;
  margin-top: 48px;
  padding-top: 24px;
  border-top: 1px solid var(--pepfer-line);
}
.blog-list__results {
  font-family: var(--pepfer-sans);
  font-size: 12px;
  color: var(--pepfer-muted);
}

.blog-list__empty {
  font-family: var(--pepfer-sans);
  font-size: 15px;
  color: var(--pepfer-muted);
}

@media (max-width: 900px) {
  .blog-list__grid { grid-template-columns: repeat(2, 1fr); gap: 32px var(--pepfer-gutter); }
  .blog-list__title { font-size: 27px; }
}

@media (max-width: 560px) {
  .blog-list__grid { grid-template-columns: 1fr; gap: 34px; }
}

/* Пункт «Журнал» в главном меню: тот же вид, что у категорий, но без выпадающего
   списка — раскрывать нечего. */
.categories_list .journal-item > a { cursor: pointer; }


/* ---- Основание страницы -------------------------------------------------
   Раньше body был набран FuturaNowHeadline — шрифтом прежнего оформления, и
   каждый элемент, до которого не дотянулась эта таблица, оставался на нём.
   Текстовый шрифт сайта — PP Neue Montreal Light, поэтому им и задаётся
   основание, а не отдельные компоненты поверх чужого. */
body {
  font-family: var(--pepfer-sans);
  font-weight: 300;
}

/* Заголовки — Prata. Перечислены явно: часть из них в старой теме несла
   FuturaNowHeadline собственным объявлением. */
h1, h2, h3, h4, h5, h6 {
  font-family: var(--pepfer-serif);
  font-weight: 400;
}
/* ---- Боковая корзина ----------------------------------------------------
   Панель выезжает справа и на узких экранах занимает всю ширину (§10 ТЗ).
   Ширина на настольном — 480px: две карточки карусели должны помещаться, не
   переполняя панель по горизонтали. */

/* normalize.css темы задаёт button, input { width: 100% } — на всю страницу.
   Из-за этого крестик растягивался на всю шапку (иконка вставала по центру
   невидимой кнопки шириной 432px), знаки счётчика расползались по строке, а
   «Удалить» оказывалась выключенной по центру. Внутри панели ширину кнопок
   задаём мы; те, кому нужна полная, просят её явно. */
.pcd button { width: auto; }

.pcd { position: fixed; inset: 0; z-index: 1200; }
.pcd[hidden] { display: none; }

.pcd__scrim {
  position: absolute;
  inset: 0;
  background: rgba(32, 27, 20, .38);
  opacity: 0;
  transition: opacity .3s ease;
}
.pcd.is-open .pcd__scrim { opacity: 1; }

.pcd__panel {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  width: min(480px, 100%);
  display: flex;
  flex-direction: column;
  background: var(--pepfer-paper);
  /* Тень отделяет панель от страницы: без неё две белые плоскости сливаются, и
     панель читается как часть вёрстки, а не как слой поверх неё. */
  box-shadow: -18px 0 48px rgba(32, 27, 20, .16);
  transform: translateX(100%);
  transition: transform .32s cubic-bezier(.22, .61, .36, 1);
}
.pcd.is-open .pcd__panel { transform: translateX(0); }

/* Фон под панелью не должен уезжать: положение сохраняется и возвращается при
   закрытии (CART-04). */
/* Фиксация фона убирает полосу прокрутки, и страница шириной в неё прыгает
   вправо. Компенсируем отступом ровно в ширину полосы — её измеряет скрипт и
   кладёт в переменную. */
/* Место под полосу прокрутки резервируется всегда. Прежняя попытка добавляла
   отступ в момент открытия, но body с width: 100% и content-box считал ширину
   от окна без полосы, и содержимое всё равно уезжало. Постоянный жёлоб решает
   задачу в корне: ширина видимой области не меняется вовсе — ни при открытии
   панели, ни при переходе с длинной страницы на короткую. */
html { scrollbar-gutter: stable; }

body.pcd-locked {
  position: fixed;
  left: 0;
  right: 0;
  width: 100%;
  box-sizing: border-box;
}

.pcd__head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 22px 24px 10px;
}

.pcd__title {
  margin: 0;
  font-family: var(--pepfer-serif);
  font-size: 20px;
  font-weight: 400;
  color: var(--pepfer-ink);
}

.pcd__close {
  border: 0;
  background: transparent;
  /* Тот же цвет, что у кнопки оформления: это два самых заметных элемента
     панели, и разнобой в их черноте бросается в глаза. */
  color: #241F1A;
  padding: 6px;
  cursor: pointer;
  line-height: 0;
  /* Прижимаем явно, а не только через space-between: так положение не зависит
     от того, что ещё окажется в шапке. */
  margin-left: auto;
  flex: 0 0 auto;
}
/* Тёмная заливка и белый знак: прежний ховер менял только оттенок значка и
   почти не читался. Поворот на четверть оборота — знак «×» при повороте
   становится «+» и обратно, движение заметно, но не суетливо. */
/* Без скругления: круглых элементов в оформлении нет, и один круг посреди
   прямых углов читается как чужой. */
.pcd__close { border-radius: 0; }

/* Четверть оборота: знак «×» на середине пути становится «+», и это читается
   как отклик, а не как проворот ради проворота. Короткая длительность и
   замедление в конце — движение успевает завершиться раньше, чем начнёт
   раздражать. display: block убирает базовую линию, из-за которой значок
   подпрыгивал на пиксель.

   То же поведение получают крестики остальных диалогов: закрытие — одно и то же
   действие, и отвечать оно должно одинаково, где бы ни находилось. У окна
   обратного звонка крест нарисован псевдоэлементами, поэтому вращается сама
   кнопка. */
.pcd__close svg,
.notice-panel__close svg {
  display: block;
  transform-origin: 50% 50%;
  transition: transform .2s cubic-bezier(0, 0, .2, 1);
}
.callback__close {
  transform-origin: 50% 50%;
  transition: transform .2s cubic-bezier(0, 0, .2, 1);
}

/* Цвет не меняется вовсе — отклик даёт поворот. Фон приходится гасить явно:
   в style.css темы у каждой кнопки есть button:hover { background-color },
   и без этого правила крестик получал тёмную заливку от неё. */
.pcd__close:hover,
.pcd__close:focus-visible,
.pcd__close:active {
  background: transparent;
  color: #241F1A;
}
.pcd__close:hover svg,
.pcd__close:focus-visible svg,
.notice-panel__close:hover svg,
.notice-panel__close:focus-visible svg { transform: rotate(90deg); }

.callback__close:hover,
.callback__close:focus-visible { transform: rotate(90deg); }

.pcd__close:focus-visible { outline: 2px solid var(--pepfer-accent); outline-offset: 2px; }

@media (prefers-reduced-motion: reduce) {
  .pcd__close svg,
  .notice-panel__close svg,
  .callback__close { transition: none; }
}

/* Прокручивается только список позиций. Всё остальное — заголовок сверху,
   итоги, кнопка оформления и карусель снизу — закреплено: покупатель не должен
   искать кнопку оформления прокруткой, а карусель не должна уезжать за нижний
   край окна. min-height: 0 обязателен — без него флекс-потомок не даёт себя
   сжать ниже содержимого, и прокрутка не появляется вовсе. */
.pcd__body {
  flex: 1 1 auto;
  min-height: 0;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  padding: 0 24px 20px;
}

.pcd-lines {
  flex: 1 1 auto;
  min-height: 0;
  overflow-y: auto;
  padding: 16px 0 4px;
}

.pcd-totals,
.pcd-checkout,
.pcd-companions { flex: 0 0 auto; }

.pcd__error { color: #9A3413; font-size: 13px; padding: 0 24px 16px; }
.pcd__error:empty { display: none; }

/* ---- состав ------------------------------------------------------------- */

/* Без разделителей: позиции и так разделены воздухом и миниатюрами, а линии
   дробили короткий список на клетки. Границу сохраняет только строка над
   итогами — она отмечает край области прокрутки. */
.pcd-line { display: flex; gap: 14px; padding: 12px 0; }
.pcd-line:first-child { padding-top: 0; }

/* align-self, иначе блок растягивается на высоту строки и под изображением
   выглядывает подложка — та самая «желтизна». Подложка нужна только на время
   загрузки, поэтому она остаётся ровно под картинкой. */
/* Миниатюра тянется на высоту строки, а изображение заполняет её: так текст
   никогда не оказывается выше картинки, а подложка не выглядывает снизу. */
/* Выравнивание по верху, а не растяжение. Растягивать картинку на высоту
   строки было ошибкой замысла: из неё выросла вся цепочка — проценты от
   авто-высоты, абсолютное позиционирование, обрезка. Квадрат фиксированного
   размера ничего этого не требует, а верхние края текста и картинки совпадают
   сами собой. Нижние края не обязаны совпадать: строка заканчивается там, где
   заканчивается её содержимое. */
.pcd-line__image {
  flex: 0 0 80px;
  align-self: flex-start;
  display: block;
  aspect-ratio: 1;
  overflow: hidden;
  background: var(--pepfer-paper);
}
/* contain, а не cover: миниатюру готовит штатный resize(160, 200) — он всегда
   отдаёт ровно 160×200, дополняя полями, поэтому исходные пропорции фотографии
   до панели не доходят, и обрезать нечего. При 80px ширины естественная высота
   как раз 100px, отсюда и min-height. Если строка окажется выше — из-за длинного
   названия или опций, — картинка не растянется и не обрежется, а останется по
   центру; подложка под ней того же белого, что и поля самой миниатюры, поэтому
   добавка незаметна. */
/* contain: миниатюра уже приведена к квадрату сервером, обрезать нечего.
   Правило остаётся страховкой на случай, если в кэше окажется файл другого
   формата — тогда он впишется, а не обрежется. */
.pcd-line__image img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: contain;
}

.pcd-line__body { flex: 1 1 auto; min-width: 0; }

.pcd-line__name {
  display: block;
  font-family: var(--pepfer-sans);
  font-size: 14px;
  line-height: 1.35;
  color: var(--pepfer-ink);
  text-decoration: none;
}
.pcd-line__name:hover { color: var(--pepfer-accent-deep); }

.pcd-line__variant,
.pcd-line__option { font-size: 12px; color: var(--pepfer-muted); margin-top: 2px; }

/* Мельче названия: в строке две величины одного кегля читаются как одна
   мысль, а цена — отдельное сообщение. */
.pcd-line__price { margin-top: 6px; font-size: 13px; color: var(--pepfer-ink); }

.pcd-line__controls { display: flex; align-items: center; gap: 2px; margin-top: 10px; }

/* Ни рамок, ни собственной высоты: знаки живут в одной строке с числом.
   Область нажатия добирается горизонтальными отступами, чтобы по ним можно
   было попасть пальцем, не поднимая высоту строки. */
.pcd-step {
  padding: 2px 7px;
  border: 0;
  background: transparent;
  color: var(--pepfer-muted);
  font-family: var(--pepfer-sans);
  font-size: 15px;
  line-height: 1;
  cursor: pointer;
  transition: background-color .2s ease, color .2s ease;
}
/* Инверсия, как у остальных действий панели. */
.pcd-step:hover,
.pcd-step:focus-visible {
  background: var(--pepfer-ink);
  color: var(--pepfer-paper);
}
.pcd-step:disabled { opacity: .4; cursor: default; }

.pcd-qty { min-width: 18px; text-align: center; font-size: 14px; line-height: 1; font-variant-numeric: tabular-nums; }

/* Та же инверсия, что у кнопки покупки: одно действие — одно поведение. */
/* Прижата к правому краю панели. Рамки нет вовсе: она меняла цвет вместе с
   фоном, и переход читался как подрагивание строки. Геометрия при наведении
   не меняется — только цвет. */
.pcd-remove {
  display: inline-block;
  margin-left: auto;
  border: 0;
  background: transparent;
  padding: 5px 9px;
  font-family: var(--pepfer-sans);
  font-size: 11px;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--pepfer-muted);
  cursor: pointer;
  transition: background-color .2s ease, color .2s ease;
}
.pcd-remove:hover,
.pcd-remove:focus-visible {
  background: var(--pepfer-ink);
  color: var(--pepfer-paper);
}

.pcd-line__error { color: #9A3413; font-size: 12px; margin-top: 6px; }
.pcd-line__error:empty { display: none; }

/* ---- итоги и оформление --------------------------------------------------- */

.pcd-totals { padding: 14px 0; border-top: 1px solid var(--pepfer-line); }

.pcd-total {
  display: flex;
  justify-content: space-between;
  gap: 12px;
  font-size: 14px;
  color: var(--pepfer-ink);
  margin-bottom: 6px;
}
.pcd-total:last-child { margin-bottom: 0; font-weight: 600; }

/* Инверсия та же, что у кнопки покупки: одно действие — одно поведение. */
/* Высота как у кнопки покупки в карточке: 46px и выключка по центру. Разные
   высоты у одинаковых по смыслу кнопок читаются как разные по важности. */
.pcd-checkout {
  display: flex;
  align-items: center;
  justify-content: center;
  /* Кнопка покупки — <button>, а эта — <a>: у кнопок тема уже задала
     border-box, у ссылок нет, и рамка добавлялась к высоте сверху. */
  box-sizing: border-box;
  min-height: 46px;
  padding: 0 20px;
  border: 1px solid #241F1A;
  background: #241F1A;
  color: var(--pepfer-paper);
  font-size: 12px;
  font-weight: 400;
  letter-spacing: .1em;
  text-transform: uppercase;
  text-align: center;
  text-decoration: none;
  transition: background-color .2s ease, color .2s ease;
}
.pcd-checkout:hover,
.pcd-checkout:focus-visible { background: var(--pepfer-paper); color: #241F1A; }
.pcd-checkout:active { background: #241F1A; color: var(--pepfer-paper); }

.pcd-empty { padding: 40px 0; text-align: center; color: var(--pepfer-muted); font-size: 15px; }

/* ---- карусель сопутствующих ------------------------------------------------
   Ровно две карточки в поле зрения на любой ширине (COMP-01). Ширина считается
   от контейнера, поэтому панель не переполняется по горизонтали. */

/* Ближе к кнопке оформления: 28px отрывали карусель от корзины и делали её
   отдельным блоком, а она — продолжение того же разговора. */
.pcd-companions { position: relative; margin-top: 14px; }

.pcd-track {
  display: grid;
  grid-auto-flow: column;
  grid-auto-columns: calc((100% - var(--pepfer-gutter)) / 2);
  gap: var(--pepfer-gutter);
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  scrollbar-width: none;
  -webkit-overflow-scrolling: touch;
}
.pcd-track::-webkit-scrollbar { display: none; }
.pcd-track:focus-visible { outline: 2px solid var(--pepfer-accent); outline-offset: 4px; }

/* Карточка — колонка: лента уже выравнивает карточки по высоте (грид тянет
   элементы строки), а колонка позволяет прижать кнопку к низу. Иначе кнопка
   вставала сразу под ценой, и у соседей с разной длиной названия оказывалась
   на разной высоте. */
.pcd-card {
  scroll-snap-align: start;
  min-width: 0;
  display: flex;
  flex-direction: column;
}

/* Квадрат — как и в строках корзины: каталог на 83% квадратный, а портретный
   короб добавлял карточкам высоты, из-за которой карусель не помещалась. */
.pcd-card__image {
  display: block;
  position: relative;
  aspect-ratio: 1;
  overflow: hidden;
  background: var(--pepfer-paper);
}
.pcd-card__image img { display: block; width: 100%; height: 100%; object-fit: contain; }

/* Сердце ведёт себя так же, как в каталоге: только значок, без подложки и без
   рамки, отклик — плотностью. Заливку приходится гасить явно, иначе её даёт
   общее правило button:hover из style.css темы, и на месте значка появлялся
   тёмный прямоугольник. */
.pcd-card__wish {
  position: absolute;
  top: 8px;
  right: 8px;
  width: 24px;
  height: 24px;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 0;
  border: 0;
  background: transparent;
  color: var(--pepfer-ink);
  opacity: .38;
  cursor: pointer;
  transition: opacity .2s ease, color .2s ease;
}
.pcd-card:hover .pcd-card__wish { opacity: .75; }

.pcd-card__wish:hover,
.pcd-card__wish:focus-visible {
  background: transparent;
  opacity: 1;
}

/* Уже в избранном — залитое сердце акцентным цветом, как в каталоге. */
.pcd-card__wish.is-active {
  opacity: 1;
  color: var(--pepfer-accent);
}
.pcd-card__wish.is-active svg path { fill: currentColor; }

.pcd-card__wish svg { display: block; }

/* Под название всегда отведены две строки: у товаров вроде «Брелок подвеска
   Матрёшка S Супрематизм» имя переносится, у «Брелок подвеска Слон» — нет, и
   без запаса цена с кнопкой у соседей стояли на разной высоте. Длиннее двух
   строк имя обрезается многоточием — третья строка растянула бы всю ленту. */
.pcd-card__name {
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  margin-top: 8px;
  min-height: 2.7em;
  font-size: 13px;
  line-height: 1.35;
  color: var(--pepfer-ink);
  text-decoration: none;
}
.pcd-card__name:hover { color: var(--pepfer-accent-deep); }

.pcd-card__variant { font-size: 12px; color: var(--pepfer-muted); margin-top: 2px; }
.pcd-card__price { margin-top: 4px; margin-bottom: 8px; font-size: 13px; color: var(--pepfer-ink); }
.pcd-card__price s { color: var(--pepfer-muted); margin-right: 4px; }

/* Во всю ширину миниатюры. Селектор с двумя частями намеренно: правило
   .pcd button { width: auto } весит (0,1,1) и побеждало одиночный класс
   .pcd-card__button (0,1,0) — кнопка оставалась по ширине текста.

   box-sizing обязателен: без него рамка добавлялась к ширине, кнопка вылезала
   за карточку, а на наведении пересчёт сдвигал соседей — то самое дрожание. */
.pcd-companions .pcd-card__button {
  display: block;
  box-sizing: border-box;
  width: 100%;
  /* auto, а не фиксированный отступ: кнопка прижимается к низу карточки, и у
     всех карточек ленты она оказывается на одной линии. */
  margin-top: auto;
  padding: 9px 10px;
  border: 1px solid #241F1A;
  background: transparent;
  color: #241F1A;
  font-family: var(--pepfer-sans);
  font-size: 11px;
  letter-spacing: .08em;
  text-transform: uppercase;
  text-align: center;
  text-decoration: none;
  cursor: pointer;
  transition: background-color .2s ease, color .2s ease;
}
.pcd-companions .pcd-card__button:hover,
.pcd-companions .pcd-card__button:focus-visible { background: #241F1A; color: var(--pepfer-paper); }
.pcd-companions .pcd-card__button:disabled { opacity: .5; cursor: default; }

.pcd-card__error { color: #9A3413; font-size: 12px; margin-top: 6px; }
.pcd-card__error:empty { display: none; }

/* Без рамки и без скругления — круглых элементов в оформлении нет. Центр по
   середине изображения, а не по середине карточки: карточка ниже картинки на
   высоту названия, цены и кнопки, и стрелка на её середине оказывалась под
   подписью.

   Отклик — сдвигом, а не заливкой: стрелка показывает направление, и уехать в
   ту же сторону для неё естественнее, чем потемнеть. Фон приходится гасить
   явно, иначе на наведении его даёт общее правило button:hover из style.css. */
/* Селектор составной намеренно: .pcd button { width: auto } весит (0,1,1) и
   побеждал одиночный класс — стрелка выходила шириной по значку, 7px вместо
   44, и попасть в неё было почти невозможно. */
.pcd-companions .pcd-arrow {
  position: absolute;
  /* Проценты в top считаются от высоты контейнера, а нужна половина высоты
     картинки — она равна ширине карточки. Ширину знает только раскладка,
     поэтому её измеряет скрипт при отрисовке и кладёт сюда. */
  top: var(--pcd-arrow-top, 40%);
  z-index: 2;
  width: 44px;
  height: 44px;
  padding: 0;
  border: 0;
  background: var(--pepfer-paper);
  color: var(--pepfer-ink);
  font-size: 22px;
  line-height: 1;
  cursor: pointer;
  transition: transform .2s ease-out;
}

.pcd-companions .pcd-arrow:hover,
.pcd-companions .pcd-arrow:focus-visible,
.pcd-companions .pcd-arrow:active { background: var(--pepfer-paper); color: var(--pepfer-ink); }

/* Сдвиг по направлению стрелки. translateY(-50%) остаётся во всех состояниях —
   он держит стрелку по центру картинки, и потерять его нельзя. */
.pcd-companions .pcd-arrow--prev { transform: translate(0, -50%); }
.pcd-companions .pcd-arrow--next { transform: translate(0, -50%); }

.pcd-companions .pcd-arrow--prev:hover,
.pcd-companions .pcd-arrow--prev:focus-visible { transform: translate(-4px, -50%); }

.pcd-companions .pcd-arrow--next:hover,
.pcd-companions .pcd-arrow--next:focus-visible { transform: translate(4px, -50%); }

/* Нажатие — едва заметное уменьшение, отсчёт от той же точки. */
.pcd-companions .pcd-arrow--prev:active { transform: translate(-4px, -50%) scale(.97); }
.pcd-companions .pcd-arrow--next:active { transform: translate(4px, -50%) scale(.97); }

@media (prefers-reduced-motion: reduce) {
  .pcd-companions .pcd-arrow { transition: none; }
}
.pcd-companions .pcd-arrow[hidden] { display: none; }
.pcd-companions .pcd-arrow:disabled { opacity: .3; cursor: default; }
.pcd-companions .pcd-arrow--prev { left: -14px; }
.pcd-companions .pcd-arrow--next { right: -14px; }

/* ---- скелет на время первой загрузки --------------------------------------
   Панель открывается сразу, а не после сетевого ответа: ожидание с пустым
   белым прямоугольником читается как поломка. */

.pcd-skeleton__row {
  height: 96px;
  margin-bottom: 16px;
  background: linear-gradient(90deg, var(--pepfer-soft) 25%, #F2F0EC 50%, var(--pepfer-soft) 75%);
  background-size: 200% 100%;
  animation: pcd-shimmer 1.4s linear infinite;
}

@keyframes pcd-shimmer {
  from { background-position: 200% 0; }
  to { background-position: -200% 0; }
}

@media (prefers-reduced-motion: reduce) {
  .pcd__scrim,
  .pcd__panel { transition: none; }
  .pcd-skeleton__row { animation: none; }
}

/* ---- Вход и восстановление пароля ---------------------------------------
   Заголовки убраны из шаблонов: страницу называют хлебные крошки, а повтор того
   же слова крупным кеглем только отодвигал форму вниз — она оказывалась у
   середины экрана, а до подвала оставалась пустая полоса.

   Отступы теперь задаются самой формой, а не заголовком, которого больше нет. */

.login_page,
.forgotten_page {
  margin-top: 40px;
  margin-bottom: 90px;
}

/* Кнопка входа: та же инверсия, что у «Добавить в корзину». Прежде на наведении
   она лишь чуть светлела — общее правило темы меняло #101820 на #3A322A, и
   разницу почти не было видно. */
.login_page .button_block [type="submit"],
.forgotten_page .button_block [type="submit"] {
  box-sizing: border-box;
  width: 100%;
  max-width: none;
  margin: 0;
  min-height: 46px;
  padding: 0 20px;
  border: 1px solid #241F1A;
  border-radius: 0;
  background-color: #241F1A;
  color: var(--pepfer-paper);
  font-family: var(--pepfer-sans);
  font-size: 12px;
  font-weight: 400;
  letter-spacing: .1em;
  text-transform: uppercase;
  cursor: pointer;
  transition: background-color .2s ease, color .2s ease;
}

.login_page .button_block [type="submit"]:hover,
.login_page .button_block [type="submit"]:focus-visible,
.forgotten_page .button_block [type="submit"]:hover,
.forgotten_page .button_block [type="submit"]:focus-visible {
  background-color: var(--pepfer-paper);
  color: #241F1A;
}

.login_page .button_block [type="submit"]:active,
.forgotten_page .button_block [type="submit"]:active {
  background-color: #241F1A;
  color: var(--pepfer-paper);
}

.login_page .button_block [type="submit"]:focus-visible,
.forgotten_page .button_block [type="submit"]:focus-visible {
  outline: 2px solid var(--pepfer-accent);
  outline-offset: 2px;
}


/* Поясняющая строка на восстановлении пароля. */
.forgotten_page p {
  font-family: var(--pepfer-sans);
  font-size: 14px;
  line-height: 1.6;
  color: var(--pepfer-muted);
  margin-bottom: 22px;
}

/* ---- Всплывающие сообщения ----------------------------------------------
   Плашки OpenCart вставляются в начало содержимого и сдвигают страницу вниз
   ровно тогда, когда человек смотрит на поле, где ошибся. Сообщение живёт в
   слое поверх страницы: вёрстка не шевелится. */

.pepfer-toasts {
  position: fixed;
  top: 24px;
  left: 50%;
  transform: translateX(-50%);
  z-index: 1300;
  display: flex;
  flex-direction: column;
  gap: 8px;
  width: min(520px, calc(100% - 32px));
  pointer-events: none;
}

.pepfer-toast {
  position: relative;
  padding: 14px 42px 14px 18px;
  background: var(--pepfer-ink);
  color: var(--pepfer-paper);
  font-family: var(--pepfer-sans);
  font-size: 14px;
  line-height: 1.5;
  box-shadow: 0 10px 30px rgba(32, 27, 20, .22);
  opacity: 0;
  transform: translateY(-10px);
  transition: opacity .25s ease, transform .25s ease;
  pointer-events: auto;
}
.pepfer-toast.is-visible { opacity: 1; transform: translateY(0); }

/* Ошибка отличается не только цветом: у неё своя полоса слева. */
.pepfer-toast--error { border-left: 3px solid var(--pepfer-accent); }
.pepfer-toast--success { border-left: 3px solid #4E7A3A; }

.pepfer-toast a { color: var(--pepfer-paper); text-decoration: underline; text-underline-offset: 2px; }

.pepfer-toast__close {
  position: absolute;
  top: 10px;
  right: 10px;
  width: 24px;
  height: 24px;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 0;
  border: 0;
  background: transparent;
  color: var(--pepfer-paper);
  opacity: .7;
  cursor: pointer;
  transition: opacity .2s ease;
}
.pepfer-toast__close:hover,
.pepfer-toast__close:focus-visible { background: transparent; opacity: 1; }

@media (prefers-reduced-motion: reduce) {
  .pepfer-toast { transition: none; }
}

/* ---- Вход, регистрация, восстановление ----------------------------------- */

.register_page { margin-top: 40px; margin-bottom: 90px; }

/* Поля стояли на 20px друг от друга — форма из двух строк растягивалась на
   треть экрана. Достаточно того расстояния, что разделяет строки текста. */
.login_page .input_block,
.forgotten_page .input_block,
.register_page .input_block,
.register_page .select_block { margin-bottom: 12px; }

/* Значок показа пароля вместо надписи. */
.login_page .input_block.password { position: relative; }
.login_page .input_block.password input { padding-right: 48px; }

.login_page .password-eye {
  position: absolute;
  top: 50%;
  right: 12px;
  transform: translateY(-50%);
  width: 28px;
  height: 28px;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 0;
  border: 0;
  background: transparent;
  color: var(--pepfer-muted);
  opacity: .7;
  cursor: pointer;
  transition: opacity .2s ease, color .2s ease;
}
.login_page .password-eye:hover,
.login_page .password-eye:focus-visible {
  background: transparent;
  color: var(--pepfer-ink);
  opacity: 1;
}
.login_page .password-eye svg { display: block; }

/* Пароль скрыт — глаз перечёркнут; показан — черта уходит. */
.login_page .password-eye.is-shown .password-eye__slash { display: none; }

/* Ссылки под кнопкой входа: по центру, друг под другом, тише кнопки. */
/* Своё правило перехода здесь перебивало общее, и линия появлялась целиком,
   без раскрытия. Переход указан полностью: и цвет, и ширина линии. */
.login_page .login-links a {
  display: inline;
  font-family: var(--pepfer-sans);
  font-size: 13px;
  color: var(--pepfer-muted);
  text-decoration: none;
  transition: background-size var(--pepfer-underline-speed) ease-out, color .2s ease;
}

/* Регистрация — гиперссылка, а не кнопка: контурная кнопка спорила по весу со
   входом, хотя ведёт в сторону. Отличается от «забыли пароль» только тем, что
   набрана чернилами: это следующий шаг, а не помощь при заминке. */

.login_page .login-links a:hover,
.login_page .login-links a:focus-visible { color: var(--pepfer-accent-deep); }

/* Кнопка регистрации на самой странице регистрации — как вход. */
.register_page [type="submit"] {
  box-sizing: border-box;
  width: 100%;
  max-width: none;
  margin: 0;
  min-height: 46px;
  padding: 0 20px;
  border: 1px solid #241F1A;
  border-radius: 0;
  background-color: #241F1A;
  color: var(--pepfer-paper);
  font-family: var(--pepfer-sans);
  font-size: 12px;
  font-weight: 400;
  letter-spacing: .1em;
  text-transform: uppercase;
  cursor: pointer;
  transition: background-color .2s ease, color .2s ease;
}
.register_page [type="submit"]:hover,
.register_page [type="submit"]:focus-visible {
  background-color: var(--pepfer-paper);
  color: #241F1A;
}
.register_page [type="submit"]:active {
  background-color: #241F1A;
  color: var(--pepfer-paper);
}

/* ---- Выход из личного кабинета ------------------------------------------- */

.account-logout {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  max-width: 300px;
  margin: 40px auto 0;
  padding: 0 20px;
  min-height: 46px;
  box-sizing: border-box;
  border: 1px solid #241F1A;
  background: transparent;
  color: #241F1A;
  font-family: var(--pepfer-sans);
  font-size: 12px;
  letter-spacing: .1em;
  text-transform: uppercase;
  text-decoration: none;
  transition: background-color .2s ease, color .2s ease;
}
.account-logout:hover,
.account-logout:focus-visible { background: #241F1A; color: var(--pepfer-paper); }
.account-logout svg { display: block; }

/* ---- Регистрация ---------------------------------------------------------
   Страница устроена иначе, чем вход: это штатная форма OpenCart с двухколоночной
   сеткой Bootstrap — подпись слева, поле справа, — и 26 групп полей. Переписать
   её в один столбец с плейсхолдерами значило бы вручную перенести двадцать шесть
   блоков вместе с обязательными полями, произвольными полями магазина и
   разметкой ошибок. Поэтому вид приводится стилями: сетка распрямляется в
   колонку, подписи встают над полями, поля и кнопка получают тот же облик, что
   на входе. Поведение формы при этом не трогается вовсе. */

#account-register .container,
#account-register #content {
  box-sizing: border-box;
}

#account-register #content {
  width: 100%;
  max-width: 560px;
  margin: 40px auto 90px;
  padding: 0;
  float: none;
}

/* Разделы формы: «Ваши данные», «Пароль», «Рассылка». Заголовок раздела —
   тише названия страницы, но заметнее подписи поля. */
#account-register legend {
  margin: 28px 0 16px;
  padding-bottom: 10px;
  border-bottom: 1px solid var(--pepfer-line);
  font-family: var(--pepfer-sans);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--pepfer-muted);
}
#account-register fieldset:first-of-type legend { margin-top: 0; }

/* Сетка распрямляется: подпись над полем, поле во всю ширину. */
/* У fieldset есть собственные внутренние отступы браузера по умолчанию —
   из-за них поля оказывались уже формы на 26px. */
#account-register fieldset {
  margin: 0;
  padding: 0;
  border: 0;
}

/* Боковое меню кабинета на этой странице не нужно: посетитель ещё не вошёл, и
   ссылки «Профиль», «Мои заказы» ведут его на страницу входа. Раньше оно стояло
   рядом с формой; теперь форма по центру, и меню съехало бы под неё пустой
   колонкой в 432px перед подвалом. */
#account-register .row > aside,
#account-register .row > .col-sm-3 { display: none; }

#account-register .form-group {
  display: block;
  margin-bottom: 12px;
}

#account-register .control-label {
  display: block;
  width: auto;
  margin-bottom: 6px;
  padding: 0;
  float: none;
  text-align: left;
  font-family: var(--pepfer-sans);
  font-size: 12px;
  font-weight: 400;
  color: var(--pepfer-muted);
}

#account-register .form-group > div[class^="col-"],
#account-register .form-group > div[class*=" col-"] {
  width: 100%;
  padding: 0;
  float: none;
}

/* Обязательное поле помечается звёздочкой у подписи, а не только цветом. */
#account-register .required .control-label::after {
  content: ' *';
  color: var(--pepfer-accent);
}

#account-register .form-control {
  box-sizing: border-box;
  width: 100%;
  height: 46px;
  padding: 0 14px;
  border: 1px solid var(--pepfer-line);
  border-radius: 0;
  background: var(--pepfer-paper);
  box-shadow: none;
  font-family: var(--pepfer-sans);
  font-size: 14px;
  color: var(--pepfer-ink);
}
#account-register textarea.form-control { height: auto; padding: 12px 14px; }
#account-register .form-control:focus {
  border-color: var(--pepfer-ink);
  box-shadow: none;
  outline: none;
}

/* Ошибка поля — под ним, не сдвигая соседей заметнее необходимого. */
#account-register .text-danger {
  display: block;
  margin-top: 4px;
  font-size: 12px;
  color: #9A3413;
}

/* Согласие и рассылка — обычные строки, а не элементы формы во всю ширину. */
#account-register .buttons {
  display: flex;
  flex-direction: column;
  gap: 14px;
  margin-top: 24px;
  padding: 0;
  border: 0;
}
#account-register .buttons .pull-right,
#account-register .buttons .pull-left { float: none; }

#account-register [type="submit"] {
  box-sizing: border-box;
  width: 100%;
  max-width: none;
  margin: 0;
  min-height: 46px;
  padding: 0 20px;
  border: 1px solid #241F1A;
  border-radius: 0;
  background-color: #241F1A;
  color: var(--pepfer-paper);
  font-family: var(--pepfer-sans);
  font-size: 12px;
  font-weight: 400;
  letter-spacing: .1em;
  text-transform: uppercase;
  cursor: pointer;
  transition: background-color .2s ease, color .2s ease;
}
#account-register [type="submit"]:hover,
#account-register [type="submit"]:focus-visible {
  background-color: var(--pepfer-paper);
  color: #241F1A;
}
#account-register [type="submit"]:active {
  background-color: #241F1A;
  color: var(--pepfer-paper);
}

/* Строка «уже зарегистрированы?» над формой — подпись, а не заголовок. */
#account-register #content > p {
  margin-bottom: 24px;
  font-family: var(--pepfer-sans);
  font-size: 13px;
  color: var(--pepfer-muted);
}
#account-register #content > p a {
  color: var(--pepfer-ink);
  text-decoration: underline;
  text-underline-offset: 3px;
}
#account-register #content > p a:hover { color: var(--pepfer-accent-deep); }

/* ---- Вход: единый шаг по вертикали ---------------------------------------
   Прежде расстояния были разными: между полями 12px, до кнопки — 30px от
   темы, а «Забыли пароль?» тянула к себе ещё -15px сверху и 15px снизу.
   Теперь один шаг на всю форму, самый малый из бывших — 12px: поля, кнопка и
   обе ссылки стоят через одинаковый промежуток. */

.login_page .button_block,
.forgotten_page .button_block { margin-top: 0; }

/* Поле и кнопка одной высоты. Кнопка уже была 46px — к ней и приведены поля;
   заодно это тот же размер, что на регистрации, так что все три страницы
   кабинета набраны одинаково. */
.login_page .input_block input,
.forgotten_page .input_block input {
  box-sizing: border-box;
  height: 46px;
  padding: 0 14px;
  border: 1px solid var(--pepfer-line);
  border-radius: 0;
  background: var(--pepfer-paper);
  font-family: var(--pepfer-sans);
  font-size: 14px;
  line-height: normal;
  color: var(--pepfer-ink);
}
.login_page .input_block.password input { padding-right: 48px; }

.login_page .input_block input:hover,
.login_page .input_block input:focus,
.forgotten_page .input_block input:hover,
.forgotten_page .input_block input:focus {
  border-color: var(--pepfer-ink);
  outline: none;
}

/* Тема правила эту ссылку отдельно — прижимала вправо и раздвигала соседей.
   Расположением обеих ссылок теперь ведает только .login-links. */
.login_page .button_block .forgotten {
  display: inline;
  margin: 0;
  text-align: center;
}

/* Ссылки здесь — элементы флексбокса, а он делает их блочными, поэтому их
   нижнее поле под подчёркивание всё-таки занимает место. Просвет уменьшен ровно
   на это поле, чтобы расстояние между строками осталось тем же, что и везде на
   странице: 12px от текста до текста. */
.login_page .login-links {
  /* Не флексбокс: он делает своих детей блочными, а нам нужно, чтобы ссылки
     остались строчными — иначе подчёркивание отступает от слова на половину
     межстрочного просвета. Строки разводит обычный отступ. */
  display: block;
  text-align: center;
  font-size: 13px;
  line-height: normal;
  margin-top: 12px;
}

/* «Регистрация» — гиперссылка, а не кнопка: ни рамки, ни заливки, ни инверсии
   на наведении. От «Забыли пароль?» отличается только цветом — это следующий
   шаг, а не помощь при заминке. Подчёркнута, как и положено ссылке; на
   наведении меняет цвет, как все ссылки темы. */
/* Ни рамки, ни заливки, ни инверсии: подчёркивание и его раскрытие даёт
   общая система ссылок, поэтому фон здесь не сбрасывается — им она и рисует. */
/* Строки под кнопкой: расстояние между ними задаётся обёртками, а не самими
   ссылками — у ссылок теперь нижнее поле под черту, и оно бы вмешалось. */
.login_page .login-links__row + .login-links__row {
  /* Те же 12px, что и между полями. У строчной ссылки нижнее поле под черту
     в высоту строки не входит, вычитать его не нужно — замер по самим строкам
     текста даёт ровно 12. */
  margin-top: 12px;
}

.login_page .login-links .register {
  display: inline;
  min-height: 0;
  margin: 0;
  padding: 0 0 var(--pepfer-underline-gap);
  border: 0;
  background-color: transparent;
  color: var(--pepfer-ink);
  font-family: var(--pepfer-sans);
  font-size: 13px;
  font-weight: 400;
  letter-spacing: 0;
  line-height: normal;
  text-transform: none;
  text-decoration: none;
}
.login_page .login-links .register:hover,
.login_page .login-links .register:focus-visible {
  background-color: transparent;
  color: var(--pepfer-accent-deep);
}

/* ---- Поле-ловушка ---------------------------------------------------------
   Уводится за пределы экрана, а не прячется display:none: часть роботов
   пропускает поля, скрытые очевидным способом, и ловушка бы не сработала.
   От программ чтения с экрана поле закрыто атрибутом aria-hidden в разметке,
   из порядка обхода клавиатурой убрано через tabindex. */
.pepfer-trap {
  position: absolute;
  left: -9999px;
  top: auto;
  width: 1px;
  height: 1px;
  overflow: hidden;
}

/* ==========================================================================
   Единый вид гиперссылок
   --------------------------------------------------------------------------
   Подчёркивание рисуется не свойством text-decoration, а двумя фоновыми
   линиями: его нельзя раскрыть слева направо, а нам нужно именно движение.
   Нижний слой — бледная линия в покое, верхний — насыщенная, она и растёт по
   ширине при наведении. Текст при этом не трогается вовсе: меняется только
   размер фона, поэтому ссылка не подпрыгивает и не увеличивается.

   Отступ в 4px даётся нижним полем. У строчных элементов вертикальные поля не
   влияют на высоту строки — разметка остаётся на месте. Блочные ссылки
   (карточки, кнопки, картинки) в эту систему не входят, см. список исключений
   ниже: там поле сдвинуло бы соседей.
   ========================================================================== */

:root {
  /* Черта лежит у нижнего края поля отрисовки фона, то есть на глубине
     «свес шрифта + нижнее поле», а сама она толщиной в пиксель. Чтобы её верх
     оказался ровно в 3px под базовой линией, поле должно быть 3px + 1px − свес.
     Свес у этой гарнитуры около 0.24em, поэтому он и вычитается — так просвет
     держится одинаковым на любом кегле. Раньше я складывал там, где надо было
     вычитать, и черта уходила вниз тем дальше, чем крупнее текст. */
  --pepfer-underline-gap: max(0px, calc(4px - 0.24em));
  --pepfer-underline-speed: 240ms;
}

a {
  /* Запасной цвет для движков без color-mix: та же краска, просто бледнее. */
  --pepfer-underline-rest: rgba(32, 27, 20, .3);
}

@supports (color: color-mix(in srgb, currentColor 30%, transparent)) {
  a {
    /* Линия в покое — сама краска ссылки, разбавленная до трети: она заметно
       бледнее текста, но остаётся его цветом, а не серым по всему сайту. */
    --pepfer-underline-rest: color-mix(in srgb, currentColor 30%, transparent);
  }
}

a {
  text-decoration: none;
  background-image:
    linear-gradient(to right, currentColor, currentColor),
    linear-gradient(to right, var(--pepfer-underline-rest), var(--pepfer-underline-rest));
  background-size: 0 1px, 100% 1px;
  background-position: 0 100%, 0 100%;
  background-repeat: no-repeat;
  padding-bottom: var(--pepfer-underline-gap);
  transition: background-size var(--pepfer-underline-speed) ease-out, color .2s ease;
}

a:hover,
a:focus-visible {
  background-size: 100% 1px, 100% 1px;
}

@media (prefers-reduced-motion: reduce) {
  a { transition: color .2s ease; }
}

/* --- Что в систему не входит ---------------------------------------------
   Ссылки, которые не читаются как строка текста: картинки, кнопки, карточки
   товара, пункты меню, значки. Линия под ними была бы не подчёркиванием, а
   посторонней чертой, а нижнее поле сдвинуло бы соседей. */
a:has(img),
a:has(svg),
a:has(picture),
.btn,
[class*="__button"],
[class*="_button"],
.buttons a,
.logo a,
.menu_head a,
.mobile_menu a,
.products a,
.product-thumb a,
.new-arrivals__image,
.new-arrivals__name,
.editorial-row,
.see-all,
.dropdown-toggle,
.breadcrumb a,
.pagination a,
.swiper a,
.footer_cards a,
.footer-social__link,
.messengers a,
.pcd a,
.account-logout,
.pepfer-trap a,
/* Названия товаров в избранном и в сравнении: это позиции списка, а не строки
   текста со ссылкой внутри — черта под каждой превращала таблицу в штриховку. */
.wishlist-table__name,
.compare-table__name,
.wishlist-action,
.compare-remove {
  background-image: none;
  padding-bottom: 0;
}

/* --- Старые подчёркивания снимаются ---------------------------------------
   Там, где раньше стояло text-decoration, теперь работает система выше. Иначе
   под текстом оказались бы две линии сразу. */
.alert a,
.wishlist-notice a,
.pepfer-rich a,
.pepfer-toast a,
.login-links a,
.login-links .register,
.login_page .button_block .forgotten,
#account-register #content > p a,
.notice-panel__link:hover,
.footer-column a:hover {
  text-decoration: none;
}

/* Ссылка в тёмном всплывающем сообщении — на своём фоне, поэтому линия
   рассчитывается от её собственного цвета, а не от чернил страницы. */
.pepfer-toast a { --pepfer-underline-rest: rgba(255, 255, 255, .45); }

/* ---- Подвал --------------------------------------------------------------
   Начертание 500 в этой гарнитуре — Regular, а весь остальной текст сайта
   набран Light. Подвал поэтому и выглядел тяжелее страницы. Блок подписки
   оставлен как был: он и должен звучать громче соседей. */

.footer_menu,
.footer_menu .blocks .block .title,
.footer_menu .blocks .block ul li a,
.footer_menu_list,
.footer_menu_list ul li a,
.copyright {
  font-weight: 400;
}

/* Гарнитура и кегль заголовков колонок задаются здесь: правило темы для .title
   точнее, чем .footer-column .title, и перебивало бы их. Кегль был 12px —
   меньше, чем у ссылок под ними, отчего название раздела читалось тише
   собственного содержимого. */
.footer_menu .blocks .block .title {
  font-family: var(--pepfer-serif);
  font-size: 11px;
  letter-spacing: .06em;
}

/* Блок подписки остаётся как был: класс у него .footer-subscribe, а не
   .block_form из старой темы — по .block_form исключение не сработало бы. */
/* Заголовок подписки набран как остальные заголовки колонок: столбцы подвала
   равны между собой, выделять один из них нечем. Тяжелее соседей остаётся только
   кнопка отправки — она действие, а не название. */
.footer_menu .blocks .block.footer-subscribe .footer-subscribe__submit {
  font-weight: 600;
}

/* ---- Подвал: линия только при наведении ---------------------------------
   В колонках подвала ссылок много и стоят они плотно. Бледная линия под каждой
   превращала список в штриховку, поэтому в покое её здесь нет — линия
   раскрывается слева направо только под указателем. */
.footer-column a,
.footer_menu .blocks .block ul li a,
.footer_menu_list ul li a {
  --pepfer-underline-rest: transparent;
}

/* ---- Информационные страницы ---------------------------------------------
   Документы длинные и читаются подряд, поэтому им нужна не вся ширина экрана,
   а спокойная колонка набора: строка в 70–80 знаков, дальше глаз теряет начало
   следующей. Прежде слева стояла пустая плашка модулей, и текст жался вправо. */

.full_page_information {
  padding-bottom: 90px;
}

.information-page {
  /* Двадцать пикселей сверху: вместе с полем крошек документ отделён от
     навигации тридцатью — первая строка больше не упирается в путь по сайту. */
  margin-top: 20px;
  /* Около 92 знаков в строке — верхняя граница, за которой чтение подряд
     начинает сбиваться. Ширина задана в знаках, а не в пикселях, чтобы держаться
     этой меры на любом кегле; единица ch считается от кегля самого блока,
     поэтому он объявлен здесь же. */
  max-width: 71ch;
  /* Колонка по центру страницы, как и весь остальной сайт. Хлебные крошки
     остаются у левого поля: там их привычно искать, и это не обсуждается. */
  margin-right: auto;
  margin-bottom: 0;
  margin-left: auto;
  font-size: 15px;
}

.information-page__content {
  font-size: 15px;
  /* Просвет вернулся к обычному: он был увеличен под строку в 160 знаков, а на
     короткой строке та же величина читается как нарочно разогнанный текст. */
  line-height: 1.6;
}

/* Шаг абзацев. Свод правил .pepfer-rich задаёт его только для описаний товара —
   на информационных страницах абзацы шли слитно, отделённые лишь интерлиньяжем,
   и пункты договора сливались в сплошную простыню. */
.information-page__content p {
  margin: 0 0 1em;
}
.information-page__content p:last-child { margin-bottom: 0; }

.information-page__title {
  margin: 0 0 28px;
  font-family: var(--pepfer-serif);
  font-size: clamp(28px, 3.4vw, 42px);
  font-weight: 400;
  line-height: 1.15;
  letter-spacing: 0;
  text-transform: none;
  text-align: left;
  color: var(--pepfer-ink);
}

/* Портрет прижат к правому краю, текст обтекает его слева: вертикальный
   снимок во всю ширину колонки разрывал чтение надвое. */
.information-page .about-portrait {
  float: right;
  width: 260px;
  max-width: 42%;
  margin: 4px 0 24px 32px;
}

/* Подпись — служебная строка под снимком, а не заголовок. Кегль приходится
   объявлять с !important: общий сброс .pepfer-rich принудительно наследует
   размер от родителя, из-за чего подпись выходила в 15px да ещё полужирной. */
.information-page .about-portrait figcaption {
  margin-top: 10px;
  font-family: var(--pepfer-sans);
  font-size: 11px !important;
  font-weight: 400;
  line-height: 1.4 !important;
  letter-spacing: .04em;
  text-transform: none;
  /* Цвет тоже с !important: общий сброс принудительно наследует его от абзаца,
     и подпись выходила такой же чёрной, как основной текст. */
  color: var(--pepfer-muted) !important;
}

/* Снимки производства и упаковки — во всю ширину колонки. Обтекание из старой
   вёрстки убрано: текст рядом с картинкой сжимался до пяти слов в строке. */
.information-page .about-figure {
  margin: 36px 0 28px;
}

/* Снимки производства и упаковки идут во всю ширину колонки и не должны
   вставать рядом с обтекаемым портретом. */
.information-page .about-figure {
  clear: both;
}

.information-page figure img {
  display: block;
  width: 100%;
  height: auto;
}

@media (max-width: 767px) {
  .full_page_information { padding-bottom: 60px; }
  .information-page .about-portrait { max-width: 220px; }
}

/* Общий свод правил задаёт всем заголовкам от h1 до h6 один кегль — как
   запасной вариант для описаний товара, где уровень обычно один. На странице
   карьеры уровня два: раздел и пункт внутри него, — и без разницы в кегле
   иерархия читалась бы как сплошной список. */
.information-page__content h3 {
  font-size: 1.08em !important;
  margin-top: 1.8em;
}

/* ---- Оформление заказа: кнопки количества и удаления ----------------------
   Модуль рисует их значками FontAwesome, а этот шрифт темой не подключается —
   внутри кнопок оказывалось пусто. Дальше вступали два общих правила: заливка
   button цветом #101820 и width:100% из normalize.css. Пустая кнопка во всю
   ширину ячейки и читалась как чёрный прямоугольник.

   Значки заменены обычными знаками — минус, плюс и косой крест берутся из
   текущей гарнитуры, лишний шрифт ради трёх глифов подключать незачем. */

.simplecheckout .fa {
  font-style: normal;
  font-family: var(--pepfer-sans);
}
.simplecheckout .fa-minus::before { content: '\2212'; }
.simplecheckout .fa-plus::before { content: '+'; }
.simplecheckout .fa-times-circle::before { content: '\00D7'; }

/* Только кнопки со значком: под тот же класс .btn попадают «Обновить» и
   кнопка оформления заказа, а они должны остаться обычными кнопками темы. */
.simplecheckout .btn:has(.fa) {
  box-sizing: border-box;
  width: auto;
  min-width: 34px;
  height: 34px;
  padding: 0 10px;
  border: 1px solid var(--pepfer-line);
  border-radius: 0;
  background: var(--pepfer-paper);
  color: var(--pepfer-ink);
  font-family: var(--pepfer-sans);
  font-size: 16px;
  line-height: 1;
  text-transform: none;
  letter-spacing: 0;
  cursor: pointer;
  transition: border-color .2s ease, color .2s ease;
}

.simplecheckout .btn:has(.fa):hover,
.simplecheckout .btn:has(.fa):focus-visible {
  background: var(--pepfer-paper);
  border-color: var(--pepfer-ink);
}

/* Удаление отличается не формой, а цветом — и только под указателем. */
.simplecheckout .btn-danger:has(.fa):hover,
.simplecheckout .btn-danger:has(.fa):focus-visible {
  color: var(--pepfer-accent-deep);
  border-color: var(--pepfer-accent-deep);
}

/* Поле количества рядом с ними — той же высоты и не во всю ячейку. */
.simplecheckout .simplecheckout-cart input[type='text'] {
  box-sizing: border-box;
  width: 48px;
  height: 34px;
  padding: 0 6px;
  border: 1px solid var(--pepfer-line);
  border-radius: 0;
  text-align: center;
  font-family: var(--pepfer-sans);
  font-size: 14px;
}

/* ---- Подвал: соцсети и подписка одной колонкой ---------------------------
   Форма подписки лежит теперь внутри колонки «Присоединяйтесь к нам», поэтому
   собственные признаки колонки ей больше не нужны: ширину задаёт родитель. */
.footer-column .footer-subscribe {
  width: auto;
  max-width: none;
  margin-top: 26px;
}

/* Заголовок подписки — подзаголовок внутри колонки, а не название колонки,
   поэтому кегль ниже. Селектор длиннее правила темы для .title, иначе тот
   вернул бы 15px. */
.footer_menu .blocks .block .footer-subscribe .title {
  font-size: 11px;
  margin-bottom: 12px;
}

/* «Обновить» и «Оформить заказ» — ссылки <a class="button_oc">, а не кнопки,
   поэтому оформление кнопок темы их никогда не касалось: обе выводились голым
   текстом в 12px. Главное действие всей страницы выглядело как подпись. */

.simplecheckout a.button_oc {
  box-sizing: border-box;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 46px;
  padding: 0 26px;
  border: 1px solid #241F1A;
  background-color: #241F1A;
  color: var(--pepfer-paper);
  font-family: var(--pepfer-sans);
  font-size: 12px;
  letter-spacing: .1em;
  text-transform: uppercase;
  text-decoration: none;
  background-image: none;
  transition: background-color .2s ease, color .2s ease;
}

.simplecheckout a.button_oc:hover,
.simplecheckout a.button_oc:focus-visible {
  background-color: var(--pepfer-paper);
  color: #241F1A;
}

/* «Обновить» лишь пересчитывает корзину — это не действие наравне с
   оформлением заказа, поэтому контур вместо заливки. */
.simplecheckout .simplecheckout-cart-buttons a.button_oc {
  min-height: 38px;
  padding: 0 18px;
  background-color: transparent;
  color: #241F1A;
}

.simplecheckout .simplecheckout-cart-buttons a.button_oc:hover,
.simplecheckout .simplecheckout-cart-buttons a.button_oc:focus-visible {
  background-color: #241F1A;
  color: var(--pepfer-paper);
}

/* ---- Возврат товара -------------------------------------------------------
   Форма приведена к тому же виду, что вход и регистрация: один столбец,
   поля в 46px, разделы с подписями, кнопка с инверсией. */

.return_page {
  box-sizing: border-box;
  width: 100%;
  max-width: 560px;
  margin: 40px auto 90px;
  padding: 0;
  float: none;
}

.return_page__lead {
  margin-bottom: 28px;
  font-family: var(--pepfer-sans);
  font-size: 14px;
  line-height: 1.6;
  color: var(--pepfer-muted);
}
.return_page__lead p { margin: 0; }

.return_page fieldset {
  margin: 0;
  padding: 0;
  border: 0;
}

/* Заголовок раздела стоит на своей линии, а не висит над ней: между
   словами и чертой было десять пикселей плюс просвет строки, и подпись
   читалась как продолжение предыдущего раздела, а не как начало этого.
   Ниже линии, наоборот, воздуха больше — она отделяет заголовок от полей. */
.return_page legend {
  width: 100%;
  margin: 32px 0 18px;
  padding-bottom: 2px;
  border-bottom: 1px solid var(--pepfer-line);
  line-height: 1.2;
  font-family: var(--pepfer-sans);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--pepfer-muted);
}
.return_page fieldset:first-of-type legend { margin-top: 0; }

/* Поля, переключатели и кнопка описаны общим набором .pepfer-form —
   тем же, что в оформлении заказа. Здесь остаются только разделы,
   вступление и ссылка «Назад»: своего в форме возврата ровно они. */

.return_page .text-danger {
  display: block;
  margin-top: 4px;
  font-size: 12px;
  color: #9A3413;
}

.return_page .return-links {
  margin-top: 12px;
  text-align: center;
  font-size: 13px;
  line-height: normal;
}
.return_page .return-links a { color: var(--pepfer-muted); }

/* На «О нас» название страницы не выводится: её называют хлебные крошки, а
   крупный повтор того же слова над портретом только отодвигал рассказ вниз.
   У юридических документов заголовок остаётся — там он часть самого документа.
   13 — номер страницы «О нас». */
.information-page--13 .information-page__title {
  display: none;
}


/* Узкий экран: обтекание теряет смысл — портрет встаёт в колонку целиком. */
@media (max-width: 575px) {
  .information-page .about-portrait {
    float: none;
    width: auto;
    max-width: 220px;
    margin: 0 0 24px;
  }
}

/* Снимки не выходят за колонку текста: они часть рассказа, а не отдельный слой
   поверх страницы. Ограничение на всякий случай — на случай, если в документ
   когда-нибудь вставят изображение с собственной шириной. */
.information-page__content img {
  max-width: 100%;
  height: auto;
}

/* ---- Постраничная навигация ----------------------------------------------
   В журнале обёртки были заведены, а стилей к ним не написано: список
   складывался в столбец, потому что <li> по умолчанию блочные. Правила общие
   для журнала и каталога — навигация по страницам на сайте должна быть одна. */

.blog-list__pagination,
.pagination_block {
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 12px 24px;
  margin-top: 40px;
  padding-top: 24px;
  border-top: 1px solid var(--pepfer-line);
}

/* Когда страница одна, OpenCart отдаёт в {{ pagination }} пустую строку, но
   обёртка остаётся в разметке — и её верхняя линия висела над подвалом сама по
   себе. Заметнее всего это было на «Акциях» без акций: пустая страница, две
   линии подряд. Прячем обёртку, в которой нет ни одного элемента. */
.blog-list__pagination:not(:has(*)),
.pagination_block:not(:has(*)) {
  display: none;
}

.blog-list__pagination .pagination,
.pagination_block .pagination {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 4px;
  margin: 0;
  padding: 0;
  list-style: none;
}

.blog-list__pagination .pagination li,
.pagination_block .pagination li { margin: 0; }

.blog-list__pagination .pagination a,
.blog-list__pagination .pagination span,
.pagination_block .pagination a,
.pagination_block .pagination span {
  box-sizing: border-box;
  display: flex;
  align-items: center;
  justify-content: center;
  min-width: 36px;
  height: 36px;
  padding: 0 10px;
  border: 1px solid transparent;
  background: none;
  font-family: var(--pepfer-sans);
  font-size: 13px;
  line-height: 1;
  color: var(--pepfer-muted);
  text-decoration: none;
  transition: color .2s ease, border-color .2s ease;
}

/* Ссылки страниц входят в общую систему подчёркиваний, а здесь она не нужна:
   это не строки текста, а элементы управления. */
.blog-list__pagination .pagination a,
.pagination_block .pagination a {
  background-image: none;
}

.blog-list__pagination .pagination a:hover,
.pagination_block .pagination a:hover {
  color: var(--pepfer-ink);
  border-color: var(--pepfer-line);
}

/* Текущая страница — единственная, обведённая рамкой. */
.blog-list__pagination .pagination .active span,
.pagination_block .pagination .active span {
  border-color: var(--pepfer-ink);
  color: var(--pepfer-ink);
}

.blog-list__results,
.pagination_block .results {
  font-family: var(--pepfer-sans);
  font-size: 13px;
  color: var(--pepfer-muted);
}

@media (max-width: 575px) {
  .blog-list__pagination,
  .pagination_block { justify-content: center; }
}

/* ---- Полоса согласия на cookie -------------------------------------------
   Стили модуля подключаются после наших, поэтому селекторы здесь идут от
   идентификатора: он весит больше классов модуля, и обходиться без !important
   получается почти везде. Шаблон полосы переопределён в теме — оттуда убраны
   значки FontAwesome, которого на сайте нет. */

#cookie-banner.cookie-banner {
  box-sizing: border-box;
  padding: 22px 0;
  border-top: 1px solid var(--pepfer-line);
  border-radius: 0;
  background: var(--pepfer-paper);
  box-shadow: 0 -12px 32px rgba(32, 27, 20, .08);
  font-family: var(--pepfer-sans);
  color: var(--pepfer-ink);
}

#cookie-banner .cookie-content {
  box-sizing: border-box;
  max-width: 1265px;
  margin: 0 auto;
  padding: 0 var(--pepfer-gutter);
  gap: 24px 40px;
  /* По нижнему краю, а не по центру. В обычном виде текста одна-две строки и
     разницы нет, а в раскрытой настройке колонка с категориями высокая — и
     кнопки, выровненные по центру, повисали в пустоте на середине панели.
     Внизу они читаются как итог: прочитал условия — выбрал. */
  align-items: flex-end;
}

#cookie-banner .cookie-message { padding: 0; }

#cookie-banner #cookie-title,
#cookie-banner .cookie-message h4 {
  margin: 0 0 8px;
  font-family: var(--pepfer-serif);
  font-size: 16px;
  font-weight: 400;
  line-height: 1.3;
  letter-spacing: 0;
  text-transform: none;
  color: var(--pepfer-ink);
}

#cookie-banner .cookie-message p {
  margin: 0;
  font-size: 13px;
  line-height: 1.6;
  color: var(--pepfer-muted);
}

#cookie-banner .cookie-message a {
  color: var(--pepfer-ink);
  background-image: none;
  padding-bottom: 0;
  text-decoration: underline;
  text-underline-offset: 3px;
}

/* Кнопки: одна главная, остальные тише. «Принять все» — заливка, отказ и
   настройка — контур, как везде на сайте. */
#cookie-banner .cookie-buttons {
  display: flex;
  /* Оформление модуля ставит кнопки в столбик, и каждая получалась по ширине
     своей надписи — отсюда лесенка. В нижней полосе им место в ряд. */
  flex-direction: row;
  align-items: center;
  justify-content: flex-end;
  flex-wrap: wrap;
  gap: 10px;
}

#cookie-banner .cookie-buttons .btn {
  box-sizing: border-box;
  width: auto;
  min-height: 42px;
  /* Общая наименьшая ширина: без неё каждая кнопка равна длине своей надписи,
     и три штуки рядом выглядят как случайный набор. */
  min-width: 176px;
  padding: 0 20px;
  border: 1px solid #241F1A;
  border-radius: 0;
  background: transparent;
  color: #241F1A;
  font-family: var(--pepfer-sans);
  font-size: 12px;
  font-weight: 400;
  letter-spacing: .1em;
  text-transform: uppercase;
  white-space: nowrap;
  cursor: pointer;
  transition: background-color .2s ease, color .2s ease;
}

#cookie-banner .cookie-buttons .btn:hover,
#cookie-banner .cookie-buttons .btn:focus-visible {
  background: #241F1A;
  color: var(--pepfer-paper);
}

/* Залитая кнопка на полосе всегда ровно одна — «Принять все». «Сохранить
   выбор» остаётся контурной: это тоже согласие, но выборочное, и спорить с
   основным действием за внимание ему незачем. Состояние кнопок при этом ни на
   что не влияет — правило одно и то же в обоих режимах. */
#cookie-banner #accept-all {
  background: #241F1A;
  color: var(--pepfer-paper);
}
#cookie-banner #accept-all:hover,
#cookie-banner #accept-all:focus-visible {
  background: var(--pepfer-paper);
  color: #241F1A;
}

/* Разного вида кнопок ровно два: залитая — согласие, контурная — всё
   остальное. Раньше я делал «Настроить» ещё и бледнее «Отклонить», и три
   кнопки подряд читались как три разные сущности. */

/* Развёрнутая настройка категорий. Черты сверху нет: скрипт, раскрывая
   раздел, прячет и заголовок полосы, и её текст — линия оставалась висеть
   над «Настройкой cookie», не отделяя ничего от ничего. */
#cookie-banner #cookie-customize-options {
  margin-top: 0;
}

#cookie-banner #cookie-preferences {
  display: flex;
  flex-direction: column;
  gap: 14px;
  margin-top: 14px;
}

#cookie-banner .cookie-choice {
  display: flex;
  align-items: flex-start;
  gap: 10px;
  margin: 0;
  font-size: 13px;
  line-height: 1.5;
  color: var(--pepfer-muted);
  cursor: pointer;
}

#cookie-banner .cookie-choice input {
  width: auto;
  margin: 3px 0 0;
  flex: none;
  accent-color: var(--pepfer-ink);
}

#cookie-banner .cookie-choice b {
  display: block;
  margin-bottom: 2px;
  font-weight: 600;
  color: var(--pepfer-ink);
}

@media (max-width: 767px) {
  #cookie-banner .cookie-buttons { width: 100%; }
  #cookie-banner .cookie-buttons .btn { flex: 1 1 auto; }
}

/* Оформления модуля различаются раскраской ролей — btn-secondary, btn-danger,
   btn-success. Мы её снимаем: цвет кнопки на этом сайте означает вес действия,
   а не его характер. */
#cookie-banner .cookie-buttons .btn-secondary,
#cookie-banner .cookie-buttons .btn-danger {
  background: transparent;
  border-color: #241F1A;
  color: #241F1A;
}
#cookie-banner .cookie-buttons .btn-secondary:hover,
#cookie-banner .cookie-buttons .btn-danger:hover {
  background: #241F1A;
  color: var(--pepfer-paper);
}


/* В раскрытой настройке кнопки встают в столбик. Ряд там читался плохо: слева
   высокая колонка с описаниями категорий, справа три кнопки в одну линию — они
   висели поперёк рассказа. Столбик рядом с колонкой держит ту же вертикаль.
   В обычном виде полоса низкая, и ряд остаётся рядом. */
#cookie-banner.is-customizing .cookie-buttons {
  flex-direction: column;
  align-items: stretch;
}

#cookie-banner.is-customizing .cookie-buttons .btn {
  width: 100%;
}

/* ---- Оформление заказа: единый вид блоков --------------------------------
   Модуль размечает разделы по-разному: корзина таблицей, остальное панелями с
   заголовком. Приводим к одному: тонкая линия сверху, подпись раздела набором
   подписи, содержимое без рамок и заливок. */

#simplecheckout_form_0 .simplecheckout-block,
.simplecheckout .simplecheckout-block {
  margin-bottom: 28px;
  padding: 0;
  border: 0;
  border-radius: 0;
  background: none;
  box-shadow: none;
}

/* Селектор длиннее правила модуля (.simple-content .checkout-heading), иначе
   оно возвращает серую заливку и рамку. */
.simple-content .simplecheckout .checkout-heading,
.simple-content .simplecheckout .panel-heading,
.simplecheckout .checkout-heading,
.simplecheckout .panel-heading {
  margin: 0 0 10px;
  padding: 0;
  border: 0;
  border-bottom: 1px solid var(--pepfer-line);
  border-radius: 0;
  background: none;
  font-family: var(--pepfer-sans);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--pepfer-muted);
}

.simplecheckout .checkout-heading a {
  background-image: none;
  padding-bottom: 0;
  font-weight: 400;
  letter-spacing: .04em;
  text-transform: none;
  color: var(--pepfer-ink);
  text-decoration: underline;
  text-underline-offset: 3px;
}

.simplecheckout .simplecheckout-block-content {
  padding: 0;
  border: 0;
  background: none;
}

/* Таблица корзины — теми же линиями, что и остальные разделы. */
.simplecheckout .simplecheckout-cart table,
.simplecheckout table.simplecheckout-cart {
  width: 100%;
  border-collapse: collapse;
  border: 0;
}

.simplecheckout .simplecheckout-cart th,
.simplecheckout .simplecheckout-cart td {
  padding: 12px 10px;
  border: 0;
  background: none;
  font-family: var(--pepfer-sans);
  font-size: 13px;
  vertical-align: middle;
}

.simplecheckout .simplecheckout-cart th {
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--pepfer-muted);
}

/* Название товара в корзине — строка списка, а не ссылка в тексте. */
.simplecheckout .simplecheckout-cart a {
  background-image: none;
  padding-bottom: 0;
  color: var(--pepfer-ink);
}

/* Кнопки-ссылки обязаны показывать, что на них нажимают. */
.simplecheckout a.button_oc,
.simplecheckout .simplecheckout-button-block a {
  cursor: pointer;
}

/* Обязательные поля помечаются звёздочкой у подписи: класс required модуль
   проставляет, но ничем его не показывает. */
.simplecheckout .form-group.required > label::after,
.simplecheckout .form-group.required .control-label::after,
.simplecheckout .required > .control-label::after {
  content: ' *';
  color: var(--pepfer-accent);
}

/* Подписи и поля — тем же набором, что на остальных формах сайта. */
.simplecheckout .control-label {
  font-family: var(--pepfer-sans);
  font-size: 12px;
  font-weight: 400;
  color: var(--pepfer-muted);
}

.simplecheckout .form-control {
  box-sizing: border-box;
  height: 46px;
  padding: 0 14px;
  border: 1px solid var(--pepfer-line);
  border-radius: 0;
  background: var(--pepfer-paper);
  box-shadow: none;
  font-family: var(--pepfer-sans);
  font-size: 14px;
  color: var(--pepfer-ink);
}
.simplecheckout textarea.form-control { height: auto; padding: 12px 14px; }
.simplecheckout .form-control:focus { border-color: var(--pepfer-ink); box-shadow: none; outline: none; }

/* ---- Подсказки адреса -----------------------------------------------------
   Список появляется под полем и лежит в том же блоке, что и поле: модуль
   оформления перерисовывает блоки целиком, и список должен уезжать вместе
   со своим полем, а не оставаться висеть посреди страницы. */

.pepfer-hint {
  position: absolute;
  z-index: 60;
  top: 100%;
  left: 0;
  right: 0;
  max-height: 280px;
  overflow-y: auto;
  margin-top: -1px;
  border: 1px solid var(--pepfer-ink);
  background: var(--pepfer-paper);
  box-shadow: 0 14px 34px rgba(32, 27, 20, .12);
}

/* Список подсказок вынесен из формы отдельным слоем: место под полем скрипт
   считает сам, поэтому привязка к родителю здесь не нужна, а слой должен
   лежать выше всего, что рисует модуль оформления. */
.pepfer-hint--layer {
  position: fixed;
  top: 0;
  left: 0;
  right: auto;
  z-index: 4000;
}

.pepfer-hint__row {
  display: block;
  width: 100%;
  padding: 10px 14px;
  border: 0;
  border-radius: 0;
  background: none;
  /* Строка списка — кнопка, а кнопки в теме набраны прописными. Здесь это
     мешает: подсказка должна читаться как адрес, а не как надпись. */
  text-transform: none;
  letter-spacing: normal;
  font-family: var(--pepfer-sans);
  font-size: 13px;
  line-height: 1.4;
  text-align: left;
  color: var(--pepfer-ink);
  cursor: pointer;
  transition: background-color .12s ease;
}

.pepfer-hint__row + .pepfer-hint__row { border-top: 1px solid var(--pepfer-line); }

.pepfer-hint__row:hover,
.pepfer-hint__row:focus-visible {
  background: var(--pepfer-soft);
  color: var(--pepfer-ink);
  outline: none;
}

/* --------------------------------------------------------------------------
   Выбор пункта выдачи СДЭК

   Модуль вставляет сведения о выбранном пункте и кнопку выбора внутрь подписи
   переключателя — между самим переключателем и названием тарифа. Строка от
   этого разрывается посередине. Раскладываем подпись в гибкую строку и
   отправляем обе вставки под текст: сначала тариф, затем выбранный пункт,
   затем кнопка. Кнопка приведена к виду прочих второстепенных действий на
   оформлении — контур вместо заливки, никакого зелёного.
   -------------------------------------------------------------------------- */

/* display с !important: у модуля оформления есть правило
   «.simplecheckout label { display: inline-block !important }», и без этого
   строка не станет гибкой, а значит не сработают ни порядок вставок, ни
   прижатие кнопки вправо.

   Гибкими делаем все строки, а не только строку с кнопкой: иначе у выбранного
   способа переключатель встаёт по правилам вёрстки модуля, а у остальных —
   по своим, и отступ слева получается разным. */
.simplecheckout #simplecheckout_shipping .radio label {
  display: flex !important;
  flex-wrap: wrap;
  align-items: center;
  width: 100%;
  column-gap: 12px;
  padding-left: 0;
}

.simplecheckout #simplecheckout_shipping .radio input[type="radio"] {
  position: static;
  flex: 0 0 auto;
  margin: 0;
}

/* Надпись центрируется гибкой раскладкой, поэтому собственная высота строки
   должна быть ровно по тексту — иначе она съезжает вверх. */
.simplecheckout .cdek_btn {
  line-height: 1;
  padding-top: 0;
}

/* Когда пункт выбран, зазор между ним и кнопкой задаём явно: обоим ставить
   «прижаться вправо» нельзя, они бы разъехались по краям. */
.simplecheckout .cdek_office_info + .cdek_btn {
  margin-left: 20px;
}

.simplecheckout .cdek_office_info {
  order: 2;
  flex: 0 1 auto;
  margin: 0 0 0 auto;
  /* вместе с правилом ниже держит пару «пункт + кнопка» у правого края */
  font-family: var(--pepfer-sans);
  font-size: 13px;
  line-height: 1.4;
  color: var(--pepfer-muted);
}

.simplecheckout .cdek_btn {
  box-sizing: border-box;
  order: 3;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: 0 0 auto;
  width: auto;
  min-height: 28px;
  /* Прижата к правому краю и когда пункт ещё не выбран: тогда слева от
     неё ничего нет, и без этого она возвращалась к тексту тарифа. */
  margin: 0 0 0 auto;
  padding: 0 14px;
  border: 1px solid var(--pepfer-ink);
  border-radius: 0;
  background: var(--pepfer-paper);
  color: var(--pepfer-ink);
  font-family: var(--pepfer-sans);
  font-size: 12px;
  letter-spacing: .1em;
  text-transform: uppercase;
  cursor: pointer;
  transition: background-color .2s ease, color .2s ease;
}

.simplecheckout .cdek_btn:hover,
.simplecheckout .cdek_btn:focus-visible {
  background: var(--pepfer-ink);
  color: var(--pepfer-paper);
}

/* --------------------------------------------------------------------------
   Две колонки оформления заказа

   Левая — то, что заполняет покупатель, сверху вниз в порядке разговора:
   корзина, получатель, доставка, комментарий, оплата. Правая — итог и кнопка,
   которые должны быть под рукой в любой момент, а не в конце длинной страницы.

   Колонки выкладываются в ряд, растянутый по высоте: без этого правой колонке
   некуда прилипать — она заканчивается там же, где её содержимое.
   -------------------------------------------------------------------------- */

@media (min-width: 992px) {
  .simplecheckout .simplecheckout-step {
    display: flex;
    align-items: stretch;
  }

  .simplecheckout .simplecheckout-left-column,
  .simplecheckout .simplecheckout-right-column {
    box-sizing: border-box;
    float: none;
  }

  .simplecheckout .simplecheckout-right-column {
    padding-left: 40px;
  }


}

/* Панель итога читается как отдельный предмет, а не как продолжение формы.
   Оформление держит колонка целиком: кнопка заказа лежит рядом с блоком
   модуля, а не внутри него, и должна попасть в ту же рамку. */
.simplecheckout .simplecheckout-right-column {
  padding: 24px;
  border: 1px solid var(--pepfer-line);
  background: var(--pepfer-soft);
}

@media (min-width: 992px) {
  .simplecheckout .simplecheckout-right-column {
    align-self: flex-start;
    position: sticky;
    top: 20px;
  }
}

.simplecheckout #simplecheckout_summary .simplecheckout-block-heading {
  margin-top: 0;
}

.simplecheckout #simplecheckout_summary #simplecheckout_button_confirm,
.simplecheckout #simplecheckout_summary .pepfer-tbank__button {
  display: flex;
  width: 100%;
}

/* Блок оплаты приходит на место кнопки оформления, и выглядеть должен
   так же: во всю ширину сводки, без своих полей. */
.simplecheckout .pepfer-tbank { width: 100%; }

/* Пока блок оплаты на экране, штатная кнопка не нужна: заказ уже создан,
   оформлять его второй раз нечем, а две кнопки рядом сбивают с толку.
   Правилом, а не скриптом: блок приходит и уходит при каждой перерисовке
   оформления, и скрипту пришлось бы за этим следить. */
.simplecheckout:has(.pepfer-tbank) #simplecheckout_button_confirm { display: none; }



/* Галка регистрации вместо переключателя «да/нет». */
.simplecheckout .pepfer-check {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  margin: 0;
  font-family: var(--pepfer-sans);
  font-size: 14px;
  font-weight: 400;
  color: var(--pepfer-ink);
  cursor: pointer;
}

.simplecheckout .pepfer-check input {
  width: 16px;
  height: 16px;
  margin: 0;
  accent-color: var(--pepfer-ink);
  cursor: pointer;
}

/* --------------------------------------------------------------------------
   Доставка одним блоком

   Адрес, способ доставки и комментарий — три блока модуля, но для покупателя
   это одно решение. Собираем их в единую рамку: заголовок остаётся только у
   первого, границы между ними убираются.
   -------------------------------------------------------------------------- */

.simplecheckout #simplecheckout_shipping_address,
.simplecheckout #simplecheckout_shipping,
.simplecheckout #simplecheckout_comment {
  margin-bottom: 0;
}

.simplecheckout #simplecheckout_shipping .checkout-heading {
  display: none;
}

.simplecheckout #simplecheckout_comment {
  margin-bottom: 30px;
}

.simplecheckout #simplecheckout_comment .checkout-heading {
  margin-top: 24px;
}

/* Населённый пункт, регион и страна — одна строка: это одно уточнение места,
   а не три отдельных вопроса. Порядок от частного к общему, слева направо. */
/* Порядок задаётся всегда: полоса вкладок дописывается в конец разметки, и
   без порядка на узком экране поля курьера оказались бы над вкладками. */
.simplecheckout #simplecheckout_shipping_address .simplecheckout-block-content fieldset {
  display: flex;
  flex-wrap: wrap;
  column-gap: 16px;
  row-gap: 8px;
}

.simplecheckout .row-shipping_address_city,
.simplecheckout .row-shipping_address_zone_id,
.simplecheckout .row-shipping_address_country_id {
  flex: 1 1 100%;
  min-width: 0;
}

@media (min-width: 768px) {
  .simplecheckout .row-shipping_address_city,
  .simplecheckout .row-shipping_address_zone_id,
  .simplecheckout .row-shipping_address_country_id {
    flex: 1 1 0;
  }
}

.simplecheckout .row-shipping_address_city { order: 1; }
.simplecheckout .row-shipping_address_zone_id { order: 2; }
.simplecheckout .row-shipping_address_country_id { order: 3; }
.simplecheckout #simplecheckout_shipping_address fieldset .pepfer-tabs { order: 4; }
.simplecheckout .row-shipping_address_postcode { order: 5; }
.simplecheckout .row-shipping_address_address_1 { order: 6; }

.simplecheckout #simplecheckout_shipping_address fieldset .pepfer-tabs,
.simplecheckout .row-shipping_address_postcode,
.simplecheckout .row-shipping_address_address_1 {
  flex: 1 1 100%;
}

/* Поле, не относящееся к выбранному способу получения. Прячем классом, а не
   удалением: введённое должно пережить переключение вкладок. */
.simplecheckout .pepfer-hidden {
  display: none;
}

/* --------------------------------------------------------------------------
   Вкладки способа получения
   -------------------------------------------------------------------------- */

.pepfer-tabs {
  display: flex;
  gap: 10px;
  margin: 10px 0 22px;
}

.pepfer-tabs__tab {
  appearance: none;
  flex: 1 1 0;
  padding: 12px 18px;
  border: 1px solid var(--pepfer-line);
  border-radius: 0;
  background: none;
  font-family: var(--pepfer-sans);
  font-size: 14px;
  letter-spacing: .02em;
  text-transform: none;
  color: var(--pepfer-muted);
  cursor: pointer;
  transition: border-color .2s ease, color .2s ease;
}

/* Тема красит любую кнопку под указателем — здесь это лишнее: вкладка
   отличается рамкой, а не заливкой. */
.simplecheckout .pepfer-tabs__tab:hover,
.simplecheckout .pepfer-tabs__tab:focus-visible,
.simplecheckout .pepfer-tabs__tab.is-active {
  background: none;
  border-color: var(--pepfer-ink);
  color: var(--pepfer-ink);
  outline: none;
}

.simplecheckout .pepfer-tabs__tab.is-active {
  border-width: 1px;
  font-weight: 500;
}


/* Незаполненный адрес при доставке курьером. */
.simplecheckout .form-group.has-error input {
  border-color: var(--pepfer-accent);
}

/* --------------------------------------------------------------------------
   Мелочи оформления заказа
   -------------------------------------------------------------------------- */

/* Модуль обёртывает поля в fieldset, у которого своя рамка и отступы от
   браузера. Рамка вокруг «Покупателя» и «Адреса доставки» — именно она. */
.simplecheckout fieldset {
  margin: 0;
  padding: 0;
  border: 0;
  min-width: 0;
}

/* Регистрация показывается одной галкой, поэтому подпись поля и переключатели
   «да/нет» не нужны. Прячем стилями, а не скриптом: так не зависит от того,
   когда модуль перерисовал блок. */
.simplecheckout .row-customer_register > .control-label,
.simplecheckout .row-customer_register .radio {
  display: none !important;
}

.simplecheckout .form-group .pepfer-check,
.simplecheckout label.pepfer-check {
  display: inline-flex !important;
  align-items: center;
  gap: 10px;
  margin: 0;
  padding: 0;
  font-family: var(--pepfer-sans);
  font-size: 14px;
  font-weight: 400;
  color: var(--pepfer-ink);
  cursor: pointer;
}

.simplecheckout .pepfer-check input[type="checkbox"] {
  flex: 0 0 auto;
  width: 16px;
  height: 16px;
  margin: 0;
  accent-color: var(--pepfer-ink);
  cursor: pointer;
}



/* Строки способов доставки одной высоты: у выбранного появляется кнопка выбора
   пункта, и без общей высоты список подпрыгивал бы при каждом переключении. */
.simplecheckout #simplecheckout_shipping .radio {
  display: flex;
  align-items: center;
  min-height: 36px;
  margin: 0;
}

/* На узком экране сведения о пункте и кнопка переносятся под название. */
@media (max-width: 767px) {
  .simplecheckout .cdek_office_info {
    flex: 1 0 100%;
    margin-top: 6px;
  }

  .simplecheckout .cdek_btn {
    margin: 8px 0 0;
  }
}

/* --------------------------------------------------------------------------
   Плавающие подписи полей

   Подпись сверху и та же подпись внутри поля — одно и то же, сказанное дважды,
   и каждая строка занимает высоту двух. Подпись остаётся настоящим label —
   озвучка экрана и нажатие по подписи работают, — но лежит поверх поля: в
   пустом на месте текста, в заполненном наверху и мельче.
   -------------------------------------------------------------------------- */

.simplecheckout .pepfer-float__holder {
  position: relative;
}

.simplecheckout .pepfer-float .control-label {
  position: absolute;
  top: 50%;
  left: 11px;
  right: 11px;
  transform: translateY(-50%);
  margin: 0;
  font-size: 14px;
  line-height: 1.2;
  color: var(--pepfer-muted);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  pointer-events: none;
  transition: transform .16s ease-out, font-size .16s ease-out;
}

.simplecheckout .pepfer-float__holder.is-floated .control-label {
  transform: translateY(-17px);
  font-size: 10px;
}

/* Место под поднятую подпись: текст значения опускается ниже. */
.simplecheckout .pepfer-float .form-control {
  height: 46px;
  padding: 18px 10px 0;
}

.simplecheckout .pepfer-float select.form-control {
  padding-top: 16px;
}

/* Подсказка о формате не спорит с подписью: она появляется, только когда поле
   в работе, а подпись к этому времени уже наверху. */
.simplecheckout .pepfer-float .form-control::placeholder {
  color: transparent;
}

.simplecheckout .pepfer-float .form-control:focus::placeholder {
  color: var(--pepfer-line);
}

/* --------------------------------------------------------------------------
   Парные строки блока покупателя

   Имя с фамилией и телефон с почтой — по смыслу одно и то же поле, разбитое
   надвое. Ставим их рядом, чтобы форма читалась картой, а не свитком.
   -------------------------------------------------------------------------- */

.simplecheckout #simplecheckout_customer .simplecheckout-block-content fieldset {
  display: flex;
  flex-wrap: wrap;
  column-gap: 16px;
  row-gap: 8px;
}

.simplecheckout #simplecheckout_customer .form-group {
  flex: 1 1 100%;
}

/* Точность правила выше, чем у общего «поле во всю ширину» рядом: иначе оно
   побеждает и пары не складываются. */
@media (min-width: 768px) {
  .simplecheckout #simplecheckout_customer .row-customer_firstname,
  .simplecheckout #simplecheckout_customer .row-customer_lastname,
  .simplecheckout #simplecheckout_customer .row-customer_telephone,
  .simplecheckout #simplecheckout_customer .row-customer_email,
  .simplecheckout #simplecheckout_customer .row-customer_password,
  .simplecheckout #simplecheckout_customer .row-customer_confirm_password {
    flex: 1 1 calc(50% - 8px);
    min-width: 0;
  }
}

/* --------------------------------------------------------------------------
   Корзина на оформлении заказа

   Таблица без рамок и без линий между строками: товаров в заказе немного, и
   сетка здесь только дробит взгляд. Итоги под таблицей — не строки таблицы, а
   отдельные блоки, поэтому колонки им задаются вручную, теми же ширинами.
   -------------------------------------------------------------------------- */

.simplecheckout .simplecheckout-cart,
.simplecheckout .simplecheckout-cart tr,
.simplecheckout .simplecheckout-cart thead,
.simplecheckout .simplecheckout-cart tbody {
  border: 0;
}

.simplecheckout .simplecheckout-cart th.price,
.simplecheckout .simplecheckout-cart td.price,
.simplecheckout .simplecheckout-cart th.total,
.simplecheckout .simplecheckout-cart td.total {
  text-align: right;
}

/* Итоговая колонка строки товара — обычным начертанием: это такое же число,
   как и цена, выделять его нечем. */
.simplecheckout .simplecheckout-cart td.total {
  font-weight: 400 !important;
}

/* Подпись итога заканчивается там же, где заголовок «Цена», а сумма стоит
   ровно под суммами товаров. */
.simplecheckout .simplecheckout-cart-total {
  display: flex;
  align-items: center;
  padding: 6px 0;
}

/* Ширины итогам задаёт скрипт, меряя настоящие колонки таблицы. Считать их
   он может только по внешнему краю — иначе внутренний отступ прибавляется
   сверху и текст уезжает вправо. */
.simplecheckout .simplecheckout-cart-total > span {
  box-sizing: border-box;
}

/* Итог — единственная строка, ради которой сюда смотрят. */
.simplecheckout #total_total > span,
.simplecheckout #total_total .simplecheckout-cart-total-value {
  font-weight: 600;
}

.simplecheckout .simplecheckout-cart-total > span:first-child {
  flex: 1 1 auto;
  text-align: right;
  padding-right: 10px;
}

.simplecheckout .simplecheckout-cart-total .simplecheckout-cart-total-value {
  flex: 0 0 auto;
  padding-right: 10px;
  text-align: right;
}

.simplecheckout .simplecheckout-cart-total .simplecheckout-cart-total-remove {
  flex: 0 0 auto;
}

/* Купон и сертификат — второстепенные поля, им хватает меньшей высоты. */
.simplecheckout .simplecheckout-cart-total .inputs {
  flex: 1 1 auto;
  display: flex;
  align-items: center;
  gap: 10px;
  text-align: left;
}

.simplecheckout .simplecheckout-cart-total .inputs .form-control {
  height: 36px;
  max-width: 260px;
  padding: 0 12px;
}

/* Комментарий подписан плейсхолдером внутри поля — отдельный заголовок над ним
   повторял бы то же слово. */
.simplecheckout #simplecheckout_comment .checkout-heading {
  display: none;
}

/* Список рисует текст с собственным внутренним отступом, поэтому при равных
   отступах поле ввода и список выглядят по-разному. Уравниваем по факту. */
.simplecheckout .pepfer-float select.form-control {
  padding-left: 6px;
}

/* У поля комментария подпись не по центру: коробка высокая, и по центру она
   висела бы посреди пустоты. */
.simplecheckout .pepfer-float--area .control-label {
  top: 22px;
  transform: none;
}

.simplecheckout .pepfer-float--area.is-floated .control-label {
  top: 10px;
  transform: none;
  font-size: 10px;
}

.simplecheckout .pepfer-float--area textarea.form-control {
  height: 84px;
  padding: 26px 12px 10px;
}

/* Купон и сертификат: обёртка вокруг самого поля, а не вокруг всей строки —
   поле там уже строки и прижато вправо. */
.simplecheckout .pepfer-float--inline {
  display: inline-block;
  position: relative;
  flex: 0 1 260px;
}

.simplecheckout .pepfer-float--inline .form-control {
  width: 100%;
  height: 46px;
  padding: 18px 10px 0;
  text-align: left;
}

/* Доставка, которую ещё не выбрали: значение не число, а пояснение. */
.simplecheckout .pepfer-shipping-row .simplecheckout-cart-total-value {
  color: var(--pepfer-muted);
}

/* Купон и сертификат: правило поднятой подписи повторено отдельно — у этих
   полей обёртка совмещает роли, и общего правила ей не хватает. */
.simplecheckout .pepfer-float--inline.is-floated .control-label {
  transform: translateY(-17px);
  font-size: 10px;
}

/* Высота у них своя, иначе поднятой подписи некуда встать. */
.simplecheckout .simplecheckout-cart-total .inputs .pepfer-float--inline .form-control {
  height: 46px;
  padding: 18px 10px 0;
  text-align: left;
}

/* Линии между строками итогов — та же сетка, что убрана из таблицы. */
.simplecheckout .simplecheckout-cart-total,
.simplecheckout .simplecheckout-cart-total-value,
.simplecheckout .simplecheckout-cart-buttons {
  border: 0;
}

/* Купон и сертификат подписаны слева, как и все прочие поля: наследованное от
   строки итога выравнивание вправо здесь ни к чему. */
.simplecheckout .pepfer-float--inline,
.simplecheckout .pepfer-float--inline .control-label {
  text-align: left;
}

/* «Обновить» встаёт по тем же краям, что поля купона и сертификата над ней. */
.simplecheckout .simplecheckout-cart-total .inputs {
  justify-content: flex-end;
}

.simplecheckout .pepfer-float--inline {
  flex: 0 0 260px;
}

.simplecheckout .simplecheckout-cart-buttons .inputs.buttons a.button_oc {
  flex: 0 0 260px;
}

/* Пока пункт не выбран, кнопка — главное действие в строке и залита; после
   выбора она становится второстепенной, и заливка уходит. */
.simplecheckout .cdek_btn {
  border-color: var(--pepfer-ink);
  background: var(--pepfer-ink);
  color: var(--pepfer-paper);
}

.simplecheckout .cdek_office_info + .cdek_btn {
  background: var(--pepfer-paper);
  color: var(--pepfer-ink);
}

.simplecheckout .cdek_btn:hover,
.simplecheckout .cdek_btn:focus-visible {
  background: var(--pepfer-paper);
  color: var(--pepfer-ink);
}

.simplecheckout .cdek_office_info + .cdek_btn:hover,
.simplecheckout .cdek_office_info + .cdek_btn:focus-visible {
  background: var(--pepfer-ink);
  color: var(--pepfer-paper);
}

/* Ширины в строках купона, сертификата и кнопки задаются с пометкой приоритета:
   таблица стилей модуля грузится после нашей, и её правила на этих элементах
   иначе перевешивают. */
.simplecheckout .simplecheckout-cart-total .inputs {
  display: flex !important;
  justify-content: flex-end !important;
}

.simplecheckout .pepfer-float--inline {
  flex: 0 0 260px !important;
}

.simplecheckout .simplecheckout-cart-buttons .inputs.buttons a.button_oc {
  flex: 0 0 260px !important;
  width: 260px !important;
}

/* Правый край строки с кнопкой совпадает с полями над ней. */
.simplecheckout .simplecheckout-cart-buttons .inputs.buttons {
  padding-right: 10px !important;
}

/* --------------------------------------------------------------------------
   Комментарий и вторая строка корзины: правки с пометкой приоритета — таблица
   стилей модуля грузится после нашей и иначе перебивает эти значения.
   -------------------------------------------------------------------------- */

/* Подпись стоит в своей полосе, текст начинается ниже её — иначе они
   накладываются друг на друга. */
.simplecheckout .pepfer-float--area textarea.form-control {
  min-height: 72px !important;
  height: 72px;
  padding: 26px 12px 8px !important;
  line-height: 1.4;
  resize: vertical;
}

.simplecheckout .pepfer-float--area .control-label {
  top: 16px !important;
  transform: none !important;
}

.simplecheckout .pepfer-float--area.is-floated .control-label {
  top: 7px !important;
  transform: none !important;
  font-size: 10px !important;
}

/* Купон, сертификат и кнопка «Обновить» — второстепенная часть корзины,
   им хватает меньшей высоты, чем полям формы. */
.simplecheckout .simplecheckout-cart-total .inputs .pepfer-float--inline .form-control {
  height: 40px !important;
  padding: 16px 10px 0 !important;
}

.simplecheckout .simplecheckout-cart-buttons .inputs.buttons a.button_oc {
  min-height: 40px !important;
}

/* --------------------------------------------------------------------------
   Правая панель заказа
   -------------------------------------------------------------------------- */

.simplecheckout #simplecheckout_summary {
  display: block !important;
  margin: 0;
}

.pepfer-summary__state {
  margin: 0 0 18px;
  font-family: var(--pepfer-sans);
  font-size: 13px;
  line-height: 1.45;
  color: var(--pepfer-accent);
}

.pepfer-summary__state.is-ready {
  color: var(--pepfer-muted);
}

.pepfer-summary__row {
  display: flex;
  justify-content: space-between;
  gap: 12px;
  padding: 7px 0;
  font-family: var(--pepfer-sans);
  font-size: 14px;
  color: var(--pepfer-ink);
}

.pepfer-summary__row.is-total {
  margin-top: 6px;
  padding-top: 12px;
  border-top: 1px solid var(--pepfer-line);
  font-size: 16px;
  font-weight: 600;
}



/* Кнопка занимает всю ширину колонки: это единственное действие в ней. */
.simplecheckout-right-column > #buttons,
.simplecheckout-right-column .simplecheckout-button-right {
  float: none;
  width: 100%;
  margin: 0;
}

.simplecheckout-right-column .simplecheckout-button-left {
  display: none;
}

.simplecheckout .simplecheckout-right-column a.button_oc {
  display: flex;
  width: 100%;
  min-height: 52px;
}

.pepfer-summary__terms {
  margin-top: 14px;
  font-family: var(--pepfer-sans);
  font-size: 14px;
  line-height: 1.5;
  color: var(--pepfer-muted);
}

/* --------------------------------------------------------------------------
   Правая панель: поправки
   -------------------------------------------------------------------------- */

/* Заголовок «Общая информация по заказу» ничего не добавляет: содержимое
   панели говорит само за себя. */
.simplecheckout #simplecheckout_summary > .checkout-heading {
  display: none;
}

.pepfer-summary__state[hidden] {
  display: none;
}

/* Названия блоков — тем же шрифтом, что заголовки на остальных страницах.
   Размер прежний: крупнее он спорил бы с содержимым. */
.simple-content .simplecheckout .checkout-heading,
.simple-content .simplecheckout .panel-heading,
.simplecheckout .checkout-heading,
.simplecheckout .panel-heading {
  font-family: var(--pepfer-serif);
  font-size: 10px;
  font-weight: 400;
  letter-spacing: .08em;
}

/* Служебные ссылки в шапках блоков — «Я зарегистрирован», «Очистить корзину». */
.simplecheckout .checkout-heading a,
.simplecheckout .checkout-heading-button a {
  font-family: var(--pepfer-sans);
  font-size: 12px;
}

/* Окно входа: у темы прямые углы, скругление приходит из вёрстки модуля. */
.simplecheckout-login,
#simplecheckout_login,
.simplecheckout .modal-content,
.simplecheckout-login .modal-content,
#colorbox,
#cboxContent,
#cboxLoadedContent,
.cbox_wrapper,
.mfp-content .white-popup,
.white-popup {
  border-radius: 0 !important;
}

/* --------------------------------------------------------------------------
   Корзина и панель: поправки
   -------------------------------------------------------------------------- */

/* Названия колонок — чуть плотнее строк, но не жирные. */
.simplecheckout .simplecheckout-cart th {
  font-weight: 500 !important;
}

/* Крестик удаления стоит в правой колонке — там же, где у купона. */
.simplecheckout .simplecheckout-cart td.remove {
  text-align: right;
  white-space: nowrap;
}

.simplecheckout .simplecheckout-cart td.remove .btn {
  margin: 0;
}

/* Кнопка заказа занимает колонку целиком: у блока модуля свои отступы. */
.pepfer-summary #buttons,
.pepfer-summary .simplecheckout-button-right {
  box-sizing: border-box;
  padding: 0 !important;
}

/* Окно входа: у темы прямые углы. */
#simple_login,
#simple_login_overlay {
  border-radius: 0 !important;
  border-color: var(--pepfer-line) !important;
}

/* Крестик удаления товара — такой же, как у купона: знак, а не кнопка. */
.simplecheckout .simplecheckout-cart td.remove .btn,
.simplecheckout .simplecheckout-cart td.remove .btn-danger {
  min-width: 0;
  width: auto;
  height: auto;
  padding: 0;
  border: 0 !important;
  background: none !important;
  font-size: 13px;
  line-height: 1;
  color: var(--pepfer-muted);
}

.simplecheckout .simplecheckout-cart td.remove .btn:hover,
.simplecheckout .simplecheckout-cart td.remove .btn:focus-visible {
  color: var(--pepfer-accent);
}

/* Содержимое страницы прижато к тем же полям, что и хлебные крошки над ним:
   боковой отступ создавал ступеньку. */
.simple-content {
  margin-left: 0 !important;
  margin-right: 0 !important;
  padding-left: 0 !important;
  padding-right: 0 !important;
}

/* Крестик удаления — посередине строки, а не у её верха: у модуля ячейки
   прижаты кверху с пометкой приоритета. */
.simplecheckout .simplecheckout-cart td {
  vertical-align: middle !important;
}

/* --------------------------------------------------------------------------
   Окно входа

   Оно живёт вне формы оформления, поэтому общие правила блока сюда не
   достают — повторяем нужное отдельно.
   -------------------------------------------------------------------------- */

#simple_login {
  box-sizing: border-box;
  width: 380px !important;
  height: auto !important;
  padding: 40px 32px 32px !important;
  border: 0 !important;
  border-radius: 0 !important;
  background: var(--pepfer-paper) !important;
}

#simple_login fieldset,
#simple_login .simplecheckout-block-content {
  margin: 0;
  padding: 0;
  border: 0;
}

#simple_login_header {
  position: static;
}

#simple_login .notice-panel__close {
  position: absolute;
  top: 14px;
  right: 14px;
}

#simple_login .form-group {
  margin-bottom: 10px;
}

#simple_login .form-control {
  box-sizing: border-box;
  width: 100%;
  height: 46px;
  padding: 18px 10px 0;
  border: 1px solid var(--pepfer-line);
  border-radius: 0;
  background: var(--pepfer-paper);
  font-family: var(--pepfer-sans);
  font-size: 14px;
  color: var(--pepfer-ink);
}

#simple_login .pepfer-float .control-label {
  position: absolute;
  top: 50%;
  left: 11px;
  right: 11px;
  transform: translateY(-50%);
  margin: 0;
  font-family: var(--pepfer-sans);
  font-size: 14px;
  line-height: 1.2;
  color: var(--pepfer-muted);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  pointer-events: none;
  transition: transform .16s ease-out, font-size .16s ease-out;
}

#simple_login .pepfer-float__holder {
  position: relative;
}

#simple_login .pepfer-float__holder.is-floated .control-label {
  transform: translateY(-17px);
  font-size: 10px;
}

/* Вход — главное действие окна: залитая кнопка во всю ширину. */
#simple_login #simplecheckout_button_login {
  box-sizing: border-box;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  min-height: 46px;
  margin: 6px 0 0;
  padding: 0 20px;
  border: 1px solid var(--pepfer-ink);
  border-radius: 0;
  background: var(--pepfer-ink);
  background-image: none;
  box-shadow: none;
  font-family: var(--pepfer-sans);
  font-size: 12px;
  letter-spacing: .1em;
  text-transform: uppercase;
  color: var(--pepfer-paper);
  text-decoration: none;
  transition: background-color .2s ease, color .2s ease;
}

#simple_login #simplecheckout_button_login:hover,
#simple_login #simplecheckout_button_login:focus-visible {
  background: var(--pepfer-paper);
  color: var(--pepfer-ink);
}

.simple-login__forgotten {
  display: inline-block;
  margin-top: 14px;
  font-family: var(--pepfer-sans);
  font-size: 13px;
}

/* Согласие на обработку данных — отдельная отметка над кнопкой. */
.pepfer-consent {
  align-items: flex-start;
  margin: 0 0 14px;
  font-size: 13px;
  line-height: 1.45;
  color: var(--pepfer-muted);
}

.pepfer-consent input[type="checkbox"] {
  margin-top: 2px;
}

.pepfer-consent.is-required {
  color: var(--pepfer-accent);
}

.pepfer-consent.is-required input[type="checkbox"] {
  outline: 1px solid var(--pepfer-accent);
  outline-offset: 2px;
}

/* --------------------------------------------------------------------------
   Корзина, доставка и окно входа: поправки
   -------------------------------------------------------------------------- */

/* Крестики удаления — одинаковые во всей корзине: слева в своей колонке,
   одного веса и с указателем-рукой. */
.simplecheckout .simplecheckout-cart td.remove,
.simplecheckout .simplecheckout-cart-total .simplecheckout-cart-total-remove {
  text-align: left;
}



.simplecheckout .simplecheckout-cart-total .simplecheckout-cart-total-remove * {
  cursor: pointer;
  font-size: 13px;
  font-weight: 400;
  color: var(--pepfer-muted);
  transition: color .2s ease;
}

.simplecheckout .simplecheckout-cart-total .simplecheckout-cart-total-remove *:hover {
  color: var(--pepfer-accent);
}

/* Счётчик количества — без рамок у кнопок: рамка остаётся только у поля. */
.simplecheckout .simplecheckout-cart .input-group-btn .btn {
  border: 0 !important;
  background: none !important;
}


/* Надпись на кнопке заказа — по центру. */
.simplecheckout .simplecheckout-right-column a.button_oc,
.simplecheckout .simplecheckout-right-column a.button_oc span {
  align-items: center;
  justify-content: center;
  line-height: 1;
}

.simplecheckout .simplecheckout-right-column a.button_oc span {
  display: block;
  padding: 0;
}

/* Окно входа: крестик крупнее и без подсветки, отступы поровну. */
#simple_login {
  padding: 32px !important;
}

#simple_login .notice-panel__close {
  top: 10px;
  right: 10px;
  width: 40px;
  height: 40px;
  border: 0;
  background: none;
  color: var(--pepfer-muted);
  transition: color .2s ease;
}

#simple_login .notice-panel__close:hover,
#simple_login .notice-panel__close:focus-visible {
  background: none;
  outline: none;
  color: var(--pepfer-ink);
}

#simple_login .notice-panel__close svg {
  width: 20px;
  height: 20px;
}

/* Глаз показа пароля лежит в поле у правого края. */
.pepfer-eye {
  appearance: none;
  position: absolute;
  top: 50%;
  right: 6px;
  transform: translateY(-50%);
  display: flex;
  align-items: center;
  justify-content: center;
  width: 34px;
  height: 34px;
  padding: 0;
  border: 0;
  background: none;
  color: var(--pepfer-muted);
  cursor: pointer;
  transition: color .2s ease;
}

.pepfer-eye svg {
  width: 18px;
  height: 18px;
}

.pepfer-eye:hover,
.pepfer-eye.is-on {
  color: var(--pepfer-ink);
}

#simple_login .form-control {
  padding-right: 44px;
}


/* Условия читаются до решения, поэтому обе строки стоят над кнопкой. */
.pepfer-summary__terms {
  margin: 0 0 16px;
}

/* Подзаголовки перевозчиков не нужны: полоса уже говорит, как получать, а имя
   перевозчика стоит в каждой строке. */
.simplecheckout #simplecheckout_shipping .simplecheckout-block-content > p {
  display: none !important;
}

/* Что показывать из способов доставки, решает признак режима на форме. Строки
   при этом остаются на своих местах — перерисовка модуля им не страшна. */
.simplecheckout.pepfer-mode-none #simplecheckout_shipping .radio,
.simplecheckout.pepfer-mode-door #simplecheckout_shipping .radio[data-pepfer-kind="office"],
.simplecheckout.pepfer-mode-office #simplecheckout_shipping .radio[data-pepfer-kind="door"] {
  display: none !important;
}

/* Хлебные крошки — тем же кеглем, что и служебные надписи. */
.breadcrumb,
.breadcrumb li,
.breadcrumb a,
.breadcrumb span {
  font-size: 12px;
}

/* Кнопка и согласия лежат в колонке рядом с блоком итога — им нужен тот же
   внутренний ритм, что и содержимому блока. */
.simplecheckout .simplecheckout-right-column > #buttons {
  margin: 0;
  padding: 0;
  float: none;
  width: 100%;
}

/* Пока перевозчик считает доставку, на месте списка стоит надпись: пустота в
   этом месте неотличима от поломки. */
.pepfer-calc {
  padding: 10px 0;
  font-family: var(--pepfer-sans);
  font-size: 14px;
  color: var(--pepfer-muted);
}

.pepfer-calc[hidden] {
  display: none;
}

/* --- Страница принятого заказа -------------------------------------- */

/* Номер заказа — единственное, что отсюда переписывают или называют при
   обращении, поэтому он в заголовке, а не в подписи под текстом. */
#common-success #content > h1 {
  margin-bottom: 18px;
}

#common-success #content p {
  font-family: var(--pepfer-sans);
  font-size: 15px;
  line-height: 1.7;
}

/* Страница иначе тупиковая: дальше идти некуда, кроме как через шапку.
   Одна внятная кнопка избавляет от этого — «Продолжить» без указания куда
   такой кнопкой не было. */
#common-success .buttons {
  margin-top: 32px;
  /* Иначе кнопка упирается прямо в подвал. */
  margin-bottom: 28px;
}

#common-success .buttons .pull-right {
  float: none;
}

#common-success .buttons .btn {
  display: inline-block;
  padding: 16px 36px;
  /* Рамка есть и в покое, того же цвета, что заливка: иначе на наведении она
     появлялась бы из ниоткуда и сдвигала подпись на пиксель. */
  border: 1px solid var(--pepfer-ink);
  border-radius: 0;
  background: var(--pepfer-ink);
  color: var(--pepfer-paper);
  font-family: var(--pepfer-sans);
  font-size: 12px;
  letter-spacing: .12em;
  text-transform: uppercase;
  text-decoration: none;
  transition: background-color .2s ease, color .2s ease;
}

/* Инверсия — так ведут себя главные кнопки во всей теме: заливка и текст
   меняются местами, тёмная кнопка становится светлой с тёмной рамкой. */
#common-success .buttons .btn:hover,
#common-success .buttons .btn:focus-visible {
  background: var(--pepfer-paper);
  color: var(--pepfer-ink);
  text-decoration: none;
}

/* Нажатие возвращает тёмное: щелчок должен ощущаться нажатием, а не второй
   половиной того же наведения. */
#common-success .buttons .btn:active {
  background: var(--pepfer-ink);
  color: var(--pepfer-paper);
}

#common-success .buttons .btn:focus-visible {
  outline: 2px solid var(--pepfer-accent);
  outline-offset: 2px;
}

/* Ключ карт не принят — виджет открывает пустое окно и молчит, поэтому
   объясняем словами прямо в блоке доставки. */
.pepfer-map-error {
  margin: 0 0 14px;
  padding: 12px 14px;
  border-left: 3px solid var(--pepfer-accent);
  background: var(--pepfer-soft, #F6F3EE);
  font-family: var(--pepfer-sans);
  font-size: 14px;
  line-height: 1.5;
  color: var(--pepfer-ink);
}

/* ==========================================================================
   Узкий экран: шапка
   ==========================================================================

   Правая часть шапки — поиск и значки — требовала 275 пикселей из 351, и
   колонка с логотипом схлопывалась в ноль: логотипа на телефоне не было
   видно вовсе, а вместе с ним и кнопки меню.

   Поле ввода поиска на телефоне убирается: его кнопка и так ведёт на
   страницу поиска, а строку ввода там же и покажут. Значок входа слева
   тоже лишний — такой же стоит справа. */

@media (max-width: 767px) {
  /* Три предмета и не больше: меню, знак, корзина. Поиск, избранное,
     сравнение и вход живут в меню — держать их ещё и в шапке значит
     повторяться дважды на экране шириной с ладонь. Корзина остаётся:
     это путь к оплате, и прятать её в меню — терять заказы. */
  .info_logo_personal {
    grid-template-columns: 28px minmax(0, 1fr) auto;
    column-gap: 12px;
    align-items: center;
    min-height: 64px;
  }

  /* Наследие прежней темы: у левого блока стоит max-width 30 %, и в узкой
     колонке кнопка меню сжималась до восьми пикселей. */
  .info_logo_personal .info {
    gap: 0;
    max-width: none;
    width: 28px;
    align-items: center;
  }

  .info_logo_personal .info a { display: none; }

  /* Высота кнопки равна значку: с запасом в четыре пикселя её середина
     не совпадала с серединой знака. */
  .info_logo_personal .mobile_menu_button {
    display: flex;
    align-items: center;
    width: 24px;
    height: 24px;
  }

  .info_logo_personal .mobile_menu_button img { display: block; width: 24px; height: 24px; }

  /* Знак занимает всё, что осталось между меню и корзиной. Знак широкий
     (357 к 113), поэтому во всю ширину он вырастает до восьмидесяти
     пикселей — шапка получилась бы в треть экрана. Потолок в 64
     оставляет знаку почти всю свободную ширину. */
  .info_logo_personal .logo {
    justify-self: stretch;
    padding: 0;
    text-align: left;
  }

  .info_logo_personal .logo a { display: block; }

  .info_logo_personal .logo img {
    display: block;
    width: 100%;
    max-width: none;
    max-height: 64px;
    height: auto;
    aspect-ratio: 357 / 113;
    object-fit: contain;
    object-position: left center;
  }

  /* Список живого поиска — четвёртый предмет в сетке шапки: со скрытым
     полем он всё равно занимал строку и добавлял шапке высоты. */
  .info_logo_personal #ps-live-search { display: none; }

  .personal-stack { min-width: 0; }
  .info_logo_personal .personal { gap: 0; align-items: center; }

  /* Полоса уведомлений вдвое выше: по строке в восемнадцать пикселей
     пальцем не попасть. Слой с полосой на телефоне держит её высоту,
     поэтому знак больше не упирается в полосу — и, когда полосу
     закрывают, место под ней не остаётся пустым. */
  .notice-bar { font-size: 12px; line-height: 3.2; }

  /* Плашка возврата — та же высота, что и полоса: по узкой полоске в
     восемнадцать пикселей пальцем не попасть. */
  .notice-restore { min-height: 40px; padding: 0 14px; }

  /* Место под полосу отведено раз и навсегда: и полоса, и плашка
     возврата нависают над страницей, а не раздвигают её. Иначе при
     каждом показе и скрытии вся страница дёргалась вверх-вниз. */
  .info_logo_personal { margin-top: 58px; }

  /* Всё, что повторяется в меню, из шапки убирается. */
  .info_logo_personal .lang-switch,
  .info_logo_personal .personal .header_search,
  .info_logo_personal .personal #wishlist-total,
  .info_logo_personal .personal .compare-link,
  .info_logo_personal .personal .login_url { display: none; }
}

/* ==========================================================================
   Узкий экран: оформление заказа
   ==========================================================================

   Обе колонки идут в одну, панель итога перестаёт липнуть к экрану — на
   телефоне липкая панель отъедала бы половину высоты. Таблица корзины шире
   телефона из-за колонок с ценами, поэтому прокручивается внутри своего
   блока, а не растягивает страницу: иначе панель итога уезжала за правый
   край экрана. */

@media (max-width: 767px) {
  .simplecheckout .simplecheckout-left-column,
  .simplecheckout .simplecheckout-right-column {
    box-sizing: border-box;
    width: 100%;
    max-width: 100%;
    float: none;
    padding-left: 0;
    padding-right: 0;
  }

  .simplecheckout .simplecheckout-right-column {
    position: static;
    padding: 18px 16px;
  }

  .simplecheckout .simplecheckout-block { max-width: 100%; }

  #simplecheckout_cart { overflow-x: auto; }
  #simplecheckout_cart table.simplecheckout-cart { width: 100%; }

  /* Купон, сертификат и «Обновить» — во всю ширину: на телефоне поле в
     260 пикселей посреди пустой строки выглядит недоделкой. */
  .simplecheckout .simplecheckout-cart-total .inputs { width: 100%; }
  .simplecheckout .simplecheckout-cart-total .inputs input.form-control {
    width: 100%;
    max-width: none;
    flex: 1 1 auto;
  }

  .simplecheckout .simplecheckout-cart-buttons .inputs { width: 100%; }
  .simplecheckout .simplecheckout-cart-buttons #simplecheckout_button_cart {
    display: block;
    width: 100%;
    max-width: none;
    text-align: center;
  }

  /* Ширину полям и кнопке задавала не сама кнопка, а обёртка: у купона —
     плавающая подпись, у кнопки — доля во флексе. Пометка приоритета
     здесь по той же причине, что и у правил для широкого экрана выше:
     таблица стилей модуля грузится после нашей. */
  .simplecheckout .pepfer-float--inline { flex: 1 1 auto !important; width: 100% !important; }
  .simplecheckout .simplecheckout-cart-buttons .inputs.buttons a.button_oc { flex: 1 1 auto !important; width: 100% !important; }
  .simplecheckout .simplecheckout-cart-buttons .inputs.buttons { padding-right: 0 !important; }

  /* Выбранный пункт выдачи и кнопка выбора — одной строкой: места хватает,
     а тремя строками способ доставки распухал на пол-экрана. */
  #simplecheckout_shipping .radio {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 8px;
  }

  /* Название способа занимает свою строку, а выбранный пункт и кнопка
     становятся рядом: строка адреса сжимается, кнопка сохраняет размер. */
  #simplecheckout_shipping .radio > label { flex: 1 1 100%; margin: 0; }

  #simplecheckout_shipping .cdek_office_info {
    flex: 1 1 auto;
    min-width: 0;
    margin: 0;
    font-size: 13px;
    overflow-wrap: anywhere;
  }

  #simplecheckout_shipping .cdek_btn { flex: 0 0 auto; margin: 0; }
}

/* ==========================================================================
   Выдвижное меню на телефоне
   ==========================================================================

   Нижняя часть ящика была залита кремовым — цветом прежней темы. Рядом с
   белым верхом это читалось как два разных окна, а не одно меню. */

/* Прежняя тема выводила этот блок за поля ящика: ширина считалась без
   внутренних отступов, а слева блок вытягивался отрицательным полем.
   Справа он из-за этого вылезал за край, и ящик прокручивался вбок. */
.mobile_menu .footer_mobile_menu {
  box-sizing: border-box;
  width: auto;
  margin: 0;
  background-color: var(--pepfer-paper);
  padding: 0;
  border-top: 0;
}

/* Вложенные пункты стояли левее своих заголовков, и раздел читался как
   продолжение предыдущего, а не как его содержимое. Сдвигаем их правее
   заголовка — на ту же величину, что и отступ самого заголовка. */
.mobile_menu .footer_mobile_menu .panel_accordion ul { padding-left: 36px; }

.mobile_menu .footer_mobile_menu .panel_accordion ul li { margin: 0; }

.mobile_menu .footer_mobile_menu .panel_accordion a {
  display: block;
  padding: 7px 0;
}

/* Разделы каталога в ящике: тот же отступ, что у заголовков подвала, чтобы
   обе части меню читались одной колонкой, а подразделы — на том же уровне,
   что и вложенные пункты подвала. */
/* Меню приходит в ящик вместе со своей обёрткой-контейнером, а у той свои
   поля — из-за них разделы стояли правее заголовков подвала. */
.mobile_menu .container { padding-left: 0; padding-right: 0; }

.mobile_menu .categories_list,
.mobile_menu .categories_list > li { margin-left: 0; padding-left: 0; }

.mobile_menu .categories_list { margin-top: 24px; }

.mobile_menu .categories_list > li > a { padding-left: 18px; }

.mobile_menu .categories_list .panel_accordion a,
.mobile_menu .categories_list .dropdown-menu a { padding-left: 36px; }

/* Выдвижное меню: один шрифт, один регистр, одна стрелка.
   -----------------------------------------------------------------------
   Меню собрано из трёх кусков разного происхождения — строка поиска, разделы
   каталога из главного меню и блоки подвала. Каждый нёс своё начертание, свой
   регистр и свою разделительную линию. Ниже всё сводится к одной сетке.

   Линий между отдельными пунктами нет: строка меню и так читается строкой, а
   полтора десятка полосок подряд превращают список в решётку. Линии остались
   только между смысловыми частями — поиском, каталогом, кабинетом, справкой
   и языком. */

.mobile_menu .categories_list > li,
.mobile_menu .footer_mobile_menu .block_other li,
.mobile_menu .footer_mobile_menu .block { border-bottom: 0; }

/* Тема рисует линию над каждым заголовком подвала — с ней получается та же
   решётка, поэтому снимаем и её. */
.mobile_menu .footer_mobile_menu .accordion { border-top: 0 !important; }

.mobile_menu .categories_list,
.mobile_menu .footer_mobile_menu .block_other,
.mobile_menu .footer_mobile_menu .block_help,
.mobile_menu .footer_mobile_menu .block_language {
  border-top: 1px solid var(--pepfer-line);
  padding-top: 8px;
  margin-top: 8px;
}

/* Верхний уровень — везде один: тот же кегль, тот же регистр, тот же отступ.
   Разделы каталога приходят прописными из справочника, заголовки подвала
   приводятся к ним. */
.mobile_menu .categories_list > li > a,
.mobile_menu .footer_mobile_menu .block_other a,
.mobile_menu .footer_mobile_menu .block_help a,
.mobile_menu .footer_mobile_menu .accordion {
  display: flex;
  align-items: center;
  gap: 10px;
  box-sizing: border-box;
  width: 100%;
  min-height: 48px;
  margin: 0;
  padding: 12px 52px 12px 18px;
  background: none;
  border: 0;
  text-align: left;
  font-family: var(--pepfer-sans);
  font-size: 14px;
  font-weight: 400;
  line-height: 1.3;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--pepfer-ink);
}

/* Значки у пунктов кабинета нарисованы под строчный текст. Прежняя тема
   вынимала их из потока — значок вставал над надписью, а не рядом. */
.mobile_menu .footer_mobile_menu .block_other a img {
  position: static;
  width: 18px;
  height: 18px;
}

/* Вложенное — на ступень мельче, строчными и приглушённее: так видно, что это
   содержимое раздела, а не соседний раздел. */
.mobile_menu .categories_list .dropdown-menu a,
.mobile_menu .footer_mobile_menu .panel_accordion a {
  display: block;
  font-family: var(--pepfer-sans);
  font-size: 14px;
  font-weight: 400;
  line-height: 1.3;
  letter-spacing: 0;
  color: var(--pepfer-muted);
  text-transform: none;
}

/* В шапке подразделы разложены в несколько колонок с картинками —
   в ящике шириной с ладонь они становятся простым списком строк. */
.mobile_menu .categories_list .dropdown-menu a { padding-top: 7px; padding-bottom: 7px; }

/* Первая ссылка ведёт в сам раздел, а не в его подраздел — это другое
   действие, и выглядеть оно должно иначе. */
.mobile_menu .categories_list .dropdown-menu a.see-all {
  font-size: 12px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--pepfer-ink);
}

.mobile_menu .categories_list .dropdown-menu .dropdown-inner,
.mobile_menu .categories_list .dropdown-menu .dropdown-inner ul {
  display: block;
  width: auto;
  margin: 0;
  padding: 0;
}

/* Картинки в выпадающей панели — украшение для широкого экрана. */
.mobile_menu .categories_list .dropdown-menu .image { display: none; }

/* Подразделы каталога свёрнуты. Раскрывает их нажатие на самой строке:
   наводить на телефоне нечем, а раскрытыми списками меню растягивалось на
   три экрана. */
.mobile_menu .categories_list > li.has-submenu { position: relative; }

/* В шапке этот список — выпадающая панель: она вынута из потока, поднята
   на 820 пикселей вверх и показывается по наведению. В ящике наводить
   нечем, поэтому список возвращается в поток и раскрывается по нажатию.
   В ящике обёртки .menu_head нет, поэтому отбор идёт по самому списку. */
.mobile_menu .categories_list .dropdown .dropdown-menu {
  display: block;
  position: static;
  opacity: 1;
  top: auto;
  left: auto;
  width: auto;
  max-height: 0;
  overflow: hidden;
  margin: 0;
  padding: 0;
  border: 0;
  box-shadow: none;
  transition: max-height 0.25s ease;
}

/* Уголок-указатель нужен только выпадающей панели в шапке. */
.mobile_menu .categories_list .dropdown .dropdown-menu:after { display: none; }

.mobile_menu .categories_list > li.is-open > .dropdown-menu { padding-bottom: 8px; }

/* Стрелка одна на всё меню: уголок из двух линий, нарисованный тут же.
   Прежде у каталога был знак из файла, а у подвала — картинка, повёрнутая
   на 270 градусов, и разворачивались они по-разному. */
.mobile_menu .categories_list > li.has-submenu > a:after,
.mobile_menu .footer_mobile_menu .accordion:after {
  content: '';
  position: absolute;
  right: 18px;
  top: 50%;
  width: 9px;
  height: 9px;
  margin-top: -7px;
  padding: 0;
  border: 0;
  border-right: 1.5px solid var(--pepfer-ink);
  border-bottom: 1.5px solid var(--pepfer-ink);
  border-radius: 0;
  background: none;
  background-image: none;
  transform: rotate(45deg);
  transform-origin: center;
  transition: transform 0.25s ease;
  pointer-events: none;
}

/* Ни у строки каталога, ни у заголовка подвала фон не появляется ни в
   каком состоянии: при развороте стрелки под ней мигал светлый
   прямоугольник — это подсветка нажатия и переход фона у кнопки темы. */
.mobile_menu .categories_list > li > a,
.mobile_menu .categories_list > li > a:hover,
.mobile_menu .categories_list > li > a:active,
.mobile_menu .footer_mobile_menu .accordion,
.mobile_menu .footer_mobile_menu .accordion:hover,
.mobile_menu .footer_mobile_menu .accordion:active {
  background: none !important;
  box-shadow: none;
  -webkit-tap-highlight-color: transparent;
}

.mobile_menu .categories_list > li.is-open > a:after,
.mobile_menu .footer_mobile_menu .accordion.active:after {
  transform: rotate(-135deg);
  margin-top: -3px;
}

/* Уголок рисуется псевдоэлементом, значит строке нужна своя система
   координат. */
.mobile_menu .categories_list > li.has-submenu > a,
.mobile_menu .footer_mobile_menu .accordion { position: relative; transition: none; }

@media (prefers-reduced-motion: reduce) {
  .mobile_menu .categories_list .dropdown-menu,
  .mobile_menu .categories_list > li.has-submenu > a:after,
  .mobile_menu .footer_mobile_menu .accordion:after { transition: none; }
}

/* Строка поиска: поле занимало сорок процентов ширины, и подчёркивание
   обрывалось на середине экрана. Ширину полю задаёт отбор по имени
   (#search input), поэтому и здесь без имени не обойтись. */
.mobile_menu #search-mobile { width: 100%; }

.mobile_menu #search-mobile .search {
  box-sizing: border-box;
  display: flex;
  align-items: center;
  width: 100%;
  padding: 0 18px;
}

.mobile_menu #search-mobile .search input {
  flex: 1 1 auto;
  width: 100%;
  max-width: none;
  min-height: 40px;
  font-family: var(--pepfer-sans);
  font-size: 14px;
}

.mobile_menu #search-mobile .search button { position: static; flex: none; width: 24px; height: 24px; }

/* Переключатель языка переехал сюда из шапки. */
.mobile_menu .footer_mobile_menu .block_language {
  padding: 12px 18px 24px;
}

.mobile_menu .footer_mobile_menu .block_language .lang-switch {
  display: flex;
  gap: 12px;
  margin: 0;
}

.mobile_menu .footer_mobile_menu .block_language .lang-switch__item {
  padding: 0;
  border: 0;
  background: none;
  font-family: var(--pepfer-sans);
  font-size: 14px;
  letter-spacing: 0.06em;
  color: var(--pepfer-muted);
}

.mobile_menu .footer_mobile_menu .block_language .lang-switch__item.is-active { color: var(--pepfer-ink); }

/* Справка в меню — такие же строки, как каталог и кабинет, только без
   стрелок: раскрывать в них нечего. */
.mobile_menu .footer_mobile_menu .block_help ul,
.mobile_menu .footer_mobile_menu .block_help li { margin: 0; padding: 0; list-style: none; }

/* Линии рисуют только границы частей меню. Своя линия была ещё у
   обёртки подвала и у блока кабинета — рядом с границей соседней части
   получалась двойная полоса. */
.mobile_menu .footer_mobile_menu,
.mobile_menu .footer_mobile_menu .block_other { border-bottom: 0; }

/* Пузырёк подсказки к свойству товара. Лежит в body и позиционируется
   скриптом, поэтому координаты — оконные. */
.info-hint { cursor: pointer; }

.info-hint__bubble {
  position: fixed;
  z-index: 60;
  box-sizing: border-box;
  max-width: min(280px, calc(100vw - 24px));
  padding: 10px 12px;
  border: 1px solid var(--pepfer-line);
  background: var(--pepfer-paper);
  box-shadow: 0 6px 20px rgba(32, 27, 20, 0.12);
  color: var(--pepfer-ink);
  font-family: var(--pepfer-sans);
  font-size: 13px;
  line-height: 1.45;
}

.info-hint__bubble[hidden] { display: none; }

/* «Показать все товары» — та же плотность, что и у остальных строк. */
#ps-live-search.ps-live-search-list .ps-live-search-more {
  padding: 8px var(--pepfer-gutter);
}

/* Знаки платёжных систем в списке способов оплаты.
   -----------------------------------------------------------------------
   Отбор по полю `for`: в разметке оформления это код способа оплаты, то есть
   готовая точка привязки. Новый способ добавляется одним правилом и одним
   файлом; если файла нет, строка просто останется без знака. */
/* Строка способа оплаты — в ряд: подпись сжимается по содержимому, и знак
   вместе с названием переносился под переключатель. */
/* !important здесь не украшение: у темы есть своё правило
   «.simplecheckout label { display: inline-block !important }», и без
   такого же веса строка остаётся в две. */
.simplecheckout .radio label:has(.pepfer-payment-title) {
  display: flex !important;
  align-items: center;
  gap: 8px;
}

/* Высота как у знака «Точки»: тот приходит картинкой от своего модуля
   с height: 24px, и два знака разной величины в одном списке заметны. */
/* Знак после названия и с тем же отступом, что у «Точки»: её модуль
   отдаёт картинку с margin-left: 10px, и строки должны читаться
   одинаково. Высота тоже её — 24 точки. */
.simplecheckout .radio label[for="tbank"] .pepfer-payment-title::after {
  content: '';
  display: inline-block;
  width: 97px;
  height: 24px;
  margin-left: 10px;
  vertical-align: middle;
  background: url('../image/payment/tbank.png') no-repeat left center / contain;
}

/* ---- Предзаказ -----------------------------------------------------------
   Вещь, которой ещё нет на складе, но которую делают под заказ. На карточке
   это метка вместо «нет в наличии», в корзине — приписка у строки, а перед
   добавлением покупатель читает условие и соглашается с ним. */

.price-stock--preorder {
  color: var(--pepfer-ink);
}

.cart-preorder,
.pcd-line__preorder {
  margin-top: 4px;
  font-family: var(--pepfer-sans);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--pepfer-muted);
}

/* Окно согласия. Тёмная подложка на весь экран, лист по центру; на телефоне
   лист прижат к низу — туда дотягивается большой палец. */
.pepfer-confirm {
  position: fixed;
  inset: 0;
  z-index: 1200;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 20px;
  background: rgba(32, 27, 20, .45);
}

.pepfer-confirm__box {
  width: 100%;
  /* Лист по тексту: кегль мелкий, и прежние 460 пикселей оставляли
     воздух там, где его никто не просил. */
  max-width: 400px;
  padding: 22px;
  background: var(--pepfer-paper, #FFFFFF);
  box-shadow: 0 18px 48px rgba(32, 27, 20, .18);
}

.pepfer-confirm__text {
  margin: 0 0 20px;
  font-family: var(--pepfer-sans);
  font-size: 13px;
  line-height: 1.55;
  color: var(--pepfer-ink);
}

/* Кнопки идут столбиком: в узком листе они всё равно вставали одна под
   другой, а гибкий ряд при этом норовил переставить их местами. */
.pepfer-confirm__actions {
  display: grid;
  gap: 10px;
}

/* Кнопки окна.
   -----------------------------------------------------------------------
   Всё, что задаёт размер, перечислено и здесь, и в правиле наведения. Причина
   не в аккуратности: normalize.css обнуляет кнопке рамку на :hover, а тема
   красит её фон, и любое такое правило, меняющее рамку, поле или интерлиньяж,
   двигало бы лист под курсором. Повторение делает наведение чисто цветовым.

   Высота задана явно, а не выведена из содержимого: два пикселя разницы между
   состояниями заметны, когда кнопки стоят одна под другой. */
.pepfer-confirm__ok,
.pepfer-confirm__cancel,
.pepfer-confirm__ok:hover,
.pepfer-confirm__cancel:hover,
.pepfer-confirm__ok:focus,
.pepfer-confirm__cancel:focus,
.pepfer-confirm__ok:active,
.pepfer-confirm__cancel:active {
  box-sizing: border-box;
  display: block;
  width: 100%;
  min-height: 44px;
  margin: 0;
  padding: 12px 18px;
  font-family: var(--pepfer-sans);
  font-size: 11px;
  font-weight: 600;
  line-height: 1.4;
  letter-spacing: .08em;
  text-transform: uppercase;
  border: 1px solid var(--pepfer-ink);
  border-radius: 0;
  outline: none;
  cursor: pointer;
  transition: background-color .2s ease, color .2s ease;
}

.pepfer-confirm__ok {
  background: var(--pepfer-ink);
  color: var(--pepfer-paper, #FFFFFF);
}

.pepfer-confirm__cancel {
  background: transparent;
  color: var(--pepfer-ink);
}

/* Наведение — обращение цветов: заливка уходит, буквы становятся тёмными.
   Акцентная краска здесь читалась бы как предупреждение, а согласие на
   предзаказ — обычное действие. */
.pepfer-confirm__ok:hover {
  background: var(--pepfer-paper, #FFFFFF);
  color: var(--pepfer-ink);
}

.pepfer-confirm__cancel:hover { background: var(--pepfer-soft, #FCFBF8); }

@media (max-width: 767px) {
  .pepfer-confirm {
    align-items: flex-end;
    padding: 0;
  }

  .pepfer-confirm__box {
    max-width: none;
    padding: 22px 18px calc(22px + env(safe-area-inset-bottom, 0px));
  }

}

/* ---- Предзаказ в списках --------------------------------------------------
   Две пометки сразу, чтобы выбрать между ними на живой странице:

   значок в углу снимка — заметен при беглом просмотре, но спорит с «Новинкой»
   и сообщает только ярлык;

   подпись под ценой — читается тогда, когда смотрят на цену и решают, и
   говорит главное: вещь делают под заказ и сколько ждать.

   Убрать ненужную — удалить один из двух блоков ниже вместе с разметкой. */

/* Плашка. Контур без заливки: снимок под ней виден, а сама она не спорит с
   вещью — на плитке важнее вещь.

   Стоит слева: справа сверху висит кнопка избранного, и плашка налезала на
   сердце. Слева в плитке пусто. */
.preorder-badge {
  position: absolute;
  z-index: 2;
  top: 10px;
  left: 10px;
  padding: 3px 6px;
  font-family: var(--pepfer-sans);
  font-size: 10px;
  font-weight: 600;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--pepfer-ink);
  background: transparent;
  border: 1px solid var(--pepfer-ink);
}

/* «Новинка» стоит слева сверху; если значки встретились на одной плитке, они
   не наезжают друг на друга. */
.products .block,
.collection-products .block {
  position: relative;
}

/* Подпись под ценой. Тот же мелкий набор, что у прочих служебных строк. */
.preorder-note {
  margin-top: 6px;
  font-family: var(--pepfer-sans);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--pepfer-muted);
}

@media (max-width: 767px) {
  .preorder-badge {
    top: 6px;
    left: 6px;
    padding: 2px 5px;
    font-size: 9px;
  }

  .preorder-note { font-size: 10px; }
}


/* ---- Личный кабинет ------------------------------------------------------
   Раздел достался от исходной темы почти нетронутым: таблицы в бутстраповских
   рамках, ссылки-действия вперемежку с текстом, заголовки прописными через
   слово, пустая колонка слева, съедавшая четверть ширины. Здесь он приводится
   к тому же виду, что и остальной сайт: волосяные линии вместо рамок, мелкие
   прописные для служебных подписей, один отступ на все страницы.

   Никакой новой разметки: правила опираются на классы, которые уже есть в
   шаблонах кабинета. */

.account_page {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: clamp(24px, 3vw, 48px);
  align-items: start;
  padding: 10px 0 64px;
  /* Мера строки, как на информационных страницах: формы и списки читают, а не
     разглядывают. */
  max-width: 71ch;
  margin: 0 auto;
}

/* Плитки и таблицы — не текст: им нужна ширина. Мера в 71 знак оставлена
   формам и спискам, которые действительно читают строкой. */
.account_page:has(.account_home),
.account_page:has(table) {
  max-width: 900px;
}

/* Колонка меню в кабинете пустая: разделы вынесены плитками на первую
   страницу. Пока это так, она не должна занимать место — но правило написано
   на наличие содержимого, а не на его отсутствие: вернут меню, вернётся и
   колонка. */
.account_page:has(.block_menu ul li) {
  grid-template-columns: minmax(0, 220px) minmax(0, 1fr);
  max-width: none;
}

.account_page .block_menu { max-width: none; width: auto; }
.account_page .block_info { max-width: none; width: auto; }

.account_page:not(:has(.block_menu ul li)) .block_menu { display: none; }

.account_page h1,
.account_page h2 {
  font-family: var(--pepfer-serif);
  font-weight: 400;
  letter-spacing: 0;
  text-transform: none;
  color: var(--pepfer-ink);
}

.account_page h1 {
  font-size: clamp(28px, 3.4vw, 42px);
  line-height: 1.15;
  margin: 0 0 24px;
}

.account_page h2 {
  font-size: clamp(20px, 2.2vw, 26px);
  margin: 32px 0 16px;
}

.account_page p { font-size: 15px; line-height: 1.6; color: var(--pepfer-ink); }

/* ---- Плитки разделов на первой странице ---------------------------------- */
/* Отбор в три класса — как в style.css, где плитки разложены гибким рядом с
   разбеганием по краям: последний ряд из двух плиток вставал по центру, не
   совпадая с колонками над ним. Сетка ставит их по местам. */
.account_page .block_info .account_home {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
  gap: 12px;
}

.account_page .block_info .account_home .block {
  margin: 0;
  width: auto;
  max-width: none;
}

.account_page .block_info .account_home .block a {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 12px;
  min-height: 120px;
  padding: 20px 16px;
  text-align: center;
  border: 1px solid var(--pepfer-line);
  background: var(--pepfer-paper, #FFFFFF);
  transition: border-color .2s ease, background-color .2s ease;
}

.account_page .block_info .account_home .block a:hover {
  border-color: var(--pepfer-ink);
  background: var(--pepfer-soft, #FCFBF8);
}

.account_page .block_info .account_home .block a img {
  width: 22px;
  height: 22px;
  opacity: .65;
}

/* Отбор повторяет исходный из style.css: там подпись набрана шрифтом Thoma
   в девятнадцать пунктов и с «Каждым Словом С Большой Буквы» — коротким
   правилом это не перебить. */
.account_page .block_info .account_home .block a span {
  display: block;
  margin: 0;
  font-family: var(--pepfer-sans);
  font-size: 11px;
  line-height: 1.4;
  font-weight: 600;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--pepfer-ink);
}

/* ---- Таблицы: заказы, адреса, возвраты, загрузки ------------------------- */
.account_page .table-responsive { overflow-x: auto; }

.account_page table {
  width: 100%;
  border-collapse: collapse;
  border: 0;
  font-family: var(--pepfer-sans);
  font-size: 14px;
}

.account_page table thead td,
.account_page table thead th {
  padding: 0 12px 10px;
  border: 0;
  border-bottom: 1px solid var(--pepfer-line);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--pepfer-muted);
  white-space: nowrap;
}

.account_page table tbody td {
  padding: 14px 12px;
  border: 0;
  border-bottom: 1px solid var(--pepfer-line);
  vertical-align: middle;
  color: var(--pepfer-ink);
}

/* Числа в столбик: суммы и количества сравнивают взглядом сверху вниз. */
.account_page table .text-right { text-align: right; font-variant-numeric: tabular-nums; }
.account_page table .text-left { text-align: left; }
.account_page table tbody tr:hover td { background: var(--pepfer-soft, #FCFBF8); }
.account_page table tbody td:first-child { padding-left: 0; }
.account_page table tbody td:last-child { padding-right: 0; }
.account_page table thead td:first-child { padding-left: 0; }
.account_page table thead td:last-child { padding-right: 0; }

/* ---- Список адресов ------------------------------------------------------ */
#account-address .list,
.account_page .list-group,
.account_page .well {
  padding: 18px;
  border: 1px solid var(--pepfer-line);
  background: var(--pepfer-paper, #FFFFFF);
  font-size: 14px;
  line-height: 1.6;
}

/* ---- Действия и кнопки --------------------------------------------------- */
.account_page .buttons {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 12px;
  margin-top: 28px;
}

.account_page .buttons .pull-right { margin-left: auto; }

.account_page .buttons a,
.account_page .buttons input[type="submit"],
.account_page .buttons button,
.account_page input[type="submit"],
.account_page button[type="submit"] {
  font-family: var(--pepfer-sans);
  font-size: 12px;
  font-weight: 600;
  letter-spacing: .08em;
  text-transform: uppercase;
  padding: 15px 26px;
  border: 1px solid var(--pepfer-ink);
  background: var(--pepfer-ink);
  color: var(--pepfer-paper, #FFFFFF);
  cursor: pointer;
  transition: background-color .2s ease, color .2s ease;
}

.account_page .buttons a:hover,
.account_page input[type="submit"]:hover,
.account_page button[type="submit"]:hover {
  background: var(--pepfer-accent, #C4552A);
  border-color: var(--pepfer-accent, #C4552A);
  color: var(--pepfer-paper, #FFFFFF);
}

/* «Назад» — не действие, а возврат: он не должен весить столько же, сколько
   «Сохранить». */
.account_page .buttons .pull-left a,
.account_page .buttons a.back,
.account_page a.back {
  background: transparent;
  color: var(--pepfer-ink);
  border-color: var(--pepfer-line);
}

.account_page .buttons .pull-left a:hover,
.account_page a.back:hover {
  background: var(--pepfer-soft, #FCFBF8);
  color: var(--pepfer-ink);
  border-color: var(--pepfer-ink);
}

/* Мелкие действия в строке таблицы остаются ссылками, а не кнопками. */
.account_page table a {
  color: var(--pepfer-ink);
  font-size: 13px;
}

/* ---- Поля ввода ---------------------------------------------------------- */
.account_page .input_block { margin-bottom: 12px; }

.account_page input[type="text"],
.account_page input[type="email"],
.account_page input[type="tel"],
.account_page input[type="password"],
.account_page select,
.account_page textarea {
  width: 100%;
  padding: 16px 18px;
  font-family: var(--pepfer-sans);
  font-size: 15px;
  color: var(--pepfer-ink);
  background: var(--pepfer-paper, #FFFFFF);
  border: 1px solid var(--pepfer-line);
  border-radius: 0;
  transition: border-color .2s ease;
}

.account_page input:focus,
.account_page select:focus,
.account_page textarea:focus {
  border-color: var(--pepfer-ink);
  outline: none;
}

/* ---- Мелочи -------------------------------------------------------------- */
.account_page .alert {
  padding: 14px 18px;
  margin-bottom: 24px;
  border: 1px solid var(--pepfer-line);
  border-left: 3px solid var(--pepfer-ink);
  background: var(--pepfer-soft, #FCFBF8);
  font-size: 14px;
}

.account_page .text-danger {
  font-size: 13px;
  color: var(--pepfer-accent, #C4552A);
}

@media (max-width: 767px) {
  .account_page { padding-bottom: 40px; }

  /* Отбор в три класса — как в правиле сетки выше: коротким его не перебить. */
  .account_page .block_info .account_home { grid-template-columns: repeat(2, minmax(0, 1fr)); }

  .account_page .block_info .account_home .block a {
    min-height: 96px;
    padding: 16px 10px;
    gap: 10px;
  }

  .account_page .block_info .account_home .block a span { font-size: 10px; letter-spacing: .06em; }

  /* Значки исходная тема на телефоне прятала. Они мелкие и помогают найти
     нужную плитку взглядом — там они тем более к месту. */
  .account_page .block_info .account_home .block a img { display: block; }

  .account_page table { font-size: 13px; }
  .account_page table thead td { padding: 0 8px 8px; }
  .account_page table tbody td { padding: 12px 8px; }

  .account_page .buttons a,
  .account_page .buttons input[type="submit"],
  .account_page input[type="submit"] { flex: 1 1 auto; text-align: center; }
}

/* Ссылки-действия в таблицах кабинета размечены классами бутстрапа, а самого
   бутстрапа на витрине нет: без правил они выглядят обычным текстом. Здесь им
   задан вид, принятый на сайте, — не заливка, а подчёркнутая строка: в ячейке
   таблицы кнопка весила бы больше самих данных. */
.account_page table .btn,
.account_page table a.btn {
  display: inline-block;
  padding: 0;
  border: 0;
  background: transparent;
  font-family: var(--pepfer-sans);
  font-size: 12px;
  font-weight: 600;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--pepfer-ink);
}

.account_page table .btn-danger { color: var(--pepfer-accent, #C4552A); }

/* А внизу страницы — настоящие кнопки: там действие завершает работу. */
.account_page .buttons .btn { display: inline-block; }

/* ---- Страница заказа ------------------------------------------------------ */
.order-summary {
  margin: 0 0 32px;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
  gap: 16px 32px;
}

.order-summary__row { margin: 0; }

.order-summary dt {
  font-family: var(--pepfer-sans);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--pepfer-muted);
  margin: 0 0 4px;
}

.order-summary dd {
  margin: 0;
  font-family: var(--pepfer-sans);
  font-size: 15px;
  color: var(--pepfer-ink);
}

.order-addresses {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  gap: 16px;
  margin-bottom: 32px;
}

.order-addresses__item {
  padding: 18px;
  border: 1px solid var(--pepfer-line);
}

.order-addresses__title {
  font-family: var(--pepfer-sans);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--pepfer-muted);
  margin-bottom: 8px;
}

.order-addresses__body {
  font-family: var(--pepfer-sans);
  font-size: 15px;
  line-height: 1.6;
  color: var(--pepfer-ink);
}

/* Итоги под таблицей: последняя строка — сумма к оплате, её и выделяем. */
.account_page table tfoot td {
  padding: 8px 12px;
  border: 0;
  font-family: var(--pepfer-sans);
  font-size: 14px;
  color: var(--pepfer-ink);
}

.account_page table tfoot tr:last-child td {
  padding-top: 14px;
  font-weight: 600;
  font-size: 16px;
}

.account_page table tfoot tr:first-child td { padding-top: 16px; }

.order-actions { white-space: nowrap; }
.order-actions .btn + .btn { margin-left: 12px; }

/* ---- Разделы кабинета в шапке -------------------------------------------- */
.account-menu { position: relative; display: inline-flex; }

.account-menu__panel {
  position: absolute;
  z-index: 60;
  top: calc(100% + 12px);
  right: 0;
  min-width: 220px;
  padding: 18px 20px;
  background: var(--pepfer-paper, #FFFFFF);
  border: 1px solid var(--pepfer-line);
  box-shadow: 0 18px 44px rgba(32, 27, 20, .12);
  text-align: left;
}

.account-menu__name {
  font-family: var(--pepfer-sans);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--pepfer-muted);
  margin-bottom: 12px;
}

.account-menu__list {
  list-style: none;
  margin: 0;
  padding: 0;
}

.account-menu__list li + li { margin-top: 10px; }

.account-menu__list a,
.account-menu__exit {
  font-family: var(--pepfer-sans);
  font-size: 14px;
  color: var(--pepfer-ink);
  white-space: nowrap;
}

/* Черты между разделами убраны: панель узкая, разделы и так разведены
   отступами и подписями, а три линии на полтораста пикселей высоты делали из
   списка разлинованный бланк. */
.account-menu__exit {
  display: inline-block;
  margin-top: 18px;
  font-size: 12px;
  font-weight: 600;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--pepfer-muted);
}

/* ---- Первая страница кабинета: заказы ------------------------------------ */
.account-orders {
  display: grid;
  gap: 12px;
  margin-bottom: 20px;
}

.account-order {
  display: block;
  padding: 18px 20px;
  border: 1px solid var(--pepfer-line);
  color: var(--pepfer-ink);
  transition: border-color .2s ease;
}

.account-order:hover { border-color: var(--pepfer-ink); }

.account-order__head {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: space-between;
  gap: 12px;
}

.account-order__number {
  font-family: var(--pepfer-sans);
  font-size: 15px;
  font-weight: 600;
}

.account-order__status {
  font-family: var(--pepfer-sans);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--pepfer-muted);
}

.account-order__products {
  margin-top: 8px;
  font-family: var(--pepfer-sans);
  font-size: 14px;
  line-height: 1.5;
  color: var(--pepfer-muted);
  /* Состав — подсказка, а не список: две строки, дальше многоточие. */
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

.account-order__foot {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 12px;
  margin-top: 12px;
  font-family: var(--pepfer-sans);
  font-size: 14px;
}

.account-order__date { color: var(--pepfer-muted); }
.account-order__total { font-variant-numeric: tabular-nums; }

.account-more {
  font-family: var(--pepfer-sans);
  font-size: 13px;
  margin-bottom: 32px;
}

.account-empty {
  margin-bottom: 20px;
  color: var(--pepfer-muted);
}

/* Служебные разделы строкой: к ним возвращаются раз в полгода. */
.account-sections {
  display: flex;
  flex-wrap: wrap;
  gap: 8px 20px;
  padding-top: 24px;
  border-top: 1px solid var(--pepfer-line);
}

.account-sections a {
  font-family: var(--pepfer-sans);
  font-size: 12px;
  font-weight: 600;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--pepfer-ink);
}

@media (max-width: 767px) {
  .account-menu__panel { display: none; }
  .account-sections { gap: 10px 16px; }
}

/* ---- Незаполненное свойство товара ---------------------------------------
   Ответ сервера «Размер обязательно!» вставляется прямо в ряд кнопок размера.
   Ряд выложен гибкой строкой, и сообщению доставалась нулевая ширина: оно было
   в разметке, но его не было видно — покупатель нажимал «Добавить в корзину» и
   решал, что кнопка не работает.

   Строка занимает всю ширину ряда и набрана акцентной краской: это отказ, а не
   подпись. */
#product .form-group .text-danger,
.radio_full .text-danger {
  flex: 0 0 100%;
  width: 100%;
  margin-top: 8px;
  font-family: var(--pepfer-sans);
  font-size: 13px;
  line-height: 1.4;
  color: var(--pepfer-accent, #C4552A);
}

/* Сами кнопки свойства при ошибке обводятся той же краской: взгляд идёт от
   сообщения к тому, что надо выбрать. */
#product .form-group.has-error label,
#product .form-group.has-error .radio label {
  border-color: var(--pepfer-accent, #C4552A);
}


/* ==========================================================================
   Форма подарочного сертификата
   ==========================================================================

   Страница собиралась темой по остаточному принципу: подписей у полей не было
   вовсе — их заменяли плейсхолдеры, которые исчезают с первой же буквой, —
   поля были на пять пикселей выше, чем в оформлении заказа, галка согласия
   стояла справа от текста, а обязательные поля ничем не отличались от
   необязательных.

   Ниже форма сведена к тому же набору, что и оформление заказа: та же высота
   поля, та же плавающая подпись, та же звёздочка, та же кнопка. Отбор через
   .pepfer-form, а не через страницу, — набор пригодится и другим формам
   кабинета. */

/* Заголовок на этой странице короче меры вдвое и разваливался на две строки:
   в колонке шириной в семьдесят знаков сорок два пикселя читаются вывеской, а
   не названием. Шаг вниз по той же шкале — при том же начертании и цвете. */
.account_page .block_info h1.voucher_page__title {
  font-size: clamp(24px, 2.2vw, 30px);
  margin-bottom: 12px;
}

.voucher_page__lead {
  max-width: 52ch;
  margin: 0 0 28px;
  font-family: var(--pepfer-sans);
  font-size: 14px;
  line-height: 1.6;
  color: var(--pepfer-muted);
}

/* Пояснение к странице набрано мельче основного текста и приглушённой краской
   — правило точнее общего .account_page p, поэтому размер берётся отсюда. */
.account_page .block_info p.voucher_page__lead { font-size: 14px; }

/* ---- Поле с плавающей подписью ------------------------------------------ */

.pepfer-form .pepfer-field {
  position: relative;
  margin-bottom: 12px;
}

/* Высота, поля и рамка повторены для наведения и нажатия: normalize.css
   обнуляет рамку у input и textarea во всех состояниях, кроме покоя, и без
   повтора строка формы подпрыгивала бы под курсором. */
.pepfer-form .pepfer-field .pepfer-field__control,
.pepfer-form .pepfer-field .pepfer-field__control:hover,
.pepfer-form .pepfer-field .pepfer-field__control:focus,
.pepfer-form .pepfer-field .pepfer-field__control:active {
  box-sizing: border-box;
  display: block;
  width: 100%;
  height: 46px;
  margin: 0;
  padding: 18px 14px 0;
  border: 1px solid var(--pepfer-line);
  border-radius: 0;
  background: var(--pepfer-paper);
  font-family: var(--pepfer-sans);
  font-size: 14px;
  line-height: normal;
  color: var(--pepfer-ink);
  outline: none;
}

.pepfer-form .pepfer-field__control:focus { border-color: var(--pepfer-ink); }

/* Плейсхолдер здесь — не подсказка, а признак пустоты: по нему браузер и
   решает, поднимать подпись или нет. Показывать его незачем. */
.pepfer-form .pepfer-field__control::placeholder { color: transparent; }

.pepfer-form .pepfer-field__label {
  position: absolute;
  top: 23px;
  left: 15px;
  right: 15px;
  transform: translateY(-50%);
  margin: 0;
  font-family: var(--pepfer-sans);
  font-size: 14px;
  line-height: 1.2;
  color: var(--pepfer-muted);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  pointer-events: none;
  transition: transform .16s ease-out, font-size .16s ease-out;
}

.pepfer-form .pepfer-field__control:focus ~ .pepfer-field__label,
.pepfer-form .pepfer-field__control:not(:placeholder-shown) ~ .pepfer-field__label {
  transform: translateY(-17px);
  font-size: 10px;
}

/* Звёздочка у обязательных — той же краской, что и в оформлении заказа. */
.pepfer-form .pepfer-field--required .pepfer-field__label::after,
.pepfer-form .pepfer-choices--required .pepfer-choices__title::after {
  content: ' *';
  color: var(--pepfer-accent);
}

/* Поле сообщения выше строки, и подпись в нём не по центру, а под верхним
   краем: по центру она висела бы посреди пустоты. */
.pepfer-form .pepfer-field.pepfer-field--area .pepfer-field__control,
.pepfer-form .pepfer-field.pepfer-field--area .pepfer-field__control:hover,
.pepfer-form .pepfer-field.pepfer-field--area .pepfer-field__control:focus,
.pepfer-form .pepfer-field.pepfer-field--area .pepfer-field__control:active {
  height: 108px;
  padding: 26px 14px 10px;
  line-height: 1.5;
  resize: vertical;
}

.pepfer-form .pepfer-field--area .pepfer-field__label {
  top: 22px;
  transform: none;
}

.pepfer-form .pepfer-field--area .pepfer-field__control:focus ~ .pepfer-field__label,
.pepfer-form .pepfer-field--area .pepfer-field__control:not(:placeholder-shown) ~ .pepfer-field__label {
  top: 12px;
  transform: none;
}

/* Поле даты: браузер рисует в нём формат с первой же секунды, поэтому места
   для подписи внизу нет — она поднята всегда. Тот же приём подойдёт любому
   полю, которое приходит уже заполненным. */
.pepfer-form .pepfer-field.pepfer-field--fixed .pepfer-field__label {
  transform: translateY(-17px);
  font-size: 10px;
}

.pepfer-form .pepfer-field--fixed .pepfer-field__control::-webkit-datetime-edit {
  padding: 0;
}

.pepfer-form .pepfer-field__hint {
  margin-top: 6px;
  font-family: var(--pepfer-sans);
  font-size: 12px;
  line-height: 1.4;
  color: var(--pepfer-muted);
}

.pepfer-form .text-danger {
  display: block;
  margin-top: 4px;
  font-family: var(--pepfer-sans);
  font-size: 12px;
  line-height: 1.4;
  color: #9A3413;
}

/* ---- Переключатели ------------------------------------------------------- */

.pepfer-form .pepfer-choices {
  margin: 20px 0 20px;
  padding: 0;
  border: 0;
}

.pepfer-form .pepfer-choices__title {
  display: block;
  width: 100%;
  margin: 0 0 10px;
  padding: 0;
  border: 0;
  font-family: var(--pepfer-sans);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--pepfer-muted);
}

.pepfer-form .pepfer-choice {
  display: flex;
  align-items: center;
  gap: 10px;
  margin: 0 0 8px;
  font-family: var(--pepfer-sans);
  font-size: 14px;
  line-height: 1.4;
  color: var(--pepfer-ink);
  cursor: pointer;
}

.pepfer-form .pepfer-choice input {
  width: auto;
  height: auto;
  margin: 0;
  flex: none;
  accent-color: var(--pepfer-ink);
}

/* «Товар вскрыт?» — вопрос с двумя ответами: столбиком он занимал бы три
   строки там, где хватает одной. */
.pepfer-form .pepfer-choices--inline {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 8px 20px;
}

.pepfer-form .pepfer-choices--inline .pepfer-choices__title { width: auto; margin: 0; }
.pepfer-form .pepfer-choices--inline .pepfer-choice { margin: 0; }

/* ---- Согласие ------------------------------------------------------------ */

/* Галка стояла после текста — единственная такая на сайте. Ставим её слева и
   делаем всю строку подписью: попасть в квадрат в тринадцать пикселей трудно,
   в строку — нет. */
.pepfer-form .pepfer-agree {
  display: flex;
  align-items: flex-start;
  gap: 10px;
  margin: 24px 0 0;
  font-family: var(--pepfer-sans);
  font-size: 13px;
  line-height: 1.5;
  color: var(--pepfer-ink);
  cursor: pointer;
}

.pepfer-form .pepfer-agree input {
  width: auto;
  height: auto;
  margin: 2px 0 0;
  flex: none;
  accent-color: var(--pepfer-ink);
}

/* ---- Кнопка -------------------------------------------------------------- */

.pepfer-form__actions { margin-top: 20px; }

/* Размер повторён для наведения по той же причине, что и у полей: normalize
   снимает у кнопки рамку во всех состояниях, кроме покоя. Наведение при этом
   остаётся чисто цветовым — заливка и краска меняются местами, как в корзине. */
.pepfer-form .pepfer-form__actions .pepfer-form__submit,
.pepfer-form .pepfer-form__actions .pepfer-form__submit:hover,
.pepfer-form .pepfer-form__actions .pepfer-form__submit:focus,
.pepfer-form .pepfer-form__actions .pepfer-form__submit:active {
  box-sizing: border-box;
  display: block;
  width: 100%;
  min-height: 46px;
  margin: 0;
  padding: 0 26px;
  border: 1px solid #241F1A;
  border-radius: 0;
  font-family: var(--pepfer-sans);
  font-size: 12px;
  font-weight: 400;
  letter-spacing: .1em;
  text-transform: uppercase;
  cursor: pointer;
  outline: none;
  transition: background-color .2s ease, color .2s ease;
}

.pepfer-form .pepfer-form__actions .pepfer-form__submit {
  background-color: #241F1A;
  color: var(--pepfer-paper);
}

.pepfer-form .pepfer-form__actions .pepfer-form__submit:hover,
.pepfer-form .pepfer-form__actions .pepfer-form__submit:focus-visible {
  background-color: var(--pepfer-paper);
  color: #241F1A;
}

/* Отказ формы — над ней, той же краской, что и ошибки отдельных полей. */
.account_page .block_info .voucher_page__warning {
  margin: 0 0 20px;
  padding: 12px 14px;
  border: 1px solid #9A3413;
  font-family: var(--pepfer-sans);
  font-size: 13px;
  line-height: 1.5;
  color: #9A3413;
}


/* ==========================================================================
   Страница-подтверждение
   ==========================================================================

   Одна и та же страница показывается после регистрации, заявки на возврат,
   письма из формы связи и покупки сертификата. До сих пор она доставалась ей
   от стоковой темы: заголовок во всю ширину, абзац на всю строку экрана и
   синяя кнопка в правом углу. */

.success_page {
  box-sizing: border-box;
  width: 100%;
  max-width: 640px;
  margin: 40px auto 90px;
  padding: 0;
  float: none;
}

.success_page__title {
  margin: 0 0 16px;
  font-family: var(--pepfer-serif);
  font-weight: 400;
  font-size: clamp(24px, 2.2vw, 30px);
  line-height: 1.2;
  letter-spacing: 0;
  text-transform: none;
  color: var(--pepfer-ink);
}

.success_page__text {
  font-family: var(--pepfer-sans);
  font-size: 14px;
  line-height: 1.6;
  color: var(--pepfer-ink);
}

.success_page__text p { margin: 0 0 12px; }
.success_page__text p:last-child { margin-bottom: 0; }

.success_page__actions { margin-top: 28px; }

/* Кнопка та же, что в корзине и на формах: заливка и краска меняются местами.
   Геометрия повторена для наведения — normalize.css снимает рамку у ссылки
   без него. */
.success_page__button,
.success_page__button:hover,
.success_page__button:focus,
.success_page__button:active {
  box-sizing: border-box;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 46px;
  padding: 0 32px;
  border: 1px solid #241F1A;
  border-radius: 0;
  font-family: var(--pepfer-sans);
  font-size: 12px;
  font-weight: 400;
  letter-spacing: .1em;
  text-transform: uppercase;
  text-decoration: none;
  background-image: none;
  transition: background-color .2s ease, color .2s ease;
}

.success_page__button {
  background-color: #241F1A;
  color: var(--pepfer-paper);
}

.success_page__button:hover,
.success_page__button:focus-visible {
  background-color: var(--pepfer-paper);
  color: #241F1A;
}

/* ---- Сертификат в корзине ------------------------------------------------ */

/* Строка сертификата в боковой корзине: снимка у неё нет, и место под него
   не резервируется — иначе строка висела бы с пустым квадратом слева. Строка
   выложена гибкой полосой, поэтому телу достаточно занять её целиком. */
.pcd-line--voucher .pcd-line__body { flex: 1 1 auto; }
.pcd-line--voucher .pcd-line__name { font-weight: 400; }
.pcd-line--voucher .pcd-line__option { color: var(--pepfer-muted); }

/* То же на странице корзины: ячейки снимка, веса и количества у сертификата
   пустые, и заполнять их нечем. */
.products_list .block--voucher .image,
.products_list .block--voucher .count { visibility: hidden; }


/* ==========================================================================
   Тема сертификата и предпросмотр письма
   ==========================================================================

   Темы различаются только картинкой, которую увидит получатель, а выбирались
   по названию: «Другое» и «Для него» — это, как выяснилось, один и тот же
   снимок, и понять это по списку было нельзя. */

.voucher-themes {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
  gap: 12px;
  width: 100%;
}

.voucher-theme {
  display: flex;
  flex-direction: column;
  gap: 8px;
  margin: 0;
  padding: 8px;
  border: 1px solid var(--pepfer-line);
  cursor: pointer;
  transition: border-color .2s ease;
}

.voucher-theme:hover { border-color: var(--pepfer-ink); }

/* Выбранная тема обведена краской текста: заливка спорила бы со снимком. */
.voucher-theme:has(input:checked) { border-color: var(--pepfer-ink); }

/* Переключатель остаётся в разметке — по нему работают клавиатура и озвучка,
   — но не показывается: выбор виден по обводке снимка. */
.voucher-theme input {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip: rect(0 0 0 0);
  white-space: nowrap;
  border: 0;
}

.voucher-theme:has(input:focus-visible) { outline: 2px solid var(--pepfer-ink); outline-offset: 2px; }

.voucher-theme__image {
  display: block;
  width: 100%;
  height: auto;
  aspect-ratio: 3 / 4;
  object-fit: cover;
}

.voucher-theme__name {
  font-family: var(--pepfer-sans);
  font-size: 12px;
  line-height: 1.3;
  color: var(--pepfer-ink);
}

/* ---- Второстепенное действие рядом с кнопкой ----------------------------- */

/* Контур вместо заливки: предпросмотр — не оформление покупки, и выглядеть
   наравне с ним не должен. Геометрия повторена для наведения — normalize.css
   снимает у кнопки рамку во всех состояниях, кроме покоя. */
.pepfer-form .pepfer-form__actions .pepfer-form__secondary,
.pepfer-form .pepfer-form__actions .pepfer-form__secondary:hover,
.pepfer-form .pepfer-form__actions .pepfer-form__secondary:focus,
.pepfer-form .pepfer-form__actions .pepfer-form__secondary:active {
  box-sizing: border-box;
  display: block;
  width: 100%;
  min-height: 46px;
  margin: 10px 0 0;
  padding: 0 26px;
  border: 1px solid var(--pepfer-line);
  border-radius: 0;
  background-color: transparent;
  color: var(--pepfer-ink);
  font-family: var(--pepfer-sans);
  font-size: 12px;
  font-weight: 400;
  letter-spacing: .1em;
  text-transform: uppercase;
  cursor: pointer;
  outline: none;
  transition: border-color .2s ease, background-color .2s ease, color .2s ease;
}

.pepfer-form .pepfer-form__actions .pepfer-form__secondary:hover,
.pepfer-form .pepfer-form__actions .pepfer-form__secondary:focus-visible {
  border-color: var(--pepfer-ink);
}

/* ---- Окно предпросмотра -------------------------------------------------- */

.voucher-preview {
  position: fixed;
  inset: 0;
  z-index: 1200;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 24px 16px;
}

.voucher-preview[hidden] { display: none; }

.voucher-preview__backdrop {
  position: absolute;
  inset: 0;
  background: rgba(32, 27, 20, .55);
}

.voucher-preview__window {
  position: relative;
  display: flex;
  flex-direction: column;
  width: 100%;
  max-width: 680px;
  height: 100%;
  max-height: 90vh;
  background: var(--pepfer-paper, #FFFFFF);
}

.voucher-preview__head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  padding: 14px 18px;
  border-bottom: 1px solid var(--pepfer-line);
  font-family: var(--pepfer-sans);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--pepfer-muted);
}

.voucher-preview__close,
.voucher-preview__close:hover,
.voucher-preview__close:focus,
.voucher-preview__close:active {
  width: 32px;
  height: 32px;
  margin: 0;
  padding: 0;
  border: 0;
  background: none;
  font-size: 22px;
  line-height: 1;
  color: var(--pepfer-ink);
  cursor: pointer;
}

/* Письмо показывается в кадре: у почтового шаблона своя разметка со своими
   цветами и шрифтами, и пускать её в разметку страницы нельзя — она бы
   перемешалась с оформлением сайта. */
.voucher-preview__frame {
  flex: 1 1 auto;
  width: 100%;
  border: 0;
  background: #F2EFEA;
}


/* ---- Кнопка кабинета: состояние и дерево разделов ------------------------- */

/* Значок ничем не отличался у гостя и у вошедшего: понять, жива ли сессия,
   можно было только зайдя внутрь. Вошедшему значок заливается фирменной
   краской — тем же приёмом, что у сердца в избранном. */
.account-menu__icon {
  display: block;
  width: 24px;
  height: 24px;
  fill: currentColor;
  transition: fill .2s ease, color .2s ease;
}

.account-menu.is-logged .login_url { color: var(--pepfer-accent); }

/* Имя рядом со значком — только на широком экране: в шапке телефона места
   нет, а состояние там и так видно по заливке. */
.account-menu__state {
  display: none;
  margin-left: 8px;
  font-family: var(--pepfer-sans);
  font-size: 12px;
  letter-spacing: .04em;
  color: var(--pepfer-accent);
  max-width: 10ch;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.account-menu .login_url {
  display: inline-flex;
  align-items: center;
}

@media (min-width: 992px) {
  .account-menu.is-logged .account-menu__state { display: inline-block; }
}

/* Дерево разделов: подпись группы и её пункты со сдвигом — так же, как
   разделы каталога в выезжающем меню. */
.account-menu__group + .account-menu__group {
  margin-top: 20px;
}

.account-menu__title {
  margin-bottom: 8px;
  font-family: var(--pepfer-sans);
  font-size: 10px;
  font-weight: 600;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--pepfer-muted);
}

.account-menu__group .account-menu__list { padding-left: 12px; }

.account-menu__list a:hover { color: var(--pepfer-accent); }

/* Обязательность раздела помечается на его заголовке: внутри выбор один на
   всю группу, и звёздочка у каждого переключателя была бы неправдой. */
.return_page__section--required > legend::after {
  content: ' *';
  color: var(--pepfer-accent);
}


/* ---- Снимки к заявке на возврат ------------------------------------------ */

.return-photos { margin-top: 20px; }

.return-photos__head {
  display: flex;
  flex-direction: column;
  gap: 4px;
  margin-bottom: 10px;
}

.return-photos__title {
  font-family: var(--pepfer-sans);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--pepfer-muted);
}

.return-photos__hint {
  font-family: var(--pepfer-sans);
  font-size: 12px;
  line-height: 1.4;
  color: var(--pepfer-muted);
}

.return-photos__list {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
}

.return-photos__list:empty { display: none; }

/* Плитка снимка: квадрат, чтобы вертикальные и горизонтальные кадры стояли
   одним рядом. Кадрирование по центру — то же, что в галерее коллекции. */
.return-photo {
  position: relative;
  width: 92px;
  height: 92px;
  border: 1px solid var(--pepfer-line);
}

.return-photo__image {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.return-photo__remove,
.return-photo__remove:hover,
.return-photo__remove:focus,
.return-photo__remove:active {
  position: absolute;
  top: -8px;
  right: -8px;
  width: 22px;
  height: 22px;
  margin: 0;
  padding: 0;
  border: 1px solid var(--pepfer-line);
  border-radius: 50%;
  background: var(--pepfer-paper, #FFFFFF);
  font-size: 14px;
  line-height: 1;
  color: var(--pepfer-ink);
  cursor: pointer;
}

/* Выбор файла: своя кнопка вместо системной — та у каждого браузера своя и
   ни на что на сайте не похожа. Настоящее поле остаётся в разметке. */
.return-photos__button {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 40px;
  margin: 12px 0 0;
  padding: 0 20px;
  border: 1px solid var(--pepfer-line);
  font-family: var(--pepfer-sans);
  font-size: 11px;
  letter-spacing: .1em;
  text-transform: uppercase;
  color: var(--pepfer-ink);
  cursor: pointer;
  transition: border-color .2s ease;
}

.return-photos__button:hover { border-color: var(--pepfer-ink); }

.return-photos__button input {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip: rect(0 0 0 0);
  border: 0;
}

.return-photos.is-busy .return-photos__button { opacity: .5; pointer-events: none; }

.return-photos__error {
  margin-top: 8px;
  font-family: var(--pepfer-sans);
  font-size: 12px;
  line-height: 1.4;
  color: #9A3413;
}

.return-photos__error:empty { display: none; }

/* Кнопки окна бывают и ссылками — например, «Оформить заказ» после того, как
   сертификат лёг в корзину. Ссылке нужно то, что кнопка умеет сама:
   выравнивание текста по центру и отсутствие подчёркивания темы. */
.pepfer-confirm__actions a.pepfer-confirm__ok,
.pepfer-confirm__actions a.pepfer-confirm__cancel {
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
  text-decoration: none;
  background-image: none;
  padding-bottom: 12px;
}

/* Строка сертификата в корзине оформления: количество у него всегда одно, и
   запертое поле со счётчиком только сбивало ряд. */
.simplecheckout .simplecheckout-cart tr.pepfer-cart-voucher td.quantity .input-group { display: none; }


/* ==========================================================================
   Обратная связь
   ==========================================================================

   Страница досталась от старой темы: кремовая колонка «Информация» с чужим
   меню занимала треть экрана, поля стояли без подписей, кнопка была синей.
   Слева теперь сведения о магазине, справа — обычная форма сайта. */

.contact_page {
  display: grid;
  grid-template-columns: minmax(0, 5fr) minmax(0, 6fr);
  gap: clamp(24px, 4vw, 64px);
  align-items: start;
  max-width: 1000px;
  margin: 10px auto 90px;
}

.contact_page__title {
  margin: 0 0 24px;
  font-family: var(--pepfer-serif);
  font-weight: 400;
  font-size: clamp(28px, 3vw, 40px);
  line-height: 1.15;
  letter-spacing: 0;
  text-transform: none;
  color: var(--pepfer-ink);
}

.contact_page__subtitle {
  margin: 0 0 18px;
  font-family: var(--pepfer-sans);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--pepfer-muted);
}

.contact_page__facts {
  display: grid;
  gap: 18px;
}

.contact_page__fact {
  display: grid;
  gap: 4px;
}

/* Подпись мельче значения: адрес и телефон читают, а не разглядывают, чем они
   подписаны. */
.contact_page__label {
  font-family: var(--pepfer-sans);
  font-size: 11px;
  letter-spacing: .1em;
  text-transform: uppercase;
  color: var(--pepfer-muted);
}

.contact_page__value {
  font-family: var(--pepfer-sans);
  font-size: 15px;
  line-height: 1.5;
  color: var(--pepfer-ink);
}

a.contact_page__value,
.contact_page__map {
  color: var(--pepfer-ink);
  text-decoration: none;
  border-bottom: 1px solid var(--pepfer-line);
  padding-bottom: 1px;
  background-image: none;
  transition: border-color .2s ease;
}

a.contact_page__value:hover,
.contact_page__map:hover { border-color: var(--pepfer-ink); }

/* Ссылка в ячейке сетки растягивалась на всю колонку, и черта под телефоном
   уезжала далеко за сам номер. Прижимаем к началу строки. */
.contact_page__fact a { justify-self: start; }

.contact_page__map {
  font-family: var(--pepfer-sans);
  font-size: 13px;
}

/* Узкий экран: сведения над формой, а не рядом — колонки по 300 пикселей
   ломали бы и адрес, и поля. */
@media (max-width: 767px) {
  .contact_page {
    grid-template-columns: minmax(0, 1fr);
    gap: 32px;
    margin-bottom: 64px;
  }
}


/* ---- Ролик коллекции на главной ------------------------------------------

   На месте обложки может стоять ролик. Половина строки под него отведена та
   же, что под снимок, — иначе соседние коллекции разъезжались бы по высоте,
   а ряд из трёх перестал бы читаться рядом.

   Пропорции ролика при этом свои: вертикальный кадр 9:16 в коробке 4:3 не
   обрезается, а вписывается — обрезка съела бы у вертикального ролика голову
   и ноги. Свободное место по бокам заливается той же краской, что и подложка
   пустой обложки. */
.editorial-row--video .editorial-row__media {
  display: flex;
  align-items: center;
  justify-content: center;
}

/* Коробка под ролик задана пропорцией 4:3 — той самой, какую заняла бы
   фотография на этом месте. Фотографии её не навязывают: у них есть своя
   высота, и на главной они показываются целиком. У ролика такой высоты нет,
   пока он не загрузился, поэтому коробку приходится назвать.

   Ролик в неё вписывается, а не обрезается: у вертикального кадра обрезка
   съедает голову и ноги. Значит высота у него — высота коробки, а ширину он
   берёт по своим пропорциям. */
.editorial-block .editorial-row--video .editorial-row__media {
  aspect-ratio: 4 / 3;
}

/* Проигрыватель знает свои пропорции сам — они приходят из ролика. Задаём
   ему высоту коробки, а ширину он выберет по ним: вертикальный кадр встанет
   узким столбцом, горизонтальный займёт всю половину.

   max-width обязателен: в общем листе роликов вертикальные сужены до 420
   пикселей, чтобы на странице коллекции не занимать два экрана. Здесь ширину
   диктует половина строки, и тот предел только мешал бы. */
.editorial-block .editorial-row--video .editorial-row__media .pepfer-video {
  /* Ширину считает браузер по пропорции самого ролика — она приходит
     переменной прямо в разметке. Без неё кадр оставался шириной с исходный
     файл и не занимал отведённой высоты. */
  aspect-ratio: var(--pepfer-video-ratio, 16 / 9);
  width: auto;
  max-width: 100%;
  height: 100%;
  /* Узкий кадр прижимается к тексту, а не висит посреди своей половины:
     между ним и описанием остаётся один просвет, а не два разных. Строки
     на главной чередуют стороны, поэтому сторона прижатия зависит от
     того, где в этой строке текст. */
  margin: 0 0 0 auto;
}

/* Перевёрнутая строка: текст слева, ролик справа — значит прижимаем влево. */
.editorial-block .editorial-row--video.is-reversed .editorial-row__media .pepfer-video {
  margin: 0 auto 0 0;
}

/* На узком экране половин нет: строка идёт в одну колонку, и кадр встаёт
   посередине — прижимать его некуда. */
@media (max-width: 767px) {
  .editorial-block .editorial-row--video .editorial-row__media .pepfer-video,
  .editorial-block .editorial-row--video.is-reversed .editorial-row__media .pepfer-video {
    margin: 0 auto;
  }
}

/* Проигрыватель поднимается поверх тега video и заводит свою обёртку —
   ей тоже нужна вся коробка, иначе кадр остаётся размером с исходный файл. */
.editorial-block .editorial-row--video .editorial-row__media .pepfer-video .plyr,
.editorial-block .editorial-row--video .editorial-row__media .pepfer-video .plyr__video-wrapper,
.editorial-block .editorial-row--video .editorial-row__media .pepfer-video video,
.editorial-block .editorial-row--video .editorial-row__media .pepfer-video iframe {
  width: 100%;
  height: 100%;
  max-height: none;
  aspect-ratio: auto;
  object-fit: cover;
}

/* Поле по бокам вертикального кадра остаётся белым: серые подложки под
   изображениями на главной убраны намеренно, и заливать их обратно ради
   ролика значило бы вернуть то, от чего ушли.

   Подпись ролика на главной не нужна: строку и так подписывают заголовок с
   подзаголовком, а вторая подпись под кадром читалась бы как часть текста
   коллекции. */
.editorial-row--video .editorial-row__media .pepfer-video figcaption { display: none; }


/* ==========================================================================
   Профиль, регистрация и адреса
   ==========================================================================

   Эти страницы собирает тот же модуль, что и оформление заказа, — и разметку
   даёт ту же: .form-group с подписью в колонке слева и полем справа. Досталось
   им, однако, стоковое оформление: рамка вокруг всей формы, поля с отступом от
   левого края страницы и «Продолжить» ссылкой в правом углу.

   Ниже они сведены к тому же виду, что корзина: плавающая подпись внутри поля,
   высота 46, кнопка с инверсией. Скрипт оформления теперь работает и здесь —
   подписи поднимаются тем же кодом. */

/* Класс simple-page модуль вешает на #content всех своих страниц — и форм
   кабинета, и оформления заказа. Поэтому здесь только сброс стокового
   поведения: ширина во всю колонку, без обтекания. Меру строки задают сами
   формы, ниже: оформлению она не годится, у него две колонки. */
.simple-page {
  box-sizing: border-box;
  width: 100%;
  padding: 0;
  float: none;
}

/* Мера строки для форм кабинета: поля читают по одному, а не сравнивают
   взглядом слева направо. На оформление заказа не распространяется — там
   корзина и итог стоят рядом и им нужна вся ширина. */
.simpleregister,
.simpleedit,
.simpleaddress {
  max-width: 560px;
  margin: 10px auto 90px;
}

/* Рамка вокруг формы убрана: она обводила пустоту и повторяла собой границу
   страницы. Поля стоят от левого края меры, без ступеньки. */
.simpleregister,
.simpleregister-block-content {
  padding: 0;
  border: 0;
  background: none;
}

.simpleregister-block-content { margin: 0; }

.simpleregister .form-group {
  display: block;
  margin: 0 0 12px;
  padding: 0;
}

/* Колонки Bootstrap внутри строки поля больше не нужны: подпись переехала
   внутрь поля, а поле занимает всю меру. */
.simpleregister .form-group > label.control-label,
.simpleregister .form-group > div[class^="col-"],
.simpleregister .form-group > div[class*=" col-"] {
  float: none;
  width: 100%;
  max-width: none;
  padding-left: 0;
  padding-right: 0;
  text-align: left;
}

.simpleregister .control-label {
  font-family: var(--pepfer-sans);
  font-size: 12px;
  font-weight: 400;
  color: var(--pepfer-muted);
}

.simpleregister .form-group.required > label::after,
.simpleregister .form-group.required .control-label::after {
  content: ' *';
  color: var(--pepfer-accent);
}

.simpleregister .form-control,
.simpleregister .form-control:hover,
.simpleregister .form-control:focus,
.simpleregister .form-control:active {
  box-sizing: border-box;
  width: 100%;
  height: 46px;
  margin: 0;
  padding: 0 14px;
  border: 1px solid var(--pepfer-line);
  border-radius: 0;
  background: var(--pepfer-paper);
  box-shadow: none;
  font-family: var(--pepfer-sans);
  font-size: 14px;
  line-height: normal;
  color: var(--pepfer-ink);
  outline: none;
}

.simpleregister .form-control:focus { border-color: var(--pepfer-ink); }

.simpleregister textarea.form-control,
.simpleregister textarea.form-control:hover,
.simpleregister textarea.form-control:focus {
  height: 108px;
  padding: 12px 14px;
  line-height: 1.5;
  resize: vertical;
}

/* ---- Плавающая подпись: та же, что в корзине ---------------------------- */

.simpleregister .pepfer-float__holder { position: relative; }

.simpleregister .pepfer-float .control-label {
  position: absolute;
  top: 50%;
  left: 11px;
  right: 11px;
  transform: translateY(-50%);
  margin: 0;
  font-size: 14px;
  line-height: 1.2;
  color: var(--pepfer-muted);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  pointer-events: none;
  transition: transform .16s ease-out, font-size .16s ease-out;
}

.simpleregister .pepfer-float__holder.is-floated .control-label {
  transform: translateY(-17px);
  font-size: 10px;
}

.simpleregister .pepfer-float .form-control {
  height: 46px;
  padding: 18px 10px 0;
}

.simpleregister .pepfer-float select.form-control { padding-top: 16px; padding-left: 6px; }

.simpleregister .pepfer-float .form-control::placeholder { color: transparent; }

/* ---- Отказы полей ------------------------------------------------------- */

.simpleregister .simplecheckout-error-text,
.simpleregister .text-danger {
  display: block;
  margin-top: 4px;
  font-family: var(--pepfer-sans);
  font-size: 12px;
  line-height: 1.4;
  color: #9A3413;
}

/* ---- Кнопка ------------------------------------------------------------- */

.simpleregister .simpleregister-button-block {
  margin-top: 24px;
  padding: 0;
  border: 0;
  text-align: left;
}

/* Геометрия повторена для наведения: normalize.css снимает у ссылки рамку во
   всех состояниях, кроме покоя, а кнопка здесь — ссылка. */
.simpleregister a.button_oc,
.simpleregister a.button_oc:hover,
.simpleregister a.button_oc:focus,
.simpleregister a.button_oc:active {
  box-sizing: border-box;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 46px;
  padding: 0 32px;
  border: 1px solid #241F1A;
  border-radius: 0;
  font-family: var(--pepfer-sans);
  font-size: 12px;
  letter-spacing: .1em;
  text-transform: uppercase;
  text-decoration: none;
  background-image: none;
  cursor: pointer;
  transition: background-color .2s ease, color .2s ease;
}

.simpleregister a.button_oc {
  background-color: #241F1A;
  color: var(--pepfer-paper);
}

.simpleregister a.button_oc:hover,
.simpleregister a.button_oc:focus-visible {
  background-color: var(--pepfer-paper);
  color: #241F1A;
}

/* Рамка вокруг полей: её рисует normalize.css самому <fieldset>, которым
   модуль оборачивает строки формы. На оформлении заказа она снята давно, а
   профилю, регистрации и адресам досталась. Обводить группу полей нечем —
   их и так видно по самим полям. */
.simpleregister fieldset,
.simpleregister .form-horizontal {
  margin: 0;
  padding: 0;
  border: 0;
}


/* ==========================================================================
   «Есть вопросы?» — способ связи на выбор
   ==========================================================================

   Связь с магазином — не такое же мелкое действие, как «в избранное» или
   «сравнить», и значком в один ряд с ними она терялась. Кнопка шире, со
   словами и стрелкой: значок объясняет, о чём речь, слова — что будет,
   стрелка обещает выбор. */

.product-action--ask,
.product-action--ask:hover,
.product-action--ask:focus,
.product-action--ask:active {
  box-sizing: border-box;
  display: inline-flex;
  align-items: center;
  gap: 8px;
  height: 34px;
  padding: 0 10px;
  border: 0;
  background: none;
  font-family: var(--pepfer-sans);
  font-size: 12px;
  letter-spacing: .04em;
  color: var(--pepfer-ink);
  cursor: pointer;
}

/* Рамки нет: ряд действий набран одними значками без обводок, и рамка делала
   из кнопки поле ввода. Кнопку и так видно — она вдвое шире соседей и
   единственная со словами. Наведение гасит её так же, как соседей. */

/* Значок ростом и толщиной штриха в точности как у соседей: 20 пикселей при
   штрихе 1.2. При 17 и 1.3 он был мельче и заметно жирнее — рядом это читалось
   как другой набор. */
.product-action__glyph { width: 20px; height: 20px; flex: none; }
.product-action__label { white-space: nowrap; }

/* Список шире обычного: в нём длинная строка «Электронная почта», и по узкой
   колонке она переносилась бы. */
.product-menu__panel--ask { min-width: 232px; }

@media (max-width: 575px) {
  /* На узком экране запас ширины не нужен: список и так во всю колонку. */
  .product-menu__panel--ask { min-width: 0; }
}

/* ---- Окно: поля под выбранный способ ------------------------------------ */

/* Скрытое поле не занимает места: display: block выше перебил бы hidden. */
.callback__field[hidden] { display: none; }


/* ==========================================================================
   Коллекции на главной: на телефоне первым идёт название
   ==========================================================================

   Колонки складывались в столбик в том порядке, в каком лежат в разметке, —
   снимок, потом текст. Человек листал безымянные картинки и узнавал, чья
   коллекция, только под ней. Название идёт первым: так у каждой картинки
   сразу есть имя. Подзаголовок держится названия — это его вторая строка,
   а не начало описания.

   Столбик здесь flex, а не сетка: порядок задаётся свойством order, а для
   этого строки текста должны стать соседями снимка — их обёртка на время
   расходится (display: contents). Строки без снимка не трогаем: там
   переставлять нечего, а обёртка держит свою ширину и выключку. */

@media (max-width: 767px) {
  .editorial-block--collection .editorial-row:not(.editorial-row--textonly) {
    display: flex;
    flex-direction: column;
    /* Выше по файлу строкам задано align-items: start — в столбике это
       сжало бы снимок до ширины картинки. */
    align-items: stretch;
    gap: 16px;
  }

  .editorial-block--collection .editorial-row:not(.editorial-row--textonly) .editorial-row__text {
    display: contents;
  }

  /* Просветы держит gap: собственные отступы строк сложились бы с ним. */
  .editorial-block--collection .editorial-row:not(.editorial-row--textonly) .editorial-row__title {
    order: 1;
    margin-bottom: 0;
  }

  .editorial-block--collection .editorial-row:not(.editorial-row--textonly) .editorial-row__subtitle {
    order: 2;
    margin-bottom: 0;
  }

  .editorial-block--collection .editorial-row:not(.editorial-row--textonly) .editorial-row__media {
    order: 3;
  }

  .editorial-block--collection .editorial-row:not(.editorial-row--textonly) .editorial-row__intro {
    order: 4;
    margin-top: 0;
  }

  .editorial-block--collection .editorial-row:not(.editorial-row--textonly) .editorial-row__link {
    order: 5;
    align-self: start;
  }
}


/* ==========================================================================
   Стрелки ленты новинок
   ==========================================================================

   Знаки «‹» и «›» набирались шрифтом: своя толщина, свои поля, и подогнать их
   под остальную графику нечем. Стрелка собрана из двух чёрточек — тогда ею
   можно распорядиться: на наведении угол острее, чёрточки длиннее и чуть
   толще, а впереди уходит волна — намёк, куда поедет лента.

   Кнопка больше самой стрелки: шеврон занимает шестнадцать пикселей, а нажать
   нужно попадать пальцем. */

.new-arrivals__viewport { position: relative; }

.carousel-arrow {
  position: absolute;
  top: 50%;
  z-index: 2;
  display: grid;
  width: 44px;
  height: 48px;
  padding: 0;
  place-items: center;
  color: var(--pepfer-ink);
  background: transparent;
  border: 0;
  cursor: pointer;
  transform: translateY(-50%);
}

.carousel-arrow--prev { left: 0; }
.carousel-arrow--next { right: 0; }

.carousel-chevron {
  position: relative;
  display: block;
  width: 16px;
  height: 22px;
  transition: transform 240ms cubic-bezier(.4, 0, .2, 1);
}

.carousel-chevron__arm {
  position: absolute;
  top: 50%;
  width: 10px;
  height: 1px;
  background: currentColor;
  transition: transform 240ms cubic-bezier(.4, 0, .2, 1);
}

.carousel-arrow--next .carousel-chevron__arm {
  right: 2px;
  transform-origin: right center;
}

.carousel-arrow--next .carousel-chevron__arm--top { transform: rotate(45deg) scaleX(.84); }
.carousel-arrow--next .carousel-chevron__arm--bottom { transform: rotate(-45deg) scaleX(.84); }

.carousel-arrow--prev .carousel-chevron__arm {
  left: 2px;
  transform-origin: left center;
}

.carousel-arrow--prev .carousel-chevron__arm--top { transform: rotate(-45deg) scaleX(.84); }
.carousel-arrow--prev .carousel-chevron__arm--bottom { transform: rotate(45deg) scaleX(.84); }

/* Наведение: стрелка подаётся вперёд… */
.carousel-arrow--next:hover .carousel-chevron,
.carousel-arrow--next:focus-visible .carousel-chevron { transform: translateX(1.5px); }

.carousel-arrow--prev:hover .carousel-chevron,
.carousel-arrow--prev:focus-visible .carousel-chevron { transform: translateX(-1.5px); }

/* …и заостряется: угол уже, чёрточки во всю длину и чуть толще. */
.carousel-arrow--next:hover .carousel-chevron__arm--top,
.carousel-arrow--next:focus-visible .carousel-chevron__arm--top { transform: rotate(36deg) scaleX(1) scaleY(1.33); }

.carousel-arrow--next:hover .carousel-chevron__arm--bottom,
.carousel-arrow--next:focus-visible .carousel-chevron__arm--bottom { transform: rotate(-36deg) scaleX(1) scaleY(1.33); }

.carousel-arrow--prev:hover .carousel-chevron__arm--top,
.carousel-arrow--prev:focus-visible .carousel-chevron__arm--top { transform: rotate(-36deg) scaleX(1) scaleY(1.33); }

.carousel-arrow--prev:hover .carousel-chevron__arm--bottom,
.carousel-arrow--prev:focus-visible .carousel-chevron__arm--bottom { transform: rotate(36deg) scaleX(1) scaleY(1.33); }

/* ---- Волна --------------------------------------------------------------- */

.carousel-wave {
  position: absolute;
  top: 50%;
  width: 10px;
  height: 18px;
  color: inherit;
  opacity: 0;
  pointer-events: none;
}

.carousel-wave::before,
.carousel-wave::after {
  content: "";
  position: absolute;
  top: 50%;
  width: 8px;
  height: 1px;
  background: currentColor;
}

.carousel-arrow--next .carousel-wave { left: calc(50% - 2px); }

.carousel-arrow--next .carousel-wave::before,
.carousel-arrow--next .carousel-wave::after {
  right: 0;
  transform-origin: right center;
}

.carousel-arrow--next .carousel-wave::before { transform: rotate(36deg); }
.carousel-arrow--next .carousel-wave::after { transform: rotate(-36deg); }

.carousel-arrow--prev .carousel-wave { right: calc(50% - 2px); }

.carousel-arrow--prev .carousel-wave::before,
.carousel-arrow--prev .carousel-wave::after {
  left: 0;
  transform-origin: left center;
}

.carousel-arrow--prev .carousel-wave::before { transform: rotate(-36deg); }
.carousel-arrow--prev .carousel-wave::after { transform: rotate(36deg); }

/* Волна идёт только там, где есть настоящее наведение: на телефоне «наведение»
   срабатывает от касания и осталось бы висеть после нажатия. */
@media (hover: hover) and (pointer: fine) {
  .carousel-arrow--next:hover .carousel-wave {
    animation: carousel-wave-next 2200ms cubic-bezier(.22, .62, .25, 1) infinite both;
  }

  .carousel-arrow--prev:hover .carousel-wave {
    animation: carousel-wave-prev 2200ms cubic-bezier(.22, .62, .25, 1) infinite both;
  }
}

/* Волна начинается почти в силу шеврона и тает по дороге; с 68% до конца —
   пауза, иначе она бьётся частым пульсом. */
@keyframes carousel-wave-next {
  0% { opacity: 0; transform: translateY(-50%) translateX(-1px) scale(.74); }
  4% { opacity: .58; }
  28% { opacity: .39; }
  50% { opacity: .20; }
  68% { opacity: 0; transform: translateY(-50%) translateX(8px) scale(1.08); }
  100% { opacity: 0; transform: translateY(-50%) translateX(8px) scale(1.08); }
}

@keyframes carousel-wave-prev {
  0% { opacity: 0; transform: translateY(-50%) translateX(1px) scale(.74); }
  4% { opacity: .58; }
  28% { opacity: .39; }
  50% { opacity: .20; }
  68% { opacity: 0; transform: translateY(-50%) translateX(-8px) scale(1.08); }
  100% { opacity: 0; transform: translateY(-50%) translateX(-8px) scale(1.08); }
}

@media (prefers-reduced-motion: reduce) {
  .carousel-chevron,
  .carousel-chevron__arm { transition: none; }

  .carousel-wave { display: none; }
}


/* ==========================================================================
   Сердечко в карточке каталога
   ==========================================================================

   Было двадцать пикселей в трети силы: значок прятался, и о том, что товар
   можно отложить, узнавал только тот, кто наводил мышь. На телефоне наводить
   нечем — там его не находили вовсе.

   Теперь оно видно сразу, крупнее и с белым ореолом: снимки бывают тёмные, и
   чёрный контур на тёмной коже пропадал. Ореол — не тень, а обводка светом:
   он держит значок читаемым, не рисуя под ним плашки.

   Нажатие отзывается скачком: сердце подпрыгивает и садится на место. Это
   единственное, чем можно ответить на «отложено» в каталоге — переход на
   страницу избранного здесь был бы наказанием за любопытство. */

.products .block .favorite_button {
  width: 24px;
  height: 24px;
  top: 12px;
  right: 12px;
  opacity: .85;
  filter: drop-shadow(0 0 2px rgba(255, 255, 255, .95));
  transition: opacity .2s ease, transform .2s ease;
}

.products .block:hover .favorite_button { opacity: .85; }

.products .block .favorite_button:hover {
  opacity: 1;
  transform: scale(1.12);
}

/* Отложенное сердце — утверждение, а не намёк: в полную силу и без ореола,
   красное само по себе видно на любом снимке. */
.products .block .favorite_button.is-active {
  opacity: 1;
  filter: none;
  animation: pepfer-heart-pop 420ms cubic-bezier(.34, 1.56, .64, 1);
}

/* Скачок с перелётом: вверх сильнее, чем обратно, — так движение читается
   как отклик, а не как подёргивание. */
@keyframes pepfer-heart-pop {
  0% { transform: scale(1); }
  35% { transform: scale(1.38); }
  65% { transform: scale(.92); }
  100% { transform: scale(1); }
}

@media (prefers-reduced-motion: reduce) {
  .products .block .favorite_button,
  .products .block .favorite_button.is-active {
    transition: none;
    animation: none;
  }

  .products .block .favorite_button:hover { transform: none; }
}
