/* =====================================================================
   Mendopauza — arkusz motywu.

   Wartości (kolory, skale, odstępy, promienie, cienie) pochodzą wprost
   z pakietu design/. Style inline z prototypu są tu przepisane na klasy
   i zmienne — nic nie jest przeniesione jeden do jednego.
   ===================================================================== */

:root {
	/* Paleta — dokładnie te dziewięć kolorów, żadnych nowych. */
	--paper:  #F0E8D8;
	--paper2: #F8F2E6;
	--ink:    #1A1613;
	--accent: #BE5533;
	--muted:  #6E6055;
	--line:   #DCCEB8;
	--body:   #3A322A;
	--dim:    #A79A8C;
	--ok:     #2E7D53;

	/* Tła pomocnicze stanów. */
	--ok-bg:  #EAF3EE;
	--err-bg: #FAEDE7;

	/*
	 * Przyciemnione warianty --accent i --ok WYŁĄCZNIE dla drobnego tekstu.
	 *
	 * --accent na --paper2 daje 4,15:1, a na --paper 3,80:1 — dla napisów
	 * mniejszych niż 18,7px to poniżej progu WCAG AA (4,5:1), który projekt
	 * stawia jako warunek odbioru. Duże liczby (ceny, nagłówki) i wypełnienia
	 * przycisków zostają na oryginalnym --accent: tam próg wynosi 3:1 dla
	 * dużego tekstu, a biel na --accent ma 4,63:1.
	 */
	--accent-text: #A9482A;   /* 4,73:1 na --paper, 5,16:1 na --paper2 */
	--ok-text:     #2A7049;   /* 4,91:1 na --paper, 5,25:1 na --ok-bg  */

	--font-display: 'Bricolage Grotesque', system-ui, sans-serif;
	--font-body:    Karla, system-ui, sans-serif;

	/*
	 * Kontenery.
	 *
	 * Projekt zakładał trzy szerokości: 880 (wąska kolumna czytelnicza),
	 * 1120 (sklep) i 1180 (strony marketingowe). Działało to, dopóki sklep
	 * miał WŁASNY nagłówek i stopkę — każda część była wtedy spójna sama
	 * w sobie. Po ujednoliceniu ramy różnica stała się widoczna jako skok:
	 * przy 1440px logo i treść stały na 170px na landingu i na 196px
	 * w sklepie, więc przejście „strona główna → sklep" przesuwało całą
	 * kolumnę o 26px.
	 *
	 * Serwis ma jeden kręgosłup: --w-page. --w-shop zostaje jako alias,
	 * bo nazwa czyta się lepiej w regułach sklepu, ale wartość jest ta sama.
	 */
	--w-narrow: 880px;
	--w-page:   1180px;
	--w-shop:   var(--w-page);

	--pad-x: clamp(18px, 4vw, 40px);
	--pad-y: clamp(36px, 7vw, 92px);

	--r-pill: 999px;
	--r-card: 6px;
	--r-block: 5px;
	--r-cover: 3px;
	--r-field: 4px;

	--sh-cover-xl: 0 50px 90px -34px rgba(26, 22, 19, 0.5);
	--sh-cover:    0 30px 56px -28px rgba(26, 22, 19, 0.5);
	--sh-thumb:    0 14px 26px -16px rgba(26, 22, 19, 0.45);

	--ease: cubic-bezier(.22, .61, .36, 1);
}

/* Skok skip-linku i linków „błąd → pole” lądował pod przyklejonym stosem
   nagłówka. Jedno scroll-padding naprawia wszystkie kotwice naraz. */
html { scroll-padding-top: 124px; }
@media (max-width: 600px) { html { scroll-padding-top: 160px; } }

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

/*
 * Atrybut `hidden` musi wygrywać z układem.
 *
 * Przeglądarka daje mu tylko `display: none` z arkusza domyślnego, więc każda
 * własna reguła w rodzaju `display: flex` na tym samym elemencie go przebija —
 * i element zostaje na ekranie mimo `hidden`. Tak właśnie „chowały się" pola
 * faktury w kasie i zwinięte akapity opisów.
 */
[hidden] { display: none !important; }

body {
	margin: 0;
	background: var(--paper);
	color: var(--ink);
	font-family: var(--font-body);
	font-size: 16px;
	-webkit-font-smoothing: antialiased;
	text-wrap: pretty;

	/* Bez tego na krótkich stronach (koszyk z jedną pozycją, pusty koszyk)
	   stopka kończyła się tam, gdzie kończy się treść: zmierzone na /koszyk
	   przy 1440×900 dolna krawędź stopki na 673,9px, czyli 226px gołego
	   --paper pod spodem. */
	min-height: 100vh;   /* zapas dla przeglądarek bez dvh */
	min-height: 100dvh;  /* pasek adresu na telefonie nie tnie wysokości */
	display: flex;
	flex-direction: column;
}
.mp-content { flex: 1 0 auto; }
.mp-footer  { flex: none; }

/* Pasek administratora WP jest fixed i zostaje poza układem, ale <html>
   dostaje od niego margin-top — bez korekty zalogowana autorka dostaje
   32px zbędnego przewijania na każdej krótkiej stronie. */
body.admin-bar { min-height: calc(100dvh - 32px); }
@media screen and (max-width: 782px) {
	body.admin-bar { min-height: calc(100dvh - 46px); }
}

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

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

/* Link w zdaniu musi różnić się od sąsiedniego tekstu czymś więcej niż barwą.
   --accent-text wobec --muted to 1,05:1 — dla osoby nierozróżniającej czerwieni
   te dwa kolory są nie do odróżnienia, a WCAG 1.4.1 mówi wprost, że kolor nie
   może być jedynym nośnikiem informacji. Lighthouse tego nie audytuje.

   Podkreślamy WYŁĄCZNIE linki w tekście ciągłym. Nawigacja, przyciski, pigułki
   i pozycje stopki są rozpoznawalne przez kształt i położenie — tam podkreślenie
   byłoby szumem. */
.mp-prose a,
.mp-terms a,
.mp-contact__more a,
.mp-next p a,
.mp-tabs__panel a,
.mp-hero__guarantee a,
.mp-downloads__note a {
	text-decoration: underline;
	text-underline-offset: 3px;
	text-decoration-thickness: 1px;
}
a:hover { color: var(--ink); }

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

h1, h2, h3, h4 {
	font-family: var(--font-display);
	font-weight: 800;
	margin: 0;
}

p { margin: 0; }

/* Tytuł „Nie jestem niemiła. To menopauza" łamał się z sierotą — ostatni
   wiersz to samo słowo „menopauza", przy pierwszym wypełnionym w ~95%.
   Dziedziczone z body `text-wrap: pretty` tego nie ratuje: pilnuje tylko
   ostatniego wiersza dłuższego akapitu. `balance` przenosi złamanie
   na granicę zdania. Liczba wierszy się nie zmienia, więc wysokości bloków
   zostają.

   Świadomie POMINIĘTE: .mp-ecard__title („Cały ten burdel (ebook)" łamie się
   dziś na granicy tytuł | dopisek formatu; balance rozerwałby tytuł książki),
   .mp-shop__title i .mp-page-title (treść jednowyrazowa). */
.mp-presale__title,
.mp-feature__title,
.mp-product__title,
.mp-cart__name,
.mp-panel__name {
	text-wrap: balance;
}

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

/* Kolor pierścienia tam, gdzie accent na accencie albo accent na czerni jest
   nieczytelny. Policzone: accent↔ink 3,88:1, paper↔ink 14,76:1 — obie ponad
   próg 3:1 dla wskaźnika. */
.mp-btn--accent:focus-visible,
.mp-cta:focus-visible { outline-color: var(--ink); }

/* Hover zamienia te przyciski na --ink — bez tego pierścień zlałby się z tłem
   przycisku przy tabowaniu pod spoczywającym kursorem. */
.mp-btn--accent:focus-visible:hover,
.mp-cta:focus-visible:hover { outline-color: var(--accent); }

/* Elementy na tle --ink: stopka, pasek dolny, skip link. */
.mp-footer a:focus-visible,
.mp-stickybar a:focus-visible,
.mp-skip:focus-visible { outline-color: var(--paper); }

.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;
}

.mp-skip {
	position: absolute;
	left: -9999px;
	top: 0;
	z-index: 100;
	background: var(--ink);
	color: var(--paper);
	padding: 12px 20px;
	border-radius: 0 0 var(--r-block) 0;
}
.mp-skip:focus { left: 0; color: var(--paper); }

/* ---------------------------------------------------------------------
   Elementy wspólne: przyciski, pigułki, stepper, pola
   --------------------------------------------------------------------- */

.mp-btn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: 8px;
	border: none;
	border-radius: var(--r-pill);
	font-family: var(--font-display);
	font-weight: 800;
	cursor: pointer;
	text-align: center;
	line-height: 1.1;
	transition: background-color .16s var(--ease), color .16s var(--ease), border-color .16s var(--ease);
}

