/* ===========================================================================
   Констанція — зефір ручної роботи, Кропивницький
   Тіней немає ніде, радіус 2px лише на кнопках, роздільники — тільки
   лінія 1px кольору --line. Базові правила мобільні, ширші екрани надбудовуються.
   =========================================================================== */

/* --- Токени --------------------------------------------------------------- */
:root {
  --bg: #FBF7F2;
  --bg-deep: #241A16;
  --ink: #241A16;
  --ink-soft: rgba(36, 26, 22, 0.62);
  --accent: #BC4A37;
  --line: rgba(36, 26, 22, 0.14);

  /* ті самі ролі, вивернуті — тільки для темної секції «Про майстриню» */
  --on-deep: #FBF7F2;
  --on-deep-soft: rgba(251, 247, 242, 0.72);
  --line-deep: rgba(251, 247, 242, 0.2);

  --font-head: 'Cormorant Garamond', Georgia, 'Times New Roman', serif;
  --font-body: 'Manrope', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,
    'Helvetica Neue', Arial, sans-serif;

  /* Відступи між секціями. На десктопі дають рівно 96 / 140 / 180 / 120,
     на телефоні меншають пропорційно. */
  --g96:  clamp(56px, 10vw, 96px);
  --g140: clamp(72px, 12vw, 140px);
  --g180: clamp(88px, 15vw, 180px);
  --g120: clamp(64px, 11vw, 120px);

  --pad-x: clamp(20px, 6vw, 64px);
  --wrap: 1240px;
  --r-btn: 2px;
  --ease: cubic-bezier(0.22, 0.61, 0.36, 1);
  --t: 200ms;
}

/* --- База ----------------------------------------------------------------- */
*, *::before, *::after { box-sizing: border-box; }
/* overflow-x на документі більше не потрібен: висувні панелі стали
   position: fixed і документ не розтягують. Єдине, що виступало за край, —
   фото героя (за задумом на 40px), і його обрізає сама секція героя.
   Прибрано навмисно: clip на html малює по краю вікна й на деяких
   поєднаннях масштабу давав тонку смужку вздовж лівого краю. */
