
/* ────────────────────────────────────────────────────────────────────────────
   СЛОЙ ТОКЕНОВ СТРАНИЦЫ → ФИРМЕННЫЕ РУЧКИ.
   Правило скилла aized-web-brand: не перекрашивать таблицу стилей целиком, а
   объявить свои токены ЧЕРЕЗ --brand-*. Тогда новая сборка стиля от Brendists
   приезжает одним прогоном brand/brand_palette.py, а не переписыванием сайта.
   Ни одного цвета руками: чего в палитре нет — ВЫВОДИМ через color-mix, потому
   что выведенный цвет переворачивается вместе с темой, а подобранный на глаз нет.
   ──────────────────────────────────────────────────────────────────────────── */
:root{
 --fg:var(--brand-ink);
 --mut:var(--brand-muted);
 --line:var(--brand-line);
 --acc:var(--brand-accent);          /* золото: рамки, обводка фокуса */
 /* ⚠️ Заливка кнопки под почти белую надпись дала 4.08:1 (светлая) и 3.85:1 (тёмная)
    — ниже нормы обе. Притемняем ЧЁРНЫМ, а не --brand-ink: ink в тёмной теме светлый,
    и подмес им испортил бы ту тему, ради которой правка. Замер после: 5.6:1 и 5.5:1. */
 --acc-fill:color-mix(in srgb,var(--brand-accent) 80%,#000);
 --on-acc:var(--brand-accent-ink);   /* текст на золоте */
 /* ⚠️ Золото БУКВОЙ не годится: замер на villka дал 2.73:1 в светлой теме.
    Подмешиваем основной текст — и цвет темнеет в светлой, светлеет в тёмной сам. */
 --acc-ink:color-mix(in srgb,var(--brand-accent) 60%,var(--brand-ink));
 --card:var(--brand-surface-solid);
 --card-2:color-mix(in srgb,var(--brand-ink) 9%,var(--brand-bg-solid));
 --hdr:color-mix(in srgb,var(--brand-bg-solid) 86%,transparent);
 --shadow:color-mix(in srgb,var(--brand-ink) 16%,transparent);
 --edge:color-mix(in srgb,var(--brand-accent) 45%,var(--brand-line));
 /* приглушённый текст НА ПОДВАЛЕ: подложка там светлее страницы, обычный --mut
    давал 4.18:1 в тёмной теме. Подмес основного текста чинит обе темы разом. */
 --mut-2:color-mix(in srgb,var(--brand-muted) 70%,var(--brand-ink));
 --rad:var(--brand-radius);
}
*{box-sizing:border-box}
html{scroll-behavior:smooth;background:var(--brand-bg-solid)}
body{margin:0;color:var(--fg);font:16px/var(--brand-leading) var(--brand-body);
 /* узор ПЕРВЫМ слоем, заливка вторым — так велит домашний файл */
 background-color:var(--brand-bg-solid);
 background-image:var(--brand-texture),var(--brand-bg);
 background-size:var(--brand-texture-size),auto;
 background-position:var(--brand-texture-pos),0 0;
 background-repeat:var(--brand-texture-repeat),no-repeat;
 background-attachment:fixed;
 -webkit-font-smoothing:antialiased}
img{max-width:100%;height:auto;display:block}
a{color:inherit;text-decoration:none}
h1,h2,h3,.logo,.price,.card-n,.post b,.ftr-h,.big-total{font-family:var(--brand-display)}
/* ⚠️ У Georgia цифры СТАРОСТИЛЬНЫЕ — «0» ростом со строчную букву. На снимке
   «Корзина 0» читалось как «Корзина о», а цена выглядела набором букв.
   Там, где число обязано читаться числом, ставим заголовочный шрифт:
   у Playfair цифры прописные. В тексте статьи старостильные цифры оставляем —
   там они как раз к месту. */
[data-cart-count],.ctotal,.ci-r,.specs td,.qty button,.card-p,.btn{
 font-family:var(--brand-display);
 /* ⚠️ Смены шрифта МАЛО: у Playfair Display цифры по умолчанию тоже старостильные.
    Прописные включаются признаком шрифта lnum — иначе «890 ₽» так и остаётся
    похожим на слово. Проверено снимком, а не чтением спецификации. */
 font-variant-numeric:lining-nums;font-feature-settings:"lnum" 1}
h1{font-size:clamp(30px,4.4vw,46px);line-height:1.12;margin:0 0 .45em;font-weight:600}
h2{font-size:clamp(23px,2.8vw,30px);line-height:1.22;margin:1.7em 0 .55em;font-weight:600}
h3{font-size:20px;margin:0 0 .3em;font-weight:600}
p{margin:0 0 1em}
.wrap{max-width:1180px;margin:0 auto;padding:0 20px}
.narrow{max-width:760px}
.mut{color:var(--mut)}
.sm{font-size:14px}
.lead{font-size:clamp(17px,1.6vw,19px);color:var(--mut);max-width:62ch}
.skip{position:absolute;left:-9999px}
.skip:focus{left:8px;top:8px;background:var(--card);color:var(--fg);padding:10px;z-index:99;
 border-radius:var(--rad);border:1px solid var(--line)}

.hdr{position:sticky;top:0;z-index:30;background:var(--hdr);
 backdrop-filter:blur(10px);border-bottom:1px solid var(--line)}
.hdr-in{display:flex;align-items:center;gap:22px;height:64px}
.hdr-r{display:flex;align-items:center;gap:12px;flex:0 0 auto}
.logo{font-weight:700;letter-spacing:.16em;font-size:19px}
.nav{display:flex;gap:18px;flex:1;flex-wrap:wrap}
input[type=checkbox],input[type=radio]{width:20px;height:20px;
 /* цель добираем отступом у самой метки — сам квадрат крупнее делать некрасиво */
 margin:2px 6px 2px 0;accent-color:var(--acc)}
label.rad,label.soglasie{display:flex;align-items:center;gap:8px;min-height:28px;
 padding:4px 0;cursor:pointer}
.nav a{color:var(--mut);font-size:15px;
 /* ⚠️ Цель для пальца: было 78x23 — на пиксель ниже нормы 24x24, и это ловится
    только замером (mobil_check.py), глазом такая разница неотличима. */
 display:inline-flex;align-items:center;min-height:26px}
.nav a:hover{color:var(--acc-ink)}
.cart-btn{border:1px solid var(--line);border-radius:999px;padding:7px 15px;font-size:14px;
 background:var(--card);white-space:nowrap}
.cart-btn:hover{border-color:var(--edge);color:var(--acc-ink)}

/* Кнопка темы. Цвет НЕ задаём на каждую тему: значок берёт --brand-ink, а тот
   разворачивается сам. Солнце — исключение и объяснимо: оно видно только на
   тёмной теме, поэтому берёт «текст на акценте», почти белый в обеих палитрах. */
.tema{width:34px;height:34px;flex:none;padding:0;display:inline-flex;align-items:center;
 justify-content:center;border:1px solid var(--line);border-radius:999px;
 background:color-mix(in srgb,var(--brand-ink) 4%,transparent);
 color:var(--brand-ink);cursor:pointer;transition:color .2s,border-color .2s,background .2s,transform .15s}
.tema:hover{border-color:var(--edge);background:color-mix(in srgb,var(--brand-ink) 8%,transparent)}
.tema:active{transform:scale(.94)}
.tema:focus-visible{outline:2px solid var(--acc);outline-offset:2px}
.tema svg{width:26px;height:26px;display:block}
.tema .solnce{color:var(--brand-accent-ink)}
:root[data-theme="dark"] .tema .luna{display:none}
:root[data-theme="light"] .tema .solnce{display:none}

.hero{border-bottom:1px solid var(--line)}
.hero-in{display:grid;grid-template-columns:1.05fr .95fr;gap:44px;align-items:center;
 padding:56px 20px 60px}
.hero-a{display:flex;gap:12px;flex-wrap:wrap;margin-top:26px}
.hero-im img{border-radius:var(--rad);box-shadow:0 18px 44px var(--shadow)}

.btn{display:inline-block;background:var(--acc-fill);color:var(--on-acc);padding:13px 24px;
 border-radius:999px;font-weight:600;border:0;cursor:pointer;font-size:16px;
 font-family:var(--brand-body);
 transition:transform 200ms cubic-bezier(.34,1.56,.64,1),background-color .2s}
.btn:hover{transform:scale(1.045)}
.btn:active{transform:scale(.97)}
.btn:focus-visible{outline:3px solid var(--acc);outline-offset:2px}
.btn-2{background:transparent;color:var(--fg);border:1px solid var(--line)}
.btn-2:hover{border-color:var(--edge);color:var(--acc-ink)}

.sect{padding:44px 20px}
/* «Читайте также»: ссылка обязана быть ЦЕЛЬЮ, а не строкой текста.
   ⚠️ Первая версия блока была обычным <ul><li><a> — ворота мобильной вёрстки
   тут же покраснели: 208x19 px при пороге 24. На телефоне в такую цель не
   попасть пальцем, а список ссылок в конце статьи читают именно с телефона. */
.also{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:4px}
.also li{margin:0}
.also a{display:flex;align-items:center;min-height:44px;padding:8px 12px;
  border-radius:8px;text-decoration:none}
.also a:hover{background:var(--card,rgba(127,127,127,.08))}
.crumbs{padding:12px 20px 0;font-size:14px;color:var(--mut);display:flex;gap:8px;flex-wrap:wrap;align-items:center}
/* ⚠️ Крошки — навигация, а не текст в абзаце: цель для пальца им положена как
   кнопке. Было 54x21 (mobil_check.py). */
.crumbs a,.crumbs span{display:inline-flex;align-items:center;min-height:26px}
.crumbs a:hover{color:var(--acc-ink)}

.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:20px}
.card{background:var(--card);border:1px solid var(--line);border-radius:var(--rad);
 overflow:hidden;transition:.18s}