.mp-btn--accent { background: var(--accent); color: #fff; padding: 17px 30px; font-size: 17px; }
.mp-btn--accent:hover { background: var(--ink); color: #fff; }

.mp-btn--ink { background: var(--ink); color: var(--paper); padding: 15px 28px; font-size: 16px; }
.mp-btn--ink:hover { background: var(--accent); color: #fff; }

.mp-btn--outline {
	background: none;
	color: var(--ink);
	border: 1.6px solid var(--ink);
	padding: 16px 26px;
	font-size: 17px;
}
.mp-btn--outline:hover { background: var(--ink); color: var(--paper); }

.mp-btn--ghost {
	background: none;
	color: var(--ink);
	border: 1.4px solid var(--line);
	padding: 14px 22px;
	font-size: 15px;
}
.mp-btn--ghost:hover { border-color: var(--ink); color: var(--ink); }

.mp-btn--sm { padding: 13px 20px; font-size: 14.5px; }
.mp-btn--block { width: 100%; }

/* CTA w nagłówku i na pasku dolnym. */
.mp-cta {
	display: inline-flex;
	align-items: center;
	gap: 8px;
	background: var(--accent);
	color: #fff;
	padding: 11px clamp(14px, 2vw, 20px);
	border-radius: var(--r-pill);
	font-family: var(--font-display);
	font-weight: 800;
	font-size: clamp(13px, 1.4vw, 14px);
	white-space: nowrap;
	transition: background-color .16s var(--ease);
}
.mp-cta:hover { background: var(--ink); color: #fff; }
.mp-cta__short { display: none; }
/* Nazwę dostępną niesie aria-label na samym odnośniku — .mp-cta__short jest
   już tylko skróconym tekstem widocznym, więc na desktopie ma zniknąć. */

.mp-pill {
	display: inline-block;
	border-radius: var(--r-pill);
	font-family: var(--font-display);
	font-weight: 800;
	text-transform: uppercase;
}

.mp-badge {
	background: var(--accent);
	color: #fff;
	font-size: 11.5px;
	letter-spacing: 0.14em;
	padding: 7px 12px;
}

.mp-eyebrow {
	display: flex;
	align-items: center;
	gap: 9px;
	font-family: var(--font-display);
	font-weight: 800;
	font-size: 12.5px;
	letter-spacing: 0.2em;
	text-transform: uppercase;
	color: var(--accent-text);
	margin-bottom: 14px;
}

.mp-stepper {
	display: inline-flex;
	align-items: center;
	border: 1.4px solid var(--line);
	border-radius: var(--r-pill);
	background: #fff;
	overflow: hidden;
}
.mp-stepper button {
	background: none;
	border: none;
	width: 46px;
	height: 50px;
	font-size: 20px;
	color: var(--ink);
	cursor: pointer;
	transition: background-color .14s var(--ease);
}
.mp-stepper button:hover { background: var(--paper2); }
.mp-stepper > span,
.mp-stepper input {
	min-width: 34px;
	text-align: center;
	font-family: var(--font-display);
	font-weight: 800;
	font-size: 17px;
	border: none;
	background: none;
	-moz-appearance: textfield;
}
.mp-stepper input::-webkit-outer-spin-button,
.mp-stepper input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }

.mp-stepper--sm button { width: 32px; height: 34px; font-size: 17px; }
.mp-stepper--sm button:hover { background: var(--line); }
.mp-stepper--sm > span { min-width: 24px; font-family: var(--font-body); font-weight: 700; font-size: 15px; }

.mp-field { display: flex; flex-direction: column; gap: 7px; }
.mp-field label,
.mp-label {
	font-size: 12.5px;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	font-weight: 700;
	color: var(--muted);
}
/* Trzy rzeczy naraz:

   1. font-size 15,5 → 16px. Poniżej 16px Safari na iOS powiększa viewport przy
      każdym dotknięciu pola, a meta viewport słusznie nie blokuje skalowania.
      Dotyczy też iPada (>820px), więc to NIE MOŻE siedzieć w media query.

   2. Jawny line-height na input i select. To on, nie min-height, daje RÓWNOŚĆ:
      natywny line-box selecta jest o 2px wyższy (zmierzone: 46px input vs
      48px select). textarea celowo wyłączona — 20px zdusiłoby „Uwagi".

   3. background-color zamiast skrótu `background`: strzałka selecta niżej jest
      background-image i skrót by ją kasował. */
.mp-field input,
.mp-field textarea,
.mp-field select {
	background-color: #fff;
	border: 1.4px solid var(--line);
	border-radius: var(--r-field);
	padding: 13px 15px;
	font-size: 16px;
	color: var(--ink);
	width: 100%;
	min-height: 50px;
}
.mp-field input,
.mp-field select { line-height: 20px; }

.mp-field textarea { resize: vertical; min-height: 92px; line-height: 1.55; }

/* W arkuszu nie było ANI JEDNEJ reguły ::placeholder, więc kolor podpowiedzi
   to domyślne #757575 przeglądarki — ostatni element formularza rysowany przez
   system, a nie przez motyw. Ten sam tekst ląduje na trzech powierzchniach
   i na dwóch był PONIŻEJ progu 4,5:1:
     biel (kasa)            #757575 = 4,61:1  →  --muted = 6,06:1
     --paper (kontakt)      #757575 = 3,78:1  →  --muted = 4,97:1
     --err-bg (pole błędu)  #757575 = 4,02:1  →  --muted = 5,29:1
   opacity: 1 jest konieczne — arkusz UA Firefoksa przygasza ::placeholder. */
.mp-field input::placeholder,
.mp-field textarea::placeholder {
	color: var(--muted);
	opacity: 1;
}

/* Pole KRAJ było jedynym elementem kasy rysowanym przez system, a nie przez
   motyw. Chevron w %236E6055 to dokładnie token --muted (6,08:1 na białym;
   dla grafiki nietekstowej próg to 3:1). */
.mp-field select {
	-webkit-appearance: none;
	appearance: none;
	padding-right: 42px;
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1.6 6 6.4 11 1.6' fill='none' stroke='%236E6055' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
	background-repeat: no-repeat;
	background-position: right 16px center;
	background-size: 12px 8px;
}

/* `outline: none` tu NIE WRACA. Ta reguła ma specyficzność (0,2,1) i biła
   globalne :focus-visible (0,1,0), czyli wyłączała zaprojektowany pierścień
   na KAŻDYM polu kasy i formularza kontaktowego. Zostawała sama podmiana
   obramowania o 1,4px — sygnał nieczytelny z odległości czytania. */
.mp-field input:focus,
.mp-field textarea:focus,
.mp-field select:focus { border-color: var(--accent); }

.mp-field select:focus {
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1.6 6 6.4 11 1.6' fill='none' stroke='%23BE5533' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
}

/* Bez tego w trybie wymuszonych kolorów pole KRAJ zostaje bez wskaźnika
   rozwijania. */
@media (forced-colors: active) {
	.mp-field select {
		-webkit-appearance: auto;
		appearance: auto;
		padding-right: 15px;
		background-image: none;
	}
}
.mp-field .description,
.mp-hint {
	font-size: 12px;
	font-weight: 400;
	letter-spacing: normal;
	text-transform: none;
	color: var(--muted);
}

.mp-check {
	display: flex;
	align-items: center;
	gap: 10px;
	font-size: 15px;
	cursor: pointer;
}
/* ── Wspólna kontrolka wyboru ───────────────────────────────────────
   „Chcę fakturę na firmę" i „Akceptuję regulamin" były jasnymi kwadracikami
   z włoskowatą systemową ramką stojącymi obok karty z obramowaniem 1.6px --ink:
   kontrolka 3–4× cieńsza niż wszystko wokół, renderowana inaczej w Safari
   niż w Chrome. grep ":checked" po arkuszu zwracał zero trafień — stan
   zaznaczenia był w całości rysunkiem przeglądarki.

   Grubość 1.4px, nie 1.6px: bezpośredni sąsiedzi to pole .mp-field input
   i kafel .mp-pay li, oba 1.4px. Promień var(--r-field) = 4px, bo to token
   PÓL; 3px to w tym systemie promień okładek. Wypełnienie #fff, bo wszystkie
   trzy kontrolki sąsiadują z białymi polami i kaflami — kremowy krążek
   czytałby się jak brud. */
.mp-check input[type="checkbox"],
.mp-terms input[type="checkbox"],
.mp-pay input[type="radio"] {
	-webkit-appearance: none;
	appearance: none;
	width: 20px;
	height: 20px;
	margin: 0;
	flex: none;
	background: #fff;
	border: 1.4px solid var(--ink);
	cursor: pointer;
	transition: background-color .14s var(--ease), border-color .14s var(--ease);
}
.mp-check input[type="checkbox"],
.mp-terms input[type="checkbox"] { border-radius: var(--r-field); }
.mp-pay input[type="radio"] { border-radius: var(--r-pill); }

/* Biel na --accent = 4,63:1; dla grafiki nietekstowej próg to 3:1. */
.mp-check input[type="checkbox"]:checked,
.mp-terms input[type="checkbox"]:checked {
	background-color: var(--accent);
	border-color: var(--accent);
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='10' viewBox='0 0 12 10'%3E%3Cpath d='M1 5.2 4.3 8.5 11 1.6' fill='none' stroke='%23ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
	background-repeat: no-repeat;
	background-position: center;
	background-size: 12px 10px;
}

/* Pudełko 20px − ramka 2,8px = pole 17,2px; pierścień 3,5px → kropka 10,2px. */
.mp-pay input[type="radio"]:checked {
	background-color: var(--accent);
	border-color: var(--accent);
	box-shadow: inset 0 0 0 3.5px #fff;
}

/* Windows High Contrast: bez tego zaznaczenie regulaminu znika i nie da się
   złożyć zamówienia. background-image: none jest konieczne — zewnętrzna
   reguła :checked (0,3,1) bije bazową w media (0,2,1) i ptaszek by został. */
@media (forced-colors: active) {
	.mp-check input[type="checkbox"],
	.mp-terms input[type="checkbox"],
	.mp-pay input[type="radio"] {
		-webkit-appearance: auto;
		appearance: auto;
		border: 0;
		background: none;
	}
	.mp-check input[type="checkbox"]:checked,
	.mp-terms input[type="checkbox"]:checked { background-image: none; }
}

/* ---------------------------------------------------------------------
   Nagłówek
   --------------------------------------------------------------------- */

.mp-header {
	position: sticky;
	top: 0;
	z-index: 40;
	background: var(--paper);
	border-bottom: 1px solid var(--line);
	/* Własna warstwa kompozycji. W WebKicie (Safari/Messenger na iOS) okładka
	   z mask-image (.mp-mockup) potrafi być namalowana PONAD przyklejonym
	   nagłówkiem przy przewijaniu, mimo z-index 40 — zgłoszenie z telefonu
	   14.09.2026. Do poprzedniej rundy warstwę dawał nagłówkowi backdrop-filter;
	   po jego usunięciu (słusznym — patrz niżej) trzeba ją zadeklarować wprost.
	   translateZ(0) nie zmienia układu ani nie tworzy problemów dla
	   potomków: w nagłówku nie ma nic pozycjonowanego fixed. */
	transform: translateZ(0);
}
/* rgba(247,242,234,0.94) nie było ŻADNYM tokenem — to był jedyny dosłowny
   kolor spoza palety w tej części arkusza. Nagłówek i pasek kroków zlewały się
   w jeden jasny slab (113px na desktopie), w którym pasek kroków przestawał
   być osobnym elementem sterującym, a rama zmieniała kolor przy przejściu
   landing → sklep.

   backdrop-filter znika świadomie: przy alfie 0,94 rozmycie wnosiło ~6% obrazu,
   a na elemencie sticky tworzy dodatkowy kontekst kompozycji, kosztowny przy
   każdym przemalowaniu w Safari. */
.mp-header--shop {
	background: var(--paper);
}

.mp-header__bar {
	max-width: var(--w-page);
	margin: 0 auto;
	padding: 11px var(--pad-x);
	display: flex;
	align-items: center;
	gap: clamp(10px, 2vw, 24px);
}
.mp-header--shop .mp-header__bar {
	max-width: var(--w-shop);
	padding: 13px var(--pad-x);
	gap: 20px;
}

.mp-logo {
	display: flex;
	align-items: center;
	gap: 11px;
	color: var(--ink);
	flex: none;
}
.mp-logo:hover { color: var(--ink); }
.mp-logo__text { display: flex; flex-direction: column; line-height: 1.1; }
.mp-logo__name {
	font-family: var(--font-display);
	font-weight: 800;
	font-size: 15px;
	letter-spacing: 0.13em;
	text-transform: uppercase;
}
.mp-logo__author {
	font-size: 11.5px;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	color: var(--muted);
}
.mp-logo--inline {
	gap: 10px;
	font-family: var(--font-display);
	font-weight: 800;
	font-size: 14.5px;
	letter-spacing: 0.14em;
	text-transform: uppercase;
}

.mp-nav { margin-left: auto; }
.mp-nav__list {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	align-items: center;
	gap: 26px;
	font-size: 14.5px;
	font-weight: 500;
}
.mp-nav__list a { color: var(--muted); }
.mp-nav__list a:hover { color: var(--ink); }
.mp-nav__list .current-menu-item > a,
.mp-nav__list .current_page_item > a {
	color: var(--ink);
	font-weight: 700;
	border-bottom: 2px solid var(--accent);
	padding-bottom: 2px;
}

/* Nawigacja w nagłówku sklepowym ma ciaśniej: bilans przy 821px, czyli tuż
   nad progiem burgera, to logo 194,9 + menu ~368 + koszyk 112,6 + odstępy
   ≈ 715px z 755px dostępnych. Bez zacieśnienia gapu zostawałoby 6px, a menu
   edytuje autorka w kokpicie — jedna dodana pozycja rozwaliłaby pasek.

   Stopień pisma ZOSTAJE 14,5px: zmiana tylko w sklepie sprawiłaby, że menu
   drga przy przejściu landing → sklep w tym samym, przyklejonym elemencie.
   flex-wrap to zawór — przy piątej pozycji menu przełamie się do drugiej
   linijki zamiast wyleźć spod przycisku „Koszyk". */
.mp-header--shop .mp-nav { min-width: 0; }
.mp-header--shop .mp-nav__list {
	gap: clamp(14px, 1.8vw, 26px);
	flex-wrap: wrap;
	justify-content: flex-end;
	row-gap: 2px;
}

.mp-header__action { margin-left: auto; flex: none; display: flex; }
.mp-nav + .mp-header__action { margin-left: 0; }

.mp-cartbtn {
	display: inline-flex;
	align-items: center;
	gap: 9px;
	background: none;
	border: 1.4px solid var(--ink);
	color: var(--ink);
	border-radius: var(--r-pill);
	padding: 9px 16px;
	cursor: pointer;
	font-family: var(--font-display);
	font-weight: 800;
	font-size: 13.5px;
	transition: background-color .16s var(--ease), color .16s var(--ease);
}
.mp-cartbtn:hover { background: var(--ink); color: var(--paper); }
.mp-cartbtn__count {
	background: var(--accent);
	color: #fff;
	border-radius: var(--r-pill);
	min-width: 21px;
	height: 21px;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	font-size: 12px;
	padding: 0 6px;
}

.mp-burger {
	display: none;
	background: none;
	border: 1.4px solid var(--line);
	border-radius: 10px;
	width: 46px;
	height: 46px;
	align-items: center;
	justify-content: center;
	cursor: pointer;
	color: var(--ink);
	flex: none;
}

.mp-menu-mobile {
	border-top: 1px solid var(--line);
	background: var(--paper2);
	padding: 8px var(--pad-x) 16px;
}
.mp-menu-mobile__list {
	list-style: none;
	margin: 0;
	padding: 0;
	display: flex;
	flex-direction: column;
}
.mp-menu-mobile__list li { border-bottom: 1px solid var(--line); }
.mp-menu-mobile__list li:last-child { border-bottom: none; }
.mp-menu-mobile__list a {
	display: block;
	color: var(--ink);
	font-size: 16.5px;
	font-weight: 600;
	padding: 15px 0;
}
.mp-menu-mobile__list .current-menu-item > a { color: var(--accent-text); font-weight: 700; }

/* Pasek kroków w sklepie. */
.mp-steps {
	border-top: 1px solid var(--line);
	background: var(--paper2);
}
.mp-steps__inner {
	max-width: var(--w-shop);
	margin: 0 auto;
	padding: 9px var(--pad-x);
	display: flex;
	align-items: center;
	gap: 6px;
	flex-wrap: wrap;
	font-family: var(--font-display);
	font-weight: 800;
	font-size: 12px;
	letter-spacing: 0.12em;
	text-transform: uppercase;
	color: var(--muted);
}
.mp-steps__item {
	display: flex;
	align-items: center;
	gap: 7px;
	padding: 6px 8px;
	color: inherit;
}
.mp-steps__item:hover { color: var(--ink); }
.mp-steps__item.is-active { color: var(--ink); }
.mp-steps__dot {
	width: 7px;
	height: 7px;
	border-radius: 50%;
	background: var(--accent);
}
.mp-steps__sep { color: var(--line); }

/* ---------------------------------------------------------------------
   Stopka
   --------------------------------------------------------------------- */

.mp-footer { background: var(--ink); color: var(--dim); }
.mp-footer a { color: var(--dim); }
.mp-footer a:hover { color: var(--paper); }

.mp-footer__grid {
	max-width: var(--w-page);
	margin: 0 auto;
	padding: clamp(40px, 6vw, 76px) var(--pad-x) 96px;
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(min(100%, 240px), 1fr));
	gap: 30px;
	align-items: end;
}
.mp-footer__logo {
	font-family: var(--font-display);
	font-weight: 800;
	font-size: clamp(24px, 2.6vw, 34px);
	line-height: 1.02;
	letter-spacing: -0.025em;
	color: var(--paper);
	text-transform: uppercase;
	margin-bottom: 10px;
}
.mp-footer__meta { font-size: 14.5px; line-height: 1.6; }
/* Dane rejestrowe w stopce. --dim na --ink to 7,07:1 — powyżej AA. */
.mp-footer__legal { margin-top: 14px; max-width: 44ch; font-size: 13px; line-height: 1.75; }
.mp-footer__legal a { text-decoration: underline; text-underline-offset: 2px; }
.mp-footer__nav { display: flex; flex-direction: column; gap: 10px; font-size: 14.5px; }
.mp-footer__copy { font-size: 12.5px; letter-spacing: 0.1em; text-transform: uppercase; }

/* Pełna stopka na stronach sklepu trzyma kolumnę sklepu, żeby jej krawędź
   pokrywała się z kartą nad nią: .mp-footer__grid to 1180 + --pad-x (do 40px),
   czyli 170px od lewej przy 1440, a kolumna sklepu 1120 + 36px = 196px.
   Bez korekty rozjazd 26px. */
.mp-view-shop .mp-footer__grid {
	max-width: var(--w-shop);
	padding-right: var(--pad-x);
	padding-left: var(--pad-x);
}

/* Rezerwa 96px na dolny pasek landingu jest MARTWA wszędzie poza stroną
   główną — mendopauza_sticky_bar() zwraca pusto przy ! is_front_page().
   To samo 96px zalegało też na Kontakcie, Ebookach i Fragmentach. */
.mp-footer__grid { padding-bottom: clamp(40px, 6vw, 76px); }
body.home .mp-footer__grid { padding-bottom: 96px; }

/* #C9C0B7 był kolorem spoza :root, dublującym rolę --dim bez powodu.
   Po zmianie stopka kasy ma tę samą szarość co stopka landingu;
   --dim na --ink = 7,07:1, czyli AAA przy 13,5px. */
.mp-footer--shop .mp-footer__bar { color: var(--dim); }
.mp-footer--shop a { color: var(--dim); }

.mp-footer--shop .mp-footer__bar {
	max-width: var(--w-shop);
	margin: 0 auto;
	padding: 34px var(--pad-x);
	display: flex;
	flex-wrap: wrap;
	gap: 18px;
	align-items: center;
	font-size: 13.5px;
}
.mp-footer__links { margin-left: auto; display: flex; gap: 18px; }

/* ---------------------------------------------------------------------
   Dolny pasek landingu
   --------------------------------------------------------------------- */

.mp-stickybar {
	position: fixed;
	left: 0; right: 0; bottom: 0;
	z-index: 50;
	background: var(--ink);
	color: var(--paper);
	box-shadow: 0 -12px 30px -18px rgba(0, 0, 0, 0.5);
}
.mp-stickybar__inner {
	max-width: var(--w-page);
	margin: 0 auto;
	padding: 10px var(--pad-x);
	display: flex;
	align-items: center;
	gap: clamp(12px, 2vw, 18px);
}
.mp-stickybar__img { height: 46px; width: auto; border-radius: 2px; }
.mp-stickybar__text { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.mp-stickybar__title {
	font-family: var(--font-display);
	font-weight: 800;
	font-size: 14px;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}
.mp-stickybar__meta {
	font-size: 12px;
	color: var(--dim);
	white-space: nowrap;      /* bez tego podpis łamał się na telefonie i pasek rósł dwukrotnie */
	overflow: hidden;
	text-overflow: ellipsis;
}
/* Hero i dolny pasek kupują przez formularz, nie przez kotwicę — opakowanie
   nie może zmienić układu rzędu. */
.mp-hero__actions form.cart { display: flex; margin: 0; }

/* margin-left: auto siedziało na samym przycisku; po opakowaniu w formularz
   musi przejść na formularz, inaczej pigułka przykleja się do tytułu. */
.mp-stickybar__form { margin: 0 0 0 auto; flex: none; display: flex; }

.mp-stickybar__cta {
	padding: 13px clamp(16px, 3vw, 24px);
	font-size: 15px;
	flex: none;
}

/* .mp-cta było dotąd wyłącznie na <a> i — w odróżnieniu od .mp-btn — nie ma
   resetu przycisku. Bez tego iOS Safari domaluje własne tło i obramowanie. */
button.mp-cta {
	-webkit-appearance: none;
	appearance: none;
	border: 0;
	cursor: pointer;
}

/* Reguła pierścienia fokusa celuje w „.mp-stickybar a" — na <button> byłby
   --ink na --ink, czyli niewidoczny na ciemnym pasku. */
.mp-stickybar .mp-cta:focus-visible { outline-color: var(--paper); }

/* markInCart() dokleja „✓ w koszyku" jako rodzeństwo formularza — w wąskim
   pasku rozpycha rząd, a informację zwrotną daje i tak wysuwany panel. */
.mp-stickybar .mp-incart { display: none; }
.mp-stickybar__cta:hover { background: var(--paper); color: var(--ink); }

/* ---------------------------------------------------------------------
   Landing: hero
   --------------------------------------------------------------------- */

.mp-hero {
	max-width: var(--w-page);
	margin: 0 auto;
	padding: var(--pad-y) var(--pad-x) clamp(40px, 5vw, 72px);
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(min(100%, 330px), 1fr));
	gap: clamp(34px, 6vw, 72px);
	align-items: center;
}
.mp-hero__tags {
	display: flex;
	align-items: center;
	gap: 12px;
	margin-bottom: 26px;
	flex-wrap: wrap;
}
.mp-hero__tag {
	background: var(--ink);
	color: var(--paper);
	padding: 7px 15px 8px;
	border-radius: var(--r-pill);
	font-family: var(--font-display);
	font-weight: 800;
	font-size: 12.5px;
	letter-spacing: 0.16em;
	text-transform: uppercase;
	transform: rotate(-1.5deg);
}
.mp-hero__note { font-size: 13.5px; color: var(--muted); letter-spacing: 0.04em; }

.mp-hero__title {
	font-size: clamp(48px, 7.4vw, 104px);
	line-height: 0.84;
	letter-spacing: -0.035em;
	text-transform: uppercase;
}
.mp-hero__title em { font-style: normal; color: var(--accent); }
.mp-hero__title .mp-hero__pill {
	display: inline-block;
	background: var(--ink);
	color: var(--paper);
	padding: 0.06em 0.34em 0.13em;
	border-radius: var(--r-pill);
	transform: rotate(-1.2deg);
	font-size: 0.56em;
	margin-top: 0.14em;
}

.mp-hero__lead {
	margin-top: 30px;
	max-width: 46ch;
	font-size: clamp(16.5px, 1.5vw, 19px);
	line-height: 1.62;
	color: var(--body);
}
.mp-hero__actions {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 14px;
	margin-top: 34px;
}
.mp-hero__guarantee {
	display: flex;
	align-items: flex-start;
	gap: 12px;
	margin-top: 26px;
	border-left: 3px solid var(--accent);
	padding: 4px 0 4px 16px;
	max-width: 48ch;
	font-size: 14.5px;
	line-height: 1.55;
}
.mp-hero__guarantee svg { flex: none; margin-top: 2px; }

.mp-hero__media { position: relative; justify-self: center; }
.mp-hero__cover {
	display: block;
	width: min(100%, 430px);
	border-radius: var(--r-cover);
	box-shadow: var(--sh-cover-xl);
	transform: rotate(-2deg);
}
/* Para okładek zamiast jednej — landing ebooków ma dwa tytuły i dwie ceny,
   więc pieczęć z ceną nie ma czego pokazać. Druga okładka wsunięta pod pierwszą
   i lekko obrócona czyta się jak dwie książki na półce, a nie jak siatka. */
.mp-hero__covers { display: flex; align-items: flex-end; justify-content: center; }
.mp-hero__cover-link { display: block; flex: 0 1 auto; min-width: 0; }
.mp-hero__cover-link:focus-visible { outline: 2px solid var(--accent); outline-offset: 4px; border-radius: var(--r-cover); }
.mp-hero__covers .mp-hero__cover--1 { transform: rotate(-4deg); position: relative; z-index: 2; }
.mp-hero__covers .mp-hero__cover--2 { transform: rotate(4deg); margin-left: -14%; width: 88%; }
@media (prefers-reduced-motion: reduce) {
	.mp-hero__covers .mp-hero__cover--1,
	.mp-hero__covers .mp-hero__cover--2 { transform: none; }
}

.mp-hero__seal {
	position: absolute;
	right: clamp(-10px, -1vw, 0px);
	bottom: -20px;
	width: clamp(104px, 28vw, 132px);
	height: clamp(104px, 28vw, 132px);
	border-radius: 50%;
	background: var(--accent);
	color: #fff;
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	gap: 2px;
	transform: rotate(-8deg);
	box-shadow: 0 18px 34px -14px rgba(26, 22, 19, 0.35);
}
.mp-hero__seal-price {
	font-family: var(--font-display);
	font-weight: 800;
	font-size: clamp(17px, 4.4vw, 22px);
	line-height: 1;
}
.mp-hero__seal-label {
	font-size: clamp(9px, 2.3vw, 10.5px);
	letter-spacing: 0.08em;
	text-transform: uppercase;
	font-weight: 700;
}

/* ---------------------------------------------------------------------
   Landing: sekcja przedsprzedaży i FAQ
   --------------------------------------------------------------------- */

.mp-section {
	border-top: 1px solid var(--line);
	background: var(--paper2);
}
.mp-section__inner {
	max-width: var(--w-page);
	margin: 0 auto;
	padding: clamp(48px, 7vw, 92px) var(--pad-x);
}
/* Wąska kolumna (FAQ) ZOSTAJE wąska — to miara czytelnicza, nie ozdoba —
   ale nie centruje się na nowo. Wcześniej nagłówek „Najczęściej pytacie"
   stał 150px na prawo od „Książka w przedsprzedaży" tuż nad nim, mimo że
   to dwa nagłówki tej samej rangi na tej samej stronie. Teraz obie sekcje
   startują na jednej osi, a FAQ po prostu kończy się wcześniej. */
.mp-section__inner--narrow {
	/* --w-narrow (880 px) zostawiało po 150 px z każdej strony w ramie 1180 px.
	   FAQ to pytania i odpowiedzi w akordeonie, nie ciągła proza — pełna
	   szerokość trzyma je w jednej osi z resztą strony. */
	max-width: var(--w-page);
	margin-left: max(var(--pad-x), calc(50vw - var(--w-page) / 2 + var(--pad-x)));
	margin-right: auto;
	padding-left: 0;
	padding-right: var(--pad-x);
}

.mp-h2 {
	font-size: clamp(28px, 3.4vw, 44px);
	line-height: 1.02;
	letter-spacing: -0.028em;
	text-transform: uppercase;
	margin-bottom: 30px;
}

.mp-presale {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(min(100%, 280px), 1fr));
	gap: clamp(24px, 4vw, 52px);
	align-items: center;
	background: var(--paper);
	border: 1.6px solid var(--ink);
	border-radius: var(--r-card);
	padding: clamp(20px, 3vw, 40px);
}
.mp-presale__media { position: relative; width: 100%; max-width: 300px; justify-self: center; }
.mp-presale__media img { display: block; width: 100%; border-radius: var(--r-cover); box-shadow: var(--sh-cover); }
.mp-presale__badge { position: absolute; top: -13px; left: -10px; transform: rotate(-3deg); }

.mp-presale__title {
	font-size: clamp(23px, 2.6vw, 32px);
	line-height: 1.06;
	letter-spacing: -0.025em;
	margin-bottom: 8px;
}
.mp-presale__meta { font-size: 14px; color: var(--muted); letter-spacing: 0.02em; margin-bottom: 18px; }
.mp-priceline { display: flex;
	/* Doszła stara cena i plakietka przeceny — bez zawijania nota „z VAT”
	   wypychała wiersz 9 px poza ekran na 768 px. */
	flex-wrap: wrap; align-items: flex-end; gap: 12px; margin-bottom: 20px; }
.mp-price-xl {
	font-family: var(--font-display);
	font-weight: 800;
	font-size: clamp(44px, 6vw, 68px);
	line-height: 0.85;
	letter-spacing: -0.035em;
	color: var(--accent);
}
.mp-priceline__note { font-size: 13.5px; color: var(--muted); padding-bottom: 8px; }
.mp-presale__lead { font-size: 15.5px; line-height: 1.62; color: var(--body); max-width: 52ch; margin-bottom: 20px; }

.mp-bullets {
	margin: 0 0 26px;
	padding: 0;
	list-style: none;
	display: flex;
	flex-direction: column;
	gap: 12px;
}
.mp-bullets li {
	display: flex;
	gap: 12px;
	align-items: flex-start;
	font-size: 15.5px;
	line-height: 1.5;
}
.mp-bullets svg { flex: none; margin-top: 1px; }

.mp-presale__actions { display: flex; flex-wrap: wrap; align-items: center; gap: 12px; }
.mp-paynote { display: flex; align-items: center; gap: 9px; font-size: 13px; color: var(--muted); }

.mp-faq { display: flex; flex-direction: column; }
.mp-faq__item { border-top: 1px solid var(--line); }
.mp-faq__item:last-child { border-bottom: 1px solid var(--line); }
.mp-faq__q {
	width: 100%;
	background: none;
	border: none;
	padding: 22px 0;
	display: flex;
	align-items: center;
	gap: 20px;
	cursor: pointer;
	text-align: left;
	font-family: var(--font-display);
	font-weight: 800;
	font-size: clamp(17px, 1.8vw, 21px);
	color: var(--ink);
	letter-spacing: -0.01em;
}
.mp-faq__q:hover { color: var(--accent-text); }
.mp-faq__q span:first-child { flex: 1; }
.mp-faq__sign { color: var(--accent); font-size: 26px; line-height: 1; }
.mp-faq__a {
	padding: 0 clamp(0px, 8vw, 60px) 24px 0;
	font-size: 16px;
	line-height: 1.65;
	color: var(--muted);
}

/* ---------------------------------------------------------------------
   Podstrony: Fragmenty, Ebooki, Kontakt
   --------------------------------------------------------------------- */

.mp-pagehead {
	max-width: var(--w-page);
	margin: 0 auto;
	padding: clamp(36px, 6vw, 76px) var(--pad-x) clamp(24px, 3vw, 42px);
}
.mp-pagehead__title {
	font-size: clamp(34px, 5vw, 66px);
	line-height: 0.98;
	letter-spacing: -0.032em;
	text-transform: uppercase;
	margin-bottom: 18px;
}
.mp-pagehead__lead {
	/* 58ch dawało 654 px w ramie 1180 px — pod wielkim nagłówkiem czytało się
	   to jak niedokończona kolumna. Lead ma dwa, trzy zdania, więc pełna
	   szerokość mieści go w jednym, dwóch wierszach i wygląda na zamierzoną. */
	max-width: none;
	font-size: clamp(16.5px, 1.5vw, 19px);
	line-height: 1.62;
	color: var(--body);
}

.mp-wrap {
	max-width: var(--w-page);
	margin: 0 auto;
	padding: 0 var(--pad-x) clamp(48px, 7vw, 92px);
}

/* Fragmenty */
.mp-fragments { display: flex; flex-direction: column; gap: clamp(20px, 3vw, 28px); }
.mp-fragment {
	background: var(--paper2);
	border: 1px solid var(--line);
	border-radius: var(--r-card);
	padding: clamp(24px, 4vw, 46px);
	display: grid;
	/* Dwie kolumny z projektu były liczone pod krótki cytat. Przy ciągłej prozie
	   tekst dostawał 481 z 1100 px ramy, a pod tytułem zostawała pusta połowa
	   karty — 44% wykorzystanej szerokości. Jedna kolumna: nagłówek nad tekstem,
	   tekst przez całą szerokość karty. */
	grid-template-columns: minmax(0, 1fr);
	gap: clamp(16px, 2vw, 22px);
}
.mp-fragment--dark { background: var(--ink); color: var(--paper); border-color: var(--ink); }
.mp-fragment__no {
	display: inline-block;
	font-family: var(--font-display);
	font-weight: 800;
	font-size: 12px;
	letter-spacing: 0.18em;
	text-transform: uppercase;
	color: var(--accent-text);
}
/* „FRAGMENT 01" w czarnym bloku był niebieskawo-stalowy, a „FRAGMENT 02"
   i „03" w jasnych blokach ceglaste. Ten sam element, dwie rodziny barw,
   a wersja zimna wypadała na jedynym ciemnym elemencie strony. #A8BED2 był
   jedynym chłodnym miejscem w typografii motywu i nie jest pochodną żadnego
   tokena.

   Zabieg ten sam, którym --accent-text jest przyciemnionym --accent dla teł
   jasnych: na ciemnym tle akcent musi iść w GÓRĘ jasności, nie w bok w stronę
   błękitu. Czysty --accent na --ink daje 3,88:1 i przy 12px nie przeszedłby AA.

   Fallback z dwóch deklaracji, NIE custom property: ta jest poprawna przy
   parsowaniu niemal dla dowolnego ciągu, więc bez color-mix wygrałaby druga
   deklaracja i kolor spadłby do dziedziczonego. */
.mp-fragment--dark .mp-fragment__no {
	color: #D18D72;                                              /* bez color-mix */
	color: color-mix(in srgb, var(--accent) 62%, var(--paper));  /* 6,64:1 na --ink */
}
.mp-fragment__title {
	margin-top: 12px;
	font-size: clamp(22px, 2.4vw, 30px);
	line-height: 1.06;
	letter-spacing: -0.02em;
}
.mp-fragment__body { display: flex; flex-direction: column; gap: 16px; }

/* Proza fragmentu. Kursywa z projektu (.mp-fragment__quote) była pomyślana pod
   trzy-cztery zdania cytatu; na kilku akapitach ciągłego tekstu męczy oko, więc
   zostaje antykwa. Miara wychodzi na ~62 znaki w kolumnie, czyli w normie. */
.mp-fragment__p { font-size: clamp(16px, 1.45vw, 17.5px); line-height: 1.68; color: var(--body); }
.mp-fragment--dark .mp-fragment__p { color: var(--paper); }

/* Puenty. U autorki to osobne jednowierszowe akapity domykające fragment —
   rytm jest w nich całą treścią, więc dostają odstęp, krój nagłówkowy i akcent.
   Ciaśniejszy gap niż w prozie: mają się czytać jako seria, nie jako akapity. */
.mp-fragment__beats { display: flex; flex-direction: column; gap: 6px; margin-top: 4px; }
.mp-fragment__beat {
	font-family: var(--font-display);
	font-weight: 800;
	font-size: clamp(18px, 1.9vw, 23px);
	line-height: 1.2;
	letter-spacing: -0.01em;
	color: var(--accent-text);
}
.mp-fragment--dark .mp-fragment__beat {
	color: #D18D72;                                              /* bez color-mix */
	color: color-mix(in srgb, var(--accent) 62%, var(--paper));  /* 6,64:1 na --ink */
}
/* Autorka rozstrzeliła te wersaliki spacjami; rozstrzelenie robi tu CSS,
   żeby czytnik ekranowy dostał słowo, a nie ciąg pojedynczych liter. */
.mp-fragment__loud {
	font-size: clamp(21px, 2.4vw, 29px);
	letter-spacing: 0.14em;
	margin-top: 2px;
}

.mp-ctabar { border-top: 1px solid var(--line); background: var(--paper2); }
.mp-ctabar__inner {
	max-width: var(--w-page);
	margin: 0 auto;
	padding: clamp(36px, 5vw, 64px) var(--pad-x);
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 22px;
}
.mp-ctabar__text { flex: 1 1 300px; }
.mp-ctabar__title {
	font-size: clamp(22px, 2.6vw, 32px);
	line-height: 1.06;
	letter-spacing: -0.02em;
	text-transform: uppercase;
	margin-bottom: 8px;
}
.mp-ctabar__lead { font-size: 15.5px; line-height: 1.6; color: var(--muted); max-width: 52ch; }

/* Ebooki */
.mp-ebooks {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(min(100%, 340px), 1fr));
	gap: clamp(22px, 3vw, 32px);
}
.mp-ecard {
	background: var(--paper2);
	border: 1px solid var(--line);
	border-radius: var(--r-card);
	padding: clamp(18px, 2.4vw, 28px);
	display: flex;
	flex-direction: column;
	gap: 18px;
}
.mp-ecard__top {
	display: grid;
	grid-template-columns: clamp(96px, 30%, 150px) minmax(0, 1fr);
	gap: clamp(16px, 3vw, 24px);
	align-items: start;
}
.mp-ecard__cover { display: block; width: 100%; border-radius: var(--r-cover); box-shadow: 0 22px 40px -24px rgba(26, 22, 19, 0.45); }