html { -webkit-text-size-adjust: 100%; }
body {
  margin: 0; background: var(--bg); color: var(--ink);
  font-family: var(--font-body); font-weight: 400;
  font-size: 17px; line-height: 1.6; -webkit-font-smoothing: antialiased;
}
img, svg, picture { max-width: 100%; display: block; }
a { color: inherit; }
ul, ol { margin: 0; padding: 0; list-style: none; }
p { margin: 0 0 1em; text-wrap: pretty; }
p:last-child { margin-bottom: 0; }
h1, h2, h3, h4 {
  font-family: var(--font-head); font-weight: 300; margin: 0;
  line-height: 1.06; letter-spacing: -0.02em; text-wrap: balance;
  overflow-wrap: break-word;
}
:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; }
::selection { background: var(--accent); color: #FBF7F2; }
/* ── Що можна виділяти мишею ───────────────────────────────────────────────
   Інтерфейс (шапка, меню, кнопки, службові підписи, крихти) не виділяється —
   інакше будь-який дотик фарбує пів сторінки. Виділяється лише те, що людина
   реально копіює: назви товарів, ціни, описи, характеристики, контакти. */
.site-header, .nav, .crumbs, .site-footer, .float, .btn, .cta, .card-order, .card-tag, .card-adult, .pill, .steps3 .n, .steps .num, .logo, .nav-toggle, .contacts dt, .facts dt, .footer-grid h2, .footer-bottom {
  -webkit-user-select: none; user-select: none;
}
h1, h2, h3, p, li, dd, dt, blockquote, .price, .card-price, .composition, .lead, .prose, .product-specs, .product-notes, .faq .answer, .contacts dd, .hero-sub {
  -webkit-user-select: text; user-select: text;
}

.wrap { width: min(100% - var(--pad-x) * 2, var(--wrap)); margin-inline: auto; }
.skip { position: absolute; left: -9999px; top: 0; z-index: 100;
  background: var(--accent); color: #FBF7F2; padding: 14px 20px; font-weight: 600; }
.skip:focus { left: 0; }

/* Фото скрізь за одним правилом: тільки cover, без рамок, тіней і радіусів.
   overflow: hidden — щоб знімок за жодних обставин не виліз за свою рамку.

   ВАЖЛИВО: після переходу на AVIF кожен знімок загорнутий у <picture>.
   Розміри треба задавати САМЕ йому, інакше <picture> лишається з авто-висотою,
   <img> усередині отримує height:100% від нічого й показує натуральну
   пропорцію — через це картки в сітці ставали різної висоти. */
figure { margin: 0; overflow: hidden; }
/* ── Рамка з фіксованою пропорцією 4:5 і знімок усередині ──────────────────
   Знімок лежить абсолютно й розтягнутий на всю рамку { position: relative; overflow: hidden; aspect-ratio: 4 / 5; }
/* Підкладка під фото: доки картинка вантажиться, рамка має читатися як
   «зараз буде фото», а не як діра у верстці. */
.card-media, .set figure, .maker-photo, .hero-shot { position: relative; overflow: hidden;
  background: color-mix(in srgb, var(--ink) 7%, var(--bg)); }
/* Це правило для посилання-обгортки навколо фото. :not(.card-order) —
   бо в тій самій рамці лежить кнопка «Обрати смаки», і без винятку вона
   розтягувалась на всю картинку. */
.card-media a:not(.card-order), .set figure a {
  display: block; height: 100%; }
/* Обгортка <picture> лягає точно по рамці. */
.card-media picture, .set figure picture, .maker-photo picture, .hero-shot picture, .pg-slide picture {
  position: absolute; inset: 0; display: block;
  width: 100%; height: 100%; max-width: none;
}
/* Сам знімок перекриває рамку на 1px з кожного боку. Висоти рамок дробові
   (412.5), і без запасу вздовж краю проступала смужка фону.
   max-width: none обов'язковий — базове правило обрізало б запас, і знімок
   не діставав би до протилежного краю. Запас застосовуємо ЛИШЕ тут,
   інакше він подвоюється через обгортку. */
/* Точка кадру для героя: за замовчуванням центр, окремі сторінки
   зсувають її через --focus, щоб кадр не різав обличчя. */
.hero-shot img { object-position: center var(--focus, 50%); }
.card-media img, .set figure img, .maker-photo img, .hero-shot img, .pg-slide img {
  position: absolute; display: block; object-fit: cover;
  /* Цілий піксель, а не половина: при щільності 1.25–1.5 половина CSS-пікселя
     дає дробовий пристроєвий і згладжується в помітну смужку. */
  top: -1px; left: -1px;
  width: calc(100% + 2px); height: calc(100% + 2px);
  max-width: none;
}

/* --- Кнопка --------------------------------------------------------------- */
.cta, .btn {
  display: inline-block; text-align: center; text-decoration: none;
  font-family: var(--font-body); font-weight: 600; font-size: 16px;
  text-transform: uppercase; letter-spacing: 0.06em;
  background: var(--accent); color: #FBF7F2;
  padding: 18px 34px; border: 1px solid var(--accent); border-radius: var(--r-btn);
  cursor: pointer; box-shadow: none;
  transition: background-color var(--t) var(--ease), border-color var(--t) var(--ease),
    color var(--t) var(--ease);
}
.cta:hover, .btn:hover { background: #A33C2B; border-color: #A33C2B; }
.cta:active, .btn:active { background: #8A3122; border-color: #8A3122; }
.btn-ghost { background: transparent; color: var(--ink); border-color: var(--line); }
.btn-ghost:hover { background: transparent; border-color: var(--ink); color: var(--ink); }
.btn-sm { padding: 12px 20px; font-size: 14px; }
.btn[disabled], .btn[aria-disabled='true'] { opacity: 0.4; pointer-events: none; }
svg.arw { display: none; }

/* --- Шапка ---------------------------------------------------------------- */
.site-header { position: sticky; top: 0; z-index: 60;
  background: var(--bg); border-bottom: 1px solid var(--line); }
.header-in { display: flex; align-items: center; gap: 12px;
  min-height: 66px; padding-block: 10px; }
.logo { display: flex; align-items: center; gap: 12px; text-decoration: none;
  margin-right: auto; min-width: 0; }
/* Аватарка власниці. Коло тут навмисне: це портрет, а не картка товару. */
.logo-mark { width: 44px; height: 44px; flex: none; display: block;
  border-radius: 50%; overflow: hidden; position: relative; }
.logo-mark img { width: 100%; height: 100%; object-fit: cover; display: block; }
.logo > span { min-width: 0; }
.logo-name { display: block; font-family: var(--font-head); font-weight: 500;
  font-size: 21px; line-height: 1; letter-spacing: -0.01em; }
.logo-sub { display: block; margin-top: 5px; font-size: 11px; line-height: 1;
  letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-soft);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.header-cta { display: none; }
.nav-toggle { display: inline-flex; align-items: center; justify-content: center;
  width: 44px; height: 44px; flex: none; padding: 0; cursor: pointer;
  background: transparent; border: 1px solid var(--line); border-radius: 0;
  position: relative; z-index: 86; }
.nav-toggle span, .nav-toggle span::before, .nav-toggle span::after {
  content: ''; display: block; width: 18px; height: 1px; background: var(--ink);
  transition: transform var(--t) var(--ease), opacity 120ms linear; }
.nav-toggle span::before { position: relative; top: -6px; }
.nav-toggle span::after { position: relative; top: 5px; }
.nav-toggle[aria-expanded='true'] span { background: transparent; }
.nav-toggle[aria-expanded='true'] span::before { transform: translateY(6px) rotate(45deg); }
.nav-toggle[aria-expanded='true'] span::after { transform: translateY(-5px) rotate(-45deg); }

/* --- Меню: панель справа -------------------------------------------------- */
/* Панель займає рівно половину екрана й не більше 340px на широких. */
.nav { position: fixed; top: 0; right: 0; z-index: 85;
  width: 50%; max-width: 340px; height: 100dvh; overflow-y: auto;
  background: var(--bg); border-left: 1px solid var(--line);
  padding-top: 66px; transform: translateX(100%);
  transition: transform 260ms var(--ease); }
.nav[data-open='true'] { transform: none; }
.nav ul { display: flex; flex-direction: column;
  padding: 8px clamp(14px, 4vw, 28px) 32px; }
.nav a { white-space: nowrap; }
.nav li + li { border-top: 1px solid var(--line); }
.nav a { display: block; padding: 16px 0; text-decoration: none; font-size: 16px; }
.nav a[aria-current='page'] { font-weight: 600; }
  font: inherit; font-size: 16px; color: var(--ink); text-align: left; }
.nav-backdrop { position: fixed; inset: 0; z-index: 50; background: transparent; }
.nav-backdrop[hidden] { display: none; }

/* ===========================================================================
   1 ── HERO
   =========================================================================== */
.hero { position: relative; background: var(--bg);
  display: flex; flex-direction: column; overflow-x: clip;
  min-height: 92vh; padding-bottom: clamp(40px, 10vw, 72px); }
/* Телефон: фото зверху, текст під ним.
   Висота обмежена, щоб заголовок і кнопка були видні одразу, без прокрутки —
   інакше кадр 4:5 на всю ширину займає весь перший екран. */
.hero-shot { order: -1; width: 100%; aspect-ratio: 4 / 5; max-height: 46vh; }
.hero-copy { padding: clamp(22px, 5vw, 40px) var(--pad-x) 0;
  display: flex; flex-direction: column; align-items: flex-start; }
/* Розмір прив'язаний до ширини колонки, а не всього вікна: у колонці 42%
   значення 7vw давало 104px і заголовок ламався на пʼять рядків замість трьох.
   Стеля 104px і решта метрик — без змін. */
.hero h1 { font-family: var(--font-head); font-weight: 300;
  /* Нижня межа теж залежить від ширини: на екранах вужчих за ~300px
     фіксовані 44px разом із nowrap виштовхували рядок за край вікна. */
  font-size: clamp(min(44px, 13vw), 5.4vw, 104px);
  line-height: 1.02; letter-spacing: -0.02em;
  color: var(--ink); margin: 0; text-wrap: nowrap; }
.hero h1 span { display: block; }
.hero-sub { font-family: var(--font-body); font-weight: 400; font-size: 18px;
  line-height: 1.5; max-width: 44ch; color: var(--ink-soft); margin: 20px 0 0; }
.hero .cta { margin-top: 26px; width: 100%; }

/* ===========================================================================
   Секції головної. Відступ згори задає --gap, свій для кожної.
   =========================================================================== */
/* Кожна секція малює власний непрозорий фон. Межі секцій часто лягають на
   дробовий піксель (напр. 1075.68), і без цього на стику лишалася волосяна
   смужка фону сусіда — саме її було видно під темною секцією. */
.s { margin-top: var(--gap, var(--g96)); background: var(--bg); }
.s-head { margin-bottom: clamp(26px, 5vw, 44px); }
.s-head h2 { font-family: var(--font-head); font-weight: 300;
  font-size: clamp(32px, 5.5vw, 60px); line-height: 1.04; letter-spacing: -0.02em; }
/* Ліній навколо карток немає: фото лежать просто на тлі сторінки й
   відділені повітрям, а не рамками. Заодно зникає й привід для волосяних
   смужок на дробових межах — малювати на стику більше нічого. */
/* Усі картки однакові, усі фото рівно 4:5 — і на телефоні, і на десктопі.
   Жодних збільшених плиток: інакше велика клітинка неминуче дає іншу
   пропорцію знімка { display: flex; flex-direction: column; }

/* ── 3. Набори і подарунки ────────────────────────────────────────────────── */
.sets { display: grid; gap: clamp(26px, 5vw, 48px); }
.set { display: flex; }
.set a { display: flex; flex-direction: column; width: 100%; text-decoration: none; }
.set figure { aspect-ratio: 4 / 5; margin-bottom: 18px; flex: none; }
.set h3 { font-family: var(--font-head); font-weight: 500; font-size: 27px;
  line-height: 1.1; }
.set .price { margin: 8px 0 0; font-family: var(--font-body);
  font-weight: 600; font-size: 17px; color: var(--accent); }
.set .composition { margin: 10px 0 0; font-size: 15px;
  line-height: 1.5; color: var(--ink-soft); max-width: 42ch; }
.set a:hover h3 { color: var(--accent); }

/* ── 4. Як замовити ───────────────────────────────────────────────────────── */
.steps3 { display: grid; border-top: 1px solid var(--line); }
.steps3 li { padding: 22px 0; border-bottom: 1px solid var(--line); }
.steps3 .n { display: block; font-family: var(--font-body); font-weight: 600;
  font-size: 12px; letter-spacing: 0.14em; color: var(--accent); margin-bottom: 10px; }
.steps3 h3 { font-family: var(--font-head); font-weight: 500; font-size: 26px;
  line-height: 1.1; margin-bottom: 8px; }
.steps3 p { margin: 0; color: var(--ink-soft); font-size: 16px; max-width: 52ch; }
.facts { margin: 26px 0 0; display: grid; }
.facts > div { display: flex; flex-wrap: wrap; gap: 4px 20px;
  justify-content: space-between; align-items: baseline;
  padding: 14px 0; border-bottom: 1px solid var(--line); }
.facts > div:first-child { border-top: 1px solid var(--line); }
.facts dt { font-size: 15px; color: var(--ink-soft); }
.facts dd { margin: 0; font-size: 16px; font-weight: 600; text-align: right; }

/* ── 5. Про майстриню — єдина темна секція на сайті ───────────────────────── */
.s-dark { background: var(--bg-deep); color: var(--on-deep);
  padding-block: clamp(56px, 12vw, 104px); }
.maker { display: grid; gap: clamp(26px, 6vw, 56px); }
.maker-photo { aspect-ratio: 4 / 5; }
.maker-text h2 { font-family: var(--font-head); font-weight: 300;
  font-size: clamp(32px, 5.5vw, 60px); line-height: 1.04; color: var(--on-deep);
  margin-bottom: 20px; }
.maker-text p { color: var(--on-deep-soft); max-width: 56ch; }

/* ── 7. Контакти ──────────────────────────────────────────────────────────── */
.contacts { margin: 0; display: grid; border-top: 1px solid var(--line); }
.contacts > div { display: flex; flex-wrap: wrap; gap: 4px 24px;
  justify-content: space-between; align-items: baseline;
  padding: 18px 0; border-bottom: 1px solid var(--line); }
.contacts dt { font-size: 13px; letter-spacing: 0.14em; text-transform: uppercase;
  color: var(--ink-soft); }
.contacts dd { margin: 0; font-family: var(--font-head); font-weight: 500;
  font-size: 24px; line-height: 1.1; }
.contacts dd a { text-decoration: none; border-bottom: 1px solid var(--line); }
.contacts dd a:hover { color: var(--accent); border-bottom-color: var(--accent); }

/* ===========================================================================
   Внутрішні сторінки
   =========================================================================== */
.section { padding-block: clamp(44px, 9vw, 84px); }
.section + .section { padding-top: 0; }
.section-alt { border-top: 1px solid var(--line); }
.crumbs + main > .section:first-child { padding-top: clamp(20px, 4vw, 32px); }
/* Перший заголовок сторінки стоїть одразу під крихтами, без зайвого запасу. */
.section-head-first { margin-bottom: clamp(18px, 3.5vw, 30px); }
.section-head-first .t-title { margin-top: 0; }
.section-head { margin-bottom: clamp(24px, 5vw, 42px); }
/* Центрований варіант — використовує каталог для «Усі товари». */
.section-head.center { text-align: center; }
.section-head.center .lead { margin-inline: auto; }
/* Друга секція поспіль не потребує великого розриву згори. */
.section + .section .section-head { margin-top: 0; }
.section-head h1, .section-head h2 { font-family: var(--font-head); font-weight: 300;
  font-size: clamp(26px, 5.4vw, 58px); line-height: 1.06; }
.t-display { font-size: clamp(38px, 7vw, 76px); line-height: 1.02;
  letter-spacing: -0.02em; font-weight: 300; }
/* Заголовок відчутніше реагує на екран: на телефоні менший, щоб лягав
   в один рядок, на ноуті більший. Межі підібрані так, щоб рядків було
   рівно один або два — перевірено від 260 до 1920. */
.t-title { font-size: clamp(26px, 5.4vw, 58px); }
.pill { display: block; margin: 0 0 14px; font-size: 12px; font-weight: 600;
  letter-spacing: 0.14em; text-transform: uppercase; color: var(--accent);
  font-family: var(--font-body); }
.pill svg { display: none; }
.lead { color: var(--ink-soft); font-size: 18px; max-width: 46ch; }
.accent { display: block; }
.prose { max-width: 66ch; color: var(--ink-soft); }
.prose strong { color: var(--ink); font-weight: 600; }
.prose ul { margin: 16px 0; }
.prose li { position: relative; padding-left: 20px; margin-bottom: 8px; }
.prose li::before { content: ''; position: absolute; left: 0;
  top: 0.7em; width: 8px; height: 1px; background: var(--accent); }

.crumbs ol { display: flex; flex-wrap: wrap; gap: 8px; padding-top: 16px;
  font-size: 13px; color: var(--ink-soft); }
.crumbs a { color: var(--ink-soft); text-decoration: none;
  display: inline-block; padding-block: 4px; }
.crumbs a:hover { color: var(--ink); }
.crumbs li + li::before { content: '/'; margin-right: 8px; }

.cards { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: clamp(18px, 4vw, 36px); }
.card { display: flex; flex-direction: column; border: 0; box-shadow: none; }
.card-media { position: relative; aspect-ratio: 4 / 5; }
.card-body { padding: 14px 0 0; display: flex; flex-direction: column; flex: 1; }
.card-top { display: block; }
.card h3, .card h2 { font-family: var(--font-head); font-weight: 500; font-size: 21px;
  line-height: 1.15; letter-spacing: -0.01em; }
.card h3 a, .card h2 a { text-decoration: none; }
.card h3 a:hover, .card h2 a:hover { color: var(--accent); }
.card-price { display: block; margin: 6px 0 0; font-weight: 600; font-size: 15px;
  color: var(--accent); white-space: nowrap; }
.card p { margin: 8px 0 0; font-size: 15px; line-height: 1.5; color: var(--ink-soft); }
.card-tag { margin-top: auto; padding-top: 14px; font-size: 11px; font-weight: 600;
  letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-soft); }
/* Кнопка «Замовити» на картці — це посилання: рядковому <a> вертикальні
   відступи висоти не дають, тому inline-flex. nowrap — щоб напис
   не ламався на два рядки у вузькій картці. */
.card-order { position: absolute; left: 0; bottom: 0; z-index: 2;
  display: inline-flex; align-items: center; white-space: nowrap;
  background: var(--accent); color: #FBF7F2; border: 0; border-radius: 0;
  font: inherit; font-size: 12px; font-weight: 600; letter-spacing: 0.06em; line-height: 1.2;
  text-transform: uppercase; padding: 10px 14px; cursor: pointer; text-decoration: none; }
.card-adult { position: absolute; right: 0; top: 0; z-index: 2; background: var(--bg);
  color: var(--ink); border: 1px solid var(--line); font-size: 11px; font-weight: 600;
  padding: 4px 8px; }
.cards-more { display: flex; margin-top: 26px; }

.product { display: grid; gap: clamp(24px, 6vw, 56px); align-items: start; }
/* Розміри задаємо і <picture>, і <img>: інакше обгортка лишається з
   авто-висотою й мініатюра розтягується на натуральний розмір знімка. */
.product-info h1 { font-family: var(--font-head); font-weight: 300;
  font-size: clamp(30px, 5vw, 52px); line-height: 1.04; margin-bottom: 12px; }
.product-short { color: var(--ink-soft); margin-bottom: 14px; }
.product-price { display: flex; align-items: baseline; gap: 10px; margin: 0 0 16px; }
.product-price b { font-family: var(--font-head); font-weight: 500;
  font-size: clamp(30px, 5vw, 44px); color: var(--accent);
  /* Без цього великий шрифт тягне за собою міжрядковий 1.6 від body —
     навколо цифр лишається порожній рядок майже на 30px, і кнопка
     «Замовити» їде вниз. */
  line-height: 1.05; }
.product-price span { color: var(--ink-soft); font-size: 15px; }
.product-buy { display: flex; flex-wrap: wrap; gap: 12px; align-items: stretch;
  padding-bottom: 18px; margin-bottom: 18px; border-bottom: 1px solid var(--line); }
.product-buy .btn { flex: 1 1 12rem; }
/* ── Вибір смаків на товарі ─────────────────────────────────────────────── */
.pick { margin: 0 0 22px; padding-bottom: 22px; border-bottom: 1px solid var(--line); }
.pick-head { display: flex; justify-content: space-between; align-items: baseline;
  gap: 16px; margin: 0 0 12px; }
.pick-label { font-size: 15px; color: var(--ink-soft); }
.pick-grid { display: flex; flex-wrap: wrap; gap: 8px;
  list-style: none; margin: 0; padding: 0; }
.pick .chip { font-size: 14px; padding: 8px 12px; }
/* Кнопка лишається на місці, але видно, що вона поки не працює.
   Не прозорість: приглушений акцент читався б як рожевий, а рожевого
   в цій палітрі немає. Тому нейтральний контур. */
.btn[disabled], .btn-primary[disabled] {
  background: transparent; color: var(--ink-soft);
  border-color: var(--line); cursor: not-allowed; }
.btn[disabled]:hover { background: transparent; border-color: var(--line); }
.product-lead-time { margin: 0 0 22px; padding: 14px 16px; font-size: 15px;
  line-height: 1.45; color: var(--ink); background: var(--bg);
  border: 1px solid var(--line); border-left: 2px solid var(--accent); border-radius: 2px; }

/* ── Смуга переваг під героєм ────────────────────────────────────────── */
.usp-band { padding-block: clamp(28px, 5vw, 44px); border-bottom: 1px solid var(--line); }
.usp { list-style: none; margin: 0; padding: 0; display: grid;
  gap: clamp(20px, 4vw, 40px); }
.usp li { display: flex; flex-direction: column; gap: 6px; }
.usp b { font-family: var(--font-head); font-weight: 500; font-size: clamp(24px, 4vw, 32px);
  line-height: 1.1; color: var(--accent); }
.usp span { font-size: 15px; color: var(--ink-soft); line-height: 1.45; }
@media (min-width: 700px) {
  .usp { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  /* Тонкі розділові лінії між колонками — у системі немає карток і тіней,
     тому межа саме лінією. */
  .usp li + li { padding-left: clamp(20px, 4vw, 40px); border-left: 1px solid var(--line); }}

/* ── Поява тексту ───────────────────────────────────────────────────────
   Працює тільки коли скрипт додав .js-rise на <html>. Без скрипта правило
   не спрацьовує взагалі, і сторінка лишається видимою — це важливіше
   за анімацію. Рух короткий і в один бік: сайт про зефір, а не про ефекти. */
.js-rise .rise { opacity: 0; transform: translateY(10px);
  transition: opacity .5s var(--ease), transform .5s var(--ease);
  transition-delay: var(--rise-delay, 0ms); }
.js-rise .rise.is-in { opacity: 1; transform: none; }
/* Аварійний показ: жодного переходу, значення застосовується миттєво. */
.js-rise .rise.rise-now { opacity: 1 !important; transform: none !important;
  transition: none !important; }
@media (prefers-reduced-motion: reduce) {
  .js-rise .rise { opacity: 1; transform: none; transition: none; }}

.product-specs { display: grid; margin: 0 0 22px; border-top: 1px solid var(--line); }
.product-specs > div { display: flex; justify-content: space-between; gap: 16px;
  align-items: baseline; padding: 12px 0; border-bottom: 1px solid var(--line); }
.product-specs dt { color: var(--ink-soft); font-size: 15px; }
.product-specs dd { margin: 0; font-size: 15px; text-align: right; }
.product-text { margin-bottom: 20px; }
.product-text a { color: var(--accent); text-decoration: underline;
  text-underline-offset: 3px; }
.product-notes { display: grid; gap: 8px; font-size: 15px; color: var(--ink-soft); }
.product-notes li { position: relative; padding-left: 20px; }
.product-notes li::before { content: ''; position: absolute; left: 0; top: 0.7em;
  width: 8px; height: 1px; background: var(--accent); }
.adult-note { display: flex; gap: 10px; margin-top: 18px; padding: 14px;
  border: 1px solid var(--line); font-size: 15px; color: var(--ink-soft); }
.adult-note b { color: var(--ink); flex: none; }) перебиває його за
   специфічністю, і схований блок лишається на екрані. */
[hidden] { display: none !important; }
/* ── Оформлення замовлення ──────────────────────────────────────────────
   Десктоп: форма 58%, підсумок 42% і липкий. Телефон: одна колонка
   й панель із сумою { display: grid; gap: clamp(32px, 5vw, 56px); align-items: start; margin-top: 8px; }
/* Поля: підпис зверху, висота 52px, шрифт 16px { margin-bottom: 20px; }
/* Фокус — темна рамка у 2px { border-color: var(--ink); outline: 1px solid var(--ink); outline-offset: -2px; }
/* Спосіб доставки. Рядок на всю ширину, квадратна позначка — у системі
   немає круглих форм { display: grid; gap: 10px; margin-bottom: 20px; }
/* ── Готове замовлення ───────────────────────────────────────────────────
   Екран після кнопки. Живе на тій самій сторінці: окрема сторінка тут
   нічого не додала б, а текст замовлення краще тримати поруч із формою { max-width: 680px; }

.chip { font-size: 15px; color: var(--ink); background: transparent;
  border: 1px solid var(--line); padding: 9px 14px; }
/* Перелік смаків — це <li>, він статичний. А фільтри каталогу — <button>,
   і їм потрібні і курсор, і відгук на наведення. */
button.chip { font: inherit; font-size: 15px; cursor: pointer;
  transition: border-color var(--t) var(--ease),
    background-color var(--t) var(--ease), color var(--t) var(--ease); }
button.chip:hover { border-color: var(--ink); }

.faq { max-width: 800px; }
.faq details { border-bottom: 1px solid var(--line); }
.faq details:first-of-type { border-top: 1px solid var(--line); }
.faq summary { cursor: pointer; list-style: none; padding: 18px 40px 18px 0;
  font-weight: 600; font-size: 16px; position: relative; }
.faq summary::-webkit-details-marker { display: none; }
.faq summary::after { content: ''; position: absolute; right: 6px; top: 50%;
  width: 9px; height: 9px; border-right: 1px solid var(--accent);
  border-bottom: 1px solid var(--accent); transform: translateY(-70%) rotate(45deg);
  transition: transform var(--t) var(--ease); }
.faq details[open] summary::after { transform: translateY(-25%) rotate(-135deg); }
.faq .answer { padding: 0 0 18px; color: var(--ink-soft); font-size: 16px; max-width: 60ch; }

.cta-band { border: 1px solid var(--line); padding: clamp(26px, 6vw, 52px); }
.cta-band h2 { font-family: var(--font-head); font-weight: 300;
  font-size: clamp(28px, 4.5vw, 46px); margin-bottom: 14px; }
.cta-band .lead { margin-bottom: 24px; }
.cta-actions { display: flex; flex-wrap: wrap; gap: 12px; }
.cta-actions .btn { flex: 1 1 100%; }
.steps { display: grid; border-top: 1px solid var(--line); }
.steps li { padding: 20px 0; border-bottom: 1px solid var(--line); }
.steps .num { display: block; font-weight: 600; font-size: 12px; letter-spacing: 0.14em;
  color: var(--accent); margin-bottom: 8px; }
.steps h3 { font-family: var(--font-head); font-weight: 500; font-size: 24px;
  margin-bottom: 6px; }
.steps p { color: var(--ink-soft); font-size: 15px; }

.err { padding-block: clamp(64px, 14vw, 120px); }
.err .num { font-family: var(--font-head); font-weight: 300;
  font-size: clamp(72px, 18vw, 140px); line-height: 1; color: var(--accent); }
.err .lead { margin: 16px 0 26px; }
/* ── Однакова висота карток незалежно від довжини тексту ────────────────────
   Назва і опис займають фіксовану кількість рядків: коротший текст
   добирає висоту, довший — обрізається трьома крапками. Через це всі
   картки в сітці однакові, а фото стоять на одній лінії на будь-якій ширині. */
.card h3, .card h2, .set h3 { display: -webkit-box; -webkit-box-orient: vertical;
  overflow: hidden; }
/* Рівно два рядки: коротка назва добирає висоту, довга обрізається.
   Без цього резерву ціна й опис у сусідніх картках стоять на різній
   висоті — саме це й читалося як «різна довжина тексту». */
.card h3, .card h2, .set h3 { -webkit-line-clamp: 2;
  min-height: calc(2em * 1.15); }
/* Опис теж рівно два рядки. Інакше на широкому екрані короткий опис
   лягає в один рядок, а сусідній — у два, і текстові блоки сусідніх
   карток виходять різної довжини. */
.card p, .set .composition { display: -webkit-box; -webkit-box-orient: vertical;
  -webkit-line-clamp: 2; overflow: hidden; min-height: calc(2em * 1.5); }

/* ── Панель каталогу: розділи + сортування за ціною ─────────────────────── */
.shop-bar { display: flex; flex-wrap: wrap; align-items: center;
  gap: 12px 20px; justify-content: space-between; margin-bottom: 22px;
  padding-bottom: 18px; border-bottom: 1px solid var(--line); }
.shop-cats { display: flex; flex-wrap: wrap; gap: 8px; min-width: 0; }
/* flex-grow на чипі вирівнює довжину рядів: вільне місце ряду ділиться між
   його чипами, тож кожен ряд дорівнює ширині панелі. Там, де всі чипи
   влазять в один ряд, вільного місця немає — вигляд лишається як був. */
.shop-cats .chip { flex: 1 1 auto; min-width: 0; text-align: center;
  white-space: nowrap; }
.shop-cats .chip[aria-pressed='true'], .shop-cats .chip.is-on {
  background: var(--accent); border-color: var(--accent); color: #FBF7F2; font-weight: 600; }
.shop-sort { display: flex; align-items: center; gap: 10px; font-size: 15px;
  color: var(--ink-soft); }
.shop-sort select { font: inherit; font-size: 15px; color: var(--ink);
  background: transparent; border: 1px solid var(--line); border-radius: 0;
  padding: 9px 12px; cursor: pointer; max-width: 100%; min-width: 0; }
.shop-sort select:focus { outline: 2px solid var(--accent); outline-offset: 1px; }
.shop-empty { margin: 24px 0 0; color: var(--ink-soft); }
.shop-empty[hidden] { display: none; }
.card[hidden] { display: none; }

/* ── Гортання фото товару ────────────────────────────────────────────────
   Стрічка кадрів із прокруткою пальцем і прилипанням до кадру.
   Мініатюри лишаються як другий спосіб перемикання. */
.pg-track { display: flex; overflow-x: auto; scroll-snap-type: x mandatory;
  scrollbar-width: none; -webkit-overflow-scrolling: touch; }
.pg-track::-webkit-scrollbar { display: none; }
.pg-slide { flex: 0 0 100%; scroll-snap-align: center; position: relative;
  aspect-ratio: 4 / 5; overflow: hidden; }
/* Кадр — це кнопка: натиск відкриває фото на весь екран. */
.product-gallery { position: relative; }
.pg-open { display: block; padding: 0; border: 0; background: transparent;
  cursor: zoom-in; position: absolute; inset: 0; width: 100%; height: 100%; }

/* Стрілки: ледь помітні, але завжди видні поверх знімка. */
.pg-arrow { position: absolute; top: 50%; transform: translateY(-50%); z-index: 3;
  width: 42px; height: 42px; display: grid; place-items: center; cursor: pointer;
  border: 0; border-radius: 50%; padding: 0;
  background: rgba(251, 247, 242, 0.28); color: var(--ink);
  -webkit-backdrop-filter: none; backdrop-filter: none;
  transition: background-color var(--t) var(--ease), opacity var(--t) var(--ease); }
.pg-arrow svg { width: 20px; height: 20px; }
.pg-arrow:hover { background: rgba(251, 247, 242, 0.75); }
.pg-arrow[disabled] { opacity: 0.25; pointer-events: none; }
.pg-prev { left: 10px; }
.pg-next { right: 10px; }

.pg-dots { display: flex; gap: 0; justify-content: center; margin-top: 6px; }
/* Кнопка 24×24 — стільки вимагає WCAG для цілі дотику. Видима крапка
   всередині лишається дрібною: збільшуємо площу натискання, не вигляд. */
.pg-dot { width: 24px; height: 24px; padding: 0; border: 0; background: none;
  display: flex; align-items: center; justify-content: center; cursor: pointer; }
.pg-dot::before { content: ''; width: 7px; height: 7px; border-radius: 50%;
  border: 1px solid var(--line-2, var(--line)); background: transparent;
  transition: background-color var(--t) var(--ease), border-color var(--t) var(--ease); }
.pg-dot.is-on::before { background: var(--accent); border-color: var(--accent); }

@media (max-width: 619px) {
  /* На телефоні панель компактніша: розділів пʼять, і в повний розмір
     вони з'їдають пів екрана ще до першого товару. */
  .shop-bar { gap: 8px; margin-bottom: 16px; padding-bottom: 14px; }
  .shop-cats { gap: 6px; }
  .shop-cats .chip { font-size: 13px; padding: 6px 10px; }
  .shop-sort { width: 100%; flex-wrap: wrap; gap: 8px; font-size: 14px; }
  .shop-sort select { font-size: 14px; padding: 7px 10px; }
  /* min-width: 0 обов'язковий: без нього поле не стискається нижче
     власного вмісту й вилазить за екран на вузьких телефонах. */
  .shop-sort select { flex: 1 1 auto; min-width: 0; max-width: 100%; }}

/* Нижче 500px усі пʼять чипів в один ряд не вміщаються (заміряно: до 490px
   рядів два, від 500px — один). Там, де перенос неминучий, розкладаємо
   свідомо: «Усі» займає весь верхній ряд, решта йдуть по два.
   Так широкий елемент стоїть зверху, а не звисає останнім рядком,
   і всі ряди лишаються однакової довжини. */
@media (max-width: 499px) {
  .shop-cats .chip:first-child { flex: 1 1 100%; }
  .shop-cats .chip:not(:first-child) { flex: 1 1 calc(50% - 3px); }
}

/* ── Перегляд фото на весь екран ────────────────────────────────────────── */
.pg-viewer { position: fixed; inset: 0; z-index: 95; background: var(--bg-deep);
  display: flex; flex-direction: column; }
.pg-viewer[hidden] { display: none; }
.pg-close { position: absolute; top: 14px; right: 14px; z-index: 4;
  width: 44px; height: 44px; display: grid; place-items: center; cursor: pointer;
  background: rgba(251, 247, 242, 0.18); color: var(--on-deep);
  border: 0; border-radius: 50%; padding: 0; }
.pg-close:hover { background: rgba(251, 247, 242, 0.4); }
.pg-close svg { width: 20px; height: 20px; }
.pgv-track { flex: 1; display: flex; overflow-x: auto; scroll-snap-type: x mandatory;
  scrollbar-width: none; -webkit-overflow-scrolling: touch; min-height: 0; }
.pgv-track::-webkit-scrollbar { display: none; }
.pgv-slide { flex: 0 0 100%; scroll-snap-align: center; position: relative; min-height: 0; }
.pgv-slide picture, .pgv-slide img { position: absolute; inset: 0; display: block;
  width: 100%; height: 100%; object-fit: contain; }
.pgv-prev { left: 10px; } .pgv-next { right: 10px; }
.pg-viewer .pg-arrow { background: rgba(251, 247, 242, 0.18); color: var(--on-deep); }
.pg-viewer .pg-arrow:hover { background: rgba(251, 247, 242, 0.4); }
/* Мініатюри — саме тут, унизу переглядача, а не під товаром. */
.pgv-thumbs { flex: none; display: flex; gap: 6px; justify-content: center;
  flex-wrap: wrap; padding: 14px var(--pad-x) calc(14px + env(safe-area-inset-bottom));
  border-top: 1px solid var(--line-deep); }
.pgv-thumb { width: 56px; height: 70px; flex: none; padding: 0; border: 0; border-radius: 0;
  background: transparent; cursor: pointer; opacity: 0.45; position: relative; overflow: hidden;
  transition: opacity var(--t) var(--ease); }
.pgv-thumb picture, .pgv-thumb img { position: absolute; inset: 0; display: block;
  width: 100%; height: 100%; object-fit: cover; }
.pgv-thumb.is-on, .pgv-thumb:hover { opacity: 1; }

/* --- Підвал --------------------------------------------------------------- */
.site-footer { margin-top: var(--g96); border-top: 1px solid var(--line);
  padding-block: clamp(40px, 8vw, 64px) 20px; }
.footer-grid { display: grid; gap: 30px; }
.footer-grid h2 { font-family: var(--font-body); font-size: 12px; font-weight: 600;
  letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-soft);
  margin-bottom: 14px; }
.footer-grid li { margin-bottom: 2px; }
/* Вертикальний відступ піднімає ціль дотику до 24px, не розсуваючи список:
   на нього ж пішов зменшений margin сусіднього правила. */
.footer-grid a { text-decoration: none; font-size: 16px;
  display: inline-block; padding-block: 5px; }
.footer-grid a:hover { color: var(--accent); }
.footer-grid p { color: var(--ink-soft); font-size: 15px; }
.footer-bottom { margin-top: 30px; padding-top: 18px; border-top: 1px solid var(--line);
  display: flex; flex-wrap: wrap; gap: 8px 24px; justify-content: space-between;
  color: var(--ink-soft); font-size: 13px; }

/* --- Плаваючі кнопки ------------------------------------------------------ */
.float { position: fixed; right: 16px; bottom: 16px; z-index: 40;
  display: flex; flex-direction: column; gap: 10px; }
.float a, .float button { position: relative; width: 48px; height: 48px;
  display: grid; place-items: center; border: 1px solid var(--line); border-radius: 0;
  cursor: pointer; background: var(--bg); color: var(--ink); text-decoration: none;
  box-shadow: none; transition: background-color var(--t) var(--ease); }
.float svg { width: 20px; height: 20px; }
.fab-top { opacity: 0; pointer-events: none; }
.fab-top[data-show='true'] { opacity: 1; pointer-events: auto; }

/* ===========================================================================
   Ширші екрани
   =========================================================================== */
@media (min-width: 620px) {
  .hero .cta { width: auto; }
  .cta-actions .btn { flex: 0 0 auto; }
  .cards { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .steps li, .steps3 li { padding-inline: 16px; }
  .footer-grid { grid-template-columns: repeat(auto-fit, minmax(min(100%, 190px), 1fr)); }
  .steps3 { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 1px;
    background: var(--line); border-bottom: 1px solid var(--line); }
  .steps3 li { background: var(--bg); border-bottom: 0; padding-block: 24px; }
}

@media (min-width: 700px) {
  /* Hero: фото на всю ширину, текст лежить поверх нього.
     До цього фото займало 92vh окремою колонкою — людина бачила красиву
     картинку і жодного слова про те, що це за сайт. Половина екрана —
     стеля: під шапкою одразу видно, що сторінка продовжується. */
  .hero { display: block; height: 50vh; min-height: 300px;
    padding-bottom: 0; overflow-x: clip; overflow-y: visible; }
  /* max-height знімаємо: обмеження 46vh потрібне лише телефону, де фото зверху. */
  .hero-shot { position: absolute; inset: 0; width: 100%; height: 100%;
    aspect-ratio: auto; max-height: none; order: 0; }
  /* Заливка зліва — щоб текст читався на будь-якому кадрі, хоч світлому,
     хоч темному. Колір береться з теми, тож у темному режимі вона теж своя. */
  .hero-shot::after { content: ''; position: absolute; inset: 0; z-index: 1;
    background: linear-gradient(95deg, var(--bg) 0 34%, transparent 74%); }
  .hero-copy { position: relative; z-index: 2; width: min(50%, 600px); height: 100%;
    padding: 24px 32px 24px var(--pad-x); justify-content: center; }
  /* Підпис тримаємо в межах щільної частини заливки: довший рядок виїжджав
     на пелюстки, де світлий текст на світлому фоні вже не читався. */
  .hero-sub { max-width: 34ch; }
  .hero .cta { margin-top: 32px; }

  /* Товар у дві колонки вже з планшета. Доти фото займало всю ширину
     (на 768px це 885px висоти) і кнопка «Замовити» опинялася
     аж під ним. Співвідношення фото 4:5 лишається незмінним. */
  .product { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }}

/* Низький екран (ноутбуки 768px і менше заввишки): у половину висоти
   заголовок у повний зріст не влазить, тому трохи зменшуємо його й відступи. */
@media (min-width: 700px) and (max-height: 800px) {
  .hero h1 { font-size: clamp(28px, 3.6vw, 52px); }
  .hero-sub { font-size: 16px; margin-top: 14px; }
  .hero .cta { margin-top: 20px; }
}

@media (min-width: 861px) {
  .maker { grid-template-columns: 40% minmax(0, 1fr); align-items: center;
    gap: clamp(32px, 5vw, 72px); }
  .sets, .cards { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .header-cta { display: inline-block; }
  .contacts dd { font-size: 28px; }}

/* --- Рух ------------------------------------------------------------------
   Анімацій на скрол немає взагалі. Лишились переходи станів і виїзд панелей.
   -------------------------------------------------------------------------- */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { transition-duration: 0.01ms !important;
    animation-duration: 0.01ms !important; }
}
@media print {
.site-header, .float, .nav { display: none !important; }
  .s-dark { background: #fff; color: #000; }}
@media (pointer: coarse) {
  .nav a { min-height: 48px; }
  .faq summary { padding-block: 20px; }
  .footer-grid a { display: inline-block; padding-block: 6px; }}