.card:hover{transform:translateY(-3px);box-shadow:0 12px 30px var(--shadow);border-color:var(--edge)}
.card-b{padding:13px 15px 16px}
.card-l{font-size:12px;letter-spacing:.09em;text-transform:uppercase;color:var(--acc-ink)}
.card-n{margin:3px 0 7px;line-height:1.3;font-size:18px;font-weight:600}
.card-p{color:var(--mut)}

/* ролик: своя ширина, чтобы не растягивался в простыню на большом экране */
.rolik{display:block;width:100%;max-width:900px;margin:0 auto;height:auto;
  border-radius:var(--rad);background:#101013;box-shadow:0 2px 18px var(--shadow)}

.lines{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:24px;margin-top:22px}
.line img{border-radius:var(--rad);margin-bottom:14px}

.why-g{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:24px;margin-top:18px}
.why-g p{margin:.35em 0 0}

.posts{display:grid;gap:14px;margin-top:16px}
.post{display:block;background:var(--card);border:1px solid var(--line);border-radius:var(--rad);
 padding:20px 22px}
.post:hover{border-color:var(--edge)}
.post b{display:block;font-size:20px;margin-bottom:6px;font-weight:600}

.prod{display:grid;grid-template-columns:1.05fr .95fr;gap:44px;padding:26px 20px 20px;align-items:start}
.big[hidden]{display:none}
.big img{border-radius:var(--rad)}
/* ⚠️ ПЕРЕНОС ОБЯЗАТЕЛЕН. Плиток стало пять вместо двух, и подпись у них длинная
   («Терракотовый»). У flex-элемента min-width по умолчанию равен ширине
   СОДЕРЖИМОГО — ужаться ниже подписи он не может, сколько ни задавай width.
   Пять плиток держали 480 px на экране 390 и распирали всю колонку ровно
   на 150 px. Лечится не шириной, а flex-wrap + min-width:0. */
.ths{display:flex;flex-wrap:wrap;gap:10px;margin-top:12px}
.th{border:2px solid transparent;border-radius:10px;overflow:hidden;padding:0;background:none;
 cursor:pointer;width:76px;min-width:0;font-family:inherit}
.th[aria-current="true"]{border-color:var(--acc)}
.th span{display:block;font-size:12px;line-height:1.25;padding:5px 1px;
 color:var(--mut);overflow-wrap:anywhere}
.price-why{color:var(--mut);font-size:14px;line-height:1.5;margin:-4px 0 12px;max-width:46ch}
.price{font-size:32px;font-weight:700;margin:14px 0 10px;
 font-variant-numeric:lining-nums;font-feature-settings:"lnum" 1}
/* образец цвета в миниатюре товара: кружок настоящей краски.
   ⚠️ Белый образец на белой карточке исчезает — поэтому у кружка ВСЕГДА
   есть обводка, а не только когда «кажется, что нужна». */
.cveta{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:14px}
.cvet{display:block;text-decoration:none;color:inherit}
.cvet img{width:100%;height:auto;display:block;border-radius:var(--rad);
 border:1px solid var(--line);transition:transform .3s cubic-bezier(.22,.61,.36,1)}
.cvet:hover img{transform:translateY(-4px)}
.cvet-n{display:block;text-align:center;margin-top:8px;font-size:14px}
.th .obr{display:block;width:34px;height:34px;border-radius:50%;
 background:var(--obr);border:1px solid rgba(128,128,128,.45);margin:0 auto 6px}
.th{padding:9px 6px 7px}
.ln-note{display:none;background:var(--card);border:1px solid var(--line);border-radius:var(--rad);
 padding:14px 16px;margin-bottom:18px;color:var(--mut);font-size:15px}
.ln-note[data-on]{display:block}
.faq{border-bottom:1px solid var(--line);padding:12px 0}
.faq summary{cursor:pointer;font-weight:600;list-style:none}
.faq summary::-webkit-details-marker{display:none}
.faq summary::before{content:"+ ";color:var(--acc-ink)}
.faq[open] summary::before{content:"− "}
.faq p{margin:8px 0 2px;color:var(--mut)}
.specs{width:100%;border-collapse:collapse;margin-top:26px;font-size:15px}
.specs caption{text-align:left;font-weight:700;padding-bottom:8px;font-size:17px;
 font-family:var(--brand-display)}
.specs td{padding:9px 0;border-bottom:1px solid var(--line)}
.specs td:first-child{color:var(--mut);width:48%}
/* ⚠️ Таблица характеристик обязана ПЕРЕНОСИТЬ длинные значения: 06.09 в строке
   «Цвет» стало пять названий вместо трёх. Дефект пришёл из ДАННЫХ, а не из
   вёрстки — вырос текст в ячейке. table-layout:fixed держит ширину колонок. */
.specs{table-layout:fixed}
.specs td{overflow-wrap:anywhere;word-break:break-word}
@media(max-width:520px){
 .specs{font-size:14px}
 .specs td:first-child{width:42%}
}

.fld{display:block;margin-bottom:14px}
.fld span{display:block;font-size:14px;color:var(--mut);margin-bottom:5px}
/* ⚠️ Заливка поля ПЛОТНАЯ, а не полупрозрачная: родной выпадающий список
   браузер иначе открывает белым — на тёмной теме белым по белому. */
.fld input,.fld textarea,.fld select{width:100%;padding:12px 14px;border:1px solid var(--line);
 border-radius:10px;background:var(--brand-bg-solid);font:inherit;color:var(--fg)}
.fld input:focus,.fld textarea:focus{outline:2px solid var(--acc);outline-offset:1px;
 border-color:transparent}
.rad{display:flex;gap:10px;align-items:flex-start;padding:11px 0;font-size:15px}
.rad input{accent-color:var(--acc)}
.fform{max-width:560px;margin-top:22px}
.buy{margin:6px 0 4px;max-width:420px}

.citems{display:grid;gap:12px;margin:18px 0}
.ci{display:grid;grid-template-columns:74px 1fr auto;gap:14px;align-items:center;
 background:var(--card);border:1px solid var(--line);border-radius:var(--rad);padding:12px}
.ci img{border-radius:8px}
.ci-n{font-weight:600;line-height:1.3}
.ci-l{font-size:13px;color:var(--acc-ink)}
.ci-e{font-size:13px;color:var(--mut)}
.ci-r{text-align:right;white-space:nowrap}
.ci-del{background:none;border:0;color:var(--mut);cursor:pointer;font-size:13px;
 padding:2px 0;text-decoration:underline;font-family:inherit}
.qty{display:inline-flex;align-items:center;gap:8px;margin-top:4px}
.qty button{width:26px;height:26px;border:1px solid var(--line);background:var(--brand-bg-solid);
 color:var(--fg);border-radius:7px;cursor:pointer;font-size:15px;line-height:1;font-family:inherit}
.ctotal{font-size:19px;margin:14px 0 18px}
.big-total{font-size:24px;margin-top:22px}
.okbox{background:var(--card);border:1px solid var(--line);border-radius:var(--rad);padding:26px}
.empty{padding:20px 0 40px}

.art h2{margin-top:1.6em}
.art ol{padding-left:1.2em}
.art li{margin-bottom:.5em}
.steps li{margin-bottom:.7em}

.ftr{border-top:1px solid var(--line);margin-top:40px;background:var(--card-2)}
.ftr-in{display:grid;grid-template-columns:1.5fr 1fr 1fr;gap:32px;padding:36px 20px 44px}
/* ⚠️ padding:3px давал высоту 16 px — в ссылку подвала пальцем не попасть.
   Норма цели 24 px (mobil_check.py). */
.ftr-in a{display:flex;align-items:center;min-height:26px;color:var(--mut-2);font-size:15px;padding:2px 0}
.ftr-in a:hover{color:var(--acc-ink)}
.ftr-h{font-weight:700;margin-bottom:10px;font-size:18px}

/* ⚠️ Полоса для выключенного JavaScript. Отказ покупки без него МОЛЧАЛИВЫЙ:
   человек жмёт кнопку, ничего не происходит, он уходит уверенный, что сломан сайт.
   Касается не только выключивших JS нарочно — блокировщик или обрыв загрузки
   cart.js дают ровно тот же немой результат. */
.nojs{margin:14px auto;padding:12px 16px;border:1px solid var(--acc);
 border-radius:var(--rad);background:var(--card);color:var(--fg);font-size:15px}

@media(max-width:860px){
 .hero-in,.prod,.ftr-in{grid-template-columns:1fr;gap:26px}
 .hero-in{padding:34px 20px 40px}
 /* ⚠️ 01.09, замер в рамке 390 px: логотип упирался в край экрана, меню жалось
    в 105 px и рассыпалось на три строки. Две причины, обе тихие:
    1) .hdr-in и .wrap — ОДИН И ТОТ ЖЕ элемент, и padding:12px 0 стирал боковые
       отступы, которые давал .wrap;
    2) у .nav стоит flex:1, то есть flex-basis:0 — он перебивает width:100%. */
 .nav{order:3;flex:1 0 100%;width:100%;gap:14px}
 .hdr-in{height:auto;padding:12px 20px;flex-wrap:wrap}
}
/* ── ЖИВОСТЬ. Владелец 06.09: «сделать анимации — чтобы сайт как будто
   гипнотизировал на покупку». Держим удержание взгляда ДВИЖЕНИЕМ И КРАФТОМ:
   появление по прокрутке, отклик на наведение, поворотный стол товара.
   Чего здесь НЕТ и не будет: поддельных счётчиков «осталось 2 шт» и «сейчас
   смотрят 7 человек». Это не гипноз, а враньё покупателю, и на конкурсе
   Ozon такое снимает баллы, а не добавляет. */
.poyav{opacity:0;transform:translateY(18px);
 transition:opacity .62s cubic-bezier(.22,.61,.36,1),transform .62s cubic-bezier(.22,.61,.36,1)}
.poyav.vidno{opacity:1;transform:none}
.poyav.z1{transition-delay:.07s}.poyav.z2{transition-delay:.14s}
.poyav.z3{transition-delay:.21s}.poyav.z4{transition-delay:.28s}

.card{transition:transform .32s cubic-bezier(.22,.61,.36,1),box-shadow .32s ease}
.card:hover{transform:translateY(-5px)}
.card picture img{transition:transform .5s cubic-bezier(.22,.61,.36,1)}
.card:hover picture img{transform:scale(1.035)}

/* поворотный стол: одна ЛЕНТА кадров, сдвигаем background-position.
   ⚠️ image-rendering не трогаем — лента уже отрисована с суперсэмплингом,
   и «улучшение» браузером даёт мыло поверх чистых краёв. */
.stol{position:relative;width:100%;max-width:520px;margin:0 auto;aspect-ratio:1/1;
 background-repeat:no-repeat;background-size:2400% 100%;background-position:0 0;
 border-radius:14px;cursor:ew-resize;touch-action:pan-y}
.chert img{width:100%;height:auto;display:block;border-radius:12px;
 border:1px solid var(--line);background:#faf9f6}
.chert{max-width:1100px;margin:0 auto}
.stol-p{text-align:center;margin:10px 0 0;font-size:14px;letter-spacing:.02em}
.stol-p b{font-weight:600}
/* ⚠️ Запасная картинка внутри стола видна ВСЕГДА, пока JS не взял управление.
   Скрывать её заранее нельзя: без JS и на время загрузки ленты человек увидел
   бы пустой прямоугольник вместо товара. */
.stol picture{display:block;width:100%;height:100%}
.stol picture img{width:100%;height:100%;object-fit:contain}
.stol.zhiv picture{display:none}
.stol.zhiv{cursor:ew-resize}
.stol:not(.zhiv){cursor:default}

@media(prefers-reduced-motion:reduce){
 .btn,.card,.tema{transition:none}
 .btn:hover,.btn:active,.card:hover,.tema:active{transform:none}
 /* ⚠️ У кого движение выключено — он обязан видеть КОНТЕНТ, а не пустоту.
    Прячущий класс без этого правила скрыл бы половину страницы навсегда. */
 .poyav{opacity:1;transform:none;transition:none}
 .card:hover picture img{transform:none}
}