/* Ebook w przedsprzedaży musi się odróżniać od tych dostępnych od ręki —
   inaczej trzy karty obiecują to samo, a jedna z nich przyjdzie później. */
.mp-ecard__media { position: relative; }
.mp-ecard__badge {
	position: absolute;
	top: -10px;
	left: -8px;
	transform: rotate(-3deg);
	font-size: 10.5px;
	padding: 6px 10px;
}
/* Okładka i tytuł nie były nigdzie linkiem — dotknięcie ich, odruch z Allegro
   i Empiku, nie robiło nic, a /ebooki/ była ślepym zaułkiem: curl zwracał
   ZERO odnośników do /produkt/. */
.mp-coverlink { display: block; }
.mp-coverlink:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; }
.mp-ecard__title a,
.mp-feature__title a,
.mp-related__name a { color: inherit; }
.mp-ecard__title a:hover,
.mp-feature__title a:hover,
.mp-related__name a:hover { color: var(--accent-text); }

.mp-related__lead {
	font-size: 15px;
	line-height: 1.6;
	color: var(--muted);
	margin: -8px 0 20px;
	max-width: 56ch;
}
.mp-related__actions { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; }

.mp-ecard__title {
	font-size: clamp(21px, 2.2vw, 26px);
	line-height: 1.08;
	letter-spacing: -0.02em;
	margin-bottom: 6px;
}
.mp-ecard__meta { font-size: 13px; line-height: 1.5; color: var(--muted); margin-bottom: 14px; }
.mp-price-md {
	font-family: var(--font-display);
	font-weight: 800;
	font-size: clamp(26px, 3vw, 34px);
	line-height: 1;
	letter-spacing: -0.02em;
	color: var(--accent);
}
.mp-vat { font-size: 12.5px; color: var(--muted); }

