/* ==========================================================================
   TopShop — Design tokens
   Єдине джерело правди для кольорів, типографіки, відступів, радіусів.
   Нічого не хардкодити в компонентах — тільки через var().
   ТЗ §40.
   ========================================================================== */

:root {
	/* ----------------------------------------------------------------------
	   КОЛІР — бренд
	   Акцент: електрик-синій. Використовується для CTA, посилань, активних
	   станів фільтрів. Свідомо НЕ помаранчевий — ТЗ §15/§41 забороняють
	   повторювати фірмовий колір x-kom.
	   ---------------------------------------------------------------------- */
	--ts-color-primary: #0b63f6;
	--ts-color-primary-hover: #0a56d6;
	--ts-color-primary-active: #0948b2;
	--ts-color-primary-soft: #e8f0fe; /* фон бейджів/підсвітки */
	--ts-color-primary-contrast: #ffffff;

	/* ----------------------------------------------------------------------
	   КОЛІР — текст
	   Синюватий темний замість чистого чорного: м'якше для очей на білому
	   і зв'язує текст з акцентом.
	   ---------------------------------------------------------------------- */
	--ts-color-text: #0a2540; /* основний */
	--ts-color-text-strong: #04162a; /* заголовки, ціна */
	--ts-color-muted: #4a5a6e; /* підписи, характеристики */
	--ts-color-faint: #7b8898; /* плейсхолдери, дрібні мітки */

	/* ----------------------------------------------------------------------
	   КОЛІР — поверхні
	   Білі картки на світло-сірому тлі — так товар "виступає" вперед.
	   ---------------------------------------------------------------------- */
	--ts-color-bg: #ffffff; /* основне тло сторінки */
	--ts-color-surface: #ffffff; /* картки */
	--ts-color-surface-sunken: #eef1f6; /* сірі секції, зебра таблиць */
	--ts-color-surface-hover: #f5f7fa;
	/* Ледь помітний відтінок — великі блоки на кшталт підвалу, яким
	   сірий надає зайвої ваги. */
	--ts-color-surface-tint: #f7fafc;

	/* ----------------------------------------------------------------------
	   КОЛІР — межі
	   Темніші за типові для WP-тем, але без жорсткості: на зовсім
	   світлих межах картки зливалися з тлом, а надто темні робили
	   каталог схожим на таблицю.
	   ---------------------------------------------------------------------- */
	--ts-color-border: #d5dce6; /* стандартна межа картки */
	--ts-color-border-strong: #b9c3d0; /* інпути, поділювачі */
	--ts-color-border-focus: var(--ts-color-primary);

	/* ----------------------------------------------------------------------
	   СМУГИ ПРОКРУТКИ
	   Тонкі й у колір рамок: у сайдбарі фільтрів, мега-меню й шухлядах
	   системна смуга Windows завширшки 17px з'їдала місце й вибивалась
	   із дизайну. Тримаємо в токенах, щоб колір був один на весь сайт.
	   ---------------------------------------------------------------------- */
	--ts-scrollbar-size: 8px;
	--ts-scrollbar-thumb: #c3ccd9;
	--ts-scrollbar-thumb-hover: var(--ts-color-border-strong);

	/* ----------------------------------------------------------------------
	   КОЛІР — семантика
	   Статуси наявності (ТЗ §14) мають читатись миттєво і не конфліктувати
	   з синім акцентом.
	   ---------------------------------------------------------------------- */
	--ts-color-success: #16a34a; /* Є в наявності */
	--ts-color-success-soft: #e7f7ed;
	--ts-color-warning: #d97706; /* Мало / Під замовлення */
	--ts-color-warning-soft: #fdf3e3;
	--ts-color-danger: #e11d48; /* Знижка, стара ціна, немає */
	--ts-color-danger-soft: #fdeaef;
	--ts-color-info: #0b63f6;
	--ts-color-accent: #d6091a; /* Червоний з логотипа NBplaza — «Швидке замовлення» */
	--ts-color-accent-hover: #b80010;
	/* Той самий перехід, що в логотипі: від яскравого до вишневого. */
	--ts-gradient-accent: linear-gradient(180deg, #f0141c 0%, #c8010f 100%);
	--ts-gradient-accent-hover: linear-gradient(180deg, #d8070f 0%, #a8000d 100%);
	--ts-color-info-soft: var(--ts-color-primary-soft);

	/*
	 * Telegram — чужий фірмовий колір, лише для входу через бот.
	 * #2aabee — для логотипа, спінера й тла; білий текст на ньому дає
	 * лише ≈2.6:1. Тому заливка кнопок — затемнений відтінок того ж
	 * синього (≈4.7:1 з білим, WCAG AA): впізнається, але читається.
	 */
	--ts-color-telegram: #2aabee;
	--ts-color-telegram-button: #187bb3;
	--ts-color-telegram-button-hover: #14699a;
	--ts-color-telegram-button-active: #105a85;
	--ts-color-telegram-soft: #e9f6fd;
	--ts-color-telegram-ring: rgba(42, 171, 238, 0.35);

	/* Ціна та знижка — окремі токени, бо семантика не дорівнює "danger" */
	--ts-color-price: var(--ts-color-text-strong);
	--ts-color-price-old: var(--ts-color-faint);
	--ts-color-discount: #e11d48;

	/* ----------------------------------------------------------------------
	   ТИПОГРАФІКА
	   Inter — нейтральний гротеск з добрими цифрами й кирилицею; критично
	   для цін, SKU і таблиць характеристик. tnum вмикає моноширинні цифри.
	   ---------------------------------------------------------------------- */
	--ts-font-sans: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI",
		Roboto, "Helvetica Neue", Arial, sans-serif;
	--ts-font-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas,
		"Liberation Mono", monospace;

	/* Шкала 1.200 (minor third) — щільна, під насичений каталог */
	--ts-text-2xs: 0.6875rem; /* 11px — мітки, SKU */
	--ts-text-xs: 0.75rem; /* 12px — дрібні підписи */
	--ts-text-sm: 0.8125rem; /* 13px — характеристики в картці */
	--ts-text-base: 0.875rem; /* 14px — базовий UI-розмір */
	--ts-text-md: 1rem; /* 16px — body тексту сторінок */
	--ts-text-lg: 1.125rem; /* 18px */
	--ts-text-xl: 1.375rem; /* 22px — ціна в картці */
	--ts-text-2xl: 1.625rem; /* 26px — H2 */
	--ts-text-3xl: 2rem; /* 32px — H1 / ціна на сторінці товару */
	--ts-text-4xl: 2.5rem; /* 40px — hero */

	--ts-weight-regular: 400;
	--ts-weight-medium: 500;
	--ts-weight-semibold: 600;
	--ts-weight-bold: 700;

	--ts-leading-tight: 1.2; /* заголовки */
	--ts-leading-snug: 1.35; /* назви товарів */
	--ts-leading-normal: 1.5; /* UI */
	--ts-leading-relaxed: 1.65; /* довгі описи */

	--ts-tracking-tight: -0.015em; /* великі заголовки */
	--ts-tracking-normal: 0;
	--ts-tracking-wide: 0.02em; /* кепс-мітки */

	/* ----------------------------------------------------------------------
	   ВІДСТУПИ — крок 4px
	   ---------------------------------------------------------------------- */
	--ts-space-0: 0;
	--ts-space-1: 0.25rem; /* 4 */
	--ts-space-2: 0.5rem; /* 8 */
	--ts-space-3: 0.75rem; /* 12 */
	--ts-space-4: 1rem; /* 16 */
	--ts-space-5: 1.25rem; /* 20 */
	--ts-space-6: 1.5rem; /* 24 */
	--ts-space-8: 2rem; /* 32 */
	--ts-space-10: 2.5rem; /* 40 */
	--ts-space-12: 3rem; /* 48 */
	--ts-space-16: 4rem; /* 64 */
	--ts-space-20: 5rem; /* 80 */

	/* ----------------------------------------------------------------------
	   РАДІУСИ
	   Помірні — техніка має виглядати точно, а не "м'яко".
	   ---------------------------------------------------------------------- */
	--ts-radius-sm: 4px; /* бейджі, дрібні контроли */
	--ts-radius-md: 8px; /* кнопки, інпути */
	--ts-radius-lg: 12px; /* картки */
	--ts-radius-xl: 16px; /* модалки, великі блоки */
	--ts-radius-full: 999px; /* чіпи, лічильники */

	/* ----------------------------------------------------------------------
	   ТІНІ — стримані; глибина переважно межами, а не тінями
	   ---------------------------------------------------------------------- */
	--ts-shadow-xs: 0 1px 2px rgba(10, 37, 64, 0.05);
	--ts-shadow-sm: 0 1px 3px rgba(10, 37, 64, 0.08);
	--ts-shadow-md: 0 4px 12px rgba(10, 37, 64, 0.1);
	--ts-shadow-lg: 0 12px 32px rgba(10, 37, 64, 0.14);
	--ts-shadow-focus: 0 0 0 3px rgba(11, 99, 246, 0.25);

	/* ----------------------------------------------------------------------
	   МАКЕТ
	   ---------------------------------------------------------------------- */
	--ts-container-max: 1440px; /* широкий десктоп */
	--ts-container-pad: var(--ts-space-4); /* бічні поля на мобільному */
	--ts-sidebar-width: 268px; /* колонка фільтрів (ТЗ §26) */
	/*
	 * Висота липкої шапки: від неї рахують top у всіх sticky-блоках
	 * (фільтри каталогу, підсумок кошика, блок купівлі).
	 *
	 * Значення тут — запасне, до старту JS. Справжню висоту міряє
	 * модуль Header і перезаписує цю змінну: шапка різна на різних
	 * ширинах (другий ярус розділів, пошук окремим рядком), і в CSS
	 * ці числа довелося б дублювати на кожному брейкпоінті.
	 */
	--ts-header-height: 64px;
	--ts-gutter: var(--ts-space-4); /* проміжок сітки каталогу */

	/* ----------------------------------------------------------------------
	   АНІМАЦІЯ
	   ---------------------------------------------------------------------- */
	--ts-duration-fast: 120ms;
	--ts-duration-base: 180ms;
	--ts-duration-slow: 280ms;
	--ts-ease: cubic-bezier(0.4, 0, 0.2, 1);
	--ts-ease-out: cubic-bezier(0, 0, 0.2, 1);

	/* ----------------------------------------------------------------------
	   Z-INDEX — єдина шкала, щоб не ловити війни z-index
	   ---------------------------------------------------------------------- */
	--ts-z-base: 1;
	--ts-z-sticky: 100;
	--ts-z-header: 200;
	--ts-z-dropdown: 300;
	--ts-z-megamenu: 350;
	--ts-z-overlay: 400;
	--ts-z-drawer: 450;
	--ts-z-modal: 500;
	--ts-z-toast: 600;
}

/* Поважаємо системне зменшення руху */
@media (prefers-reduced-motion: reduce) {
	:root {
		--ts-duration-fast: 0ms;
		--ts-duration-base: 0ms;
		--ts-duration-slow: 0ms;
	}
}

/* ==========================================================================
   TopShop — Base
   Reset, типографіка, контейнери, сітка. Без компонентів.
   ========================================================================== */

/* --- Reset ------------------------------------------------------------- */

*,
*::before,
*::after {
	box-sizing: border-box;
}

html {
	-webkit-text-size-adjust: 100%;
	scroll-behavior: smooth;
}

@media (prefers-reduced-motion: reduce) {
	html {
		scroll-behavior: auto;
	}
}

body {
	margin: 0;
	background: var(--ts-color-bg);
	color: var(--ts-color-text);
	font-family: var(--ts-font-sans);
	font-size: var(--ts-text-base);
	line-height: var(--ts-leading-normal);
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	/* Моноширинні цифри всюди: ціни й характеристики вирівнюються в колонки */
	font-variant-numeric: tabular-nums;
}

h1,
h2,
h3,
h4,
h5,
h6,
p,
figure,
blockquote,
dl,
dd {
	margin: 0;
}

ul,
ol {
	margin: 0;
	padding: 0;
	list-style: none;
}

img,
picture,
video,
canvas,
svg {
	display: block;
	max-width: 100%;
	height: auto;
}

input,
button,
textarea,
select {
	font: inherit;
	color: inherit;
}

button {
	background: none;
	border: 0;
	padding: 0;
	cursor: pointer;
}

a {
	color: var(--ts-color-primary);
	text-decoration: none;
}

a:hover {
	text-decoration: underline;
}

table {
	border-collapse: collapse;
	width: 100%;
}

/* --- Типографіка -------------------------------------------------------- */

h1,
.ts-h1 {
	font-size: var(--ts-text-3xl);
	font-weight: var(--ts-weight-bold);
	line-height: var(--ts-leading-tight);
	letter-spacing: var(--ts-tracking-tight);
	color: var(--ts-color-text-strong);
}

h2,
.ts-h2 {
	font-size: var(--ts-text-2xl);
	font-weight: var(--ts-weight-bold);
	line-height: var(--ts-leading-tight);
	letter-spacing: var(--ts-tracking-tight);
	color: var(--ts-color-text-strong);
}

h3,
.ts-h3 {
	font-size: var(--ts-text-xl);
	font-weight: var(--ts-weight-semibold);
	line-height: var(--ts-leading-snug);
	color: var(--ts-color-text-strong);
}

h4,
.ts-h4 {
	font-size: var(--ts-text-lg);
	font-weight: var(--ts-weight-semibold);
	line-height: var(--ts-leading-snug);
	color: var(--ts-color-text-strong);
}

@media (max-width: 767px) {
	h1,
	.ts-h1 {
		font-size: var(--ts-text-2xl);
	}

	h2,
	.ts-h2 {
		font-size: var(--ts-text-xl);
	}
}

/* Дрібна кепс-мітка: "Бренд", "Характеристики" тощо */
.ts-label {
	font-size: var(--ts-text-2xs);
	font-weight: var(--ts-weight-semibold);
	letter-spacing: var(--ts-tracking-wide);
	text-transform: uppercase;
	color: var(--ts-color-muted);
}

.ts-muted {
	color: var(--ts-color-muted);
}

.ts-mono {
	font-family: var(--ts-font-mono);
	font-size: 0.95em;
}

/* --- Доступність -------------------------------------------------------- */

/* Видимий фокус лише для клавіатури */
:focus-visible {
	outline: 2px solid var(--ts-color-primary);
	outline-offset: 2px;
	border-radius: var(--ts-radius-sm);
}

:focus:not(:focus-visible) {
	outline: none;
}

/*
 * Текстові поля й списки мають власний фокус — синя рамка плюс
 * --ts-shadow-focus (.ts-input, .ts-select, поля checkout і кабінету).
 * Глобальний outline малювався б поверх нього другим кільцем.
 *
 * Radio і checkbox лишаються нативними (accent-color), тому їм outline
 * потрібен: іншої видимої ознаки фокусу в них немає.
 */
input:not([type="radio"]):not([type="checkbox"]):focus-visible,
select:focus-visible,
textarea:focus-visible {
	outline: none;
}

/* Приховано візуально, але доступно скрінрідеру */
.ts-visually-hidden,
.screen-reader-text {
	position: absolute !important;
	width: 1px;
	height: 1px;
	padding: 0;
	margin: -1px;
	overflow: hidden;
	clip: rect(0, 0, 0, 0);
	white-space: nowrap;
	border: 0;
}

/* Посилання "перейти до вмісту" */
.ts-skip-link {
	position: absolute;
	top: -100px;
	left: var(--ts-space-4);
	z-index: var(--ts-z-toast);
	padding: var(--ts-space-3) var(--ts-space-4);
	background: var(--ts-color-primary);
	color: var(--ts-color-primary-contrast);
	border-radius: var(--ts-radius-md);
	font-weight: var(--ts-weight-semibold);
	transition: top var(--ts-duration-base) var(--ts-ease);
}

.ts-skip-link:focus {
	top: var(--ts-space-4);
	text-decoration: none;
}

/* --- Контейнер ---------------------------------------------------------- */

.ts-container {
	width: 100%;
	max-width: var(--ts-container-max);
	margin-inline: auto;
	padding-inline: var(--ts-container-pad);
}

@media (min-width: 768px) {
	:root {
		--ts-container-pad: var(--ts-space-6);
	}
}

@media (min-width: 1280px) {
	:root {
		--ts-container-pad: var(--ts-space-8);
	}
}

/* --- Сітка каталогу -----------------------------------------------------
   Кількість колонок керується через --ts-grid-cols, щоб той самий клас
   працював і в каталозі, і в блоках головної.
   ------------------------------------------------------------------------ */

.ts-grid {
	display: grid;
	gap: var(--ts-gutter);
	grid-template-columns: repeat(var(--ts-grid-cols, 2), minmax(0, 1fr));
}

@media (min-width: 560px) {
	.ts-grid {
		--ts-grid-cols: 3;
	}
}

@media (min-width: 1024px) {
	.ts-grid {
		--ts-grid-cols: 4;
	}
}

@media (min-width: 1440px) {
	.ts-grid {
		--ts-grid-cols: 5;
	}
}

/*
 * Сітка каталогу.
 *
 * Телефон — ОДНА колонка. При 375px дві колонки давали картку 156px:
 * фото нечитабельне, а ціна й кнопка не вміщувались в один рядок.
 * Одна колонка з горизонтальною карткою (фото ліворуч, дані праворуч)
 * показує більше корисного і дає кнопці повну ширину.
 *
 * Поруч із сайдбаром фільтрів — 3 колонки, як у x-kom: картка виходить
 * достатньо широкою, щоб вмістити 4-5 характеристик без переносів.
 * Без сайдбара (пошук, сторінки без фільтрів) використовуємо всю ширину.
 */
.ts-grid--catalog {
	--ts-grid-cols: 1;
}

@media (min-width: 560px) {
	.ts-grid--catalog {
		--ts-grid-cols: 2;
	}
}

@media (min-width: 1024px) {
	.ts-layout--with-sidebar .ts-grid--catalog {
		--ts-grid-cols: 3;
	}
}

@media (min-width: 640px) {
	.ts-layout:not(.ts-layout--with-sidebar) .ts-grid--catalog {
		--ts-grid-cols: 3;
	}
}

@media (min-width: 1280px) {
	.ts-layout:not(.ts-layout--with-sidebar) .ts-grid--catalog {
		--ts-grid-cols: 4;
	}
}

/* --- Макет сторінки каталогу: сайдбар + контент ------------------------- */

.ts-layout {
	display: grid;
	gap: var(--ts-space-6);
	grid-template-columns: 1fr;
	align-items: start;
}

@media (min-width: 1024px) {
	.ts-layout--with-sidebar {
		grid-template-columns: var(--ts-sidebar-width) minmax(0, 1fr);
		gap: var(--ts-space-8);
	}
}

/* --- Секції ------------------------------------------------------------- */

.ts-section {
	margin-block: var(--ts-space-10);
}

.ts-section__head {
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	gap: var(--ts-space-4);
	margin-bottom: var(--ts-space-5);
}

/* --- Утиліти ------------------------------------------------------------ */

.ts-stack > * + * {
	margin-top: var(--ts-stack-gap, var(--ts-space-3));
}

.ts-cluster {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: var(--ts-cluster-gap, var(--ts-space-2));
}

/* Обрізання назви товару до N рядків, щоб картки лишались однакової висоти */
.ts-clamp {
	display: -webkit-box;
	-webkit-box-orient: vertical;
	-webkit-line-clamp: var(--ts-clamp-lines, 2);
	line-clamp: var(--ts-clamp-lines, 2);
	overflow: hidden;
}

/* --- iOS: не даємо Safari зумити сторінку при фокусі в полі --------------
   Safari автоматично збільшує масштаб, якщо font-size інпута < 16px,
   і після цього сторінка лишається зумленою. Тому на телефоні всі поля
   вводу мають щонайменше 16px.
   ------------------------------------------------------------------------ */

@media (max-width: 767px) {
	input[type="text"],
	input[type="search"],
	input[type="number"],
	input[type="tel"],
	input[type="email"],
	input[type="password"],
	select,
	textarea {
		font-size: 16px;
	}
}

/* --- Смуги прокрутки ------------------------------------------------------

   Системна смуга Windows — 17px суцільного сірого. У сайдбарі фільтрів
   і в мега-меню вона з'їдала місце й вибивалась із верстки, тож робимо
   власну: тонку, у колір рамок, без стрілок і підкладки.

   Два синтаксиси, бо їх підтримують різні рушії: scrollbar-* розуміють
   Firefox і свіжі Chrome, ::-webkit-scrollbar — Safari й Chrome. Обидва
   безпечні: браузер просто ігнорує те, чого не знає.
   ------------------------------------------------------------------------ */

* {
	scrollbar-width: thin;
	scrollbar-color: var(--ts-scrollbar-thumb) transparent;
}

::-webkit-scrollbar {
	width: var(--ts-scrollbar-size);
	height: var(--ts-scrollbar-size);
}

/* Доріжка прозора: смуга читається як тонка риска, а не як жолоб. */
::-webkit-scrollbar-track {
	background: transparent;
}

::-webkit-scrollbar-thumb {
	background: var(--ts-scrollbar-thumb);
	border-radius: 999px;
	/*
	 * Прозора рамка «підрізає» повзунок усередині доріжки — без неї
	 * він притискається до самого краю й виглядає товстішим.
	 */
	border: 2px solid transparent;
	background-clip: content-box;
}

::-webkit-scrollbar-thumb:hover {
	background: var(--ts-scrollbar-thumb-hover);
	background-clip: content-box;
}

/* Кут між горизонтальною і вертикальною смугами — без сірого квадрата. */
::-webkit-scrollbar-corner {
	background: transparent;
}

/*
 * Іконки теми (icon() у PHP). Малювання — тут, а не атрибутами на
 * кожному SVG: на вітрині іконка — це <use> зі спрайта, і ті самі
 * fill/stroke на тисячі SVG мегаменю важили більше за самі шляхи.
 * Залиті іконки (зірки, «в обраному») перевизначають fill точнішим
 * селектором.
 */
.ts-icon {
	fill: none;
	stroke: currentColor;
	stroke-width: 1.8;
	stroke-linecap: round;
	stroke-linejoin: round;
}

/* ==========================================================================
   TopShop — Components
   Кнопки, бейджі, ціна, картка товару, інпути, чіпи.
   ========================================================================== */

/* --- Кнопки ------------------------------------------------------------- */

.ts-btn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: var(--ts-space-2);
	padding: var(--ts-space-3) var(--ts-space-5);
	border: 1px solid transparent;
	border-radius: var(--ts-radius-md);
	font-size: var(--ts-text-base);
	font-weight: var(--ts-weight-semibold);
	line-height: 1.2;
	text-align: center;
	text-decoration: none;
	cursor: pointer;
	transition: background-color var(--ts-duration-fast) var(--ts-ease),
		border-color var(--ts-duration-fast) var(--ts-ease),
		color var(--ts-duration-fast) var(--ts-ease);
	/* Мінімальна зручна для пальця висота */
	min-height: 44px;
}

.ts-btn:hover {
	text-decoration: none;
}

.ts-btn:disabled,
.ts-btn[aria-disabled="true"] {
	opacity: 0.55;
	cursor: not-allowed;
	pointer-events: none;
}

/* Головний CTA — "Додати в кошик" (ТЗ §28) */
.ts-btn--primary {
	background: var(--ts-color-primary);
	color: var(--ts-color-primary-contrast);
}

.ts-btn--primary:hover {
	background: var(--ts-color-primary-hover);
	color: var(--ts-color-primary-contrast);
}

.ts-btn--primary:active {
	background: var(--ts-color-primary-active);
}

/* Вторинний CTA — "Уточнити" (ТЗ §29) */
.ts-btn--secondary {
	background: var(--ts-color-surface);
	border-color: var(--ts-color-border-strong);
	color: var(--ts-color-text);
}

.ts-btn--secondary:hover {
	background: var(--ts-color-surface-hover);
	border-color: var(--ts-color-primary);
	color: var(--ts-color-primary);
}

/*
 * М'який варіант — «Швидке замовлення». Не конкурує з головним CTA
 * кольором, але лишається помітним: це друга за важливістю дія.
 */
.ts-btn--soft {
	background: var(--ts-color-primary-soft);
	border-color: transparent;
	color: var(--ts-color-primary);
}

.ts-btn--soft:hover {
	background: #dbe7fd;
	border-color: transparent;
	color: var(--ts-color-primary-hover);
}

/*
 * Акцентний варіант — «Швидке замовлення». Червоний градієнт з
 * логотипа: м'який синій поруч із синьою «Купити» губився. Суцільний
 * колір лишається запасним — для країв і старих браузерів.
 */
.ts-btn--accent {
	background: var(--ts-color-accent);
	background-image: var(--ts-gradient-accent);
	border-color: transparent;
	color: #fff;
}

.ts-btn--accent:hover {
	background: var(--ts-color-accent-hover);
	background-image: var(--ts-gradient-accent-hover);
	border-color: transparent;
	color: #fff;
}

/* Тихий варіант — іконки хедера, "показати ще" */
.ts-btn--ghost {
	background: transparent;
	color: var(--ts-color-text);
	padding-inline: var(--ts-space-3);
}

.ts-btn--ghost:hover {
	background: var(--ts-color-surface-sunken);
}

.ts-btn--sm {
	min-height: 36px;
	padding: var(--ts-space-2) var(--ts-space-3);
	font-size: var(--ts-text-sm);
}

.ts-btn--lg {
	min-height: 52px;
	padding: var(--ts-space-4) var(--ts-space-6);
	font-size: var(--ts-text-md);
}

.ts-btn--block {
	width: 100%;
}

/* --- Бейджі статусу наявності (ТЗ §14) ---------------------------------- */

.ts-stock {
	display: inline-flex;
	align-items: center;
	gap: var(--ts-space-2);
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-medium);
	line-height: 1.3;
}

/* Крапка-індикатор замість важкої заливки — менше шуму в сітці */
.ts-stock::before {
	content: "";
	flex: none;
	width: 8px;
	height: 8px;
	border-radius: var(--ts-radius-full);
	background: currentColor;
}

.ts-stock--in_stock {
	color: var(--ts-color-success);
}

.ts-stock--low_stock {
	color: var(--ts-color-warning);
}

.ts-stock--on_order,
.ts-stock--expected {
	color: var(--ts-color-warning);
}

.ts-stock--out_of_stock,
.ts-stock--discontinued {
	color: var(--ts-color-faint);
}

/* --- Бейджі загального призначення -------------------------------------- */

.ts-badge {
	display: inline-flex;
	align-items: center;
	gap: var(--ts-space-1);
	padding: 2px var(--ts-space-2);
	border-radius: var(--ts-radius-sm);
	font-size: var(--ts-text-2xs);
	font-weight: var(--ts-weight-semibold);
	letter-spacing: var(--ts-tracking-wide);
	text-transform: uppercase;
	white-space: nowrap;
}

.ts-badge--discount {
	background: var(--ts-color-discount);
	color: #fff;
	text-transform: none;
	letter-spacing: 0;
	font-size: var(--ts-text-xs);
}

/*
 * «Хіт продажів» — синій, як основний акцент: це позитивна позначка,
 * а не знижка, тож червоний тут читався б як терміновість.
 */
.ts-badge--hit {
	background: var(--ts-color-primary);
	color: #fff;
	text-transform: none;
	letter-spacing: 0;
	font-size: var(--ts-text-xs);
}

/* Безкоштовна доставка — зелений: це вигода, а не попередження. */
.ts-badge--shipping {
	background: #e7f6ec;
	color: #08703a;
	text-transform: none;
	letter-spacing: 0;
	font-size: var(--ts-text-xs);
}

.ts-badge--new {
	background: var(--ts-color-primary-soft);
	color: var(--ts-color-primary);
}

.ts-badge--neutral {
	background: var(--ts-color-surface-sunken);
	color: var(--ts-color-muted);
}

/* --- Ціна --------------------------------------------------------------- */

.ts-price {
	display: flex;
	align-items: baseline;
	gap: var(--ts-space-2);
	flex-wrap: wrap;
}

.ts-price__current {
	font-size: var(--ts-text-xl);
	font-weight: var(--ts-weight-bold);
	line-height: 1.1;
	color: var(--ts-color-price);
	letter-spacing: var(--ts-tracking-tight);
	white-space: nowrap;
}

/*
 * Ціна в картці разом із (i) «Ціна з ПДВ» (vat_tip()): значок угорі
 * праворуч, як індекс. Над псевдоелементом посилання картки — інакше
 * тап по (i) відкривав би товар.
 */
.ts-price__now {
	display: inline-flex;
	align-items: flex-start;
	gap: 2px;
}

.ts-price__now .ts-tip {
	z-index: calc(var(--ts-z-base) + 1);
	top: -6px;
}

.ts-price__now .ts-tip__btn {
	width: 24px;
	height: 24px;
	margin: -4px -6px -4px -2px;
}

.ts-price__now .ts-tip .ts-icon {
	width: 14px;
	height: 14px;
}

/* «з ПДВ» біля ціни — у режимі цін з ПДВ (vat_note()). */
.ts-price__vat {
	font-size: var(--ts-text-xs);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-muted);
	white-space: nowrap;
}

/*
 * Знижка в картці: стара ціна закреслена з бейджем «−15%» рядком над
 * поточною, а поточна — червона.
 */
.ts-price__was {
	display: inline-flex;
	align-items: center;
	gap: 6px;
}

.ts-price__badge {
	padding: 1px 5px;
	font-size: var(--ts-text-2xs);
	line-height: 1.3;
}

.ts-price.is-sale .ts-price__current {
	color: var(--ts-color-discount);
}

.ts-price__old {
	font-size: var(--ts-text-sm);
	color: var(--ts-color-price-old);
	text-decoration: line-through;
	white-space: nowrap;
}

.ts-price--lg .ts-price__current {
	font-size: var(--ts-text-3xl);
}

.ts-price--lg .ts-price__old {
	font-size: var(--ts-text-md);
}

/* --- Картка товару (ТЗ §27) ---------------------------------------------
   Сітка з 3 рядків: медіа / тіло (розтягується) / підвал.
   Завдяки цьому ціна й кнопка стоять на одній лінії в усіх картках ряду,
   навіть коли назви різної довжини.
   ------------------------------------------------------------------------ */

.ts-card {
	position: relative;
	display: grid;
	/*
	 * Колонку задаємо явно. Без неї вона авторозмірна й тягнеться за
	 * вмістом: фото 1746x1746 від постачальника розпирало картку до
	 * 1747px, і сусідні наїжджали одна на одну. Демо-товари цього не
	 * показували — їхні SVG-заглушки дрібні.
	 */
	grid-template-columns: minmax(0, 1fr);
	grid-template-rows: auto 1fr auto;
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
	padding: var(--ts-space-3);
	transition: border-color var(--ts-duration-base) var(--ts-ease),
		box-shadow var(--ts-duration-base) var(--ts-ease);
}

/*
 * Ховер лише там, де є курсор. На телефоні дотик вмикає :hover і він
 * лишається: фото збільшувалось під пальцем, назва залипала синьою.
 */
@media (hover: hover) {
	.ts-card:hover {
		border-color: var(--ts-color-border-strong);
		box-shadow: var(--ts-shadow-md);
	}
}

.ts-card__media {
	position: relative;
	aspect-ratio: 1 / 1;
	display: flex;
	align-items: center;
	justify-content: center;
	margin-bottom: var(--ts-space-3);
	overflow: hidden;
	border-radius: var(--ts-radius-md);
	background: var(--ts-color-surface);
	/*
	 * Картка — grid, а його елементи за замовчуванням не вужчі за
	 * власний вміст (min-width: auto). Фото 400x400 від постачальника
	 * розпирало блок до 376px усередині картки на 285px, і сусідні
	 * картки наїжджали одна на одну. Демо-товари цього не показували,
	 * бо їхні SVG-заглушки дрібніші за колонку.
	 */
	min-width: 0;
	max-width: 100%;
}

.ts-card__media img {
	width: 100%;
	height: 100%;
	/* Атрибути width/height у теґу не мають задавати розмір. */
	max-width: 100%;
	/* Трохи збільшуємо: фото товарів зазвичай мають власні білі поля,
	   без цього картинка виглядає загубленою в центрі картки. */
	object-fit: contain;
	transform: scale(1.12);
	mix-blend-mode: multiply; /* прибирає білу рамку навколо фото товару */
	transition: transform var(--ts-duration-slow) var(--ts-ease-out);
}

@media (hover: hover) {
	.ts-card:hover .ts-card__media img {
		transform: scale(1.18);
	}
}

/* Бейджі поверх фото */
.ts-card__flags {
	position: absolute;
	top: var(--ts-space-2);
	left: var(--ts-space-2);
	z-index: var(--ts-z-base);
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: var(--ts-space-1);
}

.ts-card__body {
	display: flex;
	flex-direction: column;
	gap: var(--ts-space-2);
}

/*
 * Порожнеча в картках без характеристик.
 *
 * Тіло стоїть у рядку 1fr, щоб ціни й кнопки трималися на одній
 * лінії в усьому ряду. Але в товарів без переліку характеристик тіло
 * на 98px нижче за сусідів, і цей запас ставав дірою — між останнім
 * рядком тіла й роздільником підвалу.
 *
 * Тіло лишаємо своєї висоти (align-self: start), а роздільник
 * малюємо не на підвалі, а під самим тілом — тоді лінія йде одразу
 * за вмістом, а вільне місце ховається під нею.
 */
.ts-card__body {
	align-self: start;
}

.ts-card__brand {
	font-size: var(--ts-text-2xs);
	font-weight: var(--ts-weight-semibold);
	letter-spacing: var(--ts-tracking-wide);
	text-transform: uppercase;
	color: var(--ts-color-muted);
}

/*
 * Без min-height: заголовок займає стільки рядків, скільки треба.
 *
 * Резерв на два рядки ставили, щоб ціни й кнопки стояли на одній
 * лінії в усьому ряду. Але це й так робить сітка самої картки
 * (grid-template-rows: auto 1fr auto) — тіло розтягується, підвал
 * притискається донизу. А в коротких назв резерв лишав під рядком
 * порожнє місце, яке виглядало як зайвий пустий рядок.
 */
.ts-card__title {
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-medium);
	line-height: var(--ts-leading-snug);
	color: var(--ts-color-text);
	--ts-clamp-lines: 2;
}

/*
 * Обрізаємо саме посилання, а не заголовок.
 *
 * Коли -webkit-box стояв на h3, а посилання лишалось рядковим, воно
 * не підкорялось обрізці: текст ішов третім рядком і вилазив за
 * межі заголовка. Спроба зробити посилання блоковим ламала обрізку
 * зовсім — браузер перемикав h3 на flow-root, і тримала висоту сама
 * лише min-height.
 *
 * Тепер -webkit-box на самому посиланні: воно обрізається на двох
 * рядках і займає рівно свою висоту, тож клікабельний увесь текст.
 */
.ts-card__title {
	display: block;
}

.ts-card__title a {
	display: -webkit-box;
	-webkit-box-orient: vertical;
	-webkit-line-clamp: var(--ts-clamp-lines, 2);
	line-clamp: var(--ts-clamp-lines, 2);
	overflow: hidden;
	color: inherit;
}

.ts-card__title a:hover {
	text-decoration: none;
}

@media (hover: hover) {
	.ts-card__title a:hover {
		color: var(--ts-color-primary);
	}
}

/*
 * Розтягуємо клікабельну зону на всю картку, не вкладаючи <a> в <a>.
 *
 * Обгортку-посилання лишаємо рядковою (span-подібною) і обрізаємо
 * текст усередині неї. Псевдоелемент, який ловить кліки по всій
 * картці, теж на посиланні — інакше на h3 він перекривав би <a> і
 * перехід не спрацьовував.
 *
 * ::before, а не ::after: усередині -webkit-box псевдоелемент стає
 * рядком флексбокса, і ::after займав місце третього рядка, через
 * що обрізка на двох рядках переставала діяти. ::before такого не
 * робить, бо йде до тексту й має нульові розміри.
 */
.ts-card__title a::before {
	content: "";
	position: absolute;
	inset: 0;
	z-index: var(--ts-z-base);
}

/* Ключові характеристики — 3–5 рядків (ТЗ §27) */
.ts-card__specs {
	display: flex;
	flex-direction: column;
	gap: 2px;
	font-size: var(--ts-text-xs);
	color: var(--ts-color-muted);
	line-height: 1.4;
}

/*
 * Характеристика в один рядок: значення (16 GB, 512 GB) не має
 * розриватися, бо саме воно головне. Якщо не вистачає місця —
 * обрізаємо підпис, а не значення.
 */
.ts-card__spec {
	display: flex;
	gap: var(--ts-space-1);
	white-space: nowrap;
	/* Рядок не має бути ширшим за картку. */
	min-width: 0;
	max-width: 100%;
	overflow: hidden;
}

/*
 * Підпис стискається першим (shrink 999 проти 1 у значення).
 * Коли обидва мали однакову вагу, на телефоні різалися разом, і
 * виходило «Серія (модельний … Acer As…» — нечитабельні обидві
 * половини. Цінне тут значення, а не слово перед двокрапкою.
 */
.ts-card__spec-label {
	flex: 0 999 auto;
	min-width: 0;
	overflow: hidden;
	text-overflow: ellipsis;
	color: var(--ts-color-faint);
}

/*
 * Значення теж обрізаємо. Раніше воно було flex: none — розраховували
 * на короткі «16 GB», але від постачальника приходять перерахування
 * на кшталт «Кнопки: Wi-Fi вкл/викл., WPS, RESET, POWER…» завдовжки
 * в тисячі пікселів. Такий рядок розпирав сторінку й давав
 * горизонтальний скрол на всьому каталозі.
 */
.ts-card__spec-value {
	flex: 0 1 auto;
	min-width: 0;
	overflow: hidden;
	text-overflow: ellipsis;
}

.ts-card__sku {
	font-size: var(--ts-text-2xs);
	color: var(--ts-color-faint);
}

.ts-card__footer {
	display: flex;
	align-items: flex-end;
	justify-content: space-between;
	gap: var(--ts-space-3);
	margin-top: var(--ts-space-3);
	padding-top: var(--ts-space-3);
	border-top: 1px solid var(--ts-color-border);
}

/* Кнопка в картці має бути над псевдоелементом посилання */
.ts-card__action {
	position: relative;
	z-index: calc(var(--ts-z-base) + 1);
	flex: none;
}

/*
 * Кнопка в картці — суцільна синя (рішення власника, жовтень 2026:
 * кругла кнопка, що висувається в «Купити», полою губилась). При
 * наведенні — на тон темніша.
 */
.ts-card__action.ts-btn--primary {
	background: var(--ts-color-primary);
	color: var(--ts-color-primary-contrast);
	border: 1px solid var(--ts-color-primary);
}

.ts-card__action.ts-btn--primary:hover,
.ts-card__action.ts-btn--primary:focus-visible {
	background: var(--ts-color-primary-hover);
	color: var(--ts-color-primary-contrast);
	border-color: var(--ts-color-primary-hover);
}

.ts-card__action.ts-btn--primary:active {
	background: var(--ts-color-primary-active);
	border-color: var(--ts-color-primary-active);
	color: var(--ts-color-primary-contrast);
}

/*
 * Товар уже в кошику — WooCommerce додає .added і показує поруч
 * «Переглянути кошик». Лишаємо кнопку залитою: дія вже сталася.
 */
.ts-card__action.ts-btn--primary.added {
	background: var(--ts-color-primary);
	color: var(--ts-color-primary-contrast);
}

/*
 * Стани «Купити» в картці: кошик → спінер → галочка «В кошику».
 * Класи .loading і .added ставить сам WooCommerce (ajax_add_to_cart),
 * тож потрібні лише дві іконки й два підписи в розмітці (card.php).
 */
.ts-card__action-icon {
	position: relative;
	display: inline-grid;
	place-items: center;
	flex: none;
	width: 18px;
	height: 18px;
}

.ts-card__action-icon .ts-icon {
	grid-area: 1 / 1;
	transition: opacity var(--ts-duration-fast) var(--ts-ease), transform var(--ts-duration-fast) var(--ts-ease);
}

.ts-card__action-icon .ts-icon--check {
	opacity: 0;
	transform: scale(0.5);
}

.ts-card__action-done {
	display: none;
}

/* Поки йде запит — повторний клік додав би товар двічі. */
.ts-card__action.loading {
	pointer-events: none;
}

.ts-card__action.loading .ts-card__action-icon .ts-icon {
	opacity: 0;
}

.ts-card__action.loading .ts-card__action-icon::after {
	content: "";
	position: absolute;
	inset: 1px;
	border: 2px solid currentColor;
	border-right-color: transparent;
	border-radius: var(--ts-radius-full);
	animation: ts-card-spin 0.7s linear infinite;
}

.ts-card__action.added .ts-icon--cart {
	opacity: 0;
	transform: scale(0.5);
}

.ts-card__action.added .ts-icon--check {
	opacity: 1;
	transform: none;
}

.ts-card__action.added .ts-card__action-buy {
	display: none;
}

.ts-card__action.added .ts-card__action-done {
	display: inline;
}

/*
 * «Переглянути кошик», яке WooCommerce дописує після кнопки, не
 * потрібне: кнопка й так каже «В кошику», а шухляда кошика відкрилась.
 */
.ts-card__footer .added_to_cart {
	display: none;
}

@keyframes ts-card-spin {
	to {
		transform: rotate(360deg);
	}
}

/*
 * На вітринах кнопка — кругла іконка, а «Купити» висувається з неї при
 * наведенні й лишається, поки йде запит і після додавання. Лише там,
 * де є курсор і місце: на телефоні підпис і так видно (див. нижче), а
 * в каталозі кнопка широка з написом.
 */
@media (hover: hover) and (min-width: 560px) {
	/*
	 * Кнопка висувається поверх, ліворуч, а не розсуває підвал: у вузькій
	 * картці вітрини розширення в потоці виштовхувало «з ПДВ» у другий
	 * рядок. У потоці лишається лише місце під круглу іконку.
	 */
	/*
	 * Ціна — по центру кнопки (обидві 40px заввишки), однаково на
	 * головній, у вітринах і в каталозі: раніше в одних картках вона
	 * сідала донизу, в інших — догори.
	 */
	.ts-card__footer:has(> .add_to_cart_button) {
		position: relative;
		align-items: center;
		min-height: calc(40px + var(--ts-space-3));
		padding-right: calc(40px + var(--ts-space-3));
	}

	.ts-card__action.add_to_cart_button {
		position: absolute;
		right: 0;
		bottom: 0;
		min-height: 40px;
		gap: 0;
		padding-inline: 10px;
		border-radius: var(--ts-radius-full);
	}

	.ts-card__action.add_to_cart_button .ts-card__action-label {
		position: static;
		width: auto;
		height: auto;
		max-width: 0;
		margin: 0;
		overflow: hidden;
		clip-path: none;
		opacity: 0;
		white-space: nowrap;
		transition: max-width 0.25s var(--ts-ease), margin 0.25s var(--ts-ease), opacity 0.2s var(--ts-ease);
	}

	/*
	 * Після додавання — знову кругла, з галочкою: «В кошику» ширше за
	 * «Купити» і у вузькій картці лягало на ціну, а галочка й так каже,
	 * що товар у кошику.
	 */
	.ts-card__action.add_to_cart_button:not(.added):hover .ts-card__action-label,
	.ts-card__action.add_to_cart_button:not(.added):focus-visible .ts-card__action-label,
	.ts-card__action.add_to_cart_button.loading .ts-card__action-label {
		max-width: 7em;
		margin-left: 6px;
		opacity: 1;
	}

	/* Розкрита — трохи тісніша: у картці на 216px кожен піксель на рахунку. */
	.ts-card__action.add_to_cart_button:not(.added):hover,
	.ts-card__action.add_to_cart_button:not(.added):focus-visible,
	.ts-card__action.add_to_cart_button.loading {
		padding-inline: 8px 10px;
	}

	/*
	 * Сітка каталогу — та сама кругла кнопка, що на головній (рішення
	 * власника): широка «Купити» на всю картку виглядала як на телефоні.
	 * Підвал — у рядок: ціна ліворуч, кнопка праворуч.
	 */
	/*
	 * .ts-card у селекторі — для ваги: базове правило каталогу
	 * (колонка) стоїть у файлі нижче й інакше перебивало це.
	 */
	.ts-grid--catalog .ts-card .ts-card__footer {
		flex-direction: row;
		align-items: center;
	}

	.ts-grid--catalog .ts-card .ts-card__action.add_to_cart_button {
		width: auto;
		min-height: 40px;
	}

	/* «Детальніше» (немає в наявності) — квадрат зі стрілкою, як на головній. */
	.ts-grid--catalog .ts-card .ts-card__action.ts-btn--secondary {
		flex: 0 0 auto;
		width: 40px;
		min-width: 40px;
		padding-inline: 0;
	}

	.ts-grid--catalog .ts-card__action.ts-btn--secondary .ts-card__action-label {
		position: absolute;
		width: 1px;
		height: 1px;
		overflow: hidden;
		clip-path: inset(50%);
	}

	/*
	 * Знижка: стара ціна — рядком НАД поточною, як на телефоні. У рядок
	 * поруч вона у вузьких картках (188–248px) лягала під розкриту
	 * «Купити» або переносилась абияк. Нижній рядок — поточна ціна в
	 * 40px заввишки, по центру кнопки, тож без знижки нічого не змінюється.
	 * Стоїть після правил каталогу — ті ж ваги, перемагає порядок.
	 */
	.ts-card .ts-card__footer:has(> .ts-card__action) {
		align-items: flex-end;
	}

	.ts-card .ts-card__footer:has(> .ts-card__action) .ts-price {
		display: flex;
		flex-direction: column-reverse;
		align-items: flex-start;
		gap: 0;
	}

	.ts-card .ts-card__footer:has(> .ts-card__action) .ts-price__now {
		min-height: 40px;
		align-items: center;
	}

	/*
	 * «Детальніше» (немає в наявності) — квадрат 40px у потоці, тієї ж
	 * висоти, що й кругла «Купити»: так ціна стоїть по центру в обох
	 * картках. Раніше в цій картці ціна сідала нижче за інші в ряду.
	 */
	.ts-card .ts-card__footer > .ts-card__action.ts-btn--secondary {
		height: 40px;
		min-height: 40px;
	}

	/*
	 * Зовсім вузька картка (головна на екрані ~1280px — 188–206px): поруч
	 * із ціною «Купити» не вміщується й лягала на цифри, тож кнопка
	 * лишається круглою; спінер і галочка працюють як завжди. Ширину
	 * знає сама картка (container query), а не екран.
	 */
	.ts-card:has(.ts-card__action.add_to_cart_button) {
		container-type: inline-size;
	}

	@container (max-width: 212px) {
		.ts-card__action.add_to_cart_button .ts-card__action-label,
		.ts-card__action.add_to_cart_button:not(.added):hover .ts-card__action-label,
		.ts-card__action.add_to_cart_button:not(.added):focus-visible .ts-card__action-label,
		.ts-card__action.add_to_cart_button.loading .ts-card__action-label {
			max-width: 0;
			margin-left: 0;
			opacity: 0;
		}

		.ts-card__action.add_to_cart_button:not(.added):hover,
		.ts-card__action.add_to_cart_button:not(.added):focus-visible,
		.ts-card__action.add_to_cart_button.loading {
			padding-inline: 10px;
		}
	}

	/* Список каталогу лишається з широкою кнопкою: місця там удосталь. */
	.ts-list--catalog .ts-card__footer:has(> .add_to_cart_button) {
		min-height: 0;
		padding-right: 0;
	}

	.ts-list--catalog .ts-card__action.add_to_cart_button,
	.ts-list--catalog .ts-card__action.add_to_cart_button:not(.added):hover,
	.ts-list--catalog .ts-card__action.add_to_cart_button.loading {
		position: relative;
		right: auto;
		bottom: auto;
		gap: var(--ts-space-2);
		padding-inline: var(--ts-space-3);
		border-radius: var(--ts-radius-md);
	}

	.ts-list--catalog .ts-card__action.add_to_cart_button .ts-card__action-label,
	.ts-list--catalog .ts-card__action.add_to_cart_button:not(.added):hover .ts-card__action-label,
	.ts-list--catalog .ts-card__action.add_to_cart_button:not(.added):focus-visible .ts-card__action-label {
		max-width: none;
		margin: 0;
		opacity: 1;
	}
}

@media (prefers-reduced-motion: reduce) {
	.ts-card__action.loading .ts-card__action-icon::after {
		animation-duration: 2s;
	}

	.ts-card__action.add_to_cart_button .ts-card__action-label {
		transition: none;
	}
}

/* --- Поля вводу --------------------------------------------------------- */

.ts-input {
	width: 100%;
	min-height: 44px;
	padding: var(--ts-space-3);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border-strong);
	border-radius: var(--ts-radius-md);
	font-size: var(--ts-text-base);
	color: var(--ts-color-text);
	transition: border-color var(--ts-duration-fast) var(--ts-ease),
		box-shadow var(--ts-duration-fast) var(--ts-ease);
}

.ts-input::placeholder {
	color: var(--ts-color-faint);
}

.ts-input:focus {
	outline: none;
	border-color: var(--ts-color-primary);
	box-shadow: var(--ts-shadow-focus);
}

.ts-input[aria-invalid="true"] {
	border-color: var(--ts-color-danger);
}

.ts-field {
	display: flex;
	flex-direction: column;
	gap: var(--ts-space-2);
}

.ts-field__label {
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-medium);
	color: var(--ts-color-text);
}

.ts-field__error {
	font-size: var(--ts-text-xs);
	color: var(--ts-color-danger);
}

/* Під полем WooCommerce (телефон у checkout) — окремим рядком. */
.form-row > .ts-field__error:not([hidden]) {
	display: block;
	margin-top: var(--ts-space-1);
}

/* --- Чіпи вибраних фільтрів (ТЗ §10) ------------------------------------ */

.ts-chip {
	display: inline-flex;
	align-items: center;
	gap: var(--ts-space-2);
	padding: var(--ts-space-1) var(--ts-space-3);
	background: var(--ts-color-primary-soft);
	border: 1px solid transparent;
	border-radius: var(--ts-radius-full);
	font-size: var(--ts-text-xs);
	font-weight: var(--ts-weight-medium);
	color: var(--ts-color-primary);
}

.ts-chip__remove {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 16px;
	height: 16px;
	border-radius: var(--ts-radius-full);
	color: currentColor;
	opacity: 0.7;
}

.ts-chip__remove:hover {
	opacity: 1;
	background: rgba(11, 99, 246, 0.15);
}

/* --- Лічильник (міні-кошик) --------------------------------------------- */

.ts-count {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 18px;
	height: 18px;
	padding-inline: 5px;
	background: var(--ts-color-primary);
	color: #fff;
	border-radius: var(--ts-radius-full);
	font-size: var(--ts-text-2xs);
	font-weight: var(--ts-weight-bold);
	line-height: 1;
}

/* --- Порожні / завантажувальні стани (ТЗ §49) --------------------------- */

.ts-empty {
	padding: var(--ts-space-12) var(--ts-space-4);
	text-align: center;
	color: var(--ts-color-muted);
}

.ts-empty__title {
	font-size: var(--ts-text-lg);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
	margin-bottom: var(--ts-space-2);
}

.ts-skeleton {
	background: linear-gradient(
		90deg,
		var(--ts-color-surface-sunken) 25%,
		#eaeef4 37%,
		var(--ts-color-surface-sunken) 63%
	);
	background-size: 400% 100%;
	border-radius: var(--ts-radius-sm);
	animation: ts-shimmer 1.4s ease infinite;
}

@keyframes ts-shimmer {
	0% {
		background-position: 100% 50%;
	}
	100% {
		background-position: 0 50%;
	}
}

@media (prefers-reduced-motion: reduce) {
	.ts-skeleton {
		animation: none;
	}
}

/* ==========================================================================
   Картка товару на телефоні (до 559px)

   Обидва режими — в одну колонку, як у x-kom. Різниця в орієнтації:
   - сітка  → вертикальна картка: велике фото зверху, дані під ним;
   - список → горизонтальна: фото ліворуч, дані праворуч.
   Перемикач лишається доступним, бо обидва режими тут доречні.
   ========================================================================== */

@media (max-width: 559px) {

	/* --- Спільне для обох режимів --------------------------------------- */

	/*
	 * Кнопка отримує текст і повну ширину замість іконки 44×44:
	 * іконка без підпису — і погана ціль для пальця, і незрозуміла дія.
	 */
	.ts-card__action {
		flex: 1 1 auto;
		min-width: 0;
		min-height: 44px;
	}

	/*
	 * Підпис — .ts-card__action-label (раніше тут стояв .ts-visually-hidden,
	 * якого в розмітці кнопки давно немає, і на телефоні лишалась сама
	 * іконка на всю ширину).
	 */
	.ts-card__action .ts-card__action-label {
		position: static;
		width: auto;
		height: auto;
		margin: 0;
		overflow: visible;
		clip-path: none;
		white-space: nowrap;
	}

	/*
	 * На головній і у вітринах — компактна «Купити» за розміром вмісту,
	 * скруглена, як на комп'ютері, притиснута праворуч. На всю ширину
	 * поруч із ціною вона була важчою за сам товар. Висота 44px — під
	 * палець. У каталозі кнопка лишається широкою.
	 */
	.ts-grid--home .ts-card__action.add_to_cart_button,
	.ts-showcase .ts-card__action.add_to_cart_button {
		flex: 0 0 auto;
		margin-left: auto;
		padding-inline: var(--ts-space-4);
		border-radius: var(--ts-radius-full);
	}

	/*
	 * Стара ціна — НАД поточною, а не поруч.
	 * У рядок вона з'їдала ширину, яку краще віддати кнопці:
	 * "58 537 ₴  66 519 ₴  [В кошик]" не вміщувалось нормально.
	 */
	.ts-card__footer .ts-price {
		flex: none;
		flex-direction: column-reverse; /* old іде першим у розмітці знизу */
		align-items: flex-start;
		gap: 0;
	}

	.ts-card__footer .ts-price__old {
		font-size: var(--ts-text-xs);
		line-height: 1.2;
	}

	/* Статус наявності не має розриватися на два рядки */
	.ts-card .ts-stock {
		font-size: var(--ts-text-xs);
		align-items: flex-start;
	}

	.ts-card .ts-stock::before {
		/* Крапка вирівнюється по першому рядку тексту, а не по центру блоку */
		margin-top: 5px;
	}

	/* Код товару в списку зайвий — він є на сторінці товару */
	.ts-card__sku {
		display: none;
	}

	/* --- Режим сітки: вертикальна картка з великим фото ------------------ */

	.ts-grid--catalog .ts-card__media {
		/* Фото на всю ширину картки — головна перевага цього режиму */
		aspect-ratio: 4 / 3;
	}

	.ts-grid--catalog .ts-card__title {
		font-size: var(--ts-text-md);
		--ts-clamp-lines: 2;
		min-height: calc(var(--ts-text-md) * var(--ts-leading-snug) * 2);
	}

	/* --- Режим списку: горизонтальна картка ------------------------------ */

	/*
	 * Колонка фото — 33% ширини картки, як у x-kom.
	 *
	 * Саме частка, а не фіксовані пікселі: 116px давали 39% на 320px
	 * і лише 27% на 480px — розкладка "пливла" між пристроями.
	 *
	 * Відсоток у grid рахується від content-box, тобто без padding і
	 * gap. Щоб на екрані вийшла справжня третина картки, додаємо
	 * їхню частку назад: 33% від (padding*2 + gap) = 33% * 36px.
	 */
	.ts-list--catalog .ts-card {
		grid-template-columns: calc(33% + 12px) minmax(0, 1fr);
		grid-template-rows: auto auto;
		gap: var(--ts-space-3);
		align-items: start;
		padding: var(--ts-space-3);
	}

	.ts-list--catalog .ts-card__media {
		grid-column: 1;
		grid-row: 1;
		margin-bottom: 0;
		aspect-ratio: 1 / 1;
	}

	.ts-list--catalog .ts-card__body {
		grid-column: 2;
		grid-row: 1;
	}

	/* Підвал на всю ширину під обома колонками */
	.ts-list--catalog .ts-card__footer {
		grid-column: 1 / -1;
		grid-row: 2;
		align-items: center;
		gap: var(--ts-space-3);
	}

	/* Праворуч місця менше — назва може зайняти три рядки */
	.ts-list--catalog .ts-card__title {
		--ts-clamp-lines: 3;
		min-height: 0;
	}
}

/* Зовсім вузькі екрани (320–359px): ціна над кнопкою */
@media (max-width: 359px) {
	.ts-card__footer {
		flex-direction: column;
		align-items: stretch;
	}

	.ts-card__action {
		width: 100%;
	}
}

/* --- Шухляда кошика -------------------------------------------------------- */

.ts-cart-drawer {
	width: min(92vw, 420px);
}

.ts-cart-drawer__title {
	display: flex;
	align-items: center;
	gap: var(--ts-space-2);
}

/* Зелений — лише коли це підтвердження додавання. */
.ts-cart-drawer__title:has(.ts-cart-drawer__check:not([hidden])) {
	color: var(--ts-color-success);
}

.ts-cart-drawer__body {
	display: flex;
	flex: 1 1 auto;
	flex-direction: column;
	min-height: 0;
	padding: 0;
}

.ts-cart-drawer__items {
	flex: 1 1 auto;
	margin: 0;
	padding: 0 var(--ts-space-4);
	overflow-y: auto;
	/* Інерційний скрол на iOS, інакше список «залипає». */
	-webkit-overflow-scrolling: touch;
	overscroll-behavior: contain;
	list-style: none;
}

.ts-cart-drawer__item {
	display: flex;
	align-items: flex-start;
	gap: var(--ts-space-3);
	padding: var(--ts-space-4) 0;
}

.ts-cart-drawer__item + .ts-cart-drawer__item {
	border-top: 1px solid var(--ts-color-border);
}

.ts-cart-drawer__thumb {
	flex: 0 0 auto;
	width: 64px;
	aspect-ratio: 1 / 1;
	overflow: hidden;
	border-radius: var(--ts-radius-md);
}

.ts-cart-drawer__thumb img {
	width: 100%;
	height: 100%;
	object-fit: contain;
	mix-blend-mode: multiply;
}

.ts-cart-drawer__info {
	display: flex;
	flex: 1 1 auto;
	flex-direction: column;
	gap: var(--ts-space-1);
	min-width: 0;
}

.ts-cart-drawer__name {
	font-size: var(--ts-text-sm);
	line-height: var(--ts-leading-snug);
	color: var(--ts-color-text-strong);
}

.ts-cart-drawer__name:hover {
	color: var(--ts-color-primary);
	text-decoration: none;
}

.ts-cart-drawer__meta {
	font-size: var(--ts-text-xs);
	color: var(--ts-color-muted);
}

.ts-cart-drawer__side {
	display: flex;
	flex: 0 0 auto;
	flex-direction: column;
	align-items: flex-end;
	gap: var(--ts-space-2);
}

.ts-cart-drawer__price {
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-semibold);
	font-variant-numeric: tabular-nums;
	white-space: nowrap;
	color: var(--ts-color-text-strong);
}

.ts-cart-drawer__remove {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 28px;
	height: 28px;
	border-radius: var(--ts-radius-sm);
	color: var(--ts-color-faint);
}

.ts-cart-drawer__remove:hover {
	background: var(--ts-color-danger-soft);
	color: var(--ts-color-danger);
	text-decoration: none;
}

/* --- Рекомендації в шухляді ----------------------------------------------- */

/*
 * Стоять між списком і підвалом, поза зоною прокрутки: сенс блоку в
 * тому, щоб його побачили, а прокручений донизу список ховав би його
 * від тих, у кого в кошику більше двох позицій.
 *
 * Розмітку дає плагін контенту (Cart_Picks_Renderer), тож класи
 * ts-cart-picks__* мають лишатися синхронними з ним.
 */
.ts-cart-picks {
	flex: 0 0 auto;
	padding: var(--ts-space-4);
	border-top: 1px solid var(--ts-color-border);
	background: var(--ts-color-surface-sunken);
}

.ts-cart-picks__title {
	margin: 0 0 var(--ts-space-3);
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

.ts-cart-picks__list {
	display: flex;
	flex-direction: column;
	gap: var(--ts-space-2);
	margin: 0;
	padding: 0;
	list-style: none;
}

/*
 * Рядок, а не плитка: у шухляді 380px три плитки поруч дали б
 * картинку 90px і назву в один обрізаний рядок.
 */
.ts-cart-picks__item {
	display: grid;
	grid-template-columns: 40px minmax(0, 1fr) auto auto;
	align-items: center;
	gap: var(--ts-space-2);
	padding: var(--ts-space-2);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-md);
}

.ts-cart-picks__link {
	display: contents;
	color: inherit;
}

.ts-cart-picks__link:hover .ts-cart-picks__name {
	color: var(--ts-color-primary);
}

.ts-cart-picks__media {
	width: 40px;
	aspect-ratio: 1 / 1;
	overflow: hidden;
	border-radius: var(--ts-radius-sm);
}

.ts-cart-picks__media img {
	width: 100%;
	height: 100%;
	object-fit: contain;
	mix-blend-mode: multiply;
}

.ts-cart-picks__name {
	display: -webkit-box;
	-webkit-box-orient: vertical;
	-webkit-line-clamp: 2;
	overflow: hidden;
	font-size: var(--ts-text-xs);
	line-height: var(--ts-leading-snug);
	color: var(--ts-color-text);
}

/*
 * Ціна над кнопкою в одній комірці, а не двома рядками сітки: інакше
 * кожна картка ставала на рядок вищою, і три рекомендації з'їдали
 * половину шухляди.
 */
.ts-cart-picks__price {
	grid-column: 3;
	grid-row: 1;
	font-size: var(--ts-text-xs);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
	white-space: nowrap;
	text-align: right;
}

/* Стару ціну в шухляді не показуємо — місця на неї немає. */
.ts-cart-picks__price del {
	display: none;
}

.ts-cart-picks__form {
	grid-column: 4;
	grid-row: 1;
	margin: 0;
}

.ts-cart-picks__add {
	min-height: 32px;
	padding-inline: var(--ts-space-3);
	font-size: var(--ts-text-2xs);
	white-space: nowrap;
}

/* Підвал липне до низу шухляди — CTA завжди на очах. */
.ts-cart-drawer__foot {
	flex: 0 0 auto;
	padding: var(--ts-space-4);
	background: var(--ts-color-surface);
	border-top: 1px solid var(--ts-color-border);
	/* Щоб кнопка не лізла під домашню смугу iPhone. */
	padding-bottom: calc(var(--ts-space-4) + env(safe-area-inset-bottom));
}

.ts-cart-drawer__total {
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	gap: var(--ts-space-3);
	margin-bottom: var(--ts-space-4);
	color: var(--ts-color-muted);
}

.ts-cart-drawer__total strong {
	font-size: var(--ts-text-lg);
	color: var(--ts-color-text-strong);
}

.ts-cart-drawer__continue {
	display: block;
	width: 100%;
	margin-top: var(--ts-space-3);
	/* 44px — мінімальна зручна ціль для пальця. */
	min-height: 44px;
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
	background: none;
	border: 0;
	cursor: pointer;
}

.ts-cart-drawer__continue:hover {
	color: var(--ts-color-primary);
}

.ts-cart-drawer__empty {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: var(--ts-space-4);
	padding: var(--ts-space-8) var(--ts-space-4);
	text-align: center;
	color: var(--ts-color-muted);
}

/* Поки товар летить у кошик — приглушуємо кнопку. */
.is-busy {
	opacity: 0.6;
	pointer-events: none;
}

.ts-cart-drawer__check[hidden] {
	display: none;
}

.ts-cart-drawer__check {
	display: inline-flex;
}

/* --- Обране й рейтинг у картці ------------------------------------------ */

/*
 * Серце в куті фото, як у макеті. Напівпрозоре біле коло: на світлих
 * знімках сама іконка без підкладки зникає.
 */
.ts-card__wish {
	position: absolute;
	top: var(--ts-space-2);
	right: var(--ts-space-2);
	z-index: 2;
	display: grid;
	place-items: center;
	width: 34px;
	height: 34px;
	padding: 0;
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-full);
	background: rgba(255, 255, 255, 0.92);
	color: var(--ts-color-muted);
	cursor: pointer;
	transition: color var(--ts-duration-fast) var(--ts-ease),
		border-color var(--ts-duration-fast) var(--ts-ease);
}

.ts-card__wish:hover {
	color: var(--ts-color-danger, #e11d48);
	border-color: var(--ts-color-danger, #e11d48);
}

/* Заповнене серце — товар уже в списку. */
.ts-card__wish.is-on {
	color: var(--ts-color-danger, #e11d48);
	border-color: var(--ts-color-danger, #e11d48);
}

.ts-card__wish.is-on .ts-icon {
	fill: currentColor;
}

.ts-card__rating {
	display: flex;
	align-items: center;
	gap: var(--ts-space-1);
	font-size: var(--ts-text-sm);
}

.ts-card__rating-star {
	display: inline-flex;
	color: #f5a524;
}

.ts-card__rating-star .ts-icon {
	fill: currentColor;
	stroke: none;
}

.ts-card__rating-value {
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

.ts-card__rating-count {
	color: var(--ts-color-faint);
}

/* --- Картка в каталозі з фільтрами --------------------------------------- */

/*
 * Зміни нижче стосуються лише сторінок каталогу (.ts-grid--catalog).
 * На головній картка лишається як була: там вітрина, де ряд синіх
 * плашок перетягував би увагу з товарів на кнопки.
 *
 * У каталозі інакше — людина вже обрала розділ, відфільтрувала й
 * порівнює конкретні позиції. Тут головна дія має бути названа
 * словом і помітна.
 */

/* Напис на кнопці ховаємо скрізь, крім каталогу. */
.ts-card__action-label {
	position: absolute;
	width: 1px;
	height: 1px;
	margin: -1px;
	padding: 0;
	overflow: hidden;
	clip-path: inset(50%);
	white-space: nowrap;
}

/*
 * Список каталогу — та сама сторінка, інший вигляд картки, тож
 * підпис на кнопці потрібен і там. Місця в ньому навіть більше:
 * підвал іде на всю ширину під фото й текстом.
 */
.ts-grid--catalog .ts-card__action-label,
.ts-list--catalog .ts-card__action-label {
	position: static;
	width: auto;
	height: auto;
	margin: 0;
	overflow: visible;
	clip-path: none;
	font-size: var(--ts-text-sm);
}

/*
 * Підвал у два рядки: ціна зверху на всю ширину, кнопка під нею.
 *
 * Ціна й кнопка в один рядок тиснули одна одну — у сітці по чотири
 * картки на «5 293₴» і кнопку з написом разом лишається менше 200px,
 * і кнопка з'їжджала в два рядки або обрізалась.
 */
.ts-grid--catalog .ts-card__footer {
	flex-direction: column;
	align-items: stretch;
	gap: var(--ts-space-2);
}

.ts-grid--catalog .ts-card__footer .ts-price {
	display: flex;
	align-items: baseline;
	flex-wrap: wrap;
	gap: var(--ts-space-2);
}

.ts-grid--catalog .ts-card__action {
	justify-content: center;
	width: 100%;
	min-height: 40px;
}

.ts-grid--catalog .ts-card__action.ts-btn--primary,
.ts-list--catalog .ts-card__action.ts-btn--primary {
	background: var(--ts-color-primary);
	color: var(--ts-color-primary-contrast);
	border-color: var(--ts-color-primary);
}

.ts-grid--catalog .ts-card__action.ts-btn--primary:hover,
.ts-grid--catalog .ts-card__action.ts-btn--primary:focus-visible {
	background: var(--ts-color-primary-hover);
	border-color: var(--ts-color-primary-hover);
}

/*
 * Телефон, каталог: ціна й компактна «Купити» в один рядок в обох режимах,
 * як на головній. На всю ширину кнопка була важчою за сам товар, а в сітці
 * ще й стояла під ціною. Висота 44px — під палець.
 */
@media (max-width: 559px) {
	.ts-grid--catalog .ts-card .ts-card__footer,
	.ts-list--catalog .ts-card .ts-card__footer {
		flex-direction: row;
		align-items: center;
		justify-content: space-between;
	}

	.ts-grid--catalog .ts-card .ts-card__action,
	.ts-list--catalog .ts-card .ts-card__action {
		flex: 0 0 auto;
		width: auto;
		min-height: 44px;
		margin-left: auto;
		padding-inline: var(--ts-space-4);
		border-radius: var(--ts-radius-full);
	}
}

/* --- Характеристики з іконками ------------------------------------------ */

/*
 * Бренд і код товару в один рядок: обидва службові, і окремий рядок
 * під код відтісняв характеристики вниз картки.
 */
.ts-card__meta {
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	gap: var(--ts-space-2);
}

.ts-card__meta .ts-card__sku {
	flex: 0 1 auto;
	min-width: 0;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	font-variant-numeric: tabular-nums;
}

/*
 * Іконка замість підпису. Підпис («Об'єм:», «Інтерфейс:») з'їдав
 * піврядка на слово, зрозуміле зі значення, і довгі назви на кшталт
 * «Швидкість обертання шпинделя» витісняли саме значення.
 */
.ts-card__spec-icon {
	display: inline-flex;
	flex: 0 0 auto;
	color: var(--ts-color-faint);
}

.ts-card__spec {
	align-items: center;
	gap: var(--ts-space-2);
}

.ts-card__spec-value {
	color: var(--ts-color-text);
}

/*
 * Характеристики трохи більші: 12px поруч із назвою товару читались
 * як дрібний підпис, хоча саме за ними порівнюють товари в каталозі.
 */
.ts-card__specs {
	font-size: var(--ts-text-sm);
	line-height: 1.5;
	gap: var(--ts-space-1);
}

/* --- Рейтинг одразу під назвою ------------------------------------------- */

/*
 * Оцінка працює як аргумент «беруть інші», тож стоїть поруч із
 * назвою, а не в кінці картки під наявністю.
 *
 * Переставляємо через order, бо в розмітці рейтинг іде останнім:
 * WooCommerce збирає тіло картки в тому порядку, у якому дані
 * приходять, і зачіпати це в шаблоні заради вигляду не варто.
 */
.ts-card__body {
	/* Явні номери, бо order рахується від усіх дітей одразу. */
	--ts-order-meta: 1;
	--ts-order-title: 2;
	--ts-order-rating: 3;
	--ts-order-specs: 4;
	--ts-order-stock: 5;
}

.ts-card__meta {
	order: var(--ts-order-meta);
}

.ts-card__title {
	order: var(--ts-order-title);
}

.ts-card__rating {
	order: var(--ts-order-rating);
}

.ts-card__specs {
	order: var(--ts-order-specs);
}

.ts-card__body .ts-stock {
	order: var(--ts-order-stock);
}

/*
 * «Детальніше»: стрілка праворуч від підпису.
 *
 * Стрілка означає перехід далі, тож стоїть після тексту — як у
 * посиланнях «Переглянути всі товари» на головній. У «Купити»
 * іконка кошика лишається ліворуч: там вона позначає дію, а не
 * напрямок.
 *
 * Перевертаємо порядком, а не в розмітці: та сама кнопка на головній
 * показує лише іконку, і там порядок ні на що не впливає.
 */
.ts-grid--catalog .ts-card__action.ts-btn--secondary .ts-icon,
.ts-list--catalog .ts-card__action.ts-btn--secondary .ts-icon {
	order: 2;
}

/*
 * Ціль для пальця — 44px (правило мобільної верстки), хоча самі кнопки
 * дрібніші: хрестик смуги оголошень, «Скопіювати» біля коду товару,
 * перемикач «сіткою / списком», обране й порівняння в картці, стрілки
 * банера й галереї, підказки. Невидима зона довкола кнопки замість
 * збільшення самої кнопки — вигляд лишається тим самим.
 */
@media (pointer: coarse) {
	.ts-topbar__close,
	.ts-copy,
	.ts-viewbtn,
	.ts-tip__btn {
		position: relative;
	}

	.ts-topbar__close::after,
	.ts-copy::after,
	.ts-viewbtn::after,
	.ts-tip__btn::after,
	.ts-card__wish::after,
	.ts-card__compare::after,
	.ts-hero__arrow::after,
	.ts-gallery__nav::after {
		content: "";
		position: absolute;
		top: 50%;
		left: 50%;
		width: 44px;
		height: 44px;
		transform: translate(-50%, -50%);
	}

	/* Невидима зона тут не працює: сусіди або overflow її обрізають. */
	body .ts-viewbtn {
		width: 44px;
	}

	body .ts-qty__btn {
		width: 40px;
		height: 44px;
	}

	.ts-dropdown__option {
		min-height: 44px;
	}

	.ts-tabs--pill .ts-tabs__item {
		min-height: 44px;
	}

	.ts-home__head .ts-section__more {
		padding-block: 12px;
		margin-block: -12px;
	}
}

/* ==========================================================================
   Плаваюча кнопка контактів (template-parts/common/contact-fab.php)
   ========================================================================== */

.ts-fab {
	--ts-fab-offset: var(--ts-space-6);

	position: fixed;
	z-index: calc(var(--ts-z-header) + 10);
	right: var(--ts-fab-offset);
	bottom: calc(var(--ts-fab-offset) + env(safe-area-inset-bottom, 0px));
	display: flex;
	flex-direction: column;
	align-items: flex-end;
	gap: var(--ts-space-3);
	pointer-events: none;
}

.ts-fab > * {
	pointer-events: auto;
}

/* --- Кнопка ----------------------------------------------------------- */

.ts-fab__btn {
	position: relative;
	display: grid;
	place-items: center;
	width: 60px;
	height: 60px;
	padding: 0;
	color: var(--ts-color-primary-contrast);
	background: var(--ts-color-primary);
	border: 0;
	border-radius: var(--ts-radius-full);
	box-shadow: 0 10px 24px rgba(11, 99, 246, 0.35), 0 2px 6px rgba(10, 37, 64, 0.15);
	cursor: pointer;
	transition: transform var(--ts-duration-fast) var(--ts-ease), background-color var(--ts-duration-fast) var(--ts-ease);
}

.ts-fab__btn:hover {
	background: var(--ts-color-primary-hover);
	transform: translateY(-2px);
}

.ts-fab__btn:focus-visible {
	outline: 3px solid var(--ts-color-primary-soft);
	outline-offset: 3px;
}

/*
 * Хвиля довкола кнопки — двічі після завантаження, щоб помітили, і
 * більше не смикає. Без анімацій для тих, хто їх вимкнув.
 */
.ts-fab__btn::before {
	content: "";
	position: absolute;
	inset: 0;
	border-radius: inherit;
	box-shadow: 0 0 0 0 rgba(11, 99, 246, 0.45);
	animation: ts-fab-pulse 2.4s var(--ts-ease) 1.5s 2;
}

@keyframes ts-fab-pulse {
	0% {
		box-shadow: 0 0 0 0 rgba(11, 99, 246, 0.45);
	}

	70%,
	100% {
		box-shadow: 0 0 0 18px rgba(11, 99, 246, 0);
	}
}

.ts-fab__btn-icon {
	grid-area: 1 / 1;
	display: grid;
	place-items: center;
	transition: transform var(--ts-duration-base) var(--ts-ease), opacity var(--ts-duration-fast) var(--ts-ease);
}

.ts-fab__btn-icon--close {
	opacity: 0;
	transform: rotate(-90deg) scale(0.6);
}

.ts-fab.is-open .ts-fab__btn-icon--open {
	opacity: 0;
	transform: rotate(90deg) scale(0.6);
}

.ts-fab.is-open .ts-fab__btn-icon--close {
	opacity: 1;
	transform: none;
}

/* --- Панель ------------------------------------------------------------ */

.ts-fab__panel {
	width: min(320px, calc(100vw - 2 * var(--ts-fab-offset)));
	padding: var(--ts-space-3);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-xl);
	box-shadow: var(--ts-shadow-lg);
	transform-origin: bottom right;
	animation: ts-fab-in var(--ts-duration-base) var(--ts-ease);
}

.ts-fab__panel[hidden] {
	display: none;
}

@keyframes ts-fab-in {
	from {
		opacity: 0;
		transform: translateY(8px) scale(0.96);
	}

	to {
		opacity: 1;
		transform: none;
	}
}

.ts-fab__head {
	padding: var(--ts-space-2) var(--ts-space-3) var(--ts-space-3);
	border-bottom: 1px solid var(--ts-color-border);
	margin-bottom: var(--ts-space-2);
}

.ts-fab__title {
	margin: 0;
	font-size: var(--ts-text-md);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

.ts-fab__hours {
	margin: 2px 0 0;
	font-size: var(--ts-text-xs);
	color: var(--ts-color-muted);
}

.ts-fab__list {
	display: flex;
	flex-direction: column;
	gap: 2px;
	margin: 0;
	padding: 0;
	list-style: none;
}

.ts-fab__item {
	display: flex;
	align-items: center;
	gap: var(--ts-space-3);
	width: 100%;
	min-height: 56px;
	padding: var(--ts-space-2) var(--ts-space-3);
	font: inherit;
	text-align: left;
	color: var(--ts-color-text);
	background: transparent;
	border: 0;
	border-radius: var(--ts-radius-lg);
	cursor: pointer;
	transition: background-color var(--ts-duration-fast) var(--ts-ease);
}

.ts-fab__item:hover,
.ts-fab__item:focus-visible {
	color: var(--ts-color-text);
	background: var(--ts-color-surface-hover);
	text-decoration: none;
}

.ts-fab__item:focus-visible {
	outline: 2px solid var(--ts-color-border-focus);
	outline-offset: -2px;
}

/* Кружок 40px: логотипи месенджерів уже круглі, для решти — свій колір. */
.ts-fab__icon {
	flex: none;
	display: grid;
	place-items: center;
	width: 40px;
	height: 40px;
	color: #fff;
	border-radius: var(--ts-radius-full);
	transition: transform var(--ts-duration-fast) var(--ts-ease);
}

.ts-fab__icon img {
	display: block;
	width: 40px;
	height: 40px;
}

.ts-fab__item:hover .ts-fab__icon {
	transform: scale(1.06);
}

.ts-fab__item--phone .ts-fab__icon {
	background: var(--ts-color-success);
}

.ts-fab__item--email .ts-fab__icon {
	background: #f59e0b;
}

.ts-fab__item--callback .ts-fab__icon {
	background: var(--ts-color-primary);
}

.ts-fab__text {
	display: flex;
	flex-direction: column;
	min-width: 0;
	gap: 1px;
}

.ts-fab__label {
	font-size: var(--ts-text-base);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

.ts-fab__sub {
	font-size: var(--ts-text-xs);
	color: var(--ts-color-muted);
	font-variant-numeric: tabular-nums;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

/* «Замовити дзвінок» — головна дія: відокремлена й підсвічена. */
.ts-fab__item--callback {
	margin-top: var(--ts-space-2);
	background: var(--ts-color-primary-soft);
}

.ts-fab__item--callback:hover,
.ts-fab__item--callback:focus-visible {
	background: #dce8fd;
}

.ts-fab__item--callback .ts-fab__label {
	color: var(--ts-color-primary);
}

.ts-callback__lead {
	margin: 0 0 var(--ts-space-4);
	font-size: var(--ts-text-base);
	color: var(--ts-color-muted);
	line-height: var(--ts-leading-relaxed);
}

/*
 * Телефон: над нижньою панеллю навігації (60px), а на картці товару,
 * коли видно липку панель купівлі, — ще вище, щоб не накривати
 * «Додати в кошик».
 */
@media (max-width: 1023px) {
	.ts-fab {
		--ts-fab-offset: var(--ts-space-4);

		bottom: calc(60px + var(--ts-space-4) + env(safe-area-inset-bottom, 0px));
	}

	.ts-fab__btn {
		width: 52px;
		height: 52px;
	}

	body:has(.ts-sticky-buy.is-visible) .ts-fab {
		bottom: calc(60px + 86px + var(--ts-space-3) + env(safe-area-inset-bottom, 0px));
	}

	/*
	 * Відкрита панель — по ширині екрана, як лист. Межі — left/right
	 * самого блоку, а не 100vw: у 100vw входить смуга прокрутки, і
	 * панель стояла несиметрично.
	 */
	.ts-fab {
		left: var(--ts-fab-offset);
	}

	.ts-fab__panel {
		width: 100%;
		max-height: calc(100vh - 170px);
		max-height: calc(100dvh - 170px);
		overflow-y: auto;
		overscroll-behavior: contain;
	}
}

/*
 * Невисокий екран (iPhone SE): компактні пункти без номерів і без
 * заголовка — інакше «Замовити дзвінок» ховався за прокруткою.
 */
@media (max-width: 1023px) and (max-height: 700px) {
	.ts-fab__head,
	.ts-fab__sub {
		display: none;
	}

	.ts-fab__item {
		min-height: 48px;
	}

	.ts-fab__icon,
	.ts-fab__icon img {
		width: 34px;
		height: 34px;
	}
}

/* Телефон боком: висоти мало — пункти у дві колонки. */
@media (max-width: 1023px) and (max-height: 500px) {
	.ts-fab__list {
		display: grid;
		grid-template-columns: repeat(2, minmax(0, 1fr));
	}

	.ts-fab__item--callback {
		margin-top: 0;
	}

	.ts-fab__head {
		display: none;
	}
}

@media (prefers-reduced-motion: reduce) {
	.ts-fab__btn::before,
	.ts-fab__panel {
		animation: none;
	}
}

/* ==========================================================================
   TopShop — Header
   Два яруси (ТЗ §24): лого + великий пошук + дії; нижче — навігація.
   Слот міні-кошика закладено одразу (ТЗ §30).
   ========================================================================== */

.ts-header {
	position: sticky;
	top: 0;
	z-index: var(--ts-z-header);
	background: var(--ts-color-surface);
}

/* --- Верхній ярус ------------------------------------------------------- */

/*
 * Верхній ярус — окремим шаром над мегаменю. Інакше при відкритому
 * каталозі панелі кошика, акаунта, телефонів і підказки пошуку
 * (--ts-z-dropdown) ховались під ним (--ts-z-megamenu). Порядок панелей
 * між собою лишається всередині цього шару.
 */
.ts-header__main {
	position: relative;
	z-index: calc(var(--ts-z-megamenu) + 1);
	display: flex;
	align-items: center;
	gap: var(--ts-space-4);
	padding-block: var(--ts-space-3);
}

.ts-logo {
	flex: none;
	display: inline-flex;
	align-items: center;
	gap: var(--ts-space-2);
	font-size: var(--ts-text-xl);
	font-weight: var(--ts-weight-bold);
	letter-spacing: var(--ts-tracking-tight);
	color: var(--ts-color-text-strong);
}

.ts-logo:hover {
	text-decoration: none;
}

.ts-logo__mark {
	color: var(--ts-color-primary);
}

/* --- Пошук — головний елемент хедера (ТЗ §12) --------------------------- */

.ts-search {
	position: relative;
	flex: 1 1 auto;
	max-width: 720px;
}

.ts-search__form {
	display: flex;
	align-items: center;
	background: var(--ts-color-surface-sunken);
	border: 1px solid transparent;
	border-radius: var(--ts-radius-md);
	transition: border-color var(--ts-duration-fast) var(--ts-ease),
		background-color var(--ts-duration-fast) var(--ts-ease),
		box-shadow var(--ts-duration-fast) var(--ts-ease);
}

.ts-search__form:focus-within {
	background: var(--ts-color-surface);
	border-color: var(--ts-color-primary);
	box-shadow: var(--ts-shadow-focus);
}

.ts-search__input {
	flex: 1 1 auto;
	min-width: 0;
	min-height: 44px;
	padding: var(--ts-space-3) var(--ts-space-4);
	background: transparent;
	border: 0;
	font-size: var(--ts-text-base);
	color: var(--ts-color-text);
}

.ts-search__input:focus {
	outline: none;
}

.ts-search__input::placeholder {
	color: var(--ts-color-faint);
}

/*
 * На телефоні підказка дрібніша за сам ввід. Саме поле мусить
 * лишатися 16px — менший шрифт змушує iOS зумити сторінку при
 * фокусі, — але підказка з цим розміром виглядала як готовий
 * текст і майже впиралася в кнопку пошуку.
 */

/* Прибираємо нативний хрестик Chrome — маємо власний */
.ts-search__input::-webkit-search-cancel-button {
	display: none;
}

/*
 * Хрестик очищення. Вужчий за кнопку пошуку (36px проти 44px), щоб не
 * читався як другий рівноцінний елемент керування, але лишався в межах
 * зручного влучання пальцем разом із падингом поля.
 */
.ts-search__reset {
	flex: none;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 36px;
	height: 36px;
	color: var(--ts-color-faint);
	background: none;
	border: 0;
	border-radius: var(--ts-radius-full, 999px);
	cursor: pointer;
}

.ts-search__reset[hidden] {
	display: none;
}

.ts-search__reset:hover {
	color: var(--ts-color-text);
	background: var(--ts-color-surface-sunken);
}

.ts-search__form:focus-within .ts-search__reset:hover {
	background: var(--ts-color-border-subtle, rgba(0, 0, 0, 0.06));
}

.ts-search__submit {
	flex: none;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 44px;
	height: 44px;
	color: var(--ts-color-muted);
	border-radius: var(--ts-radius-md);
}

.ts-search__submit:hover {
	color: var(--ts-color-primary);
}

/* --- Autocomplete (ТЗ §12) ---------------------------------------------- */

.ts-search__results {
	position: absolute;
	top: calc(100% + var(--ts-space-2));
	left: 0;
	right: 0;
	z-index: var(--ts-z-dropdown);
	max-height: min(60vh, 520px);
	overflow-y: auto;
	/* Кінець списку не має штовхати сторінку під ним. */
	overscroll-behavior: contain;
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
	box-shadow: var(--ts-shadow-lg);
}

.ts-search__results[hidden] {
	display: none;
}

/*
 * Десктоп: панель не прив'язана до ширини поля. Поле на широкому
 * екрані — лише ~550px (праворуч кнопки з підписами), і в дві колонки
 * назви товарів обривались на «Відеокарта...». Панель їде праворуч
 * поверх кнопок шапки — вона й так перекриває вміст під собою.
 * 100vw − 400px — щоб на 1024–1279 не вийти за правий край.
 */
@media (min-width: 1024px) {
	.ts-search__results {
		right: auto;
		width: max(100%, min(860px, calc(100vw - 400px)));
	}
}

@media (max-width: 767px) {
	/*
	 * Поле пошуку вузьке (ліворуч логотип, праворуч кнопки), і підказки
	 * в його ширину ламали назви товарів на три рядки. Розтягуємо панель
	 * на весь екран — вона й так перекриває вміст.
	 */
	.ts-search__results {
		/*
		 * Прив'язка до лівого краю екрана, а не до центра поля: поле
		 * зміщене (ліворуч логотип, праворуч кнопки), тому центрування
		 * по ньому виносило панель за правий край і давало
		 * горизонтальний скрол.
		 */
		left: calc(-1 * var(--ts-search-offset, 0px));
		right: auto;
		/* Без смуги прокрутки (main.js, Search.syncOffset); 100dvw — запасний. */
		width: var(--ts-search-vw, 100dvw);
		max-width: var(--ts-search-vw, 100dvw);
		border-left: 0;
		border-right: 0;
		border-radius: 0;
	}
}

.ts-suggest {
	display: flex;
	align-items: center;
	gap: var(--ts-space-3);
	padding: var(--ts-space-3) var(--ts-space-4);
	color: var(--ts-color-text);
	border-bottom: 1px solid var(--ts-color-border);
}

.ts-suggest:last-child {
	border-bottom: 0;
}

/* Підсвітка при наведенні І при клавіатурній навігації — один стиль */
.ts-suggest:hover,
.ts-suggest[aria-selected="true"] {
	background: var(--ts-color-surface-sunken);
	text-decoration: none;
}

.ts-suggest__media {
	flex: none;
	width: 44px;
	height: 44px;
	object-fit: contain;
	mix-blend-mode: multiply;
}

.ts-suggest__body {
	flex: 1 1 auto;
	min-width: 0;
}

.ts-suggest__title {
	font-size: var(--ts-text-sm);
	line-height: var(--ts-leading-snug);
	--ts-clamp-lines: 1;
}

.ts-suggest__meta {
	font-size: var(--ts-text-2xs);
	color: var(--ts-color-faint);
}

.ts-suggest__price {
	flex: none;
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
	white-space: nowrap;
}

.ts-search__all {
	display: block;
	padding: var(--ts-space-3) var(--ts-space-4);
	text-align: center;
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-primary);
	background: var(--ts-color-surface-sunken);
}

.ts-search__state {
	padding: var(--ts-space-6) var(--ts-space-4);
	text-align: center;
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
}

/* --- Дії справа: телефон, обране, кошик --------------------------------- */

.ts-header__actions {
	flex: none;
	display: flex;
	align-items: center;
	gap: var(--ts-space-1);
}

.ts-action {
	display: inline-flex;
	align-items: center;
	gap: var(--ts-space-2);
	padding: var(--ts-space-2) var(--ts-space-3);
	border-radius: var(--ts-radius-md);
	color: var(--ts-color-text);
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-medium);
	white-space: nowrap;
}

.ts-action:hover {
	background: var(--ts-color-surface-sunken);
	color: var(--ts-color-primary);
	text-decoration: none;
}

.ts-action__icon {
	position: relative;
	flex: none;
	display: inline-flex;
}

/* Лічильник поверх іконки кошика */
.ts-action__count {
	position: absolute;
	top: -6px;
	right: -8px;
}

.ts-action__text {
	display: none;
}

/*
 * Підписи біля значків — з 1280px. На 1024–1279 у шапці й так тісно:
 * «Вітаємо, …», «Обране» і «Кошик» з'їдали ~350px, а туди ще має
 * влізти перемикач цін з ПДВ.
 */
@media (min-width: 1280px) {
	.ts-action__text {
		display: inline;
	}
}

/* Телефон — важливий для каталогу без онлайн-оплати */
.ts-action--phone {
	font-weight: var(--ts-weight-semibold);
}

.ts-action--phone .ts-action__text {
	display: none;
}

@media (min-width: 1280px) {
	.ts-action--phone .ts-action__text {
		display: inline;
	}
}

/* Міні-кошик: сума під лічильником на широких екранах */
.ts-minicart__total {
	display: none;
	font-size: var(--ts-text-2xs);
	color: var(--ts-color-muted);
	font-weight: var(--ts-weight-regular);
}

@media (min-width: 1280px) {
	.ts-minicart__text {
		display: flex;
		flex-direction: column;
		align-items: flex-start;
		line-height: 1.25;
	}

	.ts-minicart__total {
		display: block;
	}
}

/* --- Нижній ярус: навігація --------------------------------------------- */

/*
 * Рядок розділів без ліній зверху й знизу: у макеті хедер — суцільна
 * біла шапка, а не три смуги, розділені рамками.
 */
.ts-header__nav {
	border-top: 0;
}

.ts-nav {
	display: flex;
	align-items: center;
	gap: var(--ts-space-1);
	overflow-x: auto;
	scrollbar-width: none;
}

.ts-nav::-webkit-scrollbar {
	display: none;
}

.ts-nav__item {
	flex: none;
}

.ts-nav__link {
	display: inline-flex;
	align-items: center;
	/*
	 * Відступи вужчі, ніж у решті хедера: зі значками рядок став на
	 * 111px довшим за контейнер, і останній розділ обрізало краєм.
	 */
	gap: 6px;
	padding: var(--ts-space-3) 10px;
	font-size: var(--ts-text-sm);
	/* Жирні назви розділів — як у макеті. */
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
	white-space: nowrap;
	border-bottom: 2px solid transparent;
}

/*
 * Значок темний, а не синій: у макеті колір несе тільки активний
 * стан, а в спокої рядок читається як суцільний темний текст.
 */
.ts-nav__link .ts-icon {
	flex: 0 0 auto;
	color: var(--ts-color-text-strong);
}

.ts-nav__link:hover .ts-icon,
.ts-nav__link[aria-expanded="true"] .ts-icon {
	color: inherit;
}

.ts-nav__link:hover,
.ts-nav__link[aria-expanded="true"] {
	color: var(--ts-color-primary);
	border-bottom-color: var(--ts-color-primary);
	text-decoration: none;
}

/* Кнопка "Каталог" — візуальний якір навігації */
.ts-nav__catalog {
	display: inline-flex;
	align-items: center;
	gap: var(--ts-space-2);
	padding: var(--ts-space-3) var(--ts-space-4);
	margin-right: var(--ts-space-2);
	background: var(--ts-color-primary);
	color: var(--ts-color-primary-contrast);
	border-radius: var(--ts-radius-md);
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-semibold);
	white-space: nowrap;
}

/*
 * Бургер жирніший за решту іконок. Спільні 1.8 поруч із напівжирним
 * «Каталог» на синьому виглядали тонкою сіткою ліній — на заливці
 * штрих завжди читається легшим, ніж на білому.
 */
.ts-nav__catalog .ts-icon--menu {
	stroke-width: 2.6;
}

.ts-nav__catalog:hover {
	background: var(--ts-color-primary-hover);
	text-decoration: none;
}

/* --- Бургер (мобільний) -------------------------------------------------- */

.ts-burger {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 44px;
	height: 44px;
	flex: none;
	border-radius: var(--ts-radius-md);
	color: var(--ts-color-text);
}

.ts-burger:hover {
	background: var(--ts-color-surface-sunken);
}

@media (min-width: 1024px) {
	.ts-burger {
		display: none;
	}
}

/* На мобільному ховаємо нижній ярус — навігація живе в drawer */
@media (max-width: 1023px) {
	.ts-header__nav {
		display: none;
	}
}

/*
 * Мобільний хедер за макетом: бургер зліва, логотип по центру,
 * праворуч лише кошик. Пошук окремим рядком на всю ширину.
 *
 *   ┌──────────────────────────────┐
 *   │ ☰        LOGO          кошик │
 *   ├──────────────────────────────┤
 *   │ [ Пошук товарів…           ] │
 *   └──────────────────────────────┘
 *
 * Обране й профіль прибрані з шапки не тому, що зайві, а тому що
 * вони тепер у нижній панелі — під великим пальцем, а не під очима.
 */
@media (max-width: 1023px) {
	.ts-header__main {
		display: grid;
		grid-template-areas:
			"burger  logo    actions"
			"search  search  search";
		/*
		 * Крайні колонки однакові й фіксовані — тільки так логотип
		 * стоїть рівно посередині. Якби вони були auto, центр з'їхав
		 * би вбік ширшого елемента.
		 */
		grid-template-columns: 88px minmax(0, 1fr) 88px;
		gap: var(--ts-space-2) var(--ts-space-2);
		align-items: center;
	}

	.ts-header__main .ts-logo {
		grid-area: logo;
		justify-self: center;
		width: max-content;
	}

	.ts-header__main .ts-burger {
		grid-area: burger;
		justify-self: start;
		margin-left: calc(var(--ts-space-2) * -1);
	}

	.ts-header__main .ts-search {
		grid-area: search;
		max-width: none;
		width: 100%;
	}

	.ts-header__main .ts-header__actions {
		grid-area: actions;
		justify-self: end;
		gap: 0;
	}

	/*
	 * У шапці — телефон і кошик. Обране й профіль — у нижній панелі.
	 * Телефон лишаємо: магазин працює через дзвінок менеджера, і
	 * номер мусить бути під рукою, а не лише у футері.
	 */
	.ts-header__main .ts-action--wish,
	.ts-header__main .ts-account {
		display: none;
	}

	/* Підпис під іконкою кошика займає місце, яке потрібне логотипу. */
	.ts-header__main .ts-action__text {
		display: none;
	}
}

/* --- Дотик: дії хедера на телефоні -------------------------------------- */

/*
 * Телефон і кошик у хедері натискають пальцем, а 38px — замала ціль.
 * Доводимо до 44px, не збільшуючи візуальну вагу іконок.
 */
@media (max-width: 767px) {
	.ts-action {
		min-height: 44px;
		min-width: 44px;
		justify-content: center;
	}
}

/* --- Логотип-зображення -------------------------------------------------- */

/*
 * Висота фіксована, ширина рахується з пропорції: логотип має
 * однаково стояти в рядку хедера незалежно від того, який файл
 * підставлено (з теми чи з Кастомайзера).
 */
.ts-logo__img,
.ts-logo .custom-logo {
	display: block;
	width: auto;
	height: 40px;
	max-width: 180px;
	object-fit: contain;
}

@media (min-width: 768px) {
	.ts-logo__img,
	.ts-logo .custom-logo {
		height: 44px;
		max-width: 220px;
	}
}

/* Коли логотип — картинка, текстові відступи зайві */
.ts-logo:has(.ts-logo__img),
.ts-logo:has(.custom-logo) {
	gap: 0;
}

/* --- Прев'ю кошика при наведенні ------------------------------------------- */

.ts-minicart {
	position: relative;
}

.ts-minicart__preview {
	position: absolute;
	z-index: var(--ts-z-dropdown);
	top: calc(100% + 4px);
	right: 0;
	width: 340px;
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
	box-shadow: var(--ts-shadow-lg);
}

.ts-minicart__preview[hidden] {
	display: none;
}

/*
 * Невидимий місток до панелі: між іконкою і панеллю є проміжок, і без
 * нього курсор «випадає» дорогою вниз.
 */
.ts-minicart__preview::before {
	content: "";
	position: absolute;
	top: -6px;
	right: 0;
	left: 0;
	height: 6px;
}

.ts-minicart__head {
	padding: var(--ts-space-4);
	font-size: var(--ts-text-md);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
	border-bottom: 1px solid var(--ts-color-border);
}

.ts-minicart__items {
	margin: 0;
	padding: 0 var(--ts-space-4);
	list-style: none;
}

.ts-minicart__item {
	display: flex;
	align-items: flex-start;
	gap: var(--ts-space-3);
	padding: var(--ts-space-3) 0;
}

.ts-minicart__item + .ts-minicart__item {
	border-top: 1px solid var(--ts-color-border);
}

.ts-minicart__thumb {
	flex: 0 0 auto;
	width: 48px;
	aspect-ratio: 1 / 1;
	overflow: hidden;
	border-radius: var(--ts-radius-sm);
}

.ts-minicart__thumb img {
	width: 100%;
	height: 100%;
	object-fit: contain;
	mix-blend-mode: multiply;
}

.ts-minicart__info {
	display: flex;
	flex: 1 1 auto;
	flex-direction: column;
	gap: 2px;
	min-width: 0;
}

.ts-minicart__name {
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-regular);
	line-height: var(--ts-leading-snug);
	color: var(--ts-color-text-strong);
	white-space: normal;
}

.ts-minicart__qty {
	font-size: var(--ts-text-xs);
	font-weight: var(--ts-weight-regular);
	color: var(--ts-color-muted);
}

.ts-minicart__price {
	flex: 0 0 auto;
	font-size: var(--ts-text-sm);
	font-variant-numeric: tabular-nums;
	color: var(--ts-color-text-strong);
}

.ts-minicart__more {
	margin: 0;
	padding: 0 var(--ts-space-4) var(--ts-space-3);
	font-size: var(--ts-text-xs);
	font-weight: var(--ts-weight-regular);
	color: var(--ts-color-muted);
}

.ts-minicart__foot {
	padding: var(--ts-space-4);
	border-top: 1px solid var(--ts-color-border);
}

.ts-minicart__sum {
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	gap: var(--ts-space-3);
	margin-bottom: var(--ts-space-3);
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-regular);
	color: var(--ts-color-muted);
}

.ts-minicart__sum strong {
	font-size: var(--ts-text-md);
	color: var(--ts-color-text-strong);
}

/* На телефоні прев'ю не показуємо — там працює шухляда. */
@media (max-width: 1023px) {
	.ts-minicart__preview {
		display: none;
	}
}

/*
 * Панель, яку покупець відкрив останньою, — поверх решти.
 *
 * Усі панелі хедера стоять на одному рівні --ts-z-dropdown, тож при
 * перекритті вигравала б та, що пізніше в розмітці: ведучи курсор
 * справа наліво, покупець бачив би нову панель під сусідньою. Клас
 * ставить JS у момент відкриття (HoverPanel).
 */
.ts-minicart__preview.ts-panel-raised,
.ts-phones__panel.ts-panel-raised,
.ts-account__menu.ts-panel-raised {
	z-index: calc(var(--ts-z-dropdown) + 2);
}

/* --- Панель телефонів при наведенні ---------------------------------------- */

.ts-phones {
	position: relative;
}

.ts-phones__panel {
	position: absolute;
	z-index: var(--ts-z-dropdown);
	top: calc(100% + 4px);
	right: 0;
	width: 320px;
	padding: var(--ts-space-4);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
	box-shadow: var(--ts-shadow-lg);
}

.ts-phones__panel[hidden] {
	display: none;
}

/* Місток до панелі, щоб курсор не «випадав» у проміжку. */
.ts-phones__panel::before {
	content: "";
	position: absolute;
	top: -6px;
	right: 0;
	left: 0;
	height: 6px;
}

.ts-phones__group + .ts-phones__group {
	margin-top: var(--ts-space-4);
	padding-top: var(--ts-space-4);
	border-top: 1px solid var(--ts-color-border);
}

.ts-phones__title {
	display: block;
	margin-bottom: var(--ts-space-2);
	font-size: var(--ts-text-2xs);
	font-weight: var(--ts-weight-semibold);
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--ts-color-faint);
}

/*
 * Дві колонки лише коли в рядку сам номер. З оператором поруч
 * («093-170-22-40 lifecell») пара не влазить і напис наїжджає на
 * сусідній номер, тому такі списки лишаємо в одну колонку.
 */
/*
 * Без вертикального проміжку: номери стоять щільним стовпчиком, як і
 * в месенджерах нижче. Висоту рядка тримає line-height самого номера.
 */
.ts-phones__list {
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	column-gap: var(--ts-space-3);
	margin: 0;
	padding: 0;
	list-style: none;
}

.ts-phones__list:has(.ts-phones__note) {
	grid-template-columns: minmax(0, 1fr);
}

.ts-phones__item {
	display: flex;
	align-items: baseline;
	gap: var(--ts-space-2);
	min-width: 0;
}

/*
 * Підпис оператора притиснутий до правого краю, а не приклеєний
 * до номера: рядок займає всю ширину панелі, і підписи шикуються
 * в один стовпчик замість рваного краю.
 */
.ts-phones__item .ts-phones__note {
	margin-left: auto;
}

.ts-phones__number {
	font-size: var(--ts-text-base);
	font-weight: var(--ts-weight-medium);
	font-variant-numeric: tabular-nums;
	line-height: 1.45;
	white-space: nowrap;
	color: var(--ts-color-text-strong);
}

.ts-phones__number:hover {
	color: var(--ts-color-primary);
	text-decoration: none;
}

.ts-phones__note {
	font-size: var(--ts-text-2xs);
	font-weight: var(--ts-weight-regular);
	color: var(--ts-color-faint);
}

.ts-phones__messengers {
	display: flex;
	flex-direction: column;
	gap: var(--ts-space-2);
	margin: 0;
	padding: 0;
	list-style: none;
}

.ts-phones__messenger-name {
	display: block;
	font-size: var(--ts-text-xs);
	font-weight: var(--ts-weight-medium);
	color: var(--ts-color-text);
}

/*
 * Номери в два стовпчики на всю ширину. Через flex-wrap вони
 * тулилися ліворуч і ламалися нерівно: у Telegram чотири номери
 * ставали 3+1. Сітка дає рівні колонки й передбачувані рядки.
 */
.ts-phones__messenger-numbers {
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	column-gap: var(--ts-space-3);
	margin-top: 2px;
}

/*
 * Номери в месенджерах — окремими рядками сітки, а не flex-рядком:
 * решту розміру й ваги задає спільне .ts-phones__number вище.
 */
.ts-phones__messenger-numbers .ts-phones__number {
	display: block;
}

.ts-phones__email {
	display: block;
	margin-top: var(--ts-space-4);
	padding-top: var(--ts-space-4);
	border-top: 1px solid var(--ts-color-border);
	font-size: var(--ts-text-sm);
	color: var(--ts-color-primary);
}


/* Логотипи операторів і месенджерів. */
.ts-contact-logo {
	flex: 0 0 auto;
	width: 18px;
	height: 18px;
	object-fit: contain;
	border-radius: var(--ts-radius-sm);
}

.ts-phones__messenger-name {
	display: flex;
	align-items: center;
	gap: var(--ts-space-2);
}

/* --- Вибір розділу пошуку -------------------------------------------------- */

.ts-search__scope {
	position: relative;
	flex: none;
	display: none;
	align-items: center;
	padding-right: var(--ts-space-2);
	border-left: 1px solid var(--ts-color-border);
}

/* На телефоні рядок пошуку й так вузький — селектор ховаємо. */
@media (min-width: 768px) {
	.ts-search__scope {
		display: flex;
	}
}

.ts-search__scope-btn {
	display: inline-flex;
	align-items: center;
	gap: var(--ts-space-1);
	/* 44px — мінімальна зручна ціль для пальця. */
	min-height: 44px;
	padding: 0 var(--ts-space-2) 0 var(--ts-space-3);
	font-family: inherit;
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
	background: none;
	border: 0;
	white-space: nowrap;
	cursor: pointer;
}

.ts-search__scope-btn:hover {
	color: var(--ts-color-primary);
}

.ts-search__scope-list {
	position: absolute;
	/*
	 * Вище за підказки пошуку: обидва відкриваються під тим самим рядком
	 * і перетинаються, а за однакового z-index вигравали б підказки —
	 * вони йдуть пізніше в розмітці. Розділ щойно відкрив сам покупець,
	 * тож він і має бути зверху.
	 */
	z-index: calc(var(--ts-z-dropdown) + 1);
	top: calc(100% + 4px);
	right: 0;
	min-width: 220px;
	max-height: 320px;
	overflow-y: auto;
	margin: 0;
	padding: var(--ts-space-1);
	list-style: none;
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-md);
	box-shadow: var(--ts-shadow-lg);
}

.ts-search__scope-list[hidden] {
	display: none;
}

.ts-search__scope-option {
	display: block;
	width: 100%;
	padding: var(--ts-space-2) var(--ts-space-3);
	font-family: inherit;
	font-size: var(--ts-text-sm);
	text-align: left;
	color: var(--ts-color-text);
	background: none;
	border: 0;
	border-radius: var(--ts-radius-sm);
	cursor: pointer;
}

.ts-search__scope-option:hover {
	background: var(--ts-color-surface-sunken);
}

.ts-search__scope-option.is-active {
	color: var(--ts-color-primary);
	background: var(--ts-color-primary-soft);
}

/* --- Підказки-запити ------------------------------------------------------- */

/*
 * Рядок-підказка: іконка й текст. Той самий вигляд для запиту й для
 * категорії — відрізняються лише іконкою, бо поводяться однаково
 * (клік уточнює пошук, а не відкриває товар).
 */
.ts-search__term {
	display: flex;
	align-items: center;
	gap: var(--ts-space-3);
	width: 100%;
	min-height: 40px;
	padding: var(--ts-space-2) var(--ts-space-4);
	font-family: inherit;
	font-size: var(--ts-text-sm);
	text-align: left;
	color: var(--ts-color-text);
	background: none;
	border: 0;
	cursor: pointer;
}

.ts-search__term .ts-icon {
	flex: none;
	color: var(--ts-color-faint);
}

.ts-search__term:hover,
.ts-search__term[aria-selected="true"] {
	background: var(--ts-color-surface-sunken);
	text-decoration: none;
}

/* Дописана частина — жирним: видно, що саме додасться до набраного. */
.ts-search__term-text {
	min-width: 0;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

.ts-search__term-text strong {
	font-weight: var(--ts-weight-semibold);
}

.ts-search__term-in {
	color: var(--ts-color-faint);
}

/* --- Історія пошуку -------------------------------------------------------- */

/*
 * Дві колонки, як у x-kom: ліворуч те, що людина шукала, праворуч —
 * що відкривала. Права колонка на світлішому тлі й з межею: це окремий
 * блок, а не продовження списку запитів.
 */
.ts-search__cols {
	display: grid;
	grid-template-columns: minmax(0, 1fr) minmax(0, 300px);
}

.ts-search__col--viewed {
	border-left: 1px solid var(--ts-color-border);
	background: var(--ts-color-surface-sunken);
}

/*
 * У правій колонці картка вужча, ніж у результатах, тому ціна їде під
 * назву, а назва отримує два рядки. Інакше «Dell PowerEdge R660»
 * обривається на половині слова.
 */
.ts-search__col--viewed .ts-suggest {
	align-items: flex-start;
}

.ts-search__col--viewed .ts-suggest__title {
	--ts-clamp-lines: 2;
	white-space: normal;
}

/*
 * Ціна — під назвою, а не окремою колонкою праворуч: у вузькій панелі
 * вона з'їдала половину ширини й назва обривалася на другому слові.
 * Сітка, а не wrap: при wrap назва зістрибувала під картинку.
 */
.ts-search__col--viewed .ts-suggest {
	display: grid;
	grid-template-columns: 44px minmax(0, 1fr);
	align-items: center;
	column-gap: var(--ts-space-3);
	row-gap: 2px;
}

.ts-search__col--viewed .ts-suggest__body {
	grid-column: 2;
}

.ts-search__col--viewed .ts-suggest__media {
	grid-row: 1 / span 2;
}

.ts-search__col--viewed .ts-suggest__price {
	grid-column: 2;
	font-size: var(--ts-text-xs);
	text-align: left;
}

/* Порожня колонка не повинна забирати місце. */
.ts-search__col:empty {
	display: none;
}

.ts-search__col:only-child {
	grid-column: 1 / -1;
}

/* Усередині колонок секція вже сама по собі — рамка згори зайва. */
.ts-search__col .ts-search__section + .ts-search__section {
	border-top: 0;
}

@media (max-width: 767px) {
	/*
	 * На телефоні колонки лягають одна під одну: 300px праворуч там
	 * просто немає, а назви товарів рвалися б на три рядки.
	 */
	.ts-search__cols {
		grid-template-columns: minmax(0, 1fr);
	}

	.ts-search__col--viewed {
		border-left: 0;
		border-top: 1px solid var(--ts-color-border);
	}
}

.ts-search__section + .ts-search__section {
	border-top: 1px solid var(--ts-color-border);
}

/*
 * Заголовок секції — липкий: у довгому списку видно, на що саме
 * дивишся, результати це чи вже переглянуте.
 */
.ts-search__section-head {
	position: sticky;
	top: 0;
	z-index: 1;
	background: var(--ts-color-surface);
}

.ts-search__section-head {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: var(--ts-space-3);
	padding: var(--ts-space-3) var(--ts-space-4) var(--ts-space-2);
	font-size: var(--ts-text-2xs);
	font-weight: var(--ts-weight-semibold);
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--ts-color-faint);
}

.ts-search__clear {
	font-family: inherit;
	font-size: var(--ts-text-2xs);
	text-transform: none;
	letter-spacing: normal;
	color: var(--ts-color-primary);
	background: none;
	border: 0;
	cursor: pointer;
}

.ts-search__recent {
	display: flex;
	align-items: center;
	gap: var(--ts-space-2);
	padding: 0 var(--ts-space-2) 0 var(--ts-space-4);
}

.ts-search__recent-term {
	flex: 1 1 auto;
	display: flex;
	align-items: center;
	gap: var(--ts-space-2);
	min-height: 40px;
	padding: 0;
	font-family: inherit;
	font-size: var(--ts-text-sm);
	text-align: left;
	color: var(--ts-color-text);
	background: none;
	border: 0;
	cursor: pointer;
}

/* Іконка годинника — приглушена: підказка, а не акцент. */
.ts-search__recent-term .ts-icon {
	flex: none;
	color: var(--ts-color-faint);
}

/*
 * Клавіатурний фокус по списку підсвічує рядок так само, як наведення
 * миші: у списку один активний елемент, незалежно від способу вибору.
 */
.ts-search__recent:has([aria-selected="true"]),
.ts-search__recent:hover {
	background: var(--ts-color-surface-sunken);
}

.ts-search__recent-drop {
	flex: 0 0 auto;
	width: 28px;
	height: 28px;
	font-size: var(--ts-text-md);
	line-height: 1;
	color: var(--ts-color-faint);
	background: none;
	border: 0;
	border-radius: var(--ts-radius-sm);
	cursor: pointer;
}

.ts-search__recent-drop:hover {
	background: var(--ts-color-danger-soft);
	color: var(--ts-color-danger);
}

/* --- Коди в підказках пошуку ----------------------------------------------- */

.ts-suggest__code {
	font-variant-numeric: tabular-nums;
	white-space: nowrap;
}

.ts-suggest__code-label {
	color: var(--ts-color-faint);
}

/* Підсвітка знайденого фрагмента коду. */
.ts-suggest__hit {
	padding: 0 1px;
	color: var(--ts-color-text-strong);
	font-weight: var(--ts-weight-semibold);
	background: var(--ts-color-warning-soft);
	border-radius: 2px;
}

@media (max-width: 767px) {
	.ts-search__input::placeholder {
		font-size: var(--ts-text-sm);
	}

	/*
	 * Поле нижче й компактніше. Шрифт лишається 16px — менший
	 * змушує iOS зумити сторінку при фокусі, — але падінг 12/16
	 * розганяв поле до 48px і з'їдав перший екран.
	 *
	 * 40px усе ще зручна ціль: сама форма з рамкою дає 42px, а
	 * кнопка пошуку поруч лишається повноцінними 44px.
	 */
	.ts-search__input {
		min-height: 40px;
		padding: var(--ts-space-2) var(--ts-space-3);
	}

	/* Кнопка звужується, щоб не забирати місце в самого поля. */
	.ts-search__submit {
		width: 40px;
		height: 40px;
	}

	.ts-search__reset {
		width: 32px;
		height: 32px;
	}
}

/* --- Перемикач «Ціни: без ПДВ | з ПДВ» ------------------------------ */

.ts-price-mode {
	display: inline-flex;
	align-items: center;
	gap: var(--ts-space-2);
	font-size: var(--ts-text-sm);
	white-space: nowrap;
}

.ts-price-mode__label {
	color: var(--ts-color-muted);
}

.ts-price-mode__options {
	display: inline-flex;
	padding: 2px;
	background: var(--ts-color-surface-sunken);
	border-radius: var(--ts-radius-full);
}

.ts-price-mode__option {
	min-height: 32px;
	padding: 0 var(--ts-space-3);
	font: inherit;
	font-weight: var(--ts-weight-medium);
	color: var(--ts-color-muted);
	background: none;
	border: 0;
	border-radius: var(--ts-radius-full);
	cursor: pointer;
}

.ts-price-mode__option:hover {
	color: var(--ts-color-text);
}

.ts-price-mode__option.is-active {
	color: var(--ts-color-primary-contrast);
	background: var(--ts-color-primary);
	cursor: default;
}

.ts-price-mode__option:focus-visible {
	outline: 2px solid var(--ts-color-border-focus);
	outline-offset: 1px;
}

/*
 * До 1024px шапка мобільна — перемикач живе в меню під бургером.
 * На 1024–1279 — компактний, без слова «Ціни».
 */
@media (max-width: 1023px) {
	.ts-header__actions .ts-price-mode {
		display: none;
	}
}

@media (max-width: 1279px) {
	.ts-header__actions .ts-price-mode__label {
		display: none;
	}

	.ts-header__actions .ts-price-mode__option {
		padding: 0 var(--ts-space-2);
	}
}

/* Мобільне меню: окремий рядок над каталогом, кнопки по 44px (правила мобільної верстки). */
.ts-price-mode--drawer {
	display: flex;
	justify-content: space-between;
	padding: var(--ts-space-3) var(--ts-space-4);
	border-bottom: 1px solid var(--ts-color-border);
}

.ts-price-mode--drawer .ts-price-mode__option {
	min-height: 44px;
	padding: 0 var(--ts-space-4);
}

/* --- «Ще» в рядку розділів (NavFit у main.js) ----------------------- */

/*
 * Коли NavFit розклав розділи, рядок більше не гортається: те, що не
 * влізло, — у «Ще». overflow visible потрібен, щоб панель «Ще» не
 * обрізало краєм рядка.
 */
.ts-nav.is-fitted {
	overflow: visible;
}

.ts-nav__item[hidden] {
	display: none;
}

.ts-nav__more {
	position: relative;
	margin-left: auto;
}

.ts-nav__more-toggle {
	font: inherit;
	font-weight: var(--ts-weight-semibold);
	background: none;
	border: 0;
	border-bottom: 2px solid transparent;
	cursor: pointer;
}

.ts-nav__more-toggle .ts-icon {
	transition: transform 0.15s ease;
}

.ts-nav__more-toggle[aria-expanded="true"] .ts-icon {
	transform: rotate(180deg);
}

.ts-nav__more-panel {
	position: absolute;
	z-index: var(--ts-z-dropdown);
	top: calc(100% + 4px);
	right: 0;
	display: flex;
	flex-direction: column;
	min-width: 240px;
	padding: var(--ts-space-2);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-md);
	box-shadow: var(--ts-shadow-lg);
}

.ts-nav__more-panel[hidden] {
	display: none;
}

.ts-nav__more-panel .ts-nav__link {
	border-bottom: 0;
	border-radius: var(--ts-radius-sm);
}

.ts-nav__more-panel .ts-nav__link:hover {
	background: var(--ts-color-surface-sunken);
}

/* --- Телефони на мобільному: лист знизу ----------------------------- */

.ts-phones__sheet-head {
	display: none;
}

@media (max-width: 1023px) {
	/* Логотип ділить рядок із двома значками праворуч — не ширше колонки. */
	.ts-header__main .ts-logo__img,
	.ts-header__main .ts-logo .custom-logo {
		max-width: 100%;
	}

	.ts-phones__panel {
		position: fixed;
		top: auto;
		right: 0;
		bottom: 0;
		left: 0;
		z-index: 2;
		width: auto;
		max-height: 80vh;
		overflow-y: auto;
		padding: var(--ts-space-4) var(--ts-space-4) calc(var(--ts-space-5) + env(safe-area-inset-bottom));
		border: 0;
		border-radius: var(--ts-radius-lg) var(--ts-radius-lg) 0 0;
		box-shadow: 0 -8px 32px rgba(17, 24, 39, 0.18);
	}

	.ts-phones__panel::before {
		display: none;
	}

	/* Тло під листом: тап по ньому закриває (PhonesSheet у main.js). */
	.ts-phones:has(.ts-phones__panel:not([hidden]))::after {
		content: "";
		position: fixed;
		inset: 0;
		z-index: 1;
		background: rgba(17, 24, 39, 0.45);
	}

	/*
	 * Шапка — окремий шар (sticky + z-index), і нижня панель на тому ж
	 * рівні перекривала б низ листа. Поки лист відкритий, ховаємо її.
	 */
	.ts-phones-open .ts-bottomnav {
		visibility: hidden;
	}

	.ts-phones__sheet-head {
		display: flex;
		align-items: center;
		justify-content: space-between;
		margin-bottom: var(--ts-space-3);
	}

	.ts-phones__sheet-title {
		font-size: var(--ts-text-lg);
		font-weight: var(--ts-weight-bold);
		color: var(--ts-color-text-strong);
	}

	.ts-phones__close {
		display: inline-flex;
		align-items: center;
		justify-content: center;
		width: 44px;
		height: 44px;
		margin-right: calc(var(--ts-space-2) * -1);
		color: var(--ts-color-muted);
		background: none;
		border: 0;
		border-radius: var(--ts-radius-full);
		cursor: pointer;
	}

	/* Номери — під палець: 44px і крупніше. */
	.ts-phones__number {
		display: inline-flex;
		align-items: center;
		min-height: 44px;
		font-size: var(--ts-text-lg);
	}
}

/* --- QA шапки (2026-10-21) ------------------------------------------- */

/*
 * Ім'я в шапці: довге («Костянтинопольський») обрізаємо трьома
 * крапками, повне — у підказці (title). Раніше ім'я або шматок email
 * розтягували блок акаунта до 280px і виштовхували кошик за край екрана.
 */
.ts-account__name {
	display: inline-block;
	max-width: 9em;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	vertical-align: bottom;
}

/*
 * Кнопка «Каталог» не стискається: на 1366 рядок розділів підтискав
 * її, і бургер-іконка сплющувалась у крапку.
 */
.ts-nav__catalog,
.ts-nav__catalog .ts-icon {
	flex: none;
}

/*
 * 1280–1439: усе з підписами не влазило — кошик виїжджав за край, а
 * пошук стискався до 345px. Лишаємо підписи там, де без них не
 * зрозуміло, що це: ім'я / «Увійти» й кошик із сумою. Телефон (номери
 * — у випадному списку), серце обраного й перемикач цін зрозумілі й
 * без слів.
 */
@media (min-width: 1280px) and (max-width: 1439px) {
	.ts-action--phone .ts-action__text,
	.ts-action--wish .ts-action__text {
		display: none;
	}

	.ts-header__actions .ts-price-mode__label {
		display: none;
	}
}

/* 1440–1599: номер телефону вже вміщається, «Обране» — ще ні. */
@media (min-width: 1440px) and (max-width: 1599px) {
	.ts-action--wish .ts-action__text {
		display: none;
	}
}

/*
 * 320–359: логотип налазив на значок телефону. Бічні колонки — ті самі
 * 88px (два значки по 44), тож місце беремо з проміжків і висоти лого.
 */
@media (max-width: 359px) {
	.ts-header__main {
		column-gap: var(--ts-space-1);
	}

	.ts-header__main .ts-logo__img,
	.ts-header__main .ts-logo .custom-logo {
		height: 28px;
	}
}

/* ==========================================================================
   TopShop — Layout parts
   Mega menu, mobile drawer, footer, breadcrumbs, pagination.
   ========================================================================== */

/* --- Mega menu (ТЗ §25) ------------------------------------------------- */

.ts-megamenu {
	position: absolute;
	left: 0;
	right: 0;
	z-index: var(--ts-z-megamenu);
	/*
	 * Картка, що ніби лежить поверх сторінки, а не суцільна смуга:
	 * так у макеті. Фон і тінь — на внутрішньому шарі, щоб
	 * заокруглення не обрізало саме меню.
	 */
	padding-top: var(--ts-space-2);
	padding-bottom: var(--ts-space-6);
	pointer-events: none;
}

.ts-megamenu > .ts-container {
	pointer-events: auto;
}

.ts-megamenu__layout {
	background: var(--ts-color-surface);
	border-radius: var(--ts-radius-lg);
	box-shadow: var(--ts-shadow-lg);
	overflow: hidden;
}

.ts-megamenu[hidden] {
	display: none;
}

/*
 * Ліворуч колонка розділів, праворуч панель активного.
 * Ширина колонки фіксована: якщо дати їй тягнутися за назвами,
 * панель праворуч смикається при кожному перемиканні розділу.
 */
.ts-megamenu__layout {
	display: grid;
	grid-template-columns: 264px minmax(0, 1fr);
	/*
	 * Не фіксуємо висоту: у розділів різна кількість підкатегорій, і
	 * жорсткі 420px лишали б порожнє полотно під короткою панеллю.
	 * Мінімум — щоб колонка розділів не обрізалась на пів-рядка.
	 */
	min-height: 320px;
}

/* --- Колонка розділів --------------------------------------------------- */

.ts-megamenu__roots {
	margin: 0;
	padding: var(--ts-space-3);
	list-style: none;
	border-right: 1px solid var(--ts-color-border);
	background: var(--ts-color-surface);
	/*
	 * Розділів під сорок — у висоту екрана вони не вміщаються.
	 * Скролимо саму колонку, а не сторінку: інакше меню тягнеться
	 * нижче вікна і його край не дістати.
	 */
	max-height: min(72vh, 620px);
	overflow-y: auto;
	overscroll-behavior: contain;
}

/*
 * Рядок «Усі категорії» — окремо від розділів, як у макеті.
 *
 * Лінію малює сам <li>, а не посилання: коли рамка висіла на
 * посиланні, синя плашка при наведенні впиралася в неї і втрачала
 * заокруглення згори — кут виглядав обрубаним.
 */
/*
 * «Усі категорії» — прилипає до низу колонки: розділів під сорок, і
 * без цього шлях до повного дерева ховався за прокруткою навіть на
 * 1920×1080.
 */
.ts-megamenu__root--all {
	position: sticky;
	bottom: 0;
	margin-top: var(--ts-space-2);
	padding-block: var(--ts-space-2) var(--ts-space-3);
	border-top: 1px solid var(--ts-color-border);
	background: var(--ts-color-surface);
}

/*
 * Нижній відступ колонки дає сам «Усі категорії» (його padding):
 * з відступом і в списку, і в пункті в кінці прокрутки під ним
 * з'являлась зайва смуга, а сам рядок «підстрибував» угору.
 */
.ts-megamenu__roots {
	padding-bottom: 0;
}

.ts-megamenu__root-link--all {
	font-weight: var(--ts-weight-medium);
	color: var(--ts-color-primary);
}

.ts-megamenu__root-link {
	display: flex;
	align-items: center;
	gap: var(--ts-space-3);
	padding: var(--ts-space-2) var(--ts-space-4);
	font-size: var(--ts-text-sm);
	color: var(--ts-color-text-strong);
	line-height: 1.3;
}

.ts-megamenu__root-link {
	border-radius: var(--ts-radius-md);
	transition: background-color 0.12s ease, color 0.12s ease;
}

/*
 * Наведення й активний стан пофарбовані однаково — залитою синьою
 * плашкою, як у макеті.
 *
 * Однаково саме тому, що панель перемикається не миттєво: JS чекає
 * 90 мс, щоб панель не блимала, поки курсор іде навскіс через сусідні
 * пункти. Коли hover давав блідо-блакитний, а .is-active за мить —
 * насичений синій, це читалося як миготіння в два кольори. Один колір
 * прибирає проміжний стан: рядок фарбується одразу й уже не змінюється.
 */
.ts-megamenu__root-link:hover,
.ts-megamenu__root-link.is-active {
	background: var(--ts-color-primary);
	color: var(--ts-color-primary-contrast);
	text-decoration: none;
}

.ts-megamenu__root-link:hover .ts-cat-thumb,
.ts-megamenu__root-link.is-active .ts-cat-thumb {
	color: var(--ts-color-primary-contrast);
}

/*
 * Курсор на іншому пункті (зокрема на «Усі категорії», у якого панелі
 * немає) — розділ, чия панель ще відкрита, блідне. Інакше синіх плашок
 * дві, і незрозуміло, на чому ти зараз.
 */
.ts-megamenu__roots:has(.ts-megamenu__root-link:hover) .ts-megamenu__root-link.is-active:not(:hover) {
	background: var(--ts-color-primary-soft);
	color: var(--ts-color-primary);
}

.ts-megamenu__roots:has(.ts-megamenu__root-link:hover) .ts-megamenu__root-link.is-active:not(:hover) .ts-cat-thumb {
	color: var(--ts-color-primary);
}

.ts-megamenu__roots:has(.ts-megamenu__root-link:hover) .ts-megamenu__root-link.is-active:not(:hover) .ts-icon--chevron {
	opacity: 0;
}

.ts-megamenu__root-name {
	flex: 1 1 auto;
}

/* Стрілка веде погляд до панелі — підсвічуємо лише в активного. */
.ts-megamenu__root-link .ts-icon--chevron {
	flex: 0 0 auto;
	opacity: 0;
	transition: opacity 0.12s ease;
}

.ts-megamenu__root-link:hover .ts-icon--chevron,
.ts-megamenu__root-link.is-active .ts-icon--chevron {
	opacity: 1;
}

/* Рядок «Акції» — червоний, як у макеті: це не розділ каталогу. */
.ts-megamenu__root-link--sale {
	color: var(--ts-color-danger);
	font-weight: var(--ts-weight-medium);
}

.ts-megamenu__root-link--sale:hover:not(.is-active) {
	background: var(--ts-color-danger-soft);
	color: var(--ts-color-danger);
}

.ts-megamenu__root-count {
	flex: 0 0 auto;
	padding: 1px 7px;
	border-radius: 999px;
	background: var(--ts-color-danger-soft);
	color: var(--ts-color-danger);
	font-size: var(--ts-text-xs);
	font-weight: var(--ts-weight-semibold);
	line-height: 1.6;
}

/*
 * Фонова марка в куті панелі. У макеті це не картка й не рівний
 * прямокутник, а м'яка хвиля, що затікає в правий нижній кут, з
 * ілюстрацією розділу поверх неї.
 *
 * Хвилю малюємо самим елементом: заокруглення по діагоналі
 * (великий радіус лише у верхньому лівому куті) дає ту саму плавну
 * дугу, що на макеті, і не потребує ні картинки, ні зайвого вузла.
 */
.ts-megamenu__promo {
	/*
	 * Хвиля в куті панелі, як у макеті: широка пласка дуга, що йде
	 * від лівого краю вгору й затікає під правий. Один великий
	 * еліптичний радіус ліворуч дає саме таку лінію — це не пігулка
	 * й не картка, тому інших кутів у фігури немає.
	 */
	position: absolute;
	right: 0;
	/*
	 * Притиснута до самого низу панелі. Піднімати її над рядком
	 * «Усі товари» не можна: у довгих розділах вона тоді лягала
	 * просто на назви брендів у колонках.
	 */
	bottom: 0;
	display: none;
	align-items: center;
	justify-content: flex-end;
	gap: var(--ts-space-4);
	width: 360px;
	min-height: 104px;
	padding: var(--ts-space-4) var(--ts-space-6) var(--ts-space-5) var(--ts-space-8);
	border-top-left-radius: 100% 86%;
	/*
	 * Заливка напівпрозора. Панель прокручується просто над маркою,
	 * і суцільний колір обрізав би назви брендів на півслові —
	 * крізь бліде тло рядок лишається читабельним, доки проходить.
	 */
	background: linear-gradient(115deg, rgba(232, 240, 254, 0) 8%, rgba(238, 244, 255, 0.82) 42%, rgba(227, 237, 253, 0.88) 100%);
	color: var(--ts-color-primary);
	/* Тло не має перехоплювати курсор із посилань. */
	pointer-events: none;
	user-select: none;
	z-index: 0;
}

.ts-megamenu__promo[hidden] {
	display: none;
}



/*
 * Ховаємо там, де панель і так щільна: на вузькому екрані колонки
 * доходять до кута, і марка лягла б просто поверх назв.
 */
@media (min-width: 1280px) {
	.ts-megamenu__promo:not([hidden]) {
		display: flex;
	}
}

/*
 * Іконка велика й напівпрозора — це ілюстрація розділу, а не значок.
 */
.ts-megamenu__promo-icon {
	flex: 0 0 auto;
	display: inline-flex;
	order: 2;
	/* Малюнок кольоровий, а не бліда пляма: у макеті він читається. */
	opacity: 0.9;
}

.ts-megamenu__promo-icon .ts-icon {
	width: 88px;
	height: 88px;
	/*
	 * Товстіший штрих і насичений блакитний — у макеті це кольорова
	 * ілюстрація, а не сірий контур. Тонка лінія на такому розмірі
	 * виглядала вицвілою.
	 */
	stroke-width: 1.5;
	color: #4da3f5;
}

/* Плитка навколо значка тут зайва — ілюстрація лежить просто на хвилі. */
.ts-megamenu__promo .ts-cat-thumb--icon {
	width: auto;
	height: auto;
	padding: 0;
	background: none;
}

.ts-megamenu__promo-text {
	order: 1;
	text-align: right;
	font-size: var(--ts-text-md);
	font-weight: var(--ts-weight-semibold);
	line-height: 1.3;
	color: var(--ts-color-primary);
}

.ts-megamenu__promo-text em {
	display: block;
	font-style: normal;
	font-weight: var(--ts-weight-regular);
	opacity: 0.8;
}

/* --- Нижня панель на телефоні -------------------------------------------- */

/*
 * П'ять головних дій під великим пальцем. На широкому екрані панелі
 * немає: там усе доступне в шапці, а смуга внизу лише з'їдала б екран.
 */
.ts-bottomnav {
	display: none;
}

/* Під час введення панелі внизу не потрібні: клавіатура тягне їх на форму. */
@media (pointer: coarse) {
	.ts-keyboard-open .ts-bottomnav,
	.ts-keyboard-open .ts-sticky-buy,
	.ts-keyboard-open .ts-fab {
		display: none;
	}
}

@media (max-width: 1023px) {
	.ts-bottomnav {
		position: fixed;
		left: 0;
		right: 0;
		bottom: 0;
		z-index: var(--ts-z-header);
		display: grid;
		grid-template-columns: repeat(5, 1fr);
		/*
		 * Рівно 60px, як і відступ body та липкої панелі купівлі над
		 * нею. Раніше висоту задавали пункти (56 + рамка = 57), і між
		 * панелями лишалась щілина в 3px, крізь яку видно сторінку.
		 */
		box-sizing: border-box;
		height: calc(60px + env(safe-area-inset-bottom, 0px));
		background: var(--ts-color-surface);
		border-top: 1px solid var(--ts-color-border);
		/*
		 * Домальовуємо висоту під системну смугу жестів на iPhone:
		 * інакше нижній ряд підписів опиняється під нею.
		 */
		padding-bottom: env(safe-area-inset-bottom, 0px);
	}

	/*
	 * Звільняємо місце під панеллю, щоб вона не перекривала кінець
	 * сторінки — насамперед кнопку «Додати в кошик» у картці товару.
	 */
	body {
		padding-bottom: calc(60px + env(safe-area-inset-bottom, 0px));
	}

	/* Плаваючі кнопки не мають лежати на останніх рядках підвалу. */
	body .ts-footer {
		padding-bottom: 76px;
	}
}

.ts-bottomnav__item {
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	gap: 2px;
	/* 56px — мінімальна зручна ціль для пальця. */
	min-height: 56px;
	padding: var(--ts-space-2) 2px;
	color: var(--ts-color-muted);
	font-size: var(--ts-text-2xs);
	line-height: 1.2;
	text-align: center;
}

.ts-bottomnav__item:hover,
.ts-bottomnav__item:focus-visible {
	color: var(--ts-color-primary);
	text-decoration: none;
}

/* Поточний розділ — синій, щоб було видно, де людина стоїть. */
.ts-bottomnav__item.is-active {
	color: var(--ts-color-primary);
}

.ts-bottomnav__icon {
	position: relative;
	display: inline-flex;
}

.ts-bottomnav__count {
	position: absolute;
	top: -6px;
	right: -8px;
}

.ts-bottomnav__count[hidden] {
	display: none;
}

.ts-bottomnav__label {
	display: block;
	max-width: 100%;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

/* --- Смужка з акцією ---------------------------------------------------- */

.ts-topbar {
	background: var(--ts-color-surface-muted, #f5f7fa);
	border-bottom: 1px solid var(--ts-color-border);
	font-size: var(--ts-text-xs);
}

.ts-topbar[hidden] {
	display: none;
}

.ts-topbar__inner {
	display: flex;
	align-items: center;
	gap: var(--ts-space-3);
	min-height: 38px;
	padding-top: 6px;
	padding-bottom: 6px;
}

.ts-topbar__icon {
	flex: 0 0 auto;
	display: inline-flex;
	color: var(--ts-color-danger);
}

.ts-topbar__text {
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

.ts-topbar__sep {
	color: var(--ts-color-border);
}

.ts-topbar__note,
.ts-topbar__ship {
	color: var(--ts-color-text);
}

.ts-topbar__link {
	display: inline-flex;
	align-items: center;
	gap: 4px;
	color: var(--ts-color-primary);
	white-space: nowrap;
}

/* Хрестик притиснутий до правого краю, решта — зліва. */
.ts-topbar__close {
	margin-left: auto;
	flex: 0 0 auto;
	display: inline-flex;
	padding: 4px;
	border-radius: var(--ts-radius-sm);
	color: var(--ts-color-text-muted);
}

.ts-topbar__close:hover {
	background: var(--ts-color-border);
	color: var(--ts-color-text-strong);
}

/*
 * На вузьких екранах лишаємо головне: сама акція і хрестик. Умову
 * доставки й «Детальніше» ховаємо — у 360px вони переносяться в три
 * рядки й з'їдають перший екран.
 */
@media (max-width: 767px) {
	.ts-topbar__sep,
	.ts-topbar__ship,
	.ts-topbar__link {
		display: none;
	}

	/*
	 * «До -20%» теж ховаємо на вузькому екрані: разом із назвою
	 * акції рядок не вміщався і переносився у два, через що смужка
	 * ставала вдвічі вищою і з'їдала перший екран.
	 */
	.ts-topbar__note {
		display: none;
	}

	/* Текст в один рядок: довгу акцію обрізаємо трьома крапками. */
	.ts-topbar__text {
		overflow: hidden;
		text-overflow: ellipsis;
		white-space: nowrap;
	}
}

/* --- Мініатюра категорії ------------------------------------------------ */

.ts-cat-thumb {
	flex: 0 0 auto;
	border-radius: var(--ts-radius-sm);
	object-fit: contain;
}

/*
 * Плашка з літерою — коли картинки в категорії немає. Колір беремо
 * з --ts-cat-hue, який ставить PHP: сталий для категорії.
 */
.ts-cat-thumb--letter {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	background: hsl(var(--ts-cat-hue, 210) 70% 94%);
	color: hsl(var(--ts-cat-hue, 210) 45% 38%);
	font-size: 12px;
	font-weight: var(--ts-weight-semibold);
	line-height: 1;
}

/*
 * Намальований значок розділу. На відміну від літери, кольору не
 * вигадуємо: іконка успадковує колір рядка, тому на активній синій
 * плашці стає білою сама.
 */
.ts-cat-thumb--icon {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	color: inherit;
}

.ts-cat-thumb--icon .ts-icon {
	display: block;
}

/* --- Панель розділу ----------------------------------------------------- */

/*
 * Скрол перенесено всередину панелі, а сам контейнер лишається
 * нерухомим: фонова марка позиціюється від нього, і якби прокручувався
 * він, вона їхала б разом із вмістом і зникала з очей у довгих
 * розділах.
 */
.ts-megamenu__panels {
	position: relative;
	max-height: min(72vh, 620px);
	/* Марка зрізається краєм панелі, а не вилазить за картку меню. */
	overflow: hidden;
}

/*
 * Скрол живе в панелі, а не в контейнері: фонова марка позиціюється
 * від .ts-megamenu__panels, і якби прокручувався він, вона їхала б
 * разом зі вмістом.
 *
 * Колонка на всю висоту: посилання «Усі товари розділу» має стояти
 * біля нижнього краю панелі завжди, а не там, де скінчилися колонки.
 * У розділах на три групи воно висіло посеред порожнечі.
 */
.ts-megamenu__panel {
	position: relative;
	display: flex;
	flex-direction: column;
	min-height: 100%;
	max-height: min(72vh, 620px);
	padding: var(--ts-space-5) var(--ts-space-6);
	overflow-y: auto;
	overscroll-behavior: contain;
	/* Вміст поверх фонової марки. */
	z-index: 1;
}

/* Колонки забирають вільне місце, посилання лишається під ними. */
.ts-megamenu__panel .ts-megamenu__columns {
	flex: 1 1 auto;
}

.ts-megamenu__panel[hidden] {
	display: none;
}

/*
 * Колонки самі розкладаються за шириною: на широкому екрані чотири,
 * на вужчому менше. Так панель не ламається на ноутбуці 1366px.
 */
/*
 * Кладка, а не сітка. У grid усі комірки рядка починаються з однієї
 * висоти, тож одна довга колонка («Контроль доступу» на дев'ять
 * пунктів) лишала під сусідами діру на пів-панелі. CSS-колонки
 * укладають групи одна під одною й переносять, коли колонка
 * заповнилась, — порожнеча зникає сама.
 *
 * column-width, а не фіксоване число: на широкому екрані колонок
 * більше, на ноутбуці менше, і панель не ламається.
 */
.ts-megamenu__columns {
	column-width: 200px;
	column-gap: var(--ts-space-5);
}

/*
 * Кут під хвилею лишаємо вільним. Без цього в довгих розділах
 * («Ручний інструмент») останні бренди — Milwaukee, DeWALT —
 * опинялися просто під малюнком і ставали нечитабельними.
 *
 * float у кінці потоку колонок відсуває текст, але сам місця в
 * розкладці не займає, тож короткі розділи від цього не змінюються.
 */
@media (min-width: 1280px) {
	.ts-megamenu__columns::after {
		content: '';
		display: block;
		float: right;
		width: 340px;
		height: 104px;
	}
}

/*
 * Група не повинна розриватися між колонками: заголовок в одній, а
 * його підкатегорії в наступній — гірше за будь-яку діру.
 */
.ts-megamenu__column {
	display: inline-block;
	width: 100%;
	margin-bottom: var(--ts-space-6);
	break-inside: avoid;
	page-break-inside: avoid;
}

/*
 * Заголовок групи: значок і назва в один рядок. Значок вирівнюємо
 * по першому рядку, а не по центру, — назви бувають у два рядки,
 * і центрований значок тоді з'їжджає вниз.
 */
.ts-megamenu__group {
	display: flex;
	align-items: flex-start;
	gap: var(--ts-space-2);
	margin-bottom: var(--ts-space-2);
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-semibold);
	/* Заголовки груп у макеті сині — вони і є посилання на розділ. */
	color: var(--ts-color-primary);
	line-height: 1.3;
}

.ts-megamenu__group-name {
	flex: 1 1 auto;
}

/*
 * Значок заголовка — на блакитній плитці, як у макеті: голий штрих
 * губився поруч із жирним синім текстом і колонки виглядали як
 * суцільний список посилань.
 */
.ts-megamenu__group .ts-cat-thumb {
	margin-top: -1px;
	width: 28px;
	height: 28px;
	padding: 4px;
	border-radius: var(--ts-radius-md);
	background: var(--ts-color-primary-soft);
	color: var(--ts-color-primary);
}

/* Фото категорії заповнює плитку цілком, без поля навколо. */
.ts-megamenu__group img.ts-cat-thumb {
	padding: 0;
	object-fit: cover;
}

.ts-megamenu__group:hover {
	color: var(--ts-color-primary-hover);
	text-decoration: none;
}

.ts-megamenu__leaves {
	margin: 0;
	padding: 0;
	list-style: none;
}

.ts-megamenu__leaf,
.ts-megamenu__more {
	display: block;
	padding: 3px 0;
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
	line-height: 1.4;
}

.ts-megamenu__leaf:hover,
.ts-megamenu__more:hover {
	color: var(--ts-color-primary);
	text-decoration: none;
}

.ts-megamenu__more {
	color: var(--ts-color-primary);
}

.ts-megamenu__all {
	/*
	 * margin-top: auto притискає посилання до низу панелі — воно
	 * стоїть на однаковій висоті в кожному розділі, незалежно від
	 * того, скільки в ньому груп.
	 */
	margin-top: auto;
	display: inline-flex;
	align-items: center;
	gap: var(--ts-space-1);
	padding-top: var(--ts-space-4);
	border-top: 1px solid var(--ts-color-border);
	width: 100%;
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-medium);
	color: var(--ts-color-primary);
	/* Марка лежить нижче — посилання має лишатися клікабельним. */
	position: relative;
	z-index: 1;
}

.ts-megamenu__all:hover {
	text-decoration: none;
}

.ts-megamenu__empty {
	margin: 0;
	font-size: var(--ts-text-sm);
}

/*
 * На вузьких екранах меню-каталог замінює мобільна навігація
 * (template-parts/header/mobile-nav.php), тому тут просто ховаємо:
 * дві колонки на 400px нечитабельні.
 */
@media (max-width: 899px) {
	.ts-megamenu {
		display: none;
	}
}

/* --- Overlay ------------------------------------------------------------ */

.ts-overlay {
	position: fixed;
	inset: 0;
	z-index: var(--ts-z-overlay);
	background: rgba(4, 22, 42, 0.5);
	opacity: 0;
	visibility: hidden;
	transition: opacity var(--ts-duration-base) var(--ts-ease),
		visibility var(--ts-duration-base) var(--ts-ease);
}

.ts-overlay.is-open {
	opacity: 1;
	visibility: visible;
}

/* --- Drawer: мобільне меню і фільтри (ТЗ §10, §25) ---------------------- */

.ts-drawer {
	position: fixed;
	top: 0;
	bottom: 0;
	left: 0;
	z-index: var(--ts-z-drawer);
	display: flex;
	flex-direction: column;
	width: min(88vw, 380px);
	background: var(--ts-color-surface);
	transform: translateX(-100%);
	transition: transform var(--ts-duration-slow) var(--ts-ease);
}

.ts-drawer--right {
	left: auto;
	right: 0;
	transform: translateX(100%);
}

.ts-drawer.is-open {
	transform: translateX(0);
}

.ts-drawer__head {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: var(--ts-space-3);
	padding: var(--ts-space-4);
	border-bottom: 1px solid var(--ts-color-border);
	flex: none;
}

.ts-drawer__title {
	font-size: var(--ts-text-md);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

.ts-drawer__body {
	flex: 1 1 auto;
	overflow-y: auto;
	overscroll-behavior: contain;
	-webkit-overflow-scrolling: touch;
}

.ts-drawer__foot {
	flex: none;
	display: flex;
	gap: var(--ts-space-3);
	padding: var(--ts-space-4);
	border-top: 1px solid var(--ts-color-border);
	background: var(--ts-color-surface);
}

.ts-drawer__close {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 40px;
	height: 40px;
	flex: none;
	border-radius: var(--ts-radius-md);
	color: var(--ts-color-muted);
}

.ts-drawer__close:hover {
	background: var(--ts-color-surface-sunken);
	color: var(--ts-color-text);
}

/* Блокування скролу body під час відкритого drawer/modal */
body.ts-no-scroll {
	overflow: hidden;
}

/* --- Breadcrumbs (ТЗ §26, §34) ------------------------------------------ */

.ts-breadcrumbs {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: var(--ts-space-2);
	padding-block: var(--ts-space-4);
	font-size: var(--ts-text-xs);
	color: var(--ts-color-muted);
}

.ts-breadcrumbs a {
	color: var(--ts-color-muted);
}

.ts-breadcrumbs a:hover {
	color: var(--ts-color-primary);
}

.ts-breadcrumbs__sep {
	color: var(--ts-color-faint);
}

.ts-breadcrumbs__current {
	color: var(--ts-color-text);
}

/* --- Pagination --------------------------------------------------------- */

.ts-pagination {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: center;
	gap: var(--ts-space-2);
	margin-block: var(--ts-space-8);
}

/* Стилізуємо і власний клас, і page-numbers від paginate_links() */
.ts-pagination__item,
.ts-pagination .page-numbers {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 40px;
	height: 40px;
	padding-inline: var(--ts-space-2);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-md);
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-medium);
	color: var(--ts-color-text);
}

.ts-pagination__item:hover,
.ts-pagination a.page-numbers:hover {
	border-color: var(--ts-color-primary);
	color: var(--ts-color-primary);
	text-decoration: none;
}

.ts-pagination__item[aria-current="page"],
.ts-pagination .page-numbers.current {
	background: var(--ts-color-primary);
	border-color: var(--ts-color-primary);
	color: #fff;
}

/* Три крапки — не клікабельні, тому без рамки */
.ts-pagination .page-numbers.dots {
	border-color: transparent;
	color: var(--ts-color-faint);
}

/* --- Footer ------------------------------------------------------------- */

/*
 * Підвал — світла картка на тлі сторінки, а не суцільна сіра смуга:
 * так він читається як окремий блок і не змагається з контентом.
 */
.ts-footer {
	margin-top: var(--ts-space-16);
	padding-bottom: var(--ts-space-6);
	background: var(--ts-color-bg);
}

/*
 * Картка ледь відтінена, майже біла (#f7fafc за макетом): сірий
 * --surface-sunken робив підвал важким і відсував його на задній план.
 */
.ts-footer__card {
	padding: var(--ts-space-8) var(--ts-space-8) var(--ts-space-5);
	background: var(--ts-color-surface-tint);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-xl);
}

/*
 * П'ять колонок: бренд ширший за решту, бо там опис магазину.
 * auto-fit тут не годиться — колонки мають різну вагу, і при
 * рівних частках опис ламався б на вузькі рядки.
 */
.ts-footer__top {
	display: grid;
	grid-template-columns: minmax(0, 1fr);
	gap: var(--ts-space-8);
	padding-bottom: var(--ts-space-6);
}

@media (min-width: 620px) {
	.ts-footer__top {
		grid-template-columns: repeat(2, minmax(0, 1fr));
	}
}

/*
 * Планшет: три колонки. Бренд і контакти ширші за списки посилань,
 * тому кожен займає свою колонку, а «Каталог», «Покупцям» і
 * «Оплата» лягають у другий ряд. На двох колонках остання секція
 * лишалась сама посеред порожнього ряду.
 */
@media (min-width: 900px) {
	.ts-footer__top {
		grid-template-columns: repeat(3, minmax(0, 1fr));
	}
}

@media (min-width: 1100px) {
	.ts-footer__top {
		grid-template-columns: 1.35fr 1.25fr 1fr 1fr 1.3fr;
		gap: var(--ts-space-6);
	}
}

/* Розділювач між брендом і рештою — лише там, де колонки в ряд. */
@media (min-width: 1100px) {
	.ts-footer__brand {
		padding-right: var(--ts-space-6);
		border-right: 1px solid var(--ts-color-border);
	}
}

.ts-footer__logo {
	display: inline-block;
}

.ts-footer__logo img {
	display: block;
	width: auto;
	height: 40px;
}

.ts-footer__tagline {
	margin: var(--ts-space-2) 0 0;
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

.ts-footer__about {
	margin: var(--ts-space-4) 0 0;
	font-size: var(--ts-text-sm);
	line-height: var(--ts-leading-relaxed);
	color: var(--ts-color-muted);
}

.ts-footer__perks {
	display: grid;
	gap: var(--ts-space-3);
	margin: var(--ts-space-5) 0 0;
	padding: 0;
	list-style: none;
}

.ts-footer__perk {
	display: flex;
	align-items: flex-start;
	gap: var(--ts-space-3);
}

/*
 * Іконка в світлому квадраті: на сірому тлі підвалу сам по собі
 * синій штрих загубився б, а плашка тримає ряд рівним.
 */
.ts-footer__perk-icon,
.ts-footer__lead-icon,
.ts-footer__help-icon {
	flex: 0 0 auto;
	display: grid;
	place-items: center;
	width: 38px;
	height: 38px;
	color: var(--ts-color-primary);
	background: var(--ts-color-primary-soft);
	border-radius: var(--ts-radius-md);
}

.ts-footer__lead-icon--lg {
	width: 48px;
	height: 48px;
	border-radius: var(--ts-radius-lg);
}

.ts-footer__perk-text,
.ts-footer__help-text,
.ts-footer__social-text {
	display: flex;
	flex-direction: column;
	min-width: 0;
	gap: 1px;
}

.ts-footer__perk-title,
.ts-footer__support-title {
	font-size: var(--ts-text-base);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
	line-height: 1.35;
}

.ts-footer__perk-note,
.ts-footer__lead-note {
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
	line-height: 1.4;
}

.ts-footer__title {
	margin: 0 0 var(--ts-space-4);
	font-size: var(--ts-text-lg);
	font-weight: var(--ts-weight-bold);
	color: var(--ts-color-text-strong);
}

/* --- Контакти ----------------------------------------------------------- */

.ts-footer__lead,
.ts-footer__support {
	display: flex;
	align-items: center;
	gap: var(--ts-space-3);
}

.ts-footer__support {
	margin-top: var(--ts-space-5);
	padding-top: var(--ts-space-5);
	border-top: 1px solid var(--ts-color-border);
}

.ts-footer__lead > span:last-child,
.ts-footer__support > span:last-child {
	display: flex;
	flex-direction: column;
	min-width: 0;
	gap: 1px;
}

/*
 * Номер не переносимо: розірваний на два рядки, він перестає
 * читатись як номер. У вузькій колонці краще трохи зменшити кегль.
 */
.ts-footer__phone-main {
	font-size: var(--ts-text-xl);
	font-weight: var(--ts-weight-bold);
	color: var(--ts-color-text-strong);
	font-variant-numeric: tabular-nums;
	letter-spacing: -0.01em;
	white-space: nowrap;
	line-height: 1.2;
}

@media (min-width: 1280px) {
	.ts-footer__phone-main {
		font-size: var(--ts-text-2xl);
	}
}

.ts-footer__phone-main:hover {
	color: var(--ts-color-primary);
	text-decoration: none;
}

.ts-footer__phones {
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: var(--ts-space-1) var(--ts-space-3);
	margin: var(--ts-space-4) 0 0;
	padding: 0;
	list-style: none;
	font-size: var(--ts-text-sm);
	font-variant-numeric: tabular-nums;
}

/* Номер в один рядок: перенесений, він не читається як номер. */
/*
 * Номери темні, а не посилальні сині: у списку з десяти рядків
 * суцільний синій рябить, а сам номер читається гірше. Синій
 * лишаємо для наведення — там він підказує, що це клікабельно.
 */
.ts-footer__phones a {
	white-space: nowrap;
	color: var(--ts-color-text-strong);
}

.ts-footer__mail {
	display: flex;
	align-items: center;
	gap: var(--ts-space-2);
	margin-top: var(--ts-space-4);
	padding-top: var(--ts-space-4);
	border-top: 1px solid var(--ts-color-border);
	font-size: var(--ts-text-sm);
}

.ts-footer__mail-icon {
	color: var(--ts-color-primary);
	display: inline-flex;
}

.ts-footer__mail:hover {
	text-decoration: none;
	color: var(--ts-color-primary);
}

/* --- Списки посилань ---------------------------------------------------- */

.ts-footer__nav {
	display: grid;
	gap: 2px;
	margin: 0;
	padding: 0;
	list-style: none;
}

/*
 * Стрілка праворуч і межа по всій ширині колонки: рядок стає ціллю
 * для пальця, а не текстом, у який треба влучити.
 */
.ts-footer__link {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: var(--ts-space-3);
	min-height: 40px;
	padding: var(--ts-space-2) 0;
	font-size: var(--ts-text-base);
	color: var(--ts-color-muted);
}

.ts-footer__link .ts-icon {
	flex: 0 0 auto;
	color: var(--ts-color-faint);
	transition: transform var(--ts-duration-fast) var(--ts-ease),
		color var(--ts-duration-fast) var(--ts-ease);
}

.ts-footer__link:hover {
	color: var(--ts-color-primary);
	text-decoration: none;
}

.ts-footer__link:hover .ts-icon {
	color: var(--ts-color-primary);
	transform: translateX(2px);
}

/* --- Оплата й доставка -------------------------------------------------- */

.ts-footer__np {
	display: flex;
	align-items: center;
	gap: var(--ts-space-4);
	margin-top: var(--ts-space-5);
	padding-top: var(--ts-space-5);
	border-top: 1px solid var(--ts-color-border);
}

.ts-footer__np-logo {
	display: grid;
	place-items: center;
	flex: 0 0 auto;
	height: 48px;
	padding-inline: var(--ts-space-3);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-md);
}

.ts-footer__np-logo img {
	display: block;
	width: auto;
	height: 28px;
}

.ts-footer__np-text {
	display: flex;
	align-items: center;
	gap: var(--ts-space-2);
	min-width: 0;
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
	line-height: 1.4;
}

.ts-footer__np-icon {
	flex: 0 0 auto;
	display: inline-flex;
	color: var(--ts-color-faint);
}

/* --- Соцмережі й підтримка ---------------------------------------------- */

/*
 * Смуга світліша за картку — у макеті вона майже біла. Виносимо її
 * за поля картки від'ємними полями, щоб фон ішов до країв.
 */
.ts-footer__social-row {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: space-between;
	gap: var(--ts-space-6);
	margin: 0 calc(-1 * var(--ts-space-8)) calc(-1 * var(--ts-space-5));
	padding: var(--ts-space-5) var(--ts-space-8);
	background: var(--ts-color-surface);
	border-top: 1px solid var(--ts-color-border);
	border-radius: 0 0 var(--ts-radius-xl) var(--ts-radius-xl);
}

/*
 * Картки «Telegram» і «Відгуки на Hotline». Уся картка — посилання:
 * ціль велика і на мобільному, і на десктопі.
 */
.ts-footer__promo {
	display: flex;
	flex: 1 1 280px;
	align-items: center;
	gap: var(--ts-space-3);
	min-height: 64px;
	padding: var(--ts-space-3) var(--ts-space-4);
	color: var(--ts-color-text);
	text-decoration: none;
	background: var(--ts-color-surface-sunken);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
	transition: border-color var(--ts-duration-fast) var(--ts-ease),
		box-shadow var(--ts-duration-fast) var(--ts-ease);
}

.ts-footer__promo:hover {
	color: var(--ts-color-text);
	/* Уся картка — посилання: підкреслення тексту тут зайве. */
	text-decoration: none;
	border-color: var(--ts-color-primary);
	box-shadow: var(--ts-shadow-xs);
}

.ts-footer__promo-text {
	display: flex;
	flex: 1 1 auto;
	flex-direction: column;
	min-width: 0;
	gap: 1px;
}

.ts-footer__promo-icon {
	flex: 0 0 auto;
	display: block;
	width: 40px;
	height: 40px;
}

.ts-footer__promo-icon img {
	display: block;
	width: 40px;
	height: 40px;
}

/* Telegram — у своїх кольорах, щоб картку впізнавали з першого погляду. */
.ts-footer__promo--tg {
	background: var(--ts-color-telegram-soft);
	border-color: transparent;
}

.ts-footer__promo--tg:hover {
	border-color: var(--ts-color-telegram);
}

.ts-footer__promo-cta {
	flex: 0 0 auto;
	display: inline-flex;
	align-items: center;
	gap: var(--ts-space-1);
	padding: var(--ts-space-2) var(--ts-space-3);
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-semibold);
	color: #fff;
	background: var(--ts-color-telegram-button);
	border-radius: var(--ts-radius-full);
}

.ts-footer__promo--tg:hover .ts-footer__promo-cta {
	background: var(--ts-color-telegram-button-hover);
}

/* Інформер Hotline — картинка їхнього сервісу, 160×50. */
.ts-footer__hotline {
	flex: 0 0 auto;
	display: block;
	width: 160px;
	height: 50px;
	border-radius: var(--ts-radius-sm);
}

.ts-footer__help {
	display: flex;
	align-items: center;
	gap: var(--ts-space-3);
}

@media (min-width: 1100px) {
	.ts-footer__help {
		padding-left: var(--ts-space-6);
		border-left: 1px solid var(--ts-color-border);
	}
}

/*
 * Синя обводка за макетом: на ледь відтіненій картці сіра рамка
 * зливається з тлом, і кнопка перестає читатись як кнопка.
 */
.ts-footer__help-btn {
	flex: 0 0 auto;
	gap: var(--ts-space-2);
	background: var(--ts-color-surface);
	border-color: var(--ts-color-primary);
	color: var(--ts-color-primary);
}

.ts-footer__help-btn:hover {
	background: var(--ts-color-primary-soft);
	border-color: var(--ts-color-primary);
	color: var(--ts-color-primary);
}

/* --- Нижній рядок ------------------------------------------------------- */

.ts-footer__bottom {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: space-between;
	gap: var(--ts-space-3);
	padding: var(--ts-space-5) var(--ts-space-2) 0;
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
}

.ts-footer__copy {
	margin: 0;
}

.ts-footer__legal {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: var(--ts-space-3);
}

.ts-footer__legal a {
	color: var(--ts-color-muted);
}

.ts-footer__legal a:hover {
	color: var(--ts-color-primary);
}

.ts-footer__sep {
	color: var(--ts-color-border-strong);
}

.ts-footer__credit {
	display: flex;
	align-items: center;
	gap: var(--ts-space-2);
	margin: 0;
}

.ts-footer__credit a {
	display: inline-flex;
	align-items: center;
	min-height: 44px;
}

.ts-footer__credit img {
	display: block;
	width: 116px;
	height: 27px;
}

/*
 * Плаваюча кнопка чата (60 + відступ 24) у кінці сторінки лягає на правий
 * край рядка. Відступаємо лише на те, чого не вистачає поля контейнера:
 * (100vw - 100%) / 2 — відстань від рядка до краю вікна.
 */
@media (min-width: 760px) {
	.ts-footer__bottom {
		padding-right: max(var(--ts-space-2), calc(84px + var(--ts-space-3) - (100vw - 100%) / 2));
	}
}

@media (max-width: 759px) {
	.ts-footer__card {
		padding: var(--ts-space-6) var(--ts-space-4) var(--ts-space-4);
	}

	/* Поля картки на мобільному інші — виносимо смугу рівно на них. */
	.ts-footer__social-row {
		margin: 0 calc(-1 * var(--ts-space-4)) calc(-1 * var(--ts-space-4));
		padding: var(--ts-space-5) var(--ts-space-4);
	}

	/* Проміжок між стовпчиками вужчий — ширина потрібна самим номерам. */
	.ts-footer__phones {
		gap: var(--ts-space-1) var(--ts-space-2);
	}

	.ts-footer__social-row {
		flex-direction: column;
		align-items: stretch;
	}

	/* У колонці flex-basis став би висотою картки. */
	.ts-footer__promo {
		flex: 0 0 auto;
	}

	/* Уся картка — посилання; кнопка лише забирала б місце в тексту. */
	.ts-footer__promo-cta {
		display: none;
	}

	.ts-footer__help {
		flex-wrap: wrap;
	}

	.ts-footer__help-btn {
		width: 100%;
		justify-content: center;
	}

	.ts-footer__bottom {
		flex-direction: column;
		align-items: flex-start;
	}
}

/* --- Мобільна навігація каталогом (ТЗ §25) ------------------------------ */

.ts-mnav {
	position: relative;
}

.ts-mnav__panel {
	display: none;
}

.ts-mnav__panel.is-active {
	display: block;
}

.ts-mnav__item {
	border-bottom: 1px solid var(--ts-color-border);
}

.ts-mnav__link {
	display: flex;
	align-items: center;
	gap: var(--ts-space-3);
	width: 100%;
	min-height: 52px;
	padding: var(--ts-space-3) var(--ts-space-4);
	font-size: var(--ts-text-base);
	font-weight: var(--ts-weight-medium);
	color: var(--ts-color-text);
	text-align: left;
}

/*
 * Назва забирає вільне місце, тож значок лишається біля лівого краю,
 * а стрілка притискається до правого. Раніше тут був
 * justify-content: space-between — зі значком він розкидав би три
 * елементи по кутах.
 */
.ts-mnav__name {
	flex: 1 1 auto;
	min-width: 0;
}

/*
 * Значок категорії. Фіксована ширина — щоб назви вишикувалися в
 * рівний стовпчик незалежно від того, іконка це, фото товару чи
 * плашка з літерою.
 */
.ts-mnav__link .ts-cat-thumb {
	flex: 0 0 auto;
	width: 22px;
	height: 22px;
	color: var(--ts-color-muted);
}

.ts-mnav__link:hover {
	background: var(--ts-color-surface-sunken);
	text-decoration: none;
}

.ts-mnav__link--branch svg {
	flex: none;
	color: var(--ts-color-faint);
}

.ts-mnav__link--all {
	color: var(--ts-color-primary);
	font-weight: var(--ts-weight-semibold);
}

.ts-mnav__back {
	display: flex;
	align-items: center;
	gap: var(--ts-space-2);
	width: 100%;
	min-height: 48px;
	padding: var(--ts-space-3) var(--ts-space-4);
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-muted);
	background: var(--ts-color-surface-sunken);
}

/* Стрілка «назад» — та сама іконка, розвернута */
.ts-mnav__back svg {
	transform: rotate(180deg);
}

.ts-mnav__back:hover {
	color: var(--ts-color-text);
}

/* Кнопка закриття drawer — теж ціль для пальця */
@media (max-width: 1023px) {
	.ts-drawer__close {
		width: 44px;
		height: 44px;
	}

	/* Зона закриття вже 44px, вертикальні відступи лише забирали висоту */
	.ts-drawer__head {
		padding-block: var(--ts-space-1);
	}
}

/* Пагінація на телефоні — теж 44px */
@media (max-width: 767px) {
	.ts-pagination__item,
	.ts-pagination .page-numbers {
		min-width: 44px;
		height: 44px;
	}
}

/* Номери в підвалі: логотип оператора поруч із номером. */
.ts-footer__phones li {
	display: flex;
	align-items: center;
	gap: var(--ts-space-2);
	min-width: 0;
}

/*
 * Номери набирають, а не читають як текст: підкреслення при наведенні
 * лише рябить у списку з десяти рядків.
 */
.ts-footer__phones a:hover,
.ts-footer__phones a:focus-visible {
	color: var(--ts-color-primary);
	text-decoration: none;
}

/* --- Текстові сторінки (Про нас, Гарантія, Оплата…) --------------------- */

/*
 * Обмежуємо довжину рядка: на широкому екрані текст на всю ширину
 * контейнера читається погано — око губить початок наступного рядка.
 */
.ts-page {
	max-width: 76ch;
	padding-block: var(--ts-space-6) var(--ts-space-10);
}

/*
 * Сторінки WooCommerce йдуть через той самий page.php, але 76ch —
 * це міра для читання тексту, а не для таблиць. На кошику вона
 * стискала сітку до 671px: колонка назви отримувала 0px, і назва
 * переносилась по літері. Знімаємо межу там, де вміст не текст.
 */
.woocommerce-page .ts-page,
.woocommerce-cart .ts-page,
.woocommerce-checkout .ts-page,
.woocommerce-account .ts-page {
	max-width: none;
}

.ts-page__head {
	margin-bottom: var(--ts-space-6);
}

.ts-page__title {
	margin: 0;
	font-size: var(--ts-text-3xl);
	line-height: var(--ts-leading-snug);
}

/*
 * Найвужчі екрани: два номери поруч не вміщаються навіть із вузьким
 * проміжком. Номер розривати не можна, тому переходимо в один
 * стовпчик — краще довший список, ніж обрізані цифри.
 */
@media (max-width: 400px) {
	.ts-footer__phones {
		grid-template-columns: minmax(0, 1fr);
	}
}

/* --- Сторінка 404 -------------------------------------------------------- */

/*
 * Тупик робимо розвилкою: великий код помилки, пошук і розділи.
 * Вирівнювання по центру, але текст лишається читабельним — блок
 * обмежений по ширині, інакше рядки розтягувались би на весь екран.
 */
.ts-404 {
	max-width: 46rem;
	margin: 0 auto;
	padding: var(--ts-space-10) 0 var(--ts-space-12);
	text-align: center;
}

/*
 * Код помилки — великий, але приглушений: він позначає ситуацію,
 * а вести має заголовок і пошук, а не чотиризначне число.
 */
.ts-404__code {
	margin: 0;
	font-size: clamp(4rem, 12vw, 7rem);
	font-weight: var(--ts-weight-bold);
	line-height: 1;
	letter-spacing: -0.02em;
	color: var(--ts-color-primary);
	opacity: 0.18;
}

.ts-404__title {
	margin: calc(var(--ts-space-4) * -1) 0 0;
	font-size: var(--ts-text-3xl);
	line-height: var(--ts-leading-tight);
}

.ts-404__lead {
	margin: var(--ts-space-3) auto 0;
	max-width: 34rem;
	font-size: var(--ts-text-md);
	color: var(--ts-color-muted);
}

.ts-404__search {
	display: flex;
	gap: var(--ts-space-2);
	margin-top: var(--ts-space-6);
}

.ts-404__input {
	flex: 1 1 auto;
	min-width: 0;
	padding: 0 var(--ts-space-4);
	height: 48px;
	font-size: var(--ts-text-base);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border-strong);
	border-radius: var(--ts-radius-md);
}

.ts-404__input:focus {
	outline: none;
	border-color: var(--ts-color-primary);
	box-shadow: 0 0 0 3px rgba(11, 99, 246, 0.15);
}

.ts-404__submit {
	flex: 0 0 auto;
	height: 48px;
}

.ts-404__actions {
	display: flex;
	flex-wrap: wrap;
	justify-content: center;
	gap: var(--ts-space-3);
	margin-top: var(--ts-space-4);
}

.ts-404__block {
	margin-top: var(--ts-space-10);
	padding-top: var(--ts-space-8);
	border-top: 1px solid var(--ts-color-border);
}

.ts-404__subtitle {
	margin: 0 0 var(--ts-space-4);
	font-size: var(--ts-text-lg);
}

.ts-404__cats {
	display: grid;
	grid-template-columns: repeat(3, minmax(0, 1fr));
	gap: var(--ts-space-2);
	margin: 0;
	padding: 0;
	list-style: none;
	text-align: left;
}

.ts-404__cat {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: var(--ts-space-2);
	/* 48px — палець потрапляє без прицілювання. */
	min-height: 48px;
	padding: var(--ts-space-2) var(--ts-space-3);
	font-size: var(--ts-text-sm);
	color: var(--ts-color-text);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-md);
	transition: border-color 0.15s ease, color 0.15s ease;
}

.ts-404__cat:hover {
	color: var(--ts-color-primary);
	border-color: var(--ts-color-primary);
	text-decoration: none;
}

.ts-404__cat .ts-icon {
	flex: 0 0 auto;
	color: var(--ts-color-faint);
}

.ts-404__help {
	margin: var(--ts-space-8) 0 0;
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
}

@media (max-width: 899px) {
	.ts-404__cats {
		grid-template-columns: repeat(2, minmax(0, 1fr));
	}
}

/*
 * Телефон: пошук у стовпчик — поле й кнопка поруч стають надто
 * вузькими, щоб у них щось вмістилось.
 */
@media (max-width: 639px) {
	.ts-404 {
		padding: var(--ts-space-6) 0 var(--ts-space-10);
	}

	.ts-404__search {
		flex-direction: column;
	}

	.ts-404__input,
	.ts-404__submit {
		width: 100%;
	}

	.ts-404__cats {
		grid-template-columns: minmax(0, 1fr);
	}

	.ts-404__actions .ts-btn {
		flex: 1 1 100%;
		justify-content: center;
	}
}

/* --- Карта сайту --------------------------------------------------------- */

.ts-sitemap__section {
	margin-top: var(--ts-space-8);
	padding-top: var(--ts-space-6);
	border-top: 1px solid var(--ts-color-border);
}

.ts-sitemap__title {
	margin: 0 0 var(--ts-space-5);
	font-size: var(--ts-text-xl);
}

.ts-sitemap__title a {
	color: var(--ts-color-text-strong);
}

.ts-sitemap__title a:hover {
	color: var(--ts-color-primary);
	text-decoration: none;
}

.ts-sitemap__grid {
	display: grid;
	grid-template-columns: repeat(4, minmax(0, 1fr));
	gap: var(--ts-space-6);
}

.ts-sitemap__group-title {
	margin: 0 0 var(--ts-space-3);
	padding-bottom: var(--ts-space-2);
	font-size: var(--ts-text-base);
	font-weight: var(--ts-weight-semibold);
	border-bottom: 1px solid var(--ts-color-border);
}

.ts-sitemap__group-title a {
	color: var(--ts-color-text-strong);
}

.ts-sitemap__group-title a:hover {
	color: var(--ts-color-primary);
	text-decoration: none;
}

.ts-sitemap__list {
	display: grid;
	gap: 2px;
	margin: 0;
	padding: 0;
	list-style: none;
}

.ts-sitemap__list a {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: var(--ts-space-2);
	/* 36px — рядок лишається компактним, але палець потрапляє. */
	min-height: 36px;
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
}

.ts-sitemap__list a:hover {
	color: var(--ts-color-primary);
	text-decoration: none;
}

/* Кількість товарів праворуч — видно, куди є сенс заходити. */
.ts-sitemap__count {
	flex: 0 0 auto;
	font-size: var(--ts-text-xs);
	color: var(--ts-color-faint);
	font-variant-numeric: tabular-nums;
}

/*
 * Службові переліки (сторінки, статті) ставимо в рядок: їх небагато,
 * і стовпчик з десяти пунктів розтягував би сторінку без потреби.
 */
.ts-sitemap__list--inline {
	display: flex;
	flex-wrap: wrap;
	gap: var(--ts-space-2) var(--ts-space-5);
}

.ts-sitemap__list--inline a {
	min-height: 32px;
}

.ts-sitemap__more {
	margin: var(--ts-space-6) 0 0;
}

@media (max-width: 999px) {
	.ts-sitemap__grid {
		grid-template-columns: repeat(2, minmax(0, 1fr));
	}
}

@media (max-width: 639px) {
	.ts-sitemap__grid {
		grid-template-columns: minmax(0, 1fr);
		gap: var(--ts-space-5);
	}
}

/* Поки довантажується файл меню (inc/menu-cache.php) — частки секунди. */
.ts-megamenu__loading {
	margin: 0;
	padding: var(--ts-space-6);
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
}

/* ==========================================================================
   Сторінка «Контакти» (page-kontakty.php)
   ========================================================================== */

.ts-contacts {
	padding-block: var(--ts-space-6) var(--ts-space-12);
}

.ts-contacts__head {
	max-width: 760px;
	margin-bottom: var(--ts-space-8);
}

.ts-contacts__lead {
	margin: var(--ts-space-3) 0 var(--ts-space-4);
	font-size: var(--ts-text-md);
	color: var(--ts-color-muted);
}

/* «Зараз працюємо» — зелена, «зачинено» — сіра (стан ставить main.js). */
.ts-contacts__hours {
	display: inline-flex;
	align-items: center;
	gap: var(--ts-space-2);
	margin: 0;
	padding: var(--ts-space-2) var(--ts-space-4);
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-muted);
	background: var(--ts-color-surface-sunken);
	border-radius: var(--ts-radius-full);
}

.ts-contacts__hours[data-state="open"] {
	color: var(--ts-color-success);
	background: var(--ts-color-success-soft);
}

.ts-contacts__dot {
	width: 8px;
	height: 8px;
	border-radius: var(--ts-radius-full);
	background: currentColor;
}

.ts-contacts__hours[data-state="open"] .ts-contacts__dot {
	box-shadow: 0 0 0 3px rgba(22, 163, 74, 0.2);
}

/*
 * Сітка на 12: телефони ширші за месенджери, решта — чотири рівні
 * картки в ряд.
 */
.ts-contacts__grid {
	display: grid;
	grid-template-columns: repeat(12, minmax(0, 1fr));
	gap: var(--ts-space-5);
}

.ts-contacts__card {
	grid-column: span 3;
	display: flex;
	flex-direction: column;
	gap: var(--ts-space-3);
	padding: var(--ts-space-6);
	color: var(--ts-color-text);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
}

/*
 * Перший ряд — без розтягування по висоті сусіда: месенджерів довший
 * список, і під телефонами лишалась порожня смуга.
 */
.ts-contacts__card--phones {
	grid-column: span 7;
	align-self: start;
}

.ts-contacts__card--messengers {
	grid-column: span 5;
	align-self: start;
}

.ts-contacts__title {
	display: flex;
	align-items: center;
	gap: var(--ts-space-3);
	margin: 0;
	font-size: var(--ts-text-lg);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

.ts-contacts__icon {
	flex: none;
	display: grid;
	place-items: center;
	width: 38px;
	height: 38px;
	color: var(--ts-color-primary);
	background: var(--ts-color-primary-soft);
	border-radius: var(--ts-radius-md);
}

.ts-contacts__note,
.ts-contacts__text,
.ts-contacts__address {
	margin: 0;
	font-size: var(--ts-text-base);
	color: var(--ts-color-muted);
	line-height: var(--ts-leading-relaxed);
}

.ts-contacts__address {
	font-size: var(--ts-text-md);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

.ts-contacts__main {
	font-size: var(--ts-text-3xl);
	font-weight: var(--ts-weight-bold);
	line-height: 1.1;
	color: var(--ts-color-text-strong);
	font-variant-numeric: tabular-nums;
}

.ts-contacts__main:hover {
	color: var(--ts-color-primary);
	text-decoration: none;
}

.ts-contacts__groups {
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: var(--ts-space-5);
	margin-top: var(--ts-space-2);
	padding-top: var(--ts-space-5);
	border-top: 1px solid var(--ts-color-border);
}

.ts-contacts__subtitle {
	margin: 0 0 var(--ts-space-2);
	font-size: var(--ts-text-xs);
	font-weight: var(--ts-weight-semibold);
	letter-spacing: var(--ts-tracking-wide);
	text-transform: uppercase;
	color: var(--ts-color-faint);
}

.ts-contacts__phones,
.ts-contacts__messengers {
	display: grid;
	gap: var(--ts-space-1);
	margin: 0;
	padding: 0;
	list-style: none;
}

.ts-contacts__phone {
	display: flex;
	align-items: center;
	gap: var(--ts-space-3);
	min-height: 44px;
	padding: var(--ts-space-2) var(--ts-space-3);
	margin-inline: calc(-1 * var(--ts-space-3));
	color: var(--ts-color-text);
	border-radius: var(--ts-radius-md);
	transition: background-color var(--ts-duration-fast) var(--ts-ease);
}

.ts-contacts__phone:hover {
	color: var(--ts-color-primary);
	background: var(--ts-color-surface-hover);
	text-decoration: none;
}

.ts-contacts__phone-logo {
	flex: none;
	display: grid;
	place-items: center;
	width: 20px;
	height: 20px;
	color: var(--ts-color-faint);
}

.ts-contacts__phone-number {
	font-size: var(--ts-text-md);
	font-weight: var(--ts-weight-semibold);
	font-variant-numeric: tabular-nums;
	white-space: nowrap;
}

.ts-contacts__phone-note {
	margin-left: auto;
	font-size: var(--ts-text-xs);
	color: var(--ts-color-faint);
}

.ts-contacts__messengers {
	gap: var(--ts-space-3);
}

.ts-contacts__messenger {
	display: flex;
	flex-direction: column;
	gap: var(--ts-space-3);
	padding: var(--ts-space-4);
	background: var(--ts-color-surface-tint);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-md);
}

.ts-contacts__messenger-name {
	display: flex;
	align-items: center;
	gap: var(--ts-space-3);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

.ts-contacts__messenger-name img {
	width: 28px;
	height: 28px;
}

.ts-contacts__chips {
	display: flex;
	flex-wrap: wrap;
	gap: var(--ts-space-2);
}

.ts-contacts__chip {
	display: inline-flex;
	align-items: center;
	min-height: 36px;
	padding: 0 var(--ts-space-3);
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-semibold);
	font-variant-numeric: tabular-nums;
	color: var(--ts-color-text);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-full);
	white-space: nowrap;
	transition: border-color var(--ts-duration-fast) var(--ts-ease), color var(--ts-duration-fast) var(--ts-ease);
}

.ts-contacts__chip:hover {
	color: var(--ts-color-primary);
	border-color: var(--ts-color-primary);
	text-decoration: none;
}

.ts-contacts__link {
	font-size: var(--ts-text-lg);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-primary);
	word-break: break-all;
}

.ts-contacts__more {
	display: inline-flex;
	align-items: center;
	gap: var(--ts-space-1);
	margin-top: auto;
	padding-top: var(--ts-space-2);
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-primary);
}

/* Бот — у кольорах Telegram, уся картка — посилання. */
.ts-contacts__card--bot {
	background: var(--ts-color-telegram-soft);
	border-color: transparent;
	transition: border-color var(--ts-duration-fast) var(--ts-ease);
}

.ts-contacts__card--bot:hover {
	color: var(--ts-color-text);
	border-color: var(--ts-color-telegram);
	text-decoration: none;
}

.ts-contacts__card--bot .ts-contacts__title img {
	width: 38px;
	height: 38px;
}

.ts-contacts__card--bot .ts-contacts__more {
	color: var(--ts-color-telegram-button);
}

@media (max-width: 1099px) {
	.ts-contacts__card,
	.ts-contacts__card--phones,
	.ts-contacts__card--messengers {
		grid-column: span 6;
	}

	.ts-contacts__card--phones {
		grid-column: span 12;
	}
}

@media (max-width: 759px) {
	.ts-contacts__grid {
		grid-template-columns: minmax(0, 1fr);
		gap: var(--ts-space-4);
	}

	.ts-contacts__card,
	.ts-contacts__card--phones,
	.ts-contacts__card--messengers {
		grid-column: auto;
		padding: var(--ts-space-5);
	}

	.ts-contacts__groups {
		grid-template-columns: minmax(0, 1fr);
	}

	.ts-contacts__main {
		font-size: var(--ts-text-2xl);
	}
}

/* ==========================================================================
   Сторінка «Питання та відповіді» (page-faq.php)
   ========================================================================== */

.ts-faq {
	max-width: 880px;
	padding-block: var(--ts-space-6) var(--ts-space-12);
}

.ts-faq__head {
	margin-bottom: var(--ts-space-8);
}

.ts-faq__lead {
	margin: var(--ts-space-3) 0 var(--ts-space-5);
	font-size: var(--ts-text-md);
	color: var(--ts-color-muted);
	line-height: var(--ts-leading-relaxed);
}

/* Розділи — чіпами-якорями: на телефоні довгий список гортати до потрібного довго. */
.ts-faq__nav {
	display: flex;
	flex-wrap: wrap;
	gap: var(--ts-space-2);
}

.ts-faq__chip {
	display: inline-flex;
	align-items: center;
	gap: var(--ts-space-2);
	min-height: 40px;
	padding: 0 var(--ts-space-4);
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-full);
	transition: border-color var(--ts-duration-fast) var(--ts-ease), color var(--ts-duration-fast) var(--ts-ease);
}

.ts-faq__chip .ts-icon {
	color: var(--ts-color-primary);
}

.ts-faq__chip:hover {
	color: var(--ts-color-primary);
	border-color: var(--ts-color-primary);
	text-decoration: none;
}

.ts-faq__body {
	display: flex;
	flex-direction: column;
	gap: var(--ts-space-8);
}

/* Якір не ховається під липкою шапкою. */
.ts-faq__section {
	scroll-margin-top: 140px;
}

.ts-faq__section-title {
	display: flex;
	align-items: center;
	gap: var(--ts-space-3);
	margin: 0 0 var(--ts-space-4);
	font-size: var(--ts-text-xl);
	color: var(--ts-color-text-strong);
}

.ts-faq__section-icon {
	flex: none;
	display: grid;
	place-items: center;
	width: 38px;
	height: 38px;
	color: var(--ts-color-primary);
	background: var(--ts-color-primary-soft);
	border-radius: var(--ts-radius-md);
}

.ts-faq__list {
	display: flex;
	flex-direction: column;
	gap: var(--ts-space-2);
}

.ts-faq__item {
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
	transition: border-color var(--ts-duration-fast) var(--ts-ease), box-shadow var(--ts-duration-fast) var(--ts-ease);
}

.ts-faq__item:hover {
	border-color: var(--ts-color-border-strong);
}

.ts-faq__item[open] {
	border-color: var(--ts-color-primary);
	box-shadow: var(--ts-shadow-sm);
}

.ts-faq__q {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: var(--ts-space-4);
	min-height: 56px;
	padding: var(--ts-space-3) var(--ts-space-5);
	font-size: var(--ts-text-md);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
	cursor: pointer;
	list-style: none;
}

/* Стандартний трикутник <summary> — геть, у нас власна стрілка. */
.ts-faq__q::-webkit-details-marker {
	display: none;
}

.ts-faq__q:focus-visible {
	outline: 2px solid var(--ts-color-border-focus);
	outline-offset: 2px;
	border-radius: var(--ts-radius-lg);
}

.ts-faq__toggle {
	flex: none;
	display: grid;
	place-items: center;
	width: 32px;
	height: 32px;
	color: var(--ts-color-muted);
	background: var(--ts-color-surface-sunken);
	border-radius: var(--ts-radius-full);
	transition: transform var(--ts-duration-base) var(--ts-ease), background-color var(--ts-duration-fast) var(--ts-ease), color var(--ts-duration-fast) var(--ts-ease);
}

.ts-faq__item[open] .ts-faq__toggle {
	transform: rotate(180deg);
	color: var(--ts-color-primary);
	background: var(--ts-color-primary-soft);
}

.ts-faq__a {
	padding: 0 var(--ts-space-5) var(--ts-space-5);
	font-size: var(--ts-text-base);
	color: var(--ts-color-muted);
	line-height: var(--ts-leading-relaxed);
}

.ts-faq__a > :first-child {
	margin-top: 0;
}

.ts-faq__a > :last-child {
	margin-bottom: 0;
}

.ts-faq__a strong {
	color: var(--ts-color-text-strong);
}

/* «Не знайшли відповідь?» — картка з діями. */
.ts-faq__cta {
	display: grid;
	grid-template-columns: auto minmax(0, 1fr);
	gap: var(--ts-space-4) var(--ts-space-5);
	align-items: center;
	padding: var(--ts-space-6);
	background: var(--ts-color-primary-soft);
	border-radius: var(--ts-radius-xl);
}

.ts-faq__cta-icon {
	display: grid;
	place-items: center;
	width: 56px;
	height: 56px;
	color: var(--ts-color-primary-contrast);
	background: var(--ts-color-primary);
	border-radius: var(--ts-radius-lg);
}

.ts-faq__cta-title {
	margin: 0 0 var(--ts-space-1);
	font-size: var(--ts-text-lg);
	color: var(--ts-color-text-strong);
}

.ts-faq__cta-text p {
	margin: 0;
	font-size: var(--ts-text-base);
	color: var(--ts-color-muted);
}

.ts-faq__cta-actions {
	grid-column: 1 / -1;
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: var(--ts-space-3);
}

.ts-faq__cta-actions .ts-btn {
	gap: var(--ts-space-2);
}

.ts-faq__cta-actions .ts-btn img {
	width: 18px;
	height: 18px;
}

.ts-faq__cta-link {
	display: inline-flex;
	align-items: center;
	gap: var(--ts-space-1);
	margin-left: var(--ts-space-2);
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-primary);
}

@media (max-width: 759px) {
	.ts-faq__q {
		padding: var(--ts-space-3) var(--ts-space-4);
		font-size: var(--ts-text-base);
	}

	.ts-faq__a {
		padding: 0 var(--ts-space-4) var(--ts-space-4);
	}

	.ts-faq__section-title {
		font-size: var(--ts-text-lg);
	}

	.ts-faq__cta {
		padding: var(--ts-space-5);
	}

	.ts-faq__cta-actions .ts-btn {
		flex: 1 1 100%;
		justify-content: center;
	}

	.ts-faq__cta-link {
		margin: var(--ts-space-1) auto 0;
	}
}

/* ==========================================================================
   TopShop — Dropdown
   Власна заміна нативного <select>: він рендериться засобами ОС і
   виглядає по-різному в Windows/macOS/Android, тому не вписується
   в дизайн-систему (ТЗ §40).
   ========================================================================== */

.ts-dropdown {
	position: relative;
	display: inline-flex;
	flex: none;
}

/* --- Плаваючий підпис ----------------------------------------------------
   Сидить на рамці кнопки. Фон білий, щоб "розривати" лінію під собою.
   ------------------------------------------------------------------------ */

.ts-dropdown__label {
	position: absolute;
	top: -7px;
	left: var(--ts-space-3);
	z-index: 1;
	padding-inline: var(--ts-space-1);
	background: var(--ts-color-bg);
	font-size: var(--ts-text-2xs);
	color: var(--ts-color-muted);
	line-height: 1;
	white-space: nowrap;
	pointer-events: none;
}

/* --- Кнопка --------------------------------------------------------------- */

.ts-dropdown__trigger {
	display: inline-flex;
	align-items: center;
	gap: var(--ts-space-2);
	min-height: 44px;
	min-width: 0;
	padding: var(--ts-space-2) var(--ts-space-3);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border-strong);
	border-radius: var(--ts-radius-md);
	font-size: var(--ts-text-sm);
	color: var(--ts-color-text);
	text-align: left;
	transition: border-color var(--ts-duration-fast) var(--ts-ease),
		box-shadow var(--ts-duration-fast) var(--ts-ease);
}

.ts-dropdown__trigger:hover {
	border-color: var(--ts-color-primary);
}

.ts-dropdown__trigger[aria-expanded="true"] {
	border-color: var(--ts-color-primary);
	box-shadow: var(--ts-shadow-focus);
}

.ts-dropdown__value {
	flex: 1 1 auto;
	min-width: 0;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

.ts-dropdown__icon {
	flex: none;
	display: inline-flex;
	color: var(--ts-color-text);
}

.ts-dropdown__chevron {
	flex: none;
	color: var(--ts-color-faint);
	transition: transform var(--ts-duration-base) var(--ts-ease);
}

.ts-dropdown__trigger[aria-expanded="true"] .ts-dropdown__chevron {
	transform: rotate(180deg);
}

/* Компактний варіант — лише іконка (перемикач вигляду) */
.ts-dropdown--compact .ts-dropdown__trigger {
	gap: var(--ts-space-1);
	padding-inline: var(--ts-space-2);
}

/* --- Панель --------------------------------------------------------------- */

.ts-dropdown__panel {
	position: absolute;
	top: calc(100% + var(--ts-space-2));
	left: 0;
	z-index: var(--ts-z-dropdown);
	min-width: 100%;
	padding: var(--ts-space-1);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
	box-shadow: var(--ts-shadow-lg);
	/* Не даємо панелі вилізти за екран на вузьких вікнах */
	max-height: min(60vh, 420px);
	overflow-y: auto;
	overscroll-behavior: contain;
}

.ts-dropdown__panel[hidden] {
	display: none;
}

.ts-dropdown__panel:focus {
	outline: none;
}

/* Сортування ширше за кнопку: пункти довгі й не мають переноситись */
.ts-dropdown:not(.ts-dropdown--compact) .ts-dropdown__panel {
	min-width: 248px;
}

/*
 * Компактна кнопка вужча за свої ж пункти ("Списком" + іконка), тому
 * min-width: 100% давав горизонтальний скролбар. Тут ширину диктує вміст.
 */
.ts-dropdown--compact .ts-dropdown__panel {
	min-width: max-content;
	overflow-x: hidden;
}

/* Праворуч екрана панель відкривається від правого краю */
.ts-dropdown--end .ts-dropdown__panel {
	left: auto;
	right: 0;
}

/* --- Пункти --------------------------------------------------------------- */

.ts-dropdown__option {
	display: flex;
	align-items: center;
	gap: var(--ts-space-2);
	padding: var(--ts-space-3);
	border-radius: var(--ts-radius-md);
	font-size: var(--ts-text-sm);
	line-height: 1.3;
	color: var(--ts-color-text);
	cursor: pointer;
	white-space: nowrap;
}

/*
 * Один стиль і для наведення мишею, і для клавіатурної навігації:
 * інакше користувач клавіатури не бачить, де він зараз.
 */
.ts-dropdown__option:hover,
.ts-dropdown__option.is-active {
	background: var(--ts-color-surface-sunken);
}

.ts-dropdown__option.is-selected {
	color: var(--ts-color-primary);
	font-weight: var(--ts-weight-semibold);
}

.ts-dropdown__option-label {
	flex: 1 1 auto;
}

.ts-dropdown__option-icon {
	flex: none;
	display: inline-flex;
	color: currentColor;
}

.ts-dropdown__check {
	flex: none;
	opacity: 0;
	color: var(--ts-color-primary);
}

.ts-dropdown__option.is-selected .ts-dropdown__check {
	opacity: 1;
}

/* --- Панель каталогу: розкладка ------------------------------------------ */

/*
 * Перемикач вигляду доступний і на телефоні, як у x-kom.
 * Там обидва режими в одну колонку і різняться орієнтацією картки:
 * сітка — велике фото зверху, список — фото ліворуч і більше товарів
 * на екрані. Обидва доречні, тому вибір лишається за користувачем.
 */
.ts-toolbar__view {
	flex: none;
}

.ts-toolbar__sort {
	display: flex;
	align-items: center;
	gap: var(--ts-space-2);
	margin-left: auto;
}

/*
 * Край панелі обирає Dropdown.show() за вільним місцем. Жорсткий right: 0
 * на вузьких екранах виводив панель за лівий край: кнопка там ліворуч.
 */

/* ==========================================================================
   TopShop — Catalog
   Шапка каталогу, підкатегорії, панель сортування, сайдбар фільтрів.
   ========================================================================== */

/* --- Шапка каталогу ------------------------------------------------------ */

.ts-catalog__head {
	display: flex;
	align-items: baseline;
	flex-wrap: wrap;
	gap: var(--ts-space-3);
	margin-bottom: var(--ts-space-4);
}

/*
 * Відступ згори лежав лише на крихтах, тому сторінки без них
 * (теги, архіви без ланцюжка) починались заголовком впритул до меню.
 * Ставимо відступ самому заголовку, а коли крихти є — прибираємо,
 * щоб не подвоювався.
 */
.ts-catalog__head:first-child {
	margin-top: var(--ts-space-4);
}

.ts-catalog__count {
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
}

.ts-catalog__intro {
	max-width: 76ch;
	margin-block: var(--ts-space-8) var(--ts-space-6);
	font-size: var(--ts-text-sm);
	line-height: var(--ts-leading-relaxed);
	color: var(--ts-color-muted);
}

/* --- Картки підкатегорій ------------------------------------------------- */

.ts-subcats {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
	gap: var(--ts-space-3);
	margin-bottom: var(--ts-space-8);
}

.ts-subcat {
	display: flex;
	align-items: center;
	gap: var(--ts-space-3);
	padding: var(--ts-space-3);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-md);
	color: var(--ts-color-text);
	transition: border-color var(--ts-duration-fast) var(--ts-ease),
		background-color var(--ts-duration-fast) var(--ts-ease);
}

.ts-subcat:hover {
	border-color: var(--ts-color-primary);
	background: var(--ts-color-surface-hover);
	text-decoration: none;
}

/* Та сама подача, що на головній: іконка без сірої підкладки */
.ts-subcat__media {
	flex: none;
	display: flex;
	align-items: center;
	justify-content: center;
	width: 48px;
	height: 48px;
	overflow: hidden;
}

.ts-subcat__media img {
	width: 100%;
	height: 100%;
	object-fit: contain;
	transform: scale(1.35);
	mix-blend-mode: multiply;
}

.ts-subcat__body {
	display: flex;
	flex-direction: column;
	min-width: 0;
}

.ts-subcat__name {
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-medium);
	line-height: var(--ts-leading-snug);
}

.ts-subcat__count {
	font-size: var(--ts-text-2xs);
	color: var(--ts-color-faint);
}

/* --- Панель сортування --------------------------------------------------- */

.ts-toolbar {
	display: flex;
	align-items: center;
	justify-content: space-between;
	/* Три елементи (фільтри + вигляд + сортування) не вміщуються
	   в 320px одним рядком, тому дозволяємо перенос. */
	flex-wrap: wrap;
	gap: var(--ts-space-2) var(--ts-space-3);
	margin-bottom: var(--ts-space-5);
	padding-bottom: var(--ts-space-4);
	border-bottom: 1px solid var(--ts-color-border);
}

/*
 * На вузьких екранах усі три елементи мають лишитись в одному рядку:
 * перенос з'їдає висоту, а її на телефоні й так мало.
 *
 * Сортування стискається (його значення й так обрізається багатокрапкою),
 * а кнопка фільтрів лишається лише іконкою — підпис там не обов'язковий,
 * бо іконка однозначна, а доступну назву дає aria-label.
 */
@media (max-width: 479px) {
	.ts-toolbar__sort {
		flex: 1 1 auto;
		min-width: 0;
	}

	.ts-toolbar__sort .ts-dropdown,
	.ts-toolbar__sort .ts-dropdown__trigger {
		min-width: 0;
		max-width: 100%;
	}

	.ts-toolbar__filters {
		flex: none;
		/* 44px — мінімальна зручна ціль для пальця */
		min-height: 44px;
		min-width: 44px;
		padding-inline: var(--ts-space-3);
	}

	.ts-toolbar__filters span {
		display: none;
	}
}

/* Кнопка фільтрів потрібна лише там, де немає сайдбара */
@media (min-width: 1024px) {
	.ts-toolbar__filters {
		display: none;
	}
}

.ts-toolbar__sort {
	margin-left: auto;
}

.ts-select {
	min-height: 40px;
	padding: var(--ts-space-2) var(--ts-space-8) var(--ts-space-2) var(--ts-space-3);
	background-color: var(--ts-color-surface);
	/* Власна стрілка: нативна по-різному виглядає в різних ОС */
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%235b6b7f' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
	background-repeat: no-repeat;
	background-position: right var(--ts-space-3) center;
	border: 1px solid var(--ts-color-border-strong);
	border-radius: var(--ts-radius-md);
	font-size: var(--ts-text-sm);
	color: var(--ts-color-text);
	cursor: pointer;
	appearance: none;
}

.ts-select:focus {
	outline: none;
	border-color: var(--ts-color-primary);
	box-shadow: var(--ts-shadow-focus);
}

/* --- Сайдбар фільтрів ---------------------------------------------------- */

.ts-catalog__side {
	display: none;
}

.ts-catalog__sidebar {
	min-width: 0;
}

@media (min-width: 1024px) {
	/*
	 * Колонка липне під шапкою й гортається власним скролом, коли не
	 * вміщається. Одна прокрутка замість трьох: раніше фільтри жили у
	 * віконці на 430px, банер забирав половину висоти, а всередині
	 * групи мали ще й свій скрол — мишею в таке не потрапиш.
	 *
	 * Банер тепер у потоці колонки: доки гортаєш фільтри, він чекає
	 * внизу, а в коротких категоріях видно одразу.
	 */
	.ts-catalog__side {
		display: flex;
		flex-direction: column;
		gap: var(--ts-space-4);
		position: sticky;
		top: calc(var(--ts-header-height) + var(--ts-space-4));
		max-height: calc(100vh - var(--ts-header-height) - var(--ts-space-6));
		/*
		 * Свідомо без overscroll-behavior: contain. Вона тримає скрол
		 * усередині колонки, і догортавши фільтри до кінця, людина
		 * крутить колесо в порожнечу — сторінка не рухається, поки не
		 * відведеш курсор убік. Хай скрол переходить далі, як усюди.
		 */
		overflow-y: auto;
		/* Місце під заокруглені кути: прокручуваний контейнер їх ріже. */
		padding-bottom: 2px;
		/* Смуга прокрутки — спільна для сайту, див. _base.css. */
		scrollbar-gutter: stable;
	}

	/*
	 * Усередині колонки нічого власного не прокручується: список
	 * значень у групі теж розгортається на всю довжину, бо ховати
	 * його всередині вже прокручуваного блоку — це другий скрол.
	 */
	.ts-catalog__side .ts-filter__list {
		max-height: none;
		overflow: visible;
	}
}

/* --- Банери в сайдбарі ---------------------------------------------------- */

/*
 * Вертикальні банери під фільтрами. Якщо їх кілька, вони змінюються
 * самі — без стрілок і крапок: місце фонове, і керувати ним покупець
 * не має потреби.
 *
 * Розмітку дає плагін контенту (Sidebar_Renderer), тож класи
 * ts-sidebar-banner* мають лишатися синхронними з ним.
 */
.ts-sidebar-banners {
	position: relative;
	flex: 0 0 auto;
	overflow: hidden;
	border-radius: var(--ts-radius-lg);
	/* Пропорція банера: тримає висоту, поки картинка вантажиться. */
	aspect-ratio: 3 / 4;
}

/*
 * Банери лежать один на одному, видно верхній. Абсолютне положення —
 * щоб при зміні не було стрибка висоти: усі однакового розміру.
 */
.ts-sidebar-banner {
	position: absolute;
	inset: 0;
	display: block;
	opacity: 0;
	visibility: hidden;
	transition: opacity var(--ts-duration-slow) var(--ts-ease),
		visibility var(--ts-duration-slow) var(--ts-ease);
}

.ts-sidebar-banner.is-active {
	opacity: 1;
	visibility: visible;
}

/* Один банер — анімувати нічого, показуємо як є. */
.ts-sidebar-banners:not([data-ts-sidebar-banners]) .ts-sidebar-banner {
	position: static;
	opacity: 1;
	visibility: visible;
}

.ts-sidebar-banner__img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
}

/*
 * Зміна банерів — це рух без запиту користувача. Тим, хто просив
 * менше анімації, показуємо лише перший: перемикання вимикає JS.
 */
@media (prefers-reduced-motion: reduce) {
	.ts-sidebar-banner {
		transition: none;
	}
}

.ts-catalog__main {
	min-width: 0; /* дозволяє grid-колонці стискатись */
}

/* --- Довільний текстовий вміст ------------------------------------------- */

.ts-prose {
	font-size: var(--ts-text-md);
	line-height: var(--ts-leading-relaxed);
	color: var(--ts-color-text);
}

.ts-prose > * + * {
	margin-top: var(--ts-space-4);
}

/*
 * Відбивка між розділами тексту. Компоненти теми виключаємо з тієї
 * самої причини, що й списки нижче: заголовок «Разом» у підсумках
 * кошика — теж h2, і 32px згори відривали його від краю картки.
 */
.ts-prose h2:not([class*="ts-"]),
.ts-prose h3:not([class*="ts-"]) {
	margin-top: var(--ts-space-8);
}

/*
 * Маркери повертаємо спискам вмісту, але не компонентам теми:
 * всередині ts-prose трапляється, наприклад, смужка кроків кошика —
 * семантично це ol, і нумерація браузера малювала «1. 2. 3.» поруч
 * із кружечками кроків.
 *
 * Виключаємо за префіксом ts-, а не за «має клас»: редактор вішає
 * на власні списки wp-block-list, і вони теж лишились би без
 * маркерів.
 *
 * Повідомлення WooCommerce (ul.woocommerce-error) — теж не текст: на
 * сторінках кабінету помилка входу отримувала маркер «•» і відступ.
 */
.ts-prose ul:not([class*="ts-"], [class*="woocommerce-"]),
.ts-prose ol:not([class*="ts-"], [class*="woocommerce-"]) {
	padding-left: var(--ts-space-5);
	list-style: revert;
}

.ts-prose li:not([class*="ts-"]) + li:not([class*="ts-"]) {
	margin-top: var(--ts-space-2);
}

/*
 * Таблиці в статтях. Без цього порівняння характеристик виглядало
 * просто як колонки тексту: рядки не відділялись, заголовок не
 * читався як заголовок.
 */
.ts-prose table:not([class*="ts-"]) {
	width: 100%;
	border-collapse: collapse;
	font-size: var(--ts-text-sm);
}

.ts-prose table:not([class*="ts-"]) th,
.ts-prose table:not([class*="ts-"]) td {
	padding: var(--ts-space-2) var(--ts-space-3);
	text-align: left;
	border-bottom: 1px solid var(--ts-color-border);
}

.ts-prose table:not([class*="ts-"]) th {
	font-weight: var(--ts-weight-medium);
	color: var(--ts-color-text-strong);
	background: var(--ts-color-surface-sunken);
}

.ts-prose table:not([class*="ts-"]) tr:last-child td {
	border-bottom: 0;
}

/* Вузький екран: таблицю гортають, а не ламають по складах. */
@media (max-width: 639px) {
	.ts-prose table:not([class*="ts-"]) {
		display: block;
		overflow-x: auto;
		white-space: nowrap;
	}
}

/* --- Стан завантаження AJAX-каталогу (ТЗ §10, §49) ---------------------- */

.ts-catalog__main {
	position: relative;
}

/*
 * Під час оновлення приглушуємо список, але не ховаємо його: користувач
 * бачить, що саме змінюється, і сторінка не "стрибає" на порожній екран.
 */
.ts-catalog__main.is-loading [data-ts-products],
.ts-catalog__main.is-loading .ts-pagination,
.ts-catalog__main.is-loading .ts-empty {
	opacity: 0.45;
	pointer-events: none;
	transition: opacity var(--ts-duration-fast) var(--ts-ease);
}

.ts-catalog__main.is-loading::after {
	content: "";
	position: absolute;
	top: 0;
	left: 50%;
	transform: translateX(-50%);
	z-index: var(--ts-z-sticky);
	width: 28px;
	height: 28px;
	margin-top: var(--ts-space-8);
	border: 2.5px solid var(--ts-color-border-strong);
	border-top-color: var(--ts-color-primary);
	border-radius: var(--ts-radius-full);
	animation: ts-spin 0.7s linear infinite;
}

@keyframes ts-spin {
	to {
		transform: translateX(-50%) rotate(360deg);
	}
}

@media (prefers-reduced-motion: reduce) {
	.ts-catalog__main.is-loading::after {
		animation: none;
	}
}

/* --- Режим списку --------------------------------------------------------
   Свідомо використовуємо ТУ САМУ картку, лише перебудовуємо її через
   grid-template. Так не доводиться підтримувати два різні шаблони, і
   будь-яка зміна картки одразу працює в обох режимах.
   ------------------------------------------------------------------------ */

.ts-list {
	display: flex;
	flex-direction: column;
	gap: var(--ts-space-3);
}

@media (min-width: 768px) {
	.ts-list .ts-card {
		grid-template-columns: 180px minmax(0, 1fr) 210px;
		grid-template-rows: auto;
		align-items: start;
		gap: var(--ts-space-5);
		padding: var(--ts-space-4);
	}

	.ts-list .ts-card__media {
		grid-row: 1;
		aspect-ratio: 1 / 1;
		margin-bottom: 0;
	}

	.ts-list .ts-card__body {
		grid-row: 1;
		gap: var(--ts-space-2);
	}

	/* У списку є місце — показуємо назву повністю */
	.ts-list .ts-card__title {
		font-size: var(--ts-text-md);
		--ts-clamp-lines: 2;
		min-height: 0;
	}

	.ts-list .ts-card__specs {
		font-size: var(--ts-text-sm);
	}

	/* Права колонка: ціна і кнопка одне під одним */
	.ts-list .ts-card__footer {
		grid-row: 1;
		flex-direction: column;
		align-items: stretch;
		justify-content: flex-start;
		gap: var(--ts-space-3);
		margin-top: 0;
		padding-top: 0;
		border-top: 0;
		border-left: 1px solid var(--ts-color-border);
		padding-left: var(--ts-space-5);
		height: 100%;
	}

	.ts-list .ts-card__action {
		width: 100%;
	}

	/* У списку кнопка з текстом, а не лише іконка */
	.ts-list .ts-card__action .ts-visually-hidden {
		position: static !important;
		width: auto;
		height: auto;
		margin: 0;
		clip: auto;
		clip-path: none;
		white-space: normal;
	}
}

/* --- Вітрина розділу (сторінка категорії з підрозділами) ----------------- */

.ts-hub {
	margin-bottom: var(--ts-space-12);
}

/*
 * Картки підрозділів. Мінімум 300px: у картці не лише назва, а й
 * список вкладених категорій, і на вужчій колонці назви на кшталт
 * «Мережеве обладнання» переносяться по слову.
 */
.ts-hub__grid {
	display: grid;
	/* min(): на екрані 320 колонка вужча за 300px, і картка вилазила за край. */
	grid-template-columns: repeat(auto-fill, minmax(min(300px, 100%), 1fr));
	gap: var(--ts-space-4);
	margin-bottom: var(--ts-space-10);
}

.ts-hub__card {
	display: grid;
	grid-template-columns: 112px minmax(0, 1fr);
	gap: var(--ts-space-4);
	/*
	 * Картки ряду однакової висоти, а вміст притиснутий догори:
	 * у розділів різна кількість підкатегорій, і без цього ряд
	 * виглядав драбинкою.
	 */
	align-content: start;
	padding: var(--ts-space-4);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
	transition: border-color 0.15s ease, box-shadow 0.15s ease;
}

.ts-hub__card:hover {
	border-color: var(--ts-color-primary);
	box-shadow: var(--ts-shadow-sm);
}

.ts-hub__media {
	display: flex;
	align-items: center;
	justify-content: center;
	align-self: start;
	width: 100%;
	aspect-ratio: 1 / 1;
	overflow: hidden;
	background: var(--ts-color-surface-sunken);
	border-radius: var(--ts-radius-md);
	color: var(--ts-color-muted);
}

.ts-hub__media img {
	width: 100%;
	height: 100%;
	object-fit: contain;
	/* Фото категорій приходять на білому тлі — прибираємо рамку. */
	mix-blend-mode: multiply;
}

.ts-hub__title {
	display: flex;
	align-items: center;
	gap: var(--ts-space-1);
	margin-bottom: var(--ts-space-2);
	font-size: var(--ts-text-md);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
	line-height: 1.25;
}

.ts-hub__title:hover {
	color: var(--ts-color-primary);
	text-decoration: none;
}

.ts-hub__title .ts-icon {
	flex: 0 0 auto;
	color: var(--ts-color-faint);
}

.ts-hub__links {
	margin: 0;
	padding: 0;
	list-style: none;
}

.ts-hub__links a {
	display: block;
	padding: 2px 0;
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
	line-height: 1.4;
}

.ts-hub__links a:hover {
	color: var(--ts-color-primary);
	text-decoration: none;
}

.ts-hub__all {
	color: var(--ts-color-primary) !important;
}

.ts-hub__count {
	margin: 0;
	font-size: var(--ts-text-sm);
	color: var(--ts-color-faint);
}

/* --- Бренди розділу ------------------------------------------------------ */

.ts-hub-brands {
	margin-bottom: var(--ts-space-10);
}

.ts-hub-brands__head {
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	justify-content: space-between;
	gap: var(--ts-space-4);
	margin-bottom: var(--ts-space-4);
}

.ts-hub-brands__title {
	margin: 0;
	font-size: var(--ts-text-xl);
	font-weight: var(--ts-weight-bold);
	color: var(--ts-color-text-strong);
}

.ts-hub-brands__all {
	display: inline-flex;
	align-items: center;
	gap: var(--ts-space-1);
	font-size: var(--ts-text-sm);
	color: var(--ts-color-primary);
	white-space: nowrap;
}

.ts-hub-brands__all:hover {
	text-decoration: none;
}

/*
 * Логотипи в ряд із прокруткою: брендів буває дванадцять, і на
 * вузькому екрані вони інакше стискаються до нечитабельного розміру.
 */
.ts-hub-brands__row {
	display: grid;
	grid-auto-flow: column;
	grid-auto-columns: minmax(124px, 1fr);
	gap: var(--ts-space-3);
	overflow-x: auto;
	padding-bottom: var(--ts-space-2);
	scrollbar-width: thin;
	scroll-snap-type: x proximity;
}

.ts-hub-brands__item {
	display: flex;
	align-items: center;
	justify-content: center;
	height: 64px;
	padding: var(--ts-space-3);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-md);
	scroll-snap-align: start;
	transition: border-color 0.15s ease;
}

.ts-hub-brands__item:hover {
	border-color: var(--ts-color-primary);
}

.ts-hub-brands__item img {
	max-width: 100%;
	max-height: 32px;
	object-fit: contain;
}

@media (max-width: 599px) {
	/* На телефоні картка стає вузькою — фото меншає, щоб лишилось місце тексту. */
	.ts-hub__card {
		grid-template-columns: 84px minmax(0, 1fr);
	}
}

/* «Електроінструмент» одним словом ширший за колонку на екрані 320. */
.ts-hub__title > span {
	min-width: 0;
	overflow-wrap: anywhere;
}

@media (max-width: 359px) {
	.ts-hub__card {
		grid-template-columns: 64px minmax(0, 1fr);
	}

	.ts-hub__title .ts-icon {
		display: none;
	}
}

/* --- Смужка переваг на вітрині ------------------------------------------ */

.ts-hub-perks {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
	gap: var(--ts-space-3);
}

.ts-hub-perk {
	display: flex;
	align-items: center;
	gap: var(--ts-space-3);
	padding: var(--ts-space-4);
	background: var(--ts-color-surface-sunken);
	border-radius: var(--ts-radius-lg);
}

.ts-hub-perk__icon {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	flex: 0 0 auto;
	width: 40px;
	height: 40px;
	background: var(--ts-color-surface);
	border-radius: var(--ts-radius-full);
	color: var(--ts-color-primary);
}

.ts-hub-perk__body {
	display: flex;
	flex-direction: column;
	gap: 2px;
	min-width: 0;
}

.ts-hub-perk__title {
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
	line-height: 1.3;
}

.ts-hub-perk__text {
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
	line-height: 1.3;
}

/* Підпис розділу праворуч від заголовка */
.ts-catalog__tagline {
	margin: 0 0 0 auto;
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
	text-align: right;
}

@media (max-width: 767px) {
	/* На телефоні підпис під заголовком, а не збоку. */
	.ts-catalog__tagline {
		margin-left: 0;
		text-align: left;
	}
}

/* --- Банер розділу ------------------------------------------------------ */

.ts-hub__banner {
	margin-bottom: var(--ts-space-6);
	border-radius: var(--ts-radius-xl);
	overflow: hidden;
}

.ts-hub__banner-link {
	display: block;
}

.ts-hub__banner-img {
	display: block;
	width: 100%;
	height: auto;
}

/* --- Сторінка бренду ----------------------------------------------------- */

.ts-brandhead {
	display: grid;
	gap: var(--ts-space-6);
	margin-bottom: var(--ts-space-6);
}

/* Банер праворуч з'являється лише там, де є місце під обидва блоки. */
@media (min-width: 1024px) {
	.ts-brandhead:has(.ts-brandbanner) {
		/*
		 * Текстова частина ширша за банер: у неї чотири переваги в
		 * рядок, і на вужчій колонці вони переносились у два рядки,
		 * чого в макеті немає.
		 */
		grid-template-columns: minmax(0, 1.05fr) minmax(0, 1fr);
		/*
		 * По верхньому краю, а не по центру: банер вищий за текстову
		 * частину, і центрування лишало лого висіти посеред порожнечі.
		 */
		align-items: start;
	}
}

.ts-brandhead__main {
	display: flex;
	align-items: flex-start;
	gap: var(--ts-space-5);
}

.ts-brandhead__logo {
	display: flex;
	align-items: center;
	justify-content: center;
	flex: 0 0 auto;
	width: 112px;
	height: 112px;
	padding: var(--ts-space-4);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-full);
}

.ts-brandhead__logo img {
	max-width: 100%;
	max-height: 56px;
	width: auto;
	height: auto;
	object-fit: contain;
}

.ts-brandhead__title {
	margin: 0 0 var(--ts-space-1);
	font-size: var(--ts-text-3xl);
	font-weight: var(--ts-weight-bold);
	color: var(--ts-color-text-strong);
}

.ts-brandhead__tagline {
	margin: 0 0 var(--ts-space-4);
	font-size: var(--ts-text-md);
	color: var(--ts-color-muted);
}

.ts-brandhead__perks {
	display: flex;
	flex-wrap: wrap;
	gap: var(--ts-space-2) var(--ts-space-4);
	margin: 0;
	padding: 0;
	list-style: none;
}

.ts-brandhead__perks li {
	display: flex;
	align-items: center;
	gap: var(--ts-space-2);
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
	line-height: 1.25;
}

/*
 * Підпис у два рядки, як у макеті: «Офіційна / гарантія». Так
 * чотири пункти стають удвічі вужчими й вміщуються в один ряд.
 */
.ts-brandhead__perks li span {
	max-width: 9ch;
}

/* Тонка риска між пунктами — замість великих проміжків. */
.ts-brandhead__perks li + li {
	padding-left: var(--ts-space-4);
	border-left: 1px solid var(--ts-color-border);
}

.ts-brandhead__perks .ts-icon {
	flex: 0 0 auto;
	color: var(--ts-color-primary);
}

/* Банер бренду */
.ts-brandbanner {
	border-radius: var(--ts-radius-xl);
	overflow: hidden;
}

.ts-brandbanner img {
	display: block;
	width: 100%;
	height: auto;
}

/* --- Розділи бренду ------------------------------------------------------ */

/*
 * Горизонтальний ряд із прокруткою: розділів буває вісім, і на
 * ноутбуці вони інакше стискаються до нечитабельного.
 */
.ts-brandcats {
	display: flex;
	gap: var(--ts-space-3);
	margin-bottom: var(--ts-space-6);
	overflow-x: auto;
	padding-bottom: var(--ts-space-2);
	scrollbar-width: thin;
	scroll-snap-type: x proximity;
}

.ts-brandcat {
	display: flex;
	align-items: center;
	gap: var(--ts-space-3);
	flex: 0 0 auto;
	min-width: 168px;
	padding: var(--ts-space-2) var(--ts-space-4) var(--ts-space-2) var(--ts-space-2);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
	scroll-snap-align: start;
	transition: border-color 0.15s ease, background-color 0.15s ease;
}

.ts-brandcat:hover {
	border-color: var(--ts-color-primary);
	text-decoration: none;
}

/* Поточний відбір — залита плашка, щоб було видно, де стоїш. */
.ts-brandcat.is-active {
	background: var(--ts-color-primary-soft);
	border-color: var(--ts-color-primary);
}

/* Картинка розділу ліворуч від назви — як у макеті. */
.ts-brandcat__media {
	display: flex;
	align-items: center;
	justify-content: center;
	flex: 0 0 auto;
	width: 44px;
	height: 44px;
	overflow: hidden;
	background: var(--ts-color-surface-sunken);
	border-radius: var(--ts-radius-md);
	color: var(--ts-color-primary);
}

.ts-brandcat__media img {
	width: 100%;
	height: 100%;
	object-fit: contain;
	/* Фото товарів приходять на білому тлі — прибираємо рамку. */
	mix-blend-mode: multiply;
}

.ts-brandcat__text {
	display: flex;
	flex-direction: column;
	gap: 1px;
	min-width: 0;
}

.ts-brandcat__name {
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-medium);
	color: var(--ts-color-text-strong);
	line-height: 1.3;
}

.ts-brandcat__count {
	font-size: var(--ts-text-xs);
	color: var(--ts-color-faint);
}

@media (max-width: 767px) {
	.ts-brandhead__main {
		flex-direction: column;
		align-items: flex-start;
		gap: var(--ts-space-4);
	}

	.ts-brandhead__logo {
		width: 88px;
		height: 88px;
	}
}

/* --- Панель над товарами: лічильник і кнопки вигляду -------------------- */

.ts-toolbar__found {
	margin: 0;
	margin-right: auto;
	font-size: var(--ts-text-md);
	font-weight: var(--ts-weight-medium);
	color: var(--ts-color-text-strong);
}

/* Дві кнопки в одній рамці — як сегментований перемикач у макеті. */
.ts-toolbar__view {
	display: inline-flex;
	gap: 2px;
	padding: 2px;
	background: var(--ts-color-surface-sunken);
	border-radius: var(--ts-radius-md);
}

.ts-viewbtn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 34px;
	height: 30px;
	background: transparent;
	border: 0;
	border-radius: calc(var(--ts-radius-md) - 2px);
	color: var(--ts-color-faint);
	cursor: pointer;
	transition: background-color 0.12s ease, color 0.12s ease;
}

.ts-viewbtn:hover {
	color: var(--ts-color-text-strong);
}

.ts-viewbtn.is-active {
	background: var(--ts-color-surface);
	color: var(--ts-color-primary);
	box-shadow: var(--ts-shadow-sm);
}

/* ==========================================================================
   TopShop — Сторінка товару (ТЗ §28)
   ========================================================================== */

/* --- Верхній блок: галерея | основне | купівля --------------------------- */

.ts-product__top {
	display: grid;
	/*
	 * minmax(0, 1fr), а не 1fr: інакше колонка не може бути вужчою за
	 * вміст, і фото 1746px від постачальника розтягувало сторінку —
	 * на телефоні з'являвся горизонтальний скрол. На десктопі нижче
	 * minmax уже стоїть, на мобільному його бракувало.
	 */
	grid-template-columns: minmax(0, 1fr);
	gap: var(--ts-space-6);
	margin-bottom: var(--ts-space-10);
}

@media (min-width: 900px) {
	.ts-product__top {
		grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
		gap: var(--ts-space-8);
	}

	/* Блок купівлі під галереєю, поки місця мало на три колонки */
	.ts-product__purchase {
		grid-column: 2;
	}
}

@media (min-width: 1200px) {
	/*
	 * Від 1200px — одна сітка на всю картку: галерея | основне | купівля.
	 * .ts-product__top розчиняється (display: contents), а колонка
	 * купівлі тягнеться вниз на висоту вкладок: блок з ціною й «Додати
	 * в кошик» їде поруч з описом і характеристиками, а не лишає праворуч
	 * порожню третину сторінки. 340px — щоб лічильник і «Додати в кошик»
	 * стали в один рядок.
	 */
	.ts-product {
		display: grid;
		grid-template-columns: minmax(0, 5fr) minmax(0, 6fr) 340px;
		column-gap: var(--ts-space-8);
		row-gap: var(--ts-space-10);
		align-items: start;
	}

	.ts-product__top {
		display: contents;
	}

	.ts-product__details {
		grid-column: 1 / 3;
		grid-row: 2;
	}

	/*
	 * Липкий під шапкою. Вищий за вікно блок (низький ноутбук) спершу
	 * докручується до низу, а потім липне — відступ рахує StickyBuy у
	 * main.js (--ts-buy-top), інакше низ блоку не було б видно ніколи.
	 */
	.ts-product__purchase {
		grid-column: 3;
		grid-row: 1 / span 2;
		position: sticky;
		top: var(--ts-buy-top, calc(var(--ts-header-height, 117px) + var(--ts-space-4)));
	}
}

/* --- Галерея ------------------------------------------------------------- */

.ts-gallery__stage {
	position: relative;
	/* Сцена не ширша за колонку, хоч би яке велике було фото. */
	min-width: 0;
	max-width: 100%;
	display: flex;
	align-items: center;
	justify-content: center;
	aspect-ratio: 1 / 1;
	padding: var(--ts-space-4);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
	overflow: hidden;
}

.ts-gallery__image {
	width: 100%;
	height: 100%;
	object-fit: contain;
	mix-blend-mode: multiply;
}

/*
 * Бейджі в кутку сцени. Колонкою, а не рядком: назви різної довжини
 * («Безкоштовна доставка» проти «−12%»), у рядок вони розповзаються
 * на пів-фото.
 */
.ts-gallery__flags {
	position: absolute;
	top: var(--ts-space-3);
	left: var(--ts-space-3);
	z-index: var(--ts-z-base);
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: var(--ts-space-1);
	max-width: calc(100% - var(--ts-space-6));
}

.ts-gallery__thumbs {
	/*
	 * Сітка на п’ять колонок, а не стрічка: коли «+N» розкриває решту
	 * фото, вони переносяться в новий ряд того самого розміру. У
	 * flex-стрічці всі мініатюри ділили одну ширину й ставали тим
	 * дрібнішими, чим більше фото в товару.
	 */
	display: grid;
	grid-template-columns: repeat(5, minmax(0, 78px));
	gap: var(--ts-space-2);
	margin-top: var(--ts-space-3);
}

/* --- Стрілки гортання --------------------------------------------------- */

.ts-gallery__nav {
	position: absolute;
	top: 50%;
	z-index: var(--ts-z-base);
	display: flex;
	align-items: center;
	justify-content: center;
	width: 36px;
	height: 36px;
	margin-top: -18px;
	padding: 0;
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-full);
	background: var(--ts-color-surface);
	color: var(--ts-color-text-strong);
	cursor: pointer;
	/*
	 * Напівпрозорі, поки курсор не в галереї: стрілки не мають
	 * змагатися за увагу з фото товару.
	 */
	opacity: 0;
	transition: opacity var(--ts-duration-base) var(--ts-ease),
		background-color var(--ts-duration-base) var(--ts-ease);
}

.ts-product__gallery:hover .ts-gallery__nav,
.ts-gallery__nav:focus-visible {
	opacity: 1;
}

.ts-gallery__nav:hover {
	background: var(--ts-color-surface-hover);
}

.ts-gallery__nav--prev {
	left: var(--ts-space-3);
	transform: rotate(180deg);
}

.ts-gallery__nav--next {
	right: var(--ts-space-3);
}

/* На дотику наведення немає — показуємо завжди. */
@media (hover: none) {
	.ts-gallery__nav {
		opacity: 1;
	}
}

/* --- Лічильник прихованих мініатюр -------------------------------------- */

.ts-gallery__thumb.has-more {
	position: relative;
}

/*
 * Затемнення з «+N» поверх останньої видимої мініатюри. Клік по ньому
 * розкриває решту, а не перемикає фото.
 */
.ts-gallery__more {
	position: absolute;
	inset: 0;
	display: flex;
	align-items: center;
	justify-content: center;
	border-radius: inherit;
	background: rgba(4, 22, 42, 0.62);
	color: #fff;
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-semibold);
}

.ts-gallery__thumb {
	/*
	 * Розмір задає колонка сітки (.ts-gallery__thumbs): до 78px, а у
	 * вузькій галереї — п'ята частина ширини, щоб «+N» не опинявся за
	 * краєм.
	 */
	width: 100%;
	min-width: 0;
	aspect-ratio: 1 / 1;
	height: auto;
	padding: var(--ts-space-1);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-md);
	overflow: hidden;
	transition: border-color var(--ts-duration-fast) var(--ts-ease);
}

.ts-gallery__thumb img {
	width: 100%;
	height: 100%;
	object-fit: contain;
	mix-blend-mode: multiply;
}

.ts-gallery__thumb:hover {
	border-color: var(--ts-color-border-strong);
}

.ts-gallery__thumb.is-active {
	border-color: var(--ts-color-primary);
}

/* --- Основна колонка ----------------------------------------------------- */

.ts-product__brand {
	display: inline-block;
	margin-bottom: var(--ts-space-2);
	font-size: var(--ts-text-xs);
	font-weight: var(--ts-weight-semibold);
	letter-spacing: var(--ts-tracking-wide);
	text-transform: uppercase;
	color: var(--ts-color-muted);
}

/*
 * Бренд стоїть над блоком купівлі, притиснутий до правого краю
 * колонки — як у макеті. Там він читається як підпис до ціни, а не
 * як частина назви товару.
 */
.ts-product__brand {
	align-self: flex-end;
	text-align: right;
}

.ts-product__purchase {
	display: flex;
	flex-direction: column;
	gap: var(--ts-space-3);
}

/*
 * Обмежуємо і висоту, і ширину: логотипи приходять різних пропорцій,
 * і при вільній ширині витягнутий GIGABYTE займав 191px проти 121 в
 * ASUS — виглядав як інший рівень бренду, хоча це просто напис
 * довший. object-fit: contain вписує будь-яку пропорцію в рамку.
 */
.ts-product__brand-logo {
	display: block;
	width: auto;
	height: 26px;
	max-width: 130px;
	object-fit: contain;
	object-position: right center;
	/*
	 * Логотипи приходять різної насиченості: приглушуємо, щоб вони не
	 * сперечалися з назвою товару, і повертаємо повний колір при
	 * наведенні — так видно, що це посилання.
	 */
	opacity: 0.72;
	transition: opacity var(--ts-duration-base) var(--ts-ease);
}

.ts-product__brand:hover .ts-product__brand-logo {
	opacity: 1;
}

.ts-product__brand:hover {
	color: var(--ts-color-primary);
	text-decoration: none;
}

/*
 * Назви товарів довгі — «Відеокарта MSI GeForce RTX5090 32GB GAMING
 * TRIO OC (RTX 5090 32G GAMING TRIO OC)» на 32px займала три рядки
 * й відсувала ціну з блоком купівлі за межі екрана. 24px вистачає,
 * щоб заголовок лишався головним, і вміщає назву у два рядки.
 */
.ts-product__title {
	margin-bottom: var(--ts-space-3);
	font-size: 1.25rem; /* 20px */
	line-height: var(--ts-leading-snug);
}

@media (min-width: 600px) {
	.ts-product__title {
		font-size: 1.375rem; /* 22px */
	}
}

@media (min-width: 900px) {
	.ts-product__title {
		font-size: 1.5rem; /* 24px */
	}
}

/*
 * Код і Part Number помітніші за звичайний дрібний підпис: у цій
 * категорії за ними звіряють сумісність і шукають у постачальника,
 * тож це одні з найважливіших даних на сторінці. Але без крику —
 * підкладка й моноширинний шрифт, а не колір чи великий кегль.
 */
/*
 * Код і Part Number у стовпчик, як у макеті: так вони читаються як
 * пара «підпис — значення», а не як два однакові чипи в рядок.
 */
/*
 * Коди в рядок: їх щонайбільше два, і разом вони коротші за назву
 * товару. Окремими рядками вони займали висоту, не додаючи ясності.
 * flex-wrap лишаємо — на вузькому екрані довгий part number
 * переноситься замість того, щоб розпирати колонку.
 */
.ts-product__codes {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: var(--ts-space-2) var(--ts-space-5);
	margin-bottom: var(--ts-space-4);
	font-size: var(--ts-text-sm);
	color: var(--ts-color-text);
}

/*
 * Без підкладки: сіра плашка робила з коду елемент інтерфейсу, хоча
 * це просто дані, які звіряють очима й копіюють. Читабельність дає
 * темний моноширинний текст, а не рамка.
 */
.ts-product__code {
	display: inline-flex;
	align-items: center;
	gap: var(--ts-space-1);
}

.ts-product__code .ts-mono {
	color: var(--ts-color-text-strong);
	font-weight: var(--ts-weight-medium);
	letter-spacing: 0.01em;
}

/*
 * Підпис теж темний: це не службова дрібниця, а частина того, що
 * покупець диктує менеджеру по телефону. Світло-сірий на білому
 * читався гірше за сам код і плутав, де закінчується підпис.
 */
.ts-product__code-label {
	color: var(--ts-color-muted);
}

/* --- Лінійка: той самий товар в інших об'ємах ----------------------------- */

/*
 * Це окремі товари з власними адресами, а не варіації: клік веде на
 * іншу сторінку. Тому плашки — посилання, а поточний варіант не
 * клікабельний і виглядає як обраний.
 */
.ts-family {
	display: flex;
	align-items: baseline;
	flex-wrap: wrap;
	gap: var(--ts-space-2) var(--ts-space-3);
	margin-bottom: var(--ts-space-5);
	padding: var(--ts-space-3) var(--ts-space-4);
	background: var(--ts-color-surface-sunken);
	border-radius: var(--ts-radius-md);
}

.ts-family__label {
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
}

.ts-family__items {
	display: flex;
	flex-wrap: wrap;
	gap: var(--ts-space-2);
}

.ts-family__item {
	display: inline-flex;
	align-items: center;
	/* 36px по висоті: на телефоні в це ще зручно влучати пальцем. */
	min-height: 36px;
	padding: 0 var(--ts-space-3);
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-medium);
	color: var(--ts-color-text);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-sm);
	white-space: nowrap;
}

/* Відмітка редакції: «/EU» поруч з об'ємом, дрібним і приглушеним. */
.ts-family__suffix {
	margin-left: 4px;
	font-size: var(--ts-text-2xs);
	font-weight: var(--ts-weight-normal);
	color: var(--ts-color-faint);
}

a.ts-family__item:hover {
	color: var(--ts-color-primary);
	border-color: var(--ts-color-primary);
	text-decoration: none;
}

.ts-family__item.is-current {
	color: var(--ts-color-primary);
	border-color: var(--ts-color-primary);
	background: var(--ts-color-primary-soft);
	cursor: default;
}

/* --- Ключові характеристики ---------------------------------------------- */

.ts-product__keyspecs .ts-label {
	margin-bottom: var(--ts-space-3);
}

/*
 * Характеристики парами з іконкою: шість рядків поспіль зливаються в
 * суцільний текст, а двома колонками з піктограмою око знаходить
 * потрібне одразу.
 */
.ts-keyspecs {
	display: grid;
	grid-template-columns: minmax(0, 1fr);
	gap: var(--ts-space-3) var(--ts-space-5);
	margin: 0;
}

@media (min-width: 560px) {
	.ts-keyspecs {
		grid-template-columns: repeat(2, minmax(0, 1fr));
	}
}

.ts-keyspecs__row {
	display: flex;
	align-items: flex-start;
	gap: var(--ts-space-2);
	min-width: 0;
	font-size: var(--ts-text-sm);
}

.ts-keyspecs__icon {
	flex: 0 0 auto;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	/* Без плашки, як у макеті: іконка лише позначає рядок. */
	color: var(--ts-color-primary);
}

.ts-keyspecs__text {
	min-width: 0;
}

.ts-keyspecs__label {
	color: var(--ts-color-muted);
	font-size: var(--ts-text-xs);
	line-height: 1.3;
}

.ts-keyspecs__value {
	margin: 0;
	color: var(--ts-color-text-strong);
	font-weight: var(--ts-weight-medium);
	line-height: 1.35;
	/* Довгі перерахування не мають розпирати колонку. */
	overflow-wrap: anywhere;
}

/* --- Рейтинг ------------------------------------------------------------ */

/*
 * Рейтинг під назвою — те, на що дивляться одразу після ціни, тому
 * розмір основного тексту, а не дрібний: на 13px і «5.0», і кількість
 * відгуків читались як службова примітка.
 */
.ts-product__rating {
	display: flex;
	align-items: center;
	gap: var(--ts-space-2);
	margin-bottom: var(--ts-space-3);
	font-size: var(--ts-text-base);
}

.ts-stars {
	display: inline-flex;
	gap: 1px;
}

.ts-stars__item {
	display: inline-flex;
	color: var(--ts-color-border-strong);
}

.ts-stars__item .ts-icon {
	fill: currentColor;
	stroke: none;
}

.ts-stars__item.is-on {
	color: #f5a524;
}

.ts-product__rating-value {
	font-size: var(--ts-text-md);
	font-weight: var(--ts-weight-bold);
	color: var(--ts-color-text-strong);
}

.ts-product__rating-count {
	color: var(--ts-color-muted);
}

.ts-product__rating-count:hover {
	color: var(--ts-color-primary);
}

/*
 * Поки відгуків немає — запрошення замість зірок. Місце в макеті те
 * саме, тож поява першого відгуку не зсуває сторінку.
 */
.ts-product__rating-empty {
	display: inline-flex;
	align-items: center;
	gap: var(--ts-space-1);
	color: var(--ts-color-muted);
}

.ts-product__rating-empty:hover {
	color: var(--ts-color-primary);
	text-decoration: none;
}

/* --- Кнопка копіювання -------------------------------------------------- */

.ts-copy {
	position: relative;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 22px;
	height: 22px;
	margin-left: 2px;
	padding: 0;
	border: 0;
	border-radius: var(--ts-radius-sm);
	background: transparent;
	color: var(--ts-color-muted);
	cursor: pointer;
	vertical-align: middle;
	transition: color var(--ts-duration-base) var(--ts-ease),
		background-color var(--ts-duration-base) var(--ts-ease);
}

.ts-copy:hover {
	background: var(--ts-color-surface-sunken);
	color: var(--ts-color-primary);
}

/* Підтвердження: галочка на мить замість іконки. */
.ts-copy.is-done {
	color: var(--ts-color-success, #008a20);
}

.ts-copy.is-done .ts-icon {
	display: none;
}

.ts-copy.is-done::after {
	content: "✓";
	font-size: 13px;
	line-height: 1;
}

/*
 * Підказка «Скопійовано» поруч із кнопкою.
 *
 * Сама галочка не каже, що саме сталося: її однаково можна прочитати
 * як «код правильний». Слово знімає це питання.
 *
 * Текст беремо з data-атрибута, щоб не тримати переклад у CSS.
 */
/*
 * Ставимо підказку над кнопкою, а не збоку: коди тепер в один рядок,
 * і збоку вона лягала просто на сусідній «Part Number».
 */
.ts-copy.is-done::before {
	content: attr(data-copied-label);
	position: absolute;
	bottom: calc(100% + 4px);
	left: 50%;
	transform: translateX(-50%);
	padding: 3px var(--ts-space-2);
	font-family: var(--ts-font-sans);
	font-size: var(--ts-text-2xs);
	font-weight: var(--ts-weight-medium);
	line-height: 1.4;
	white-space: nowrap;
	color: var(--ts-color-surface);
	background: var(--ts-color-text-strong);
	border-radius: var(--ts-radius-sm);
	pointer-events: none;
	z-index: 2;
}

.ts-product__specs-link {
	display: inline-flex;
	align-items: center;
	gap: var(--ts-space-1);
	margin-top: var(--ts-space-3);
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-medium);
}

/* --- Блок купівлі -------------------------------------------------------- */

.ts-buybox {
	padding: var(--ts-space-5);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
	box-shadow: var(--ts-shadow-sm);
}

.ts-buybox__price {
	margin-bottom: var(--ts-space-2);
}

.ts-buybox__saving {
	margin-bottom: var(--ts-space-3);
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-medium);
	color: var(--ts-color-discount);
}

.ts-buybox__stock {
	margin-bottom: var(--ts-space-4);
	padding-bottom: var(--ts-space-4);
	border-bottom: 1px solid var(--ts-color-border);
}

/*
 * Кількість і кнопка в один рядок лише коли кнопці вистачає місця.
 * У вузькій колонці 320px "Додати в кошик" розривалось на три рядки,
 * тому там кнопка йде під лічильником на всю ширину.
 */
.ts-buybox__row {
	display: flex;
	flex-wrap: wrap;
	gap: var(--ts-space-3);
	margin-bottom: var(--ts-space-3);
}

/*
 * flex-basis 140px: кнопка має вміститись поруч із лічильником
 * у колонці 298px (лічильник ~128px + відступ 12px). При більшому
 * значенні вона переносилась на окремий рядок.
 */
/*
 * Висота 44px у всього рядка: лічильник, кнопка кошика і «Швидке
 * замовлення» під ними мають збігатися, інакше блок виглядає
 * зібраним нашвидкуруч. Клас --lg тут не використовуємо саме тому:
 * він задає 52px.
 */
.ts-buybox__submit {
	flex: 1 1 140px;
	min-width: 0;
	white-space: nowrap;
	min-height: 44px;
	padding-block: var(--ts-space-2);
	/*
	 * 14px, як у «Швидкого замовлення» під нею: при 16px текст
	 * «Додати в кошик» потребував 177px у кнопці на 156px і
	 * видавлював бічні відступи. Дві кнопки поруч мають читатись як
	 * пара, а не як різні за вагою елементи.
	 */
	font-size: var(--ts-text-base);
	/* Бічні відступи менші: колонка вузька, кожен піксель на рахунку. */
	padding-inline: var(--ts-space-4);
}

/* Іконка не має стискатися, коли тексту забагато для колонки. */
.ts-buybox__submit .ts-icon,
.ts-buybox__quick .ts-icon {
	flex: 0 0 auto;
}

.ts-buybox__inquiry {
	margin-bottom: var(--ts-space-4);
}

/* «Повідомити в Telegram» — одразу під «Уточнити наявність». */
.ts-buybox__inquiry:has(+ .ts-buybox__tg) {
	margin-bottom: var(--ts-space-2);
}

.ts-buybox__tg {
	margin-bottom: var(--ts-space-4);
	background: var(--ts-color-telegram-button);
	color: #fff;
	white-space: nowrap;
}

.ts-buybox__tg:hover {
	background: var(--ts-color-telegram-button-hover);
	color: #fff;
}

.ts-buybox__tg:active {
	background: var(--ts-color-telegram-button-active);
}

.ts-buybox__tg:focus-visible {
	outline: 2px solid var(--ts-color-telegram-button-active);
	outline-offset: 2px;
	box-shadow: 0 0 0 5px var(--ts-color-telegram-ring);
}

.ts-buybox__tg .ts-icon {
	flex: 0 0 auto;
}

/* Уже підписаний: спокійний стан замість дії. */
.ts-buybox__tg.is-on,
.ts-buybox__tg:disabled {
	opacity: 1;
	cursor: default;
	background: var(--ts-color-telegram-soft);
	color: var(--ts-color-telegram-button);
}

.ts-buybox__unavailable {
	margin-bottom: var(--ts-space-3);
	padding: var(--ts-space-3);
	background: var(--ts-color-surface-sunken);
	border-radius: var(--ts-radius-md);
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
	text-align: center;
}

/* --- Умови покупки: доставка, оплата, гарантія (ТЗ §29) -------------------
   Під кнопками — коротко: розділ з іконкою, під ним пункти «що — умова».
   Умова праворуч і приглушена, щоб око бігло по лівому краю; на вузькій
   колонці вона переноситься під пункт, а не стискає його.
   ------------------------------------------------------------------------ */

.ts-terms--compact {
	display: flex;
	flex-direction: column;
	gap: var(--ts-space-4);
	padding-top: var(--ts-space-4);
	border-top: 1px solid var(--ts-color-border);
}

.ts-terms__title {
	display: flex;
	align-items: center;
	gap: var(--ts-space-2);
	margin-bottom: var(--ts-space-2);
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

.ts-terms__icon {
	display: inline-flex;
	flex: none;
	color: var(--ts-color-primary);
}

.ts-terms__list {
	display: flex;
	flex-direction: column;
	gap: var(--ts-space-1);
	margin: 0;
	padding: 0;
	list-style: none;
}

/* Відступ = іконка + проміжок: пункти стоять під текстом заголовка. */
.ts-terms--compact .ts-terms__list {
	padding-left: calc(18px + var(--ts-space-2));
}

.ts-terms__item {
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	column-gap: var(--ts-space-3);
	font-size: var(--ts-text-sm);
	line-height: var(--ts-leading-snug);
	color: var(--ts-color-text);
}

.ts-terms__value {
	margin-left: auto;
	color: var(--ts-color-muted);
	text-align: right;
}

/* Довга умова — дрібним рядком під пунктом, вирівняна по ньому. */
.ts-terms__item--stack {
	flex-direction: column;
	align-items: flex-start;
	gap: 1px;
}

.ts-terms__item--stack .ts-terms__value {
	margin-left: 0;
	font-size: var(--ts-text-xs);
	text-align: left;
	color: var(--ts-color-faint);
}

.ts-terms__value.is-free {
	color: var(--ts-color-success);
	font-weight: var(--ts-weight-medium);
}

/* Пункти без умови (способи оплати) — з крапкою, щоб читались як перелік. */
.ts-terms__item--plain {
	position: relative;
	padding-left: 12px;
}

/* Крапка окремо від тексту: перенесений рядок стає під текст, а не під неї. */
.ts-terms__item--plain::before {
	content: "";
	position: absolute;
	top: 0.55em;
	left: 0;
	width: 4px;
	height: 4px;
	border-radius: 50%;
	background: var(--ts-color-faint);
}

.ts-terms__note {
	flex-basis: 100%;
	font-size: var(--ts-text-xs);
	color: var(--ts-color-faint);
}

/*
 * Значок пункту (логотип Нової пошти, картка, рахунок…) — у власній
 * колонці ліворуч: перенесений рядок стає під текст, а не під значок.
 * Крапка-маркер тоді не потрібна.
 */
.ts-terms__item.has-media {
	position: relative;
	padding-left: 26px;
}

.ts-terms__item.has-media::before {
	display: none;
}

.ts-terms__media {
	position: absolute;
	top: 0;
	left: 0;
	display: grid;
	place-items: center;
	width: 18px;
	height: 1.35em;
	color: var(--ts-color-faint);
}

.ts-terms__media img {
	display: block;
	width: 18px;
	height: 18px;
}

.ts-terms--full .ts-terms__item.has-media {
	padding-left: 30px;
}

.ts-terms--full .ts-terms__media,
.ts-terms--full .ts-terms__media img {
	width: 20px;
}

.ts-terms--full .ts-terms__media img {
	height: 20px;
}

/* --- Обране і порівняння ------------------------------------------------ */

/*
 * Дві тихі дії в рядок: вони третього рівня після кошика й швидкого
 * замовлення, тож не мають виглядати ще двома кнопками.
 */
.ts-buybox__actions {
	display: flex;
	align-items: center;
	gap: var(--ts-space-2);
	margin-top: var(--ts-space-3);
	padding-bottom: var(--ts-space-4);
	border-bottom: 1px solid var(--ts-color-border);
}

/*
 * По половині ширини кожна: так вони читаються як пара рівноправних
 * дій, а не як текст, що випадково опинився поруч.
 *
 * Розмір такий самий, як у переваг нижче: це теж дії з товаром, а
 * дрібним шрифтом вони виглядали як примітка під кнопкою купівлі.
 * 44px висоти — мінімальна зручна ціль на дотик.
 */
.ts-buybox__action {
	flex: 1 1 50%;
	min-width: 0;
	min-height: 44px;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: var(--ts-space-2);
	padding: var(--ts-space-2) var(--ts-space-1);
	border: 0;
	background: none;
	color: var(--ts-color-text-strong);
	font-size: var(--ts-text-md);
	font-weight: var(--ts-weight-medium);
	cursor: pointer;
	transition: color var(--ts-duration-base) var(--ts-ease);
}

/* Іконка більша й синя — як у переваг, щоб пара читалась як одне ціле. */
.ts-buybox__action .ts-icon {
	flex: 0 0 auto;
	color: var(--ts-color-primary);
	transition: color var(--ts-duration-base) var(--ts-ease);
}

.ts-buybox__action:hover:not(:disabled) .ts-icon {
	color: inherit;
}

.ts-buybox__action:hover:not(:disabled) {
	color: var(--ts-color-primary);
}

.ts-buybox__action:disabled {
	opacity: 0.45;
	cursor: not-allowed;
}

.ts-buybox__action.is-on {
	color: var(--ts-color-danger, #d63638);
}

/*
 * Заповнене серце позначає, що товар уже в списку. Колір перебиває
 * синій за замовчуванням: у цьому стані іконка має бути тим самим
 * червоним, що й підпис.
 */
.ts-buybox__action.is-on .ts-icon {
	color: inherit;
	fill: currentColor;
}

/* --- Кількість ----------------------------------------------------------- */

/*
 * inline-flex, а не flex: як блоковий елемент лічильник розтягувався
 * на всю ширину колонки-батька (у кошику це 140px при вмісті 121px),
 * і праворуч від "+" лишалася порожнеча.
 */
.ts-qty {
	display: inline-flex;
	align-items: center;
	flex: none;
	width: fit-content;
	border: 1px solid var(--ts-color-border-strong);
	border-radius: var(--ts-radius-md);
	overflow: hidden;
}

/*
 * 44px — мінімальна зручна ціль дотику і водночас висота кнопки
 * «Швидке замовлення» поруч: рядок купівлі має бути однієї висоти,
 * інакше блок виглядає зібраним нашвидкуруч.
 */
.ts-qty__btn {
	display: flex;
	align-items: center;
	justify-content: center;
	/*
	 * 34px замість 40: лічильник ділить рядок із кнопкою кошика в
	 * колонці 298px, і кожен зайвий піксель тут забирає місце в
	 * напису «Додати в кошик». 34 + 34 + 40 = 108 лишає кнопці 178.
	 */
	width: 34px;
	height: 42px;
	font-size: var(--ts-text-lg);
	color: var(--ts-color-muted);
	transition: background-color var(--ts-duration-fast) var(--ts-ease);
}

.ts-qty__btn:hover {
	background: var(--ts-color-surface-sunken);
	color: var(--ts-color-text);
}

.ts-qty__input {
	/* Кількість рідко буває більшою за два знаки. */
	width: 40px;
	/* 42 + 2px рамки контейнера = рівно 44, як у сусідніх кнопок. */
	height: 42px;
	padding: 0;
	border: 0;
	border-inline: 1px solid var(--ts-color-border);
	text-align: center;
	font-size: var(--ts-text-base);
	font-weight: var(--ts-weight-semibold);
	/* Стрілки number-інпута тут зайві: є власні кнопки */
	appearance: textfield;
	-moz-appearance: textfield;
}

.ts-qty__input::-webkit-outer-spin-button,
.ts-qty__input::-webkit-inner-spin-button {
	-webkit-appearance: none;
	margin: 0;
}

.ts-qty__input:focus {
	outline: none;
	box-shadow: inset 0 0 0 2px var(--ts-color-primary);
}

/* --- Нижня частина: характеристики, опис --------------------------------- */

.ts-product__details {
	max-width: 900px;
}

.ts-section__title {
	margin-bottom: var(--ts-space-4);
	font-size: var(--ts-text-xl);
}

.ts-specs {
	width: 100%;
	font-size: var(--ts-text-sm);
}

.ts-specs__row:nth-child(odd) {
	background: var(--ts-color-surface-sunken);
}

.ts-specs__label,
.ts-specs__value {
	padding: var(--ts-space-3);
	text-align: left;
	vertical-align: top;
}

.ts-specs__label {
	width: 45%;
	font-weight: var(--ts-weight-regular);
	color: var(--ts-color-muted);
}

.ts-specs__value {
	font-weight: var(--ts-weight-medium);
	color: var(--ts-color-text);
}

/* Код товару, Part Number, штрихкод — звичайним шрифтом, жирно: їх звіряють і копіюють. */
.ts-specs__value--code {
	font-weight: var(--ts-weight-bold, 700);
	color: var(--ts-color-text-strong);
	letter-spacing: 0.01em;
}

/*
 * Код копіюється натисканням на сам текст (copy_code(), Copy у main.js).
 * Без окремої кнопки: виглядає як текст, підказка праворуч (зверху вона
 * лягала на код у рядку вище) — «Копіювати» при наведенні, «Скопійовано»
 * після натискання.
 */
.ts-copy-code {
	position: relative;
	display: inline-block;
	margin: -2px -6px;
	padding: 2px 6px;
	font: inherit;
	letter-spacing: inherit;
	color: inherit;
	text-align: left;
	word-break: break-all;
	background: transparent;
	border: 0;
	border-radius: var(--ts-radius-sm);
	cursor: copy;
	transition: background-color var(--ts-duration-fast) var(--ts-ease);
}

.ts-copy-code:hover,
.ts-copy-code:focus-visible {
	background: var(--ts-color-primary-soft);
}

.ts-copy-code:focus-visible {
	outline: 2px solid var(--ts-color-primary);
	outline-offset: 1px;
}

/*
 * Прихована підказка — без content, тобто зовсім поза розкладкою:
 * з opacity: 0 вона лишалась у потоці праворуч від коду, і на телефоні
 * штрихкод у характеристиках давав сторінці горизонтальний скрол.
 */
.ts-copy-code::after {
	content: none;
	position: absolute;
	top: 50%;
	left: calc(100% + 8px);
	z-index: 2;
	padding: 3px var(--ts-space-2);
	font-family: var(--ts-font-sans);
	font-size: var(--ts-text-2xs);
	font-weight: var(--ts-weight-medium);
	line-height: 1.4;
	letter-spacing: 0;
	white-space: nowrap;
	color: var(--ts-color-surface);
	background: var(--ts-color-text-strong);
	border-radius: var(--ts-radius-sm);
	opacity: 0;
	transform: translate(-3px, -50%);
	transition: opacity var(--ts-duration-fast) var(--ts-ease), transform var(--ts-duration-fast) var(--ts-ease);
	pointer-events: none;
}

/* На дотик наведення немає — підказка лише після натискання. */
@media (hover: hover) {
	.ts-copy-code:hover::after {
		content: attr(data-copy-label);
		opacity: 1;
		transform: translate(0, -50%);
	}
}

.ts-copy-code:focus-visible::after {
	content: attr(data-copy-label);
	opacity: 1;
	transform: translate(0, -50%);
}

.ts-copy-code.is-done::after {
	opacity: 1;
	transform: translate(0, -50%);
}

/* На телефоні праворуч від коду місця немає — підказка під ним. */
@media (max-width: 559px) {
	.ts-copy-code::after,
	.ts-copy-code:focus-visible::after,
	.ts-copy-code.is-done::after {
		top: calc(100% + 4px);
		left: 0;
		transform: none;
	}
}

.ts-copy-code.is-done::after {
	content: attr(data-copied-label);
	background: var(--ts-color-success, #008a20);
}

@media (max-width: 559px) {
	.ts-specs__label {
		width: 50%;
	}
}

/* --- Вкладка «Доставка і оплата»: ті самі умови, картками ---------------- */

.ts-product__terms {
	margin-block: var(--ts-space-10);
}

.ts-terms--full {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
	gap: var(--ts-space-4);
}

.ts-terms--full .ts-terms__group {
	padding: var(--ts-space-5);
	background: var(--ts-color-surface-sunken);
	border-radius: var(--ts-radius-lg);
}

.ts-terms--full .ts-terms__title {
	margin-bottom: var(--ts-space-3);
	font-size: var(--ts-text-md);
}

.ts-terms--full .ts-terms__list {
	gap: var(--ts-space-3);
}

.ts-terms--full .ts-terms__item {
	font-size: var(--ts-text-base);
}

/* --- Модалка ------------------------------------------------------------- */

.ts-modal {
	position: fixed;
	inset: 0;
	z-index: var(--ts-z-modal);
	display: flex;
	align-items: center;
	justify-content: center;
	padding: var(--ts-space-4);
}

.ts-modal[hidden] {
	display: none;
}

.ts-modal__backdrop {
	position: absolute;
	inset: 0;
	background: rgba(4, 22, 42, 0.5);
}

.ts-modal__dialog {
	position: relative;
	z-index: 1;
	width: 100%;
	max-width: 440px;
	max-height: calc(100vh - var(--ts-space-8));
	display: flex;
	flex-direction: column;
	background: var(--ts-color-surface);
	border-radius: var(--ts-radius-xl);
	box-shadow: var(--ts-shadow-lg);
	overflow: hidden;
}

.ts-modal__head {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: var(--ts-space-3);
	padding: var(--ts-space-4) var(--ts-space-5);
	border-bottom: 1px solid var(--ts-color-border);
	flex: none;
}

.ts-modal__title {
	font-size: var(--ts-text-lg);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

.ts-modal__close {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 44px;
	height: 44px;
	flex: none;
	border-radius: var(--ts-radius-md);
	color: var(--ts-color-muted);
}

.ts-modal__close:hover {
	background: var(--ts-color-surface-sunken);
	color: var(--ts-color-text);
}

.ts-modal__body {
	padding: var(--ts-space-5);
	overflow-y: auto;
}

.ts-modal__product {
	display: flex;
	align-items: center;
	gap: var(--ts-space-3);
	margin-bottom: var(--ts-space-4);
	padding: var(--ts-space-3);
	background: var(--ts-color-surface-sunken);
	border-radius: var(--ts-radius-md);
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-medium);
	color: var(--ts-color-text);
}

.ts-modal__thumb {
	flex: none;
	width: 56px;
	height: 56px;
	padding: var(--ts-space-1);
	background: var(--ts-color-surface);
	border-radius: var(--ts-radius-sm);
}

.ts-modal__thumb img {
	width: 100%;
	height: 100%;
	object-fit: contain;
}

.ts-modal__info {
	display: flex;
	flex-direction: column;
	gap: var(--ts-space-1);
	min-width: 0;
}

/* Довгі назви техніки — у три рядки, а не на пів модалки. */
.ts-modal__name {
	display: -webkit-box;
	-webkit-box-orient: vertical;
	-webkit-line-clamp: 3;
	line-clamp: 3;
	overflow: hidden;
	line-height: var(--ts-leading-snug, 1.35);
}

.ts-modal__price {
	font-size: var(--ts-text-base);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

/*
 * Телефон: модалка — «шторка» знизу на всю ширину. Посередині екрана
 * вона ховалась під клавіатурою, а поле телефону опинялось за краєм.
 * dvh, а не vh: на мобільному vh не враховує панелі браузера.
 */
@media (max-width: 599px) {
	.ts-modal {
		align-items: flex-end;
		padding: 0;
	}

	.ts-modal__dialog {
		max-width: none;
		max-height: 92vh;
		max-height: 92dvh;
		border-radius: var(--ts-radius-xl) var(--ts-radius-xl) 0 0;
	}

	.ts-modal__body {
		padding: var(--ts-space-4) var(--ts-space-4) calc(var(--ts-space-4) + env(safe-area-inset-bottom, 0px));
	}

	.ts-modal__head {
		padding: var(--ts-space-2) var(--ts-space-2) var(--ts-space-2) var(--ts-space-4);
	}
}

/* --- Форма запиту -------------------------------------------------------- */

.ts-inquiry {
	display: flex;
	flex-direction: column;
	gap: var(--ts-space-4);
}

/*
 * Після успіху JS ставить формі hidden. Це атрибут, а його display:none
 * слабший за правило з класом вище — без цього форма лишалась на місці,
 * а подяка з'їжджала під неї.
 */
.ts-inquiry[hidden] {
	display: none;
}

.ts-required {
	color: var(--ts-color-danger);
}

.ts-field__optional {
	margin-left: var(--ts-space-1);
	font-weight: var(--ts-weight-regular, 400);
	color: var(--ts-color-faint);
}

.ts-inquiry textarea.ts-input {
	min-height: 64px;
	resize: vertical;
	line-height: var(--ts-leading-normal, 1.5);
}

/* Кількість ліворуч, сума праворуч — одним рядком. */
.ts-inquiry__row {
	display: flex;
	align-items: flex-end;
	justify-content: space-between;
	gap: var(--ts-space-4);
}

.ts-inquiry__total {
	display: flex;
	flex-direction: column;
	align-items: flex-end;
	gap: var(--ts-space-2);
	text-align: right;
}

.ts-inquiry__total strong {
	font-size: var(--ts-text-xl, 1.25rem);
	font-weight: var(--ts-weight-semibold);
	line-height: 44px;
	color: var(--ts-color-text-strong);
	white-space: nowrap;
}

/* У модалці кнопки лічильника — повні 44px: вона не ділить рядок із кошиком. */
.ts-inquiry .ts-qty__btn {
	width: 44px;
}

.ts-inquiry .ts-qty__input {
	width: 48px;
}

.ts-inquiry__form-error {
	padding: var(--ts-space-3);
	background: var(--ts-color-danger-soft, #fdecec);
	border-radius: var(--ts-radius-md);
	font-size: var(--ts-text-sm);
	color: var(--ts-color-danger);
}

.ts-inquiry__form-error[hidden] {
	display: none;
}

/*
 * Поле-пастка для ботів: поза екраном, а не display:none — частина
 * ботів поля з display:none не заповнює, і пастка не спрацювала б.
 */
.ts-hp {
	position: absolute;
	left: -10000px;
	width: 1px;
	height: 1px;
	overflow: hidden;
}

.ts-inquiry__success-number {
	margin-bottom: var(--ts-space-2);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text);
}

.ts-inquiry__success .ts-btn {
	margin-top: var(--ts-space-5);
}

.ts-inquiry__note {
	font-size: var(--ts-text-xs);
	color: var(--ts-color-faint);
	text-align: center;
}

.ts-inquiry__success {
	padding-block: var(--ts-space-6);
	text-align: center;
	color: var(--ts-color-muted);
}

.ts-inquiry__success-icon {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 64px;
	height: 64px;
	margin-bottom: var(--ts-space-4);
	background: var(--ts-color-primary-soft);
	border-radius: var(--ts-radius-full);
	color: var(--ts-color-primary);
}

.ts-inquiry__success-title {
	margin-bottom: var(--ts-space-2);
	font-size: var(--ts-text-lg);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

/* «Отримати відповідь у Telegram» — над «Продовжити покупки». */
.ts-inquiry__success [data-ts-inquiry-tg] {
	margin-bottom: var(--ts-space-3);
}

/* .ts-btn задає display — без цього атрибут hidden кнопку не ховав би. */
.ts-inquiry__success [data-ts-inquiry-tg][hidden] {
	display: none;
}

.ts-inquiry__tg-note {
	margin-bottom: var(--ts-space-4);
	font-size: var(--ts-text-sm);
}

/* Поки запит виконується — не даємо натиснути двічі */
.ts-inquiry.is-loading {
	opacity: 0.6;
	pointer-events: none;
}

/* --- Липка панель купівлі (мобільне) --------------------------------------- */

.ts-sticky-buy {
	position: fixed;
	z-index: var(--ts-z-sticky);
	right: 0;
	bottom: 0;
	left: 0;
	background: var(--ts-color-surface);
	border-top: 1px solid var(--ts-color-border);
	box-shadow: var(--ts-shadow-lg);
	/* Щоб панель не лізла під домашню смугу iPhone. */
	padding-bottom: env(safe-area-inset-bottom);
	transform: translateY(100%);
	transition: transform var(--ts-duration-fast) var(--ts-ease);
}

.ts-sticky-buy[hidden] {
	display: none;
}

.ts-sticky-buy.is-visible {
	transform: translateY(0);
}

/*
 * На телефоні внизу ще й панель навігації (60px, вища за z-index):
 * панель купівлі ставимо над нею, інакше «Додати в кошик» наполовину
 * ховався під «Головна / Каталог / Кошик».
 */
@media (max-width: 1023px) {
	.ts-sticky-buy {
		bottom: calc(60px + env(safe-area-inset-bottom, 0px));
		padding-bottom: 0;
	}
}

.ts-sticky-buy__inner {
	display: flex;
	align-items: center;
	gap: var(--ts-space-3);
	padding: var(--ts-space-3) var(--ts-space-4);
}

.ts-sticky-buy__info {
	display: flex;
	flex: 1 1 auto;
	flex-direction: column;
	min-width: 0;
}

.ts-sticky-buy__name {
	overflow: hidden;
	font-size: var(--ts-text-xs);
	line-height: var(--ts-leading-snug);
	color: var(--ts-color-muted);
	text-overflow: ellipsis;
	white-space: nowrap;
}

.ts-sticky-buy__price {
	font-size: var(--ts-text-md);
	font-weight: var(--ts-weight-bold);
	color: var(--ts-color-text-strong);
}

.ts-sticky-buy__submit {
	flex: 0 0 auto;
	/* 44px — мінімальна зручна ціль для пальця. */
	min-height: 48px;
	/* «У кошик» в один рядок: у два він виглядав зламаним. */
	white-space: nowrap;
}

/*
 * Іконка стискалась до нуля (флекс без власної ширини), і кнопка
 * виглядала порожньою зліва — з кривим відступом.
 */
.ts-sticky-buy__submit .ts-icon {
	flex: 0 0 20px;
	width: 20px;
	height: 20px;
}

/*
 * Від 1200px липким лишається сам блок купівлі — панель не потрібна.
 * Саме 1200, а не 1024: липкий блок вмикається з тієї ж ширини, і на
 * 1024–1199 «Додати в кошик» інакше не тримався на екрані ніде.
 */
@media (min-width: 1200px) {
	.ts-sticky-buy {
		display: none;
	}
}

/*
 * Телефон і планшет: назва → фото → ціна з кнопкою → характеристики.
 * Раніше ціна була аж під шістьма ключовими характеристиками, на
 * другому екрані. .ts-product__summary розчиняється, і його частини
 * стають у спільний порядок з фото й блоком купівлі.
 */
@media (max-width: 899px) {
	.ts-product__top {
		gap: var(--ts-space-5);
	}

	.ts-product__summary {
		display: contents;
	}

	.ts-product__head {
		order: 1;
	}

	.ts-product__head .ts-product__codes {
		margin-bottom: 0;
	}

	.ts-product__gallery {
		order: 2;
	}

	.ts-family {
		order: 3;
		margin-bottom: 0;
	}

	.ts-product__purchase {
		order: 4;
	}

	/* Послуги й доставка — одразу під кнопкою купівлі, до характеристик. */
	.ts-product__extras {
		order: 5;
	}

	.ts-product__keyspecs {
		order: 6;
	}
}

/*
 * 900–1199: дві колонки. Праворуч — назва, варіанти, ціна з кнопкою і
 * лише тоді ключові характеристики; фото ліворуч на всю висоту. Раніше
 * блок купівлі стояв під характеристиками, нижче першого екрана.
 */
@media (min-width: 900px) and (max-width: 1199px) {
	.ts-product__top {
		grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
		grid-auto-flow: row dense;
		row-gap: var(--ts-space-5);
		align-items: start;
	}

	.ts-product__summary {
		display: contents;
	}

	.ts-product__gallery {
		grid-column: 1;
		grid-row: 1 / span 5;
	}

	.ts-product__head,
	.ts-family,
	.ts-product__purchase,
	.ts-product__extras,
	.ts-product__keyspecs {
		grid-column: 2;
	}

	/* У DOM характеристики й послуги стоять раніше за блок купівлі. */
	.ts-product__head { order: 1; }
	.ts-family { order: 2; }
	.ts-product__purchase { order: 3; }
	.ts-product__extras { order: 4; }
	.ts-product__keyspecs { order: 5; }

	.ts-product__head .ts-product__codes,
	.ts-family {
		margin-bottom: 0;
	}
}

/*
 * Довгий опис і таблиця характеристик на телефоні — згорнуті до
 * кількох екранів з кнопкою «Показати повністю» (Collapse у main.js):
 * розгорнутий опис ноутбука займав шість екранів, і до характеристик
 * і відгуків ніхто не догортав.
 */
.ts-collapse.is-collapsed {
	position: relative;
	max-height: var(--ts-collapse-height, 420px);
	overflow: hidden;
}

.ts-collapse.is-collapsed::after {
	content: "";
	position: absolute;
	right: 0;
	bottom: 0;
	left: 0;
	height: 96px;
	background: linear-gradient(to bottom, rgba(255, 255, 255, 0), var(--ts-color-bg));
	pointer-events: none;
}

.ts-collapse__toggle {
	display: inline-flex;
	align-items: center;
	gap: var(--ts-space-1);
	min-height: 44px;
	margin-top: var(--ts-space-2);
	padding: 0;
	font: inherit;
	font-size: var(--ts-text-base);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-primary);
	background: none;
	border: 0;
	cursor: pointer;
}

.ts-collapse__toggle .ts-icon {
	transition: transform var(--ts-duration-fast) var(--ts-ease);
}

.ts-collapse__toggle[aria-expanded="true"] .ts-icon {
	transform: rotate(180deg);
}

@media (prefers-reduced-motion: reduce) {
	.ts-sticky-buy {
		transition: none;
	}
}

/* --- Вкладки сторінки товару -------------------------------------------- */

/*
 * Панель показуємо лише на десктопі. На мобільному секції йдуть одна
 * під одною: вкладка ховає вміст за зайвий тап, а характеристики —
 * головне, заради чого сюди приходять.
 */
.ts-tabs {
	display: none;
}

.is-hidden-tab {
	display: none;
}

@media (min-width: 900px) {
	.ts-tabs {
		display: flex;
		gap: var(--ts-space-6);
		margin-bottom: var(--ts-space-6);
		border-bottom: 1px solid var(--ts-color-border);
		overflow-x: auto;
		scrollbar-width: none;
	}

	.ts-tabs::-webkit-scrollbar {
		display: none;
	}

	.ts-tabs__item {
		position: relative;
		flex: none;
		padding-bottom: var(--ts-space-3);
		font-size: var(--ts-text-base);
		font-weight: var(--ts-weight-medium);
		color: var(--ts-color-muted);
		white-space: nowrap;
	}

	.ts-tabs__item:hover {
		color: var(--ts-color-text-strong);
		text-decoration: none;
	}

	.ts-tabs__item.is-active {
		color: var(--ts-color-text-strong);
	}

	/* Підкреслення активної — на межі панелі, а не під текстом. */
	.ts-tabs__item.is-active::after {
		content: "";
		position: absolute;
		left: 0;
		right: 0;
		bottom: -1px;
		height: 2px;
		background: var(--ts-color-primary);
		border-radius: 2px 2px 0 0;
	}

	/*
	 * Заголовки секцій усередині вкладки зайві: назва вкладки вже
	 * сказала, що це. На мобільному вони лишаються.
	 */
	.ts-product__details .ts-section__title {
		position: absolute;
		width: 1px;
		height: 1px;
		overflow: hidden;
		clip-path: inset(50%);
		white-space: nowrap;
	}
}

/* --- Швидке замовлення й обране ----------------------------------------- */

.ts-buybox__quick {
	margin-top: var(--ts-space-2);
}

/*
 * Блик раз на 6 секунд: світла смуга пробігає по градієнту зліва
 * направо, кнопка сама не рухається. Смикання читалось як помилка
 * вводу, а не як запрошення натиснути. Під курсором і з
 * prefers-reduced-motion — без блику.
 */
.ts-buybox__quick {
	position: relative;
	overflow: hidden;
	isolation: isolate;
}

@media (prefers-reduced-motion: no-preference) {
	.ts-buybox__quick::after {
		content: "";
		position: absolute;
		inset: 0 auto 0 0;
		z-index: -1;
		width: 45%;
		background: linear-gradient(100deg, transparent 0%, rgba(255, 255, 255, 0.35) 50%, transparent 100%);
		transform: translateX(-120%) skewX(-20deg);
		animation: ts-quick-shine 6s ease-in-out 1.5s infinite;
		pointer-events: none;
	}

	.ts-buybox__quick:hover::after,
	.ts-buybox__quick:focus-visible::after {
		animation: none;
		opacity: 0;
	}
}

/* Пробіг займає ~0,9 с на початку циклу, решту часу смуга за краєм. */
@keyframes ts-quick-shine {
	0% {
		transform: translateX(-120%) skewX(-20deg);
	}

	15%,
	100% {
		transform: translateX(300%) skewX(-20deg);
	}
}

/*
 * Обране — тиха дія текстом: у макеті вона третього рівня, поруч із
 * двома кнопками. Робити її ще однією кнопкою означало б три однакові
 * прямокутники поспіль.
 */
.ts-buybox__wish {
	display: inline-flex;
	align-items: center;
	gap: var(--ts-space-2);
	margin-top: var(--ts-space-3);
	padding: var(--ts-space-1) 0;
	border: 0;
	background: none;
	color: var(--ts-color-muted);
	font-size: var(--ts-text-sm);
	cursor: pointer;
	transition: color var(--ts-duration-base) var(--ts-ease);
}

.ts-buybox__wish:hover {
	color: var(--ts-color-primary);
}

.ts-buybox__wish.is-on {
	color: var(--ts-color-danger, #d63638);
}

/* Заповнене серце позначає, що товар уже в списку. */
.ts-buybox__wish.is-on .ts-icon {
	fill: currentColor;
}

/* --- Відгуки ------------------------------------------------------------ */

/*
 * Білий фон, як у решти карток: сіра підкладка відсувала підсумок
 * на другий план, хоча це перше, що дивляться у відгуках.
 * Межу тримає рамка.
 */
.ts-reviews__summary {
	display: grid;
	grid-template-columns: minmax(0, 1fr);
	gap: var(--ts-space-5);
	margin-bottom: var(--ts-space-5);
	padding: var(--ts-space-5);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
	background: var(--ts-color-surface);
}

@media (min-width: 720px) {
	.ts-reviews__summary {
		grid-template-columns: auto minmax(0, 1fr);
		gap: var(--ts-space-8);
		align-items: center;
	}
}

.ts-reviews__score {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: var(--ts-space-1);
}

.ts-reviews__score-value {
	font-size: var(--ts-text-3xl);
	font-weight: var(--ts-weight-bold);
	line-height: 1;
	color: var(--ts-color-text-strong);
}

.ts-reviews__score-count {
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
}

/*
 * Розподіл оцінок: покупцю він корисніший за саме середнє — видно,
 * чи 4.5 зібралось із рівних четвірок, чи з п'ятірок і однієї одиниці.
 */
.ts-reviews__spread {
	display: flex;
	flex-direction: column;
	gap: 4px;
}

.ts-reviews__spread-row {
	display: flex;
	align-items: center;
	gap: var(--ts-space-2);
	font-size: var(--ts-text-xs);
	color: var(--ts-color-muted);
}

.ts-reviews__spread-row .ts-icon {
	color: #f5a524;
	fill: currentColor;
	stroke: none;
}

.ts-reviews__spread-bar {
	flex: 1 1 auto;
	height: 6px;
	border-radius: var(--ts-radius-full);
	background: var(--ts-color-border);
	overflow: hidden;
}

.ts-reviews__spread-bar > span {
	display: block;
	height: 100%;
	background: #f5a524;
}

.ts-reviews__spread-count {
	min-width: 24px;
	text-align: right;
}

.ts-reviews__list {
	display: flex;
	flex-direction: column;
	gap: var(--ts-space-3);
	margin: 0 0 var(--ts-space-5);
	padding: 0;
	list-style: none;
}

/*
 * Кожен відгук — картка з рамкою, а не рядок із лінією знизу.
 * Лінія в останнього відгуку прибиралась, тож при одному відгуку —
 * а це найчастіший випадок на старті — не було видно нічого, і текст
 * висів у порожнечі.
 *
 * Клас саме ts-review-card: .ts-review вже зайнятий підсумком
 * замовлення на чекауті, а _cart.css підключається після цього файлу
 * й перебивав би тутешні правила.
 */
.ts-review-card {
	padding: var(--ts-space-4);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
	background: var(--ts-color-surface);
}

.ts-review__head {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: var(--ts-space-3);
	margin-bottom: var(--ts-space-2);
}

.ts-review__author {
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

.ts-review__verified {
	display: inline-flex;
	align-items: center;
	gap: 4px;
	font-size: var(--ts-text-xs);
	color: #08703a;
}

.ts-review__date {
	margin-left: auto;
	font-size: var(--ts-text-xs);
	color: var(--ts-color-faint);
}

.ts-review__text {
	color: var(--ts-color-text);
	line-height: var(--ts-leading-relaxed);
}

.ts-review__text p:last-child {
	margin-bottom: 0;
}

.ts-reviews__empty,
.ts-reviews__note {
	margin-bottom: var(--ts-space-5);
	color: var(--ts-color-muted);
}

/* --- Форма відгуку ------------------------------------------------------ */

.ts-review-form,
.ts-reviews__login {
	padding: var(--ts-space-5);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
	background: var(--ts-color-surface);
}

.ts-review-form__title {
	margin: 0 0 var(--ts-space-4);
	font-size: var(--ts-text-lg);
	color: var(--ts-color-text-strong);
}

.ts-review-form__note {
	margin: var(--ts-space-3) 0 0;
	font-size: var(--ts-text-xs);
	color: var(--ts-color-faint);
}

.ts-reviews__login p {
	margin: 0 0 var(--ts-space-3);
	color: var(--ts-color-muted);
}

/*
 * Зірки-радіо. Порядок у розмітці зворотний (5→1), тому підсвічуємо
 * саму зірку і всі наступні в DOM — це й є «ця та лівіші» на екрані.
 */
.ts-rating-input {
	display: inline-flex;
	flex-direction: row-reverse;
	justify-content: flex-end;
	gap: 2px;
}

.ts-rating-input input {
	position: absolute;
	width: 1px;
	height: 1px;
	opacity: 0;
}

.ts-rating-input label {
	display: inline-flex;
	padding: 2px;
	color: var(--ts-color-border-strong);
	cursor: pointer;
	transition: color var(--ts-duration-fast) var(--ts-ease);
}

.ts-rating-input label .ts-icon {
	fill: currentColor;
	stroke: none;
}

.ts-rating-input input:checked ~ label,
.ts-rating-input label:hover,
.ts-rating-input label:hover ~ label {
	color: #f5a524;
}

/* Обведення для клавіатури: інакше вибір оцінки з Tab невидимий. */
.ts-rating-input input:focus-visible + label {
	outline: 2px solid var(--ts-color-primary);
	outline-offset: 2px;
	border-radius: var(--ts-radius-sm);
}

/* --- Подяка після відправки відгуку ------------------------------------- */

.ts-review-sent {
	display: flex;
	align-items: flex-start;
	gap: var(--ts-space-3);
	margin-bottom: var(--ts-space-5);
	padding: var(--ts-space-4);
	border: 1px solid #b7e3c6;
	border-radius: var(--ts-radius-lg);
	background: #e7f6ec;
}

.ts-review-sent__icon {
	flex: 0 0 auto;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 34px;
	height: 34px;
	border-radius: var(--ts-radius-full);
	background: #08703a;
	color: #fff;
}

.ts-review-sent__title {
	margin: 0 0 2px;
	font-weight: var(--ts-weight-semibold);
	color: #08703a;
}

.ts-review-sent__text {
	margin: 0;
	font-size: var(--ts-text-sm);
	color: var(--ts-color-text);
}

/* --- Лупа в галереї ------------------------------------------------------ */

/*
 * Кругла лінза, що йде за курсором і показує збільшену ділянку фото.
 * Її розміри й фон задає JS; тут — вигляд і поведінка.
 */
.ts-gallery__lens {
	position: absolute;
	/* Центр лінзи — під курсором, тому зсуваємо на пів-розміру. */
	transform: translate(-50%, -50%);
	width: 180px;
	height: 180px;
	pointer-events: none;
	opacity: 0;
	visibility: hidden;
	border-radius: var(--ts-radius-full);
	border: 2px solid rgba(255, 255, 255, 0.9);
	box-shadow: var(--ts-shadow-lg), 0 0 0 1px var(--ts-color-border);
	background-color: #fff;
	background-repeat: no-repeat;
	/*
	 * Згладжування, а не різкі пікселі: у постачальника фото 400×400,
	 * і при збільшенні браузер має розмити перехід, інакше видно
	 * «драбинку». На великих фото це нічого не псує.
	 */
	image-rendering: auto;
	transition: opacity var(--ts-duration-fast) var(--ts-ease);
	z-index: var(--ts-z-base);
}

.ts-gallery__lens.is-visible {
	opacity: 1;
	visibility: visible;
}

/* Курсор-приціл підказує, що фото можна роздивитись. */
.ts-gallery__stage.has-zoom {
	cursor: zoom-in;
}

/*
 * Дотик: лупи немає. Пальцем неможливо «навести», а сама лінза
 * перекривала б фото — на телефоні працює звичайне гортання.
 */
@media (hover: none), (pointer: coarse) {
	.ts-gallery__lens {
		display: none;
	}

	.ts-gallery__stage.has-zoom {
		cursor: default;
	}
}

/*
 * Хлібні крихти на телефоні: без останнього пункту — це назва товару,
 * яка тут же стоїть заголовком. Крихти займали три рядки над фото.
 */
@media (max-width: 767px) {
	.single-product .ts-breadcrumbs__current,
	.single-product .ts-breadcrumbs__sep:has(+ .ts-breadcrumbs__current) {
		display: none;
	}
}

/* --- Умови одним рядком у блоці купівлі ----------------------------------
   Оплата / гарантія / повернення — як у макеті: іконка й два рядки.
   ------------------------------------------------------------------------ */

.ts-perks {
	display: flex;
	flex-wrap: wrap;
	gap: var(--ts-space-3) var(--ts-space-2);
	justify-content: space-between;
	margin: 0;
	padding: var(--ts-space-4) 0 0;
	border-top: 1px solid var(--ts-color-border);
	list-style: none;
}

.ts-perks__item {
	display: flex;
	align-items: center;
	gap: 6px;
	min-width: 0;
	white-space: nowrap;
}

.ts-perks__icon {
	display: inline-flex;
	flex: none;
	color: var(--ts-color-primary);
}

.ts-perks__text {
	display: flex;
	flex-direction: column;
	line-height: var(--ts-leading-snug);
}

.ts-perks__title {
	font-size: var(--ts-text-xs);
	font-weight: var(--ts-weight-medium);
	color: var(--ts-color-text-strong);
}

.ts-perks__value {
	font-size: var(--ts-text-xs);
	color: var(--ts-color-muted);
}

/* --- Картки під блоком купівлі: «Додаткові послуги», «Доставка» ---------- */

.ts-upsell {
	padding: var(--ts-space-4) var(--ts-space-5);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
	box-shadow: var(--ts-shadow-sm);
}

.ts-upsell__head {
	display: flex;
	align-items: flex-start;
	gap: var(--ts-space-3);
	margin-bottom: var(--ts-space-3);
}

.ts-upsell__icon {
	display: inline-flex;
	flex: none;
	color: var(--ts-color-primary);
}

.ts-upsell__title {
	margin: 0;
	font-size: var(--ts-text-md);
	font-weight: var(--ts-weight-semibold);
	line-height: var(--ts-leading-snug);
	color: var(--ts-color-text-strong);
}

.ts-upsell__sub {
	margin: 2px 0 0;
	font-size: var(--ts-text-xs);
	color: var(--ts-color-muted);
}

/* Гарантія: галочка й назва — одна мітка на всю ширину рядка (44px). */
.ts-services__list,
.ts-delivery__list {
	margin: 0;
	padding: 0;
	list-style: none;
}

.ts-services__item {
	display: flex;
	align-items: center;
	gap: var(--ts-space-2);
	min-height: 44px;
	border-top: 1px solid var(--ts-color-border);
}

.ts-services__label {
	display: flex;
	flex: 1 1 auto;
	align-items: center;
	gap: var(--ts-space-3);
	min-width: 0;
	min-height: 44px;
	cursor: pointer;
	font-size: var(--ts-text-sm);
	line-height: var(--ts-leading-snug);
	color: var(--ts-color-text);
}

.ts-services__check {
	flex: none;
	width: 20px;
	height: 20px;
	margin: 0;
	accent-color: var(--ts-color-primary);
	cursor: pointer;
}

/*
 * Обране — лише кольором: жирніший текст ширшає й переносив
 * «Продовжена гарантія +2 роки» на другий рядок при кліку.
 */
.ts-services__label:has(:checked) .ts-services__name {
	color: var(--ts-color-text-strong);
}

/* Подвійний клік по мітці не виділяє текст. */
.ts-services__label {
	user-select: none;
}

/*
 * Підказка гарантії — від правого краю рядка, а не від (i): перед
 * довгою ціною (i) зсувається ліворуч, і підказка вилазила за екран.
 */
.ts-services__item {
	position: relative;
}

.ts-services .ts-tip {
	position: static;
}

.ts-services .ts-tip__pop {
	right: 0;
}

.ts-services__price {
	flex: none;
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
	white-space: nowrap;
}

/* Доставка: значок | спосіб | строк | ціна. */
.ts-delivery__item {
	display: grid;
	grid-template-columns: 18px minmax(0, 1fr) auto;
	grid-template-areas:
		"media label price"
		".     time  price";
	column-gap: var(--ts-space-3);
	align-items: center;
	padding: var(--ts-space-2) 0;
	border-top: 1px solid var(--ts-color-border);
	font-size: var(--ts-text-sm);
	line-height: var(--ts-leading-snug);
}

.ts-delivery__media {
	grid-area: media;
	display: grid;
	place-items: center;
	color: var(--ts-color-primary);
}

.ts-delivery__media img {
	display: block;
	width: 18px;
	height: 18px;
}

.ts-delivery__label {
	grid-area: label;
	color: var(--ts-color-text);
}

.ts-delivery__time {
	grid-area: time;
	font-size: var(--ts-text-xs);
	color: var(--ts-color-muted);
}

.ts-delivery__price {
	grid-area: price;
	display: inline-flex;
	align-items: center;
	gap: 2px;
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
	white-space: nowrap;
}

.ts-delivery__price.is-free {
	color: var(--ts-color-success);
	font-weight: var(--ts-weight-medium);
}

/* Замість суми — текст: тихіше за ціну й може перенестись у вузькій колонці. */
.ts-delivery__price.is-carrier {
	max-width: 11em;
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-medium);
	color: var(--ts-color-muted);
	text-align: right;
	white-space: normal;
}

/* Обрана гарантія в швидкому замовленні — рядком над сумою. */
.ts-inquiry__row:has(.ts-inquiry__warranty:not([hidden])) {
	flex-wrap: wrap;
}

.ts-inquiry__warranty {
	order: 3;
	flex-basis: 100%;
	margin: 0;
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
}

/* --- Підказка (i) ------------------------------------------------------- */

.ts-tip {
	position: relative;
	display: inline-flex;
	flex: none;
}

/* Сама іконка 16px, а ціль для пальця — 32px (рядок і так 44px). */
.ts-tip__btn {
	display: inline-grid;
	place-items: center;
	width: 32px;
	height: 32px;
	margin: -6px -4px;
	padding: 0;
	background: none;
	border: 0;
	border-radius: var(--ts-radius-full);
	color: var(--ts-color-faint);
	cursor: help;
}

.ts-tip__btn:hover,
.ts-tip.is-open .ts-tip__btn {
	color: var(--ts-color-primary);
}

.ts-tip__btn:focus-visible {
	outline: none;
	box-shadow: var(--ts-shadow-focus);
}

/* Над кнопкою, праворуч вирівняна: (i) стоять біля правого краю колонки. */
.ts-tip__pop {
	position: absolute;
	right: -8px;
	bottom: calc(100% + 6px);
	z-index: var(--ts-z-dropdown);
	width: max-content;
	/* Вужча за екран з запасом: (i) стоять не впритул до краю, а підказка росте ліворуч. */
	max-width: min(260px, calc(100vw - 96px));
	padding: var(--ts-space-2) var(--ts-space-3);
	background: var(--ts-color-text-strong);
	border-radius: var(--ts-radius-md);
	box-shadow: var(--ts-shadow-md);
	font-size: var(--ts-text-xs);
	font-weight: var(--ts-weight-regular);
	line-height: var(--ts-leading-normal);
	color: var(--ts-color-surface);
	white-space: normal;
	text-align: left;
	/* Прихована — поза розкладкою (display), інакше розширює сторінку. */
	display: none;
	opacity: 0;
	pointer-events: none;
	transform: translateY(4px);
	transition: opacity var(--ts-duration-fast) var(--ts-ease), transform var(--ts-duration-fast) var(--ts-ease), visibility var(--ts-duration-fast);
}

.ts-tip.is-open .ts-tip__pop,
.ts-tip:has(.ts-tip__btn:focus-visible) .ts-tip__pop {
	display: block;
	opacity: 1;
	transform: none;
}

@media (hover: hover) {
	.ts-tip:hover .ts-tip__pop {
		display: block;
		opacity: 1;
		transform: none;
	}
}

/* --- «Разом з цим купують» ------------------------------------------------
   Стрічка карток із горизонтальним гортанням; стрілки — лише там, де є
   миша (на телефоні гортають пальцем).
   ------------------------------------------------------------------------ */

.ts-related {
	margin: var(--ts-space-10) 0;
}

.ts-related__head {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: var(--ts-space-4);
	margin-bottom: var(--ts-space-4);
}

.ts-related__title {
	margin: 0;
	font-size: var(--ts-text-xl);
	line-height: var(--ts-leading-tight);
	color: var(--ts-color-text-strong);
}

.ts-related__nav {
	display: none;
	gap: var(--ts-space-2);
}

@media (hover: hover) and (pointer: fine) {
	.ts-related__nav {
		display: flex;
	}
}

.ts-related__arrow {
	display: grid;
	place-items: center;
	width: 40px;
	height: 40px;
	padding: 0;
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-full);
	color: var(--ts-color-text-strong);
	cursor: pointer;
}

.ts-related__arrow:first-child .ts-icon {
	transform: rotate(180deg);
}

.ts-related__arrow:hover:not(:disabled) {
	border-color: var(--ts-color-primary);
	color: var(--ts-color-primary);
}

.ts-related__arrow:disabled {
	opacity: 0.4;
	cursor: default;
}

.ts-related__rail {
	display: flex;
	gap: var(--ts-space-4);
	margin: 0 calc(-1 * var(--ts-container-pad, 16px));
	padding: 0 var(--ts-container-pad, 16px) var(--ts-space-2);
	overflow-x: auto;
	scroll-snap-type: x proximity;
	scroll-padding-inline: var(--ts-container-pad, 16px);
	scrollbar-width: thin;
}

.ts-related__rail > .ts-card {
	flex: 0 0 calc((100% - 3 * var(--ts-space-4)) / 4.4);
	min-width: 0;
	scroll-snap-align: start;
}

@media (max-width: 1199px) {
	.ts-related__rail > .ts-card {
		flex-basis: calc((100% - 2 * var(--ts-space-4)) / 3.3);
	}
}

@media (max-width: 767px) {
	/* Без прилипання: на дотику воно могло повертати короткий свайп назад. */
	.ts-related__rail {
		scroll-snap-type: none;
	}

	.ts-related__rail > .ts-card {
		flex-basis: 70%;
	}
}

/*
 * Послуги й доставка — колонкою карток. На широкому екрані вони
 * стоять під «Основні характеристики» і не ширші за пару колонок
 * характеристик.
 */
.ts-product__extras {
	display: flex;
	flex-direction: column;
	gap: var(--ts-space-3);
}

.ts-product__extras:empty {
	display: none;
}

@media (min-width: 1200px) {
	.ts-product__extras {
		margin-top: var(--ts-space-5);
		max-width: 520px;
	}
}

/*
 * Хлібні крихти на картці товару без останнього пункту й на десктопі:
 * це назва товару, яка тут же стоїть заголовком.
 */
.single-product .ts-breadcrumbs__current,
.single-product .ts-breadcrumbs__sep:has(+ .ts-breadcrumbs__current) {
	display: none;
}

/* ==========================================================================
   TopShop — Блог: список статей і сторінка статті
   ========================================================================== */

.ts-blog__head {
	margin-bottom: var(--ts-space-6);
}

/*
 * Відступ згори такий самий, як у заголовка статті: хлібні крихти
 * мають власний padding, і заголовок має від них відійти.
 */
.ts-blog__title {
	margin: var(--ts-space-3) 0 0;
	font-size: var(--ts-text-3xl);
	line-height: var(--ts-leading-snug);
}

/*
 * Рубрика й архів за датою використовують ту саму шапку, тож
 * відступ працює і там.
 */
.ts-blog__head:first-child {
	margin-top: var(--ts-space-4);
}

.ts-blog__lead {
	margin: var(--ts-space-2) 0 0;
	font-size: var(--ts-text-md);
	color: var(--ts-color-muted);
}

/*
 * Сітка статей. Перша картка займає весь ряд і кладе картинку поруч
 * із текстом — так видно, з чого почати, а список не читається як
 * рівний килим з однакових прямокутників.
 */
.ts-blog {
	display: grid;
	grid-template-columns: minmax(0, 1fr);
	gap: var(--ts-space-5);
	margin-bottom: var(--ts-space-8);
}

@media (min-width: 700px) {
	.ts-blog {
		grid-template-columns: repeat(2, minmax(0, 1fr));
	}
}

@media (min-width: 1000px) {
	.ts-blog {
		grid-template-columns: repeat(3, minmax(0, 1fr));
	}
}

.ts-post-card {
	display: flex;
	flex-direction: column;
	overflow: hidden;
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
	transition: border-color var(--ts-duration-fast) var(--ts-ease),
		box-shadow var(--ts-duration-fast) var(--ts-ease);
}

.ts-post-card:hover {
	border-color: var(--ts-color-border-strong);
	box-shadow: var(--ts-shadow-sm);
}

@media (min-width: 700px) {
	.ts-post-card--lead {
		grid-column: 1 / -1;
		flex-direction: row;
	}

	.ts-post-card--lead .ts-post-card__media {
		flex: 0 0 46%;
		aspect-ratio: auto;
	}

	.ts-post-card--lead .ts-post-card__body {
		justify-content: center;
		padding: var(--ts-space-6);
	}

	.ts-post-card--lead .ts-post-card__title {
		font-size: var(--ts-text-2xl);
	}
}

.ts-post-card__media {
	display: block;
	aspect-ratio: 16 / 9;
	overflow: hidden;
	background: var(--ts-color-surface-sunken);
}

.ts-post-card__media img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	transition: transform var(--ts-duration-slow) var(--ts-ease);
}

.ts-post-card:hover .ts-post-card__media img {
	transform: scale(1.03);
}

.ts-post-card__body {
	display: flex;
	flex-direction: column;
	gap: var(--ts-space-2);
	padding: var(--ts-space-4);
}

/* Рубрика — дрібна плашка, щоб не сперечалась із заголовком. */
.ts-post-card__cat {
	align-self: flex-start;
	padding: 2px var(--ts-space-2);
	font-size: var(--ts-text-2xs);
	font-weight: var(--ts-weight-semibold);
	text-transform: uppercase;
	letter-spacing: 0.03em;
	color: var(--ts-color-primary);
	background: var(--ts-color-primary-soft);
	border-radius: var(--ts-radius-sm);
}

.ts-post-card__cat:hover {
	text-decoration: none;
	color: var(--ts-color-primary-hover);
}

.ts-post-card__title {
	margin: 0;
	font-size: var(--ts-text-lg);
	line-height: var(--ts-leading-snug);
}

.ts-post-card__title a {
	color: var(--ts-color-text-strong);
}

.ts-post-card__title a:hover {
	color: var(--ts-color-primary);
	text-decoration: none;
}

.ts-post-card__excerpt {
	margin: 0;
	font-size: var(--ts-text-sm);
	line-height: var(--ts-leading-relaxed);
	color: var(--ts-color-muted);
}

.ts-post-card__meta {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: var(--ts-space-2);
	margin-top: auto;
	padding-top: var(--ts-space-2);
	font-size: var(--ts-text-xs);
	color: var(--ts-color-faint);
}

.ts-post-card__dot {
	color: var(--ts-color-border-strong);
}

/* --- Сторінка статті ----------------------------------------------------- */

.ts-article__layout {
	display: grid;
	grid-template-columns: minmax(0, 1fr);
	gap: var(--ts-space-8);
	padding-bottom: var(--ts-space-8);
}

@media (min-width: 1000px) {
	.ts-article__layout {
		grid-template-columns: minmax(0, 1fr) 320px;
		gap: var(--ts-space-10);
	}
}

.ts-article__head {
	margin-bottom: var(--ts-space-5);
}

.ts-article__title {
	margin: var(--ts-space-3) 0 0;
	font-size: var(--ts-text-3xl);
	line-height: var(--ts-leading-snug);
}

.ts-article__meta {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: var(--ts-space-2);
	margin-top: var(--ts-space-3);
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
}

.ts-article__cover {
	margin: 0 0 var(--ts-space-6);
	overflow: hidden;
	border-radius: var(--ts-radius-lg);
}

.ts-article__cover img {
	display: block;
	width: 100%;
	height: auto;
}

/*
 * Довжина рядка в статті — головне для читання. Обмежуємо саме текст,
 * а не колонку: обкладинка й картки товарів лишаються на всю ширину.
 */
.ts-article__body {
	max-width: 68ch;
}

.ts-article__body img {
	height: auto;
	border-radius: var(--ts-radius-md);
}

.ts-article__products {
	margin-top: var(--ts-space-10);
	padding-top: var(--ts-space-6);
	border-top: 1px solid var(--ts-color-border);
}

.ts-article__products-title {
	margin: 0 0 var(--ts-space-4);
	font-size: var(--ts-text-xl);
}

/* --- Бічна колонка ------------------------------------------------------- */

.ts-article__aside {
	display: flex;
	flex-direction: column;
	gap: var(--ts-space-5);
}

@media (min-width: 1000px) {
	/*
	 * Колонка їде за текстом: у довгій статті інакше половину екрану
	 * займає порожнеча там, де блок уже закінчився.
	 */
	.ts-article__aside {
		position: sticky;
		top: var(--ts-space-5);
		align-self: start;
		max-height: calc(100vh - var(--ts-space-10));
		overflow-y: auto;
	}
}

.ts-aside__block {
	padding: var(--ts-space-5);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
}

.ts-aside__title {
	margin: 0 0 var(--ts-space-4);
	font-size: var(--ts-text-md);
	font-weight: var(--ts-weight-semibold);
}

.ts-aside__posts {
	display: grid;
	gap: var(--ts-space-4);
	margin: 0;
	padding: 0;
	list-style: none;
}

.ts-aside__post {
	display: flex;
	gap: var(--ts-space-3);
}

.ts-aside__post-media {
	flex: 0 0 auto;
	width: 64px;
	height: 64px;
	overflow: hidden;
	border-radius: var(--ts-radius-md);
	background: var(--ts-color-surface-sunken);
}

.ts-aside__post-media img {
	width: 100%;
	height: 100%;
	object-fit: cover;
}

.ts-aside__post-title {
	display: block;
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-medium);
	line-height: 1.35;
	color: var(--ts-color-text-strong);
}

.ts-aside__post-title:hover {
	color: var(--ts-color-primary);
	text-decoration: none;
}

.ts-aside__post-date {
	display: block;
	margin-top: 2px;
	font-size: var(--ts-text-xs);
	color: var(--ts-color-faint);
}

.ts-aside__links {
	display: grid;
	gap: 2px;
	margin: 0;
	padding: 0;
	list-style: none;
}

.ts-aside__links a {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: var(--ts-space-3);
	min-height: 40px;
	padding: var(--ts-space-2) 0;
	font-size: var(--ts-text-base);
	color: var(--ts-color-muted);
}

.ts-aside__links a:hover {
	color: var(--ts-color-primary);
	text-decoration: none;
}

.ts-aside__links .ts-icon {
	flex: 0 0 auto;
	color: var(--ts-color-faint);
}

.ts-aside__cta {
	text-align: center;
	background: var(--ts-color-surface-tint);
}

.ts-aside__cta-icon {
	display: grid;
	place-items: center;
	width: 48px;
	height: 48px;
	margin: 0 auto var(--ts-space-3);
	color: var(--ts-color-primary);
	background: var(--ts-color-primary-soft);
	border-radius: var(--ts-radius-full);
}

.ts-aside__cta-title {
	margin: 0;
	font-size: var(--ts-text-md);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

.ts-aside__cta-text {
	margin: var(--ts-space-1) 0 var(--ts-space-4);
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
}

/* --- Сусідні статті ------------------------------------------------------ */

.ts-article__nav {
	display: grid;
	grid-template-columns: minmax(0, 1fr);
	gap: var(--ts-space-3);
	margin-bottom: var(--ts-space-10);
}

@media (min-width: 700px) {
	.ts-article__nav {
		grid-template-columns: repeat(2, minmax(0, 1fr));
	}
}

.ts-article__nav-link {
	display: block;
	padding: var(--ts-space-4);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
}

.ts-article__nav-link:hover {
	border-color: var(--ts-color-primary);
	text-decoration: none;
}

/* Наступна стаття — праворуч: напрямок читання підказує, куди ведеш. */
.ts-article__nav-link--next {
	text-align: right;
	grid-column: -2;
}

.ts-article__nav-label {
	display: block;
	font-size: var(--ts-text-xs);
	color: var(--ts-color-faint);
}

.ts-article__nav-title {
	display: block;
	margin-top: 2px;
	font-size: var(--ts-text-base);
	font-weight: var(--ts-weight-medium);
	color: var(--ts-color-text-strong);
}

/* --- Рубрики: перемикач і список у колонці ------------------------------ */

/*
 * Лічильник поруч із назвою: показує, чи є сенс заходити в рубрику,
 * і робить список схожим на фільтри каталогу — той самий прийом.
 */
.ts-aside__count {
	flex: 0 0 auto;
	padding: 1px var(--ts-space-2);
	font-size: var(--ts-text-xs);
	color: var(--ts-color-faint);
	background: var(--ts-color-surface-sunken);
	border-radius: 999px;
}

.ts-aside__cats a.is-active {
	font-weight: var(--ts-weight-medium);
	color: var(--ts-color-text-strong);
}

.ts-aside__cats a.is-active .ts-aside__count {
	color: var(--ts-color-primary);
	background: rgba(11, 99, 246, 0.1);
}

/*
 * Перемикач рубрик над списком статей. Горизонтальна стрічка, яка на
 * вузькому екрані гортається вбік — переносити вкладки в кілька
 * рядів гірше: висота стрибає й список статей іде то вище, то нижче.
 */
.ts-blog__tabs {
	display: flex;
	flex-wrap: wrap;
	gap: var(--ts-space-2);
	margin-bottom: var(--ts-space-6);
}

.ts-blog__tab {
	display: inline-flex;
	align-items: center;
	gap: var(--ts-space-2);
	/* 40px — палець потрапляє без прицілювання. */
	min-height: 40px;
	padding: 0 var(--ts-space-4);
	font-size: var(--ts-text-sm);
	color: var(--ts-color-text);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: 999px;
	transition: border-color 0.15s ease, color 0.15s ease, background 0.15s ease;
}

.ts-blog__tab:hover {
	color: var(--ts-color-primary);
	border-color: var(--ts-color-primary);
	text-decoration: none;
}

.ts-blog__tab.is-active {
	color: #fff;
	background: var(--ts-color-primary);
	border-color: var(--ts-color-primary);
}

.ts-blog__tab-count {
	font-size: var(--ts-text-xs);
	color: var(--ts-color-faint);
}

.ts-blog__tab.is-active .ts-blog__tab-count {
	color: rgba(255, 255, 255, 0.75);
}

@media (max-width: 639px) {
	/*
	 * Телефон: стрічка з горизонтальною прокруткою замість переносу.
	 * Негативні поля дають їй вийти під край екрана, щоб було видно,
	 * що вміст гортається далі.
	 */
	.ts-blog__tabs {
		flex-wrap: nowrap;
		overflow-x: auto;
		margin-inline: calc(var(--ts-space-4) * -1);
		padding-inline: var(--ts-space-4);
		scrollbar-width: none;
	}

	.ts-blog__tabs::-webkit-scrollbar {
		display: none;
	}

	.ts-blog__tab {
		flex: 0 0 auto;
	}
}

/* ==========================================================================
   TopShop — Головна за макетом
   Банер, плитки розділів, товари з вкладками, промо, бренди, блог.
   ========================================================================== */

/*
 * Без власних відступів. Скидаємо і margin від .ts-section: там
 * 40px зверху й знизу, і саме вони лишали велику діру між банером,
 * плитками й товарами — padding я прибрав, а margin лишався.
 *
 * Повітря дають самі блоки: заголовки секцій і нижні поля сіток.
 */
.ts-home__section {
	margin-block: 0;
	padding-block: var(--ts-space-4);
}

.ts-home__section--tight {
	margin-block: 0;
	padding-block: var(--ts-space-2);
}

/*
 * Шапка секції: заголовок ліворуч, вкладки посередині, посилання
 * праворуч. На вузькому екрані все складається в стовпчик.
 */
/*
 * Заголовок і вкладки — одна група ліворуч, посилання притиснуте
 * праворуч. baseline, а не center: у заголовка й вкладок різний
 * кегль, і по центру їхні літери «плавали» одна відносно одної.
 */
.ts-home__head {
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	gap: var(--ts-space-2) var(--ts-space-6);
	margin-bottom: var(--ts-space-5);
}

.ts-home__head .ts-section__title {
	margin: 0;
}

.ts-home__head .ts-section__more {
	margin-left: auto;
	display: inline-flex;
	align-items: center;
	gap: var(--ts-space-1);
	font-size: var(--ts-text-base);
	font-weight: var(--ts-weight-semibold);
	white-space: nowrap;
}

.ts-home__head .ts-section__more:hover {
	text-decoration: none;
}

/* --- Банер --------------------------------------------------------------- */

.ts-hero {
	padding-top: var(--ts-space-5);
}

.ts-hero__frame {
	position: relative;
	border-radius: var(--ts-radius-xl);
	overflow: hidden;
	background: var(--ts-color-surface-sunken);
}

/*
 * Гортання скролом зі snap: працює без JS і дає нативний свайп на
 * телефоні. JS лише синхронізує стрілки й крапки.
 */
.ts-hero__track {
	display: flex;
	overflow-x: auto;
	scroll-snap-type: x mandatory;
	scrollbar-width: none;
	-webkit-overflow-scrolling: touch;
}

.ts-hero__track::-webkit-scrollbar {
	display: none;
}

/*
 * Слайд — це ціла картинка-посилання: текст і кнопку малює сам банер.
 * Тому тут немає ні накладок, ні градієнтів, тільки зображення.
 */
.ts-hero__slide {
	flex: 0 0 100%;
	scroll-snap-align: start;
	display: block;
}

.ts-hero__slide:hover {
	text-decoration: none;
}

/*
 * Решту слайдів ховаємо до готовності сторінки: lazy їх не стримував,
 * бо сусідні слайди вважаються близькими до екрана, і телефон качав
 * ще 400 КБ банерів разом із першим. content-visibility тут не працює:
 * перший кадр він усе одно малює. HomeHero додає is-ready після load
 * або при першому дотику. Без JS правило не діє.
 */
@media (scripting: enabled) {
	.ts-hero__track:not(.is-ready) .ts-hero__slide:not(:first-child) {
		display: none;
	}
}

/*
 * Пропорції задає смуга, а не картинка. Банери тепер заводить адмін, і
 * файли приходять різної форми: за height:auto слайдер міняв би висоту
 * на кожному гортанні, а сторінка смикалась би під ним.
 *
 * Значення — формат, у якому намальовані банери для комп'ютера (3:1).
 * Нижче, на вужчих екранах, воно змінюється разом із макетом.
 */
.ts-hero__track {
	aspect-ratio: 3 / 1;
}

/*
 * Між слайдом і картинкою стоїть <picture> — це він отримує розміри
 * від слайда, а вже від нього відштовхується <img>. Без явної висоти
 * на обох height:100% на картинці нема від чого рахувати.
 */
.ts-hero__slide,
.ts-hero__slide picture {
	display: block;
	width: 100%;
	height: 100%;
}

.ts-hero__img {
	display: block;
	width: 100%;
	height: 100%;
	/*
	 * Картинку, що не збіглася з форматом смуги, вписуємо по центру:
	 * обрізати край банера краще, ніж розтягнути його.
	 */
	object-fit: cover;
	object-position: center;
}

/*
 * Межі ті самі, що і в <picture> плагіна (599 і 767). Розійдуться —
 * прийде вертикальний макет у широку смугу й обріжеться з боків.
 */
/*
 * 3:4, а не 4:3: банери для планшета намальовані вертикальними
 * (1024×1365). У горизонтальній смузі вони обрізалися зверху й знизу
 * — з макета зникали логотип і сам заголовок, лишалася середина.
 */
/*
 * 3:4, а не 4:3: банери для планшета намальовані вертикальними
 * (1024×1365). У горизонтальній смузі вони обрізалися зверху й знизу
 * — з макета зникали логотип і заголовок, лишалася сама середина.
 *
 * Стелю висоти не ставимо. Пробував обмежити (68vh) — банер знову
 * обрізався згори, бо object-fit: cover бере надлишок із країв. Або
 * весь банер, або обрізаний заголовок; читабельність важливіша, а
 * планшет гортають вертикально й так.
 */
/*
 * Лише до 767px (див. Slider_Renderer::MEDIA): на планшеті 768–1023
 * вертикальний банер займав увесь екран — там смуга 3:1, як на
 * комп'ютері.
 */
@media (max-width: 767px) {
	.ts-hero__track {
		aspect-ratio: 3 / 4;
	}
}

@media (max-width: 599px) {
	.ts-hero__track {
		aspect-ratio: 9 / 16;
	}
}

.ts-hero__arrow {
	position: absolute;
	top: 50%;
	transform: translateY(-50%);
	display: none;
	place-items: center;
	width: 40px;
	height: 40px;
	padding: 0;
	border: 0;
	border-radius: var(--ts-radius-full);
	/* Напівпрозорий білий: банери світлі, темна кнопка на них кричить. */
	background: rgba(255, 255, 255, 0.82);
	box-shadow: var(--ts-shadow-sm);
	color: var(--ts-color-text-strong);
	cursor: pointer;
	transition: background-color var(--ts-duration-fast) var(--ts-ease);
}

.ts-hero__arrow:hover {
	background: #fff;
}

/*
 * Стрілки показуємо й на телефоні. Свайп нікуди не подівся, але
 * без жодної видимої кнопки банер читається як звичайна картинка —
 * людина просто не здогадується, що слайдів кілька.
 *
 * На вузькому екрані вони стоять унизу, в один ряд із крапками:
 * банер там вертикальний, і кнопка посеред висоти лягала просто на
 * заголовок та підписи.
 */
.ts-hero__arrow {
	display: grid;
	top: auto;
	bottom: var(--ts-space-4);
	transform: none;
	width: 34px;
	height: 34px;
}

@media (min-width: 700px) {
	.ts-hero__arrow {
		top: 50%;
		bottom: auto;
		transform: translateY(-50%);
		width: 40px;
		height: 40px;
	}
}

.ts-hero__arrow--prev {
	left: var(--ts-space-4);
}

.ts-hero__arrow--prev .ts-icon {
	transform: rotate(180deg);
}

.ts-hero__arrow--next {
	right: var(--ts-space-4);
}

/*
 * Крапки лежать на світлій підкладці: банери бувають із темним низом
 * (зарядні станції — вечірнє місто), і напівпрозорі темні крапки на
 * ньому просто зникали.
 */
.ts-hero__dots {
	position: absolute;
	left: 50%;
	bottom: var(--ts-space-4);
	transform: translateX(-50%);
	display: flex;
	align-items: center;
	gap: var(--ts-space-2);
	padding: 6px 10px;
	border-radius: var(--ts-radius-full);
	background: rgba(255, 255, 255, 0.72);
	backdrop-filter: blur(6px);
}

.ts-hero__dot {
	width: 8px;
	height: 8px;
	padding: 0;
	border: 0;
	/* Ціль для пальця більша за саму крапку — але без зайвого місця. */
	outline-offset: 6px;
	border-radius: var(--ts-radius-full);
	background: rgba(4, 22, 42, 0.25);
	cursor: pointer;
	transition: width var(--ts-duration-fast) var(--ts-ease),
		background-color var(--ts-duration-fast) var(--ts-ease);
}

.ts-hero__dot.is-active {
	width: 22px;
	background: var(--ts-color-primary);
}

/* --- Плитки розділів ----------------------------------------------------- */

/*
 * Дев'ять плиток (вісім розділів + «Всі категорії») в один ряд на
 * широкому екрані. auto-fit розкладав їх на десять колонок і лишав
 * порожню клітинку в кінці.
 */
.ts-cats {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(118px, 1fr));
	gap: var(--ts-space-3);
	margin: 0;
	padding: 0;
	list-style: none;
}

.ts-cat {
	display: grid;
	/* stretch, не center: при center дочірні елементи не обмежені
	   шириною плитки й фото вилазило на сусідні. */
	justify-items: stretch;
	gap: var(--ts-space-2);
	height: 100%;
	padding: var(--ts-space-4) var(--ts-space-2);
	text-align: center;
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
	transition: border-color var(--ts-duration-fast) var(--ts-ease),
		box-shadow var(--ts-duration-fast) var(--ts-ease);
}

.ts-cat:hover {
	border-color: var(--ts-color-primary);
	box-shadow: var(--ts-shadow-sm);
	text-decoration: none;
}

/*
 * place-items: center робить елемент auto-розміру, і img з height: 100%
 * не має від чого рахувати — фото лишалось 245px і вилазило з плитки.
 * Тому flex із центруванням: тут дитина обмежена висотою контейнера.
 */
.ts-cat__media {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 100%;
	min-width: 0;
	height: 72px;
}

/*
 * Жорсткі розміри, а не max-*: у grid із place-items: center елемент
 * може вилізти за доріжку, і фото 245px розповзалось на сусідні
 * плитки поверх тексту.
 */
.ts-cat__media img {
	max-width: 100%;
	max-height: 100%;
	width: auto;
	height: auto;
	object-fit: contain;
}

/* Заглушка замість фото категорії — поки картинок немає. */
.ts-cat__placeholder {
	display: grid;
	place-items: center;
	/* Квадрат, а не на всю плитку: розтягнутий сірий блок виглядав
	   би як зламана картинка. */
	width: 56px;
	height: 56px;
	margin-inline: auto;
	color: var(--ts-color-faint);
	background: var(--ts-color-surface-sunken);
	border-radius: var(--ts-radius-md);
}

/*
 * Плитка «Всі категорії» більша за решту заглушок: у макеті це
 * самостійний елемент із власною вагою, а не тимчасова затичка.
 */
.ts-cat__placeholder--accent {
	width: 64px;
	height: 64px;
	color: var(--ts-color-primary);
	background: var(--ts-color-primary-soft);
	border-radius: var(--ts-radius-lg);
}

.ts-cat__name {
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-semibold);
	line-height: 1.3;
	color: var(--ts-color-text-strong);
}

.ts-cat--all .ts-cat__name {
	color: var(--ts-color-primary);
	font-weight: var(--ts-weight-medium);
}

/* --- Вкладки товарів ----------------------------------------------------- */

.ts-tabs--pill {
	display: flex;
	flex-wrap: wrap;
	gap: var(--ts-space-1);
	border: 0;
}

/*
 * Вкладки жирні, як у макеті: вони конкурують із заголовком секції,
 * тож тонкий сірий текст поруч із ним просто губився.
 */
.ts-tabs--pill .ts-tabs__item {
	padding: var(--ts-space-2) var(--ts-space-3);
	border: 0;
	border-radius: 0;
	background: transparent;
	font-size: var(--ts-text-md);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-muted);
	cursor: pointer;
}

.ts-tabs--pill .ts-tabs__item:hover {
	color: var(--ts-color-text-strong);
}

/* Активна — синя з підкресленням, а не плашкою: у макеті саме так. */
.ts-tabs--pill .ts-tabs__item.is-active {
	color: var(--ts-color-primary);
	background: transparent;
	box-shadow: inset 0 -2px 0 var(--ts-color-primary);
}

/* --- Промо-смуга --------------------------------------------------------- */

.ts-promos {
	display: grid;
	grid-template-columns: minmax(0, 1fr);
	gap: var(--ts-space-3);
}

@media (min-width: 640px) {
	.ts-promos {
		grid-template-columns: repeat(2, minmax(0, 1fr));
	}
}

@media (min-width: 1100px) {
	/* Банери ширші за текстові блоки — як у макеті. */
	.ts-promos {
		grid-template-columns: 1.3fr 1fr 1fr 1.3fr;
	}
}

.ts-promo {
	position: relative;
	display: grid;
	align-content: center;
	gap: var(--ts-space-1);
	min-height: 124px;
	padding: var(--ts-space-5);
	border-radius: var(--ts-radius-lg);
	overflow: hidden;
}

.ts-promo--info {
	grid-template-columns: auto minmax(0, 1fr);
	grid-template-areas:
		"icon title"
		"icon text";
	gap: var(--ts-space-1) var(--ts-space-4);
	background: var(--ts-color-primary-soft);
}

.ts-promo--info .ts-promo__icon {
	grid-area: icon;
	align-self: center;
	color: var(--ts-color-primary);
}

.ts-promo--info .ts-promo__title {
	grid-area: title;
	align-self: end;
}

.ts-promo--info .ts-promo__text {
	grid-area: text;
	align-self: start;
}

.ts-promo--banner {
	background: linear-gradient(120deg, #0b1f3a 0%, #17406f 100%);
	color: #fff;
}

/*
 * Банер-картинка: заголовок, підпис і кнопка намальовані всередині
 * макета, тож блок не має ні падінгу, ні власного тла — лише
 * зображення на всю плитку.
 */
.ts-promo--image {
	padding: 0;
	background: var(--ts-color-surface-sunken);
}

.ts-promo--image:hover {
	text-decoration: none;
}

/*
 * Картинку банера плагін віддає в <picture>, і той стає проміжним
 * блоком між плиткою і <img>. Без явної розтяжки height: 100% у
 * зображення міряється від нього, а не від плитки — банер схлопується
 * до висоти рядка.
 */
.ts-promo--image picture {
	display: block;
	width: 100%;
	height: 100%;
}

.ts-promo__img {
	display: block;
	width: 100%;
	height: 100%;
	/*
	 * cover, бо плитка в ряду підлаштовується під сусідів і її
	 * пропорції не збігаються з банером. Обрізати край краще, ніж
	 * розтягнути макет.
	 */
	object-fit: cover;
	object-position: center;
}

.ts-promo--dark {
	background: linear-gradient(120deg, #1a1030 0%, #3b1d63 100%);
}

.ts-promo--banner:hover {
	text-decoration: none;
}

.ts-promo__media {
	position: absolute;
	inset: 0 0 0 auto;
	display: none;
	place-items: center;
	width: 44%;
	pointer-events: none;
}

@media (min-width: 900px) {
	.ts-promo__media {
		display: grid;
	}
}

.ts-promo__media .ts-hero__placeholder {
	width: min(150px, 84%);
	font-size: var(--ts-text-xs);
}

.ts-promo__body {
	position: relative;
	z-index: 1;
	display: grid;
	gap: var(--ts-space-1);
	max-width: 62%;
}

@media (max-width: 899px) {
	.ts-promo__body {
		max-width: none;
	}
}

.ts-promo__title {
	font-size: var(--ts-text-md);
	font-weight: var(--ts-weight-bold);
	line-height: 1.3;
	color: inherit;
}

.ts-promo--info .ts-promo__title {
	color: var(--ts-color-text-strong);
}

.ts-promo__text {
	font-size: var(--ts-text-sm);
	line-height: 1.4;
	color: rgba(255, 255, 255, 0.78);
}

.ts-promo--info .ts-promo__text {
	color: var(--ts-color-muted);
}

.ts-promo__cta {
	display: inline-flex;
	align-items: center;
	gap: var(--ts-space-1);
	justify-self: start;
	margin-top: var(--ts-space-3);
	padding: var(--ts-space-2) var(--ts-space-4);
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-medium);
	color: var(--ts-color-text-strong);
	background: #fff;
	border-radius: var(--ts-radius-md);
}

/* --- Бренди -------------------------------------------------------------- */

/*
 * Стрічка з горизонтальним скролом: дванадцять лого в сітці на
 * вузькому екрані дають чотири ряди й з'їдають пів-екрана.
 */
.ts-brands {
	display: flex;
	gap: var(--ts-space-3);
	margin: 0;
	padding: 0 0 var(--ts-space-2);
	list-style: none;
	overflow-x: auto;
	scroll-snap-type: x proximity;
	scrollbar-width: thin;
}

.ts-brands > li {
	flex: 0 0 auto;
	scroll-snap-align: start;
}

.ts-brand {
	display: grid;
	place-items: center;
	width: 132px;
	height: 72px;
	padding: var(--ts-space-3);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
	transition: border-color var(--ts-duration-fast) var(--ts-ease);
}

.ts-brand:hover {
	border-color: var(--ts-color-primary);
	text-decoration: none;
}

.ts-brand__logo {
	max-width: 100%;
	max-height: 30px;
	width: auto;
	object-fit: contain;
	opacity: 0.78;
	transition: opacity var(--ts-duration-fast) var(--ts-ease);
}

.ts-brand:hover .ts-brand__logo {
	opacity: 1;
}

/* --- Блог і бізнес ------------------------------------------------------- */

.ts-home__split {
	display: grid;
	grid-template-columns: minmax(0, 1fr);
	gap: var(--ts-space-6);
}

@media (min-width: 1000px) {
	.ts-home__split {
		grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
		gap: var(--ts-space-6);
	}

	/*
	 * Банер вирівнюємо за низом карток: заголовок «Блог та корисні
	 * статті» займає рядок ліворуч, і без цього права колонка
	 * висить вище, ніж ряд статей.
	 */
	.ts-home__split .ts-business {
		align-self: end;
	}
}

/*
 * Статті стоять рядом картками з обкладинкою згори — так само, як
 * товари вище на сторінці. Раніше це був список із мініатюрою 88×66
 * збоку: на макеті головної блог виглядає саме картками, і поруч
 * із рядом товарів список читався як чужий елемент.
 */
.ts-home__posts {
	display: grid;
	grid-template-columns: repeat(3, minmax(0, 1fr));
	gap: var(--ts-space-3);
	margin: 0;
	padding: 0;
	list-style: none;
}

.ts-home__post {
	display: flex;
	flex-direction: column;
	overflow: hidden;
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
	transition: border-color 0.15s ease, box-shadow 0.15s ease;
}

.ts-home__post:hover {
	border-color: var(--ts-color-border-strong);
	box-shadow: var(--ts-shadow-sm);
}

.ts-home__post-media {
	display: block;
	aspect-ratio: 16 / 9;
	overflow: hidden;
	background: var(--ts-color-surface-sunken);
}

.ts-home__post-media img {
	width: 100%;
	height: 100%;
	object-fit: cover;
}

/*
 * Заглушка, поки в статей немає обкладинок.
 *
 * Тримає ту саму пропорцію, що й картинка, але робиться нижчою:
 * порожній прямокутник 16:9 з дрібною іконкою з'їдав половину
 * картки й читався як поламане зображення. Коли мініатюри
 * з'являться, картка сама набуде повної висоти.
 */
.ts-home__post-media:has(.ts-home__post-fallback) {
	aspect-ratio: auto;
	height: 72px;
}

.ts-home__post-fallback {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 100%;
	height: 100%;
	color: var(--ts-color-primary);
	background: linear-gradient(140deg, #eef3fb 0%, #dce8f8 100%);
	opacity: 0.75;
}

.ts-home__post-body {
	display: grid;
	align-content: start;
	gap: var(--ts-space-1);
	min-width: 0;
	padding: var(--ts-space-3);
}

.ts-home__post-title {
	font-size: var(--ts-text-base);
	font-weight: var(--ts-weight-medium);
	line-height: 1.35;
	color: var(--ts-color-text-strong);
}

.ts-home__post-title:hover {
	color: var(--ts-color-primary);
	text-decoration: none;
}

.ts-home__post-text {
	margin: 0;
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
	line-height: 1.4;
}

.ts-home__post-date {
	font-size: var(--ts-text-xs);
	color: var(--ts-color-faint);
}

/*
 * Банер намальований цілком — із заголовком, переліком переваг і
 * кнопкою. Тому блок не має власних відступів і фону: будь-яка
 * підкладка тут утворила б рамку навколо картинки.
 */
.ts-business {
	display: flex;
	overflow: hidden;
	border-radius: var(--ts-radius-lg);
}

.ts-business__link {
	display: block;
	width: 100%;
	line-height: 0;
	transition: box-shadow 0.15s ease;
}

.ts-business__link:hover {
	box-shadow: var(--ts-shadow-md);
}

.ts-business__img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
}

@media (max-width: 999px) {
	.ts-home__posts {
		grid-template-columns: repeat(2, minmax(0, 1fr));
	}
}

/*
 * Телефон: одна колонка. Картки з обкладинкою 16:9 одна під одною
 * читаються краще, ніж дві вузькі з нечитабельним заголовком.
 */
@media (max-width: 639px) {
	.ts-home__posts {
		grid-template-columns: minmax(0, 1fr);
	}
}

/* --- Про магазин --------------------------------------------------------- */

.ts-about {
	max-width: 76ch;
}

.ts-about__title {
	margin-bottom: var(--ts-space-3);
	font-size: var(--ts-text-xl);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

.ts-about__text {
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
}

/*
 * На телефоні картка вужча (158px), і 60px іконки лишали назві замало
 * місця — "Оперативна пам'ять" налізала на край. Зменшуємо іконку
 * і дозволяємо назві переноситись.
 */
@media (max-width: 559px) {
	.ts-catcard {
		gap: var(--ts-space-2);
		padding: var(--ts-space-3);
	}

	.ts-catcard__media {
		width: 40px;
		height: 40px;
	}

	.ts-catcard__name {
		font-size: var(--ts-text-sm);
	}
}

/* --- Сітка товарів на головній ------------------------------------------- */

/*
 * Шість колонок на широкому екрані, як у макеті: ряд із шести карток
 * показує добірку цілком, без потреби гортати.
 *
 * [hidden] перебиваємо явно: базовий .ts-grid ставить display: grid,
 * а він сильніший за типовий display: none у браузера, тож прихована
 * вкладка інакше лишалась видимою.
 */
.ts-grid--home[hidden] {
	display: none;
}

/*
 * Телефон — стрічка, що гортається вбік, як вітрини нижче (.ts-showcase):
 * дванадцять карток стовпчиком давали 3 200px прокрутки, і до решти
 * головної ніхто не догортав. Дві колонки не підходять: картка 164px,
 * фото нечитабельне (див. коментар до .ts-grid--catalog).
 */
.ts-grid--home {
	--ts-grid-cols: 1;
}

@media (max-width: 559px) {
	.ts-grid--home:not([hidden]) {
		display: flex;
		gap: var(--ts-space-3);
		overflow-x: auto;
		overscroll-behavior-x: contain;
		scroll-snap-type: x mandatory;
		scrollbar-width: none;
		/* До країв екрана, перша картка — по сітці контейнера. */
		margin-inline: calc(-1 * var(--ts-container-pad, 16px));
		padding: 2px var(--ts-container-pad, 16px);
		scroll-padding-inline: var(--ts-container-pad, 16px);
	}

	.ts-grid--home::-webkit-scrollbar {
		display: none;
	}

	.ts-grid--home > .ts-card {
		flex: 0 0 72%;
		min-width: 0;
		scroll-snap-align: start;
	}
}

@media (min-width: 560px) {
	.ts-grid--home {
		--ts-grid-cols: 2;
	}
}

@media (min-width: 900px) {
	.ts-grid--home {
		--ts-grid-cols: 4;
	}
}

@media (min-width: 1200px) {
	.ts-grid--home {
		--ts-grid-cols: 6;
	}
}

/* --- Банер із зображенням ------------------------------------------------ */

@media (min-width: 1200px) {
	.ts-cats {
		grid-template-columns: repeat(9, minmax(0, 1fr));
	}
}

/* --- Картка на головній -------------------------------------------------- */

/*
 * Характеристики тут зайві: на головній людина ще не порівнює моделі,
 * а шість рядків дрібного тексту роблять ряд карток важким. У каталозі
 * вони лишаються — там саме порівнюють.
 */
.ts-grid--home .ts-card__specs {
	display: none;
}

/* Без характеристик наявність притискається до назви — даємо їй місце. */
/*
 * Код товару тут стоїть у тому самому рядку, що й бренд, але бренд
 * на головній прихований (див. нижче) — тож рядок лишається сам,
 * і власний відступ згори йому не потрібен.
 */
.ts-grid--home .ts-card__sku {
	margin-top: 0;
}

/*
 * Бренд окремим рядком тут не потрібен: він і так стоїть першим
 * словом у назві («Жорсткий диск ... Seagate»), тож рядок лише
 * додає висоти. У каталозі лишається — там за ним сканують список.
 */
.ts-grid--home .ts-card__brand {
	display: none;
}

/*
 * .ts-tabs — спільний клас із вкладками на сторінці товару, а там
 * у нього рамка знизу й відступ 24px. Для вкладок на головній це
 * зайве: вони стоять в одному рядку із заголовком секції.
 */
.ts-tabs--pill {
	margin-bottom: 0;
	border-bottom: 0;
	gap: var(--ts-space-1);
}

/*
 * Кнопка «Детальніше» на вітрині — сама стрілка без підпису.
 *
 * Слово в картці на 230px виштовхувало ціну за край. Підпис лишився
 * в розмітці для екранних дикторів, а кнопку стискаємо до квадрата,
 * щоб вона не розтягувалась під ширину, якої більше не потребує.
 */
.ts-grid--home .ts-card__action.ts-btn--secondary {
	flex: 0 0 auto;
	width: 40px;
	min-width: 40px;
	padding-inline: 0;
}

/*
 * На вітрині рядки картки йдуть без проміжку: там немає переліку
 * характеристик, і 8px між кожним рядком розганяли короткий вміст
 * на всю висоту картки.
 */
.ts-grid--home .ts-card__body {
	gap: 0;
}

/* --- Вітрини категорій (банер + стрічка) ---------------------------------- */

/*
 * Банер 3:4 з одного боку, стрічка карток — з іншого. Висоту ряду
 * задає картка, банер тягнеться під неї (object-fit: contain, щоб не
 * різати намальований на ньому текст і кнопку).
 *
 * На телефоні .ts-showcase__rail розчиняється (display: contents), і
 * банер разом із картками стає однією стрічкою, що гортається пальцем.
 */
.ts-showcase {
	--ts-showcase-gap: var(--ts-space-4);
	--ts-showcase-banner: 320px;
}

.ts-showcase__nav {
	order: 3;
	display: inline-flex;
	gap: var(--ts-space-2);
	align-self: center;
}

.ts-showcase__arrow {
	display: grid;
	place-items: center;
	width: 40px;
	height: 40px;
	padding: 0;
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-full);
	background: var(--ts-color-surface);
	color: var(--ts-color-text-strong);
	cursor: pointer;
	transition: border-color var(--ts-duration-fast) var(--ts-ease),
		color var(--ts-duration-fast) var(--ts-ease);
}

.ts-showcase__arrow:hover:not(:disabled) {
	border-color: var(--ts-color-primary);
	color: var(--ts-color-primary);
}

.ts-showcase__arrow:disabled {
	opacity: 0.4;
	cursor: default;
}

/* Одна іконка «chevron» на дві кнопки — ліву розвертаємо. */
.ts-showcase__arrow[data-ts-showcase-prev] .ts-icon {
	transform: rotate(180deg);
}

.ts-showcase__body {
	display: grid;
	grid-template-columns: var(--ts-showcase-banner) minmax(0, 1fr);
	gap: var(--ts-showcase-gap);
	align-items: stretch;
}

.ts-showcase--right .ts-showcase__body {
	grid-template-columns: minmax(0, 1fr) var(--ts-showcase-banner);
}

.ts-showcase--right .ts-showcase__banner {
	order: 2;
}

.ts-showcase__banner {
	position: relative;
	display: block;
	/*
	 * Завжди 3:4 — як намальовано. Вищі картки банер центрують, нижчі
	 * тягнуться під нього (рядок сітки бере більшу з висот).
	 */
	aspect-ratio: 3 / 4;
	align-self: center;
	overflow: hidden;
	border-radius: var(--ts-radius-lg);
	background: var(--ts-color-surface-sunken);
	transition: box-shadow var(--ts-duration-base) var(--ts-ease);
}

.ts-showcase__banner:hover {
	box-shadow: var(--ts-shadow-md);
}

.ts-showcase__img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
	transition: transform var(--ts-duration-slow) var(--ts-ease);
}

.ts-showcase__banner:hover .ts-showcase__img {
	transform: scale(1.03);
}

.ts-showcase__rail {
	display: flex;
	gap: var(--ts-showcase-gap);
	min-width: 0;
	overflow-x: auto;
	overscroll-behavior-x: contain;
	scroll-snap-type: x mandatory;
	scroll-behavior: smooth;
	scrollbar-width: none;
	/* Тінь картки при наведенні не обрізаємо по краях. */
	padding: 2px;
	margin: -2px;
}

.ts-showcase__rail::-webkit-scrollbar {
	display: none;
}

/* Чотири картки на ряд. */
.ts-showcase__item {
	display: flex;
	flex: 0 0 calc((100% - 3 * var(--ts-showcase-gap)) / 4);
	min-width: 0;
	scroll-snap-align: start;
}

.ts-showcase__item > .ts-card {
	width: 100%;
}

/* Картка тут така сама, як у «Популярних товарах» (.ts-grid--home). */
.ts-showcase .ts-card__specs,
.ts-showcase .ts-card__brand {
	display: none;
}

.ts-showcase .ts-card__sku {
	margin-top: 0;
}

.ts-showcase .ts-card__body {
	gap: 0;
}

.ts-showcase .ts-card__action.ts-btn--secondary {
	flex: 0 0 auto;
	width: 40px;
	min-width: 40px;
	padding-inline: 0;
}

@media (max-width: 1199px) {
	.ts-showcase {
		--ts-showcase-banner: 260px;
	}

	/* Три картки й край четвертої — видно, що стрічка гортається. */
	.ts-showcase__item {
		flex-basis: calc((100% - 2 * var(--ts-showcase-gap)) / 2.6);
	}
}

@media (max-width: 1023px) {
	.ts-showcase {
		--ts-showcase-banner: 220px;
		--ts-showcase-gap: var(--ts-space-3);
	}

	.ts-showcase__item {
		flex-basis: calc((100% - var(--ts-showcase-gap)) / 1.6);
	}
}

/*
 * Телефон: одна стрічка — банер першим, далі картки. Банер завжди
 * перший, навіть якщо на комп'ютері він праворуч: так його видно
 * одразу, а не після дванадцяти товарів.
 */
@media (max-width: 767px) {
	.ts-showcase__nav {
		display: none;
	}

	.ts-showcase__body,
	.ts-showcase--right .ts-showcase__body {
		display: flex;
		gap: var(--ts-showcase-gap);
		overflow-x: auto;
		overscroll-behavior-x: contain;
		scroll-snap-type: x mandatory;
		/* Без scroll-behavior: стрілок тут немає, а свайпу плавність лише заважає. */
		scrollbar-width: none;
		/* Стрічка до країв екрана, перша картка — по сітці контейнера. */
		margin-inline: calc(-1 * var(--ts-container-pad, 16px));
		padding: 2px var(--ts-container-pad, 16px);
		scroll-padding-inline: var(--ts-container-pad, 16px);
	}

	.ts-showcase__body::-webkit-scrollbar {
		display: none;
	}

	.ts-showcase__rail {
		display: contents;
	}

	.ts-showcase__banner,
	.ts-showcase--right .ts-showcase__banner {
		order: 0;
		flex: 0 0 72%;
		aspect-ratio: 3 / 4;
		align-self: center;
		scroll-snap-align: start;
	}

	.ts-showcase__item {
		flex-basis: 72%;
	}
}

@media (prefers-reduced-motion: reduce) {
	.ts-showcase__rail,
	.ts-showcase__body {
		scroll-behavior: auto;
	}

	.ts-showcase__img {
		transition: none;
	}
}

/* ==========================================================================
   TopShop — Кошик і оформлення (ТЗ §30, §31)
   ========================================================================== */

/* --- Сторінка -------------------------------------------------------------- */

.ts-page__title {
	margin-bottom: var(--ts-space-6);
}

/* --- Розкладка кошика ------------------------------------------------------ */

.ts-cart {
	display: grid;
	grid-template-columns: minmax(0, 1fr);
	gap: var(--ts-space-6);
	align-items: start;
	margin-bottom: var(--ts-space-12);
}

@media (min-width: 1024px) {
	.ts-cart {
		grid-template-columns: minmax(0, 1fr) 340px;
		gap: var(--ts-space-8);
	}

	/* Форма і підсумки — сусідні колонки */
	.ts-cart__form {
		grid-column: 1;
		grid-row: 1 / span 2;
	}

	.ts-cart__totals {
		grid-column: 2;
		grid-row: 1;
		position: sticky;
		top: calc(var(--ts-header-height) + var(--ts-space-4));
	}
}

/* --- Позиція кошика -------------------------------------------------------- */

.ts-cart__items {
	display: flex;
	flex-direction: column;
	gap: var(--ts-space-3);
	margin-bottom: var(--ts-space-5);
}

/*
 * На телефоні колонка кількості — auto, щоб лічильник (122px) помістився
 * повністю: у minmax(0, 1fr) він виходив за межі своєї комірки.
 */
.ts-cartitem {
	display: grid;
	grid-template-columns: 88px auto minmax(0, 1fr) 44px;
	grid-template-areas:
		"media body  body  remove"
		"media qty   price price";
	gap: var(--ts-space-3);
	align-items: start;
	padding: var(--ts-space-4);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
}

@media (min-width: 768px) {
	/*
	 * Колонка кількості — auto, а не фіксовані 140px: лічильник займає
	 * рівно 121px, і зайві пікселі перетворювались на порожнечу
	 * праворуч від "+".
	 */
	.ts-cartitem {
		grid-template-columns: 96px minmax(0, 1fr) auto 160px 44px;
		grid-template-areas: "media body qty price remove";
		align-items: center;
		gap: var(--ts-space-4);
	}
}

/*
 * На 320px фото, лічильник і хрестик разом ширші за картку. Лічильник
 * лягає під фото, ціна лишається поруч із ним.
 */
@media (max-width: 359px) {
	.ts-cartitem {
		grid-template-columns: 72px auto minmax(0, 1fr) 44px;
		grid-template-areas:
			"media body body remove"
			"qty   qty  price price";
	}
}

/* Недоступна позиція має впадати в око, а не ховатись */
.ts-cartitem.is-unavailable {
	border-color: var(--ts-color-danger);
	background: var(--ts-color-danger-soft);
}

.ts-cartitem__media {
	grid-area: media;
	aspect-ratio: 1 / 1;
	overflow: hidden;
	border-radius: var(--ts-radius-md);
}

.ts-cartitem__media img {
	width: 100%;
	height: 100%;
	object-fit: contain;
	mix-blend-mode: multiply;
}

.ts-cartitem__body {
	grid-area: body;
	min-width: 0;
}

.ts-cartitem__title {
	font-size: var(--ts-text-base);
	font-weight: var(--ts-weight-medium);
	line-height: var(--ts-leading-snug);
	color: var(--ts-color-text-strong);
	margin-bottom: var(--ts-space-1);
}

.ts-cartitem__title a {
	color: inherit;
}

.ts-cartitem__title a:hover {
	color: var(--ts-color-primary);
	text-decoration: none;
}

.ts-cartitem__codes {
	display: flex;
	flex-wrap: wrap;
	gap: var(--ts-space-3);
	margin-bottom: var(--ts-space-2);
	font-size: var(--ts-text-2xs);
	color: var(--ts-color-faint);
}

.ts-cartitem__stock {
	font-size: var(--ts-text-xs);
}

.ts-cartitem__qty {
	grid-area: qty;
}

/*
 * Лічильник у кошику компактніший за той, що на сторінці товару:
 * там він стоїть поруч із великою кнопкою, тут — у рядку таблиці.
 */
.ts-cartitem__qty .ts-qty__btn {
	width: 36px;
	height: 44px;
	font-size: var(--ts-text-base);
}

.ts-cartitem__qty .ts-qty__input {
	width: 48px;
	height: 44px;
	font-size: var(--ts-text-sm);
}

/* Поки оновлюємо кількість — приглушуємо рядок і блокуємо повторні кліки */
.ts-cartitem.is-busy {
	opacity: 0.55;
	pointer-events: none;
	transition: opacity var(--ts-duration-fast) var(--ts-ease);
}

.ts-cartitem__price {
	grid-area: price;
	text-align: right;
	font-size: var(--ts-text-lg);
	font-weight: var(--ts-weight-bold);
	color: var(--ts-color-text-strong);
	white-space: nowrap;
}

.ts-cartitem__unit {
	font-size: var(--ts-text-2xs);
	font-weight: var(--ts-weight-regular);
	color: var(--ts-color-faint);
}

.ts-cartitem__remove {
	grid-area: remove;
	justify-self: end;
}

.ts-cartitem__remove-btn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 44px;
	height: 44px;
	border-radius: var(--ts-radius-md);
	color: var(--ts-color-faint);
}

.ts-cartitem__remove-btn:hover {
	background: var(--ts-color-danger-soft);
	color: var(--ts-color-danger);
	text-decoration: none;
}

/* --- Продовжена гарантія в кошику ------------------------------------------- */

/* Рядок гарантії — послуга при товарі: тихіший і з відступом під ним. */
.ts-cartitem--warranty {
	margin-top: calc(-1 * var(--ts-space-2));
	padding-block: var(--ts-space-3);
	background: var(--ts-color-surface-tint);
	border-style: dashed;
}

.ts-cartitem--warranty .ts-cartitem__title {
	font-size: var(--ts-text-sm);
}

.ts-cartitem--warranty .ts-cartitem__price {
	font-size: var(--ts-text-base);
}

.ts-cartitem__service-icon {
	display: grid;
	place-items: center;
	width: 100%;
	height: 100%;
	color: var(--ts-color-primary);
}

.ts-cartitem--warranty .ts-cartitem__media {
	aspect-ratio: auto;
	height: 44px;
}

.ts-cartitem__fixed-qty {
	display: inline-flex;
	align-items: center;
	min-height: 44px;
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
}

.ts-cartitem__warranty {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: var(--ts-space-2);
	margin-top: var(--ts-space-2);
	font-size: var(--ts-text-xs);
	color: var(--ts-color-muted);
}

.ts-cartitem__warranty-opt {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	min-height: 36px;
	padding: 0 var(--ts-space-3);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border-strong);
	border-radius: var(--ts-radius-full);
	font: inherit;
	font-weight: var(--ts-weight-medium);
	color: var(--ts-color-text);
	cursor: pointer;
}

.ts-cartitem__warranty-opt:hover {
	border-color: var(--ts-color-primary);
	color: var(--ts-color-primary);
}

.ts-cartitem__warranty-opt[aria-pressed="true"] {
	background: var(--ts-color-primary-soft);
	border-color: var(--ts-color-primary);
	color: var(--ts-color-primary);
}

.ts-cartitem__warranty-price {
	font-weight: var(--ts-weight-semibold);
}

@media (pointer: coarse) {
	.ts-cartitem__warranty-opt {
		min-height: 44px;
	}
}

/* --- Дії кошика ------------------------------------------------------------ */

.ts-cart__actions {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: var(--ts-space-3);
}

.ts-coupon {
	display: flex;
	gap: var(--ts-space-2);
	flex: 1 1 280px;
}

.ts-coupon__input {
	flex: 1 1 auto;
	min-width: 0;
}

.ts-cart__update {
	margin-left: auto;
}

/* --- Підсумки -------------------------------------------------------------- */

.ts-totals {
	padding: var(--ts-space-5);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
	box-shadow: var(--ts-shadow-sm);
}

.ts-totals__title {
	margin-bottom: var(--ts-space-4);
	font-size: var(--ts-text-lg);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

.ts-totals__row {
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	gap: var(--ts-space-3);
	padding-block: var(--ts-space-2);
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
}

.ts-totals__row--muted {
	color: var(--ts-color-faint);
	font-size: var(--ts-text-xs);
}

.ts-totals__row--discount {
	color: var(--ts-color-success);
}

.ts-totals__row--total {
	margin-top: var(--ts-space-3);
	padding-top: var(--ts-space-4);
	border-top: 1px solid var(--ts-color-border);
	font-size: var(--ts-text-md);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

.ts-totals__row--total .woocommerce-Price-amount {
	font-size: var(--ts-text-2xl);
	font-weight: var(--ts-weight-bold);
}

.ts-totals__actions {
	margin-top: var(--ts-space-5);
}

.ts-totals__hint {
	margin-top: var(--ts-space-2);
	font-size: var(--ts-text-xs);
	color: var(--ts-color-danger);
	text-align: center;
}

.ts-totals__continue {
	display: block;
	margin-top: var(--ts-space-3);
	font-size: var(--ts-text-sm);
	text-align: center;
	color: var(--ts-color-muted);
}

.ts-totals__continue:hover {
	color: var(--ts-color-primary);
}

/* --- Повідомлення ---------------------------------------------------------- */

.ts-notice {
	margin-bottom: var(--ts-space-5);
	padding: var(--ts-space-4);
	border-radius: var(--ts-radius-md);
	font-size: var(--ts-text-sm);
	line-height: var(--ts-leading-relaxed);
}

.ts-notice--danger {
	background: var(--ts-color-danger-soft);
	color: var(--ts-color-text);
	border: 1px solid var(--ts-color-danger);
}

.ts-cart__alert {
	margin-bottom: var(--ts-space-5);
}

.ts-notice__title {
	margin-bottom: var(--ts-space-1);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-danger);
}

/* --- Checkout --------------------------------------------------------------
   Розмітку тут задає шаблон WooCommerce (form.checkout > .col2-set +
   #order_review), тому чіпляємось до його класів, а не до власних.
   ------------------------------------------------------------------------ */

.woocommerce-checkout .woocommerce {
	margin-bottom: var(--ts-space-12);
}

form.checkout {
	display: grid;
	grid-template-columns: 1fr;
	gap: var(--ts-space-6);
	align-items: start;
}

/*
 * Помилки сабміту WooCommerce вставляє першим дочірнім вузлом форми —
 * без цього вони займали ліву колонку, а вся форма з'їжджала у праву.
 */
form.checkout > .woocommerce-NoticeGroup {
	grid-column: 1 / -1;
}

@media (min-width: 1024px) {
	form.checkout {
		grid-template-columns: minmax(0, 1fr) 380px;
		gap: var(--ts-space-8);
	}

	.ts-checkout__aside {
		position: sticky;
		top: calc(var(--ts-header-height) + var(--ts-space-4));
	}
}

/* --- Ліва колонка: картки -------------------------------------------------- */

.ts-checkout__main {
	display: flex;
	flex-direction: column;
	gap: var(--ts-space-6);
	min-width: 0;
}

.ts-checkout__card {
	padding: var(--ts-space-6);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
}

.ts-checkout__card-title {
	margin: 0 0 var(--ts-space-4);
	font-size: var(--ts-text-lg);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

.ts-checkout__empty {
	margin: 0;
	color: var(--ts-color-muted);
}

.ts-checkout__aside {
	min-width: 0;
}

.ts-checkout__aside-title {
	margin: 0 0 var(--ts-space-4);
	font-size: var(--ts-text-lg);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

/* --- Радіо-картки способів доставки й оплати ------------------------------- */

.ts-methods {
	display: flex;
	flex-direction: column;
	gap: var(--ts-space-2);
	margin: 0;
	padding: 0;
	list-style: none;
}

.ts-methods__item {
	margin: 0;
	border: 1px solid var(--ts-color-border-strong);
	border-radius: var(--ts-radius-md);
	transition: border-color var(--ts-transition-fast);
}

.ts-methods__item:hover {
	border-color: var(--ts-color-primary);
}

/*
 * Підсвічуємо через :has(), а не клас із сервера: клас не встигає за
 * кліком, бо розмітка перемальовується лише після AJAX.
 */
.ts-methods__item:has(input:checked) {
	border-color: var(--ts-color-primary);
	box-shadow: inset 0 0 0 1px var(--ts-color-primary);
}

.ts-methods__label {
	display: flex;
	align-items: center;
	gap: var(--ts-space-3);
	/* 44px — мінімальна зручна ціль для пальця. */
	min-height: 56px;
	padding: var(--ts-space-3) var(--ts-space-4);
	cursor: pointer;
}

/* Логотип перевізника: видно, чия це доставка, ще до читання назви. */
.ts-methods__logo {
	flex: 0 0 auto;
	width: 28px;
	height: 28px;
	object-fit: contain;
}

/* Логотип перевізника: видно, чия це доставка, ще до читання назви. */
.ts-methods__logo {
	flex: 0 0 auto;
	width: 28px;
	height: 28px;
	object-fit: contain;
}

/* Логотип NBplaza горизонтальний — у квадраті 28px він нечитабельний. */
.ts-methods__logo--wide {
	width: 64px;
}

/*
 * accent-color фарбує кружечок у колір теми, а заразом прибирає
 * квадратне обведення, яке браузер малює навколо нативного radio при
 * кліку. Рядок і так підсвічується рамкою картки.
 */
.ts-methods__label input[type="radio"] {
	flex: 0 0 auto;
	width: 18px;
	height: 18px;
	accent-color: var(--ts-color-primary);
}

.ts-methods__body {
	display: flex;
	flex: 1 1 auto;
	flex-direction: column;
	gap: 2px;
	min-width: 0;
}

.ts-methods__name {
	font-weight: var(--ts-weight-medium);
	color: var(--ts-color-text-strong);
}

.ts-methods__note {
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
}

.ts-methods__price {
	flex: 0 0 auto;
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
	white-space: nowrap;
}

/*
 * «за тарифами перевізника» не переноситься і на телефоні лишало назві
 * способу 3px. Ціна йде окремим рядком.
 */
@media (max-width: 559px) {
	.ts-methods__label {
		flex-wrap: wrap;
	}

	.ts-methods__body {
		flex: 1 1 0;
		min-width: 120px;
	}

	.ts-methods__price {
		flex-basis: 100%;
		text-align: right;
		white-space: normal;
	}
}

/* Заголовки секцій */
.woocommerce-billing-fields h3,
.woocommerce-additional-fields h3,
#order_review_heading {
	margin-bottom: var(--ts-space-4);
	font-size: var(--ts-text-lg);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

/* --- Поля форми ------------------------------------------------------------ */

/*
 * Ті самі правила діють у кабінеті: «Дані для замовлень» показує поля
 * checkout, тож вони мають виглядати однаково в обох місцях.
 */
form.checkout .form-row,
.ts-account-form .form-row,
form.edit-account .form-row {
	display: flex;
	flex-direction: column;
	gap: var(--ts-space-2);
	margin: 0 0 var(--ts-space-4);
	padding: 0;
}

/*
 * Прихований рядок лишається прихованим.
 *
 * display: flex вище перебиває вбудоване display: none від атрибута
 * hidden — і поле, яке скрипт сховав, усе одно видно. Помітно це було
 * на Новій пошті: при доставці у відділення вулиця не потрібна, скрипт
 * ставив hidden, а поле лишалося на екрані. Правило в nova-poshta.css
 * не рятувало: цей файл підключається пізніше й перекривав його.
 */
form.checkout .form-row[hidden],
.ts-account-form .form-row[hidden],
form.edit-account .form-row[hidden] {
	display: none;
}

/*
 * Підказка під полем — дрібний підпис, а не другий рядок основного
 * тексту. WooCommerce віддає її тим самим розміром, що й сам ввід,
 * і «Надішлемо підтвердження замовлення.» важило стільки ж, скільки
 * мітка над полем.
 */
form.checkout .description,
.ts-account-form .description,
form.edit-account .description {
	margin: calc(var(--ts-space-1) * -1) 0 0;
	font-size: var(--ts-text-xs);
	line-height: var(--ts-leading-normal);
	color: var(--ts-color-muted);
}

form.checkout label,
.ts-account-form label,
form.edit-account label {
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-medium);
	color: var(--ts-color-text);
}

form.checkout .required,
.ts-account-form .required {
	color: var(--ts-color-danger);
	text-decoration: none;
	border: 0;
}

form.checkout .optional,
.ts-account-form .optional {
	color: var(--ts-color-faint);
	font-weight: var(--ts-weight-regular);
}

form.checkout input[type="text"],
form.checkout input[type="tel"],
form.checkout input[type="email"],
form.checkout textarea,
form.checkout select,
.ts-account-form input[type="text"],
.ts-account-form input[type="tel"],
.ts-account-form input[type="email"],
.ts-account-form input[type="password"],
.ts-account-form textarea,
.ts-account-form select {
	width: 100%;
	min-height: 48px;
	padding: var(--ts-space-3);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border-strong);
	border-radius: var(--ts-radius-md);
	font-family: var(--ts-font-sans);
	font-size: var(--ts-text-base);
	color: var(--ts-color-text);
}

form.checkout textarea {
	min-height: 96px;
	resize: vertical;
}

/*
 * 16px на мобільному: інакше iOS зумить сторінку при фокусі.
 * Правило з _base.css сюди не доходить — селектор form.checkout
 * специфічніший, тому дублюємо його тут.
 */
@media (max-width: 767px) {
	form.checkout input[type="text"],
	form.checkout input[type="tel"],
	form.checkout input[type="email"],
	form.checkout textarea,
	form.checkout select {
		font-size: 16px;
	}
}

/*
 * Синє кільце — для текстових полів. Radio і checkbox виключені: у них
 * воно лягало квадратом навколо круглого перемикача.
 */
form.checkout input:not([type="radio"]):not([type="checkbox"]):focus,
form.checkout textarea:focus,
form.checkout select:focus {
	outline: none;
	border-color: var(--ts-color-primary);
	box-shadow: var(--ts-shadow-focus);
}

form.checkout .woocommerce-input-wrapper {
	width: 100%;
}

/* Поле з помилкою має бути помітним */
form.checkout .woocommerce-invalid input {
	border-color: var(--ts-color-danger);
}

/* Два поля в рядок там, де вистачає місця */
@media (min-width: 640px) {
	form.checkout .form-row-first,
	form.checkout .form-row-last {
		width: calc(50% - var(--ts-space-2));
		display: inline-flex;
		vertical-align: top;
	}

	form.checkout .form-row-first {
		margin-right: var(--ts-space-3);
	}
}

/* Доставка на іншу адресу в MVP не потрібна */
.woocommerce-shipping-fields {
	display: none;
}

/* --- Підсумок замовлення --------------------------------------------------- */

/*
 * Рамку й фон малює .ts-review всередині — тут лише обгортка, інакше
 * виходив подвійний бордер.
 */
#order_review {
	min-width: 0;
}

.woocommerce-checkout-review-order-table {
	width: 100%;
	margin-bottom: var(--ts-space-4);
	font-size: var(--ts-text-sm);
}

.woocommerce-checkout-review-order-table th,
.woocommerce-checkout-review-order-table td {
	padding-block: var(--ts-space-2);
	text-align: left;
	font-weight: var(--ts-weight-regular);
	color: var(--ts-color-muted);
	vertical-align: top;
}

.woocommerce-checkout-review-order-table td {
	text-align: right;
	color: var(--ts-color-text);
}

.woocommerce-checkout-review-order-table thead th {
	padding-bottom: var(--ts-space-3);
	border-bottom: 1px solid var(--ts-color-border);
	font-size: var(--ts-text-2xs);
	letter-spacing: var(--ts-tracking-wide);
	text-transform: uppercase;
}

.woocommerce-checkout-review-order-table .cart_item td,
.woocommerce-checkout-review-order-table .cart_item th {
	padding-block: var(--ts-space-3);
	border-bottom: 1px solid var(--ts-color-border);
	color: var(--ts-color-text);
}

.woocommerce-checkout-review-order-table .order-total th,
.woocommerce-checkout-review-order-table .order-total td {
	padding-top: var(--ts-space-4);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

.woocommerce-checkout-review-order-table .order-total .woocommerce-Price-amount {
	font-size: var(--ts-text-xl);
	font-weight: var(--ts-weight-bold);
}

/* --- Способи оплати -------------------------------------------------------- */

.wc_payment_methods {
	list-style: none;
	margin: 0 0 var(--ts-space-4);
	padding: 0;
	display: flex;
	flex-direction: column;
	gap: var(--ts-space-2);
}

/* Ті самі пропорції, що в списку способів доставки. */
.wc_payment_method {
	padding: 0 var(--ts-space-4);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
}

.wc_payment_method:has(input:checked) {
	border-color: var(--ts-color-primary);
	background: var(--ts-color-primary-soft);
}

.wc_payment_method label {
	display: flex;
	align-items: center;
	gap: var(--ts-space-3);
	/* 56px — та сама висота, що в рядку способу доставки. */
	min-height: 56px;
	margin: 0;
	font-weight: var(--ts-weight-medium);
	color: var(--ts-color-text-strong);
	cursor: pointer;
}

.wc_payment_method input[type="radio"] {
	width: 18px;
	height: 18px;
	accent-color: var(--ts-color-primary);
}

/*
 * Пояснення під назвою, а не окремий блок із рамкою: воно коротке й
 * читається як підпис, так само як примітка способу доставки.
 */
.payment_box {
	margin: calc(var(--ts-space-2) * -1) 0 var(--ts-space-3);
	padding: 0 0 0 calc(18px + var(--ts-space-3));
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
	background: none;
}

.payment_box p {
	margin: 0;
}

.woocommerce-privacy-policy-text {
	margin-bottom: var(--ts-space-4);
	font-size: var(--ts-text-xs);
	color: var(--ts-color-faint);
	line-height: var(--ts-leading-relaxed);
}

#place_order {
	width: 100%;
	min-height: 52px;
	background: var(--ts-color-primary);
	border: 0;
	border-radius: var(--ts-radius-md);
	color: #fff;
	font-family: var(--ts-font-sans);
	font-size: var(--ts-text-md);
	font-weight: var(--ts-weight-semibold);
	cursor: pointer;
	transition: background-color var(--ts-duration-fast) var(--ts-ease);
}

#place_order:hover {
	background: var(--ts-color-primary-hover);
}

/* --- Промокод на checkout -------------------------------------------------- */

.woocommerce-form-coupon-toggle {
	margin-bottom: var(--ts-space-5);
}

.checkout_coupon {
	display: flex;
	flex-wrap: wrap;
	gap: var(--ts-space-3);
	margin-bottom: var(--ts-space-5);
	padding: var(--ts-space-4);
	background: var(--ts-color-surface-sunken);
	border-radius: var(--ts-radius-md);
}

.checkout_coupon .form-row {
	flex: 1 1 200px;
	margin-bottom: 0 !important;
}

/* Поле промокоду приходить від WooCommerce без наших класів. */
.checkout_coupon input[type="text"] {
	width: 100%;
	min-height: 48px;
	padding: var(--ts-space-3);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border-strong);
	border-radius: var(--ts-radius-md);
	font-family: var(--ts-font-sans);
	font-size: var(--ts-text-base);
	color: var(--ts-color-text);
}

.checkout_coupon input[type="text"]:focus {
	outline: none;
	border-color: var(--ts-color-primary);
	box-shadow: var(--ts-shadow-focus);
}

.checkout_coupon button {
	min-height: 48px;
	padding-inline: var(--ts-space-5);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border-strong);
	border-radius: var(--ts-radius-md);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text);
	cursor: pointer;
}

/* Коментар під підсумком у правій колонці. */
.ts-checkout__notes {
	margin-top: var(--ts-space-5);
	padding: var(--ts-space-5);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
}

.ts-checkout__notes .ts-checkout__aside-title {
	margin-bottom: var(--ts-space-3);
}

.ts-checkout__notes .form-row {
	margin-bottom: 0;
}

/* Підпис поля дублює заголовок блоку. */
.ts-checkout__notes label {
	display: none;
}

/* --- Дякуємо за замовлення ------------------------------------------------- */

.ts-thankyou {
	max-width: 720px;
	margin-bottom: var(--ts-space-12);
}

/*
 * Іконка поруч із текстом, а не над ним: так «прийнято» читається
 * одним рухом, і сторінка не починається з порожнього стовпчика.
 */
.ts-thankyou__head {
	display: flex;
	align-items: flex-start;
	gap: var(--ts-space-4);
	margin-bottom: var(--ts-space-6);
}

.ts-thankyou__icon {
	flex: none;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 56px;
	height: 56px;
	background: var(--ts-color-success-soft);
	border-radius: var(--ts-radius-full);
	color: var(--ts-color-success);
}

.ts-thankyou__lead {
	margin-bottom: var(--ts-space-1);
	font-size: var(--ts-text-lg);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

.ts-thankyou__title {
	margin-bottom: var(--ts-space-3);
	font-size: var(--ts-text-2xl);
}

.ts-thankyou__text {
	margin: 0;
	font-size: var(--ts-text-md);
	line-height: var(--ts-leading-relaxed);
	color: var(--ts-color-muted);
}

/* Перевізник із логотипом — так само, як на кроці вибору доставки. */
.ts-thankyou__carrier {
	display: flex;
	/* Довга назва перевізника переноситься — логотип має лишитись
	   на першому рядку, а не «пірнати» під текст. */
	align-items: flex-start;
	gap: var(--ts-space-2);
}

.ts-thankyou__carrier .ts-thankyou__logo {
	margin-top: 2px;
}

.ts-thankyou__logo {
	width: 22px;
	height: 22px;
	object-fit: contain;
}

/* Логотип NBplaza горизонтальний — у квадраті був би нечитабельним. */
.ts-thankyou__logo--wide {
	width: 56px;
}

/* Інструкції шлюзу (реквізити тощо) — окремою рамкою, щоб не губилися. */
.ts-thankyou__note {
	margin-bottom: var(--ts-space-6);
	padding: var(--ts-space-4);
	background: var(--ts-color-info-soft, var(--ts-color-surface-sunken));
	border-left: 3px solid var(--ts-color-primary);
	border-radius: var(--ts-radius-md);
	font-size: var(--ts-text-sm);
	line-height: var(--ts-leading-relaxed);
}

.ts-thankyou__note p:last-child {
	margin-bottom: 0;
}

/* Картка «Збережіть email»: той самий фон, що в картках налаштувань. */
.ts-thankyou__email {
	max-width: 720px;
	margin-bottom: var(--ts-space-8);
	padding: var(--ts-space-5);
	background: var(--ts-color-surface-sunken);
	border-radius: var(--ts-radius-xl);
}

.ts-thankyou__email-title {
	margin: 0 0 var(--ts-space-2);
	font-size: var(--ts-text-lg);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

.ts-thankyou__email-text {
	margin: 0 0 var(--ts-space-4);
	color: var(--ts-color-muted);
}

/* «Стежити в Telegram» — та сама картка, кнопка Telegram на всю ширину на телефоні. */
@media (max-width: 599px) {
	.ts-thankyou__tg .ts-btn {
		width: 100%;
	}
}

.ts-thankyou__tg-note {
	display: flex;
	align-items: center;
	gap: var(--ts-space-2);
	max-width: 720px;
	margin: 0 0 var(--ts-space-8);
	color: var(--ts-color-muted);
}

.ts-thankyou__tg-note svg {
	flex-shrink: 0;
	color: var(--ts-color-telegram-button);
}

/* Підказка «Задайте пароль» — єдиний рядок картки. */
.ts-thankyou__email-text:last-child {
	margin-bottom: 0;
}

.ts-thankyou__details {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
	gap: var(--ts-space-4);
	padding: var(--ts-space-5);
	background: var(--ts-color-surface-sunken);
	border-radius: var(--ts-radius-lg);
	margin-bottom: var(--ts-space-6);
}

.ts-thankyou__label {
	display: block;
	font-size: var(--ts-text-2xs);
	letter-spacing: var(--ts-tracking-wide);
	text-transform: uppercase;
	color: var(--ts-color-muted);
	margin-bottom: var(--ts-space-1);
}

.ts-thankyou__value {
	font-size: var(--ts-text-md);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

.ts-thankyou__actions {
	display: flex;
	flex-wrap: wrap;
	gap: var(--ts-space-3);
	margin-bottom: var(--ts-space-8);
}

/*
 * Склад замовлення й адресу WooCommerce малює власною розміткою. Ми її
 * не переписуємо шаблонами, а лише вбираємо в наші токени: без цього
 * сторінка після оформлення виглядала як необроблений HTML.
 */
.woocommerce-order-details,
.woocommerce-customer-details {
	max-width: 720px;
	margin-bottom: var(--ts-space-8);
}

.woocommerce-order-details__title,
.woocommerce-column__title {
	margin-bottom: var(--ts-space-4);
	font-size: var(--ts-text-lg);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

.woocommerce-table--order-details {
	width: 100%;
	border-collapse: collapse;
	font-size: var(--ts-text-sm);
}

.woocommerce-table--order-details th,
.woocommerce-table--order-details td {
	padding: var(--ts-space-3) 0;
	text-align: left;
	border-bottom: 1px solid var(--ts-color-border);
}

.woocommerce-table--order-details thead th {
	font-size: var(--ts-text-2xs);
	letter-spacing: var(--ts-tracking-wide);
	text-transform: uppercase;
	color: var(--ts-color-muted);
	font-weight: var(--ts-weight-medium);
}

/* Ціна праворуч — око шукає суму саме там. */
.woocommerce-table--order-details td:last-child,
.woocommerce-table--order-details th:last-child {
	text-align: right;
	white-space: nowrap;
}

/*
 * Без переносу довгі значення («Оплата карткою за реквізитами») робили
 * таблицю ширшою за екран, і суми обрізались. Сума лишається одним рядком.
 */
@media (max-width: 767px) {
	.woocommerce-table--order-details td:last-child,
	.woocommerce-table--order-details th:last-child {
		padding-left: var(--ts-space-3);
		white-space: normal;
		overflow-wrap: anywhere;
	}

	.woocommerce-table--order-details .woocommerce-Price-amount {
		white-space: nowrap;
	}
}

/*
 * Перевізник у підсумку: WooCommerce друкує його дрібним <small>
 * поруч із сумою, і без вирівнювання це виглядало як хвіст.
 */
.woocommerce-table--order-details .shipped_via {
	display: block;
	margin-top: 2px;
	font-size: var(--ts-text-2xs);
	color: var(--ts-color-muted);
}

.woocommerce-table--order-details .product-quantity {
	color: var(--ts-color-muted);
	font-weight: var(--ts-weight-normal);
}

.woocommerce-table--order-details tfoot th {
	font-weight: var(--ts-weight-normal);
	color: var(--ts-color-muted);
	text-transform: none;
	letter-spacing: normal;
	font-size: var(--ts-text-sm);
}

/*
 * Підсумок виділяємо по класу, а не по :last-child: останнім рядком
 * у WooCommerce стоїть спосіб оплати, і він набирав вигляд суми.
 */
.woocommerce-table--order-details tfoot .order-row--order-total th,
.woocommerce-table--order-details tfoot .order-row--order-total td {
	font-size: var(--ts-text-md);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

.woocommerce-table--order-details tfoot tr:last-child th,
.woocommerce-table--order-details tfoot tr:last-child td {
	border-bottom: 0;
}

.woocommerce-customer-details address {
	padding: var(--ts-space-4);
	background: var(--ts-color-surface-sunken);
	border-radius: var(--ts-radius-md);
	font-style: normal;
	font-size: var(--ts-text-sm);
	line-height: var(--ts-leading-relaxed);
}

.woocommerce-customer-details--phone,
.woocommerce-customer-details--email {
	margin: var(--ts-space-2) 0 0;
	color: var(--ts-color-muted);
}

/* --- Повідомлення WooCommerce ---------------------------------------------- */

.woocommerce-message,
.woocommerce-info,
.woocommerce-error {
	margin-bottom: var(--ts-space-5);
	padding: var(--ts-space-4);
	border-radius: var(--ts-radius-md);
	font-size: var(--ts-text-sm);
	list-style: none;
}

.woocommerce-message {
	background: var(--ts-color-success-soft);
	border: 1px solid var(--ts-color-success);
}

.woocommerce-info {
	background: var(--ts-color-primary-soft);
	border: 1px solid var(--ts-color-primary);
}

.woocommerce-error {
	background: var(--ts-color-danger-soft);
	border: 1px solid var(--ts-color-danger);
}

.woocommerce-error li + li {
	margin-top: var(--ts-space-2);
}

/*
 * WooCommerce ставить повідомленню tabindex="-1" і переводить на нього
 * фокус, щоб його прочитав скрінрідер. Браузер малює при цьому синє
 * обведення поверх кольорової рамки — воно тут зайве: повідомлення й
 * так помітне, а в таб-порядок не входить.
 */
.woocommerce-message:focus,
.woocommerce-info:focus,
.woocommerce-error:focus,
.woocommerce-message:focus-visible,
.woocommerce-info:focus-visible,
.woocommerce-error:focus-visible {
	outline: none;
}

/* --- Дрібні посилання WooCommerce --------------------------------------- */

/*
 * "Перейти в кошик" у повідомленні та "Розрахувати доставку" —
 * посилання від WooCommerce, які приходять без наших класів.
 * Доводимо до 44px, щоб у них можна було влучити пальцем.
 */
.woocommerce-message .button,
.shipping-calculator-button {
	display: inline-flex;
	align-items: center;
	min-height: 44px;
	padding-inline: var(--ts-space-3);
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-medium);
	color: var(--ts-color-primary);
}

.woocommerce-message .button:hover,
.shipping-calculator-button:hover {
	text-decoration: underline;
}

/* --- Підсумок замовлення в правій колонці ---------------------------------- */

.ts-review {
	padding: var(--ts-space-5);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
}

.ts-review__items {
	margin: 0;
	padding: 0;
	list-style: none;
}

.ts-review__item {
	display: flex;
	align-items: flex-start;
	gap: var(--ts-space-3);
	padding: var(--ts-space-3) 0;
}

.ts-review__item + .ts-review__item {
	border-top: 1px solid var(--ts-color-border);
}

.ts-review__thumb {
	flex: 0 0 auto;
	width: 48px;
}

.ts-review__thumb img {
	display: block;
	width: 100%;
	height: auto;
	border-radius: var(--ts-radius-sm);
}

.ts-review__info {
	display: flex;
	flex: 1 1 auto;
	flex-direction: column;
	gap: 2px;
	min-width: 0;
}

.ts-review__name {
	font-size: var(--ts-text-sm);
	line-height: var(--ts-leading-snug);
	color: var(--ts-color-text-strong);
}

.ts-review__qty {
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
}

.ts-review__price {
	flex: 0 0 auto;
	font-size: var(--ts-text-sm);
	font-variant-numeric: tabular-nums;
	white-space: nowrap;
	color: var(--ts-color-text-strong);
}

.ts-review__totals {
	margin-top: var(--ts-space-4);
	padding-top: var(--ts-space-4);
	border-top: 1px solid var(--ts-color-border);
}

.ts-review__row {
	display: flex;
	justify-content: space-between;
	gap: var(--ts-space-4);
	padding: var(--ts-space-2) 0;
	font-size: var(--ts-text-base);
	color: var(--ts-color-text);
}

.ts-review__row--discount {
	color: var(--ts-color-success);
}

.ts-review__row--total {
	margin-top: var(--ts-space-2);
	padding-top: var(--ts-space-3);
	border-top: 1px solid var(--ts-color-border);
	font-size: var(--ts-text-lg);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

/*
 * Заголовок картки вже каже «Коментар до замовлення» — дублювати його
 * ще й лейблом поля немає сенсу.
 */
#ts-order-notes .form-row > label {
	position: absolute;
	width: 1px;
	height: 1px;
	overflow: hidden;
	clip-path: inset(50%);
	white-space: nowrap;
}

#ts-order-notes .form-row {
	margin-bottom: 0;
}

/* --- Способи оплати: та сама картка, що й у доставці ----------------------- */

#ts-payment-methods .wc_payment_methods {
	display: flex;
	flex-direction: column;
	gap: var(--ts-space-2);
	margin: 0;
	padding: 0;
	list-style: none;
}

/*
 * Woo кладе <input>, <label> і опис трьома сусідами, тож збираємо їх
 * сіткою: радіо ліворуч, назва праворуч від нього, опис — під назвою.
 *
 * Радіо тримається у своєму рядку (align-self: start плюс висота
 * рядка назви), інакше grid центрує його по всій картці — і в способу
 * з описом кнопка з'їжджає вниз відносно назви, до якої належить.
 */
#ts-payment-methods .wc_payment_method {
	position: relative;
	display: grid;
	grid-template-columns: auto minmax(0, 1fr);
	margin: 0;
	padding: var(--ts-space-3) var(--ts-space-4);
	border: 1px solid var(--ts-color-border-strong);
	border-radius: var(--ts-radius-md);
	cursor: pointer;
	transition: border-color var(--ts-transition-fast);
}

#ts-payment-methods .wc_payment_method:hover {
	border-color: var(--ts-color-primary);
}

#ts-payment-methods .wc_payment_method:has(input:checked) {
	border-color: var(--ts-color-primary);
	box-shadow: inset 0 0 0 1px var(--ts-color-primary);
}

/*
 * Висота рядка назви — 24px, і та сама величина вирівнює радіо по його
 * середині незалежно від того, є під назвою опис чи ні.
 */
#ts-payment-methods .wc_payment_method > input {
	align-self: start;
	width: 18px;
	height: 24px;
	margin: 0;
}

#ts-payment-methods .wc_payment_method > label {
	align-self: start;
	/*
	 * Скидаємо min-height: 56px із загального правила: там воно тримає
	 * висоту рядка в кошику, а тут розтягувало мітку втричі проти її
	 * тексту — і радіо, вирівняне по мітці, опинялося вище назви.
	 */
	display: block;
	min-height: 0;
	padding: 0 0 0 var(--ts-space-3);
	line-height: 24px;
	font-weight: var(--ts-weight-medium);
	color: var(--ts-color-text-strong);
	cursor: pointer;
}

/*
 * Натиснути можна будь-де в картці, а не лише на назві: мітка
 * розтягується псевдоелементом на весь рядок. Так само зроблено в
 * картці товару — див. .ts-card__title a::before.
 */
#ts-payment-methods .wc_payment_method > label::before {
	content: "";
	position: absolute;
	inset: 0;
	border-radius: inherit;
}

/*
 * Опис — під назвою, у тій самій колонці, і видно його завжди.
 *
 * Woo ховає опис незалежно від вибору й показує лише в обраного
 * способу, причому inline-стилем — звідси !important. Описи в нас
 * короткі й потрібні саме до вибору: людина читає, чим способи
 * відрізняються, а не після того, як уже щось відмітила.
 */
#ts-payment-methods .payment_box {
	display: block !important;
	grid-column: 2;
	margin: var(--ts-space-1) 0 0;
	padding: 0 0 0 var(--ts-space-3);
	font-size: var(--ts-text-sm);
	line-height: var(--ts-leading-normal);
	color: var(--ts-color-muted);
	background: none;
}

#ts-payment-methods .payment_box p:last-child {
	margin-bottom: 0;
}

/*
 * Реквізити для рахунку (Invoice_Details). Описи способів видно завжди,
 * а поля — лише під обраним: заповнювати їх для невибраного способу
 * нема сенсу. Над псевдоелементом мітки, що накриває всю картку, —
 * інакше клік у поле обирав би спосіб, а не ставив курсор.
 */
#ts-payment-methods .ts-invoice-fields {
	position: relative;
	z-index: 1;
	display: grid;
	grid-template-columns: minmax(0, 1fr);
	gap: var(--ts-space-3);
	margin-top: var(--ts-space-4);
	font-size: var(--ts-text-md);
	color: var(--ts-color-text);
	cursor: auto;
}

#ts-payment-methods .wc_payment_method:not(:has(> input:checked)) .ts-invoice-fields {
	display: none;
}

#ts-payment-methods .ts-invoice-fields .form-row {
	display: flex;
	flex-direction: column;
	gap: var(--ts-space-1);
	width: auto;
	margin: 0;
	padding: 0;
}

#ts-payment-methods .ts-invoice-fields label {
	font-weight: var(--ts-weight-medium);
	color: var(--ts-color-text-strong);
}

#ts-payment-methods .ts-invoice-fields .form-row-wide {
	grid-column: 1 / -1;
}

@media (min-width: 640px) {
	#ts-payment-methods .ts-invoice-fields {
		grid-template-columns: repeat(2, minmax(0, 1fr));
	}
}

#ts-payment-methods .woocommerce-privacy-policy-text {
	margin: var(--ts-space-4) 0 0;
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
}

#ts-payment-methods .form-row.place-order {
	margin: 0;
	padding: 0;
}

#ts-payment-methods #place_order {
	width: 100%;
}

/* --- Смужка кроків --------------------------------------------------------- */

.ts-steps {
	margin-bottom: var(--ts-space-8);
}

.ts-steps__list {
	display: flex;
	align-items: flex-start;
	margin: 0;
	padding: 0;
	list-style: none;
}

.ts-steps__item {
	position: relative;
	flex: 1 1 0;
	min-width: 0;
	text-align: center;
}

/*
 * Лінія між кроками — псевдоелемент, а не окремий вузол: так вона
 * завжди точно між центрами кружків.
 */
.ts-steps__item + .ts-steps__item::before {
	content: "";
	position: absolute;
	top: 16px;
	right: 50%;
	left: -50%;
	height: 1px;
	background: var(--ts-color-border-strong);
}

.ts-steps__item.is-done + .ts-steps__item::before,
.ts-steps__item.is-current::before {
	background: var(--ts-color-primary);
}

.ts-steps__link {
	position: relative;
	z-index: 1;
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: var(--ts-space-2);
	color: var(--ts-color-faint);
}

a.ts-steps__link:hover {
	color: var(--ts-color-primary);
	text-decoration: none;
}

.ts-steps__badge {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 32px;
	height: 32px;
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-faint);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border-strong);
	border-radius: var(--ts-radius-full);
}

.ts-steps__item.is-done .ts-steps__badge {
	color: var(--ts-color-surface);
	background: var(--ts-color-primary);
	border-color: var(--ts-color-primary);
}

.ts-steps__item.is-current .ts-steps__badge {
	color: var(--ts-color-primary);
	border-color: var(--ts-color-primary);
	box-shadow: 0 0 0 3px var(--ts-color-primary-soft);
}

.ts-steps__item.is-done .ts-steps__link,
.ts-steps__item.is-current .ts-steps__link {
	color: var(--ts-color-text-strong);
}

.ts-steps__label {
	font-size: var(--ts-text-sm);
	line-height: var(--ts-leading-snug);
}

@media (max-width: 559px) {
	/*
	 * На телефоні 64px з'їдають надто багато: назва «Кур'єр NBplaza —
	 * Правий берег» ламалася на чотири рядки.
	 */
	.ts-methods__logo--wide {
		width: 44px;
	}

	.ts-steps__label {
		font-size: var(--ts-text-xs);
	}
}

/* --- Крок 3: підсумок ------------------------------------------------------ */

.ts-summary {
	display: grid;
	grid-template-columns: 1fr;
	gap: var(--ts-space-6);
	align-items: start;
	margin-bottom: var(--ts-space-12);
}

@media (min-width: 1024px) {
	.ts-summary {
		grid-template-columns: minmax(0, 1fr) 380px;
		gap: var(--ts-space-8);
	}

	.ts-summary__aside {
		position: sticky;
		top: calc(var(--ts-header-height) + var(--ts-space-4));
	}
}

.ts-summary__main {
	display: flex;
	flex-direction: column;
	gap: var(--ts-space-4);
	min-width: 0;
}

.ts-summary__card {
	padding: var(--ts-space-5);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
}

.ts-summary__head {
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	gap: var(--ts-space-4);
	margin-bottom: var(--ts-space-3);
}

.ts-summary__title {
	margin: 0;
	font-size: var(--ts-text-md);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

.ts-summary__card > .ts-summary__title {
	margin-bottom: var(--ts-space-3);
}

.ts-summary__edit {
	display: inline-flex;
	align-items: center;
	gap: var(--ts-space-1);
	font-size: var(--ts-text-sm);
	color: var(--ts-color-primary);
	white-space: nowrap;
}

.ts-summary__line {
	margin: 0 0 var(--ts-space-1);
	line-height: var(--ts-leading-snug);
	color: var(--ts-color-text);
}

.ts-summary__line:last-child {
	margin-bottom: 0;
}

.ts-summary__items {
	margin: 0;
	padding: 0;
	list-style: none;
}

.ts-summary__item {
	display: flex;
	align-items: flex-start;
	gap: var(--ts-space-3);
	padding: var(--ts-space-3) 0;
}

.ts-summary__item + .ts-summary__item {
	border-top: 1px solid var(--ts-color-border);
}

.ts-summary__thumb {
	flex: 0 0 auto;
	width: 56px;
}

.ts-summary__thumb img {
	display: block;
	width: 100%;
	height: auto;
	border-radius: var(--ts-radius-sm);
}

.ts-summary__item-info {
	display: flex;
	flex: 1 1 auto;
	flex-direction: column;
	gap: 2px;
	min-width: 0;
}

.ts-summary__item-name {
	font-size: var(--ts-text-sm);
	line-height: var(--ts-leading-snug);
	color: var(--ts-color-text-strong);
}

.ts-summary__item-qty {
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
}

.ts-summary__item-price {
	flex: 0 0 auto;
	font-size: var(--ts-text-sm);
	font-variant-numeric: tabular-nums;
	white-space: nowrap;
	color: var(--ts-color-text-strong);
}

.ts-summary__totals {
	padding: var(--ts-space-5);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
}

.ts-summary__row {
	display: flex;
	justify-content: space-between;
	gap: var(--ts-space-4);
	padding: var(--ts-space-2) 0;
	color: var(--ts-color-text);
}

.ts-summary__row--discount {
	color: var(--ts-color-success);
}

.ts-summary__row--total {
	margin-top: var(--ts-space-2);
	padding-top: var(--ts-space-3);
	border-top: 1px solid var(--ts-color-border);
	font-size: var(--ts-text-lg);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

.ts-summary__confirm {
	margin-top: var(--ts-space-5);
}

.ts-summary__back {
	display: block;
	margin-top: var(--ts-space-3);
	font-size: var(--ts-text-sm);
	text-align: center;
	color: var(--ts-color-muted);
}

.ts-summary__back:hover {
	color: var(--ts-color-primary);
}

/* 16px на мобільному: з 13px iOS зумить сторінку, щойно торкнешся кількості. */
@media (max-width: 767px) {
	.ts-cartitem__qty .ts-qty__input {
		font-size: 16px;
	}
}

/* Гарантія в шухляді: щит замість фото. */
.ts-cart-drawer__thumb--service {
	display: grid;
	place-items: center;
	color: var(--ts-color-primary);
}

/* «До товару: …» під гарантією — один тихий рядок, не стовпчик. */
.ts-cartitem--warranty .variation {
	display: flex;
	gap: 4px;
	min-width: 0;
	margin: 2px 0 0;
	font-size: var(--ts-text-xs);
	line-height: var(--ts-leading-snug);
	color: var(--ts-color-muted);
}

.ts-cartitem--warranty .variation dt {
	flex: none;
	font-weight: var(--ts-weight-regular);
}

.ts-cartitem--warranty .variation dd {
	min-width: 0;
	margin: 0;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

.ts-cartitem--warranty .variation dd p {
	display: inline;
	margin: 0;
}

/* Щит замість фото службового товару (оформлення, замовлення). */
.ts-service-thumb {
	display: block;
	width: 100%;
	height: auto;
	object-fit: contain;
}

.ts-cartitem__warranty-error {
	margin: var(--ts-space-1) 0 0;
	font-size: var(--ts-text-xs);
	color: var(--ts-color-danger);
}

/* ==========================================================================
   Акаунт: меню в хедері, крок входу, кабінет
   ========================================================================== */

/* --- Дропдаун у хедері ---------------------------------------------------- */

.ts-account {
	position: relative;
}

.ts-account__name {
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

.ts-account__menu {
	position: absolute;
	z-index: var(--ts-z-dropdown);
	top: calc(100% + 4px);
	right: 0;
	width: 260px;
	padding: var(--ts-space-2) 0;
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
	box-shadow: var(--ts-shadow-lg);
}

.ts-account__menu[hidden] {
	display: none;
}

/* Місток до панелі, щоб курсор не «випадав» у проміжку. */
.ts-account__menu::before {
	content: "";
	position: absolute;
	top: -6px;
	right: 0;
	left: 0;
	height: 6px;
}

.ts-account__auth {
	padding: var(--ts-space-3) var(--ts-space-4);
	border-bottom: 1px solid var(--ts-color-border);
}

.ts-account__hint {
	margin: var(--ts-space-3) 0 var(--ts-space-2);
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
	text-align: center;
}

.ts-account__list {
	margin: 0;
	padding: 0;
	list-style: none;
}

.ts-account__link {
	display: flex;
	gap: var(--ts-space-3);
	align-items: center;
	padding: var(--ts-space-3) var(--ts-space-4);
	color: var(--ts-color-text);
	text-decoration: none;
}

/* Пункт меню — рядок зі своєю підсвіткою, підкреслення тут зайве. */
.ts-account__link:hover,
.ts-account__link:focus-visible {
	background: var(--ts-color-surface-hover);
	color: var(--ts-color-primary);
	text-decoration: none;
}

.ts-account__link .ts-icon {
	flex: 0 0 auto;
	color: var(--ts-color-muted);
}

.ts-account__foot {
	margin-top: var(--ts-space-2);
	padding-top: var(--ts-space-2);
	border-top: 1px solid var(--ts-color-border);
}

/* --- Крок входу в оформленні ---------------------------------------------- */

/*
 * Одна форма на екрані, друга — за посиланням під нею (як x-kom).
 * Тому колонка вузька: два поля не потребують ширини на пів сторінки.
 */
.ts-auth {
	max-width: 440px;
	margin: 0 auto;
}

/*
 * Відновлення пароля: WooCommerce друкує помилку до шаблону, поза
 * .ts-auth, і вона тягнулась на всю ширину над вузькою карткою.
 */
.woocommerce-notices-wrapper:has(+ .ts-auth--page) {
	max-width: 440px;
	margin: 0 auto;
}

.ts-auth__switch {
	margin: var(--ts-space-4) 0 0;
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
	text-align: center;
}

/* --- «Ви увійшли» на кроці оформлення ------------------------------------- */

.ts-auth__card--signed {
	text-align: center;
}

.ts-auth__avatar {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 56px;
	height: 56px;
	margin-bottom: var(--ts-space-3);
	background: var(--ts-color-primary-soft);
	border-radius: var(--ts-radius-full);
	color: var(--ts-color-primary);
}

.ts-auth__card--signed .ts-auth__title {
	margin-bottom: var(--ts-space-2);
}

.ts-auth__who {
	margin: 0 0 var(--ts-space-5);
	line-height: var(--ts-leading-snug);
}

.ts-auth__who strong {
	display: block;
	color: var(--ts-color-text-strong);
}

.ts-auth__who span {
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
}

/*
 * Без JS друга форма лишається видимою нижче: атрибут hidden знімає
 * :target, коли покупець перейшов за якорем.
 */
.ts-auth__card[hidden]:target {
	display: block;
}

.ts-auth__card {
	padding: var(--ts-space-5);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
}

.ts-auth__title {
	margin: 0 0 var(--ts-space-4);
	font-size: var(--ts-text-lg);
	font-weight: var(--ts-weight-semibold);
}

/*
 * Один відступ між усіма рядками форми. Раніше відступів не було
 * зовсім: підпис наступного поля липнув до інпута, а підказка під
 * паролем — до кнопки. Приховані input у потік flex не потрапляють.
 */
.ts-auth__form {
	display: flex;
	flex-direction: column;
	gap: var(--ts-space-4);
}

.ts-auth__form > .ts-auth__note--start {
	margin: 0;
}

.ts-auth__row {
	display: flex;
	flex-wrap: wrap;
	gap: var(--ts-space-3);
	align-items: center;
	justify-content: space-between;
}

.ts-auth__link {
	font-size: var(--ts-text-sm);
}

.ts-auth__guest {
	max-width: 420px;
	margin: 0 auto var(--ts-space-6);
	text-align: center;
}

.ts-auth__note {
	margin: var(--ts-space-3) 0 0;
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
}

/* Пояснення над формою — читається як текст, а не як підпис під кнопкою. */
.ts-auth__note--start {
	margin: 0 0 var(--ts-space-4);
	text-align: left;
}

/* Чекбокс «запам'ятати мене» і підказка під полем. */
.ts-check {
	display: inline-flex;
	gap: var(--ts-space-2);
	align-items: center;
	font-size: var(--ts-text-sm);
}

/* Ціль для пальця — увесь рядок із підписом, а не квадратик 13px. */
@media (pointer: coarse) {
	.ts-check {
		min-height: 44px;
	}

	.ts-check input {
		width: 20px;
		height: 20px;
	}
}

.ts-field__optional {
	font-weight: var(--ts-weight-regular);
	color: var(--ts-color-muted);
}

/* Текст по центру картки — «перевірте пошту» після запиту на пароль. */
.ts-auth__note--center {
	margin: 0 0 var(--ts-space-5);
	text-align: center;
}

.ts-field__hint {
	display: block;
	margin-top: var(--ts-space-2);
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
}

/* --- Кабінет: розкладка --------------------------------------------------- */

.ts-account-page {
	display: grid;
	grid-template-columns: 260px minmax(0, 1fr);
	gap: var(--ts-space-6);
	align-items: start;
}

.ts-account-nav__list {
	margin: 0;
	padding: var(--ts-space-2);
	list-style: none;
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
}

.ts-account-nav__link {
	display: flex;
	gap: var(--ts-space-3);
	align-items: center;
	padding: var(--ts-space-3);
	border-radius: var(--ts-radius-md);
	color: var(--ts-color-text);
	text-decoration: none;
}

.ts-account-nav__link:hover,
.ts-account-nav__link:focus-visible {
	background: var(--ts-color-surface-hover);
	text-decoration: none;
}

.ts-account-nav__link .ts-icon {
	flex: 0 0 auto;
	color: var(--ts-color-muted);
}

.ts-account-nav__item.is-current .ts-account-nav__link {
	background: var(--ts-color-primary);
	color: #fff;
	font-weight: var(--ts-weight-semibold);
}

.ts-account-nav__item.is-current .ts-icon {
	color: currentColor;
}

/* --- Кабінет: огляд ------------------------------------------------------- */

.ts-account-hello {
	margin: 0 0 var(--ts-space-5);
	font-size: var(--ts-text-lg);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

.ts-account-tiles {
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: var(--ts-space-4);
}

.ts-account-tile {
	display: flex;
	gap: var(--ts-space-3);
	padding: var(--ts-space-4);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
	color: inherit;
	text-decoration: none;
}

/* Плитка — картка, а не текстове посилання: підкреслення тут зайве. */
.ts-account-tile:hover,
.ts-account-tile:focus-visible {
	border-color: var(--ts-color-primary);
	box-shadow: var(--ts-shadow-sm);
	text-decoration: none;
}

.ts-account-tile__icon {
	flex: 0 0 auto;
	color: var(--ts-color-primary);
}

.ts-account-tile__label {
	display: block;
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

.ts-account-tile__text {
	display: block;
	margin-top: 2px;
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
}

/* --- Кабінет: форми ------------------------------------------------------- */

.ts-account-intro {
	margin: 0 0 var(--ts-space-5);
	color: var(--ts-color-muted);
}

.ts-account-form__fields {
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: 0 var(--ts-space-4);
}

/* Поля на всю ширину: адреса й коментар у два стовпці не читаються. */
.ts-account-form__fields .form-row-wide,
.ts-account-form__fields #billing_address_1_field,
.ts-account-form__fields #billing_email_field {
	grid-column: 1 / -1;
}

/* --- Кабінет: адресна книга, секції за перевізником ------------------------ */

.ts-addr-sections {
	display: flex;
	flex-direction: column;
	gap: var(--ts-space-6);
	margin-bottom: var(--ts-space-6);
}

.ts-addr-section {
	padding: var(--ts-space-5);
	background: var(--ts-color-surface-sunken);
	border-radius: var(--ts-radius-xl);
}

.ts-addr-section__head {
	display: flex;
	gap: var(--ts-space-3);
	align-items: center;
	margin-bottom: var(--ts-space-4);
}

.ts-addr-section__logo {
	flex: 0 0 auto;
	width: 32px;
	height: 32px;
	object-fit: contain;
}

.ts-addr-section__icon {
	display: inline-flex;
	flex: 0 0 auto;
	align-items: center;
	justify-content: center;
	width: 32px;
	height: 32px;
	background: var(--ts-color-primary-soft);
	border-radius: var(--ts-radius-full);
	color: var(--ts-color-primary);
}

.ts-addr-section__title {
	margin: 0;
	font-size: var(--ts-text-md);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

.ts-addr-section__note {
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
}

/* Плитки: три в ряд на широкому, одна на телефоні. */
.ts-addr-cards {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
	gap: var(--ts-space-3);
}

.ts-addr-card {
	position: relative;
	display: flex;
	flex-direction: column;
	padding: var(--ts-space-4);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
}

.ts-addr-card.is-default,
.ts-addr-card.is-editing {
	border-color: var(--ts-color-primary);
}

.ts-addr-card__badge {
	position: absolute;
	top: var(--ts-space-3);
	right: var(--ts-space-3);
	padding: 2px var(--ts-space-2);
	background: var(--ts-color-primary);
	border-radius: var(--ts-radius-full);
	font-size: var(--ts-text-2xs);
	color: #fff;
}

.ts-addr-card__label {
	margin: 0 0 2px;
	padding-right: var(--ts-space-8);
	font-size: var(--ts-text-base);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

.ts-addr-card__kind {
	margin: 0 0 var(--ts-space-3);
	font-size: var(--ts-text-2xs);
	text-transform: uppercase;
	letter-spacing: 0.04em;
	color: var(--ts-color-faint);
}

.ts-addr-card__text {
	margin: 0 0 var(--ts-space-2);
	font-size: var(--ts-text-sm);
	line-height: var(--ts-leading-snug);
	color: var(--ts-color-text);
}

.ts-addr-card__person {
	margin: 0 0 var(--ts-space-4);
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
}

/* Дії внизу картки, щоб плитки в ряду були однакові. */
.ts-addr-card__actions {
	display: flex;
	flex-wrap: wrap;
	gap: var(--ts-space-3);
	align-items: center;
	margin-top: auto;
	padding-top: var(--ts-space-3);
	border-top: 1px solid var(--ts-color-border);
}

/* Плитка «додати»: пунктир, щоб не сплутати зі збереженою адресою. */
.ts-addr-card--add {
	align-items: center;
	justify-content: center;
	gap: var(--ts-space-2);
	/* 120px — не нижче за сусідні плитки в ряду. */
	min-height: 120px;
	border-style: dashed;
	border-color: var(--ts-color-border-strong);
	color: var(--ts-color-primary);
	text-align: center;
	text-decoration: none;
}

.ts-addr-card--add:hover,
.ts-addr-card--add:focus-visible {
	border-color: var(--ts-color-primary);
	background: var(--ts-color-primary-soft);
	text-decoration: none;
}

.ts-addr-card__plus {
	font-size: var(--ts-text-2xl);
	line-height: 1;
}

.ts-addr-card__add-label {
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-medium);
}

/* --- Кабінет: адресна книга ----------------------------------------------- */

.ts-addresses {
	margin: 0 0 var(--ts-space-5);
	padding: 0;
	list-style: none;
}

.ts-addresses__item {
	display: flex;
	flex-wrap: wrap;
	gap: var(--ts-space-3);
	align-items: flex-start;
	justify-content: space-between;
	padding: var(--ts-space-4);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
}

.ts-addresses__item + .ts-addresses__item {
	margin-top: var(--ts-space-3);
}

.ts-addresses__item.is-default {
	border-color: var(--ts-color-primary);
}

.ts-addresses__body {
	min-width: 0;
	flex: 1 1 260px;
}

.ts-addresses__head {
	display: flex;
	flex-wrap: wrap;
	gap: var(--ts-space-2);
	align-items: center;
	margin-bottom: var(--ts-space-1);
}

.ts-addresses__label {
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

.ts-addresses__badge {
	padding: 2px var(--ts-space-2);
	background: var(--ts-color-primary);
	border-radius: var(--ts-radius-full);
	font-size: var(--ts-text-2xs);
	color: #fff;
}

.ts-addresses__text {
	margin: 0;
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
}

.ts-addresses__actions {
	display: flex;
	flex-wrap: wrap;
	gap: var(--ts-space-3);
	align-items: center;
}

/* Кнопка-посилання: дія всередині форми, але виглядає як текст. */
.ts-addresses__link {
	padding: 0;
	background: none;
	border: 0;
	font-size: var(--ts-text-sm);
	color: var(--ts-color-primary);
	cursor: pointer;
}

.ts-addresses__link:hover {
	text-decoration: underline;
}

.ts-addresses__link--danger {
	color: var(--ts-color-danger);
}

.ts-addresses__kind {
	padding: 2px var(--ts-space-2);
	background: var(--ts-color-surface-sunken);
	border-radius: var(--ts-radius-full);
	font-size: var(--ts-text-2xs);
	color: var(--ts-color-muted);
}

.ts-addresses__item.is-editing {
	border-color: var(--ts-color-primary);
	box-shadow: var(--ts-shadow-sm);
}

.ts-addresses__submit {
	display: flex;
	flex-wrap: wrap;
	gap: var(--ts-space-4);
	align-items: center;
}

/* --- Вибір способу доставки у формі адреси -------------------------------- */

.ts-addr-kinds {
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: var(--ts-space-3);
	margin: 0 0 var(--ts-space-5);
	padding: 0;
	border: 0;
}

.ts-addr-kinds__legend {
	margin-bottom: var(--ts-space-2);
	padding: 0;
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-medium);
	color: var(--ts-color-text);
}

.ts-addr-kinds__item {
	display: flex;
	gap: var(--ts-space-3);
	align-items: flex-start;
	/* 44px — мінімальна ціль дотику. */
	min-height: 44px;
	padding: var(--ts-space-3) var(--ts-space-4);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
	cursor: pointer;
}

.ts-addr-kinds__item:has(input:checked) {
	border-color: var(--ts-color-primary);
	box-shadow: inset 0 0 0 1px var(--ts-color-primary);
}

.ts-addr-kinds__name {
	display: block;
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

.ts-addr-kinds__note {
	display: block;
	margin-top: 2px;
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
}

/* --- Адреса власного кур'єра ---------------------------------------------- */

.ts-addr-own__title {
	margin: 0 0 var(--ts-space-3);
	font-size: var(--ts-text-md);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

/* Недоступний кур'єр Нової пошти: видно, але не обрати. */
.ts-np__kind.is-disabled {
	opacity: 0.55;
	cursor: not-allowed;
}

.ts-np__kind-note {
	display: block;
	margin-top: 2px;
	font-size: var(--ts-text-2xs);
	color: var(--ts-color-danger);
}

/* display вище перекриває атрибут hidden — ховаємо явно. */
.ts-np__kind-note[hidden] {
	display: none;
}

.ts-addresses__new {
	padding: var(--ts-space-4);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
}

.ts-addresses__new-toggle {
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
	cursor: pointer;
}

.ts-addresses__form {
	margin-top: var(--ts-space-4);
}

.ts-addresses__default {
	margin: var(--ts-space-3) 0;
}

.ts-account-empty-inline {
	margin: 0 0 var(--ts-space-5);
	padding: var(--ts-space-4);
	background: var(--ts-color-surface-sunken);
	border-radius: var(--ts-radius-lg);
	color: var(--ts-color-muted);
}

/* --- Checkout: вибір збереженої адреси ------------------------------------ */

.ts-addr-picker {
	margin-bottom: var(--ts-space-5);
}

.ts-addr-picker__head {
	display: flex;
	gap: var(--ts-space-3);
	align-items: center;
	margin-bottom: var(--ts-space-3);
}

.ts-addr-picker__icon {
	display: inline-flex;
	flex: none;
	align-items: center;
	justify-content: center;
	width: 40px;
	height: 40px;
	background: var(--ts-color-primary-soft);
	border-radius: var(--ts-radius-full);
	color: var(--ts-color-primary);
}

.ts-addr-picker__title {
	margin: 0;
	font-size: var(--ts-text-md);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

.ts-addr-picker__hint {
	margin: 2px 0 0;
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
}

.ts-addr-picker__list {
	display: flex;
	flex-direction: column;
	gap: var(--ts-space-2);
	margin: 0;
	padding: 0;
	list-style: none;
}

.ts-addr-picker__label {
	display: flex;
	gap: var(--ts-space-3);
	align-items: flex-start;
	/* 44px — мінімальна ціль дотику. */
	min-height: 44px;
	padding: var(--ts-space-3) var(--ts-space-4);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
	cursor: pointer;
}

.ts-addr-picker__item:has(input:checked) .ts-addr-picker__label {
	border-color: var(--ts-color-primary);
	box-shadow: inset 0 0 0 1px var(--ts-color-primary);
}

.ts-addr-picker__body {
	display: flex;
	flex-direction: column;
	gap: 2px;
	min-width: 0;
}

/* Логотип перевізника: видно, що адреса саме Нової пошти. */
.ts-addr-picker__logo {
	flex: 0 0 auto;
	width: 28px;
	height: 28px;
	object-fit: contain;
}

.ts-addr-picker__group[hidden] {
	display: none;
}

.ts-addr-picker__empty {
	margin: 0;
	padding: var(--ts-space-3) var(--ts-space-4);
	background: var(--ts-color-surface-sunken);
	border-radius: var(--ts-radius-lg);
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
}

.ts-addr-picker__empty[hidden] {
	display: none;
}

.ts-addr-picker__name {
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

.ts-addr-picker__text {
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
}

/*
 * Обрана збережена адреса — форма Нової пошти зайва. Ховаємо класом:
 * атрибутом hidden керує скрипт самого модуля.
 */
.ts-np.is-addr-chosen {
	display: none;
}

/* --- Кабінет: налаштування акаунта ---------------------------------------- */

/*
 * Форму WooCommerce не переписуємо — вона робоча; лише даємо їй ту саму
 * сітку й відступи, що й решті кабінету.
 */
.ts-account-page__content .edit-account .form-row,
.ts-account-page__content .woocommerce-EditAccountForm .form-row {
	/* flex, а не inline-flex: у сітці форми поле має займати всю комірку. */
	display: flex;
	flex-direction: column;
	gap: var(--ts-space-2);
	margin: 0 0 var(--ts-space-4);
	padding: 0;
	width: auto;
}

/*
 * Поля цієї форми малює WooCommerce власними класами
 * (.woocommerce-Input), тож правила для .ts-input їх не дістають —
 * лишалась нативна сіра рамка без заокруглення.
 */
.ts-account-page__content .edit-account input[type="text"],
.ts-account-page__content .edit-account input[type="email"],
.ts-account-page__content .edit-account input[type="tel"],
.ts-account-page__content .edit-account input[type="password"] {
	width: 100%;
	min-height: 48px;
	padding: var(--ts-space-3);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border-strong);
	border-radius: var(--ts-radius-md);
	font-family: var(--ts-font-sans);
	font-size: var(--ts-text-base);
	color: var(--ts-color-text);
}

.ts-account-page__content .edit-account input:focus {
	outline: none;
	border-color: var(--ts-color-primary);
	box-shadow: var(--ts-shadow-focus);
}

/* Кнопка збереження — та сама, що й у решті кабінету. */
.ts-account-page__content .edit-account .woocommerce-Button {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-height: 48px;
	padding: 0 var(--ts-space-5);
	background: var(--ts-color-primary);
	border: 0;
	border-radius: var(--ts-radius-md);
	font-family: var(--ts-font-sans);
	font-size: var(--ts-text-base);
	font-weight: var(--ts-weight-semibold);
	color: #fff;
	cursor: pointer;
}

.ts-account-page__content .edit-account .woocommerce-Button:hover {
	background: var(--ts-color-primary-hover);
}

.ts-account-page__content .edit-account fieldset {
	margin: var(--ts-space-5) 0 var(--ts-space-4);
	padding: var(--ts-space-4);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
}

.ts-account-page__content .edit-account legend {
	padding: 0 var(--ts-space-2);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

.ts-account-page__content .edit-account em {
	font-size: var(--ts-text-sm);
	font-style: normal;
	color: var(--ts-color-muted);
}

/* Поле пароля з кнопкою «показати». */
/*
 * Поле пароля з кнопкою «показати».
 *
 * Розмітку робить сам WooCommerce: його скрипт обгортає кожне поле
 * пароля в .password-input і додає туди .show-password-input. Ми лише
 * прибираємо його дефолтний вигляд і малюємо власну іконку.
 */
.password-input {
	position: relative;
	display: block;
}

/*
 * Місце під кнопку, щоб текст не заповз під неї. Селектор із типом
 * поля — інакше загальні правила для input перебивають цей padding.
 */
.password-input input[type="password"],
.password-input input[type="text"] {
	padding-right: 46px;
}

/*
 * Кнопка 44×44 — мінімальна ціль дотику, хоч іконка всередині 20px.
 * Псевдоелемент тут не підійшов би: він малює, але не ловить кліки за
 * межами боксу кнопки.
 */
.show-password-input {
	position: absolute;
	top: 50%;
	right: 2px;
	display: flex;
	align-items: center;
	justify-content: center;
	width: 44px;
	height: 44px;
	padding: 0;
	transform: translateY(-50%);
	background: none;
	border: 0;
	cursor: pointer;
}

.show-password-input::before {
	content: "";
	display: block;
	width: 20px;
	height: 20px;
	background: currentColor;
	color: var(--ts-color-muted);
	mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2'%3E%3Cpath d='M2 12s3.6-7 10-7 10 7 10 7-3.6 7-10 7-10-7-10-7z'/%3E%3Ccircle cx='12' cy='12' r='3'/%3E%3C/svg%3E") center / contain no-repeat;
}

/* Пароль видимий — око перекреслене, щоб стан читався без кольору. */
.show-password-input.display-password::before {
	color: var(--ts-color-primary);
	mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2'%3E%3Cpath d='M2 12s3.6-7 10-7 10 7 10 7-3.6 7-10 7-10-7-10-7z'/%3E%3Ccircle cx='12' cy='12' r='3'/%3E%3Cpath d='M3 3l18 18'/%3E%3C/svg%3E") center / contain no-repeat;
}

/*
 * 44px зона дотику навколо іконки: сама кнопка 24px, бо більша
 * візуально тиснула б на поле.
 */

/*
 * Ім'я і прізвище — поруч. Сітка на всю форму, бо між рядками WooCommerce
 * ставить <div class="clear">, і inline-block їх розносив по рядках.
 */
@media (min-width: 768px) {
	.ts-account-page__content .edit-account {
		display: grid;
		grid-template-columns: repeat(2, minmax(0, 1fr));
		gap: 0 var(--ts-space-4);
	}

	/* Усе, крім пари «ім'я — прізвище», займає обидві колонки. */
	.ts-account-page__content .edit-account > *:not(.form-row-first):not(.form-row-last) {
		grid-column: 1 / -1;
	}
}

/* Порожні розділювачі WooCommerce у сітці лише додають відступів. */
.ts-account-page__content .edit-account .clear {
	display: none;
}

/*
 * Налаштування акаунта — чотири картки, кожна зі своєю формою (див.
 * woocommerce/myaccount/form-edit-account.php). Вигляд — як картки
 * решти кабінету (огляд, замовлення): біле тло й тонка рамка. Сірі
 * підкладки тут виглядали чужими й темними поруч з іншими вкладками.
 */
.ts-settings {
	display: flex;
	flex-direction: column;
	gap: var(--ts-space-4);
}

.ts-settings__card {
	padding: var(--ts-space-5);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
}

.ts-settings__head {
	display: flex;
	gap: var(--ts-space-3);
	align-items: flex-start;
	margin-bottom: var(--ts-space-4);
}

.ts-settings__icon {
	display: inline-flex;
	flex: 0 0 auto;
	align-items: center;
	justify-content: center;
	width: 36px;
	height: 36px;
	background: var(--ts-color-primary-soft);
	border-radius: var(--ts-radius-full);
	color: var(--ts-color-primary);
}

.ts-settings__icon--telegram {
	background: var(--ts-color-telegram-soft);
	color: var(--ts-color-telegram-button);
}

.ts-settings__titles {
	display: flex;
	flex-direction: column;
	gap: 2px;
	min-width: 0;
	/* Вирівнюємо перший рядок із центром іконки 36px. */
	padding-top: 6px;
}

.ts-settings__title {
	margin: 0;
	font-size: var(--ts-text-md);
	font-weight: var(--ts-weight-semibold);
	line-height: 1.5;
	color: var(--ts-color-text-strong);
}

.ts-settings__note {
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
}

/* Поточне значення: email, прив'язаний Telegram. Довга адреса — переносом. */
.ts-settings__value {
	display: inline-flex;
	gap: var(--ts-space-2);
	align-items: center;
	font-size: var(--ts-text-base);
	color: var(--ts-color-text);
	overflow-wrap: anywhere;
}

.ts-settings__status {
	display: inline-flex;
	flex: 0 0 auto;
	align-items: center;
	justify-content: center;
	width: 18px;
	height: 18px;
	background: var(--ts-color-success-soft);
	border-radius: var(--ts-radius-full);
	color: var(--ts-color-success);
}

.ts-settings__hint {
	margin: 0;
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
}

/*
 * Сітка форми WooCommerce (.edit-account) на ширині від 768px ставить
 * поля у дві колонки; кнопку збереження тримаємо на всю ширину рядка,
 * але саму — за вмістом.
 */
.ts-settings__submit {
	margin: var(--ts-space-2) 0 0;
}

.ts-settings__form {
	display: flex;
	flex-direction: column;
	gap: var(--ts-space-4);
	max-width: 420px;
}

/* «Змінити» / «Додати email»: <details>, щоб працювало й без JS. */
.ts-settings__more > summary {
	list-style: none;
}

.ts-settings__more > summary::-webkit-details-marker {
	display: none;
}

.ts-settings__toggle {
	width: fit-content;
}

.ts-settings__toggle .ts-icon {
	transition: transform var(--ts-duration-fast) var(--ts-ease);
}

.ts-settings__more[open] > .ts-settings__toggle .ts-icon {
	transform: rotate(180deg);
}

.ts-settings__panel {
	margin-top: var(--ts-space-4);
}

/*
 * Кнопка Telegram у картці — за вмістом, а не на всю ширину, як на
 * екрані входу: тут вона одна з кількох дій сторінки, а не головна.
 */
.ts-settings__tg .ts-btn--telegram {
	width: auto;
}

/* --- Блок коду email (налаштування акаунта, сторінка «Дякуємо») ---------- */

.ts-email-code {
	max-width: 520px;
}

.ts-email-code__title {
	margin: 0 0 var(--ts-space-3);
	font-size: var(--ts-text-md);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

/* Поле й кнопка поруч; на вузькому екрані кнопка переноситься під поле. */
.ts-email-code__row {
	display: flex;
	flex-wrap: wrap;
	gap: var(--ts-space-2);
}

.ts-email-code__row .ts-input {
	flex: 1 1 220px;
	min-height: 48px;
}

.ts-email-code__row .ts-btn {
	flex: 0 0 auto;
	min-height: 48px;
}

.ts-email-code__sent {
	margin: 0 0 var(--ts-space-4);
	overflow-wrap: anywhere;
}

/* Код — крупно й розріджено, щоб шість цифр легко звірити з листом. */
.ts-email-code__code {
	font-size: var(--ts-text-lg);
	font-variant-numeric: tabular-nums;
	letter-spacing: 0.3em;
}

.ts-email-code__more {
	display: flex;
	flex-wrap: wrap;
	gap: var(--ts-space-2) var(--ts-space-5);
	margin-top: var(--ts-space-3);
}

.ts-email-code__more form {
	margin: 0;
}

/* Другорядні дії — текстом, але з повною зоною дотику 44px. */
.ts-email-code__link {
	display: inline-flex;
	align-items: center;
	min-height: 44px;
	padding: 0;
	background: none;
	border: 0;
	font-family: inherit;
	font-size: var(--ts-text-base);
	font-weight: var(--ts-weight-medium);
	color: var(--ts-color-primary);
	cursor: pointer;
}

.ts-email-code__link:hover {
	color: var(--ts-color-primary-hover);
	text-decoration: underline;
}

.ts-email-code__link:focus-visible {
	outline: 2px solid var(--ts-color-primary);
	outline-offset: 2px;
	border-radius: var(--ts-radius-sm);
}

.ts-email-code__link--muted {
	color: var(--ts-color-muted);
}

/* --- Кабінет: запити ------------------------------------------------------ */

.ts-leads {
	margin: 0;
	padding: 0;
	list-style: none;
}

.ts-leads__item {
	padding: var(--ts-space-4);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
}

.ts-leads__item + .ts-leads__item {
	margin-top: var(--ts-space-3);
}

.ts-leads__head {
	display: flex;
	flex-wrap: wrap;
	gap: var(--ts-space-2);
	align-items: baseline;
	justify-content: space-between;
}

.ts-leads__product {
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

.ts-leads__date,
.ts-leads__sku {
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
}

.ts-leads__sku {
	margin: var(--ts-space-2) 0 0;
}

.ts-leads__comment {
	margin: var(--ts-space-2) 0 0;
}

/* Відповідь менеджера з Telegram — під запитом, акцентною лінією зліва. */
.ts-leads__reply {
	margin-top: var(--ts-space-3);
	padding: var(--ts-space-3) var(--ts-space-4);
	border-left: 3px solid var(--ts-color-primary);
	background: var(--ts-color-surface-sunken);
	border-radius: 0 var(--ts-radius-md) var(--ts-radius-md) 0;
}

.ts-leads__reply-head {
	display: flex;
	flex-wrap: wrap;
	gap: var(--ts-space-2);
	margin: 0 0 var(--ts-space-1);
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

.ts-leads__reply-head time {
	font-weight: var(--ts-weight-regular);
	color: var(--ts-color-muted);
}

.ts-leads__reply-text {
	margin: 0;
}

.ts-account-empty {
	padding: var(--ts-space-6);
	text-align: center;
}

/* --- Мобільний ------------------------------------------------------------ */

@media (max-width: 767px) {
	.ts-auth__card {
		padding: var(--ts-space-4);
	}

	/*
	 * Дропдаун при наведенні на телефоні не має сенсу: іконка веде
	 * одразу в кабінет, як і решта панелей у хедері.
	 */
	.ts-account__menu {
		display: none;
	}

	/* 44px — мінімальна ціль дотику. */
	.ts-account__link,
	.ts-account-nav__link {
		min-height: 44px;
	}

	/*
	 * 16px проти автозуму iOS при фокусі. Селектори з .edit-account
	 * специфічніші за загальні, тому дублюємо їх тут.
	 */
	.ts-auth .ts-input,
	.ts-account-page .ts-input,
	.ts-account-page input[type="text"],
	.ts-account-page input[type="email"],
	.ts-account-page input[type="tel"],
	.ts-account-page input[type="password"],
	.ts-account-page__content .edit-account input[type="text"],
	.ts-account-page__content .edit-account input[type="email"],
	.ts-account-page__content .edit-account input[type="tel"],
	.ts-account-page__content .edit-account input[type="password"] {
		font-size: 16px;
	}

	/* Навігація над вмістом: колонка 260px на телефоні не поміщається. */
	.ts-account-page {
		grid-template-columns: 1fr;
		gap: var(--ts-space-4);
	}

	.ts-account-tiles,
	.ts-account-form__fields,
	.ts-addr-kinds {
		grid-template-columns: 1fr;
	}
}

/* --- Обране ------------------------------------------------------------- */

.ts-wishlist {
	display: flex;
	flex-direction: column;
	gap: var(--ts-space-3);
}

.ts-wishlist__item {
	display: grid;
	grid-template-columns: 72px minmax(0, 1fr) auto;
	gap: var(--ts-space-4);
	align-items: center;
	padding: var(--ts-space-3);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
	background: var(--ts-color-surface);
}

.ts-wishlist__media {
	display: block;
	aspect-ratio: 1 / 1;
	overflow: hidden;
	border-radius: var(--ts-radius-md);
}

.ts-wishlist__media img {
	width: 100%;
	height: 100%;
	object-fit: contain;
	mix-blend-mode: multiply;
}

.ts-wishlist__body {
	min-width: 0;
}

.ts-wishlist__title {
	display: block;
	margin-bottom: var(--ts-space-1);
	color: var(--ts-color-text-strong);
	font-weight: var(--ts-weight-medium);
	line-height: 1.35;
}

.ts-wishlist__meta {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: var(--ts-space-3);
	font-size: var(--ts-text-xs);
	color: var(--ts-color-faint);
}

.ts-wishlist__aside {
	display: flex;
	flex-direction: column;
	align-items: flex-end;
	gap: var(--ts-space-2);
	text-align: right;
}

.ts-wishlist__price {
	font-size: var(--ts-text-lg);
	font-weight: var(--ts-weight-bold);
	color: var(--ts-color-text-strong);
	white-space: nowrap;
}

.ts-wishlist__actions {
	display: flex;
	align-items: center;
	gap: var(--ts-space-3);
}

.ts-wishlist__remove {
	display: inline-flex;
	align-items: center;
	gap: var(--ts-space-1);
	padding: var(--ts-space-1);
	border: 0;
	background: none;
	color: var(--ts-color-muted);
	font-size: var(--ts-text-sm);
	cursor: pointer;
}

.ts-wishlist__remove:hover {
	color: var(--ts-color-danger, #d63638);
}

.ts-wishlist__remove.is-on .ts-icon {
	fill: currentColor;
	color: var(--ts-color-danger, #d63638);
}

/*
 * На вузьких екранах ціна й кнопки переїжджають під назву: три
 * колонки на 360px перетворюються на стовпчик із однієї літери.
 */
@media (max-width: 599px) {
	.ts-wishlist__item {
		grid-template-columns: 64px minmax(0, 1fr);
	}

	.ts-wishlist__aside {
		grid-column: 1 / -1;
		flex-direction: row;
		align-items: center;
		justify-content: space-between;
		text-align: left;
	}
}

/* --- Замовлення: список ---------------------------------------------- */

.ts-orders {
	display: grid;
	gap: var(--ts-space-3);
	margin: 0;
	padding: 0;
	list-style: none;
}

.ts-order-card {
	display: grid;
	gap: var(--ts-space-3);
	padding: var(--ts-space-4);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
	transition: border-color var(--ts-duration-fast) var(--ts-ease);
}

.ts-order-card:hover {
	border-color: var(--ts-color-border-strong);
}

.ts-order-card__head {
	display: flex;
	align-items: flex-start;
	justify-content: space-between;
	gap: var(--ts-space-3);
}

.ts-order-card__number {
	display: block;
	font-size: var(--ts-text-md);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

.ts-order-card__number:hover {
	color: var(--ts-color-primary);
	text-decoration: none;
}

.ts-order-card__date {
	display: block;
	margin-top: 2px;
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
}

/*
 * Мініатюри складу. Показуємо до чотирьох: далі рядок перетворюється
 * на стрічку, у якій нічого не розібрати, а «+N» читається одразу.
 */
.ts-order-card__items {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: var(--ts-space-2);
}

.ts-order-card__thumb {
	display: grid;
	place-items: center;
	width: 56px;
	height: 56px;
	padding: var(--ts-space-1);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-md);
}

.ts-order-card__thumb img {
	max-width: 100%;
	max-height: 100%;
	object-fit: contain;
}

.ts-order-card__more {
	display: grid;
	place-items: center;
	min-width: 56px;
	height: 56px;
	padding-inline: var(--ts-space-2);
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-muted);
	background: var(--ts-color-surface-sunken);
	border-radius: var(--ts-radius-md);
}

.ts-order-card__foot {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: space-between;
	gap: var(--ts-space-3);
	padding-top: var(--ts-space-3);
	border-top: 1px solid var(--ts-color-border);
}

.ts-order-card__count {
	display: block;
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
}

.ts-order-card__total {
	display: block;
	font-size: var(--ts-text-lg);
	font-weight: var(--ts-weight-bold);
	color: var(--ts-color-text-strong);
}

.ts-order-card__actions {
	display: flex;
	flex-wrap: wrap;
	gap: var(--ts-space-2);
}

.ts-orders__pager {
	display: flex;
	justify-content: space-between;
	gap: var(--ts-space-3);
	margin-top: var(--ts-space-4);
}

/* --- Статус замовлення ------------------------------------------------ */

/*
 * Кольором відрізняємо лише те, що вимагає уваги: решта станів —
 * нейтральні. Інакше сторінка з трьома замовленнями світиться,
 * як гірлянда, і жоден статус не читається як важливий.
 */
.ts-order-status {
	flex: 0 0 auto;
	padding: 4px var(--ts-space-3);
	font-size: var(--ts-text-xs);
	font-weight: var(--ts-weight-semibold);
	line-height: 1.6;
	white-space: nowrap;
	color: var(--ts-color-muted);
	background: var(--ts-color-surface-sunken);
	border-radius: var(--ts-radius-full);
}

.ts-order-status--on-hold,
.ts-order-status--pending {
	color: var(--ts-color-warning);
	background: var(--ts-color-warning-soft);
}

.ts-order-status--processing {
	color: var(--ts-color-info);
	background: var(--ts-color-info-soft);
}

.ts-order-status--shipped {
	color: var(--ts-color-info);
	background: var(--ts-color-info-soft);
}

/* Покупцю пора діяти — їхати по замовлення. */
.ts-order-status--ready-pickup {
	color: var(--ts-color-primary-contrast);
	background: var(--ts-color-primary);
}

.ts-order-status--completed {
	color: var(--ts-color-success);
	background: var(--ts-color-success-soft);
}

.ts-order-status--cancelled,
.ts-order-status--failed {
	color: var(--ts-color-danger);
	background: var(--ts-color-danger-soft);
}

/* --- Замовлення: одне ------------------------------------------------- */

/*
 * Номер замовлення — у заголовку сторінки (page.php), тут лише дата
 * й статус, тому вирівнюємо їх по одній лінії.
 */
.ts-order__head {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: var(--ts-space-3);
	margin-bottom: var(--ts-space-4);
}

.ts-order__meta {
	margin: 0;
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
}

.ts-order__hint {
	margin: 0 0 var(--ts-space-5);
	padding: var(--ts-space-3) var(--ts-space-4);
	font-size: var(--ts-text-sm);
	color: var(--ts-color-text);
	background: var(--ts-color-surface-sunken);
	border-radius: var(--ts-radius-md);
}

/* ТТН або адреса самовивозу під поясненням статусу. */
.ts-order-track {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: var(--ts-space-2) var(--ts-space-4);
	margin: 0 0 var(--ts-space-5);
	padding: var(--ts-space-4);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-md);
}

.ts-order-track__label {
	flex-basis: 100%;
	font-size: var(--ts-text-xs);
	color: var(--ts-color-muted);
}

.ts-order-track__value {
	font-size: var(--ts-text-lg);
	letter-spacing: 0.02em;
}

.ts-order-track__link {
	margin-left: auto;
	min-height: 44px;
}

.ts-order__section {
	margin-bottom: var(--ts-space-6);
}

.ts-order__subtitle {
	margin: 0 0 var(--ts-space-3);
	font-size: var(--ts-text-md);
	font-weight: var(--ts-weight-semibold);
}

.ts-order-items {
	margin: 0;
	padding: 0;
	list-style: none;
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
	overflow: hidden;
}

.ts-order-item {
	display: grid;
	grid-template-columns: 64px minmax(0, 1fr) auto auto;
	align-items: center;
	gap: var(--ts-space-3);
	padding: var(--ts-space-3) var(--ts-space-4);
	background: var(--ts-color-surface);
}

.ts-order-item + .ts-order-item {
	border-top: 1px solid var(--ts-color-border);
}

.ts-order-item__media {
	display: grid;
	place-items: center;
	width: 64px;
	height: 64px;
}

.ts-order-item__media img {
	max-width: 100%;
	max-height: 64px;
	object-fit: contain;
}

.ts-order-item__name {
	display: block;
	font-size: var(--ts-text-base);
	color: var(--ts-color-text-strong);
}

a.ts-order-item__name:hover {
	color: var(--ts-color-primary);
	text-decoration: none;
}

.ts-order-item__sku {
	display: block;
	margin-top: 2px;
	font-size: var(--ts-text-xs);
	color: var(--ts-color-faint);
}

.ts-order-item__qty {
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
	white-space: nowrap;
}

.ts-order-item__price {
	font-weight: var(--ts-weight-semibold);
	white-space: nowrap;
}

.ts-order-totals {
	display: grid;
	gap: var(--ts-space-2);
	margin: var(--ts-space-4) 0 0 auto;
	max-width: 360px;
}

.ts-order-totals__row {
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	gap: var(--ts-space-4);
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
}

.ts-order-totals__row dt,
.ts-order-totals__row dd {
	margin: 0;
}

.ts-order-totals__row.is-total {
	padding-top: var(--ts-space-2);
	border-top: 1px solid var(--ts-color-border);
	font-size: var(--ts-text-md);
	color: var(--ts-color-text-strong);
}

.ts-order-totals__row.is-total dd {
	font-size: var(--ts-text-lg);
	font-weight: var(--ts-weight-bold);
}

/* Дрібний підпис «Нова пошта» біля рядка доставки. */
.ts-order-totals .shipped_via {
	display: block;
	font-size: var(--ts-text-xs);
	color: var(--ts-color-faint);
}

.ts-order-customer {
	display: grid;
	gap: var(--ts-space-4);
	padding: var(--ts-space-4);
	background: var(--ts-color-surface-sunken);
	border-radius: var(--ts-radius-lg);
}

.ts-order-customer__address {
	margin: 0;
	font-style: normal;
	line-height: var(--ts-leading-relaxed);
}

.ts-order-customer__contacts {
	display: grid;
	gap: var(--ts-space-2);
	margin: 0;
	padding: 0;
	list-style: none;
}

.ts-order-customer__contacts li {
	display: flex;
	align-items: center;
	gap: var(--ts-space-2);
	font-size: var(--ts-text-sm);
}

.ts-order-customer__contacts .ts-icon {
	flex: 0 0 auto;
	color: var(--ts-color-faint);
}

.ts-order__note {
	margin: 0;
	padding: var(--ts-space-3) var(--ts-space-4);
	background: var(--ts-color-surface-sunken);
	border-radius: var(--ts-radius-md);
}

.ts-order-notes {
	display: grid;
	gap: var(--ts-space-3);
	margin: 0;
	padding: 0;
	list-style: none;
}

.ts-order-note {
	padding-left: var(--ts-space-4);
	border-left: 2px solid var(--ts-color-border);
}

.ts-order-note__date {
	display: block;
	font-size: var(--ts-text-xs);
	color: var(--ts-color-faint);
}

.ts-order-note__text p {
	margin: var(--ts-space-1) 0 0;
	font-size: var(--ts-text-sm);
}

.ts-order__back {
	display: flex;
	flex-wrap: wrap;
	gap: var(--ts-space-3);
	margin: var(--ts-space-6) 0 0;
}

/* --- Порожні стани в кабінеті ----------------------------------------- */

.ts-empty__icon {
	display: grid;
	place-items: center;
	width: 64px;
	height: 64px;
	margin: 0 auto var(--ts-space-4);
	color: var(--ts-color-faint);
	background: var(--ts-color-surface-sunken);
	border-radius: var(--ts-radius-full);
}

.ts-empty__action {
	margin-top: var(--ts-space-5);
}

/* Лічильник обраного в меню акаунта. */
.ts-account__count {
	margin-left: auto;
	padding: 1px var(--ts-space-2);
	font-size: var(--ts-text-2xs);
	font-weight: var(--ts-weight-bold);
	line-height: 1.7;
	color: var(--ts-color-primary);
	background: var(--ts-color-primary-soft);
	border-radius: var(--ts-radius-full);
}

.ts-account__count[hidden] {
	display: none;
}

@media (max-width: 600px) {
	/*
	 * На телефоні ціна переїжджає під назву: чотири колонки в 320px
	 * стискають назву товара до двох слів на рядок.
	 */
	.ts-order-item {
		grid-template-columns: 56px minmax(0, 1fr);
		row-gap: var(--ts-space-2);
	}

	.ts-order-item__media {
		width: 56px;
		height: 56px;
	}

	.ts-order-item__qty,
	.ts-order-item__price {
		grid-column: 2;
	}

	.ts-order-item__qty {
		grid-row: 2;
	}

	.ts-order-item__price {
		grid-row: 3;
	}

	.ts-order-totals {
		max-width: none;
	}

	.ts-order-card__foot {
		flex-direction: column;
		align-items: stretch;
	}

	.ts-order-card__actions .ts-btn {
		flex: 1 1 auto;
		justify-content: center;
	}
}

/* --- «@username прив'язано» у налаштуваннях ------------------------------- */

/*
 * Друга, помітна картка під звичайною зеленою плашкою. Не зникає сама —
 * лише хрестиком.
 */
.ts-tg-linked {
	display: flex;
	gap: var(--ts-space-3);
	align-items: center;
	margin-bottom: var(--ts-space-4);
	padding: var(--ts-space-4);
	background: var(--ts-color-telegram-soft);
	border: 1px solid var(--ts-color-telegram);
	border-radius: var(--ts-radius-lg);
}

.ts-tg-linked__icon {
	display: inline-flex;
	flex: 0 0 auto;
	align-items: center;
	justify-content: center;
	width: 44px;
	height: 44px;
	background: var(--ts-color-telegram);
	border-radius: var(--ts-radius-full);
	color: #fff;
}

.ts-tg-linked__body {
	flex: 1 1 auto;
	min-width: 0;
}

.ts-tg-linked__title {
	margin: 0;
	font-size: var(--ts-text-md);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
	overflow-wrap: anywhere;
}

.ts-tg-linked__text {
	margin: 2px 0 0;
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
}

/* 44×44 — мінімальна ціль дотику. */
.ts-tg-linked__close {
	display: inline-flex;
	flex: 0 0 auto;
	align-items: center;
	justify-content: center;
	align-self: flex-start;
	width: 44px;
	height: 44px;
	margin: calc(var(--ts-space-2) * -1) calc(var(--ts-space-2) * -1) 0 0;
	padding: 0;
	background: none;
	border: 0;
	border-radius: var(--ts-radius-full);
	color: var(--ts-color-muted);
	cursor: pointer;
}

.ts-tg-linked__close:hover {
	background: rgba(0, 0, 0, 0.05);
	color: var(--ts-color-text-strong);
}

.ts-tg-linked__close:focus-visible {
	outline: none;
	box-shadow: var(--ts-shadow-focus);
}

/* --- Вхід через Telegram -------------------------------------------------- */

/*
 * Кнопка стоїть над формами входу й реєстрації, під нею — «або».
 * Колір — синій Telegram, затемнений до контрасту AA з білим текстом
 * (див. --ts-color-telegram-button): покупець має впізнати знайому
 * кнопку, а не ще одну синю нашу.
 */
.ts-btn--telegram {
	background: var(--ts-color-telegram-button);
	border-color: transparent;
	color: #fff;
	font-size: var(--ts-text-md);
	box-shadow: var(--ts-shadow-xs);
}

.ts-btn--telegram:hover {
	background: var(--ts-color-telegram-button-hover);
	color: #fff;
}

.ts-btn--telegram:active {
	background: var(--ts-color-telegram-button-active);
}

.ts-btn--telegram:focus-visible {
	outline: 2px solid var(--ts-color-telegram-button-active);
	outline-offset: 2px;
	box-shadow: 0 0 0 5px var(--ts-color-telegram-ring);
}

.ts-btn--telegram .ts-icon {
	flex: none;
	/* Літачок оптично важчий праворуч — зсув на піксель вирівнює пару з текстом. */
	margin-left: -2px;
}

.ts-tg__or {
	display: flex;
	align-items: center;
	gap: var(--ts-space-3);
	margin: var(--ts-space-5) 0;
	font-size: var(--ts-text-sm);
	color: var(--ts-color-faint);
}

.ts-tg__or::before,
.ts-tg__or::after {
	content: "";
	flex: 1;
	height: 1px;
	background: var(--ts-color-border);
}

/* --- Вікно очікування ----------------------------------------------------- */

.ts-tg-modal {
	position: fixed;
	inset: 0;
	z-index: var(--ts-z-modal);
	display: flex;
	align-items: center;
	justify-content: center;
	padding: var(--ts-space-4);
}

/*
 * hidden мусить перемагати display кнопок і станів: .ts-btn ставить
 * inline-flex, і без цього «сховані» стани лишались би на екрані.
 */
.ts-tg-modal [hidden] {
	display: none !important;
}

.ts-tg-modal__backdrop {
	position: absolute;
	inset: 0;
	background: rgba(4, 22, 42, 0.55);
	opacity: 0;
	transition: opacity var(--ts-duration-slow) var(--ts-ease);
}

.ts-tg-modal__dialog {
	position: relative;
	z-index: 1;
	width: 100%;
	max-width: 400px;
	max-height: calc(100vh - var(--ts-space-8));
	max-height: calc(100dvh - var(--ts-space-8));
	overflow-y: auto;
	padding: var(--ts-space-8) var(--ts-space-6) var(--ts-space-5);
	background: var(--ts-color-surface);
	border-radius: var(--ts-radius-xl);
	box-shadow: var(--ts-shadow-lg);
	text-align: center;
	opacity: 0;
	transform: translateY(12px) scale(0.98);
	transition: opacity var(--ts-duration-slow) var(--ts-ease-out),
		transform var(--ts-duration-slow) var(--ts-ease-out);
}

/* Фокус на самій картці — запасний, коли в стані немає кнопок; рамка тут зайва. */
.ts-tg-modal__dialog:focus {
	outline: none;
}

.ts-tg-modal.is-open .ts-tg-modal__backdrop,
.ts-tg-modal.is-open .ts-tg-modal__dialog {
	opacity: 1;
}

.ts-tg-modal.is-open .ts-tg-modal__dialog {
	transform: none;
}

.ts-tg-modal__close {
	position: absolute;
	top: var(--ts-space-2);
	right: var(--ts-space-2);
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 44px;
	height: 44px;
	border-radius: var(--ts-radius-md);
	color: var(--ts-color-muted);
}

.ts-tg-modal__close:hover {
	background: var(--ts-color-surface-sunken);
	color: var(--ts-color-text);
}

.ts-tg-modal__logo {
	display: inline-flex;
	margin-bottom: var(--ts-space-3);
	border-radius: var(--ts-radius-full);
	box-shadow: 0 6px 16px var(--ts-color-telegram-ring);
}

.ts-tg-modal__title {
	margin: 0 0 var(--ts-space-5);
	font-size: var(--ts-text-xl);
	font-weight: var(--ts-weight-semibold);
	letter-spacing: var(--ts-tracking-tight);
	color: var(--ts-color-text-strong);
}

.ts-tg-modal__state {
	display: flex;
	flex-direction: column;
	align-items: center;
}

.ts-tg-modal__state .ts-btn {
	margin-top: var(--ts-space-1);
}

/*
 * QR у рамці, як фото-картка: білий код на білій модалці інакше не
 * читається як окремий об'єкт. Тиха зона — у самому SVG.
 */
.ts-tg-modal__qr {
	width: 216px;
	height: 216px;
	padding: var(--ts-space-1);
	background: #fff;
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
	box-shadow: var(--ts-shadow-sm);
}

.ts-tg-modal__qr-svg {
	display: block;
	width: 100%;
	height: 100%;
}

.ts-tg-modal__lead {
	margin: var(--ts-space-4) 0 var(--ts-space-1);
	font-size: var(--ts-text-md);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

.ts-tg-modal__text {
	max-width: 30ch;
	margin: 0 0 var(--ts-space-5);
	font-size: var(--ts-text-sm);
	line-height: var(--ts-leading-normal);
	color: var(--ts-color-muted);
}

.ts-tg-modal__message {
	margin: 0 0 var(--ts-space-5);
	font-size: var(--ts-text-md);
	line-height: var(--ts-leading-normal);
	color: var(--ts-color-text);
}

.ts-tg-modal__web {
	display: inline-flex;
	align-items: center;
	min-height: 44px;
	margin-top: var(--ts-space-1);
	padding: 0 var(--ts-space-3);
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-medium);
}

/* Підготовка заявки: коло, що крутиться. */
.ts-tg-modal__state[data-ts-tg-state="loading"] {
	padding: var(--ts-space-4) 0 var(--ts-space-2);
}

.ts-tg-modal__spinner {
	width: 36px;
	height: 36px;
	margin-bottom: var(--ts-space-4);
	border: 3px solid var(--ts-color-telegram-soft);
	border-top-color: var(--ts-color-telegram);
	border-radius: var(--ts-radius-full);
	animation: ts-tg-spin 0.8s linear infinite;
}

/*
 * «Чекаємо підтвердження»: м'яка пульсація точки, а не спінер — це
 * очікування людини, а не завантаження, і квапити не треба.
 */
.ts-tg-modal__wait {
	display: inline-flex;
	align-items: center;
	gap: var(--ts-space-3);
	margin: var(--ts-space-5) 0 0;
	padding: var(--ts-space-2) var(--ts-space-4);
	background: var(--ts-color-telegram-soft);
	border-radius: var(--ts-radius-full);
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-medium);
	color: var(--ts-color-text);
}

.ts-tg-modal__pulse {
	position: relative;
	flex: none;
	width: 8px;
	height: 8px;
	background: var(--ts-color-telegram);
	border-radius: var(--ts-radius-full);
}

.ts-tg-modal__pulse::after {
	content: "";
	position: absolute;
	inset: 0;
	border-radius: inherit;
	background: var(--ts-color-telegram);
	animation: ts-tg-pulse 1.8s var(--ts-ease-out) infinite;
}

.ts-tg-modal__done {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 56px;
	height: 56px;
	background: var(--ts-color-success-soft);
	border-radius: var(--ts-radius-full);
	color: var(--ts-color-success);
}

.ts-tg-modal__cancel {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 100%;
	min-height: 44px;
	margin-top: var(--ts-space-3);
	border-radius: var(--ts-radius-md);
	font-size: var(--ts-text-base);
	font-weight: var(--ts-weight-medium);
	color: var(--ts-color-muted);
}

.ts-tg-modal__cancel:hover {
	background: var(--ts-color-surface-sunken);
	color: var(--ts-color-text);
}

@keyframes ts-tg-spin {
	to {
		transform: rotate(360deg);
	}
}

@keyframes ts-tg-pulse {
	0% {
		opacity: 0.6;
		transform: scale(1);
	}

	100% {
		opacity: 0;
		transform: scale(3);
	}
}

/*
 * Телефон: «шторка» знизу, як інші модалки сайту. Великий палець
 * дістає кнопки, а вікно не стрибає посередині екрана.
 */
@media (max-width: 640px) {
	.ts-tg-modal {
		align-items: flex-end;
		padding: 0;
	}

	.ts-tg-modal__dialog {
		max-width: none;
		max-height: 92vh;
		max-height: 92dvh;
		padding: var(--ts-space-6) var(--ts-space-4) calc(var(--ts-space-4) + env(safe-area-inset-bottom, 0px));
		border-radius: var(--ts-radius-xl) var(--ts-radius-xl) 0 0;
		transform: translateY(100%);
	}

	.ts-tg-modal__title {
		font-size: var(--ts-text-lg);
	}
}

/* Без руху: вікно з'являється одразу, точка й коло стоять. */
@media (prefers-reduced-motion: reduce) {
	.ts-tg-modal__backdrop,
	.ts-tg-modal__dialog {
		transition: none;
	}

	.ts-tg-modal__spinner,
	.ts-tg-modal__pulse::after {
		animation: none;
	}

	.ts-tg-modal__pulse::after {
		opacity: 0;
	}
}

/* --- Кабінет: сповіщення в Telegram --------------------------------------- */

.ts-tg-prefs__text {
	margin: 0 0 var(--ts-space-4);
	color: var(--ts-color-muted);
}

.ts-tg-prefs__warn {
	margin: 0 0 var(--ts-space-4);
	padding: var(--ts-space-3) var(--ts-space-4);
	background: var(--ts-color-surface-sunken);
	border-radius: var(--ts-radius-md);
	font-size: var(--ts-text-sm);
}

.ts-tg-prefs__list {
	margin: 0 0 var(--ts-space-4);
	padding: 0;
	list-style: none;
}

.ts-tg-prefs__list li + li {
	border-top: 1px solid var(--ts-color-border);
}

/* Рядок про телефон, підтверджений через Telegram. */
.ts-tg-prefs__phone {
	display: flex;
	flex-wrap: wrap;
	gap: var(--ts-space-2) var(--ts-space-3);
	align-items: center;
	margin: 0 0 var(--ts-space-4);
	padding: var(--ts-space-3) var(--ts-space-4);
	font-size: var(--ts-text-sm);
	color: var(--ts-color-text);
	background: var(--ts-color-surface-sunken);
	border-radius: var(--ts-radius-md);
}

.ts-tg-prefs__phone:empty {
	display: none;
}

.ts-tg-prefs__phone .ts-icon {
	flex: 0 0 auto;
	color: var(--ts-color-success);
}

/* Уся смуга — ціль натискання (≥44 px на телефоні). */
.ts-tg-prefs__item {
	display: flex;
	gap: var(--ts-space-3);
	align-items: flex-start;
	min-height: 44px;
	padding: var(--ts-space-3) 0;
	cursor: pointer;
}

.ts-tg-prefs__item input {
	flex: 0 0 auto;
	width: 20px;
	height: 20px;
	margin: 2px 0 0;
	accent-color: var(--ts-color-primary);
}

.ts-tg-prefs__name {
	display: block;
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

.ts-tg-prefs__hint {
	display: block;
	margin: 0;
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
}

.ts-tg-prefs__actions {
	display: flex;
	flex-wrap: wrap;
	gap: var(--ts-space-3);
	margin-bottom: var(--ts-space-3);
}

.ts-tg-prefs__products {
	margin: var(--ts-space-3) 0 0;
	padding: 0;
	list-style: none;
}

.ts-tg-prefs__product {
	display: flex;
	gap: var(--ts-space-3);
	align-items: center;
	justify-content: space-between;
	padding: var(--ts-space-3) 0;
	border-top: 1px solid var(--ts-color-border);
}

.ts-tg-prefs__product-link {
	display: flex;
	gap: var(--ts-space-3);
	align-items: center;
	min-width: 0;
	color: var(--ts-color-text);
	text-decoration: none;
}

.ts-tg-prefs__product-link img {
	flex: 0 0 auto;
	width: 48px;
	height: 48px;
	object-fit: contain;
}

.ts-tg-prefs__product form {
	flex: 0 0 auto;
	margin: 0;
}

@media (max-width: 599px) {
	.ts-tg-prefs__actions .ts-btn {
		width: 100%;
	}

	.ts-tg-prefs__product .ts-btn {
		min-height: 44px;
	}
}

/*
 * Телефон: розділи кабінету — одна стрічка з горизонтальним гортанням.
 * Вертикальний список із восьми пунктів займав півтора екрана над
 * кожною сторінкою кабінету, і до самого замовлення треба було гортати.
 */
@media (max-width: 767px) {
	/* Елемент сітки інакше розтягується на ширину стрічки (min-width: auto). */
	.ts-account-nav {
		min-width: 0;
	}

	.ts-account-nav__list {
		display: flex;
		gap: var(--ts-space-2);
		margin: 0 calc(-1 * var(--ts-container-pad, 16px));
		padding: 0 var(--ts-container-pad, 16px) var(--ts-space-1);
		overflow-x: auto;
		background: none;
		border: 0;
		border-radius: 0;
		scroll-snap-type: x proximity;
		scroll-padding-inline: var(--ts-container-pad, 16px);
		scrollbar-width: none;
	}

	.ts-account-nav__list::-webkit-scrollbar {
		display: none;
	}

	.ts-account-nav__item {
		flex: none;
		scroll-snap-align: start;
	}

	.ts-account-nav__link {
		gap: var(--ts-space-2);
		padding: var(--ts-space-2) var(--ts-space-3);
		background: var(--ts-color-surface);
		border: 1px solid var(--ts-color-border);
		border-radius: var(--ts-radius-full);
		font-size: var(--ts-text-sm);
		white-space: nowrap;
	}

	.ts-account-nav__item.is-current .ts-account-nav__link {
		border-color: var(--ts-color-primary);
	}
}

/* --- Підтвердження дії (Confirm у main.js) ---------------------------- */

.ts-confirm__dialog {
	max-width: 380px;
	padding: var(--ts-space-5);
}

.ts-confirm__text {
	margin: 0 0 var(--ts-space-5);
	font-size: var(--ts-text-md);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

.ts-confirm__actions {
	display: flex;
	justify-content: flex-end;
	gap: var(--ts-space-3);
}

/* Незворотна дія (видалити) — червона кнопка. */
.ts-btn--danger {
	background: var(--ts-color-danger);
	border-color: var(--ts-color-danger);
	color: #fff;
}

.ts-btn--danger:hover,
.ts-btn--danger:focus-visible {
	background: var(--ts-color-danger);
	color: #fff;
	filter: brightness(0.92);
}

/* --- «Підтвердіть email» над розділами кабінету ---------------------------- */

/*
 * Непідтверджена адреса: листи йдуть, але Telegram не прив'язати.
 * Жовта, а не червона — це не помилка, а крок, який варто зробити.
 */
.ts-email-confirm {
	display: flex;
	gap: var(--ts-space-3);
	align-items: flex-start;
	margin-bottom: var(--ts-space-4);
	padding: var(--ts-space-4);
	background: var(--ts-color-warning-soft);
	border: 1px solid var(--ts-color-warning);
	border-radius: var(--ts-radius-lg);
}

.ts-email-confirm__icon {
	display: inline-flex;
	flex: 0 0 auto;
	align-items: center;
	justify-content: center;
	width: 44px;
	height: 44px;
	background: var(--ts-color-warning);
	border-radius: var(--ts-radius-full);
	color: #fff;
}

.ts-email-confirm__body {
	flex: 1 1 auto;
	min-width: 0;
}

.ts-email-confirm__title {
	margin: 0;
	font-size: var(--ts-text-md);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

.ts-email-confirm__text {
	margin: 2px 0 var(--ts-space-3);
	font-size: var(--ts-text-sm);
	color: var(--ts-color-muted);
	overflow-wrap: anywhere;
}

.ts-email-confirm__form {
	margin: 0;
}

/* Поле коду всередині плашки — на всю ширину її тіла. */
.ts-email-confirm .ts-email-code {
	max-width: none;
}

@media (max-width: 599px) {
	.ts-email-confirm__icon {
		display: none;
	}
}

/*
 * Порівняння товарів: кнопки в картці й на сторінці товару, іконка в
 * шапці, сторінка /porivniannia/ і спливне повідомлення (Toast).
 */

/* --- Кнопки ------------------------------------------------------------- */

/* Кружечок під серцем — той самий розмір і рамка. */
.ts-card__compare {
	position: absolute;
	top: calc(var(--ts-space-2) + 34px + var(--ts-space-2));
	right: var(--ts-space-2);
	z-index: 2;
	display: grid;
	place-items: center;
	width: 34px;
	height: 34px;
	padding: 0;
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-full);
	background: rgba(255, 255, 255, 0.92);
	color: var(--ts-color-muted);
	cursor: pointer;
	transition: color var(--ts-duration-fast) var(--ts-ease),
		border-color var(--ts-duration-fast) var(--ts-ease),
		background-color var(--ts-duration-fast) var(--ts-ease);
}

/* Зони дотику обраного й порівняння по 44px не мають заходити одна на одну. */
@media (pointer: coarse) {
	.ts-card__compare {
		top: calc(var(--ts-space-2) + 34px + var(--ts-space-2) + 2px);
	}
}

.ts-card__compare:hover {
	color: var(--ts-color-primary);
	border-color: var(--ts-color-primary);
}

/* У порівнянні — суцільний синій кружок: видно здалеку в сітці. */
.ts-card__compare.is-on {
	color: var(--ts-color-primary-contrast, #fff);
	border-color: var(--ts-color-primary);
	background: var(--ts-color-primary);
}

/*
 * На сторінці товару .is-on фарбує дію червоним і заливає іконку — це
 * для серця. Порівняння лишається синім і контурним.
 */
.ts-buybox__action[data-ts-compare].is-on {
	color: var(--ts-color-primary);
}

.ts-buybox__action[data-ts-compare].is-on .ts-icon {
	color: inherit;
	fill: none;
}

/* Шапка: лише іконка з лічильником. */
.ts-action--compare[hidden] {
	display: none;
}

/* На телефоні в шапці — тільки телефон і кошик; порівняння в меню. */
@media (max-width: 1023px) {
	.ts-header__main .ts-action--compare {
		display: none;
	}
}

/* Пункт у мобільному меню, над каталогом. */
.ts-mnav__compare {
	display: flex;
	align-items: center;
	gap: var(--ts-space-3);
	min-height: 52px;
	margin: var(--ts-space-2) var(--ts-space-4) var(--ts-space-3);
	padding: var(--ts-space-3) var(--ts-space-4);
	border-radius: var(--ts-radius-md);
	background: var(--ts-color-primary-soft);
	color: var(--ts-color-primary);
	font-weight: var(--ts-weight-semibold);
}

.ts-mnav__compare:hover {
	text-decoration: none;
}

.ts-mnav__compare[hidden] {
	display: none;
}

/* --- Сторінка ------------------------------------------------------------ */

.ts-cmp-page {
	padding-bottom: var(--ts-space-12);
}

.ts-cmp-page__head {
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	gap: var(--ts-space-2) var(--ts-space-4);
	margin-bottom: var(--ts-space-5);
}

.ts-cmp-page__head .ts-page__title {
	margin: 0;
}

.ts-cmp-page__count {
	margin: 0;
	color: var(--ts-color-muted);
}

/* Порожньо */
.ts-cmp-empty {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: var(--ts-space-3);
	max-width: 520px;
	margin: var(--ts-space-8) auto;
	padding: var(--ts-space-10) var(--ts-space-6);
	border: 1px dashed var(--ts-color-border-strong);
	border-radius: var(--ts-radius-xl);
	text-align: center;
}

.ts-cmp-empty__icon {
	display: grid;
	place-items: center;
	width: 80px;
	height: 80px;
	border-radius: var(--ts-radius-full);
	background: var(--ts-color-primary-soft);
	color: var(--ts-color-primary);
}

.ts-cmp-empty__title {
	margin: var(--ts-space-2) 0 0;
	font-size: var(--ts-text-xl);
}

.ts-cmp-empty__text {
	margin: 0 0 var(--ts-space-3);
	color: var(--ts-color-muted);
}

/* Категорії */
.ts-cmp-tabs {
	display: flex;
	gap: var(--ts-space-2);
	margin-bottom: var(--ts-space-4);
	overflow-x: auto;
	scrollbar-width: none;
}

.ts-cmp-tabs::-webkit-scrollbar {
	display: none;
}

.ts-cmp-tabs__item {
	display: inline-flex;
	flex: 0 0 auto;
	align-items: center;
	gap: var(--ts-space-2);
	min-height: 44px;
	padding: var(--ts-space-2) var(--ts-space-4);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-full);
	background: var(--ts-color-surface);
	color: var(--ts-color-text-strong);
	font-weight: var(--ts-weight-medium);
	white-space: nowrap;
}

.ts-cmp-tabs__item:hover {
	border-color: var(--ts-color-primary);
	text-decoration: none;
}

.ts-cmp-tabs__item.is-active {
	border-color: var(--ts-color-primary);
	background: var(--ts-color-primary);
	color: var(--ts-color-primary-contrast, #fff);
}

.ts-cmp-tabs__count {
	min-width: 22px;
	padding: 1px 7px;
	border-radius: var(--ts-radius-full);
	background: var(--ts-color-surface-sunken);
	color: var(--ts-color-muted);
	font-size: var(--ts-text-xs);
	font-weight: var(--ts-weight-semibold);
	text-align: center;
}

.ts-cmp-tabs__item.is-active .ts-cmp-tabs__count {
	background: rgba(255, 255, 255, 0.22);
	color: inherit;
}

/* Панель над таблицею */
.ts-cmp__toolbar {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: space-between;
	gap: var(--ts-space-3);
	margin-bottom: var(--ts-space-3);
}

.ts-cmp__diff {
	display: inline-flex;
	align-items: center;
	gap: var(--ts-space-3);
	min-height: 44px;
	font-weight: var(--ts-weight-medium);
	cursor: pointer;
	user-select: none;
}

.ts-cmp__diff input {
	position: absolute;
	opacity: 0;
	pointer-events: none;
}

.ts-cmp__switch {
	position: relative;
	flex: 0 0 auto;
	width: 40px;
	height: 24px;
	border-radius: var(--ts-radius-full);
	background: var(--ts-color-border-strong);
	transition: background-color var(--ts-duration-fast) var(--ts-ease);
}

.ts-cmp__switch::after {
	content: "";
	position: absolute;
	top: 3px;
	left: 3px;
	width: 18px;
	height: 18px;
	border-radius: 50%;
	background: #fff;
	box-shadow: var(--ts-shadow-sm);
	transition: transform var(--ts-duration-fast) var(--ts-ease);
}

.ts-cmp__diff input:checked + .ts-cmp__switch {
	background: var(--ts-color-primary);
}

.ts-cmp__diff input:checked + .ts-cmp__switch::after {
	transform: translateX(16px);
}

.ts-cmp__diff input:focus-visible + .ts-cmp__switch {
	box-shadow: var(--ts-shadow-focus);
}

.ts-cmp__diff.is-disabled {
	opacity: 0.5;
	cursor: not-allowed;
}

.ts-cmp__clear {
	display: inline-flex;
	align-items: center;
	gap: var(--ts-space-2);
	min-height: 44px;
	padding: 0 var(--ts-space-2);
	border: 0;
	background: none;
	color: var(--ts-color-muted);
	font: inherit;
	cursor: pointer;
}

.ts-cmp__clear:hover {
	color: var(--ts-color-danger);
}

/* --- Таблиця ------------------------------------------------------------- */

/*
 * Кожен рядок — окрема сітка з тими самими колонками: так рядок можна
 * сховати («Лише відмінності»), а колонки однакові в усіх рядках.
 * Ширина рядка — не менша за суму мінімальних колонок, тож при 5+
 * товарах таблиця гортається вбік, а назви лишаються ліворуч.
 */
.ts-cmp {
	--ts-cmp-label: 220px;
	--ts-cmp-col: 220px;
	position: relative;
}

.ts-cmp__scroller {
	container-type: inline-size;
	overflow-x: auto;
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-lg);
	background: var(--ts-color-surface);
	overscroll-behavior-x: contain;
	scroll-snap-type: x proximity;
}

.ts-cmp__scroller:focus-visible {
	outline: none;
	box-shadow: var(--ts-shadow-focus);
}

.ts-cmp__row {
	display: grid;
	grid-template-columns: var(--ts-cmp-label) repeat(var(--ts-cmp-cols), minmax(var(--ts-cmp-col), 1fr));
	width: max(100%, calc(var(--ts-cmp-label) + var(--ts-cmp-cols) * var(--ts-cmp-col)));
	border-bottom: 1px solid var(--ts-color-border);
}

.ts-cmp__row:last-child {
	border-bottom: 0;
}

/* Смуги через рядок — око не губить рядок у широкій таблиці. */
.ts-cmp__grid > .ts-cmp__row:nth-child(even):not(.ts-cmp__row--products) > * {
	background: var(--ts-color-surface-sunken);
}

.ts-cmp.is-diff .ts-cmp__row.is-same {
	display: none;
}

.ts-cmp__label {
	position: sticky;
	left: 0;
	z-index: 1;
	padding: var(--ts-space-3) var(--ts-space-4);
	border-right: 1px solid var(--ts-color-border);
	background: var(--ts-color-surface);
	color: var(--ts-color-muted);
	font-size: var(--ts-text-sm);
}

.ts-cmp__cell {
	padding: var(--ts-space-3) var(--ts-space-4);
	color: var(--ts-color-text-strong);
	font-size: var(--ts-text-sm);
	overflow-wrap: anywhere;
	scroll-snap-align: start;
}

.ts-cmp__cell + .ts-cmp__cell {
	border-left: 1px solid var(--ts-color-border);
}

.ts-cmp__none {
	color: var(--ts-color-faint);
}

/* Картки товарів угорі */
.ts-cmp__product {
	position: relative;
	display: flex;
	flex-direction: column;
	gap: var(--ts-space-2);
	padding-top: var(--ts-space-4);
	padding-bottom: var(--ts-space-4);
}

.ts-cmp__remove {
	position: absolute;
	top: var(--ts-space-2);
	right: var(--ts-space-2);
	z-index: 1;
	display: grid;
	place-items: center;
	width: 32px;
	height: 32px;
	padding: 0;
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-full);
	background: var(--ts-color-surface);
	color: var(--ts-color-muted);
	cursor: pointer;
}

.ts-cmp__remove:hover {
	border-color: var(--ts-color-danger);
	color: var(--ts-color-danger);
}

.ts-cmp__media {
	display: grid;
	place-items: center;
	aspect-ratio: 4 / 3;
	padding: var(--ts-space-2);
}

.ts-cmp__media img {
	width: 100%;
	height: 100%;
	object-fit: contain;
}

.ts-cmp__name {
	--ts-clamp-lines: 3;
	min-height: calc(3 * 1.35em);
	color: var(--ts-color-text-strong);
	font-weight: var(--ts-weight-medium);
	line-height: 1.35;
}

.ts-cmp__name:hover {
	color: var(--ts-color-primary);
	text-decoration: none;
}

.ts-cmp__product .ts-price {
	margin-top: auto;
}

.ts-cmp__product .ts-price__current {
	font-size: var(--ts-text-lg);
}

.ts-cmp__buy {
	width: 100%;
}

.ts-cmp__hint {
	margin: var(--ts-space-4) 0 0;
	color: var(--ts-color-muted);
}

/* Компактна шапка, що з'являється при прокрутці */
.ts-cmp__mini {
	position: fixed;
	z-index: var(--ts-z-sticky);
	overflow: hidden;
	border: 1px solid var(--ts-color-border);
	border-top: 0;
	border-radius: 0 0 var(--ts-radius-md) var(--ts-radius-md);
	background: var(--ts-color-surface);
	box-shadow: var(--ts-shadow-md);
	visibility: hidden;
	opacity: 0;
	transform: translateY(-6px);
	transition: opacity var(--ts-duration-fast) var(--ts-ease),
		transform var(--ts-duration-fast) var(--ts-ease),
		visibility 0s linear var(--ts-duration-fast);
}

.ts-cmp__mini.is-visible {
	visibility: visible;
	opacity: 1;
	transform: none;
	transition-delay: 0s;
}

.ts-cmp__row--mini {
	border-bottom: 0;
	will-change: transform;
}

.ts-cmp__mini-cell {
	display: flex;
	flex-direction: column;
	gap: 2px;
	padding-top: var(--ts-space-2);
	padding-bottom: var(--ts-space-2);
}

.ts-cmp__mini-name {
	overflow: hidden;
	font-size: var(--ts-text-xs);
	font-weight: var(--ts-weight-medium);
	text-overflow: ellipsis;
	white-space: nowrap;
}

.ts-cmp__mini-price {
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-bold);
}

/*
 * Планшет: колонка назв вужча.
 */
@media (max-width: 1023px) {
	.ts-cmp {
		--ts-cmp-label: 160px;
		--ts-cmp-col: 200px;
	}
}

/*
 * Телефон: дві колонки товарів на екран, назва характеристики —
 * окремим рядком над значеннями (на всю ширину, прилипає ліворуч при
 * прокрутці). Колонка назв збоку з'їла б третину й без того вузького
 * екрана.
 */
@media (max-width: 767px) {
	.ts-cmp {
		--ts-cmp-label: 0px;
		/*
		 * Рівно половина видимої частини таблиці (cqw — від ширини
		 * .ts-cmp__scroller). Через 100vw не сходилось на кілька пікселів:
		 * поля контейнера на різних ширинах різні.
		 */
		--ts-cmp-col: 50cqw;
	}

	.ts-cmp-page__head .ts-page__title {
		font-size: var(--ts-text-2xl);
	}

	.ts-cmp__row {
		grid-template-columns: repeat(var(--ts-cmp-cols), var(--ts-cmp-col));
		width: max(100%, calc(var(--ts-cmp-cols) * var(--ts-cmp-col)));
	}

	.ts-cmp__label {
		grid-column: 1 / -1;
		position: static;
		padding: var(--ts-space-2) 0 0;
		border-right: 0;
		background: none;
		font-size: var(--ts-text-xs);
	}

	/* Назва прилипає до лівого краю видимої частини, а не таблиці. */
	.ts-cmp__label span {
		position: sticky;
		left: 0;
		display: inline-block;
		padding-inline: var(--ts-space-3);
	}

	.ts-cmp__row--products .ts-cmp__label,
	.ts-cmp__row--mini .ts-cmp__label {
		display: none;
	}

	.ts-cmp__grid > .ts-cmp__row:nth-child(even):not(.ts-cmp__row--products) > * {
		background: none;
	}

	.ts-cmp__grid > .ts-cmp__row:nth-child(even):not(.ts-cmp__row--products) {
		background: var(--ts-color-surface-sunken);
	}

	.ts-cmp__cell {
		padding: var(--ts-space-1) var(--ts-space-3) var(--ts-space-3);
	}

	.ts-cmp__product {
		padding: var(--ts-space-3);
	}

	.ts-cmp__product .ts-price__current {
		font-size: var(--ts-text-md);
	}

	.ts-cmp__name {
		font-size: var(--ts-text-sm);
	}

	.ts-cmp__buy .ts-icon {
		display: none;
	}

	.ts-cmp__toolbar {
		gap: var(--ts-space-1);
	}
}

/* --- Спливне повідомлення ------------------------------------------------ */

/*
 * Унизу по центру; на телефоні — над нижньою панеллю (60px) і липкою
 * панеллю купівлі, якщо вона показана.
 */
.ts-toast {
	position: fixed;
	left: 50%;
	bottom: var(--ts-space-6);
	z-index: var(--ts-z-toast);
	display: flex;
	align-items: center;
	gap: var(--ts-space-4);
	max-width: min(480px, calc(100vw - 2 * var(--ts-space-4)));
	padding: var(--ts-space-3) var(--ts-space-3) var(--ts-space-3) var(--ts-space-5);
	border-radius: var(--ts-radius-lg);
	background: var(--ts-color-text-strong);
	box-shadow: var(--ts-shadow-lg);
	color: #fff;
	font-size: var(--ts-text-sm);
	visibility: hidden;
	opacity: 0;
	transform: translate(-50%, 12px);
	transition: opacity var(--ts-duration-base) var(--ts-ease),
		transform var(--ts-duration-base) var(--ts-ease),
		visibility 0s linear var(--ts-duration-base);
}

.ts-toast.is-visible {
	visibility: visible;
	opacity: 1;
	transform: translate(-50%, 0);
	transition-delay: 0s;
}

.ts-toast__text {
	flex: 1 1 auto;
	min-width: 0;
}

.ts-toast__link {
	flex: 0 0 auto;
	display: inline-flex;
	align-items: center;
	min-height: 36px;
	padding: 0 var(--ts-space-4);
	border-radius: var(--ts-radius-md);
	background: var(--ts-color-primary);
	color: #fff;
	font-weight: var(--ts-weight-semibold);
	white-space: nowrap;
}

.ts-toast__link:hover {
	background: var(--ts-color-primary-hover);
	color: #fff;
	text-decoration: none;
}

@media (max-width: 1023px) {
	.ts-toast {
		bottom: calc(60px + env(safe-area-inset-bottom, 0px) + var(--ts-space-3));
	}

	body:has(.ts-sticky-buy.is-visible) .ts-toast {
		bottom: calc(60px + 73px + env(safe-area-inset-bottom, 0px) + var(--ts-space-3));
	}
}

@media (prefers-reduced-motion: reduce) {
	.ts-toast,
	.ts-cmp__mini {
		transition: none;
	}
}

/*
TopShop — віджет Binotel «Передзвонимо за 30 секунд»

Віджет малює свою форму прямо в нашій сторінці (#bingc-passive), тож
переодягаємо її в нашу модалку. Власну кнопку й смугу-запрошення Binotel
вимкнено налаштуваннями (inc/assets.php), форму відкриває наша кнопка
над «Зв'язатися» (template-parts/common/contact-fab.php).

Стилі Binotel — #id + ланцюжок класів, частина з !important. Тому тут
усе з префіксом «html body #bingc-passive.bingc-passive» і з !important:
інакше їхні правила перемагають. Якщо Binotel перейменує класи, форма
повернеться до їхнього вигляду, але працюватиме.
*/

/* --- Наша кнопка над «Зв'язатися» ---------------------------------------- */

.ts-fab__call {
	position: relative;
	display: grid;
	place-items: center;
	/* Розмір — як у «Зв'язатися» під нею (.ts-fab__btn). */
	width: 60px;
	height: 60px;
	padding: 0;
	/* Червоний градієнт бренду — як «Швидке замовлення» (.ts-btn--accent). */
	color: #fff;
	background: var(--ts-color-accent);
	background-image: var(--ts-gradient-accent);
	border: 0;
	border-radius: var(--ts-radius-full);
	box-shadow: 0 8px 20px rgba(200, 1, 15, 0.28), 0 2px 6px rgba(10, 37, 64, 0.12);
	cursor: pointer;
	transition: transform var(--ts-duration-fast) var(--ts-ease), box-shadow var(--ts-duration-fast) var(--ts-ease);
}

/* Трубка суцільна біла: контур на градієнті виглядав блідо. */
.ts-fab__call .ts-icon {
	fill: currentColor;
}

.ts-fab__call[hidden] {
	display: none;
}

.ts-fab__call:hover {
	background-image: var(--ts-gradient-accent-hover);
	transform: translateY(-2px);
	box-shadow: 0 10px 24px rgba(200, 1, 15, 0.34), 0 2px 6px rgba(10, 37, 64, 0.14);
}

.ts-fab__call:focus-visible {
	outline: 3px solid var(--ts-color-primary-soft);
	outline-offset: 3px;
}

/* «30 с» — щоб з першого погляду відрізнялась від «Зв'язатися». */
.ts-fab__call-badge {
	position: absolute;
	top: -6px;
	right: -8px;
	min-width: 28px;
	padding: 2px 6px;
	font-size: 11px;
	font-weight: var(--ts-weight-semibold);
	line-height: 14px;
	/* Біла плашка на червоній кнопці — синя поруч із червоним рябіла. */
	color: var(--ts-color-accent);
	background: var(--ts-color-surface);
	border: 2px solid var(--ts-color-accent);
	border-radius: var(--ts-radius-full);
	white-space: nowrap;
}

/* Підпис ліворуч від кнопки: на комп'ютері — при наведенні й фокусі. */
.ts-fab__call-label {
	position: absolute;
	top: 50%;
	right: calc(100% + 12px);
	padding: 6px 12px;
	font-size: var(--ts-text-sm);
	font-weight: var(--ts-weight-medium);
	color: var(--ts-color-surface);
	background: var(--ts-color-text-strong);
	border-radius: var(--ts-radius-md);
	white-space: nowrap;
	opacity: 0;
	transform: translate(6px, -50%);
	transition: opacity var(--ts-duration-fast) var(--ts-ease), transform var(--ts-duration-fast) var(--ts-ease);
	pointer-events: none;
}

.ts-fab__call:hover .ts-fab__call-label,
.ts-fab__call:focus-visible .ts-fab__call-label {
	opacity: 1;
	transform: translate(0, -50%);
}

/* Відкрита панель «Зв'язатися» — кнопка не стирчить між панеллю й хрестиком. */
.ts-fab:has(.ts-fab__panel:not([hidden])) .ts-fab__call {
	display: none;
}

@media (hover: none) {
	.ts-fab__call-label {
		display: none;
	}
}

/* Телефон: «Зв'язатися» там 52px — і ця теж. */
@media (max-width: 1023px) {
	.ts-fab__call {
		width: 52px;
		height: 52px;
	}
}

/* --- Форма Binotel як наша модалка ---------------------------------------- */

html body #bingc-passive.bingc-passive {
	position: fixed !important;
	inset: 0 !important;
	top: 0 !important;
	width: auto !important;
	height: 100% !important;
	z-index: var(--ts-z-modal) !important;
	display: flex !important;
	align-items: center !important;
	justify-content: center !important;
	padding: var(--ts-space-4) !important;
	font-family: var(--ts-font-sans) !important;
}

html body #bingc-passive.bingc-passive.bingc-passive-closed {
	display: none !important;
}

html body #bingc-passive.bingc-passive div.bingc-passive-background {
	position: fixed !important;
	inset: 0 !important;
	z-index: 0 !important;
	background: rgba(4, 22, 42, 0.5) !important;
}

html body #bingc-passive.bingc-passive div.bingc-passive-overlay {
	position: relative !important;
	top: auto !important;
	z-index: 1 !important;
	width: 100% !important;
	max-width: 440px !important;
	height: auto !important;
	max-height: calc(100vh - var(--ts-space-8)) !important;
	padding: var(--ts-space-6) var(--ts-space-5) var(--ts-space-4) !important;
	overflow-y: auto !important;
	background: var(--ts-color-surface) !important;
	border-radius: var(--ts-radius-xl) !important;
	box-shadow: var(--ts-shadow-lg) !important;
}

html body #bingc-passive.bingc-passive div.bingc-passive-overlay div.bingc-passive-content {
	max-width: none !important;
	margin: 0 !important;
	padding: 0 !important;
}

/*
 * Легкий акцент зверху: м'який відтінок бренду переходить у білий —
 * модалка не «голий» білий прямокутник, але й не банер.
 */
html body #bingc-passive.bingc-passive div.bingc-passive-overlay {
	background: linear-gradient(180deg, var(--ts-color-primary-soft) 0, var(--ts-color-surface) 140px) var(--ts-color-surface) !important;
}

/* Заголовок «Передзвонимо вам за 30 секунд»: значок ліворуч, текст праворуч. */
html body #bingc-passive.bingc-passive div.bingc-passive-overlay div.bingc-passive-content div.bingc-we-will-call-you {
	position: relative !important;
	min-height: 48px !important;
	padding: 0 var(--ts-space-8) 0 64px !important;
	font: var(--ts-weight-semibold) var(--ts-text-xl) / 1.3 var(--ts-font-sans) !important;
	color: var(--ts-color-text-strong) !important;
	text-align: left !important;
}

/* Значок: телефон, а в неробочий час — годинник. */
html body #bingc-passive.bingc-passive div.bingc-passive-overlay div.bingc-passive-content div.bingc-we-will-call-you::before {
	content: "";
	position: absolute;
	top: 0;
	left: 0;
	width: 48px;
	height: 48px;
	background:
		url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72c.13.96.36 1.9.7 2.81a2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45c.91.34 1.85.57 2.81.7A2 2 0 0 1 22 16.92z'/%3E%3C/svg%3E") center / 22px no-repeat,
		var(--ts-color-primary);
	border-radius: var(--ts-radius-lg);
	box-shadow: 0 6px 16px -6px var(--ts-color-primary);
}

html body #bingc-passive.bingc-passive div.bingc-passive-overlay div.bingc-passive-content div.bingc-we-will-call-you.bingc-offline-form::before {
	background:
		url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M12 7v5l3 2'/%3E%3C/svg%3E") center / 24px no-repeat,
		var(--ts-color-primary);
}

/* Неробочий час: «На жаль, зараз у нас неробочий час.» — плашка над заголовком. */
html body #bingc-passive.bingc-passive div.bingc-passive-overlay div.bingc-passive-content div.bingc-we-will-call-you.bingc-offline-form span.small-text:first-child {
	display: flex !important;
	align-items: center !important;
	gap: 6px !important;
	width: fit-content !important;
	margin: 0 0 var(--ts-space-2) !important;
	padding: 3px 10px 3px 8px !important;
	font: var(--ts-weight-semibold) var(--ts-text-xs) / 1.4 var(--ts-font-sans) !important;
	color: var(--ts-color-warning) !important;
	background: var(--ts-color-warning-soft) !important;
	border-radius: var(--ts-radius-full) !important;
}

html body #bingc-passive.bingc-passive div.bingc-passive-overlay div.bingc-passive-content div.bingc-we-will-call-you.bingc-offline-form span.small-text:first-child::before {
	content: "";
	width: 6px;
	height: 6px;
	background: currentColor;
	border-radius: 50%;
}

/* Плашка й так стоїть окремим рядком — <br> Binotel дав би зайвий відступ. */
html body #bingc-passive.bingc-passive div.bingc-passive-overlay div.bingc-passive-content div.bingc-we-will-call-you.bingc-offline-form br {
	display: none !important;
}

/* Пояснення в неробочий час — що станеться далі. */
html body #bingc-passive.bingc-passive div.bingc-passive-overlay div.bingc-passive-content div.bingc-we-will-call-you.bingc-offline-form::after {
	content: "Оберіть зручний час — менеджер сам вам зателефонує. Дзвінок для вас безкоштовний.";
	display: block;
	margin-top: var(--ts-space-1);
	font: var(--ts-weight-regular) var(--ts-text-sm) / 1.45 var(--ts-font-sans);
	color: var(--ts-color-muted);
}

html body #bingc-passive.bingc-passive div.bingc-passive-overlay div.bingc-passive-content div.bingc-we-will-call-you * {
	font: inherit !important;
	color: inherit !important;
	text-align: left !important;
}

html body #bingc-passive.bingc-passive div.bingc-passive-overlay div.bingc-passive-content div.bingc-we-will-call-you div.bingc-we-will-call-you-alignment {
	display: block !important;
	width: auto !important;
	height: auto !important;
}

html body #bingc-passive.bingc-passive div.bingc-passive-overlay div.bingc-passive-content div.bingc-we-will-call-you div.bingc-we-will-call-you-alignment div.bingc-we-will-call-you-restriction {
	max-height: none !important;
	overflow: visible !important;
}

/* Пояснення під заголовком — чим це відрізняється від «Замовити дзвінок». */
html body #bingc-passive.bingc-passive div.bingc-passive-overlay div.bingc-passive-content div.bingc-we-will-call-you:not(.bingc-offline-form)::after {
	content: "Залиште номер — і ми самі зателефонуємо вам протягом 30 секунд. Для вас дзвінок безкоштовний.";
	display: block;
	margin-top: var(--ts-space-2);
	font: var(--ts-weight-regular) var(--ts-text-sm) / 1.45 var(--ts-font-sans);
	color: var(--ts-color-muted);
}

html body #bingc-passive.bingc-passive div.bingc-passive-overlay div.bingc-passive-content div.bingc-we-will-call-you.bingc-offline-form span.small-text {
	display: block !important;
	margin-top: var(--ts-space-2) !important;
	padding: 0 !important;
	font: var(--ts-weight-regular) var(--ts-text-sm) / 1.45 var(--ts-font-sans) !important;
	color: var(--ts-color-muted) !important;
}

/* Форма: поле й кнопка на всю ширину, як у наших формах. */
html body #bingc-passive.bingc-passive div.bingc-passive-overlay div.bingc-passive-content div.bingc-passive-get-phone-form {
	margin-top: var(--ts-space-5) !important;
	padding: 0 !important;
}

html body #bingc-passive.bingc-passive div.bingc-passive-overlay div.bingc-passive-content div.bingc-passive-get-phone-form form.bingc-passive-get-phone-form {
	display: flex !important;
	flex-direction: column !important;
	gap: var(--ts-space-3) !important;
}

html body #bingc-passive.bingc-passive div.bingc-passive-overlay div.bingc-passive-content div.bingc-passive-get-phone-form form.bingc-passive-get-phone-form div.bingc-passive-get-phone-form-input-border,
html body #bingc-passive.bingc-passive div.bingc-passive-overlay div.bingc-passive-content div.bingc-passive-get-phone-form form.bingc-passive-get-phone-form span.bingc-sample-countdown-timer {
	display: none !important;
}

html body #bingc-passive.bingc-passive div.bingc-passive-overlay div.bingc-passive-content div.bingc-passive-get-phone-form form.bingc-passive-get-phone-form input.bingc-passive-get-phone-form-input {
	display: block !important;
	width: 100% !important;
	height: 48px !important;
	padding: 0 var(--ts-space-3) !important;
	/* 16px — менше iOS збільшує сторінку при фокусі. */
	font: var(--ts-weight-regular) 16px / 1.4 var(--ts-font-sans) !important;
	color: var(--ts-color-text) !important;
	background: var(--ts-color-surface) !important;
	border: 1px solid var(--ts-color-border-strong) !important;
	border-radius: var(--ts-radius-md) !important;
	transition: border-color var(--ts-duration-fast) var(--ts-ease), box-shadow var(--ts-duration-fast) var(--ts-ease) !important;
}

html body #bingc-passive.bingc-passive div.bingc-passive-overlay div.bingc-passive-content div.bingc-passive-get-phone-form form.bingc-passive-get-phone-form input.bingc-passive-get-phone-form-input:focus {
	border-color: var(--ts-color-primary) !important;
	box-shadow: 0 0 0 3px var(--ts-color-primary-soft) !important;
}

html body #bingc-passive.bingc-passive div.bingc-passive-overlay div.bingc-passive-content div.bingc-passive-get-phone-form form.bingc-passive-get-phone-form input.bingc-passive-get-phone-form-input.warning {
	border-color: var(--ts-color-danger) !important;
}

html body #bingc-passive.bingc-passive div.bingc-passive-overlay div.bingc-passive-content div.bingc-passive-get-phone-form form.bingc-passive-get-phone-form input.bingc-passive-get-phone-form-input::placeholder {
	font: var(--ts-weight-regular) 16px / 1.4 var(--ts-font-sans) !important;
	color: var(--ts-color-faint) !important;
}

html body #bingc-passive.bingc-passive div.bingc-passive-overlay div.bingc-passive-content div.bingc-passive-get-phone-form form.bingc-passive-get-phone-form a.bingc-passive-phone-form-button {
	display: flex !important;
	align-items: center !important;
	justify-content: center !important;
	width: 100% !important;
	height: 48px !important;
	margin: 0 !important;
	font: var(--ts-weight-semibold) var(--ts-text-base) / 1 var(--ts-font-sans) !important;
	color: var(--ts-color-primary-contrast) !important;
	background: var(--ts-color-primary) !important;
	border-radius: var(--ts-radius-md) !important;
	transition: background-color var(--ts-duration-fast) var(--ts-ease) !important;
}

html body #bingc-passive.bingc-passive div.bingc-passive-overlay div.bingc-passive-content div.bingc-passive-get-phone-form form.bingc-passive-get-phone-form a.bingc-passive-phone-form-button:hover {
	background: var(--ts-color-primary-hover) !important;
}

/*
 * Приклад Binotel «067 000 00 00» — не про наш формат (+380, маска з
 * main.js), тож ховаємо: підказка тепер у самому полі.
 */
html body #bingc-passive.bingc-passive div.bingc-passive-overlay div.bingc-passive-content div.bingc-phone-sample {
	display: none !important;
}

/* Наша помилка під формою — та сама перевірка, що в «Замовити дзвінок». */
html body #bingc-passive.bingc-passive div.bingc-passive-overlay div.bingc-passive-content p.ts-binotel-error {
	margin: var(--ts-space-2) 0 0 !important;
	font: var(--ts-weight-regular) var(--ts-text-sm) / 1.4 var(--ts-font-sans) !important;
	color: var(--ts-color-danger) !important;
}

/*
 * «Вільних менеджерів зараз: 5 / Сьогодні вже передзвонили: 10+» — живі
 * цифри з Binotel: видно, що на тому боці справді хтось є.
 */
html body #bingc-passive.bingc-passive div.bingc-passive-overlay div.bingc-passive-content div.bingc-statistics {
	position: relative !important;
	margin: var(--ts-space-4) 0 0 !important;
	padding: var(--ts-space-3) var(--ts-space-3) var(--ts-space-3) calc(var(--ts-space-3) + 18px) !important;
	opacity: 1 !important;
	font: var(--ts-weight-regular) var(--ts-text-sm) / 1.5 var(--ts-font-sans) !important;
	color: var(--ts-color-text) !important;
	background: var(--ts-color-surface-sunken) !important;
	border-radius: var(--ts-radius-md) !important;
}

/* Зелена позначка «на лінії» з м'якою пульсацією. */
html body #bingc-passive.bingc-passive div.bingc-passive-overlay div.bingc-passive-content div.bingc-statistics::before {
	content: "";
	position: absolute;
	top: calc(var(--ts-space-3) + 6px);
	left: var(--ts-space-3);
	width: 8px;
	height: 8px;
	background: #16a34a;
	border-radius: 50%;
	box-shadow: 0 0 0 0 rgba(22, 163, 74, 0.45);
	animation: ts-binotel-online 2s ease-out infinite;
}

@keyframes ts-binotel-online {
	0% {
		box-shadow: 0 0 0 0 rgba(22, 163, 74, 0.45);
	}

	70%,
	100% {
		box-shadow: 0 0 0 7px rgba(22, 163, 74, 0);
	}
}

@media (prefers-reduced-motion: reduce) {
	html body #bingc-passive.bingc-passive div.bingc-passive-overlay div.bingc-passive-content div.bingc-statistics::before {
		animation: none;
	}
}

/* Стани після надсилання: «уже телефонуємо», відлік, «передзвонимо пізніше», помилка. */
html body #bingc-passive.bingc-passive div.bingc-passive-overlay div.bingc-passive-content div.bingc-we-already-call-you,
html body #bingc-passive.bingc-passive div.bingc-passive-overlay div.bingc-passive-content div.bingc-we-will-call-you-later,
html body #bingc-passive.bingc-passive div.bingc-passive-overlay div.bingc-passive-content div.bingc-something-went-wrong {
	max-width: none !important;
	margin: 0 !important;
	padding: var(--ts-space-4) var(--ts-space-6) var(--ts-space-2) !important;
	font: var(--ts-weight-semibold) var(--ts-text-lg) / 1.35 var(--ts-font-sans) !important;
	color: var(--ts-color-text-strong) !important;
	text-align: center !important;
}

html body #bingc-passive.bingc-passive div.bingc-passive-overlay div.bingc-passive-content div.bingc-we-will-call-you-later span.small-text {
	display: block !important;
	padding: var(--ts-space-2) 0 0 !important;
	font: var(--ts-weight-regular) var(--ts-text-sm) / 1.45 var(--ts-font-sans) !important;
	color: var(--ts-color-muted) !important;
}

html body #bingc-passive.bingc-passive div.bingc-passive-overlay div.bingc-passive-content div.bingc-passive-countdown-timer {
	padding: var(--ts-space-2) 0 var(--ts-space-4) !important;
	font: var(--ts-weight-semibold) 40px / 1.1 var(--ts-font-sans) !important;
	font-variant-numeric: tabular-nums;
	color: var(--ts-color-primary) !important;
	text-align: center !important;
}

/*
 * Неробочий час: «Передзвонимо вам о 09 : 00, завтра». Замість синіх
 * плиток Binotel — три поля як наші select: година, хвилини, день.
 * Список відкривається, коли Binotel ставить полю клас «…-hover».
 */
html body #bingc-passive.bingc-passive [class*="date-selection"],
html body #bingc-passive.bingc-passive [class*="date-selection"] * {
	font-family: var(--ts-font-sans) !important;
}

html body #bingc-passive.bingc-passive div.bingc-passive-get-phone-form-date-selection {
	display: flex !important;
	gap: var(--ts-space-2) !important;
	height: auto !important;
	margin: var(--ts-space-3) 0 0 !important;
	padding: 0 !important;
}

/* Clearfix Binotel у flex-ряду став би порожнім елементом із відступом. */
html body #bingc-passive.bingc-passive div.bingc-passive-get-phone-form-date-selection::before,
html body #bingc-passive.bingc-passive div.bingc-passive-get-phone-form-date-selection::after {
	display: none !important;
}

html body #bingc-passive #bingc-passive-date-selection-select-hour,
html body #bingc-passive #bingc-passive-date-selection-select-minutes,
html body #bingc-passive #bingc-passive-date-selection-select-day {
	position: relative !important;
	float: none !important;
	display: flex !important;
	align-items: center !important;
	flex: 0 0 84px !important;
	width: auto !important;
	height: 48px !important;
	margin: 0 !important;
	padding: 0 32px 0 var(--ts-space-3) !important;
	color: var(--ts-color-text) !important;
	background: var(--ts-color-surface) !important;
	border: 1px solid var(--ts-color-border-strong) !important;
	border-radius: var(--ts-radius-md) !important;
	cursor: pointer !important;
	transition: border-color var(--ts-duration-fast) var(--ts-ease), box-shadow var(--ts-duration-fast) var(--ts-ease) !important;
}

html body #bingc-passive #bingc-passive-date-selection-select-day {
	flex: 1 1 auto !important;
}

html body #bingc-passive #bingc-passive-date-selection-select-hour:hover,
html body #bingc-passive #bingc-passive-date-selection-select-minutes:hover,
html body #bingc-passive #bingc-passive-date-selection-select-day:hover {
	border-color: var(--ts-color-primary) !important;
}

html body #bingc-passive .bingc-passive-date-selection-select-hour-hover#bingc-passive-date-selection-select-hour,
html body #bingc-passive .bingc-passive-date-selection-select-minutes-hover#bingc-passive-date-selection-select-minutes,
html body #bingc-passive .bingc-passive-date-selection-select-day-hover#bingc-passive-date-selection-select-day {
	border-color: var(--ts-color-primary) !important;
	box-shadow: 0 0 0 3px var(--ts-color-primary-soft) !important;
}

/* Вибране значення: 09, 00, «Завтра». */
html body #bingc-passive #bingc-passive-date-selection-selected-hour,
html body #bingc-passive #bingc-passive-date-selection-selected-minutes,
html body #bingc-passive #bingc-passive-date-selection-selected-day {
	display: block !important;
	width: auto !important;
	height: auto !important;
	margin: 0 !important;
	padding: 0 !important;
	font: var(--ts-weight-semibold) var(--ts-text-base) / 1 var(--ts-font-sans) !important;
	font-variant-numeric: tabular-nums;
	color: var(--ts-color-text-strong) !important;
	text-align: left !important;
	white-space: nowrap !important;
}

/* Стрілка — шеврон select праворуч, як у наших полях. */
html body #bingc-passive.bingc-passive svg.bingc-passive-date-selection-arrows {
	position: absolute !important;
	top: 50% !important;
	right: var(--ts-space-3) !important;
	left: auto !important;
	width: 8px !important;
	height: 12px !important;
	margin: -6px 0 0 !important;
	transform: none !important;
}

html body #bingc-passive.bingc-passive svg.bingc-passive-date-selection-arrows path {
	fill: var(--ts-color-muted) !important;
}

/* Випадний список. */
html body #bingc-passive #bingc-passive-date-selection-select-hour-list-of-hours-container,
html body #bingc-passive #bingc-passive-date-selection-select-minutes-list-of-minutes-container,
html body #bingc-passive #bingc-passive-date-selection-select-day-list-of-days-container {
	position: absolute !important;
	top: calc(100% + 4px) !important;
	left: -1px !important;
	z-index: 10 !important;
	display: none !important;
	width: auto !important;
	min-width: calc(100% + 2px) !important;
	height: auto !important;
	margin: 0 !important;
	padding: var(--ts-space-1) !important;
	background: var(--ts-color-surface) !important;
	border: 1px solid var(--ts-color-border) !important;
	border-radius: var(--ts-radius-md) !important;
	box-shadow: var(--ts-shadow-lg) !important;
}

/*
 * Години й хвилини — сіткою, а не стовпчиком: десять годин стовпчиком
 * вилазили за низ модалки. Дні — звичайним списком.
 */
html body #bingc-passive .bingc-passive-date-selection-select-hour-hover #bingc-passive-date-selection-select-hour-list-of-hours-container,
html body #bingc-passive .bingc-passive-date-selection-select-minutes-hover #bingc-passive-date-selection-select-minutes-list-of-minutes-container {
	display: grid !important;
	grid-template-columns: repeat(5, minmax(44px, auto)) !important;
	gap: 2px !important;
}

html body #bingc-passive .bingc-passive-date-selection-select-minutes-hover #bingc-passive-date-selection-select-minutes-list-of-minutes-container {
	grid-template-columns: repeat(4, minmax(44px, auto)) !important;
}

html body #bingc-passive .bingc-passive-date-selection-select-day-hover #bingc-passive-date-selection-select-day-list-of-days-container {
	display: block !important;
}

/* Clearfix Binotel і тут став би першою порожньою клітинкою сітки. */
html body #bingc-passive [class*="date-selection-select"] [class*="-container"]::before,
html body #bingc-passive [class*="date-selection-select"] [class*="-container"]::after {
	display: none !important;
}

/*
 * Колір пунктів Binotel задає своїм CSS з id та !important — перебиваємо
 * трьома id: поле, контейнер, модалка.
 */
html body div#bingc-passive div#bingc-passive-date-selection-select-hour div#bingc-passive-date-selection-select-hour-list-of-hours-container ul li,
html body div#bingc-passive div#bingc-passive-date-selection-select-minutes div#bingc-passive-date-selection-select-minutes-list-of-minutes-container ul li,
html body div#bingc-passive div#bingc-passive-date-selection-select-day div#bingc-passive-date-selection-select-day-list-of-days-container ul li {
	color: var(--ts-color-text) !important;
}

html body div#bingc-passive div#bingc-passive-date-selection-select-hour div#bingc-passive-date-selection-select-hour-list-of-hours-container ul li:hover,
html body div#bingc-passive div#bingc-passive-date-selection-select-minutes div#bingc-passive-date-selection-select-minutes-list-of-minutes-container ul li:hover,
html body div#bingc-passive div#bingc-passive-date-selection-select-day div#bingc-passive-date-selection-select-day-list-of-days-container ul li:hover {
	color: var(--ts-color-primary) !important;
	background: var(--ts-color-primary-soft) !important;
}

/* Фон пунктів Binotel (синій) — так само трьома id. */
html body div#bingc-passive div#bingc-passive-date-selection-select-hour div#bingc-passive-date-selection-select-hour-list-of-hours-container ul li,
html body div#bingc-passive div#bingc-passive-date-selection-select-minutes div#bingc-passive-date-selection-select-minutes-list-of-minutes-container ul li,
html body div#bingc-passive div#bingc-passive-date-selection-select-day div#bingc-passive-date-selection-select-day-list-of-days-container ul li {
	background: none !important;
}

html body div#bingc-passive div#bingc-passive-date-selection-select-hour div#bingc-passive-date-selection-select-hour-list-of-hours-container ul li:hover,
html body div#bingc-passive div#bingc-passive-date-selection-select-minutes div#bingc-passive-date-selection-select-minutes-list-of-minutes-container ul li:hover,
html body div#bingc-passive div#bingc-passive-date-selection-select-day div#bingc-passive-date-selection-select-day-list-of-days-container ul li:hover {
	background: var(--ts-color-primary-soft) !important;
}

/* Модалка прокручується (overflow), і відкритий список обрізався б її краєм. */
html body #bingc-passive.bingc-passive div.bingc-passive-overlay:has([class*="date-selection-select"][class*="-hover"]) {
	overflow: visible !important;
}

/* Два ul годин Binotel — одна сітка: пункти стають прямими дітьми контейнера. */
html body #bingc-passive #bingc-passive-date-selection-select-hour-list-of-hours-container ul,
html body #bingc-passive #bingc-passive-date-selection-select-minutes-list-of-minutes-container ul {
	display: contents !important;
}

html body #bingc-passive #bingc-passive-date-selection-select-day-list-of-days-container ul {
	float: none !important;
	display: block !important;
	width: auto !important;
	height: auto !important;
	margin: 0 !important;
	padding: 0 !important;
	list-style: none !important;
	background: none !important;
	border: 0 !important;
}

html body #bingc-passive #bingc-passive-date-selection-select-hour-list-of-hours-container ul li,
html body #bingc-passive #bingc-passive-date-selection-select-minutes-list-of-minutes-container ul li,
html body #bingc-passive #bingc-passive-date-selection-select-day-list-of-days-container ul li {
	text-align: left !important;
	list-style: none !important;
}

html body #bingc-passive #bingc-passive-date-selection-select-hour-list-of-hours-container ul li,
html body #bingc-passive #bingc-passive-date-selection-select-minutes-list-of-minutes-container ul li {
	text-align: center !important;
}

html body #bingc-passive.bingc-passive div.bingc-passive-overlay [class*="date-selection-select"] ul li {
	float: none !important;
	display: block !important;
	width: auto !important;
	height: auto !important;
	margin: 0 !important;
	padding: 8px var(--ts-space-3) !important;
	font: var(--ts-weight-regular) var(--ts-text-sm) / 1.3 var(--ts-font-sans) !important;
	font-variant-numeric: tabular-nums;
	color: var(--ts-color-text) !important;
	white-space: nowrap !important;
	background: none !important;
	border: 0 !important;
	border-radius: var(--ts-radius-sm) !important;
	cursor: pointer !important;
}

html body #bingc-passive.bingc-passive div.bingc-passive-overlay [class*="date-selection-select"] ul li:hover {
	color: var(--ts-color-primary) !important;
	background: var(--ts-color-primary-soft) !important;
}

/* Хрестик — як у наших модалках. */
html body #bingc-passive.bingc-passive div.bingc-passive-overlay a.bingc-passive-close-button {
	position: absolute !important;
	top: var(--ts-space-3) !important;
	right: var(--ts-space-3) !important;
	z-index: 2 !important;
	display: grid !important;
	place-items: center !important;
	width: 44px !important;
	height: 44px !important;
	opacity: 1 !important;
	border-radius: var(--ts-radius-md) !important;
}

html body #bingc-passive.bingc-passive div.bingc-passive-overlay a.bingc-passive-close-button:hover {
	background: var(--ts-color-surface-sunken) !important;
}

html body #bingc-passive.bingc-passive div.bingc-passive-overlay a.bingc-passive-close-button svg {
	width: 16px !important;
	height: 16px !important;
}

html body #bingc-passive.bingc-passive div.bingc-passive-overlay a.bingc-passive-close-button svg polygon {
	fill: var(--ts-color-muted) !important;
}

/* Підпис «Віртуальна АТС» не потрібен (рішення власника). */
html body #bingc-passive.bingc-passive div.bingc-passive-overlay a.bingc-powered-by {
	display: none !important;
}

/* Смуга-запрошення знизу (на випадок, якщо налаштування не спрацює). */
html body #bingc-active.bingc-active {
	display: none !important;
}

/* Телефон: шторка знизу на всю ширину, як наші модалки. */
@media (max-width: 599px) {
	html body #bingc-passive.bingc-passive {
		align-items: flex-end !important;
		padding: 0 !important;
	}

	html body #bingc-passive.bingc-passive div.bingc-passive-overlay {
		max-width: none !important;
		max-height: 92dvh !important;
		padding: var(--ts-space-5) var(--ts-space-4) calc(var(--ts-space-4) + env(safe-area-inset-bottom, 0px)) !important;
		border-radius: var(--ts-radius-xl) var(--ts-radius-xl) 0 0 !important;
	}
}

/* ==========================================================================
   Сторінка «Бренди» (page-brendy.php)
   ========================================================================== */

/* .ts-page розрахована на текст, а тут сітка на всю ширину. */
.ts-page.ts-brandlist {
	max-width: none;
}

.ts-brandlist__section {
	margin-bottom: var(--ts-space-8);
}

.ts-brandlist__title {
	margin: 0 0 var(--ts-space-4);
	font-size: var(--ts-text-xl);
	font-weight: var(--ts-weight-bold);
	color: var(--ts-color-text-strong);
}

.ts-brandlist__popular {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
	gap: var(--ts-space-3);
}

.ts-brandlist__logo {
	display: flex;
	align-items: center;
	justify-content: center;
	height: 72px;
	padding: var(--ts-space-3);
	background: var(--ts-color-surface);
	border: 1px solid var(--ts-color-border);
	border-radius: var(--ts-radius-md);
	transition: border-color 0.15s ease;
}

.ts-brandlist__logo img {
	max-width: 100%;
	max-height: 36px;
	object-fit: contain;
}

@media (hover: hover) {
	.ts-brandlist__logo:hover {
		border-color: var(--ts-color-primary);
	}
}

/* Букви липнуть під шапкою: список довгий, а повертатись угору незручно. */
.ts-brandlist__letters {
	position: sticky;
	top: var(--ts-header-height);
	z-index: var(--ts-z-base);
	display: flex;
	flex-wrap: wrap;
	gap: var(--ts-space-1);
	margin-bottom: var(--ts-space-6);
	padding-block: var(--ts-space-2);
	background: var(--ts-color-bg);
}

.ts-brandlist__letter {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 36px;
	height: 36px;
	padding-inline: var(--ts-space-1);
	border-radius: var(--ts-radius-md);
	font-weight: var(--ts-weight-semibold);
	color: var(--ts-color-text-strong);
}

.ts-brandlist__letter:hover {
	text-decoration: none;
}

@media (hover: hover) {
	.ts-brandlist__letter:hover {
		background: var(--ts-color-surface-sunken);
		color: var(--ts-color-primary);
	}
}

.ts-brandlist__group {
	margin-bottom: var(--ts-space-6);
	/* Щоб заголовок після переходу за буквою не ховався під шапку й літери. */
	scroll-margin-top: calc(var(--ts-header-height) + 120px);
}

.ts-brandlist__heading {
	margin: 0 0 var(--ts-space-3);
	padding-bottom: var(--ts-space-2);
	border-bottom: 1px solid var(--ts-color-border);
	font-size: var(--ts-text-lg);
	font-weight: var(--ts-weight-bold);
	color: var(--ts-color-text-strong);
}

.ts-brandlist__list {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(min(200px, 45%), 1fr));
	gap: 0 var(--ts-space-5);
	margin: 0;
	padding: 0;
	list-style: none;
}

.ts-brandlist__link {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: var(--ts-space-2);
	min-height: 40px;
	color: var(--ts-color-text);
}

.ts-brandlist__link:hover {
	text-decoration: none;
}

@media (hover: hover) {
	.ts-brandlist__link:hover {
		color: var(--ts-color-primary);
	}
}

.ts-brandlist__name {
	min-width: 0;
	overflow-wrap: anywhere;
}

.ts-brandlist__count {
	flex: none;
	font-size: var(--ts-text-xs);
	color: var(--ts-color-faint);
}

/* Під палець: на телефоні букви й рядки не менші за 44px. */
@media (pointer: coarse) {
	.ts-brandlist__letter {
		min-width: 44px;
		height: 44px;
	}

	.ts-brandlist__link {
		min-height: 44px;
	}
}

/* На телефоні липка смуга букв з'їдала б екран: хай лишається вгорі сторінки. */
@media (max-width: 767px) {
	.ts-brandlist__letters {
		position: static;
	}

	.ts-brandlist__group {
		scroll-margin-top: calc(var(--ts-header-height) + var(--ts-space-3));
	}
}