/* Przecena. Stara cena przekreślona, obok plakietka z procentem — bez niej
   „47,99 zł" jest po prostu ceną i nie niesie żadnej informacji o okazji.
   Przekreślenie samo w sobie bywa niewidoczne dla czytnika ekranowego,
   więc znaczenie niesie <del> (semantyka), a nie tylko line-through. */
/* Cena po premierze — bez przekreślenia (Omnibus, patrz mendopauza_sale_tag). */
.mp-price-future {
	font-size: 14px;   /* nie em: rodzic to wiersz ceny (~16px), nie sama cena — 0.5em dawało 8 px */
	line-height: 1.3;
	color: var(--muted);
	font-weight: 700;
	letter-spacing: 0;
	white-space: nowrap;
}
.mp-badge--sale {
	background: var(--ink);
	color: var(--paper);
	font-size: 11.5px;
	letter-spacing: 0.06em;
	padding: 5px 9px;
	white-space: nowrap;
}
/* Omnibus — drobny, ale nie ukryty: to informacja wymagana ustawą. */
.mp-omnibus { margin: 6px 0 0; font-size: 12.5px; color: var(--muted); width: 100%; }

.mp-saveline {
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	gap: 10px;
	margin-top: 6px;
	font-size: 14px;
	color: var(--muted);
}
/* Cichy odnośnik do wydania elektronicznego pod przyciskami przedsprzedaży. */
.mp-presale__alt { margin-top: 16px; font-size: 14.5px; color: var(--muted); }
.mp-presale__alt a { color: var(--accent-text); font-weight: 700; text-decoration: underline; text-underline-offset: 3px; }
.mp-presale__alt a:hover { color: var(--ink); }

.mp-ecard__bundle { margin: 6px 0 0; font-size: 13px; color: var(--muted); }
.mp-ecard__bundle strong { color: var(--accent-text); }
.mp-ecard__desc { font-size: 15px; line-height: 1.62; color: var(--body); display: flex; flex-direction: column; gap: 12px; }

/* Zapowiedź opisu do stałej wysokości.
   Karty na /ebooki i /sklep stoją obok siebie, a pierwsze akapity opisów mają
   od czterech do jedenastu wierszy. Przyciski wyrównuje margin-top:auto, więc
   w krótszych kartach robiła się kilkuwierszowa dziura — trzy karty przestawały
   czytać się jako komplet. Obcięcie dotyczy WYŁĄCZNIE stanu zwiniętego:
   :has(> [hidden]) znika po rozwinięciu przez „Czytaj dalej", więc pełny akapit
   zawsze da się przeczytać. html.js, bo bez JS-a atrybut [hidden] zostaje
   w DOM-ie (resztę odsłania osobna reguła) i zapowiedź byłaby ucięta bez
   sposobu na rozwinięcie. Brak :has() = brak obcięcia, czyli stan sprzed zmiany. */
html.js .mp-ecard__desc:has(> [hidden]) > p:first-child {
	display: -webkit-box;
	-webkit-box-orient: vertical;
	-webkit-line-clamp: 5;
	line-clamp: 5;
	overflow: hidden;
}
.mp-more {
	align-self: flex-start;
	background: none;
	border: none;
	padding: 0;
	cursor: pointer;
	color: var(--accent-text);
	font-weight: 700;
	font-size: 14px;
	text-decoration: underline;
}
.mp-ecard__foot { margin-top: auto; display: flex; flex-wrap: wrap; align-items: center; gap: 12px; }
.mp-sku { font-size: 12.5px; color: var(--muted); }

/* Kontakt */
.mp-contact {
	max-width: var(--w-page);
	margin: 0 auto;
	padding: clamp(30px, 5vw, 56px) var(--pad-x) clamp(48px, 7vw, 92px);
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(min(100%, 320px), 1fr));
	gap: clamp(28px, 5vw, 60px);
	align-items: start;
}
.mp-contact__mail {
	display: inline-flex;
	align-items: center;
	gap: 12px;
	font-family: var(--font-display);
	font-weight: 800;
	font-size: clamp(18px, 2vw, 24px);
	color: var(--ink);
	letter-spacing: -0.01em;
}
.mp-contact__mail:hover { color: var(--accent-text); }
.mp-social { display: flex; flex-wrap: wrap; gap: 10px; }
.mp-social a {
	border: 1.4px solid var(--line);
	color: var(--ink);
	padding: 12px 20px;
	border-radius: var(--r-pill);
	font-size: 14.5px;
	font-weight: 700;
	display: flex;
	align-items: center;
	gap: 9px;
}
.mp-social a:hover { border-color: var(--ink); }
.mp-contact__more {
	border-top: 1px solid var(--line);
	padding-top: 20px;
	display: flex;
	flex-direction: column;
	gap: 8px;
	font-size: 14.5px;
	line-height: 1.6;
	color: var(--muted);
}
.mp-form {
	background: var(--paper2);
	border: 1px solid var(--line);
	border-radius: var(--r-card);
	padding: clamp(20px, 3vw, 32px);
	display: flex;
	flex-direction: column;
	gap: 16px;
}
.mp-form__label {
	font-family: var(--font-display);
	font-weight: 800;
	font-size: 13px;
	letter-spacing: 0.16em;
	text-transform: uppercase;
}
.mp-form .mp-field input,
.mp-form .mp-field textarea { background: var(--paper); }
.mp-form__ok {
	border: 1.6px solid var(--accent);
	border-radius: var(--r-block);
	padding: 22px;
	display: flex;
	flex-direction: column;
	gap: 8px;
}
.mp-form__ok strong { font-family: var(--font-display); font-weight: 800; font-size: 19px; }
.mp-form__ok span { font-size: 15px; line-height: 1.55; color: var(--muted); }

/* Treść stron statycznych (Regulamin, Polityka prywatności) */
.mp-prose { max-width: none; font-size: 16.5px; line-height: 1.7; color: var(--body); }
.mp-prose > * + * { margin-top: 1em; }
.mp-prose h2 { font-size: clamp(22px, 2.4vw, 30px); margin-top: 1.6em; }
.mp-prose__empty {
	border: 1px dashed var(--line);
	border-radius: var(--r-card);
	padding: 30px;
	color: var(--muted);
}

/* ---------------------------------------------------------------------
   Dokumenty prawne (Regulamin, Polityka prywatności)

   Teksty na 12–27 tys. znaków, czytane wyrywkowo: ktoś szuka jednego
   paragrafu, nie czyta od deski do deski. Dlatego nagłówki mają wyraźnie
   mocniejszy sygnał niż w zwykłej prozie, a tabela przetwarzania danych
   dostaje własne pudełko z przewijaniem w poziomie.
   --------------------------------------------------------------------- */

.mp-prose__meta,
.mp-legal__meta {
	font-family: var(--font-display);
	font-weight: 800;
	font-size: 12.5px;
	letter-spacing: 0.14em;
	text-transform: uppercase;
	color: var(--muted);
}

/* Numer paragrafu ma być punktem zaczepienia dla oka przy przewijaniu,
   więc nagłówek dostaje krechę nad sobą — ten sam materiał, co otwarcie
   sekcji .mp-tabs. */
.mp-prose h2 {
	margin-top: 2.2em;
	padding-top: 1.1em;
	border-top: 1.6px solid var(--ink);
	font-size: clamp(20px, 2.2vw, 26px);
	letter-spacing: -0.02em;
}
.mp-prose h2:first-of-type { margin-top: 1.4em; }

.mp-prose h3 {
	margin-top: 1.8em;
	font-size: clamp(17px, 1.8vw, 20px);
	letter-spacing: -0.015em;
}

.mp-prose ul { padding-left: 1.15em; }
.mp-prose li + li { margin-top: 0.55em; }
.mp-prose li > ul { margin-top: 0.55em; }

/* Wtrącenie redakcyjne: „sklep nie prowadzi kont", „formularz odeślij tylko,
   gdy…". Nie jest to ostrzeżenie, więc bez akcentu — sama powierzchnia. */
.mp-legal__note {
	background: var(--paper2);
	border-left: 3px solid var(--line);
	border-radius: 0 var(--r-block) var(--r-block) 0;
	padding: 14px 18px;
	font-size: 15px;
	line-height: 1.65;
	color: var(--muted);
}

.mp-legal__hint {
	font-family: var(--font-display);
	font-weight: 800;
	font-size: 12.5px;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	color: var(--accent-text);
	display: none;   /* pokazywane dopiero tam, gdzie tabela faktycznie się nie mieści */
}

/* Tabela ma osiem wierszy po cztery kolumny tekstu prawnego — poniżej
   ~900px nie ma szans zmieścić się bez łamania słów, więc przewija się
   w poziomie we własnym pudełku, zamiast rozpychać całą stronę. */
.mp-legal__table-scroll {
	overflow-x: auto;
	border: 1px solid var(--line);
	border-radius: var(--r-card);
	-webkit-overflow-scrolling: touch;
}
.mp-legal__table {
	border-collapse: collapse;
	width: 100%;
	min-width: 780px;
	background: var(--paper2);
	font-size: 14px;
}
.mp-legal__table thead th {
	background: var(--ink);
	color: var(--paper);
	font-family: var(--font-display);
	font-weight: 800;
	font-size: 12px;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	text-align: left;
	padding: 14px 16px;
}
.mp-legal__table td {
	padding: 14px 16px;
	border-bottom: 1px solid var(--line);
	vertical-align: top;
	line-height: 1.6;
	color: var(--body);
}
.mp-legal__table tbody tr:last-child td { border-bottom: none; }
.mp-legal__table td:first-child {
	font-family: var(--font-display);
	font-weight: 800;
	color: var(--ink);
}

/* Formularz odstąpienia jest do wydrukowania — stąd biel i ramka
   jak u dokumentu, a nie jak u karty sklepu. */
.mp-legal__form {
	background: #fff;
	border: 1.6px solid var(--ink);
	border-radius: var(--r-card);
	padding: clamp(20px, 3vw, 32px);
	font-size: 15.5px;
	line-height: 1.9;
}
.mp-legal__form .mp-legal__note {
	background: none;
	border: none;
	padding: 0;
	font-size: 13px;
	line-height: 1.6;
}

/* Formularz odstąpienia ma pola do wypełnienia ręcznie, zapisane ciągami
   podkreślników. Przeglądarka traktuje je jak jedno długie słowo, więc
   na 390px wypychały stronę w bok (zmierzone: scrollWidth > clientWidth).
   anywhere, nie break-all: łamie tylko wtedy, gdy nie ma innego wyjścia,
   więc zwykłe zdania formularza nadal łamią się po wyrazach. */
.mp-legal__form { overflow-wrap: anywhere; }

@media (max-width: 900px) {
	.mp-legal__hint { display: block; }
}

/* ---------------------------------------------------------------------
   Sklep: lista produktów
   --------------------------------------------------------------------- */

.mp-shop {
	max-width: var(--w-shop);
	margin: 0 auto;
	padding: clamp(28px, 5vw, 58px) var(--pad-x) clamp(40px, 5vw, 64px);
}
.mp-crumbs { font-size: 13px; color: var(--muted); margin-bottom: 10px; }
.mp-crumbs a { color: var(--muted); }
.mp-crumbs a:hover { color: var(--ink); }
.mp-crumbs strong { color: var(--ink); font-weight: 400; }

.mp-shop__title {
	font-size: clamp(32px, 4.4vw, 54px);
	line-height: 0.98;
	letter-spacing: -0.03em;
	text-transform: uppercase;
	margin-bottom: 8px;
}
.mp-shop__sub { font-size: 16px; color: var(--muted); margin-bottom: 40px; }

.mp-feature {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(min(100%, 260px), 1fr));
	gap: clamp(24px, 4vw, 48px);
	align-items: center;
	background: var(--paper2);
	border: 1.6px solid var(--ink);
	border-radius: var(--r-card);
	padding: clamp(18px, 3vw, 38px);
	margin-bottom: 48px;
}
.mp-feature__media { position: relative; width: 100%; max-width: 300px; justify-self: center; }
.mp-feature__media img { display: block; width: 100%; border-radius: var(--r-cover); box-shadow: var(--sh-cover); }
.mp-feature__badge { position: absolute; top: -14px; left: -12px; transform: rotate(-3deg); }
.mp-feature__title {
	font-size: clamp(23px, 2.7vw, 34px);
	line-height: 1.05;
	letter-spacing: -0.025em;
	margin-bottom: 12px;
}
.mp-feature__lead { font-size: 16px; line-height: 1.62; color: var(--body); max-width: 58ch; margin-bottom: 18px; }
.mp-feature__price { display: flex; align-items: baseline; gap: 12px; margin-bottom: 22px;
	/* Doszła stara cena, plakietka i wiersz Omnibus — bez zawijania „z VAT”
	   wypadał 30 px poza ekran na 768 px, tak samo jak wcześniej .mp-priceline. */
	flex-wrap: wrap;
}
.mp-price-lg {
	font-family: var(--font-display);
	font-weight: 800;
	font-size: clamp(32px, 4vw, 46px);
	line-height: 1;
	letter-spacing: -0.03em;
	color: var(--accent);
}
.mp-feature__actions { display: flex; flex-wrap: wrap; align-items: center; gap: 14px; }

.mp-shop__h2 {
	font-size: clamp(22px, 2.4vw, 30px);
	letter-spacing: -0.02em;
	text-transform: uppercase;
	margin-bottom: 6px;
}
.mp-shop__note { font-size: 15px; color: var(--muted); margin-bottom: 26px; }

.mp-grid {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(min(100%, 320px), 1fr));
	gap: clamp(20px, 3vw, 30px);
}
/* Karta dostawała DOKŁADNIE kolor body — kontrast wypełnienia 1,00:1,
   trzymała się wyłącznie na kresce 1px --line. Tuż nad nią .mp-feature ma
   --paper2 i ramkę 1,6px --ink, więc sekcja EBOOKI wyglądała jak luźny tekst
   w ledwo widocznych ramkach. To nadpisanie kasowało efekt wspólnej reguły
   .mp-ecard — usunięcie wyrównuje sklep do /ebooki, gdzie ta sama karta tego
   samego produktu wygląda inaczej. --muted na --paper2 to 5,43:1 zamiast
   4,97:1, więc kontrast treści w karcie nawet rośnie. */
.mp-grid .mp-ecard { background: var(--paper2); }
.mp-grid .mp-ecard__top { grid-template-columns: clamp(90px, 28%, 122px) minmax(0, 1fr); gap: clamp(14px, 3vw, 20px); }
.mp-grid .mp-ecard__title { font-size: 21px; }
.mp-grid .mp-price-md { font-size: 28px; }

.mp-incart { font-size: 14px; color: var(--ok-text); font-weight: 700; display: inline-flex; align-items: center; gap: 8px; }

.mp-cartsum {
	margin-top: 36px;
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 16px;
	background: var(--paper2);
	border: 1px solid var(--line);
	border-radius: var(--r-card);
	padding: 18px 22px;
	font-size: 15px;
}
.mp-cartsum .mp-btn { margin-left: auto; }

/* ---------------------------------------------------------------------
   Sklep: karta produktu
   --------------------------------------------------------------------- */

.mp-product {
	max-width: var(--w-shop);
	margin: 0 auto;
	padding: clamp(24px, 4vw, 46px) var(--pad-x) 90px;
}
.mp-product__top {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(min(100%, 300px), 1fr));
	gap: clamp(26px, 4vw, 56px);
	align-items: start;
}
.mp-product__top > * { min-width: 0; }  /* tor siatki nie może rosnąć ponad viewport przez min-content dzieci */
.mp-product__gallery { display: flex; flex-direction: column; gap: 16px; }
.mp-product__frame {
	position: relative;
	background: var(--paper2);
	border: 1px solid var(--line);
	border-radius: var(--r-card);
	padding: clamp(20px, 4vw, 40px);
	display: flex;
	justify-content: center;
}
.mp-product__frame img {
	display: block;
	width: min(100%, 320px);
	border-radius: var(--r-cover);
	box-shadow: 0 34px 60px -30px rgba(26, 22, 19, 0.5);
}
.mp-product__badge { position: absolute; top: 14px; left: 14px; }
.mp-chips { display: flex; flex-wrap: wrap; gap: 8px; }
.mp-chip {
	border: 1.3px solid var(--line);
	border-radius: var(--r-pill);
	padding: 8px 15px;
	font-size: 12.5px;
	font-weight: 700;
	letter-spacing: 0.08em;
	text-transform: uppercase;
	color: var(--muted);
}

.mp-product__title {
	font-size: clamp(27px, 3.4vw, 42px);
	line-height: 1.02;
	letter-spacing: -0.03em;
	margin-bottom: 10px;
}
.mp-product__meta { font-size: 14px; color: var(--muted); letter-spacing: 0.02em; margin-bottom: 20px; }
.mp-product__price {
	display: flex;
	align-items: baseline;
	gap: 12px;
	padding-bottom: 20px;
	border-bottom: 1px solid var(--line);
	/* Cena + stara cena + plakietka + „z VAT” w jednym wierszu bez zawijania
	   rozpychały kolumnę siatki do 410 px na ekranie 390 px — cała karta
	   przewijała się w poziomie. Trzeci raz ten sam wzorzec: wiersz ceny musi
	   zawijać wszędzie, gdzie doszła przecena. */
	flex-wrap: wrap;
}
.mp-price-xxl {
	font-family: var(--font-display);
	font-weight: 800;
	font-size: clamp(34px, 4.4vw, 50px);
	line-height: 1;
	letter-spacing: -0.035em;
	color: var(--accent);
}
/* Krótki opis: był jednym <p>, jest kontenerem akapitów (autorka pisze rytmem,
   nie blokiem). Odstęp między akapitami mniejszy niż margines całego bloku,
   żeby trzymały się razem jako jedna wypowiedź. */
.mp-product__lead { margin: 20px 0 22px; font-size: 16px; line-height: 1.62; color: var(--body); max-width: 54ch; }
.mp-product__lead > p { margin: 0; }
.mp-product__lead > p + p { margin-top: 11px; }
.mp-feature__lead > p { margin: 0; }
.mp-feature__lead > p + p { margin-top: 11px; }
.mp-product__form { display: flex; flex-wrap: wrap; align-items: center; gap: 12px; }
/* Ten sam tytuł w dwóch postaciach to dwa osobne produkty — odnośnik jest
   jedynym mostem między nimi. Pigułka z ceną, żeby wybór nie wymagał kliknięcia. */
.mp-product__sibling {
	margin-top: 22px;
	padding: 12px 16px;
	background: var(--paper2);
	border: 1px solid var(--line);
	border-radius: var(--r-block);
	font-size: 14.5px;
	line-height: 1.5;
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	gap: 6px 10px;
}
.mp-product__sibling-price {
	font-family: var(--font-display);
	font-weight: 800;
	color: var(--accent-text);
}

.mp-product__sku { margin-top: 22px; font-size: 12.5px; color: var(--muted); }
.mp-product .mp-bullets { margin: 26px 0 0; gap: 11px; font-size: 15px; }

.mp-product__added {
	margin-top: 16px;
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 14px;
	background: var(--ok-bg);
	border-radius: var(--r-block);
	padding: 12px 16px;
}
.mp-product__added span { font-size: 14px; font-weight: 700; color: var(--ok-text); }
.mp-product__added button,
.mp-product__added a {
	background: none;
	border: none;
	padding: 0;
	font-size: 14px;
	font-weight: 700;
	color: var(--ink);
	cursor: pointer;
	text-decoration: underline;
}

.mp-tabs { margin-top: clamp(38px, 6vw, 68px); border-top: 1.6px solid var(--ink); }
.mp-tabs__list { display: flex; flex-wrap: wrap; gap: 4px; margin-bottom: 26px; }
.mp-tabs__btn {
	background: none;
	border: none;
	border-bottom: 3px solid transparent;
	padding: 16px 20px;
	font-family: var(--font-display);
	font-weight: 800;
	font-size: 14px;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	color: var(--ink);
	cursor: pointer;
}
.mp-tabs__btn:hover { color: var(--accent-text); }
.mp-tabs__btn[aria-selected="true"] { border-bottom-color: var(--accent); }
.mp-tabs__panel { display: flex; flex-direction: column; gap: 14px; font-size: 16px; line-height: 1.66; color: var(--body); }
.mp-tabs__panel[hidden] { display: none; }

.mp-details { max-width: 620px; border: 1px solid var(--line); border-radius: var(--r-card); overflow: hidden; }
.mp-details__row {
	display: grid;
	grid-template-columns: minmax(120px, 34%) minmax(0, 1fr);
	gap: 16px;
	padding: 14px 18px;
	border-bottom: 1px solid var(--line);
	font-size: 15px;
}
.mp-details__row:last-child { border-bottom: none; }
.mp-details__label {
	color: var(--muted);
	font-size: 12.5px;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	font-weight: 700;
	padding-top: 2px;
}

.mp-related { margin-top: clamp(40px, 6vw, 72px); }
.mp-related__title { font-size: clamp(20px, 2.2vw, 26px); letter-spacing: -0.02em; text-transform: uppercase; margin-bottom: 20px; }
.mp-related__grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 260px), 1fr)); gap: 20px; }
.mp-related__card {
	display: grid;
	grid-template-columns: 84px minmax(0, 1fr);
	gap: 16px;
	align-items: center;
	background: var(--paper2);
	border: 1px solid var(--line);
	border-radius: var(--r-card);
	padding: 16px;
}
.mp-related__card img { display: block; width: 100%; border-radius: 2px; box-shadow: var(--sh-thumb); }
.mp-related__name { font-family: var(--font-display); font-weight: 800; font-size: 16px; line-height: 1.14; margin-bottom: 4px; }
.mp-related__price { font-size: 14px; color: var(--accent-text); font-weight: 700; margin-bottom: 10px; }
.mp-related__link {
	display: inline-block;
	border: 1.3px solid var(--line);
	border-radius: var(--r-pill);
	padding: 9px 16px;
	font-size: 13.5px;
	font-weight: 700;
	color: var(--ink);
}
.mp-related__link:hover { border-color: var(--ink); color: var(--ink); }

/* ---------------------------------------------------------------------
   Koszyk (strona) i kasa
   --------------------------------------------------------------------- */

.mp-page-title {
	font-size: clamp(30px, 4vw, 48px);
	line-height: 1;
	letter-spacing: -0.03em;
	text-transform: uppercase;
	margin-bottom: 30px;
}

.mp-cols {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(min(100%, 300px), 1fr));
	gap: clamp(24px, 4vw, 44px);
	align-items: start;
}

/* ── Kasa: liczba kolumn nie może zależeć od liczby dzieci formularza ──
   checkout.js wstrzykuje ramkę komunikatów jako PIERWSZE dziecko form.checkout.
   Trzecie dziecko wybija repeat(auto-fit, …) z dwóch torów na trzy: zmierzone
   na 1440px 3 × 320px zamiast 2 × 502px. Tory trzeba usztywnić ZANIM rozepniemy
   ramkę na całą szerokość — element rozpięty 1/-1 sam blokuje zwijanie torów
   auto-fit i zostałaby trzecia, pusta kolumna.

   Koszyk (cart.php) ma samą klasę .mp-cols i zostaje na auto-fit. */
.woocommerce-checkout.mp-cols { grid-template-columns: minmax(0, 1fr); }

/* 682px, nie 700 ani 820 — to dzisiejszy próg auto-fit wyliczony z clampów
   .mp-shop: kontener = vw − 2 × clamp(16px,4vw,36px) = 0.92vw,
   gap = clamp(24px,4vw,44px) = 0.04vw, więc drugi tor wchodzi przy
   0.92vw ≥ 600 + 0.04vw → vw ≥ 681,8px. Dzięki temu kasa BEZ błędów
   nie drgnie na żadnej szerokości. */
@media (min-width: 682px) {
	.woocommerce-checkout.mp-cols { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

/* Warianty bez opakowania .woocommerce-NoticeGroup pochodzą z drugiej gałęzi
   checkout.js — bez nich zostałyby zwykłym elementem siatki w pierwszej kolumnie. */
.woocommerce-checkout.mp-cols > .woocommerce-NoticeGroup,
.woocommerce-checkout.mp-cols > .woocommerce-error,
.woocommerce-checkout.mp-cols > .woocommerce-message,
.woocommerce-checkout.mp-cols > .woocommerce-info { grid-column: 1 / -1; }

/* Odstęp pod ramką daje już gap siatki (do 44px) — własny margines go dubluje. */
.woocommerce-checkout.mp-cols > .woocommerce-NoticeGroup .woocommerce-error,
.woocommerce-checkout.mp-cols > .woocommerce-NoticeGroup .woocommerce-message,
.woocommerce-checkout.mp-cols > .woocommerce-NoticeGroup .woocommerce-info,
.woocommerce-checkout.mp-cols > .woocommerce-error,
.woocommerce-checkout.mp-cols > .woocommerce-message,
.woocommerce-checkout.mp-cols > .woocommerce-info { margin-bottom: 0; }

/* ── Góra ramki nie chowa się pod przyklejonym nagłówkiem ──
   Przyklejony stos (.mp-header + .mp-steps) ma 148px przy 390px i 113px przy
   1440px, a WooCommerce przewija zawsze do offset().top − 100. Na telefonie
   48px ramki lądowało pod paskiem.

   scroll-margin-top tu nie pomaga: checkout.js startuje animację PRZED
   .trigger('focus'), więc trwająca animacja nadpisuje przewinięcie od fokusu.
   Zostaje podniesienie górnej krawędzi pudełka; ujemny margines zdejmuje ten
   wzrost z układu, więc wysokość wiersza siatki się nie zmienia. */
.woocommerce-checkout.mp-cols > .woocommerce-NoticeGroup {
	padding-top: 30px;    /* 113 − 100 + 17 oddechu */
	margin-top: -30px;
}
@media (max-width: 600px) {
	.woocommerce-checkout.mp-cols > .woocommerce-NoticeGroup {
		padding-top: 64px;   /* 148 − 100 + 16 oddechu */
		margin-top: -64px;
	}
}

.mp-cart__head {
	display: grid;
	grid-template-columns: 1fr 110px 120px 40px;
	gap: 14px;
	padding: 0 0 12px;
	border-bottom: 1.6px solid var(--ink);
	font-family: var(--font-display);
	font-weight: 800;
	font-size: 11.5px;
	letter-spacing: 0.14em;
	text-transform: uppercase;
	color: var(--muted);
}
.mp-cart__head span:nth-child(3) { text-align: right; }

.mp-cart__row {
	display: flex;
	flex-wrap: wrap;
	gap: 14px 16px;
	align-items: center;
	padding: 18px 0;
	border-bottom: 1px solid var(--line);
}
.mp-cart__prod { display: flex; gap: 16px; align-items: center; min-width: 0; flex: 1 1 220px; }
.mp-cart__thumb { width: 54px; height: 76px; object-fit: cover; border-radius: 2px; flex: none; }
.mp-cart__name { font-family: var(--font-display); font-weight: 800; font-size: 16px; line-height: 1.2; margin-bottom: 4px; }
.mp-cart__meta { font-size: 13px; color: var(--muted); }
.mp-cart__line {
	min-width: 92px;
	text-align: right;
	margin-left: auto;
	font-family: var(--font-display);
	font-weight: 800;
	font-size: 17px;
}

/* Te same cztery kolumny były opisane dwoma systemami układu: .mp-cart__head
   to grid 1fr 110px 120px 40px, a .mp-cart__row flex z margin-left: auto —
   wyrównać się nie mogły z definicji. Etykieta ILOŚĆ wisiała nad pustym
   miejscem na lewo od steppera, a kwota wystawała poza kolumnę SUMA, mimo że
   gruba kreska 1.6px nad wierszem obiecuje tabelę.

   Próg 1100px, nie 821px: poniżej ~1066px kolumna 1fr schodzi pod min-content
   .mp-cart__prod (163px) i miniatura z tytułem nachodziłaby na stepper. */
@media (max-width: 1099.98px) {
	.mp-cart__head { display: none; }

	/* .mp-cart__head niosło DWIE rzeczy: podpisy i border-bottom 1.6px --ink,
	   czyli jedyną grubą krechę koszyka. Podniesienie progu z 820 na 1100
	   zabrało obie — lewa kolumna zaczynała się od razu miniaturą, bez górnej
	   krawędzi, podczas gdy prawa otwierała się pełną ramką .mp-summary.
	   Lista miała linię zamykającą, nie mając otwierającej.

	   Krecha 1.6px --ink to w tym arkuszu STRUKTURA, nie podpis — tak samo
	   otwiera sekcję .mp-tabs, bez żadnych etykiet. */
	.mp-cart__head + .mp-cart__row { border-top: 1.6px solid var(--ink); }
}

/* Koszyk nie dzieli się po połowie. Przy auto-fit obie kolumny miały po 502px,
   więc na tor „produkt" zostawało 190px, a sam tytuł dostawał 120px i łamał się
   na cztery wiersze — przy podsumowaniu, które tyle miejsca nie potrzebuje.
   1,6fr / 1fr daje 815 / 509px: tytuł mieści się w jednym–dwóch wierszach,
   a karta podsumowania jest nadal szersza niż ta sama karta w kasie. */
@media (min-width: 1100px) {
	.woocommerce-cart .mp-cols { grid-template-columns: minmax(0, 1.6fr) minmax(0, 1fr); }
}

@media (min-width: 1100px) {
	.mp-cart__row {
		display: grid;
		grid-template-columns: 1fr 110px 120px 40px;
		gap: 14px;
		align-items: center;
	}
	.mp-cart__row .mp-stepper { justify-self: start; }
	.mp-cart__line { min-width: 0; margin-left: 0; }
	/* padding ZOSTAJE — jego skasowanie zmniejszyłoby pole klikalne z 25 do 17px. */
	.mp-cart__remove { justify-self: end; }
}
.mp-cart__remove {
	background: none;
	border: none;
	cursor: pointer;
	color: var(--muted);
	font-size: 18px;
	line-height: 1;
}
.mp-cart__remove:hover { color: var(--accent-text); }

.mp-cart__foot { display: flex; flex-wrap: wrap; gap: 12px; align-items: center; margin-top: 26px; }
.mp-cart__continue { background: none; border: none; color: var(--accent-text); font-weight: 700; font-size: 14.5px; cursor: pointer; margin-left: auto; }

.mp-empty {
	border: 1px dashed var(--line);
	border-radius: var(--r-card);
	padding: 44px 28px;
	text-align: center;
}
.mp-empty p { margin-bottom: 18px; font-size: 17px; color: var(--muted); }

.mp-summary {
	position: sticky;
	top: 130px;
	background: var(--paper2);
	border: 1.6px solid var(--ink);
	border-radius: var(--r-card);
	padding: 24px;
}
.mp-summary__title {
	font-size: 13px;
	letter-spacing: 0.16em;
	text-transform: uppercase;
	margin-bottom: 20px;
}
.mp-row { display: flex; justify-content: space-between; gap: 12px; font-size: 15px; }
/* wc_price() zwraca kwotę opakowaną w <span class="woocommerce-Price-amount">
   WEWNĄTRZ <strong class="mp-total">, więc ten span był PIERWSZYM DZIECKIEM
   stronga i łapały go obie deskryptorowe reguły etykiety (0,1,1) — a te biją
   .mp-total (0,1,0). Skutki: „Do zapłaty" renderowało się 15px --ink, dokładnie
   jak etykieta obok (projektowe 28px --accent nie docierało na ekran w panelu,
   koszyku ani kasie), a kwota przy „Suma częściowa" wychodziła --muted, podczas
   gdy „w cenie" pod nią --ink — dwie wartości w jednej kolumnie w dwóch kolorach.
   Kombinator DZIECKA zamyka obie dziury naraz. */
.mp-row > span:first-child { color: var(--muted); }
.mp-row strong { font-weight: 700; }
.mp-summary__rows { display: flex; flex-direction: column; gap: 12px; }
.mp-rule { height: 1px; background: var(--line); margin: 6px 0; }
.mp-row--total { align-items: baseline; }
.mp-row--total > span:first-child { font-family: var(--font-display); font-weight: 800; font-size: 15px; color: var(--ink); }
/* Zawężenie do .mp-row--total (0,2,0) jest konieczne dla grubości:
   .mp-row strong (0,1,1) bije .mp-total (0,1,0), więc bez tego suma byłaby
   28px --accent, ale w wadze 700 zamiast 800. */
.mp-row--total .mp-total {
	font-family: var(--font-display);
	font-weight: 800;
	font-size: 28px;
	letter-spacing: -0.02em;
	color: var(--accent);
}
.mp-summary .mp-btn { margin-top: 22px; padding: 16px 24px; font-size: 16.5px; }
.mp-summary__note { margin-top: 14px; font-size: 12.5px; line-height: 1.55; color: var(--muted); }

.mp-checkout__sections { display: flex; flex-direction: column; gap: 34px; }
.mp-checkout h2,
.mp-block-title {
	font-size: 13px;
	letter-spacing: 0.16em;
	text-transform: uppercase;
	margin-bottom: 18px;
}
.mp-fields {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(min(100%, 200px), 1fr));
	gap: 16px;
}
.mp-field--full { grid-column: 1 / -1; }

/* ── Pole z błędem ──────────────────────────────────────────────────
   Dotąd błędne pole wyglądało identycznie jak poprawne: to samo białe tło,
   ta sama ramka 1.4px --line. Klasę .woocommerce-invalid wiesza samo
   WooCommerce na .form-row, a .form-row to u nas .mp-field.

   Krecha 3px po lewej i tło --err-bg to ten sam materiał, co ramka zbiorcza
   nad formularzem — pole i ramka mówią jednym językiem. box-shadow: inset
   nie rusza pudełka, więc nic nie skacze przy przełączeniu stanu. */
.mp-field.woocommerce-invalid > label { color: var(--accent-text); }

.mp-field.woocommerce-invalid input,
.mp-field.woocommerce-invalid select,
.mp-field.woocommerce-invalid textarea {
	border-color: var(--accent);
	background: var(--err-bg);
	box-shadow: inset 3px 0 0 0 var(--accent);
}

/* Ścieżka natywna — OSOBNA reguła, żeby nieznane :user-invalid nie zabrało
   ze sobą gałęzi WooCommerce (nieprawidłowy selektor unieważnia całą listę).
   Łapie też literówkę w e-mailu na /kontakt, gdzie klasy Woo nie powstają. */
.mp-field input:user-invalid,
.mp-field select:user-invalid,
.mp-field textarea:user-invalid {
	border-color: var(--accent);
	background: var(--err-bg);
	box-shadow: inset 3px 0 0 0 var(--accent);
}
.mp-field:has(:user-invalid) > label { color: var(--accent-text); }

/* Pole aktywne wraca na białe — bez tego fokus i błąd wyglądają identycznie. */
.mp-field.woocommerce-invalid input:focus,
.mp-field.woocommerce-invalid select:focus,
.mp-field.woocommerce-invalid textarea:focus { background: #fff; }
.mp-field input:user-invalid:focus,
.mp-field select:user-invalid:focus,
.mp-field textarea:user-invalid:focus { background: #fff; }

/* ── Komunikat pod polem ────────────────────────────────────────────
   <p class="checkout-inline-error-message"> dokleja checkout.js, a motyw
   nigdy go nie stylował — dziedziczył 16px/--ink z body i był WIĘKSZY niż
   etykieta nad polem. Hierarchia odwrócona.

   Drabinka po zmianie: 12px podpowiedź (--muted) / 13px błąd (--accent-text)
   / 16px wartość pola. Sygnał niesie pole, nie rozmiar pisma. */
.mp-field .checkout-inline-error-message {
	margin: 0;
	font-size: 13px;
	font-weight: 500;
	line-height: 1.45;
	color: var(--accent-text);
	text-wrap: pretty;
}

.mp-pay { display: flex; flex-direction: column; gap: 10px; list-style: none; margin: 0; padding: 0; }
.mp-pay li {
	border: 1.4px solid var(--line);
	border-radius: var(--r-block);
	background: #fff;
	transition: border-color .14s var(--ease);
}
/* Wybrany kafel miał dokładnie tę samą ramkę co niewybrane — jedyną różnicą
   była kropka w radiu. Co gorsza hover dawał border-color: --ink, czyli
   NAJECHANIE na niewybrany kafel wyglądało mocniej niż faktyczny wybór.

   Wybór = --accent, bo tak jest w całym systemie (.mp-tabs__btn[aria-selected],
   .mp-steps__item.is-active, .mp-form__ok). Ink 1.6px to w tym arkuszu
   STRUKTURA, nie stan. Hover schodzi na --muted, żeby hover i wybór różniły
   się BARWĄ, a nie samą grubością.

   Bez cienia: w tym arkuszu cień mają wyłącznie obiekty fotograficzne
   i pasek stały, nigdy kontener UI. Papierowy język komunikuje stan
   krawędzią, nie uniesieniem. */
.mp-pay li:hover { border-color: var(--muted); }

.mp-pay li:has(input[type="radio"]:checked) {
	border-width: 1.6px;
	border-color: var(--accent);
}
.mp-pay label {
	display: flex;
	align-items: center;
	gap: 14px;
	padding: 16px 18px;
	cursor: pointer;
	margin: 0;
}
.mp-pay__name { display: block; font-family: var(--font-display); font-weight: 800; font-size: 16px; }
.mp-pay__desc { display: block; font-size: 13px; color: var(--muted); margin-top: 3px; }
.mp-pay .payment_box { padding: 0 18px 14px 50px; font-size: 13px; color: var(--muted); }
.mp-pay .payment_box p { margin: 0; }

.mp-order-items { margin-bottom: 16px; }
.mp-order-item {
	display: flex;
	gap: 12px;
	align-items: center;
	padding: 11px 0;
	border-bottom: 1px solid var(--line);
}
.mp-order-item img { width: 34px; height: 48px; object-fit: cover; border-radius: 2px; flex: none; }
.mp-order-item__name { flex: 1; font-size: 14.5px; line-height: 1.35; }
.mp-order-item__name span { color: var(--muted); }
.mp-order-item__line { font-weight: 700; font-size: 14.5px; white-space: nowrap; }

.mp-terms { display: flex; gap: 10px; margin-top: 20px; font-size: 13.5px; line-height: 1.5; cursor: pointer; }

/* ── Zgoda na regulamin: błąd widoczny przy kontrolce ───────────────
   Opakowanie (woocommerce/checkout/terms.php) daje checkout.js punkt
   zaczepienia; tu tylko wygląd. Stan spoczynkowy podsumowania zostaje
   piksel w piksel taki jak dotąd — w stanie błędu karta rośnie o ~26px,
   co sticky top:130px wytrzymuje, a poniżej 820px .mp-summary jest
   i tak position: static. */
.mp-terms-row { display: block; }

.mp-terms-row .checkout-inline-error-message {
	margin: 7px 0 0;
	font-size: 13px;
	line-height: 1.45;
	color: var(--accent-text);
}

/* Sygnał przy samej kontrolce — bez plamy tła, żeby zgoda nie krzyczała
   głośniej niż pola w lewej kolumnie. */
.mp-terms-row.woocommerce-invalid input[type="checkbox"] {
	outline: 2px solid var(--accent);
	outline-offset: 2px;
}

/* Reguła wyżej deklaruje dokładnie to samo, co globalny :focus-visible,
   i ma wyższą specyficzność — tabulator na błędnej zgodzie nie zmieniał NIC,
   a to jedyna kontrolka blokująca złożenie zamówienia. Ten sam chwyt, co przy
   .mp-btn--accent: pierścień fokusa schodzi na --ink, sygnał błędu zostaje
   ceglany. Geometria bez zmian, więc karta podsumowania nie drga. */
.mp-terms-row.woocommerce-invalid input[type="checkbox"]:focus-visible {
	outline-color: var(--ink);
}
.mp-back {
	width: 100%;
	margin-top: 10px;
	background: none;
	border: none;
	color: var(--muted);
	font-size: 13.5px;
	cursor: pointer;
	text-align: center;
	display: block;
}
.mp-back:hover { color: var(--ink); }

/* Komunikaty Woo w szacie projektu. */
.woocommerce-error,
.woocommerce-message,
.woocommerce-info,
.mp-notice {
	margin: 0 0 26px;
	border: 1.6px solid var(--accent);
	border-radius: var(--r-block);
	padding: 16px 20px;
	background: var(--err-bg);
	font-size: 14.5px;
	line-height: 1.55;
	list-style: none;
}
/* Potwierdzenie — zielone. */
.woocommerce-message {
	border-color: var(--ok);
	background: var(--ok-bg);
}

/* Informacja neutralna. .woocommerce-info to u Woo „koszyk jest pusty",
   prośba o kupon, komunikat o wysyłce — nic się nie udało ani nie zepsuło.
   .mp-notice (thankyou.php) to „płatność nie została jeszcze zaksięgowana",
   czyli normalny stan po przelewie — dziedziczył ceglastą ramkę i różowe tło,
   więc udana transakcja wyglądała jak awaria. */
.woocommerce-info,
.mp-notice {
	border-color: var(--line);
	background: var(--paper2);
	color: var(--body);
	box-shadow: inset 3px 0 0 0 var(--muted);
}

.woocommerce-error li, .woocommerce-message li, .woocommerce-info li { margin: 0; }
.woocommerce-error .button, .woocommerce-message .button { display: none; }

/* ── Wnętrze ramki błędów ───────────────────────────────────────────
   Siedem komunikatów przy `li { margin: 0 }` czytało się jak jeden zbity
   akapit. Po rozpięciu ramki na całą szerokość jest gorzej: na 1440px
   pudełko ma 1048px, czyli ~150 znaków w wierszu przy 14,5px. */
.woocommerce-error li + li,
.woocommerce-message li + li,
.woocommerce-info li + li { margin-top: 10px; }

/* Kropka 7px na wysięgniku — ten sam znacznik, którym pasek kroków oznacza
   krok bieżący. Wcięcie sprawia, że drugi wiersz komunikatu nie udaje
   początku następnego. */
.woocommerce-error li { position: relative; padding-left: 20px; }
.woocommerce-error li::before {
	content: "";
	position: absolute;
	left: 2px;
	top: 0.58em;
	width: 7px;
	height: 7px;
	border-radius: var(--r-pill);
	background: var(--accent);
}

/* Dwie kolumny tną miarę do ~70 znaków. :has() pilnuje, żeby przy jednym
   czy dwóch błędach nie powstała ramka z pustą prawą połową. */
@media (min-width: 900px) {
	.woocommerce-checkout .woocommerce-error:has(li:nth-child(4)) {
		columns: 2;
		column-gap: 36px;
	}
	.woocommerce-checkout .woocommerce-error:has(li:nth-child(4)) li {
		break-inside: avoid;
	}
}

/* Przy włączonym JS każde z tych zdań stoi drugi raz pod swoim polem.
   Ramki nie chowamy — bez JS to jedyny kanał błędów, ma role="alert"
   i jest celem przewinięcia. Zdejmujemy z niej nacisk, żeby czytała się
   jako spis skrótów do pól: checkout.js opakowuje każdą pozycję w <a>,
   więc podkreślenie to nie ozdoba, tylko brakująca informacja,
   że w te wiersze da się kliknąć. */
html.js .woocommerce-checkout .woocommerce-error { font-size: 13.5px; }
.woocommerce-error a {
	color: var(--accent-text);
	text-decoration: underline;
	text-underline-offset: 3px;
}
.woocommerce-error a:hover { color: var(--ink); }

/* ---------------------------------------------------------------------
   Potwierdzenie
   --------------------------------------------------------------------- */

/* Potwierdzenie trzyma kolumnę sklepu: max-width 900px dawał lewą krawędź
   treści na 306px przy 1440, a nagłówek i pasek kroków stoją na 196px —
   dwie linie pionowe na stronie, która ma domykać zakup. Miarę tekstu
   utrzymuje ograniczenie samego akapitu wiodącego.
   90px zapasu na dole przestaje domykać stronę po wejściu pełnej stopki
   i zaczyna być dziurą między CTA a stopką. */
.mp-done {
	max-width: var(--w-shop);
	margin: 0 auto;
	padding: clamp(28px, 5vw, 62px) var(--pad-x) clamp(40px, 5vw, 64px);
}
/* Potwierdzenie renderuje się WEWNĄTRZ <main class="mp-shop">: page.php owija
   w nią gałąź is_cart() || is_checkout(), a is_checkout() obejmuje też endpoint
   order-received. .mp-done dokładało więc max-width i padding drugi raz —
   treść stała na 232px, a nagłówek i stopka na 196px, czyli była WĘŻSZA
   od stopki bezpośrednio pod sobą.

   POTOMEK, nie dziecko: shortcode WooCommerce bezwarunkowo wkłada między
   .mp-shop a .mp-done własne <div class="woocommerce">. Kombinator `>`
   dałby regułę martwą. */
.mp-shop .mp-done {
	max-width: none;
	margin: 0;
	padding: 0;
}

.mp-done__lead { max-width: 68ch; }
.mp-done__badge {
	display: inline-flex;
	align-items: center;
	gap: 10px;
	background: var(--ok-bg);
	color: var(--ok-text);
	border-radius: var(--r-pill);
	padding: 9px 18px;
	font-family: var(--font-display);
	font-weight: 800;
	font-size: 13px;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	margin-bottom: 22px;
}
.mp-done__title {
	font-size: clamp(30px, 4.2vw, 52px);
	line-height: 1;
	letter-spacing: -0.03em;
	text-transform: uppercase;
	margin-bottom: 14px;
}
.mp-done__lead { font-size: 16.5px; line-height: 1.6; color: var(--body); max-width: 60ch; margin-bottom: 34px; }
.mp-tiles {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(min(50% - 1px, 150px), 1fr));
	gap: 1px;
	background: var(--line);
	border: 1px solid var(--line);
	border-radius: var(--r-block);
	overflow: hidden;
	margin-bottom: 34px;
}
/* .mp-tiles ma background: var(--line) i gap: 1px, czyli kreski między
   kaflami rysuje tło kontenera. Kafle miały jednak kolor strony, więc
   NUMER / DATA / SUMA / PŁATNOŚĆ było siatką kresek zawieszoną w powietrzu,
   bez płyty pod spodem — a 34px niżej .mp-reserved ma ramkę 1,6px --ink
   na --paper2 i przejmowało całą uwagę. Dane transakcji były najlżejszym
   elementem widoku. Kontrast etykiet rośnie z 4,84:1 do 5,29:1. */
.mp-tile { background: var(--paper2); padding: 16px 18px; }
.mp-tile__label {
	font-size: 11.5px;
	letter-spacing: 0.12em;
	text-transform: uppercase;
	color: var(--muted);
	font-weight: 700;
	margin-bottom: 5px;
}
.mp-tile__value { font-family: var(--font-display); font-weight: 800; font-size: 16px; }

.mp-reserved {
	border: 1.6px solid var(--ink);
	border-radius: var(--r-card);
	padding: clamp(22px, 3vw, 34px);
	background: var(--paper2);
	margin-bottom: 30px;
}
.mp-reserved__label {
	font-family: var(--font-display);
	font-weight: 800;
	font-size: 12.5px;
	letter-spacing: 0.16em;
	text-transform: uppercase;
	color: var(--accent-text);
	margin-bottom: 6px;
}
.mp-reserved__lead { font-size: 15px; line-height: 1.6; color: var(--muted); max-width: 56ch; margin-bottom: 20px; }
.mp-reserved__row { display: flex; flex-wrap: wrap; align-items: center; gap: 14px; }
/* Miało SAMO width — bez wysokości i bez object-fit, więc kwadratowe źródło
   zostawało kwadratem i na stronie domykającej zakup okładka była jedynym
   obrazem w sklepie, który nie jest pionowy. 62×88 trzyma wspólną proporcję
   z resztą ścieżki. */
.mp-reserved__row img {
	width: 62px;
	height: 88px;
	object-fit: cover;
	object-position: top;
	border-radius: 2px;
	box-shadow: var(--sh-thumb);
}
.mp-reserved__title { font-family: var(--font-display); font-weight: 800; font-size: clamp(17px, 2.4vw, 22px); letter-spacing: -0.02em; }
.mp-reserved__note { font-size: 13.5px; color: var(--muted); }

.mp-downloads {
	border: 1px solid var(--line);
	border-radius: var(--r-card);
	padding: clamp(20px, 3vw, 30px);
	margin-bottom: 30px;
}
.mp-downloads__row {
	display: flex;
	flex-wrap: wrap;
	gap: 16px;
	align-items: center;
	padding: 14px 0;
	border-top: 1px solid var(--line);
}
.mp-downloads__row img { width: 42px; height: 60px; object-fit: cover; border-radius: 2px; }
.mp-downloads__name { flex: 1; min-width: 140px; font-family: var(--font-display); font-weight: 800; font-size: 16px; }
.mp-downloads__links { display: flex; gap: 8px; flex-wrap: wrap; }
.mp-downloads__links a {
	border: 1.3px solid var(--line);
	border-radius: var(--r-pill);
	padding: 9px 16px;
	font-size: 13.5px;
	font-weight: 700;
	color: var(--ink);
}
.mp-downloads__links a:hover { border-color: var(--accent); color: var(--accent-text); }
.mp-downloads__note { margin-top: 16px; font-size: 13px; color: var(--muted); }

.mp-next {
	border-top: 1px solid var(--line);
	padding-top: 26px;
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(min(100%, 200px), 1fr));
	gap: 24px;
}
.mp-next strong { font-family: var(--font-display); font-weight: 800; font-size: 15px; display: block; margin-bottom: 8px; }
.mp-next p { font-size: 14.5px; line-height: 1.6; color: var(--muted); }
.mp-done__actions { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 34px; }

/* ---------------------------------------------------------------------
   Panel koszyka
   --------------------------------------------------------------------- */

.mp-overlay {
	position: fixed;
	inset: 0;
	z-index: 60;
	background: rgba(26, 22, 19, 0.45);
	opacity: 0;
	transition: opacity 260ms var(--ease);
}
.mp-overlay.is-open { opacity: 1; }

.mp-panel {
	position: fixed;
	inset: 0 0 0 auto;
	z-index: 61;
	width: min(420px, 92vw);
	height: 100dvh;
	background: var(--paper);
	border-left: 1.6px solid var(--ink);
	display: flex;
	flex-direction: column;
	transform: translateX(100%);
	transition: transform 260ms var(--ease);
}
.mp-panel.is-open { transform: translateX(0); }
.mp-panel.is-busy { opacity: .55; pointer-events: none; }

@media (prefers-reduced-motion: reduce) {
	.mp-panel, .mp-overlay { transition: none; }
}

.mp-panel__head {
	display: flex;
	align-items: center;
	gap: 12px;
	padding: 18px 22px;
	border-bottom: 1.6px solid var(--ink);
	flex: none;
}
.mp-panel__title { font-size: 17px; letter-spacing: -0.01em; }
.mp-panel__close {
	margin-left: auto;
	background: none;
	border: 1.4px solid var(--line);
	border-radius: 10px;
	width: 38px;
	height: 38px;
	display: flex;
	align-items: center;
	justify-content: center;
	cursor: pointer;
	color: var(--ink);
}
.mp-panel__close:hover { border-color: var(--ink); }

.mp-panel__body {
	flex: 1;
	overflow-y: auto;
	padding: 18px 22px 26px;
	display: flex;
	flex-direction: column;
}
.mp-panel__items { list-style: none; margin: 0 0 20px; padding: 0; }
.mp-panel__item {
	display: flex;
	gap: 14px;
	align-items: flex-start;
	padding: 16px 0;
	border-bottom: 1px solid var(--line);
}
.mp-panel__img { width: 54px; height: 76px; object-fit: cover; border-radius: 2px; flex: none; }

/* Źródłem był 'woocommerce_gallery_thumbnail', czyli kwadrat wycięty ze ŚRODKA
   pionowej okładki 800×1315 — z okładki zostawało „niemiła. TO MENOPAUZA",
   bez nazwiska autorki i bez pierwszego wiersza tytułu, w panelu widzianym
   przy każdym dodaniu do koszyka. Po przejściu na 'medium' (proporcje
   zachowane) kadr trzeba zakotwiczyć u góry, żeby przy dopasowaniu do gniazda
   docinał się dół, a nie tytuł książki. */
.mp-panel__img,
.mp-cart__thumb,
.mp-order-item img,
.mp-downloads__row img { object-position: top; }
.mp-panel__info { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 8px; }

/* .mp-panel__info to flex-column BEZ align-items, więc dzieci dostawały
   domyślne stretch: stepper „− 1 +" rozciągał się na ~245px (desktop)
   i ~164px (390px), choć zawartość potrzebuje ~90px. Największy i najjaśniejszy
   element wiersza sterował liczbą „1", a pozycja koszyka wyglądała jak
   niedokończony formularz. Nazwa i meta mają dalej zajmować całą szerokość,
   więc align-items na kontenerze nie wchodzi w grę. */
.mp-panel__info .mp-stepper { align-self: flex-start; }
.mp-panel__name { font-family: var(--font-display); font-weight: 800; font-size: 16px; line-height: 1.2; }
.mp-panel__meta { font-size: 13px; color: var(--muted); }

/* Ebook sprzedajemy pojedynczo — zamiast steppera sama liczba, w tej samej
   wadze co kwota obok, żeby wiersz nie zrobił się lżejszy od pozostałych. */
.mp-panel__qty-fixed,
.mp-cart__qty-fixed {
	font-family: var(--font-display);
	font-weight: 800;
	font-size: 15px;
	color: var(--muted);
}
.mp-panel__right { display: flex; flex-direction: column; align-items: flex-end; gap: 10px; flex: none; }
.mp-panel__line { font-family: var(--font-display); font-weight: 800; font-size: 17px; white-space: nowrap; }
.mp-panel__remove {
	background: none;
	border: none;
	cursor: pointer;
	color: var(--muted);
	font-size: 18px;
	line-height: 1;
}
.mp-panel__remove:hover { color: var(--accent-text); }

.mp-panel__totals { display: flex; flex-direction: column; gap: 12px; margin-bottom: 20px; }
.mp-panel__rule { height: 1px; background: var(--line); margin: 4px 0; }
.mp-panel__body .mp-btn--accent { padding: 16px 24px; font-size: 16.5px; }
.mp-panel__continue {
	margin-top: 12px;
	background: none;
	border: none;
	color: var(--accent-text);
	font-weight: 700;
	font-size: 14.5px;
	cursor: pointer;
}
.mp-panel__empty {
	border: 1px dashed var(--line);
	border-radius: var(--r-card);
	padding: 36px 24px;
	text-align: center;
	margin: auto 0;
}
.mp-panel__empty p { margin-bottom: 18px; font-size: 16px; color: var(--muted); }

body.mp-locked { overflow: hidden; }

/* ---------------------------------------------------------------------
   Widok mobilny (≤ 820px)
   --------------------------------------------------------------------- */

@media (max-width: 820px) {
	.mp-nav { display: none; }
	.mp-burger { display: flex; }
	.mp-cta__long { display: none; }
	.mp-cta__short { display: inline; }
	/* Na desktopie w prawo spycha wszystko .mp-nav { margin-left: auto }, a grupa
	   akcji ma margines wyzerowany regułą .mp-nav + .mp-header__action (0,2,0).
	   Tu nawigacja jest ukryta, więc jej margines nie działa — a samo
	   .mp-header__action { margin-left: auto } (0,1,0) przegrywało z tamtą regułą
	   i na landingu przycisk z ceną i burger stały na 138–293 px z 390 px
	   (zrzut z Messengera, 14.09.2026). Selektor musi mieć tę samą specyficzność. */
	.mp-nav + .mp-header__action,
	.mp-header__action { margin-left: auto; }

	.mp-menu-mobile[hidden] { display: none; }

	.mp-hero { padding-top: clamp(28px, 7vw, 48px); }
	.mp-hero__media { margin-bottom: 18px; }

	/* Cele dotykowe: nic poniżej 44px. */
	.mp-btn, .mp-cta, .mp-cartbtn, .mp-social a, .mp-chip, .mp-related__link { min-height: 44px; }
	.mp-stepper button { width: 44px; height: 46px; }
	.mp-stepper--sm button { width: 40px; height: 40px; }
	.mp-panel__close { width: 44px; height: 44px; }

	/* Krzyżyk „usuń" i „Kontynuuj zakupy" też są celami dotykowymi, a w liście
	   wyżej ich zabrakło. Zmierzone przy 390px: 21,5×26, 25,5×26 i 314×20px —
	   jedyna NIEODWRACALNA akcja w koszyku miała najmniejszy cel dotykowy
	   (21,5px nie przechodzi nawet progu 24px z WCAG 2.2 SC 2.5.8).
	   Pole rośnie W LEWO: zostawiamy poziomy padding i dociskamy glif do prawej,
	   żeby × nie odjechał od prawej krawędzi ceny. */
	.mp-panel__remove,
	.mp-cart__remove {
		min-width: 44px;
		min-height: 44px;
		display: inline-flex;
		align-items: center;
		justify-content: flex-end;
	}
	.mp-panel__remove { padding: 0 6px; }
	.mp-cart__remove  { padding: 0 8px; }
	.mp-panel__continue { min-height: 44px; margin-top: 4px; }
	.mp-faq__q { padding: 20px 0; min-height: 44px; }

	.mp-cart__head { display: none; }
	.mp-cart__line { min-width: 0; }


	/* Karta produktu jednokolumnowa. Bez sticky na formularzu: prostokąt
	   ograniczający sticky to rodzic formularza (bezklasowy <div> z
	   single-product.php), a ten zaczyna się na .mp-product__title —
	   przeglądarka nie mogła cofnąć paska wyżej i dociskała go NA tytuł.
	   Efekt: h1 nie było widać wcale, cena przecięta poziomo w połowie glifów,
	   a „Kup teraz" wypadało poza dolną krawędź okna. Przy 768px to samo
	   zjadało akapit leadu. Przyklejony był i tak tylko przez kilkanaście
	   procent długości strony i gasł przed zakładkami opisu.

	   Trwałe CTA na telefonie wymaga position: fixed na OSOBNYM elemencie
	   poza tym <div> (wzorzec .mp-stickybar) — to zmiana znaczników
	   i osobna decyzja, nie poprawka w tym bloku. */
	.mp-product__top { grid-template-columns: 1fr; }

	.mp-footer__grid { padding-bottom: clamp(40px, 6vw, 76px); }
	body.home .mp-footer__grid { padding-bottom: 110px; }
	.mp-tabs__btn { padding: 14px 14px; }
}

/* Trzy elementy rzędu mają flex: none, więc nic się nie kurczyło:
   16 + logo 194,9 + 20 + koszyk 112,6 + 20 + burger 46 + 16 = 425,5px
   przy 390px dostępnych — przycisk menu był ucięty prawą krawędzią,
   a cała strona przewijała się w bok.

   Próg 520px, nie 420px: potrzeba 425,5px, więc iPhone 414 / 428 / 430px
   też były zepsute i przy 420px reguła by ich nie objęła. */
/* Nagłówek marketingowy ma ten sam problem, który pierwsza runda naprawiła
   w nagłówku sklepowym — tylko przy węższym progu, bo logo jest dwuwierszowe,
   a pigułka z ceną węższa od przycisku koszyka. Zmierzone przy 360px:
   18 + logo 185 + 10 + pigułka 104 + 10 + burger 46 + 18 = 401px przy 360
   dostępnych, więc przycisk menu kończył się na 373px — 13px poza ekranem.

   Próg 400px, nie 390: przy 390px bilans wychodzi na styk (401 > 390),
   więc reguła musi objąć również najpopularniejsze telefony 390–393px. */
@media (max-width: 400px) {
	/* flex: 0 1 auto nadpisuje flex: none — dopiero to pozwala logotypowi ustąpić. */
	.mp-header:not(.mp-header--shop) .mp-logo {
		flex: 0 1 auto;
		min-width: 0;
		gap: 8px;
	}
	.mp-header:not(.mp-header--shop) .mp-logo svg { flex: none; }
	.mp-header:not(.mp-header--shop) .mp-logo__name,
	.mp-header:not(.mp-header--shop) .mp-logo__author {
		overflow: hidden;
		text-overflow: ellipsis;
		white-space: nowrap;
	}
	/* Litera węższa o pół piksela oddaje ~12px w całym logotypie. */
	.mp-header:not(.mp-header--shop) .mp-logo__name { letter-spacing: 0.09em; }
	.mp-header:not(.mp-header--shop) .mp-header__bar { gap: 8px; }
	.mp-cta--header { padding-left: 14px; padding-right: 14px; }
}

@media (max-width: 520px) {
	.mp-header--shop .mp-header__bar { gap: 10px; }

	/* flex: 0 1 auto nadpisuje flex: none — dopiero to pozwala logotypowi
	   ustąpić. Samo min-width: 0 nic by nie dało. */
	.mp-header--shop .mp-logo--inline {
		flex: 0 1 auto;
		min-width: 0;
		gap: 8px;
		font-size: 13px;
		letter-spacing: 0.07em;   /* tracking oddaje więcej niż stopień pisma */
	}
	.mp-header--shop .mp-logo--inline svg { flex: none; }

	/* Zawór poniżej ~370px: skraca się nazwisko, nie przycisk menu. */
	.mp-header--shop .mp-logo--inline > span {
		overflow: hidden;
		text-overflow: ellipsis;
		white-space: nowrap;
	}

	.mp-header--shop .mp-cartbtn { padding: 9px 12px; gap: 7px; }

	/* Bez tego odzyskane piksele zostają po prawej jako dziura, a burger nie
	   siada w gutterze: .mp-nav + .mp-header__action { margin-left: 0 } ma
	   specyficzność 0,2,0 i bije .mp-header__action { margin-left: auto }
	   z bloku 820px (0,1,0) — media query specyficzności nie podnosi. */
	.mp-header--shop .mp-nav + .mp-header__action { margin-left: auto; }
}

/* Pasek kroków: pierwsza linia kończyła się separatorem „-" wiszącym
   w powietrzu za „3 · PŁATNOŚĆ". Separator to zwykły dywiz, więc przy
   zawijaniu czytał się jak literówka.

   Próg 600px: zmierzona naturalna szerokość zawartości paska to 509,9px,
   a dostępne = 0.92vw, więc zawijanie zaczyna się przy vw ≈ 554px.
   Przy 768px pasek jest jednolinijkowy — breakpoint 820px byłby błędny. */
@media (max-width: 600px) {
	.mp-steps__sep { display: none; }

	/* row-gap trzyma oba wiersze osobno; column-gap przejmuje rolę separatora
	   jako jedyny odstęp między krokami. */
	.mp-steps__inner { gap: 4px 14px; }

	/* Poziomy padding był tylko po to, żeby odsunąć tekst od separatorów. */
	.mp-steps__item { padding: 6px 0; }
}

@media (max-width: 420px) {
	.mp-hero__seal { right: -4px; bottom: -14px; }
	.mp-related__card { grid-template-columns: 64px minmax(0, 1fr); }
}

/* Panel otwarty — dolny pasek landingu schodzi z drogi. */
body.mp-locked .mp-stickybar { display: none; }

/* ---------------------------------------------------------------------
   Bez JavaScriptu

   Elementy, które normalnie zwija skrypt, mają w znacznikach atrybut
   `hidden`. Gdy skryptu nie ma, nikt ich nie rozwinie — więc pokazujemy
   je z powrotem i chowamy przełączniki, które i tak by nie zadziałały.
   --------------------------------------------------------------------- */

/* Jedno `display: block` dla wszystkich czterech spłaszczało dwa kontenery flex.
   .mp-tabs__panel i .mp-ecard__desc trzymają odstępy WYŁĄCZNIE flexowym `gap`
   (reguła globalna zeruje `p { margin: 0 }`), więc bez skryptu akapity stykały się
   na zero: zakładka „Wysyłka" miała cztery akapity bez jednej przerwy, a ::before
   robiący nagłówek sekcji stawał się pudełkiem liniowym — `align-self`
   i `margin-bottom` przestawały działać, a podkreślenie wchodziło w tekst.
   Menu mobilne i odpowiedź FAQ są blokowe od początku i zostają na `block`. */
html:not(.js) .mp-menu-mobile[hidden],
html:not(.js) .mp-faq__a[hidden] { display: block !important; }

html:not(.js) .mp-tabs__panel[hidden],
html:not(.js) .mp-ecard__desc[hidden] { display: flex !important; }

html:not(.js) .mp-burger,
html:not(.js) .mp-more,
html:not(.js) .mp-faq__sign,
html:not(.js) .mp-tabs__list { display: none; }

html:not(.js) .mp-faq__q { cursor: default; }

/* Zakładki produktu zamieniają się w trzy opisane sekcje. */
html:not(.js) .mp-tabs__panel { margin-bottom: 34px; }
html:not(.js) .mp-tabs__panel::before {
	content: attr(data-title);
	font-family: var(--font-display);
	font-weight: 800;
	font-size: 14px;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	padding-bottom: 6px;
	border-bottom: 3px solid var(--accent);
	align-self: flex-start;
	margin-bottom: 8px;
}

/* Menu mobilne bez skryptu pokazujemy tylko tam, gdzie znika zwykła nawigacja. */
@media (min-width: 821px) {
	html:not(.js) .mp-menu-mobile[hidden] { display: none !important; }
}

/* ─── Zapewnienia pod przyciskiem płatności ─── */
.mp-assure {
	margin: 16px 0 0;
	padding: 0;
	list-style: none;
	display: grid;
	gap: 7px;
	font-size: 13px;
	line-height: 1.55;
	color: var(--muted);
}
.mp-assure li { position: relative; padding-left: 16px; }
.mp-assure li::before {
	content: "";
	position: absolute;
	left: 0;
	top: 0.52em;
	width: 6px;
	height: 6px;
	border-radius: 50%;
	background: var(--accent);
}

/* ─── Formularz kontaktowy: wynik i pułapka ─── */
.mp-form__ok, .mp-form__error { margin: 0 0 16px; padding: 12px 14px; border-radius: 10px; font-size: 15px; line-height: 1.5; }
.mp-form__ok    { background: var(--paper2); border: 1px solid var(--ok);    color: var(--ok-text); }
.mp-form__error { background: var(--paper2); border: 1px solid var(--accent); color: var(--accent-text); }
.mp-form__trap  { position: absolute; left: -9999px; top: auto; width: 1px; height: 1px; overflow: hidden; }

/* ─── Mockup 3D książki ───
   Zamawiający dostarczył render książki na własnym kremowym tle z cieniem od
   podłogi. Dotychczasowe reguły (obrót −2°, cień, zaokrąglenie) były pisane pod
   PŁASKĄ okładkę i na renderze dawały obróconą, ocienioną kartę z widoczną
   krawędzią kwadratu — „zdjęcie w ramce", nie książka na stronie. Render ma
   już własną perspektywę i cień, więc zostaje płaski, a krawędź kwadratu
   rozpuszcza maska: tło mockupu (#FAF0E6 → #E6DFD1) różni się od --paper
   i --paper2 o kilka poziomów, za mało, by je dopasować, za dużo, by ignorować.
   Płaskie okładki ebooków tej klasy nie dostają. */
.mp-mockup,
.mp-hero__media .mp-mockup,
.mp-presale__media .mp-mockup,
.mp-feature__media .mp-mockup,
.mp-product__frame .mp-mockup {
	transform: none;
	box-shadow: none;
	border-radius: 0;
	-webkit-mask-image: radial-gradient(ellipse 62% 66% at 50% 47%, #000 58%, transparent 100%);
	mask-image: radial-gradient(ellipse 62% 66% at 50% 47%, #000 58%, transparent 100%);
}
.mp-hero__media .mp-mockup { width: min(100%, 520px); }

/* Notka o ofercie łączonej: ikona i tekst w jednym wierszu — flex-wrap łamał
   długi span pod ikonę, co wyglądało jak osierocona ikona. */
.mp-saveline { flex-wrap: nowrap; align-items: flex-start; }
.mp-saveline > svg { flex: none; margin-top: 2px; }
.mp-saveline > span { flex: 1 1 auto; min-width: 0; }

/* ─── Logo: znak słowny ───
   Zastępuje ikonę serca + dwa wiersze tekstu. Wysokość, nie szerokość: pasek
   nagłówka ma stałą wysokość, a znak ma proporcje ~3:1. Na 390 px schodzi do 26 px,
   żeby zostało miejsce na przycisk i menu. */
.mp-logo__img { display: block; height: 34px; width: auto; }
.mp-logo--inline .mp-logo__img { height: 30px; }
@media (max-width: 480px) { .mp-logo__img, .mp-logo--inline .mp-logo__img { height: 26px; } }

/* Potwierdzenie po nieudanej płatności */
.mp-done__hero { display: grid; gap: 14px; }
.mp-done__note { font-size: 14px; color: var(--muted); }
.mp-done__note a { text-decoration: underline; }

/* Pola bramki płatności pod etykietą metody (siatka banków PayU, BLIK, karta).
   Klasa .payment_box jest wymagana — checkout.js WooCommerce po niej przełącza. */
.mp-pay__fields { margin: 12px 0 4px; padding: 14px 16px; background: var(--paper2); border: 1px solid var(--line); border-radius: 12px; font-size: 14px; }
.mp-pay__fields img { max-height: 32px; width: auto; }
.mp-pay__fields .payu-list-banks, .mp-pay__fields ul { display: flex; flex-wrap: wrap; gap: 8px; list-style: none; margin: 0; padding: 0; }

/* ─── Dostawa: wybór metody (InPost) w koszyku i kasie ───
   Pozycja to siatka: radio | etykieta, a wszystko, co wtyczka InPost dokleja
   po etykiecie (logo, „Wybierz punkt odbioru", nazwa wybranego paczkomatu),
   ląduje w drugim wierszu pod etykietą — radio zostaje przy nazwie metody,
   a ramka obejmuje całość. Radio pozycjonowane absolutnie wobec <li>
   zjeżdżało w dół, gdy <li> rosło o elementy wtyczki. */
.mp-shipping { margin: 6px 0 10px; }
.mp-shipping__label { margin: 0 0 8px; font-family: var(--font-display); font-weight: 800; font-size: 12.5px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--muted); }
.mp-shipping__list { list-style: none; margin: 0; padding: 0; display: grid; gap: 8px; }
.mp-shipping__item { display: grid; grid-template-columns: auto 1fr; column-gap: 10px; align-items: center; padding: 11px 14px; background: var(--paper); border: 1px solid var(--line); border-radius: 12px; }
.mp-shipping__item--single { grid-template-columns: 1fr; }
.mp-shipping__item input[type="radio"] { margin: 0; width: 16px; height: 16px; accent-color: var(--accent); }
.mp-shipping__item label { display: flex; justify-content: space-between; align-items: center; gap: 12px; margin: 0; cursor: pointer; font-size: 15px; min-width: 0; }
.mp-shipping__item--single label { cursor: default; }
.mp-shipping__item:has(input:checked) { border-color: var(--accent); box-shadow: inset 0 0 0 1px var(--accent); }
.mp-shipping__item:has(input:focus-visible) { outline: 2px solid var(--accent); outline-offset: 2px; }
.mp-shipping__name { min-width: 0; }
.mp-shipping__cost { font-weight: 700; white-space: nowrap; }
.mp-shipping__item > :not(input):not(label) { grid-column: 2; margin-top: 8px; font-size: 14px; }
.mp-shipping__item--single > :not(input):not(label) { grid-column: 1; }
.mp-shipping__note { margin: 8px 0 0; font-size: 13px; color: var(--muted); }
