/* ============================================================
   pki.eu — motyw DefaultClean_PKIEU_V3: MAKIETA C (jednokolumnowy wariant v3,
   rundy 1–4, decyzja Szymona 14.10.2026 „implementuj ten motyw”).
   Źródło: ~/RiderProjects/pkieu-mockups-2026/c-jednokolumnowy/assets/
   pkieu.css (system wizualny z rundy 3: tokeny typografii, promieni,
   cieni, odstępów, kontrolek; runda 4: ramki 1 px bez kolorowych pasków)
   + nakładka pkieu-c.css (drzewo „Kategorie ▾”, hero z Ofertą tygodnia,
   zakładki Bestsellerów, znacznik Szybkiej wysyłki).
   Kolejność pliku: [1] pkieu.css makiety C z poprawkami motywu (bez kontrolki
   „Dostawa do”, .hero-t, logotypy płatności) → [2] nakładka pkieu-c.css (bez
   styleguide) → [3] mosty Nopa i warstwa zgodności → [4] mosty makiety C →
   [5] tryb ciemny. Tryb ciemny = te same tokeny (zmieniaj OBA bloki w [5]).
   ============================================================ */
:root{
  /* RUCH (audyt 5.11, zadanie „przejścia w kasie spójne ze sklepem”): dominujące przejście motywu to 150 ms ease-out dla zmian stanu
     (menu i podpowiedzi — opacity/transform/clip-path, ikony-strzałki, kafle), 200 ms ease-out dla paneli i arkuszy (mini-koszyk,
     pasek .sbuy, szuflada nagłówka, toasty 180 ms), 300 ms dla przyklejonego nagłówka/paska. Tokeny dla NOWYCH reguł (kasa:
     pkieu-address.css); stare reguły zostają z liczbami. prefers-reduced-motion: reguła globalna *{transition:none} niżej. */
  --t-fast:.15s; --t-base:.2s; --t-slow:.3s; --ease:ease-out;
  /* 869f7deet (Szymon: „przyciemnić tło”): jasny motyw bez bieli — powierzchnie #fff → #f2f2f2, pozostałe szarości tła
     i linii przyciemnione tym samym krokiem (×242/255 na kanał), więc hierarchia jasności bez zmian; --muted #8a8a8a → #646464,
     żeby drobny tekst miał ≥ 4.5:1 (WCAG AA) także na najciemniejszym tle (--wash2 w stopce). */
  --ground:#f2f2f2; --wash:#eaeaea; --wash2:#e5e2e0; --ink:#201d1c; --body:#555;
  --muted:#646464; --line:#dcdcdc; --line2:#cecac8;
  --red:#b7171a; --red-deep:#931e1a;
  /* wypełnienia (tło pod białym tekstem) — w jasnym = czerwień/zieleń marki,
     w ciemnym rozjaśnione osobno od koloru tekstu (patrz [data-theme=dark]) */
  --red-fill:#b7171a; --red-fill-deep:#931e1a; --green-fill:#2f5d43;
  --surface:#f2f2f2; --on-ink:#fff; --num:#c8c3c2; --cv-ring:inset 0 0 0 1px rgba(0,0,0,.04);
  --topbar-bg:#b7171a; --chip-bg:#201d1c; --chip-ink:#fff; --chip-x:rgba(255,255,255,.2);
  --shadow:rgba(32,29,28,.12); --overlay:rgba(32,29,28,.45); --thumb-ring:rgba(0,0,0,.08);
  /* okładki: w jasnym multiply zjada białe marginesy z feedu; w ciemnym multiply
     przyciemniłby okładkę → normal + przygaszenie + obrys/cień jako drop-shadow
     (filter idzie po pikselach obrazu; box-shadow objąłby pudełko <img> z letterboxem) */
  --cover-blend:multiply; --cover-filter:none; --cover-shadow:none;
  --logo-filter:none; --logo-radius:0;
  --graphite:#33434f; --green:#2f5d43; --green-wash:#e2e8e4;
  --brown:#7a5230; --gold:#b38534; --blue:#0b6fc2;
  --head:"Montserrat",Helvetica,Arial,sans-serif;
  --sans:"Roboto",Helvetica,Arial,sans-serif;
  --maxw:1320px;
  /* ---- RUNDA 3 (makieta C): system wizualny — jedna skala dla wszystkich komponentów ---- */
  /* typografia: 9 stopni (px) */
  --fs-2xs:11px;   /* badge, licznik */
  --fs-xs:11.5px;  /* meta, nota Omnibus (nie mniej — BGH I ZR 183/24) */
  --fs-tool:11px;  /* etykiety rzędu narzędzi nagłówka (Waluta · Motyw · Konto · Przechowalnia · Koszyk) */
  --fs-sm:12.5px;  /* UI: przyciski, etykiety, okruszki */
  --fs-md:13.5px;  /* tekst drugorzędny, chipy, linki */
  --fs-base:14.5px;/* treść, tytuł karty */
  --fs-label:15px; /* etykieta sekcji (Montserrat, uppercase) */
  --fs-lg:17px;    /* cena na karcie */
  --fs-xl:21px;    /* cena wyróżniona (Oferta tygodnia) */
  --fs-h1m:24px; --fs-h1:28px; --fs-hero:30px;
  --ls-label:.14em; /* uppercase etykiety sekcji */
  --ls-ui:.06em;    /* uppercase przyciski, nav, segmenty, badge */
  /* promienie: 3 + arkusz mobile */
  --r-xs:2px; --r:3px; --r-pill:999px; --r-sheet:12px;
  /* cienie: tylko warstwy nad treścią */
  --sh-1:0 2px 8px var(--shadow); --sh-pop:0 16px 40px var(--shadow); --sh-drawer:8px 0 32px var(--shadow);
  /* wysokości kontrolek (siatka 8 px) */
  --h-sm:32px; --h-md:40px; --h-lg:48px; --h-touch:44px;
  /* odstępy (siatka 4/8 px) */
  --sp-1:4px; --sp-2:8px; --sp-3:12px; --sp-4:16px; --sp-5:24px; --sp-6:32px; --sp-7:48px;
  /* ikony: jedna rodzina (stroke), jedna grubość, 3 rozmiary */
  --ico-sw:1.8; --ico-16:16px; --ico-20:20px; --ico-24:24px;
  --on-fill:#fff;
  --banner-bg:linear-gradient(120deg,#5d1f1c,#b7171a 65%,#c8433d); /* baner kampanii: zawsze czerwony (treść, nie chrome) */ /* tekst na czerwonym/zielonym wypełnieniu — w obu motywach biały */
  color-scheme:light;
}
*{box-sizing:border-box;}
html{background:var(--ground);-webkit-text-size-adjust:100%;}
body{margin:0;font-family:var(--sans);color:var(--body);background:var(--ground);font-size:var(--fs-base);line-height:1.6;-webkit-font-smoothing:antialiased;}
a{color:inherit;text-decoration:none;}
img{max-width:100%;display:block;}
button,select,input{font-family:inherit;}
button{cursor:pointer;}
ul,ol{margin:0;padding:0;list-style:none;}
:focus-visible{outline:2px solid var(--red);outline-offset:2px;}
h1,h2,h3,h4{font-family:var(--head);color:var(--ink);margin:0;font-weight:700;line-height:1.25;text-wrap:balance;}
.wrap{max-width:var(--maxw);margin:0 auto;padding:0 26px;}
.sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;}
.skip{position:absolute;left:8px;top:-60px;background:var(--ink);color:var(--on-ink);padding:8px 14px;z-index:200;border-radius:var(--r);}
.skip:focus{top:8px;}

/* ---------- prymitywy (1:1 z v3) ---------- */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;font-family:var(--head);font-weight:700;font-size:var(--fs-sm);line-height:1;letter-spacing:var(--ls-ui);text-transform:uppercase;height:42px;padding:0 22px;border:0;border-radius:var(--r);white-space:nowrap;transition:background .14s,color .14s,border-color .14s;}
.btn svg{width:var(--ico-16);height:var(--ico-16);stroke:currentColor;fill:none;stroke-width:var(--ico-sw);}
.btn-primary{background:var(--red-fill);color:var(--on-fill);}
.btn-primary:hover{background:var(--red-fill-deep);}
.btn-ghost{background:var(--surface);border:1.5px solid var(--ink);color:var(--ink);}
.btn-ghost:hover{background:var(--ink);color:var(--on-ink);}
.btn-line{background:transparent;border:2px solid var(--red);color:var(--red);}
.btn-line:hover{background:var(--red-fill);border-color:var(--red-fill);color:var(--on-fill);}
.btn-lg{height:50px;font-size:var(--fs-md);}
.fld{width:100%;height:42px;border:1px solid var(--line);border-radius:var(--r);background:var(--wash);padding:0 14px;font-size:var(--fs-base);color:var(--ink);outline:none;}
.fld:focus{border-color:var(--red);background:var(--surface);}
.ico{width:var(--ico-20);height:var(--ico-20);stroke:currentColor;fill:none;stroke-width:var(--ico-sw);flex:none;}
.lnk{color:var(--link);}
.lnk:hover{color:var(--red);text-decoration:underline;text-underline-offset:2px;}

.bx-head{font-family:var(--head);font-weight:700;font-size:var(--fs-sm);letter-spacing:var(--ls-label);text-transform:uppercase;color:var(--red);padding-bottom:10px;border-bottom:1px solid var(--line);margin-bottom:12px;}
/* nagłówek sekcji: v3 centrował; tu do LEWEJ + „Zobacz wszystkie" w tej samej
   linii (research v3 „morebar": link widoczny przed skanowaniem grida) */
.sec{margin-top:46px;}
.sec-head{display:flex;align-items:baseline;justify-content:space-between;gap:16px;margin-bottom:20px;border-bottom:1px solid var(--line);padding-bottom:10px;}
.sec-head h2{font-size:var(--fs-label);letter-spacing:var(--ls-label);text-transform:uppercase;color:var(--red);}
.sec-head h2 small{display:block;font-family:var(--sans);font-weight:400;font-size:var(--fs-sm);letter-spacing:0;text-transform:none;color:var(--muted);margin-top:3px;}
.sec-head .all{font-size:var(--fs-md);color:var(--link);white-space:nowrap;}
.sec-head .all:hover{color:var(--red);}

/* ============================================================
   CHROME — topbar, header, nav (v3 + wybór kraju dostawy)
   ============================================================ */
.topbar{display:block;background:var(--topbar-bg);color:var(--on-fill);text-align:center;font-size:var(--fs-md);padding:9px 14px;line-height:1.4;}
.topbar b{font-weight:700;}
.topbar .det{opacity:.85;text-decoration:underline;text-underline-offset:2px;margin-left:8px;}
.topbar:hover .det{opacity:1;}

.hdr{background:var(--surface);border-bottom:1px solid var(--line);}
.hdr .wrap{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:14px 34px;padding-top:14px;padding-bottom:14px;}
.burger{display:none;}
.logo{display:flex;align-items:center;gap:12px;}
.logo img{height:64px;width:auto;filter:var(--logo-filter);border-radius:var(--logo-radius);}
.logo .tag{font-size:var(--fs-xs);line-height:1.45;color:var(--muted);border-left:1px solid var(--line);padding-left:12px;max-width:150px;}
.search{display:flex;position:relative;max-width:640px;width:100%;justify-self:center;}
.search .fld{border-right:0;border-radius:var(--r) 0 0 var(--r);border-color:var(--line2);padding-left:40px;height:46px;font-size:var(--fs-base);}
.search .btn{border-radius:0 var(--r) var(--r) 0;height:46px;}
.search .loupe{position:absolute;left:13px;top:50%;transform:translateY(-50%);width:var(--ico-20);height:var(--ico-20);stroke:var(--muted);fill:none;stroke-width:var(--ico-sw);pointer-events:none;}
.hdr-tools{display:flex;align-items:center;gap:6px;}
.htool{display:inline-flex;flex-direction:column;align-items:center;gap:2px;padding:6px 10px;font-size:var(--fs-tool);color:var(--body);position:relative;border:0;background:none;line-height:1.2;}
.htool .ico{width:var(--ico-24);height:var(--ico-24);stroke:var(--ink);}
.htool:hover,.htool:hover .ico{color:var(--red);stroke:var(--red);}
.htool .cnt{position:absolute;top:1px;right:8px;background:var(--red-fill);color:var(--on-fill);font-size:var(--fs-2xs);font-weight:700;min-width:17px;height:17px;border-radius:var(--r-pill);display:inline-flex;align-items:center;justify-content:center;padding:0 4px;}

.nav{background:var(--surface);border-bottom:1px solid var(--line);}
.nav ul{display:flex;gap:2px;align-items:center;}
.nav a{display:block;padding:14px 13px;font-family:var(--head);font-weight:700;font-size:var(--fs-sm);letter-spacing:var(--ls-ui);text-transform:uppercase;color:var(--ink);white-space:nowrap;}
.nav a:hover{color:var(--red);}
.nav a.on,.subcats .sc-tabs a.on{color:var(--red);box-shadow:inset 0 -3px 0 var(--red);}
.nav a.drop::after{content:"▾";margin-left:5px;font-size:var(--fs-2xs);color:var(--muted);}
.nav a.fast{color:var(--green);}
.nav li.push{margin-left:auto;}
.nav a.promo{color:var(--red);}

/* okruszki (v3 PDP): hierarchia BEZ członu z tytułem; mobile przewijane */
.crumbs{font-size:var(--fs-sm);color:var(--muted);padding:16px 0 4px;}
.crumbs :is(ol,ul){display:flex;flex-wrap:wrap;gap:4px;}
.crumbs li:not(:last-child)::after{content:"›";margin-left:6px;color:var(--line2);}
.crumbs a:hover{color:var(--red);text-decoration:underline;}

/* ============================================================
   układ kolumn
   ============================================================ */
.cols{display:grid;grid-template-columns:220px minmax(0,1fr) 236px;gap:34px;padding-top:24px;}
.cols-2{display:grid;grid-template-columns:240px minmax(0,1fr);gap:34px;}
.cols > *,.cols-2 > *{min-width:0;}

/* ---------- sidebar kategorii (v3: <details>, wszystkie linki w DOM) ---------- */
.cat-sec{border-bottom:1px solid var(--line);}
.cat-sec summary{list-style:none;cursor:pointer;display:flex;justify-content:space-between;align-items:center;font-family:var(--head);font-weight:700;font-size:var(--fs-2xs);letter-spacing:var(--ls-label);text-transform:uppercase;color:var(--ink);padding:11px 2px;}
.cat-sec summary::-webkit-details-marker{display:none;}
.cat-sec summary::after{content:"▾";color:var(--muted);font-size:var(--fs-2xs);transition:transform .14s;}
.cat-sec[open] summary::after{transform:rotate(180deg);}
.cat-sec summary:hover{color:var(--red);}
.cats li{border-bottom:1px solid var(--line);}
.cat-sec .cats{padding-bottom:8px;}
.cat-sec .cats li{border:0;}
.cats a{display:flex;justify-content:space-between;align-items:center;gap:8px;padding:6px 2px 6px 10px;font-size:var(--fs-md);color:var(--body);transition:color .12s,padding-left .12s;}
.cats a::after{content:"›";color:var(--line2);font-size:var(--fs-label);}
.cats a:hover{color:var(--red);padding-left:15px;}
.cats a.cur{color:var(--red);font-weight:700;}
/* dwie pozycje specjalne drzewa (Szybka wysyłka / Niskie ceny; Szymon 5.11: jedna reguła dla obu — ten sam stopień, krój, odstępy i znacznik; różni je tylko kolor) */
.cats a:is(.fastc,.hot){font-weight:500;justify-content:flex-start;gap:7px;padding-left:2px;}
.cats a:is(.fastc,.hot)::after{margin-left:auto;}
.cats a.hot{color:var(--red);}
.cats a.fastc{color:var(--green);}
/* runda 4: błyskawica zamiast „24h” — w motywie jako znacznik .fastmark w markupie (_PkiFastMark), bez ::before */
.cats .lang img{width:18px;border-radius:var(--r-xs);display:inline-block;margin-right:2px;}
.cat-az{margin-top:4px;}
.cat-az .cats{columns:1;}
.side-gap{margin-top:28px;}

/* ---------- prawy rail (v3) ---------- */
.nlbox p{margin:0 0 12px;font-size:var(--fs-sm);color:var(--muted);}
.nlbox .fld{margin-bottom:10px;}
.nlbox .btn{width:100%;}
.nlbox small{display:block;margin-top:9px;font-size:var(--fs-2xs);line-height:1.5;color:var(--muted);}
.nlbox small a{color:var(--red);text-decoration:underline;}
.top5 li{display:flex;gap:10px;align-items:center;padding:8px 0;border-bottom:1px solid var(--line);counter-increment:t5;}
.top5{counter-reset:t5;}
.top5 li::before{content:counter(t5);font-family:var(--head);font-weight:700;font-size:var(--fs-lg);color:var(--num);min-width:14px;}
.top5 img{width:36px;aspect-ratio:41/60;object-fit:contain;flex:none;filter:var(--cover-filter);}
.top5 .inf{font-size:var(--fs-sm);line-height:1.35;}
.top5 .inf a{display:block;color:var(--ink);font-weight:500;}
.top5 .inf a:hover{color:var(--red);}
.top5 .inf b{color:var(--red);font-variant-numeric:tabular-nums;}
/* NOWE: mini-tabela dostawy w railu — koszty do UE widoczne na home
   (Baymard: 27% nie widzi USP tylko w bannerze; Polonia pyta „ile do mnie?") */
.shipbox table{width:100%;border-collapse:collapse;font-size:var(--fs-sm);}
.shipbox td{padding:6px 2px;border-bottom:1px solid var(--line);}
.shipbox td:last-child{text-align:right;font-weight:700;color:var(--ink);white-space:nowrap;font-variant-numeric:tabular-nums;}
.shipbox tr.me td{background:var(--green-wash);}
.shipbox tr.me td:first-child{font-weight:700;color:var(--ink);}
.shipbox p{font-size:var(--fs-xs);color:var(--muted);margin:8px 0 0;}

/* ============================================================
   KARTA PRODUKTU (v3: okładka → tytuł → autor → cena + Omnibus → CTA)
   Zmiana: realne okładki (img, letterbox, inset-ramka), sygnał wysyłki.
   ============================================================ */
.grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:30px 22px;}
.grid.g5{grid-template-columns:repeat(5,minmax(0,1fr));}
.card{display:flex;flex-direction:column;gap:7px;position:relative;}
.card .cv{position:relative;aspect-ratio:41/60;display:flex;align-items:center;justify-content:center;background:var(--wash);border-radius:var(--r-xs);padding:12px;transition:background .16s;}
/* hover karty produktu (Szymon, zrzut 111): karta ma przycisk DO KOSZYKA — tło okładki się nie zmienia, okładka nie podskakuje;
   na hover reaguje tylko przycisk (własny hover) i link tytułu */
/* okładki z feedu mają białe marginesy → multiply na tle wash (zamiast białej
   ramki z cieniem); inset-ramka v3 na kontenerze */
.card .cv img{max-height:100%;width:auto;max-width:100%;object-fit:contain;mix-blend-mode:var(--cover-blend);filter:var(--cover-filter);box-shadow:var(--cover-shadow);transition:transform .16s;}
.card .cv{box-shadow:var(--cv-ring);}
.card h3 a:hover{color:var(--red);} /* stretched-link: okładka + tytuł; hover na DO KOSZYKA nie zmienia tytułu */
.card .badge{position:absolute;top:8px;left:-6px;background:var(--red-fill);color:var(--on-fill);font-family:var(--head);font-weight:700;font-size:var(--fs-2xs);letter-spacing:var(--ls-ui);padding:4px 8px;z-index:1;}
.card h3{font-family:var(--sans);font-weight:500;font-size:var(--fs-base);line-height:1.4;color:var(--ink);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;margin-top:4px;}
.card h3 a::before{content:"";position:absolute;inset:0;z-index:0;} /* stretched-link: okładka+tytuł = 1 hit-area */
.card .aut{font-size:var(--fs-sm);color:var(--body);margin-top:-4px;position:relative;z-index:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.card .aut a:hover{color:var(--red);text-decoration:underline;}
.card .fmt{font-size:var(--fs-xs);color:var(--muted);margin-top:-5px;}
.card .price{display:flex;align-items:baseline;gap:8px;margin-top:auto;}
.card .price b{font-size:var(--fs-lg);font-weight:700;color:var(--ink);font-variant-numeric:tabular-nums;}
.card.promo .price b{color:var(--red);}
.card .omni{font-size:var(--fs-xs);line-height:1.3;color:var(--body);margin-top:-5px;min-height:30px;}
.card .ship{font-size:var(--fs-xs);display:flex;align-items:center;gap:5px;min-height:18px;}
/* plakietka „Szybka wysyłka” (Szymon 20.10, zamiast linii „Wysyłka w 24 h”) — wzór: etykieta panelu .s-fast b pod banerem
   (znacznik .fastmark + zielony napis Montserrat wersalikami); mniejszy stopień i odstęp liter --ls-ui, żeby zmieścić się w karcie 150 px.
   Na karcie produktu (PDP): buybox (stopień etykiety wzoru --fs-sm) i pasek szybkiego zakupu na mobile. Na kartach list
   plakietka stoi na okładce (.card .badge.fast — blok 5 BADGE). */
.disp .fastb{font-size:var(--fs-sm);}
.sbuy .p .fastb{margin-top:3px;}
.fastb{display:inline-flex;align-items:center;gap:6px;max-width:100%;font-family:var(--head);font-weight:700;font-size:var(--fs-2xs);
  line-height:1;letter-spacing:var(--ls-ui);text-transform:uppercase;white-space:nowrap;color:var(--green);}
.card .ship.slow{color:var(--muted);font-weight:400;}
.card .ship.slow .ico{stroke:var(--muted);}
.card .btn{height:38px;font-size:var(--fs-xs);position:relative;z-index:1;margin-top:4px;}
.card .eds{font-size:var(--fs-sm);color:var(--link);position:relative;z-index:1;margin-top:-3px;}
.card .eds:hover{color:var(--red);text-decoration:underline;}

/* rail przewijany (Polecane — 27 pozycji, wszystkie w DOM; scroll-snap) */
.hrail{display:grid;grid-auto-flow:column;grid-auto-columns:calc((100% - 4*20px)/4.35);gap:20px;overflow-x:auto;scroll-snap-type:x mandatory;padding-bottom:12px;scrollbar-width:thin;}
.hrail > *{scroll-snap-align:start;}
.hrail-wrap{position:relative;}
.hrail-wrap .arr{position:absolute;top:30%;width:42px;height:42px;border-radius:50%;border:0;background:rgba(32,29,28,.6);color:var(--on-fill);font-size:var(--fs-lg);z-index:3;}
.hrail-wrap .arr.prev{left:-14px;}.hrail-wrap .arr.next{right:-14px;}
.hrail-count{font-size:var(--fs-sm);color:var(--muted);}

/* taby gatunków = LINKI (v3) */
.tabs{display:flex;gap:20px;margin:-6px 0 20px;flex-wrap:wrap;}
.tabs a{font-size:var(--fs-md);color:var(--muted);padding-bottom:5px;border-bottom:2px solid transparent;}
.tabs a.on{color:var(--red);border-bottom-color:var(--red);font-weight:700;}
.tabs a:hover{color:var(--red);}

.deals{background:var(--wash);border-radius:var(--r);padding:2px 22px 26px;}
.deals .sec-head{margin-top:22px;}

/* ============================================================
   HOME — karuzela (v3), intro H1, USP
   ============================================================ */
/* baner F2 (makieta wyglad-bento, akceptacja Szymona 20.10.2026; treść = PkiHeroCampaigns): slajd = [jasny panel tekstu z tytułem
   w narożnikach marki ⌜⌟ (.pki-corners zawsze widoczne, jak .logo-mark) | czerwony panel marki z okładką na styku / wachlarzem /
   etykietami]; stała wysokość (slajdy nie skaczą); nawigacja w PRAWYM DOLNYM rogu (strzałki = blok „strzałki v2” niżej, licznik,
   „następna ›”), przełączanie pkieu-v3.js pkt 11. Okładka wchodzi na panel tekstu (margin-left ujemny) — ⌟ tytułu kończy się przed nią
   (tytuł max 12–15ch); ⌟ wystaje pod tytuł o --pc-gy + --pc-w (16 + 6 = 22 px), dlatego margines 20 px + odstęp 14 px = 12 px światła. */
/* slajdy w jednej komórce siatki: nieaktywne niewidoczne (visibility — poza drzewem dostępności i kolejnością Tab), więc baner ma
   wysokość NAJWYŻSZEGO slajdu na każdej szerokości i nie skacze przy przełączaniu */
.car{position:relative;min-width:0;display:grid;}
.car .slide{grid-area:1 / 1;display:grid;grid-template-columns:minmax(0,1fr) minmax(0,.9fr);min-height:440px;}
.car .slide[hidden]{display:grid;visibility:hidden;}
.car .txt{display:flex;flex-direction:column;justify-content:center;align-items:flex-start;gap:14px;min-width:0;padding:30px 36px 30px 52px;
  background:var(--card-bg);border:var(--card-border);border-right:0;border-radius:var(--r) 0 0 var(--r);}
.car .hmark{--pki-corner-w:6px;--pc-gx:20px;--pc-gy:16px;--cv-over:70px;margin:14px 0 20px 14px;
  max-width:calc(100% + 36px - 14px - var(--cv-over) - var(--pc-gx) - var(--pki-corner-w) - 12px);}  /* ⌟ ≥ 12 px przed okładką wchodzącą na panel */
.car .hmark::before,.car .hmark::after{opacity:1;transform:none;transition:none;}
.car .hero-t{display:block;font:800 40px/1.06 var(--head);letter-spacing:-.02em;color:var(--ink);max-width:12ch;text-wrap:balance;}
.car .hmark.long .hero-t{font-size:32px;max-width:15ch;}
.car .byl,.car .lead{margin:0 0 0 14px;max-width:46ch;}
.car .byl{font:700 var(--fs-2xs)/1.4 var(--head);letter-spacing:var(--ls-ui);text-transform:uppercase;color:var(--muted);}
.car .lead{font-size:var(--fs-base);line-height:1.6;color:var(--body);text-wrap:pretty;}
.car .lead b{color:var(--ink);font-weight:600;}
.car .txt .btn{margin:4px 0 0 14px;}
.car .art{position:relative;display:flex;align-items:center;min-width:0;background:var(--banner-bg);border-radius:0 var(--r) var(--r) 0;color:var(--on-fill);}
.car .kick{position:absolute;right:26px;top:22px;max-width:15ch;text-align:right;font:700 var(--fs-2xs)/1.4 var(--head);letter-spacing:var(--ls-label);text-transform:uppercase;color:rgba(255,255,255,.85);}
.car .one{height:290px;width:auto;max-width:none;margin-left:-70px;box-shadow:-14px 22px 40px rgba(0,0,0,.45);transform:rotate(-3deg);}
/* premiery: wachlarz okładek, pierwsza na styku jak pojedyncza; wyżej, żeby obrócone okładki kończyły się nad nawigacją. Pozycje
   i szerokości w % szerokości panelu — wachlarz nie wychodzi poza baner (poziomy scroll) na żadnej szerokości */
.car .art-fan{align-items:flex-start;padding-top:54px;}
.car .fan{position:relative;display:block;width:100%;aspect-ratio:10 / 6;margin-left:-50px;}  /* mniejszy zakład niż pojedyncza okładka: pierwsza okładka wachlarza jest większa i obrócona */
.car .fan img{position:absolute;bottom:0;height:auto;max-width:none;aspect-ratio:2 / 3;object-fit:cover;box-shadow:-10px 16px 30px rgba(0,0,0,.4);transform-origin:50% 100%;}
.car .fan img:nth-child(1){left:0;width:40%;z-index:5;transform:rotate(-3deg);}
.car .fan img:nth-child(2){left:27%;width:33%;z-index:4;transform:rotate(3deg);}
.car .fan img:nth-child(3){left:45%;width:30%;z-index:3;transform:rotate(6deg);}
.car .fan img:nth-child(4){left:60%;width:27%;z-index:2;transform:rotate(9deg);}
.car .fan img:nth-child(5){left:73%;width:24%;z-index:1;transform:rotate(12deg);}
.car .fan img:nth-child(n+6){display:none;}
/* kampania bez okładek (targi): działy katalogu jako etykiety na czerwonym; hasło w przepływie nad nimi (nie nachodzi) */
.car .art-chips{flex-direction:column;align-items:stretch;justify-content:center;padding:22px 26px 76px 34px;}
.car .art-chips .kick{position:static;align-self:flex-end;margin-bottom:18px;}
.car .chips{display:flex;flex-wrap:wrap;gap:8px;}
.car .chips-h{flex:0 0 100%;margin-bottom:6px;font:800 var(--fs-label)/1.2 var(--head);letter-spacing:var(--ls-label);text-transform:uppercase;color:#fff;}
.car .chips > span:not(.chips-h){padding:7px 11px;border:1px solid rgba(255,255,255,.45);border-radius:var(--r);background:rgba(0,0,0,.12);
  font:700 var(--fs-2xs)/1.2 var(--head);letter-spacing:var(--ls-ui);text-transform:uppercase;color:#fff;}
.car .cnav{position:absolute;right:22px;bottom:20px;z-index:2;display:flex;align-items:center;gap:12px;}
.car .cpos{font-size:var(--fs-sm);color:rgba(255,255,255,.85);}
.car .cpos b{color:#fff;}
.car .cnext{color:inherit;text-decoration:underline;text-underline-offset:3px;text-decoration-color:rgba(255,255,255,.4);}
@media (hover:hover){.car .cnext:hover{color:#fff;}}
.car .carr{display:inline-flex;gap:8px;}
.car .carr .arr{position:relative;}
/* wąski ekran: sam licznik „2 / 5” obok strzałek (nazwa następnej kampanii nie mieści się w jednej linii) */
@media (max-width:420px){.car .cnx{display:none;}}
.thumbs{display:grid;grid-template-columns:repeat(5,1fr);gap:8px;margin-top:8px;}
.thumbs a{border-radius:var(--r-xs);aspect-ratio:16/6;display:flex;align-items:center;justify-content:center;text-align:center;padding:6px 8px;font-family:var(--head);font-weight:700;font-size:var(--fs-sm);line-height:1.25;color:var(--on-fill);text-shadow:0 1px 2px rgba(0,0,0,.35);outline:2px solid transparent;outline-offset:2px;}
.thumbs a.on{outline-color:var(--red);text-decoration:underline;text-decoration-thickness:2px;text-underline-offset:3px;}
.th1{background:#b7171a;}.th2{background:var(--graphite);}.th3{background:var(--green-fill);}.th4{background:var(--brown);}.th5{background:#5b3a52;}

.intro{margin:34px 0 0;}
.intro h1{font-size:var(--fs-h1);}
.intro p{margin:10px 0 0;font-size:var(--fs-base);color:var(--body);max-width:760px;}

.news{display:grid;grid-template-columns:repeat(3,1fr);gap:18px;}
.news article{border:1px solid var(--line);border-radius:var(--r-xs);padding:16px 18px;position:relative;}
.news h3{font-size:var(--fs-base);line-height:1.4;}
.news h3 a::before{content:"";position:absolute;inset:0;}
.news article:hover h3{color:var(--red);}
.news time{font-size:var(--fs-sm);color:var(--muted);}
.news p{margin:6px 0 0;font-size:var(--fs-md);}

.seo{margin-top:44px;font-size:var(--fs-md);line-height:1.75;}
.seo h2{font-size:var(--fs-base);letter-spacing:var(--ls-label);text-transform:uppercase;margin-bottom:10px;}
.seo p{margin:0 0 12px;}
.seo p a{color:var(--red);text-decoration:underline;text-underline-offset:2px;}
.faq{border-top:1px solid var(--line);margin-top:14px;}
.faq details{border-bottom:1px solid var(--line);}
.faq summary{cursor:pointer;list-style:none;display:flex;justify-content:space-between;gap:12px;padding:11px 2px;}
.faq summary::-webkit-details-marker{display:none;}
.faq summary h3{font-size:var(--fs-md);}
.faq summary::after{content:"▾";color:var(--muted);font-size:var(--fs-2xs);}
.faq details[open] summary::after{transform:rotate(180deg);}
.faq p{padding:0 2px 12px;margin:0;}

/* ============================================================
   LISTA KATEGORII (nowe względem v3)
   ============================================================ */
.cat-hero{display:flex;justify-content:space-between;align-items:flex-end;gap:20px;margin:6px 0 14px;}
.cat-hero h1{font-size:var(--fs-h1);}
.cat-hero p{margin:6px 0 0;font-size:var(--fs-base);max-width:720px;}
/* ============================================================
   PODKATEGORIE 2026-10-20, wariant D (Szymon po A/B/C: luzem, bez pojemnika, „nie zawijaj — jak C, jeden przewijalny rząd”,
   selektor jak w górnym menu) — partial _PkiSubcats. Jeden rząd tekstu na railu (.hrail: ‹ ›, przeciąganie myszą, palec/kółko,
   ukryty pasek — pkieu-v3.js 4/4b) BEZ ramek, linii nad/pod i tła. Znacznik = mechanizm menu głównego: hover/fokus ⌜⌟
   (.pki-corners, tekst nie zmienia koloru — runda 12), aktywna = .on (czerwony tekst + podkreślenie, wspólna reguła z .nav a.on).
   Narożnik w proporcjach menu względem wersalika (.nav a.pki-corners): kreska 3 px, ramiona 1,374·cap, odstęp do atramentu
   0,515·cap; tu wersalik Roboto 500 @13,5 px ≈ 9,6 px, pudełko linii 20 px ma ~5,2 px nad wersalikiem / pod linią bazową.
   Narożnik rysuje się w paddingu linku (rail przycina wszystko poza sobą); ujemny margines wyrównuje pierwszy tekst do H1.
   Reguły .hrail/.hrail-wrap (siatka kart, linie boczne, wcięcie pod plakietki) nadpisane klasami .subcats.
   ============================================================ */
.subcats{--sc-px:var(--sp-3);--sc-py:var(--sp-3);margin:0 0 var(--sp-4) calc(var(--sc-px) * -1);}
.subcats .sc-railwrap{--arr-w:44px;--arr-out:0px;}
.subcats .sc-railwrap::before,.subcats .sc-railwrap::after{display:none;}
.subcats .sc-tabs{display:flex;gap:0;margin:0;padding:0;list-style:none;scroll-padding-inline:var(--arr-w);scroll-snap-type:x proximity;}
.subcats .sc-tabs a{display:block;padding:var(--sc-py) var(--sc-px);white-space:nowrap;font-family:var(--sans);font-weight:500;font-size:var(--fs-md);
  line-height:20px;color:var(--ink);}
.subcats .sc-tabs a:focus-visible{outline-offset:-2px;}
.subcats .pki-corners{--pc-x:var(--sc-px);--pc-y:var(--sc-py);--cap:9.6px;
  --pc-w:3px;--pc-gx:calc(var(--cap) * .515 - .75px);--pc-gy:calc(var(--cap) * .515 - 5.2px);
  --pc-ah:calc(var(--cap) * 1.374);--pc-av:var(--pc-ah);}
.subcats .sc-tabs a.pki-corners:hover{color:var(--ink);}
.subcats .sc-railwrap .arr{top:calc(50% - var(--arr-w) / 2);}
.subcats .sc-railwrap .arr:disabled{visibility:hidden;}
@media (max-width:860px){.subcats .sc-railwrap{margin-right:-16px;}}
/* pasek narzędzi listy */
.toolbar{display:flex;align-items:center;gap:14px;flex-wrap:wrap;padding:10px 0;border-top:1px solid var(--line);border-bottom:1px solid var(--line);margin-bottom:14px;}
.toolbar .count{font-size:var(--fs-md);color:var(--body);}
.toolbar .count b{color:var(--ink);}
.toolbar .sp{flex:1;}
.toolbar label{font-size:var(--fs-md);color:var(--muted);display:flex;align-items:center;gap:8px;}
.sel{height:38px;border:1px solid var(--line2);border-radius:var(--r);background:var(--surface);padding:0 32px 0 12px;font-size:var(--fs-md);color:var(--ink);appearance:none;background-image:linear-gradient(45deg,transparent 50%,var(--muted) 50%),linear-gradient(135deg,var(--muted) 50%,transparent 50%);background-position:calc(100% - 16px) 16px,calc(100% - 11px) 16px;background-size:5px 5px;background-repeat:no-repeat;}
.view{display:flex;border:1px solid var(--line2);border-radius:var(--r);overflow:hidden;}
.view a{width:38px;height:36px;display:flex;align-items:center;justify-content:center;color:var(--muted);}
.view a.on{background:var(--chip-bg);color:var(--chip-ink);}
.view .ico{width:var(--ico-16);height:var(--ico-16);}
/* aktywne filtry — chipy z „×" + „Wyczyść" (Baymard: applied filters overview) */
.active-f{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-bottom:18px;}
.active-f .lbl{font-size:var(--fs-sm);color:var(--muted);}
.chip{display:inline-flex;align-items:center;gap:7px;background:var(--chip-bg);color:var(--chip-ink);border-radius:var(--r-pill);padding:5px 8px 5px 13px;font-size:var(--fs-sm);}
.chip.green{background:var(--green-fill);}
.chip button{border:0;background:var(--chip-x);color:inherit;width:20px;height:20px;border-radius:50%;font-size:var(--fs-md);line-height:1;}
.active-f .clear{font-size:var(--fs-sm);color:var(--link);text-decoration:underline;}
/* fasety (thalia/amazon: lewa kolumna; pierwsza = DOSTAWA, bo to nasz wyróżnik) */
.facets{font-size:var(--fs-md);}
.facet{border-bottom:1px solid var(--line);}
.facet summary{list-style:none;cursor:pointer;display:flex;justify-content:space-between;align-items:center;font-family:var(--head);font-weight:700;font-size:var(--fs-2xs);letter-spacing:var(--ls-label);text-transform:uppercase;color:var(--ink);padding:13px 2px;}
.facet summary::-webkit-details-marker{display:none;}
.facet summary::after{content:"▾";color:var(--muted);font-size:var(--fs-2xs);}
.facet[open] summary::after{transform:rotate(180deg);}
.facet .opts{padding:0 0 12px;display:flex;flex-direction:column;gap:2px;}
.opt{display:flex;align-items:center;gap:10px;padding:5px 2px;cursor:pointer;color:var(--body);}
.opt input{width:18px;height:18px;accent-color:var(--red);margin:0;flex:none;}
.opt .n{margin-left:auto;font-size:var(--fs-xs);color:var(--muted);font-variant-numeric:tabular-nums;}
.opt:hover{color:var(--red);}
.opt.fast{color:var(--green);font-weight:500;}
.opt.fast input{accent-color:var(--green);}
.facet .more{font-size:var(--fs-sm);color:var(--link);padding:4px 2px 0;display:block;}
.range{display:flex;gap:8px;align-items:center;}
.range .fld{height:36px;padding:0 10px;font-size:var(--fs-md);background:var(--surface);}
.range button{height:36px;border:1px solid var(--line2);background:var(--surface);border-radius:var(--r);padding:0 12px;font-weight:700;color:var(--ink);}
.facet-cats{margin-top:26px;}
/* tryb listy (wiersz) — przełącznik grid/list, jak thalia „Listenansicht" */
.pager{display:flex;justify-content:center;align-items:center;gap:6px;margin:34px 0 0;flex-wrap:wrap;}
.pager a,.pager span{min-width:40px;height:40px;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--line);border-radius:var(--r);font-size:var(--fs-md);color:var(--ink);padding:0 10px;}
.pager a:hover{border-color:var(--red);color:var(--red);}
.loadmore{text-align:center;margin-top:28px;}
.loadmore p{font-size:var(--fs-sm);color:var(--muted);margin:0 0 10px;}
.loadmore .bar{height:4px;max-width:260px;margin:0 auto 14px;background:var(--line);border-radius:var(--r-xs);overflow:hidden;}
.loadmore .bar span{display:block;height:100%;width:1.5%;background:var(--red-fill);}
/* karta „wydania zbiorcze" — 9× Lalka na 1. stronie listy to szum;
   grupujemy wydania (amazon „Alle Formate und Editionen") */
.card .edchips{display:flex;flex-wrap:wrap;gap:5px;position:relative;z-index:1;}
.card .edchips a{font-size:var(--fs-2xs);border:1px solid var(--line2);border-radius:var(--r);padding:2px 7px;color:var(--body);}
.card .edchips a:hover{border-color:var(--red);color:var(--red);}
.cat-seo{margin-top:40px;padding-top:18px;border-top:1px solid var(--line);font-size:var(--fs-md);line-height:1.7;}
.cat-seo h2{font-size:var(--fs-base);letter-spacing:var(--ls-label);text-transform:uppercase;margin-bottom:8px;}
/* mobilny pasek „Filtruj / Sortuj" + arkusz filtrów (bottom sheet) */
.mbar{display:none;}
.sheet-ov{display:none;}
.sheet-foot{display:none;}

/* ============================================================
   KARTA PRODUKTU (PDP) — kontynuacja pdp-v1 + buybox (amazon)
   ============================================================ */
.pdp{display:grid;grid-template-columns:380px minmax(0,1fr) 340px;gap:38px;margin-top:10px;align-items:start;}
.gal .main{background:var(--wash);border-radius:var(--r);padding:30px;display:flex;justify-content:center;position:relative;}
.gal .main img{width:100%;max-width:270px;height:auto;mix-blend-mode:var(--cover-blend);filter:var(--cover-filter);box-shadow:var(--cover-shadow);}
.gal .zoom{position:absolute;right:10px;bottom:10px;border:0;background:var(--surface);border-radius:var(--r);font-size:var(--fs-sm);padding:6px 10px;color:var(--ink);box-shadow:var(--sh-1);display:flex;gap:6px;align-items:center;}
.gal .zoom .ico{width:var(--ico-16);height:var(--ico-16);}
.gal .thumbs2{display:flex;gap:8px;margin-top:10px;}
.gal .thumbs2 a{width:58px;height:78px;border:2px solid var(--line);border-radius:var(--r);display:flex;align-items:center;justify-content:center;background:var(--surface);padding:3px;font-size:var(--fs-2xs);text-align:center;color:var(--muted);line-height:1.2;}
.gal .thumbs2 a.on{border-color:var(--red);}
.gal .thumbs2 img{max-height:100%;width:auto;filter:var(--cover-filter);}
.gal .share{margin-top:14px;font-size:var(--fs-sm);color:var(--muted);display:flex;gap:16px;}
.gal .share a:hover{color:var(--red);}

.pinfo h1{font-size:var(--fs-h1);line-height:1.2;}
.pinfo .sub{font-size:var(--fs-label);color:var(--body);margin-top:4px;font-family:var(--sans);font-weight:400;}
.pinfo .by{margin-top:8px;font-size:var(--fs-base);}
.pinfo .by a{color:var(--red);font-weight:500;}
.pinfo .by a:hover{text-decoration:underline;}
.pinfo .meta{display:flex;flex-wrap:wrap;gap:6px 16px;margin-top:10px;font-size:var(--fs-md);color:var(--muted);align-items:center;}
.pinfo .meta .rv a{color:var(--link);}
.hl{margin-top:18px;display:grid;grid-template-columns:repeat(4,1fr);border:1px solid var(--line);border-radius:var(--r);}
.hl div{padding:10px 12px;border-left:1px solid var(--line);font-size:var(--fs-sm);color:var(--muted);line-height:1.35;}
.hl div:first-child{border-left:0;}
.hl b{display:block;font-size:var(--fs-base);color:var(--ink);margin-top:2px;}
.lede{margin-top:18px;font-size:var(--fs-base);line-height:1.7;color:var(--body);}
.lede p{margin:0 0 10px;}
.lede .more{color:var(--link);font-size:var(--fs-md);}
.pcats{margin-top:22px;padding-top:14px;border-top:1px solid var(--line);font-size:var(--fs-md);display:flex;flex-wrap:wrap;gap:8px;align-items:center;}
.pcats span{color:var(--muted);}
.pcats a{border:1px solid var(--line2);border-radius:var(--r-pill);padding:4px 12px;color:var(--ink);}
.pcats a:hover{border-color:var(--red);color:var(--red);}
.pquote{margin:18px 0 0;font-size:var(--fs-base);font-style:italic;color:var(--ink);padding:4px 0 4px 14px;}
.pquote cite{display:block;font-style:normal;font-size:var(--fs-sm);color:var(--muted);margin-top:4px;}
.eds-h{margin-top:20px;font-family:var(--head);font-weight:700;font-size:var(--fs-2xs);letter-spacing:var(--ls-label);text-transform:uppercase;color:var(--ink);}
.edsel{display:flex;gap:10px;margin-top:8px;flex-wrap:wrap;}
.edsel a{border:1.5px solid var(--line2);border-radius:var(--r);padding:8px 14px;font-size:var(--fs-md);line-height:1.35;min-width:150px;background:var(--surface);}
.edsel a b{display:block;color:var(--ink);}
.edsel a span{font-size:var(--fs-sm);color:var(--muted);}
.edsel a.on{border-color:var(--red);box-shadow:inset 0 0 0 1px var(--red);}
.edsel a.na{background:var(--wash);color:var(--muted);}
.edsel a.na b{color:var(--muted);font-weight:500;}
.edsel a:not(.on):not(.na):hover{border-color:var(--ink);}

/* buybox: ramka, sticky na desktopie (amazon „Buy box" po prawej) */
.buy{border:1px solid var(--line2);border-radius:var(--r);padding:20px;position:sticky;top:76px;background:var(--surface);}
.buy .eds-h{margin-top:0;}
.buy .edsel{margin:8px 0 16px;flex-direction:column;gap:8px;}
.buy .edsel a{min-width:0;padding:7px 12px;}
/* blok, nie flex: wstążki (.pr-rib) pływają w prawo, więc rząd ma wysokość ceny, a nota o VAT siada tuż pod nią i opływa
   wstążki (Szymon 21.10: „VAT bezpośrednio pod ceną, nie pod ribbonami”) */
.buy .pr{display:block;}
.buy .pr b{font-size:var(--fs-hero);line-height:1.05;font-family:var(--head);color:var(--red);font-variant-numeric:tabular-nums;letter-spacing:-.01em;}
.buy .omni{font-size:var(--fs-sm);color:var(--ink);margin-top:4px;line-height:1.45;}
.buy .omni s{color:var(--muted);}
.buy .rrp{font-size:var(--fs-sm);color:var(--muted);margin-top:2px;}
.buy .vat{font-size:var(--fs-xs);line-height:1.4;color:var(--muted);margin-top:2px;max-width:26ch;}  /* drobny tekst w 2 liniach — nie wchodzi pod wstążki statusu po prawej od ceny (Szymon 21.10) */
.buy .vat a{color:var(--link);text-decoration:underline;}
.buy .vat + *{clear:both;}  /* to, co pod notą, zaczyna się pod wstążkami */
.buy hr{border:0;border-top:1px solid var(--line);margin:16px 0;}
.stock{display:flex;align-items:center;gap:8px;font-weight:700;color:var(--green);font-size:var(--fs-base);}
.stock::before{content:"";width:9px;height:9px;border-radius:50%;background:var(--green-fill);box-shadow:0 0 0 3px var(--green-wash);}
.disp{margin-top:6px;font-size:var(--fs-md);color:var(--ink);line-height:1.5;}
.disp b{color:var(--green);}
.disp .cut{display:block;font-size:var(--fs-sm);color:var(--body);}
.dlv{margin-top:12px;background:var(--wash);border-radius:var(--r);padding:12px 14px;font-size:var(--fs-md);}
.dlv .to{display:flex;justify-content:space-between;align-items:center;gap:8px;margin-bottom:8px;color:var(--ink);}
.dlv .to a{font-size:var(--fs-sm);color:var(--link);text-decoration:underline;}
.dlv .to b{display:flex;align-items:center;gap:6px;}
.dlv .to .ico{stroke:var(--green);}
.dlv ul li{display:flex;justify-content:space-between;gap:10px;padding:5px 0;border-top:1px dashed var(--line2);}
.dlv ul li span{color:var(--body);}
.dlv ul li span small{display:block;color:var(--muted);font-size:var(--fs-xs);}
.dlv ul li em{font-style:normal;font-weight:700;color:var(--ink);white-space:nowrap;font-variant-numeric:tabular-nums;}
.dlv .free{margin-top:8px;font-size:var(--fs-sm);color:var(--muted);}
/* „Dostawa do: [kraj]” (_PkiShipEstimate): kraj = przycisk otwierający listę, kwota i czas z /ShippingQuote/Estimate */
.dlv .se-c{display:inline-flex;align-items:center;gap:2px;margin-left:4px;padding:2px 4px;border:0;border-radius:var(--r);background:none;font:inherit;font-weight:700;color:var(--link);text-decoration:underline;text-underline-offset:3px;cursor:pointer;}
.dlv .se-c .ico{width:var(--ico-16);height:var(--ico-16);stroke:currentColor;transform:rotate(90deg);transition:transform .15s;}
.dlv .se-c[aria-expanded="true"] .ico{transform:rotate(-90deg);}
.dlv .se-c:is(:hover,:focus-visible){color:var(--red);}
.dlv .se-q{color:var(--body);}
.dlv .se-q b{color:var(--ink);font-variant-numeric:tabular-nums;}
.dlv .se-q small{display:block;margin-top:2px;color:var(--muted);font-size:var(--fs-xs);}
.dlv .se-q a{color:var(--link);text-decoration:underline;}
.dlv .se-pick{margin-top:8px;display:flex;flex-direction:column;gap:4px;font-size:var(--fs-sm);}
.dlv .se-pick[hidden],.dlv .se-c[hidden]{display:none;}
[data-ship-est] .to{flex-wrap:wrap;row-gap:2px;}
[data-ship-est] .to b,[data-ship-est] .to a{white-space:nowrap;}
.dlv .se-pick select{width:100%;min-height:var(--h-touch);padding:6px 8px;border:1px solid var(--line2);border-radius:var(--r);background:var(--surface);color:var(--ink);font:inherit;}
.shopping-cart-page .dlv{margin:0 0 16px;}
.buy .ctas{display:flex;flex-direction:column;gap:10px;margin-top:16px;}
.buy .ctas .btn{width:100%;}
.buy .pays{display:flex;gap:5px;flex-wrap:wrap;margin-top:8px;}
.pays span{border:1px solid var(--line);background:var(--surface);border-radius:var(--r);padding:3px 8px;font-size:var(--fs-2xs);font-family:var(--head);font-weight:700;color:var(--body);}

/* często kupowane razem (amazon FBT) — 1 zestaw, checkboxy, suma */
.fbt{display:grid;grid-template-columns:minmax(0,1fr) 280px;gap:30px;align-items:center;border:1px solid var(--line);border-radius:var(--r);padding:22px;}
.fbt .set{display:flex;align-items:center;gap:12px;}
.fbt .it{width:150px;font-size:var(--fs-sm);line-height:1.35;}
.fbt .it .im{height:150px;display:flex;align-items:center;justify-content:center;background:var(--wash);border-radius:var(--r-xs);padding:10px 10px 0;margin-bottom:8px;}
.fbt .it img{max-height:100%;width:auto;mix-blend-mode:var(--cover-blend);filter:var(--cover-filter);box-shadow:var(--cover-shadow);}
.fbt .it label{display:flex;gap:7px;align-items:flex-start;color:var(--ink);font-weight:500;}
.fbt .it input{accent-color:var(--red);width:16px;height:16px;margin:1px 0 0;flex:none;}
.fbt .it small{display:block;color:var(--muted);font-weight:400;}
.fbt .it .p{color:var(--ink);font-weight:700;margin-top:4px;padding-left:23px;}
.fbt .plus{font-size:var(--fs-h1m);color:var(--muted);font-weight:300;}
.fbt .sum{border-left:1px solid var(--line);padding-left:26px;font-size:var(--fs-md);}
.fbt .sum b{display:block;font-size:var(--fs-h1m);font-family:var(--head);color:var(--ink);margin:2px 0 4px;}
.fbt .sum .btn{width:100%;margin-top:10px;}

.pdp-body{display:grid;grid-template-columns:minmax(0,1fr) 340px;gap:38px;}
.blk{margin-top:42px;}
/* PDP 21.10 — jeden rytm pionowy (--gap-sec, 48 / 32 px): między sekcjami lewej kolumny (OPIS ↔ DANE), buybox ↔ tagi (padding
   .pdp-side niżej), sekcje powiązanych (.pdp-more); od dolnej krawędzi WYŻSZEJ kolumny (grid kończy się na niej) do karty
   newslettera (.nlband) od 23.10 --gap-nl jak na każdej stronie (RYTM PIONOWY); newsletter ↔ stopka = --gap-block jak na każdej stronie (#419). Tagi bez własnego marginesu
   (.product-tags-box 42 / 24 px) — odstęp daje kolumna. Pusty wiersz-przerywnik tabeli BookInfo (<td>&nbsp;</td> bez klasy, przed
   „Wydano”) dawał podwójną linię — ukryty. */
.product-details-page .blk{margin-top:var(--gap-sec);}
.product-details-page .desc > :last-child{margin-bottom:0;}  /* margines ostatniego akapitu dokładał 12 px do rytmu */
/* Tagi produktowe + Popularni autorzy w głównej kolumnie pod Danymi produktu (Szymon 3.11; dawniej .pdp-side w prawej kolumnie
   zabierał buyboksowi dół kolumny): dwa boksy obok siebie na szerokości treści, ≤ 860 px jeden pod drugim; rytm sekcji */
.product-details-page .pdp-more :is(.sectionTitle,.title){margin-top:var(--gap-sec);}
.specs-wrap .bioInfo tr:not(:has(> td.bioInfoLabel)){display:none;}
/* PDP 21.10 (Szymon: „czemu jest tu tyle przestrzeni” nad OPIS + „cała ta część mogłaby być sticky”): od 861 px prawa kolumna
   (.buy-col) biegnie obok WSZYSTKIEGO — okładki, szczegółów i opisu — więc OPIS zaczyna się zaraz pod okładką/szczegółami
   (dawniej pod najwyższą kolumną rzędu, czyli pod buyboksem: ~150–260 px dziury). .pdp-body znika z drzewa układu
   (display:contents): jego treść = obszar „main”; obszar „side” jest PUSTY (3.11: tagi i popularni autorzy przeszły do głównej
   kolumny, .pdp-links — w „side” zabierały buyboksowi dół kolumny), więc buybox przyklejony w obrębie .buy-col biegnie
   przez cały opis i dane aż do szyn; top = pod przyklejonym nagłówkiem (--stk-h); wyższy niż okno → bez przyklejania (.no-stick,
   pkieu-v3.js 12), żeby dół nigdy nie uciekał poza ekran. Mobile (≤ 860 px): jedna kolumna w kolejności DOM, jak dotąd. */
@media (min-width:861px){
  .pdp{grid-template-areas:"gal info buy" "main main buy" "main main side";grid-template-rows:auto 1fr auto;row-gap:0;}
  .pdp > .gal{grid-area:gal;}
  .pdp > .pinfo{grid-area:info;}
  .pdp > .buy-col{grid-area:buy;align-self:stretch;}
  .pdp > .pdp-body{display:contents;}
  .pdp-body > :first-child{grid-area:main;min-width:0;}
  /* 21.10 (Szymon: „if top nav is hidden, don't reserve space for it”): odstęp pod przyklejonym nagłówkiem tylko, gdy nagłówek
     jest widoczny (body.stuck — klasę przełącza smart sticky, pkieu-v3.js 3); top przesuwa się tym samym ruchem co nagłówek (.3s) */
  .buy-col .buy{top:var(--sp-4);transition:top .3s ease-out;}
  body.stuck .buy-col .buy{top:calc(var(--stk-h) + var(--sp-4));}
  .buy-col .buy.no-stick{position:static;}
  @media (prefers-reduced-motion:reduce){.buy-col .buy{transition:none;}}
}
.blk > h2{font-size:var(--fs-label);letter-spacing:var(--ls-label);text-transform:uppercase;color:var(--red);border-bottom:1px solid var(--line);padding-bottom:10px;margin-bottom:16px;}
.desc{font-size:var(--fs-base);line-height:1.75;}  /* bez max-width (Szymon 5.11: 70ch z SP-60 wyglądało jak tekst wciśnięty w lewo pod kreską i nagłówkiem na całą kolumnę) — opis wypełnia kolumnę jak tabela „Dane produktu” */
.desc p{margin:0 0 12px;}
.desc blockquote{margin:14px 0;padding:10px 16px;font-style:italic;}
.desc blockquote cite{display:block;font-style:normal;font-size:var(--fs-sm);color:var(--muted);margin-top:4px;}
.specs{width:100%;border-collapse:collapse;font-size:var(--fs-md);}
.specs th{text-align:left;font-weight:400;color:var(--muted);width:42%;padding:8px 10px 8px 0;border-bottom:1px solid var(--line);vertical-align:top;}
.specs td{padding:8px 0;border-bottom:1px solid var(--line);color:var(--ink);}
.specs td a{color:var(--red);}
.gpsr{margin-top:16px;font-size:var(--fs-sm);background:var(--wash);border-radius:var(--r);padding:12px 14px;line-height:1.55;}
.gpsr b{color:var(--ink);}
.revs .empty{border:1px dashed var(--line2);border-radius:var(--r);padding:20px;display:flex;justify-content:space-between;align-items:center;gap:16px;font-size:var(--fs-md);}
.revs .note{font-size:var(--fs-sm);color:var(--muted);margin-top:8px;}
.revs .note a{color:var(--link);text-decoration:underline;}
.aside-box{border:1px solid var(--line);border-radius:var(--r);padding:16px;margin-top:42px;font-size:var(--fs-md);}
.aside-box h3{font-size:var(--fs-sm);letter-spacing:var(--ls-label);text-transform:uppercase;color:var(--ink);margin-bottom:10px;}
.aside-box ul li{padding:6px 0;border-bottom:1px solid var(--line);display:flex;gap:10px;align-items:center;}
.aside-box ul li:last-child{border:0;}
.aside-box img{width:40px;outline:1px solid var(--thumb-ring);filter:var(--cover-filter);}
.aside-box .t{line-height:1.35;}
.aside-box .t a{color:var(--ink);font-weight:500;}
.aside-box .t a:hover{color:var(--red);}
.aside-box .t b{display:block;font-size:var(--fs-sm);}
.sbuy{display:none;}

/* ============================================================
   newsletter band + stopka (v3, adaptacja PL/UE)
   ============================================================ */
/* runda 25: te 4 reguły siedziały WEWNĄTRZ niedomkniętego komentarza nagłówka sekcji (błąd sprzed PR #372, jest też na
   bazie) — przeglądarka ich nie widziała, więc .paylogos był zwykłym blokiem i flex .paybar ściskał go do szerokości
   jednego logo (pionowa kolumna). Teraz: jeden rząd, równa wysokość 26 px, równe odstępy, zawijanie na mobile. */
.paylogos{display:flex;flex-wrap:wrap;gap:6px;align-items:center;flex:1 1 auto;min-width:0;}
.paylogos img{height:26px;width:auto;border-radius:4px;}
:root[data-theme="dark"] .paylogos img{background:#fff;}
@media (prefers-color-scheme:dark){:root:not([data-theme="light"]) .paylogos img{background:#fff;}}
.paybar .wrap > span{text-wrap:pretty;}
.nlband{background:var(--wash);border-top:1px solid var(--line);margin-top:56px;}
.nlband .wrap{padding-top:36px;padding-bottom:40px;text-align:center;}
.nlband h2{font-size:var(--fs-xl);letter-spacing:var(--ls-label);text-transform:uppercase;}
.nlband p{margin:8px 0 18px;font-size:var(--fs-md);color:var(--muted);}
.nlband form{display:flex;gap:10px;max-width:500px;margin:0 auto;}
.nlband .fld{background:var(--surface);}
.nlband small{display:block;margin-top:10px;font-size:var(--fs-xs);color:var(--muted);}
.nlband small a{color:var(--red);text-decoration:underline;}
.foot{background:var(--surface);border-top:1px solid var(--line);font-size:var(--fs-md);}
.foot .wrap{display:grid;grid-template-columns:1.4fr 1fr 1fr 1fr;gap:34px;padding-top:36px;padding-bottom:28px;}
.foot h3{font-size:var(--fs-xs);letter-spacing:var(--ls-label);text-transform:uppercase;color:var(--red);margin-bottom:12px;}
.foot li{margin-bottom:7px;}
.foot a:hover{color:var(--red);}
.foot .about p{margin:0 0 12px;line-height:1.65;font-size:var(--fs-sm);color:var(--muted);}
.foot .flogo img{height:52px;width:auto;margin-bottom:12px;filter:var(--logo-filter);border-radius:var(--logo-radius);}
.wbtn{display:inline-block;background:var(--surface);border:2px solid var(--red);color:var(--red);font-weight:700;border-radius:var(--r);padding:7px 13px;font-size:var(--fs-sm);margin-top:6px;}
.wbtn:hover{background:var(--red-fill);border-color:var(--red-fill);color:var(--on-fill) !important;}
.soc{display:flex;gap:10px;}
.soc a{width:44px;height:44px;display:flex;align-items:center;justify-content:center;border:1px solid var(--line);border-radius:var(--r);}
.soc a:hover{border-color:var(--red);}
.paybar{border-top:1px solid var(--line);}
.paybar .wrap{display:flex;justify-content:space-between;align-items:center;gap:14px;min-height:52px;flex-wrap:wrap;padding-top:8px;padding-bottom:8px;font-size:var(--fs-sm);color:var(--muted);}
.paybar .pays{display:flex;gap:6px;flex-wrap:wrap;}
.botbar{background:var(--wash2);color:var(--muted);font-size:var(--fs-sm);}
.botbar .wrap{display:flex;justify-content:space-between;gap:12px;min-height:42px;align-items:center;flex-wrap:wrap;}

/* sticky header (v3: smart sticky — pokazywany przy scrollu w górę); 869f7deet: pełny komplet narzędzi jak w nagłówku
   (te same .htool / .hdr-tools — reguły nagłówka dla mobile mają w listach selektorów także .sticky) */
:root{--stk-h:58px;}  /* wysokość paska — czyta też panel Kategorii (.mega-fix) i .mbar */
.sticky{position:fixed;top:0;left:0;right:0;z-index:85;background:var(--surface);border-bottom:1px solid var(--line);box-shadow:var(--sh-1);transform:translateY(-105%);visibility:hidden;transition:transform .3s ease-out,visibility 0s .3s;}
body.stuck .sticky{transform:none;visibility:visible;transition:transform .3s ease-out;}
.sticky .wrap{display:flex;align-items:center;gap:18px;min-height:var(--stk-h);}
.sticky .search{flex:1;max-width:none;}
.sticky .search .fld,.sticky .search .btn{height:40px;}
.sticky .htool.sq{display:none;}
.sticky .hdr-tools{margin-left:auto;}
/* desktop: panel Kategorii otwarty z paska — przypięty pod nim (body.mega-fix, pkieu-v3.js pkt 9), na szerokości .wrap,
   własny scroll; pasek nad przyciemnieniem (.oc-ov z-index 90), żeby jego „Kategorie” zamykały panel */
@media (min-width:861px){
  body.mega-fix .mega{position:fixed;top:var(--stk-h);left:max(26px,calc((100% - var(--maxw)) / 2 + 26px));right:max(26px,calc((100% - var(--maxw)) / 2 + 26px));max-height:calc(100vh - var(--stk-h) - var(--sp-4));overflow-y:auto;}
  body.mega-fix .sticky{z-index:92;}
  /* panel przypięty pod paskiem leży w .mega-host (z-index 91, własny kontekst) — pasek menu .nav (92) malował się NAD nim, gdy
     był jeszcze na ekranie (3.11, zrzut Szymona: pasek przecinał panel i zasłaniał podkategorie); nad .nav, pod niczym innym
     potrzebnym (pasek 92 go nie przykrywa — panel zaczyna się pod paskiem) */
  body.mega-fix .mega-host{z-index:93;}
}

/* off-canvas kategorii (mobile) — TEN SAM <aside> co sidebar, nie kopia */
.oc-head{display:none;}
.oc-ov{display:none;}
.colL.oc-only{display:none;}

/* ============================================================
   RESPONSYWNOŚĆ
   ============================================================ */
@media (max-width:1180px){
  .cols{grid-template-columns:200px minmax(0,1fr);}
  .colR{grid-column:1 / -1;display:grid;grid-template-columns:repeat(3,1fr);gap:26px;}
  .pdp{grid-template-columns:260px minmax(0,1fr) 300px;column-gap:24px;}  /* 21.10: buybox w prawej kolumnie także na 861–1180 */
  .hrail{grid-auto-columns:calc((100% - 3*20px)/4);}
}
@media (max-width:860px){
  .wrap{padding:0 16px;}
  .topbar{font-size:var(--fs-sm);padding:8px 12px;}
  .topbar .det{display:none;}
  .hdr .wrap{grid-template-columns:auto 1fr auto;gap:10px 8px;padding-top:8px;padding-bottom:10px;}
  .burger{display:inline-flex;flex-direction:column;align-items:center;gap:2px;border:0;background:none;padding:6px 4px;font-size:var(--fs-2xs);color:var(--ink);}
  .burger .ico{width:var(--ico-24);height:var(--ico-24);stroke:var(--ink);}
  .logo{justify-self:start;}
  .logo img{height:44px;}
  .logo .tag{display:none;}
  .hdr-tools{grid-column:3;grid-row:1;gap:0;}
  .htool{padding:6px 6px;font-size:var(--fs-2xs);}
  .htool.acc span,.htool.theme span{display:none;}
  .htool .cnt{right:0;}
  .search{grid-column:1 / -1;grid-row:2;max-width:none;}
  .search .btn{padding:0 14px;}
  .search .btn span{display:none;}
  .nav{overflow-x:auto;scrollbar-width:none;}
  .nav ul{width:max-content;}
  .nav a{padding:12px 11px;font-size:var(--fs-sm);}
  .nav li.push{margin-left:0;}
  .cols,.cols-2{grid-template-columns:minmax(0,1fr);padding-top:14px;gap:0;}
  .colR{grid-template-columns:1fr;}
  /* sidebar kategorii → off-canvas (otwierany hamburgerem) */
  .colL{position:fixed;top:0;left:0;bottom:0;width:86vw;max-width:340px;background:var(--surface);z-index:120;overflow-y:auto;padding:0 18px 30px;transform:translateX(-102%);transition:transform .25s ease-out;box-shadow:var(--sh-drawer);}
  .colL{visibility:hidden;}
  body.oc-open .colL{transform:none;visibility:visible;}
  .colL .bx-head,.facets-col .bx-head{display:none;}
  .colL.oc-only{display:block;}
  .oc-head{display:flex;justify-content:space-between;align-items:center;position:sticky;top:0;background:var(--surface);padding:14px 0 10px;z-index:1;border-bottom:1px solid var(--line);margin-bottom:8px;}
  .oc-head b{font-family:var(--head);font-size:var(--fs-md);letter-spacing:var(--ls-label);text-transform:uppercase;color:var(--red);}
  .oc-head button{width:44px;height:44px;border:0;background:none;font-size:var(--fs-h1m);color:var(--muted);}
  .oc-ov{display:block;position:fixed;inset:0;background:var(--overlay);z-index:119;opacity:0;visibility:hidden;transition:opacity .2s;}
  body.oc-open .oc-ov{opacity:1;visibility:visible;}
  .grid,.grid.g5{grid-template-columns:repeat(2,minmax(0,1fr));gap:24px 14px;}
  .card .btn{height:44px;}
  .hrail{grid-auto-columns:42%;gap:14px;}
  .hrail-wrap .arr{display:none;}
  /* baner F2: czerwony panel nad tekstem, okładka na styku; nawigacja = prawy dół panelu tekstu (prawy dół banera) */
  .car .slide{grid-template-columns:minmax(0,1fr);min-height:0;}
  .car .art{order:-1;min-height:220px;justify-content:center;border-radius:var(--r) var(--r) 0 0;}
  .car .txt{justify-content:flex-start;border:var(--card-border);border-top:0;border-radius:0 0 var(--r) var(--r);padding:24px 20px 84px 28px;}
  .car .hmark{--pc-gx:10px;max-width:calc(100% - 14px);}  /* ⌟ mieści się w paddingu panelu; okładka nad tekstem, nie obok */
  .car .hero-t{font-size:30px;}
  .car .hmark.long .hero-t{font-size:26px;max-width:none;}
  .car .byl,.car .lead{max-width:none;}
  .car .lead{font-size:var(--fs-md);}
  .car .kick{top:14px;left:16px;right:16px;max-width:none;text-align:left;}
  .car .one{height:180px;margin:0;transform:rotate(-3deg) translateY(30px);}
  .car .art-fan{align-items:center;padding:44px 16px 0;}
  .car .fan{width:min(300px,100%);margin:0 auto;}
  .car .art-chips{padding:14px 16px 20px;}
  .car .art-chips .kick{align-self:stretch;margin-bottom:14px;}
  .car .chips > span:not(.chips-h){padding:6px 9px;}
  .car .cnav{right:16px;bottom:18px;}
  .car .cpos{color:var(--muted);} .car .cpos b{color:var(--ink);} .car .cnext{text-decoration-color:var(--line2);}
  .thumbs{display:flex;overflow-x:auto;scroll-snap-type:x mandatory;}
  .thumbs a{flex:0 0 40%;scroll-snap-align:start;aspect-ratio:auto;min-height:48px;}
  .intro h1,.cat-hero h1{font-size:var(--fs-h1m);}
  .news{grid-template-columns:1fr;}
  .tabs{flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none;margin-right:-16px;}
  .tabs a{white-space:nowrap;}
  /* home mobile: 4 bestsellery zamiast 8 (reszta w DOM, link „Wszystkie") */
  .grid.m4 > :nth-child(n+5){display:none;}
  .sec-head h2{font-size:var(--fs-md);letter-spacing:var(--ls-label);}
  .deals{padding:2px 14px 20px;margin:0 -16px;border-radius:0;}
  .foot .wrap{grid-template-columns:1fr 1fr;}
  .foot .about{grid-column:1 / -1;}
  .nlband form{flex-direction:column;}
  /* lista: fasety do arkusza; mobilny pasek Filtruj/Sortuj (sticky) */
  .facets-col{position:fixed;left:0;right:0;bottom:0;max-height:86vh;background:var(--surface);z-index:120;overflow-y:auto;border-radius:var(--r-sheet) var(--r-sheet) 0 0;padding:0 18px 90px;transform:translateY(102%);transition:transform .25s ease-out;}
  .facets-col,.sheet-foot{visibility:hidden;}
  body.sheet-open .facets-col,body.sheet-open .sheet-foot{transform:none;visibility:visible;}
  .sheet-ov{display:block;position:fixed;inset:0;background:var(--overlay);z-index:119;opacity:0;visibility:hidden;}
  body.sheet-open .sheet-ov{opacity:1;visibility:visible;}
  .sheet-foot{display:flex;position:fixed;left:0;right:0;bottom:0;background:var(--surface);border-top:1px solid var(--line);padding:12px 18px calc(12px + env(safe-area-inset-bottom));display:flex;gap:10px;z-index:121;transform:translateY(102%);transition:transform .25s;}
  body.sheet-open .sheet-foot{transform:none;}
  .sheet-foot .btn{flex:1;}
  .mbar{display:flex;position:sticky;top:0;z-index:60;background:var(--surface);gap:8px;padding:8px 0;border-bottom:1px solid var(--line);margin:0 0 10px;}
  .mbar button,.mbar .sel{flex:1;height:42px;border:1px solid var(--line2);border-radius:var(--r);background:var(--surface);font-size:var(--fs-md);font-weight:500;color:var(--ink);display:flex;align-items:center;justify-content:center;gap:7px;}
  .mbar .badge{background:var(--red-fill);color:var(--on-fill);border-radius:var(--r-pill);font-size:var(--fs-2xs);min-width:18px;height:18px;display:inline-flex;align-items:center;justify-content:center;}
  .toolbar{display:none;}
  .facet-cats{display:none;} /* makieta C: na mobile kategorie są w szufladzie „Kategorie” */
  .cat-hero{display:block;}
  .cat-hero p{font-size:var(--fs-md);}
  /* paginacja (5.11, zgłoszenie „na telefonie nie da się przejść dalej”): Html.Pager nopa renderuje li.first-page/previous-page/
     individual-page/current-page/next-page/last-page — reguła z makiety (c0b31af55) celowała w .cur/.nx, których tu nie ma, więc chowała
     WSZYSTKIE linki. Na telefonie: „Poprzednia”, bieżąca, „Następna”; numery sąsiednie od 420 px (przy 360 px nie mieszczą się
     w jednym wierszu ze słowami); „Pierwsza”/„Ostatnia” i dalsze numery schowane. Cel dotyku 44 px. */
  .pager li.first-page,.pager li.last-page,.pager li.individual-page{display:none;}
  .pager li.previous-page a,.pager li.next-page a{min-width:44px;}
  @media (min-width:420px){
    .pager li.individual-page:has(+ .current-page),.pager li.current-page + li.individual-page{display:list-item;}
  }
  /* PDP mobile */
  .pdp{grid-template-columns:1fr;gap:18px;}
  .pdp .buy{position:static;}  /* mobile: przyklejony jest pasek .sbuy, nie buybox */
  .gal .main{padding:16px;}
  .gal .main img{max-width:170px;}
  .pinfo .lede{display:none;}
  .gal .thumbs2,.gal .share{display:none;}
  .gal .zoom{font-size:0;padding:6px;}
  .pinfo h1{font-size:22px;}
  .hl{grid-template-columns:1fr 1fr;}
  .hl div:nth-child(3){border-left:0;}
  .hl div:nth-child(n+3){border-top:1px solid var(--line);}
  .pdp-body{grid-template-columns:1fr;gap:0;}
  .fbt{grid-template-columns:1fr;padding:16px;}
  .fbt .set{overflow-x:auto;}
  .fbt .it{width:118px;flex:none;}
  .fbt .it .im{height:120px;}
  .fbt .sum{border-left:0;padding-left:0;border-top:1px solid var(--line);padding-top:14px;}
  .lede .full{display:-webkit-box;-webkit-line-clamp:5;-webkit-box-orient:vertical;overflow:hidden;}
  .aside-box{display:none;}
  .also-purchased-products-grid,.colM .also-purchased-products-grid,.search-results .also-purchased-products-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:24px 14px;}
  .sbuy{display:flex;transform:translateY(110%);transition:transform .2s ease-out;position:fixed;left:0;right:0;bottom:0;z-index:70;background:var(--surface);border-top:1px solid var(--line2);box-shadow:var(--sh-1);padding:10px 16px calc(10px + env(safe-area-inset-bottom));gap:12px;align-items:center;}
  .sbuy .p b{display:block;font-family:var(--head);font-size:var(--fs-xl);color:var(--red);line-height:1.1;}
  /* napis zawija się w 2 linie w stałej wysokości 48 px (e2e 4.11: „Zamów w przedsprzedaży” nowrap wystawał poza ekran 320–360 px); jak przycisk kafla */
  .sbuy .btn{flex:1;min-width:0;height:48px;padding:0 12px;white-space:normal;line-height:1.1;text-align:center;}
  body.sbuy-on .sbuy{transform:none;}
  body.has-sbuy,.master-wrapper-page.has-sbuy{padding-bottom:76px;}
  .pdp .pcats-wrap{display:none;}
}

/* ============================================================
   [2] NAKŁADKA MAKIETY C (pkieu-c.css, bez sekcji styleguide)
   ============================================================ */
/* ============================================================
   pki.eu — makieta C: JEDNOKOLUMNOWY wariant motywu v3
   Nakładka na pkieu.css (makieta A) — paleta, typografia, karta,
   tryb ciemny bez zmian; tu tylko układ:
   1) przycisk „Kategorie ▾" + drzewo kategorii (runda 4: płaska lista kategorii sklepu + podkategorie)
   2) hero: karta „Oferta tygodnia" + karuzela + 2 paski (runda 2)
   3) strony bez bocznych kolumn; filtry listy jako pasek nad wynikami
   4) waluta w headerze zamiast „Dostawa do" (jak żywy pki.eu: EUR/PLN/GBP)
   Wszystkie kolory przez tokeny z pkieu.css → tryb ciemny działa sam.
   ============================================================ */

/* ---------- header: waluta (żywy sklep ma select EUR / PLN / GBP) ---------- */

/* ---------- nav: „Kategorie ▾" jako pierwszy element paska ---------- */
.nav{position:relative;z-index:92;}
.nav li.kat{margin-right:10px;}
.katbtn{display:flex;align-items:center;gap:9px;height:46px;padding:0 18px;border:0;border-radius:var(--r);background:var(--red-fill);color:var(--on-fill);font-family:var(--head);font-weight:700;font-size:var(--fs-sm);letter-spacing:var(--ls-ui);text-transform:uppercase;}
.katbtn .ico{width:var(--ico-20);height:var(--ico-20);stroke:var(--on-fill);}
.katbtn .car-d{font-size:var(--fs-2xs);transition:transform .15s;}
.katbtn:hover,.katbtn[aria-expanded="true"]{background:var(--red-fill-deep);}
.katbtn[aria-expanded="true"] .car-d{transform:rotate(180deg);}

/* ---------- drzewo kategorii (desktop: panel pod paskiem) ---------- */
.mega-host{position:relative;z-index:91;}
.mega-host > .wrap{position:relative;}
.mega{position:absolute;top:0;left:26px;right:26px;min-height:560px;background:var(--surface);}   /* skóra i animacja: .pki-drop (koniec pliku) */
.mega{min-height:0;}
/* płaska lista kategorii = TYLKO szuflada mobile (≤ 860 px, niżej); desktop = układ C .mgc (pkieu-menu.css, 5.11) — stary panel
   3 kolumn z › po prawej zdjęty */
.mg-list{display:none;}
.mg-c{display:flex;align-items:center;border-radius:var(--r);}
.mg-h{flex:1;display:flex;align-items:center;gap:var(--sp-2);padding:5px var(--sp-3);font-size:var(--fs-md);line-height:1.35;color:var(--ink);}
.mg-tg{flex:none;width:28px;height:28px;display:flex;align-items:center;justify-content:center;border:0;background:none;border-radius:var(--r);}
.mg-tg .chev{width:var(--ico-16);height:var(--ico-16);stroke:var(--muted);transition:transform .15s;}
.mg-c > .mg-h:hover,.mg-h.cur{color:var(--red);}
.mg-tg:hover{background:var(--wash);}
.mg-h.cur{font-weight:700;}
.mg-h:is(.fastc,.hot){font-weight:500;}  /* menu „Kategorie” i szuflada: obie pozycje specjalne jedną regułą (5.11) */
.mg-h.fastc{color:var(--green);}
.mg-h.hot{color:var(--red);}
.mg-sub{display:none;}
.mg-title{display:block;font-family:var(--head);font-weight:700;font-size:var(--fs-sm);letter-spacing:var(--ls-label);text-transform:uppercase;color:var(--red);padding-bottom:10px;border-bottom:1px solid var(--line);margin-bottom:var(--sp-3);}
.mg-sub li a{display:block;padding:4px 0;font-size:var(--fs-md);color:var(--body);line-height:1.4;break-inside:avoid;}
.mg-sub li a:hover,.mg-title:hover{color:var(--red);}
.mg-more{display:inline-block;margin-top:var(--sp-3);font-size:var(--fs-sm);color:var(--link);}
.mg-more:hover{color:var(--red);text-decoration:underline;}
/* przyciemnienie pod otwartym drzewem (ten sam .oc-ov co szuflada mobile) — tylko TREŚĆ: od górnej krawędzi panelu w dół
   (--ov-top na body liczy pkieu-v3.js pkt 9 przy otwarciu i przewijaniu), połowa siły --overlay. Topbar, nagłówek i pasek
   menu wyglądają jak przy zamkniętym menu; dawniej przyciemnienie szło od góry ekranu, a pasek menu (z-index 92) zostawał
   nad nim „podświetlony” (Szymon 20.10: „jak podświetla cały ten pasek, to wygląda jak bug”). */
/* narasta i znika płynnie (Szymon 21.10: „more gradual”): --dim-in 280 ms ease-out / --dim-out 200 ms ease-in z PKI_DIM_MS
   (pkieu-v3.js); w spoczynku warstwa jest w DOM, ale niewidoczna i nieklikalna. prefers-reduced-motion: bez przejścia. */
@media (min-width:861px){
  .oc-ov{display:block;position:fixed;inset:var(--ov-top,0px) 0 0 0;background:color-mix(in srgb,var(--overlay) 45%,transparent);z-index:90;
    opacity:0;visibility:hidden;pointer-events:none;transition:opacity var(--dim-out,200ms) ease-in,visibility 0s linear var(--dim-out,200ms);}
  /* przejście TYLKO po opacity: górna krawędź (--ov-top — koszyk od spodu rzędu z ikonami, Kategorie od spodu paska menu)
     ustawia się od razu, także przy pierwszym otwarciu i przy przełączaniu (Szymon 21.10: animowane top dawało „ciemną falę
     przez navbar” przy pierwszym najechaniu na koszyk — warstwa jechała z 0 do rzędu ikon) */
  body.drop-dim .oc-ov{opacity:1;visibility:visible;pointer-events:auto;transition:opacity var(--dim-in,280ms) ease-out,visibility 0s;}
}

/* ---------- strony jednokolumnowe ---------- */
body.one main.wrap{padding-top:20px;}
body.cat main.wrap{padding-top:0;}

/* ---------- HOME: hero = „Oferta tygodnia" (runda 2) + karuzela + 2 paski pod banerem (zdjęte w pkt 2, przywrócone — zrzut 101) ---------- */
:root{--hero-side:276px;}  /* kolumna boczna hero (mini-hero Poradniki); ta sama szerokość wyznacza kolumny rzędu .pr-row */
.hero{display:grid;grid-template-columns:var(--hero-side) minmax(0,1fr) minmax(0,1fr);grid-template-areas:"offer car car" "offer s1 s2";gap:16px;}

/* ---------- Bestsellery: zakładki tekstowe w linii nagłówka (runda 4) ----------
   ten sam wzorzec co .tabs v3 (taby gatunków): aktywna = czerwień + 700 + podkreślenie
   pod tekstem; „Dla dzieci / nastolatków" to zwykłe linki do osobnych list, w tym samym rzędzie */
.bs .sec-head{align-items:flex-end;}
.bs-tabs{margin:0 auto 0 var(--sp-6);gap:var(--sp-5);flex-wrap:nowrap;}
.bs-tabs [role=tablist]{display:contents;}
.bs-tabs a{white-space:nowrap;padding-bottom:var(--sp-1);}
.bs-tabs a:not(.on){color:var(--body);}
.bs-tabs a:hover{color:var(--red);}
/* „Wszystkie bestsellery →” na tej samej linii bazowej co zakładki (Szymon: „nie tak w połowie do tych Dla nastolatków”):
   zakładki mają pod tekstem padding --sp-1 i 2 px podkreślenia (przezroczystego, gdy nieaktywna), a nagłówek wyrównuje do
   dołu (flex-end) — link dostaje to samo pudełko pod tekstem, więc tekst stoi w jednej linii (wcześniej 6 px niżej).
   ≤ 860 px zakładki są osobnym wierszem pod tytułem — tam bez zmian. */
@media (min-width:861px){.bs .sec-head .all{padding-bottom:var(--sp-1);border-bottom:2px solid transparent;}}
.grid[role=tabpanel][hidden]{display:none;}
.hero .car{grid-area:car;}
.hero .car .slide{height:100%;}
.grid.g6{grid-template-columns:repeat(6,minmax(0,1fr));gap:30px 20px;}
.hrail{grid-auto-columns:calc((100% - 5*20px)/6.3);}
.duo{display:grid;grid-template-columns:minmax(0,2fr) minmax(0,1fr);gap:36px;}
.duo .shipbox{margin-top:-2px;}

/* ---------- LISTA: filtry jako pasek nad wynikami (zamiast lewej kolumny) ---------- */
.fbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:10px 0;border-top:1px solid var(--line);border-bottom:1px solid var(--line);margin:0 0 12px;position:relative;z-index:20;}
.fbar-l{display:flex;align-items:center;gap:6px;font-size:var(--fs-md);color:var(--muted);margin-right:4px;}
.fbar-l .ico{width:var(--ico-16);height:var(--ico-16);}
.fbar .facet{border:0;position:relative;}
.fbar .facet summary{gap:8px;padding:7px 14px;border:1px solid var(--line2);border-radius:var(--r-pill);font-family:var(--sans);font-weight:500;font-size:var(--fs-md);letter-spacing:0;text-transform:none;background:var(--surface);}
.fbar .facet summary:hover{border-color:var(--ink);color:var(--ink);}
.fbar .facet[open] summary{border-color:var(--ink);box-shadow:inset 0 0 0 1px var(--ink);}
.fbar .facet summary i{font-style:normal;font-size:var(--fs-2xs);font-weight:700;background:var(--red-fill);color:var(--on-fill);border-radius:var(--r-pill);min-width:17px;height:17px;display:inline-flex;align-items:center;justify-content:center;}
.fbar .facet .opts{position:absolute;top:calc(100% + 6px);left:0;min-width:290px;background:var(--surface);border:1px solid var(--line2);border-radius:var(--r);box-shadow:var(--sh-pop);padding:12px 16px 14px;z-index:30;}
.fbar .sp{flex:1;}
.fbar .sortl{font-size:var(--fs-md);color:var(--muted);}
.active-f .count{font-size:var(--fs-md);color:var(--body);margin-right:8px;}
.active-f .count b{color:var(--ink);}
.cat .grid.g5{gap:32px 22px;}

@media (max-width:1180px){
  .grid.g6{grid-template-columns:repeat(4,minmax(0,1fr));}
  .grid.g6.m4 > :nth-child(n+5){display:none;}
  .hrail{grid-auto-columns:calc((100% - 3*20px)/4.3);}
  :root{--hero-side:250px;}
  .hero{grid-template-columns:var(--hero-side) minmax(0,1fr) minmax(0,1fr);}
  .bs-tabs{margin-left:var(--sp-4);gap:var(--sp-4);}
}

/* ============================================================
   MOBILE: lista z hero znika, hero na pełną szerokość;
   drzewo = szuflada z akordeonem (ten sam DOM co panel desktop);
   pasek filtrów = arkusz od dołu (jak makieta A)
   ============================================================ */
@media (max-width:860px){
  .nav li.kat{margin-right:4px;}
  .katbtn{height:42px;padding:0 13px;font-size:var(--fs-sm);}
  body.one main.wrap{padding-top:14px;}

  /* oferta POD banerem (baner = kampania, pierwszy ekran), jako pozioma karta */
  .hero{grid-template-columns:minmax(0,1fr);grid-template-areas:"car" "offer" "s1" "s2";gap:10px;}
  .bs .sec-head{flex-wrap:wrap;}
  /* zakładki: pełny wiersz pod tytułem, przewijane w poziomie (5 pozycji nie mieści się w 375 px) */
  .bs .sec-head{padding-bottom:0;}
  .bs-tabs{order:3;width:100%;margin:var(--sp-2) 0 -1px;overflow-x:auto;scrollbar-width:none;}
  .bs-tabs::-webkit-scrollbar{display:none;}
  .bs-tabs a{padding:var(--sp-2) 0;}
  .grid.g6{grid-template-columns:repeat(2,minmax(0,1fr));gap:24px 14px;}
  .hrail{grid-auto-columns:42%;gap:14px;}
  .duo{grid-template-columns:minmax(0,1fr);gap:0;}

  /* drzewo → szuflada */
  .mega-host{position:static;}
  .mega{display:block;position:fixed;top:0;left:0;right:auto;bottom:0;width:88vw;max-width:360px;min-height:0;z-index:120;overflow-y:auto;padding:0 0 30px;border:0;transform:translateX(-102%);visibility:hidden;transition:transform .25s ease-out;box-shadow:var(--sh-drawer);}
  body.oc-open .mega{transform:none;visibility:visible;}
  body.mega-open .oc-ov{display:block;}
  .mega .oc-head{padding:14px 18px 10px;margin:0;}
  /* szuflada: ta sama płaska lista, › rozwija podkategorie pod pozycją (zwykłe linki, bez pigułek) */
  .mg-list{display:block;width:auto;min-height:0;border:0;padding:0;}
  .mg-c{flex-wrap:wrap;border-radius:0;border-bottom:1px solid var(--line);}
  .mg-h{padding:12px 18px;font-size:var(--fs-base);}
  .mg-h.cur{color:var(--red);}
  .mg-tg{width:var(--h-touch);height:var(--h-touch);}
  .mg-c.open{background:var(--wash);}
  .mg-c.open > .mg-h{color:var(--red);}
  .mg-c.open .mg-tg .chev{transform:rotate(90deg);stroke:var(--red);}
  .mg-sub{display:none;position:static;width:100%;padding:0 18px 12px 30px;overflow:visible;}
  .mg-c.open > .mg-sub{display:block;}
  .mg-title{display:none;}
  .mg-sub ul{columns:1;}
  .mg-sub li a{padding:7px 0;font-size:var(--fs-md);}
  .mg-more{margin-top:var(--sp-1);}

  /* pasek filtrów → arkusz od dołu */
  .fbar{position:fixed;left:0;right:0;bottom:0;top:auto;display:block;max-height:86vh;margin:0;background:var(--surface);z-index:120;overflow-y:auto;border:0;border-radius:var(--r-sheet) var(--r-sheet) 0 0;padding:0 18px 90px;transform:translateY(102%);visibility:hidden;transition:transform .25s ease-out;}
  body.sheet-open .fbar,body.sheet-open .sheet-foot{transform:none;visibility:visible;}
  .fbar .oc-head{margin-bottom:4px;}
  .fbar-l,.fbar .sp,.fbar .sortl,.fbar #sort{display:none;}
  .fbar .facet{border-bottom:1px solid var(--line);}
  .fbar .facet summary{border:0;border-radius:0;padding:13px 2px;font-family:var(--head);font-weight:700;font-size:var(--fs-2xs);letter-spacing:var(--ls-label);text-transform:uppercase;box-shadow:none !important;}
  .fbar .facet summary i{margin:0 10px 0 auto;}
  .fbar .facet .opts{position:static;min-width:0;border:0;box-shadow:none;padding:0 0 12px;}
  .active-f .count{width:100%;}
}

/* ============================================================
   RUNDA 3 — SYSTEM WIZUALNY (jedna warstwa nad A i rundami 1–2)
   Tokeny: pkieu.css :root (--fs-*, --ls-*, --r*, --sh-*, --h-*, --sp-*, --ico-*).
   Komponenty: etykieta sekcji · przycisk (primary / green / ghost / inverse; md / sm)
   · zakładki tekstowe · chip · badge · licznik
   · panel (ramka 1 px) · karta produktu · popover.
   ============================================================ */

/* 1) ETYKIETA SEKCJI — jeden wzorzec dla .sec-head h2, .bx-head, .mg-title,
      nagłówka Oferty tygodnia, bloków SEO i nagłówka szuflady */
.sec{margin-top:var(--sp-7);}
.sec-head{gap:var(--sp-4);margin-bottom:var(--sp-5);padding-bottom:var(--sp-3);border-bottom:1px solid var(--line);}
.sec-head h2,.bx-head,.mg-title,.mcart.pki-drop .mc-h,.hpanel-h,.seo h2,.cat-seo h2{font-family:var(--head);font-weight:700;font-size:var(--fs-label);line-height:1.25;letter-spacing:var(--ls-label);text-transform:uppercase;color:var(--red);}
.bx-head,.mg-title,.mcart.pki-drop .mc-h,.hpanel-h{padding-bottom:var(--sp-3);margin-bottom:var(--sp-4);border-bottom:1px solid var(--line);}
.seo h2,.cat-seo h2{margin-bottom:var(--sp-3);}
.sec-head h2 small{font-size:var(--fs-sm);margin-top:var(--sp-1);}
.sec-head .all{font-size:var(--fs-md);}

/* 2) PRZYCISKI — 2 rozmiary (md 40 / sm 32), 4 warianty; ten sam font i tracking */
.btn{height:var(--h-md);padding:0 var(--sp-5);font-size:var(--fs-sm);letter-spacing:var(--ls-ui);border-radius:var(--r);}
.btn-sm,.card .btn{height:var(--h-sm);padding:0 var(--sp-4);font-size:var(--fs-2xs);}
.card .btn{height:var(--h-md);}
.btn-lg{height:var(--h-lg);}
.btn-ghost{border:1px solid var(--ink);}
.btn-green{background:var(--green-fill);color:var(--on-fill);}
.btn-green:hover{background:var(--green-fill);filter:brightness(.9);}
.search .fld,.search .btn,.katbtn{height:var(--h-lg);}
.katbtn{font-size:var(--fs-sm);letter-spacing:var(--ls-ui);}

/* 3) ZAKŁADKI — patrz „Bestsellery: zakładki tekstowe” wyżej (segment control usunięty w rundzie 4) */

/* 4) CHIP — pigułka, font treści.
      Pigułki filtrów, aktywne filtry (wypełniony),
      wydania na karcie (xs), podkategorie w szufladzie */
.chip,.fbar .facet summary,.pcats a{display:inline-flex;align-items:center;gap:var(--sp-2);height:var(--h-sm);padding:0 var(--sp-4);border:1px solid var(--line2);border-radius:var(--r-pill);background:var(--surface);font-family:var(--sans);font-weight:500;font-size:var(--fs-md);letter-spacing:0;text-transform:none;color:var(--ink);white-space:nowrap;}
.fbar .facet summary:hover,.pcats a:hover{border-color:var(--ink);color:var(--ink);}
.fbar .facet[open] summary{border-color:var(--ink);box-shadow:inset 0 0 0 1px var(--ink);}
.chip{background:var(--chip-bg);border-color:var(--chip-bg);color:var(--chip-ink);padding-right:var(--sp-1);}
.chip button{width:24px;height:24px;border-radius:var(--r-pill);font-size:var(--fs-md);}
.fbar-l,.fbar .sortl{font-size:var(--fs-md);color:var(--muted);}
.card .edchips{gap:var(--sp-1);}
.card .edchips a{display:inline-flex;align-items:center;height:24px;padding:0 var(--sp-2);border-radius:var(--r-pill);font-size:var(--fs-2xs);}

/* 5) BADGE — jeden wzorzec (promocja / info), wszędzie ta sama pozycja na okładce */
.badge,.card .badge{display:inline-flex;align-items:center;font-family:var(--head);font-weight:700;font-style:normal;font-size:var(--fs-2xs);line-height:1;letter-spacing:var(--ls-ui);text-transform:uppercase;padding:5px var(--sp-2);border-radius:var(--r-xs);background:var(--red-fill);color:var(--on-fill);}
.card .badge{position:absolute;top:var(--sp-2);left:calc(-1 * var(--sp-2));z-index:1;}
/* Przecena −X% (Szymon 21.10): ta sama wstążka (kształt, Montserrat wersalikami, czerwień), ale większa i NAD pozostałymi —
   na okładce karty i w przechowalni lewy górny róg (Szybka wysyłka w dolnym), w buyboksie pierwsza w kolumnie .pr-rib */
.badge.sale{font-size:var(--fs-md);padding:7px 10px;}
/* „Szybka wysyłka” na okładce (Szymon 20.10: „plakietkę tak jak miały bestsellery — jako badge na okładce”): ta sama wstążka co
   −X% / dawna „Bestseller” (kształt, stopień, wersaliki), w zieleni Szybkiej wysyłki + biała błyskawica. Miejsce: lewy DOLNY róg
   okładki — okładka ma 2:3 i pełną szerokość karty (karta = kontener), więc jej dół to 150cqw; −X% zostaje w lewym górnym, obie
   naraz się nie zderzają. Nie wewnątrz .cv: overflow:hidden okładki ucinałby wystającą wstążkę. Karta < 150 px: sama błyskawica. */
.card .badge.fast{top:calc(150cqw - var(--sp-2) - 21px);gap:4px;background:var(--green-fill);}
.card .badge.fast .ico{width:11px;height:11px;flex:none;stroke:var(--on-fill);fill:var(--on-fill);stroke-width:1.5;}
/* „Przedsprzedaż” (Szymon 2.11): ta sama wstążka i miejsce co Szybka wysyłka (wzajemnie się wykluczają — presale
   wygrywa), błękit wstążki przedsprzedaży z buyboksu (.pr-rib .badge.presale) + zegar; karta < 150 px: sam zegar. */
.card .badge.presale{top:calc(150cqw - var(--sp-2) - 21px);gap:4px;background:var(--blue);color:var(--ground);}
.card .badge.presale .ico{width:11px;height:11px;flex:none;fill:none;stroke:currentColor;stroke-width:2;}
/* 3.11 (zrzut 414): dwie wstążki — pełna „Premiera dd.MM.yyyy” w miejscu Szybkiej wysyłki, „Przedsprzedaż” z zegarem wyżej
   o wysokość wstążki + 4 px (kolejność jak .pr-rib w buyboksie: Przedsprzedaż, pod nią Premiera); karta < 150 px: sam zegar */
.card .badge.presale:has(+ .badge.premiere){top:calc(150cqw - var(--sp-2) - 21px - 21px - 4px);}
@container (max-width:149.98px){
  .card .badge.premiere{display:none;}
  .card .badge.presale:has(+ .badge.premiere){top:calc(150cqw - var(--sp-2) - 21px);}
  .card .badge.fast,.card .badge.presale{padding:5px 6px;}
  .card .badge.fast .badge-t,.card .badge.presale .badge-t{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;}
}
/* 5b) ZNACZNIK SZYBKIEJ WYSYŁKI (runda 4) — biała błyskawica na --green-fill, kwadrat --r-xs;
       zamiast pigułki „24 h" w nawigacji, drzewie, kartach, pasku i filtrze. Treść „Wysyłka w 24 h" zostaje. */
.fastmark{display:inline-flex;align-items:center;justify-content:center;flex:none;width:18px;height:18px;border-radius:var(--r-xs);background:var(--green-fill);vertical-align:-4px;}
.fastmark .ico{width:12px;height:12px;stroke:var(--on-fill);fill:var(--on-fill);stroke-width:1.5;}
.nav a.fast{display:inline-flex;align-items:center;gap:var(--sp-2);}
.opt.fast .fastmark{margin-left:-2px;}
.opt .n{white-space:nowrap;}
@media (min-width:861px){.fbar .facet .opts{min-width:320px;}}

/* 6) LICZNIK — koszyk, liczba aktywnych filtrów (desktop i mobile) */
.htool .cnt,.fbar .facet summary i,.mbar .badge{min-width:18px;height:18px;padding:0 5px;border-radius:var(--r-pill);background:var(--red-fill);color:var(--on-fill);font-family:var(--sans);font-style:normal;font-weight:700;font-size:var(--fs-2xs);display:inline-flex;align-items:center;justify-content:center;}

/* 7) PANEL — jedna ramka 1 px --line, --r, jak karty; bez akcentu krawędzi (runda 4).
      Znaczenie niesie treść: kolor etykiety + ikona (czerwień = cena/promocja, zieleń = dostawa).
      Złota ramka z referencji wyleciała: złoto w v3 = tylko gwiazdki ocen. */
.news article{border:1px solid var(--line);border-radius:var(--r);background:var(--surface);}
.news{gap:var(--sp-5);}
.news article{padding:var(--sp-4) var(--sp-5);}
.news h3{font-size:var(--fs-base);}
.card .price s{font-size:var(--fs-md);color:var(--muted);}
.card .omni{font-size:var(--fs-xs);}
.card .cv{border-radius:var(--r);}
.deals{border-radius:var(--r);padding:0 var(--sp-5) var(--sp-5);}
.deals .sec-head{margin-top:var(--sp-5);}

/* 8) POPOVER / PANEL NAD TREŚCIĄ — jeden cień, jedna ramka */
.fbar .facet .opts{border:1px solid var(--line);border-radius:var(--r);box-shadow:var(--sh-pop);}
/* panele rozwijane nagłówka (Kategorie, podgląd koszyka) — wspólna skóra .pki-drop na KOŃCU pliku (musi wygrać z .mcart) */

/* 9) IKONY — jedna grubość, 3 rozmiary */
.ico,svg.ico,.loupe,.btn svg{stroke-width:var(--ico-sw);}
.hdr .htool .ico{width:var(--ico-24);height:var(--ico-24);}
.katbtn .ico{width:var(--ico-20);height:var(--ico-20);}
.card .ship .ico,.mg-tg .chev,.fbar-l .ico{width:var(--ico-16);height:var(--ico-16);}

/* 10) SIATKA I ODSTĘPY — 1320 px, odstępy z --sp-* */
.hero{gap:var(--sp-4);}
.grid,.grid.g5,.grid.g6{gap:var(--sp-6) var(--sp-5);}
.hrail{gap:var(--sp-5);grid-auto-columns:calc((100% - 5 * var(--sp-5)) / 6.3);}
.intro{margin-top:var(--sp-6);}
.duo{gap:var(--sp-6);}
.seo,.cat-seo{margin-top:var(--sp-7);}
.pager{margin-top:var(--sp-6);}
.fbar{gap:var(--sp-2);padding:var(--sp-3) 0;margin-bottom:var(--sp-4);}
.active-f{gap:var(--sp-2);margin-bottom:var(--sp-5);}
.cat-hero{margin:var(--sp-2) 0 var(--sp-4);}
.crumbs{padding:var(--sp-4) 0 var(--sp-1);}
body.one main.wrap{padding-top:var(--sp-5);}
body.cat main.wrap{padding-top:0;}

@media (max-width:1180px){
  .grid.g6{grid-template-columns:repeat(4,minmax(0,1fr));}
  .hrail{grid-auto-columns:calc((100% - 3 * var(--sp-5)) / 4.3);}
}
@media (max-width:860px){
  .sec{margin-top:var(--sp-6);}
  .sec-head h2,.bx-head,.mg-title,.seo h2,.cat-seo h2,.oc-head b{font-size:var(--fs-md);}
  .grid,.grid.g5,.grid.g6{grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--sp-5) var(--sp-3);}
  .hrail{grid-auto-columns:max(156px,42%);gap:var(--sp-3);} /* runda 47: karta karuzeli ≥156 px jak reszta strony — mieści kontrolkę ceny z „999.99 zł” */
  .card .btn,.btn{height:var(--h-touch);}
  .btn-sm{height:var(--h-md);}
  .tb-de{display:none;}
  .deals{padding:0 var(--sp-4) var(--sp-5);border-radius:0;}
  .hero{gap:var(--sp-3);}
  .mbar button,.mbar .sel{height:var(--h-touch);}
  /* w arkuszu filtrów pigułki wracają do wierszy akordeonu */
  .fbar .facet summary{height:auto;display:flex;justify-content:space-between;padding:var(--sp-3) 2px;border:0;border-radius:0;background:none;font-family:var(--head);font-weight:700;font-size:var(--fs-2xs);letter-spacing:var(--ls-label);text-transform:uppercase;box-shadow:none !important;}
  .fbar .facet .opts{border:0;box-shadow:none;}
  .mega{border-radius:0;box-shadow:var(--sh-drawer);}
}

/* select w pasku filtrów = chip (ta sama wysokość i kształt) */
@media (min-width:861px){
  .fbar .sel{height:var(--h-sm);border-radius:var(--r-pill);border:1px solid var(--line2);background:var(--surface);padding:0 var(--sp-6) 0 var(--sp-4);font-size:var(--fs-md);font-weight:500;color:var(--ink);}
}

/* ============================================================
   NOP — mosty motywu (markup Nopa wokół komponentów makiety)
   ============================================================ */
.master-wrapper-page{min-height:100vh;display:flex;flex-direction:column;}
.master-wrapper-main{flex:1 0 auto;display:block;}
/* odstęp przed stopką NA POZIOMIE LAYOUTU (Szymon 20.10, strona główna: „Aktualności” stały na stopce — „tutaj brakuje przerwy”):
   --gap-block (16 / 12 px) = odstęp między kartami sekcji strony głównej; jeden dla każdej strony, więc karta newslettera na
   podstronach nie ma już własnego dolnego marginesu (13ccc0c5). .master-wrapper-page jest flex-kolumną — marginesy elementów
   flex się NIE zapadają, dwa marginesy dałyby podwójny odstęp. */
.foot{margin-top:var(--gap-block);}
.header-links{display:flex;align-items:center;gap:6px;}
.htool .cnt:empty{display:none;}
.sticky .cnt:empty{display:none;}
/* waluta (+ język przy >1 opublikowanym) — standardowe selektory Nopa, jak obecny pki.eu */
.hdr-sel{display:flex;align-items:center;gap:6px;margin-right:6px;}
.hdr-sel .language-list{display:flex;gap:6px;}
/* okładka zastępcza (869f7deet, strona wyników): brak adresu w danych ALBO obrazek nie przyszedł (404 w R2 — onerror dodaje
   .cv-none) — „okładka” motywu: czerwony grzbiet, tytuł, autor, znak PKI; przy działającym obrazku schowana. Tekst alt
   zepsutego obrazka nie przebija się przed onerror (color:transparent). */
.card .cv img{color:transparent;}
.card .cv:not(.cv-none) > .nocv,.card .cv.cv-none > img{display:none;}
.card .cv .nocv{position:relative;width:100%;height:100%;display:flex;flex-direction:column;justify-content:center;gap:8px;padding:14px 12px 30px 19px;background:linear-gradient(90deg,var(--red-fill) 0 5px,transparent 5px),var(--surface);border:1px solid var(--line);border-radius:2px;overflow:hidden;text-align:left;}
.card .cv .nocv-t{font-family:var(--head);font-weight:700;font-size:13px;line-height:1.3;color:var(--ink);display:-webkit-box;-webkit-line-clamp:6;-webkit-box-orient:vertical;overflow:hidden;overflow-wrap:anywhere;}
.card .cv .nocv-a{font-size:11.5px;line-height:1.3;color:var(--muted);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;}
.card .cv .nocv-logo{position:absolute;right:10px;bottom:10px;width:30px;height:auto;aspect-ratio:152/98;color:var(--muted);opacity:.45;}
@container (max-width:171.98px){.card .cv .nocv{padding:10px 8px 24px 14px;}.card .cv .nocv-t{font-size:12px;}.card .cv .nocv-logo{width:24px;right:7px;bottom:7px;}}
.card s,.card .price s{font-size:12.5px;color:var(--muted);}
.card .price{flex-wrap:wrap;column-gap:8px;row-gap:0;}
.card{min-width:0;}
.card .aut a{color:inherit;}
/* runda 47 — karta D5 na stałe (decyzja Szymona, makiety rund 43–46): okładka wypełnia kafel 2:3 (contain — tło kafla tylko
   przy innych proporcjach) → kontrolka [BOX z ceną | DO KOSZYKA] → tytuł 2 linie → autor 1 → podpis katalogowej / Omnibus */
.card{container-type:inline-size;} /* układ kontrolki zależy od SZEROKOŚCI karty, nie od długości ceny (runda 44) */
.card .cv{aspect-ratio:2/3;padding:var(--cv-pad);overflow:hidden;}
.card .cv img{width:100%;height:100%;max-height:none;object-fit:contain;}
/* „winieta” (Szymon, 2026-10-19): okładka znów w polu z tłem --wash i odstępem, jak przed kartą B (47cc0cd0 wyzerował
   padding, bo kwadrat koszyka siedział NA okładce — w D5 przycisk jest pod okładką, więc powód zniknął); wąska karta: 8 px */
.card{--cv-pad:12px;}
@container (max-width:171.98px){.card .cv{--cv-pad:8px;}}
:root[data-contrast="more"] .card .cv{box-shadow:inset 0 0 0 1px var(--hc-fg);}  /* --wash = --hc-bg: pole okładki obrysem */
.card h3{margin-top:0;}
/* poprawki Szymona (zrzuty 99/100): (1) tytuł BEZ zarezerwowanych 2 linii — autor stoi tuż pod tytułem także przy tytule
   1-liniowym („Lalka”); dół kart w rzędzie może się różnić, cena i przycisk są nad tytułem, więc i tak w linii.
   (2) bez text-wrap:balance z h3 globalnie — balance wyrównuje WSZYSTKIE linie pełnego tytułu (np. 4), a line-clamp ucina
   do 2, więc w części przeglądarek zostawało po słowie na linii („Sycylia- / Salerno-…”); zwykłe łamanie wypełnia linię.
   14 px (było 14,5): więcej treści w 2 liniach (cały „Fortece nad kanałem. Część VII Kassel. Punkt zwrotny” na 179 px).
   hyphens:auto celowo NIE: Chromium nie dzieli polskich słów (sprawdzone), zachowanie zależałoby od przeglądarki. */
.card h3{text-wrap:wrap;font-size:14px;}
.card .omni{min-height:2.6em;margin-top:-4px;} /* 2 linie zarezerwowane: „Cena katalogowa wydawcy: X” i linia Omnibusa zawijają się na wąskich kartach — karty w rzędzie równe */
/* kontrolka jak input-group: box ceny (flex:1, od lewej krawędzi karty) + przycisk, 40 px, styk bez przerwy, wspólne
   zaokrąglenie zewnętrzne; ramka boxu w kolorze przycisku. Cena wyśrodkowana w obu osiach, przy promocji przekreślone minimum
   z 30 dni POD ceną — blok ma stałą wysokość, więc przyciski w rzędzie siatki stoją na jednej linii. Nad stretched-linkiem tytułu. */
.card .pbuy{display:flex;align-items:stretch;position:relative;z-index:1;margin-top:2px;}
.card .pbuy .price{flex:1 1 auto;min-width:0;height:40px;box-sizing:border-box;display:flex;flex-direction:column;flex-wrap:nowrap;align-items:center;justify-content:center;gap:0;
  margin:0;padding:0 4px 0 3px;background:var(--surface);border:1px solid var(--red-fill);border-right:0;border-radius:var(--r) 0 0 var(--r);} /* lewy padding −1 px = lewa ramka (prawej nie ma) → cena dokładnie na środku */
.card .pbuy .price b{font-size:16px;line-height:20px;white-space:nowrap;}
.card .pbuy .price s{font-size:12px;line-height:14px;white-space:nowrap;}
.card .pbuy .btn{flex:none;height:40px;margin:0;padding:0 6px;font-size:11px;white-space:nowrap;border-radius:0 var(--r) var(--r) 0;}
/* „999.99 zł” 69 px + padding 7 + ramka 1 = box 78 + przycisk 94 = 172 px; węższa karta: przycisk 2-wierszowy „DO / KOSZYKA” (75 px) */
@container (max-width:171.98px){
  .card .pbuy .btn{white-space:normal;width:min-content;line-height:13px;text-align:center;padding:0 8px;}
}
/* poniżej 152 px (telefony 320 px: karty 121–138 px) obok siebie nie mieści się nawet cena 2-cyfrowa + przycisk 2-wierszowy →
   ta sama kontrolka w pionie: box na pełną szerokość, pod nim przycisk, wspólne zaokrąglenie zewnętrzne (góra / dół) */
@container (max-width:151.98px){
  .card .pbuy{flex-direction:column;}
  .card .pbuy .price{padding:0 4px;border-right:1px solid var(--red-fill);border-bottom:0;border-radius:var(--r) var(--r) 0 0;}
  .card .pbuy .btn{width:auto;white-space:nowrap;line-height:normal;border-radius:0 0 var(--r) var(--r);}
}
:root[data-contrast="more"] .card .pbuy .price{border-width:2px;border-right:0;}
@container (max-width:151.98px){:root[data-contrast="more"] .card .pbuy .price{border-right-width:2px;border-bottom:0;}}
.cols.no-r{grid-template-columns:220px minmax(0,1fr);}
.cats.sub{padding-left:12px;border-left:1px solid var(--line);margin:0 0 4px 10px;}
.cats.sub li{border:0;}
.cats.sub a{font-size:13px;padding-top:4px;padding-bottom:4px;}
.seo:empty{display:none;}
.home-page .topic-block{margin-top:30px;}
.nlband .nlrow{display:flex;gap:10px;max-width:500px;margin:0 auto;}
.nlband .nlagree{max-width:560px;margin:12px auto 0;text-align:left;font-size:12px;color:var(--muted);display:flex;flex-direction:column;gap:6px;}
.nlband .nlagree label{display:flex;gap:8px;align-items:flex-start;}
.nlband .nlagree input{accent-color:var(--red);margin-top:2px;flex:none;}
.nlband .nlagree a{color:var(--red);text-decoration:underline;}
.shr-validation-msg{color:var(--red);font-size:12px;}
.newsletter-result-block{margin-top:10px;font-size:13.5px;color:var(--ink);}
#recaptcha-container:empty{display:none;}

/* lista kategorii — mosty do modelu Nopa */
.category-description{margin:6px 0 0;font-size:14px;max-width:760px;}
.category-description p{margin:0 0 8px;}
.sortlinks{display:flex;flex-wrap:wrap;gap:4px 14px;align-items:center;font-size:13px;}
.sortlinks span{color:var(--muted);}
.sortlinks a{color:var(--body);padding-bottom:2px;border-bottom:2px solid transparent;}
.sortlinks a:hover{color:var(--red);}
.sortlinks a.on{color:var(--red);border-bottom-color:var(--red);font-weight:700;}
a.opt{text-decoration:none;}
/* SK-24 (WCAG 1.4.11, ≥ 3:1): kwadrat filtra — ramka pustego --muted (było --line2: 1,45:1 ciemny / 1,5:1 jasny), zaznaczony
   w --red (ciemny #eb7072 = 6,3:1 na --surface, jasny = --red-fill 5,6:1, wysoki kontrast = --hc-accent) — wyjątek od reguły
   „dwa czerwone” tylko dla stanu zaznaczenia w ciemnym motywie (--red-fill #7f1618 dawało 1,58:1) */
.opt .box{width:16px;height:16px;border:1.5px solid var(--muted);border-radius:3px;flex:none;background:var(--surface);}
.opt.on .box{background:var(--red);border-color:var(--red);box-shadow:inset 0 0 0 3px var(--surface);}
.opt.on{color:var(--ink);font-weight:500;}
a.chip{text-decoration:none;}
.colM > .pager{display:block;}
.colM > .pager ul{margin-top:34px;}
.pager li.previous-page a,.pager li.next-page a,.pager li.first-page a,.pager li.last-page a{padding:0 14px;}
@media (min-width:861px){.leftcol .colL{position:static;}}
.feat{margin-top:0;margin-bottom:30px;}

/* karta produktu — komponenty Nopa w szacie v3 */
.product-details-page .breadcrumb,.wrap > .breadcrumb{padding-bottom:6px;}
.breadcrumb .delimiter{display:none;}
.breadcrumb li:not(:last-child)::after{content:"›";margin-left:6px;color:var(--line2);}
.breadcrumb strong.current-item{font-weight:400;color:var(--muted);}
.pinfo .by a{color:var(--red);font-weight:500;}
.stock.out{color:var(--muted);}
.stock.out::before{background:var(--muted);box-shadow:0 0 0 3px var(--wash);}
.stock.presale{color:var(--blue);}
.stock.presale::before{background:var(--blue);box-shadow:0 0 0 3px var(--wash);}
/* Status dostępności w buyboksie (_PkiBuyStatus; Szymon 21.10 po A–D i E/F/G: „wstążki obok ceny, a wyjaśnienia tam, gdzie
   w F” → „idealnie”): wstążki = .badge z kart list (#411: kształt, Montserrat wersalikami, --r-xs) w rzędzie ceny (.buy .pr zawija
   się), dosunięte w prawo i wysunięte za prawą krawędź buyboksu o --sp-2 — lustro wstążek kart wysuniętych w lewo. Odstęp od ceny
   co najmniej gap rzędu + --sp-4 (padding w polu wstążek — liczy się do szerokości, więc za ciasno = zawinięcie pod cenę, nigdy
   dotyk). Kolory: zieleń kart (--green-fill) dla Dostępny / ⚡, --blue (kolor przedsprzedaży) i --muted (niedostępny) z tekstem
   --ground. Wyjaśnienia (.bst-h): pierwsza linia bloku „Dostawa do” na wspólnym tle --wash, „Dostawa do” pod przerywaną linią. */
.pr-rib{float:right;margin-right:calc(-1 * (20px + 1px + var(--sp-2)));padding-left:var(--sp-4);display:flex;flex-direction:column;align-items:flex-end;gap:6px;}
.pr-rib .badge{white-space:nowrap;}
.pr-rib .badge.sale{font-size:var(--fs-lg);padding:8px 12px;margin-bottom:2px;}  /* dominuje nad Dostępny / ⚡ pod nią */
.pr-rib .badge.ok,.pr-rib .badge.fast{background:var(--green-fill);color:var(--on-fill);}
.pr-rib .badge.fast{gap:4px;}
.pr-rib .badge.fast .ico{width:11px;height:11px;flex:none;stroke:var(--on-fill);fill:var(--on-fill);stroke-width:1.5;}
.pr-rib .badge.presale{background:var(--blue);color:var(--ground);}
.pr-rib .badge.out{background:var(--muted);color:var(--ground);}
/* telefon ≤ 379 px (5.11, zgłoszenie „pozioma przewijka przy 320 px”): kolumna wstążek pływająca w prawo z wysunięciem poza
   ramkę + cena hero nie mieszczą się w buyboksie (320 px: 246 px wnętrza vs ~300 px — „PREMIERA 10.11.2026” wypychała układ do
   356 px). Wstążki schodzą POD cenę jako zawijany rząd bez wysunięcia; nota VAT pod nimi. Od 380 px układ jak dotąd. */
@media (max-width:379px){
  .buy .pr{display:flex;flex-wrap:wrap;align-items:flex-start;gap:8px 12px;}
  .buy .pr > b{flex:1 1 auto;min-width:0;}
  .pr-rib{float:none;flex:0 0 100%;margin:0;padding-left:0;flex-direction:row;flex-wrap:wrap;align-items:center;justify-content:flex-start;}
  .buy .vat + *{clear:none;}
  /* przyciski buyboksu: „Zamów w przedsprzedaży” nowrap miał min. 290 px i sam rozpychał stronę do 348 px — zawijanie jak w kaflu i .sbuy */
  .buy .ctas .btn{white-space:normal;line-height:1.1;padding:0 12px;text-align:center;}
}
.bst-h{margin-top:12px;background:var(--wash);border-radius:var(--r);padding:12px 14px;font-size:var(--fs-md);}
.bst-h .dlv{margin-top:0;padding:0;background:none;border-radius:0;}
/* wiersze tabelki (wyjaśnienie wstążek / Dostawa do / Zwrot) — każdy kolejny pod tą samą przerywaną linią; ikony w kolumnie 18 px */
.bst-h > :not(:first-child){margin-top:10px;padding-top:10px;border-top:1px dashed var(--line2);}
.bst-h-l{display:flex;gap:8px;align-items:flex-start;font-size:var(--fs-sm);line-height:1.5;color:var(--body);}
.bst-h-l > .ico{width:18px;height:18px;flex:none;margin-top:1px;stroke:var(--graphite);fill:none;stroke-width:var(--ico-sw);}
.bst-h-l .fastmark{margin-top:1px;}
/* „Zwrot do 14 dni ›” (Szymon 21.10): link w kolorze tabelki, podkreślenie dopiero przy najechaniu */
.bst-ret a{color:inherit;text-decoration:none;}
@media (hover:hover){.bst-ret a:hover{text-decoration:underline;text-underline-offset:2px;}}
.bst-ret a:focus-visible{outline:2px solid var(--link);outline-offset:2px;}
.buy .eds-h{margin-top:0;}
.buy .edsel a .ed-p{color:var(--ink);font-weight:700;}
.sectionTitle{font-family:var(--head);font-weight:700;font-size:11px;letter-spacing:.1em;text-transform:uppercase;color:var(--ink);margin:0 0 10px;}
.sectionTitle h3{font-size:inherit;letter-spacing:inherit;}
.pcats-wrap{margin-top:22px;padding-top:14px;border-top:1px solid var(--line);font-size:13px;}
.pcats-wrap .category-list{display:flex;flex-direction:column;gap:6px;}
.pcats-wrap .category-list-item a{color:var(--body);}
.pcats-wrap .category-list-item a:hover{color:var(--red);text-decoration:underline;}
.specs-wrap .bioInfoTitle{display:none;}
.specs-wrap table.bioInfo{width:100%;border-collapse:collapse;font-size:13.5px;}
.specs-wrap .bioInfo td{padding:8px 0;border-bottom:1px solid var(--line);vertical-align:top;color:var(--ink);}
.specs-wrap .bioInfo td.bioInfoLabel{color:var(--muted);width:42%;padding-right:10px;}
.specs-wrap .bioInfo .english{display:none;}
.specs-wrap .bioInfo a{color:var(--red);}
.specs-wrap .bioInfo span[style]{color:inherit !important;font-weight:inherit !important;}
.pdp-more > div:empty{display:none;}
.pdp-more .sectionTitle,.pdp-more .title{font-family:var(--head);font-weight:700;font-size:15px;letter-spacing:.16em;text-transform:uppercase;color:var(--red);border-bottom:1px solid var(--line);padding-bottom:10px;margin:42px 0 16px;}
.pdp-more .sectionTitle *,.pdp-more .title *{font:inherit;color:inherit;letter-spacing:inherit;}
.also-purchased-products-grid{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:30px 22px;}
.colM .also-purchased-products-grid,.search-results .also-purchased-products-grid{grid-template-columns:repeat(4,minmax(0,1fr));}  /* wyniki wyszukiwania = ta sama siatka co lista kategorii (ta sama szerokość kolumny środkowej) */
.also-purchased-products-grid > .item-box{min-width:0;display:flex;}
.also-purchased-products-grid > .item-box > .card{flex:1;}
.also-purchased-products-grid > .clear,.pdp-more .clear{display:none;}
.desc img{height:auto;}

/* ============================================================
   NOP — warstwa zgodności dla stron, których motyw nie przerabia
   (koszyk, checkout, konto, topiki, wyszukiwarka, newsy). Motyw nie
   ładuje DefaultClean/styles.css — tu minimum, żeby były czytelne.
   ============================================================ */
.center-1,.master-wrapper-main > .page,.master-wrapper-main > div:not(.wrap):not(.cols){max-width:var(--maxw);margin:0 auto;padding:24px 26px 0;}
/* width:100% — .master-wrapper-page to kolumna flex, a margin:auto elementu flex wyłącza rozciąganie: bez tego main kurczył się do
   treści (wyniki wyszukiwania: 811 px zamiast 1320, karty 69 px) */
.master-wrapper-main:has(> .side-2){width:100%;max-width:var(--maxw);margin:0 auto;padding:24px 26px 0;display:grid;grid-template-columns:240px minmax(0,1fr);gap:34px;}
.master-wrapper-main:has(> .leftside-3){width:100%;max-width:var(--maxw);margin:0 auto;padding:24px 26px 0;display:grid;grid-template-columns:220px minmax(0,1fr) 236px;gap:34px;}
.master-wrapper-main > .side-2 > .skip-link,.skip-link{position:absolute;left:-9999px;}
.side-2,.center-2,.leftside-3,.center-3,.rightside-3{min-width:0;}
/* kolumny układów 2/3-kolumnowych: reguła „.master-wrapper-main > div:not(.wrap):not(.cols)” (max-width + margin:auto + padding dla
   stron jednokolumnowych) łapała też side-2/center-2 — w siatce margin:auto wyłącza rozciąganie, więc center-2 miał szerokość treści
   (wyniki wyszukiwania 485 px w ścieżce 994 px) i podwójny padding. Ta sama specyficzność (0,3,1) co tamta reguła (:has i :is liczą
   się jak jedna klasa), więc wygrywa kolejnością — stoi później. */
.master-wrapper-main:is(:has(> .side-2),:has(> .leftside-3)) > div:is(.side-2,.center-2,.leftside-3,.center-3,.rightside-3){max-width:none;margin:0;padding:0;}
.master-wrapper-main > .side-2 ~ .colL,.side-2 .colL{position:static;}
/* 21.10 (Szymon: „nie wiem, czemu zostawiłaś wszędzie poza stroną główną kolumnę kategorii”): kolumna kategorii tylko na listach
   produktów (PkiLayout.ShowCategoryColumn — na innych stronach komponenty side-2 nic nie renderują, a _Root daje <main> klasę
   no-catcol; znacznik zamiast :has(> .side-2:not(:has(*))), bo zagnieżdżonego :has CSS nie dopuszcza — reguła by wypadła).
   Jedna kolumna; treść stron tekstowych/formularzy w czytelnej szerokości --read-w (wyśrodkowana), siatki produktów na pełną
   szerokość. div.center-2: wygrywa z regułą wyżej zerującą max-width dzieci siatki side-2 (≥ ta sama szczegółowość, później). */
:root{--read-w:880px;}
.master-wrapper-main.no-catcol:has(> .side-2){display:block;}
.master-wrapper-main.no-catcol > .side-2{display:none;}
.master-wrapper-main.no-catcol > div.center-2{max-width:var(--read-w);margin-inline:auto;}
.master-wrapper-main.no-catcol > div.center-2:has(.product-grid,.item-grid,.grid,.hrail,.card){max-width:none;}
.page-title{border-bottom:1px solid var(--line);padding-bottom:10px;margin-bottom:18px;}
.page-title h1{font-size:26px;}
.page-body{font-size:14.5px;line-height:1.65;}
.page-body a:not(.btn):not(.button-1):not(.button-2){color:var(--link);}
.topic-page .page-body h2,.topic-block h2{font-size:18px;margin:22px 0 8px;}
.page-body p{margin:0 0 12px;}
.page-body ul{list-style:disc;padding-left:22px;margin:0 0 12px;}
.page-body ol{list-style:decimal;padding-left:22px;margin:0 0 12px;}
.page-body img{height:auto;}
.title,.block .title{font-family:var(--head);font-weight:700;font-size:12.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--red);padding-bottom:10px;border-bottom:1px solid var(--line);margin-bottom:12px;}
.block{margin-bottom:26px;}
.block .listbox li{padding:5px 0;border-bottom:1px solid var(--line);font-size:13.5px;}
.button-1,.button-2,input[type=submit].button-1,input[type=button].button-1{display:inline-flex;align-items:center;justify-content:center;font-family:var(--head);font-weight:700;font-size:12px;letter-spacing:.07em;text-transform:uppercase;min-height:42px;padding:0 20px;border:0;border-radius:3px;background:var(--red-fill);color:#fff;cursor:pointer;}
.button-1:hover{background:var(--red-fill-deep);}
.button-2{background:var(--surface);border:1.5px solid var(--ink);color:var(--ink);}
.button-2:hover{background:var(--ink);color:var(--on-ink);}
.page input[type=text],.page input[type=email],.page input[type=password],.page input[type=tel],.page input[type=number],.page select,.page textarea{height:42px;border:1px solid var(--line2);border-radius:3px;background:var(--surface);padding:0 12px;font-size:14px;color:var(--ink);max-width:100%;}
.page textarea{height:auto;min-height:120px;padding:10px 12px;width:100%;}
.page input:focus,.page select:focus,.page textarea:focus{outline:2px solid var(--red);outline-offset:1px;}
.inputs{display:flex;flex-wrap:wrap;gap:6px 12px;align-items:center;margin-bottom:12px;}
.inputs label{min-width:180px;font-size:13.5px;color:var(--ink);}
.fieldset,.section{margin-bottom:24px;}
.fieldset .title,.section .title{font-size:12px;}
.required{color:var(--red);margin-left:4px;}
.field-validation-error,.message-error,.validation-summary-errors{color:var(--red);font-size:13px;}
.buttons{margin-top:16px;display:flex;gap:10px;flex-wrap:wrap;}
.page table{width:100%;border-collapse:collapse;font-size:13.5px;}
.page th,.page td{padding:10px 8px;border-bottom:1px solid var(--line);text-align:left;vertical-align:middle;}
.page th{font-family:var(--head);font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--ink);}
.page td img{max-width:70px;}
.cart-total td{border:0;padding:4px 8px;}
.no-data{padding:20px 0;color:var(--muted);}
.breadcrumb{font-size:12.5px;color:var(--muted);padding:16px 0 4px;}
.breadcrumb ul{display:flex;flex-wrap:wrap;gap:4px;}
.breadcrumb a:hover{color:var(--red);text-decoration:underline;}
.pager ul{display:flex;justify-content:center;gap:6px;flex-wrap:wrap;margin:30px 0 0;}
.pager li a,.pager li span{min-width:40px;height:40px;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--line);border-radius:3px;font-size:13.5px;color:var(--ink);padding:0 10px;}
.pager li.current-page span{background:var(--red-fill);border-color:var(--red-fill);color:#fff;font-weight:700;}
@media (max-width:860px){.pager li a,.pager li span{height:44px;}}  /* telefon: cel dotyku 44 px (5.11); za regułą 40 px wyżej, bo ta sama specyficzność */
.product-grid .item-grid,.search-results .product-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:30px 22px;}
.item-box{min-width:0;}
.news-items .news-item,.news-list-homepage .news-item{border-bottom:1px solid var(--line);padding:14px 0;}
.news-item .news-title{font-family:var(--head);font-weight:700;color:var(--ink);font-size:15px;}
.bar-notification{position:fixed;left:0;right:0;top:0;z-index:200;padding:14px 50px 14px 20px;color:#fff;font-size:14px;display:none;}
.bar-notification.success{background:var(--green-fill);}
.bar-notification.error,.bar-notification.warning{background:var(--red-fill);}
.bar-notification .close{position:absolute;right:16px;top:12px;width:24px;height:24px;cursor:pointer;}
.bar-notification .close::before{content:"×";font-size:22px;line-height:1;}
.bar-notification a{color:#fff;text-decoration:underline;}
.ajax-loading-block-window{position:fixed;inset:0;z-index:150;background:var(--overlay);}
.ajax-loading-block-window .loading-image{position:absolute;top:50%;left:50%;width:42px;height:42px;margin:-21px;border-radius:50%;border:4px solid rgba(255,255,255,.35);border-top-color:#fff;animation:pki-spin .8s linear infinite;}
@keyframes pki-spin{to{transform:rotate(360deg);}}
.admin-header-links{background:var(--ink);color:var(--on-ink);font-size:12px;padding:6px 16px;}
.admin-header-links a{color:inherit;text-decoration:underline;}
.order-progress ul{display:flex;flex-wrap:wrap;gap:6px 18px;font-size:12.5px;margin:0 0 16px;}
.order-progress li{color:var(--muted);}
.order-progress li.active-step a,.order-progress li.active-step{color:var(--red);font-weight:700;}
/* jQuery UI autocomplete wyszukiwarki */
.ui-autocomplete.pki-ac,.ui-autocomplete{background:var(--surface);border:1px solid var(--line2);border-radius:0 0 4px 4px;box-shadow:0 10px 24px var(--shadow);z-index:150 !important;max-height:70vh;overflow-y:auto;padding:4px 0;font-family:var(--sans);}
.ui-autocomplete .ui-menu-item a,.ui-autocomplete .ui-menu-item-wrapper{display:flex;gap:10px;align-items:center;padding:7px 12px;font-size:13.5px;color:var(--ink);border:0;margin:0;}
.ui-autocomplete img{width:32px;height:auto;}
.ui-autocomplete .ui-state-active,.ui-autocomplete .ui-menu-item-wrapper.ui-state-active{background:var(--wash2);color:var(--red);border:0;margin:0;}
.ui-helper-hidden-accessible{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);}
@media (max-width:860px){
  .master-wrapper-main:has(> .side-2),.master-wrapper-main:has(> .leftside-3){grid-template-columns:minmax(0,1fr);padding:14px 16px 0;}
  .center-1,.master-wrapper-main > .page,.master-wrapper-main > div:not(.wrap):not(.cols){padding:14px 16px 0;}
  .master-wrapper-main:is(:has(> .side-2),:has(> .leftside-3)) > div:is(.side-2,.center-2,.leftside-3,.center-3,.rightside-3){padding:0;}  /* jw. — inaczej podwójny odstęp boczny (main ma już 16 px) */
  .product-grid .item-grid,.search-results .product-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:24px 14px;}
  .inputs label{min-width:0;width:100%;}
  /* waluta: własny wiersz nagłówka (tools spłaszczone, żeby selektor mógł być osobną komórką siatki) */
  .hdr .wrap{grid-template-columns:auto 1fr auto auto;}
  .hdr-tools{display:contents;}
  .hdr-tools .theme{grid-column:3;grid-row:1;}
  .hdr-tools .header-links{grid-column:4;grid-row:1;}
  .hdr-sel{grid-column:1 / -1;grid-row:3;justify-content:flex-end;margin:0;}
  .nlband .nlrow{flex-direction:column;}
  .cols.no-r{grid-template-columns:minmax(0,1fr);}
}

/* ============================================================
   [4] MOSTY MAKIETY C — markup Nopa / motywu wokół komponentów C
   ============================================================ */
/* strony jednokolumnowe: _PkiPage = .master-wrapper-main > .wrap (makieta: body.one main.wrap) */
.master-wrapper-page.one .master-wrapper-main > .wrap{padding-top:var(--sp-5);}
/* hero bez karty obok banera (od kolejki wyglądu pkt 5 półka Poradniki; brak kategorii / produktów): baner na całą szerokość */
.hero.no-side{grid-template-columns:minmax(0,1fr) minmax(0,1fr);grid-template-areas:"car car" "s1 s2";}
/* waluta (przegląd P18, runda 2): .htool jak Motyw / Konto — symbol bieżącej waluty w miejscu ikony (wyśrodkowany nad
   nazwą jak ikona nad „Konto”), mały chevron po LEWEJ w linii symbolu (absolutnie — nie przesuwa symbolu z osi);
   natywny <select> leży przezroczyście na całej kontrolce (klik, klawiatura i picker telefonu bez własnego JS) */
.hdr-sel:not(:has(*)){display:none;}
/* desktop: jeden wspólny odstęp w całym rzędzie Waluta · Motyw · Konto · Przechowalnia · Koszyk (uwaga 3 Szymona) —
   wrappery (.hdr-sel, .header-links) znikają z układu, wszystkie .htool są elementami jednego flexa .hdr-tools z jednym gap */
@media (min-width:861px){
  .hdr-tools .hdr-sel,.hdr-tools .header-links{display:contents;}
}
/* runda 6 (kompromis Szymona): równe KOLUMNY = szerokość najdłuższej etykiety + 4 px oddechu z każdej strony, treść
   wyśrodkowana → ikony w idealnie równych odstępach. Rząd węższy niż dawny wariant a (295 vs 304 px), więc wyszukiwarka
   nie traci miejsca (dawny wariant b = padding 6 px po 84 px kolumny = 420 px i ściśnięta wyszukiwarka przy 1024).
   Licznik .cnt przypięty do ikony (od środka kolumny), nie do prawej krawędzi wąskiej kolumny. */
@media (min-width:861px){
  /* runda 13: IDENTYCZNY box każdego narzędzia — stała szerokość = najdłuższa etykieta („Koszyk” ~35 px) + oddech */
  .hdr-tools{--tool-w:52px;display:grid;grid-auto-flow:column;grid-auto-columns:var(--tool-w);gap:0;}
  .hdr-tools .htool{width:var(--tool-w);padding-inline:0;box-sizing:border-box;}
  .hdr-tools .htool .cnt{right:auto;left:calc(50% + 4px);}
}
.htool.cur{cursor:pointer;}
/* € jak ikona-obrys: Roboto (plik zmiennej grubości) 350 = trzon ~1,75 px przy 24 px ≈ stroke ikon 1,8 px (400 dawało 2,25 px) */
.htool.cur .cur-sym{position:relative;height:var(--ico-24);display:inline-flex;align-items:center;font-size:24px;font-weight:350;line-height:1;color:var(--ink);white-space:nowrap;}
.htool.cur .cur-lbl{white-space:nowrap;}
.htool.cur:hover .cur-sym,.htool.cur:hover .cur-lbl{color:var(--red);}
@media (max-width:860px){
  /* mobile: waluta zostaje we własnym wierszu pod wyszukiwarką (jak przed zmianą), w poziomie: symbol · nazwa · chevron */
  .htool.cur{flex-direction:row;gap:6px;font-size:var(--fs-sm);padding:4px 6px;}
  .htool.cur .cur-sym{height:auto;font-size:var(--fs-md);font-weight:700;}
}
/* znacznik Szybkiej wysyłki w markupie motywu (sidebar listy, buybox karty produktu, drzewo) */
.cats a:is(.fastc,.hot) :is(.fastmark,.promomark),.mg-h :is(.fastmark,.promomark){margin-right:2px;}  /* oba znaczniki tym samym odstępem (5.11) */
/* znacznik Promocji (_PkiPromoMark; Szymon 20.10: „używaj wszędzie tej samej ikony promocji”) — metka #i-tag z górnego menu w
   kolorystyce znacznika Szybkiej wysyłki: kwadrat --red-fill (kontrast: żółty) + biała (kontrast: czarna) ikona-obrys; ten sam
   rozmiar i odstęp co .fastmark, więc obie pozycje list stoją równo. Zastępuje dawny kwadrat z „%” w bocznej liście. */
.promomark{display:inline-flex;align-items:center;justify-content:center;flex:none;width:18px;height:18px;border-radius:var(--r-xs);background:var(--red-fill);vertical-align:-4px;}
.promomark .ico{width:12px;height:12px;stroke:var(--on-fill);fill:none;stroke-width:2;}
/* odstęp znacznika promocji: wspólna reguła wyżej (.cats a:is(.fastc,.hot) :is(.fastmark,.promomark)) */
/* Bestsellery: pełna strona ma H1 w tym samym stylu co etykieta sekcji; podmiana zakładki ajaksem */
.sec-head h1.bs-h1{font-family:var(--head);font-weight:700;font-size:var(--fs-label);line-height:1.25;letter-spacing:var(--ls-label);text-transform:uppercase;color:var(--red);}
.sec-head h1.bs-h1 small{display:block;font-family:var(--sans);font-weight:400;font-size:var(--fs-sm);letter-spacing:0;text-transform:none;color:var(--muted);margin-top:var(--sp-1);}
.bestsellers.loading .grid{opacity:.45;transition:opacity .15s;}
.bs-tabs a[aria-current]{color:var(--red);}
@media (max-width:860px){
  /* jedna szuflada kategorii = drzewo „Kategorie ▾” (#kategorie); kolumna kategorii bazowych układów znika */
  .colL{display:none;}
  /* .master-wrapper-page to kolumna flex — z-index elementu flex tworzy kontekst nawet przy position:static,
     więc szuflada (z-index 120) lądowałaby pod przyciemnieniem .oc-ov (119) */
  .mega-host{z-index:auto;}
  /* siatka listy: reguła mostu ".colM .also-purchased-products-grid" (4 kolumny, bez media query) stoi PO regule mobile
     z [1] i wygrywała — na 390 px lista miała 4 kolumny (błąd także w v3 sprzed makiety C) */
  .also-purchased-products-grid,.colM .also-purchased-products-grid,.search-results .also-purchased-products-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--sp-5) var(--sp-3);}
  .master-wrapper-page.one .master-wrapper-main > .wrap{padding-top:14px;}
}

/* ============================================================
   [5] TRYB CIEMNY — te same tokeny, inne wartości. Paleta: grafit CIEPŁY
   (od --ink #201d1c v3), nie niebieski #33434f. 4 poziomy jasności
   powierzchni zamiast cieni. Kontrasty zmierzone (WCAG 2.x) — README.
   Blok jest dwa razy: dla jawnego wyboru [data-theme=dark] i dla systemu
   (prefers-color-scheme), gdy user nie wybrał jasnego. Zmieniaj OBA.
   ============================================================ */
:root[data-theme="dark"]{
  /* runda 18 (Szymon: „dwa czerwone”): w ciemnym (A) RÓŻ --red #eb7072 dla tekstów i ikon-akcentów — jak przed rundą 16;
     (B) CZERWIEŃ #7f1618 (= --topbar-bg) dla wypełnień: --red-fill (KATEGORIE, SZUKAJ, przyciski, plakietki), baner
     (gradient na bazie #7f1618), hover przycisków --red-fill-deep #93201f (biały tekst 8,5:1; na #7f1618 10,3:1).
     Narożniki logo/PKI/hover/focus (--pki-corner-c) = też #7f1618 (runda 19, ŚWIADOMA decyzja właściciela, Szymon
     16.10.2026): znany kompromis — #7f1618 na tle --ground/--surface/--wash ma 1,71/1,58/1,43:1, poniżej WCAG 2.2 3:1
     (1.4.11 kontrast elementów UI; narożniki są też wskaźnikiem fokusu klawiatury, 2.4.7/2.4.13). */
  --ground:#1a1817; --surface:#221f1e; --wash:#2a2726; --wash2:#332f2d;
  --ink:#ece7e4; --body:#c9c2be; --muted:#a39b97; --line:#3b3735; --line2:#4d4846;
  --red:#eb7072; --red-deep:#f29496; --red-fill:#7f1618; --red-fill-deep:#93201f;
  --pki-corner-c:var(--red-fill); --banner-bg:linear-gradient(120deg,#4a0d0e,#7f1618 65%,#93201f);
  --green:#5bc086; --green-fill:#26824e; --green-wash:#1f3328;
  --graphite:#55626c; --blue:#7db4ee; --gold:#d6aa5a; --brown:#8a6040;
  --on-ink:#1a1817; --num:#5a5452; --cv-ring:inset 0 0 0 1px rgba(255,255,255,.03);
  --topbar-bg:#7f1618; --chip-bg:#3d3836; --chip-ink:#ece7e4; --chip-x:rgba(255,255,255,.14);
  --shadow:rgba(0,0,0,.55); --overlay:rgba(0,0,0,.62); --thumb-ring:rgba(255,255,255,.12);
  --cover-blend:normal; --cover-shadow:none;
  --cover-filter:brightness(.92) saturate(.96) drop-shadow(0 0 .6px rgba(255,255,255,.45)) drop-shadow(0 6px 9px rgba(0,0,0,.55));
  --logo-filter:brightness(.92); --logo-radius:3px;
  color-scheme:dark;
}
@media (prefers-color-scheme:dark){
  :root:not([data-theme="light"]){
    --ground:#1a1817; --surface:#221f1e; --wash:#2a2726; --wash2:#332f2d;
    --ink:#ece7e4; --body:#c9c2be; --muted:#a39b97; --line:#3b3735; --line2:#4d4846;
    --red:#eb7072; --red-deep:#f29496; --red-fill:#7f1618; --red-fill-deep:#93201f;
  --pki-corner-c:var(--red-fill); --banner-bg:linear-gradient(120deg,#4a0d0e,#7f1618 65%,#93201f);
    --green:#5bc086; --green-fill:#26824e; --green-wash:#1f3328;
    --graphite:#55626c; --blue:#7db4ee; --gold:#d6aa5a; --brown:#8a6040;
    --on-ink:#1a1817; --num:#5a5452; --cv-ring:inset 0 0 0 1px rgba(255,255,255,.03);
    --topbar-bg:#7f1618; --chip-bg:#3d3836; --chip-ink:#ece7e4; --chip-x:rgba(255,255,255,.14);
    --shadow:rgba(0,0,0,.55); --overlay:rgba(0,0,0,.62); --thumb-ring:rgba(255,255,255,.12);
    --cover-blend:normal; --cover-shadow:none;
    --cover-filter:brightness(.92) saturate(.96) drop-shadow(0 0 .6px rgba(255,255,255,.45)) drop-shadow(0 6px 9px rgba(0,0,0,.55));
    --logo-filter:brightness(.92); --logo-radius:3px;
    color-scheme:dark;
  }
}
/* przełącznik motywu w nagłówku (ikony, menu) i wysoki kontrast jako drugi wymiar: pkieu-theme.css */
@media (prefers-reduced-motion:reduce){*{transition:none !important;animation:none !important;}}

/* ============================================================
   NAROŻNIKI Z LOGO (runda 5, pomysł Szymona): grube ⌜ (lewy-górny) i ⌟ (prawy-dolny) jak w szachownicy logo (kolor = token --red, runda 9)
   pki.eu (pki-logo-01.png: #ff0000, ramię poziome ≈31% szerokości, pionowe ≈49% wysokości) wokół TEKSTU klikalnego
   elementu na :hover (tylko urządzenia z prawdziwym hoverem — na dotyku nie „przyklejają się” po tapnięciu) i na
   :focus-visible. Pseudo-elementy absolutne: zero zmiany rozmiaru/układu. Utility: klasa .pki-corners na elemencie
   z tekstem; gdy tekst ma padding, --pc-x/--pc-y = padding (narożniki wokół tekstu, nie wokół pola klikania).
   Zasięg na start: menu główne + etykiety rzędu narzędzi — NIE globalnie (decyzja o zasięgu: Szymon).
   ============================================================ */
/* --pc-x/--pc-y: padding elementu (narożniki wokół treści, nie pola klikania); --pc-gx/--pc-gy: odstęp WEWNĘTRZNEJ krawędzi
   kreski od pudełka treści — dobrane POMIAREM tak, żeby odstęp kreska→atrament glifów był równy w poziomie i w pionie
   (pudełko linii ma nad wersalikami interlinię, ikony mają wewnętrzny margines w viewBox). --pc-w: grubość kreski — rośnie NA ZEWNĄTRZ. */
/* JEDNA para tokenów dla narożników logo i zaznaczeń (runda 12, Szymon: „dokładnie ta sama grubość i kolor co w logo”):
   kolor = --red-fill (tło KATEGORIE: jasny #b7171a, ciemny #d02528 — nie róż); grubość 4 px ≈ zmierzone 3,54 px narożnika
   dawnego logo przy 64 px, w całych pikselach (Chrome zaokrągla border-width w dół). */
:root{--pki-corner-w:4px;--pki-corner-c:var(--red-fill);}
/* Runda 15: kreski = border w CAŁYCH px (Chrome przyciąga ramki do pikseli urządzenia; gradient z ułamkową grubością
   i pozycją rozmywał pion inaczej niż poziom — „pionowa nóżka cieńsza”), pozycje i rozmiary zaokrąglone round() do 1 px.
   --pc-ah / --pc-av = WIDOCZNA długość ramienia (z grubością); domyślnie jak w logo: 31% szerokości i 49% wysokości
   pudełka treści z odstępem (logo zostaje bez zmian). */
/* --pc-fit-l / --pc-fit-r (869f7deet, Szymon 23.10, zrzut 213): tekst łamany na kilka wierszy — pudełko ma wtedy szerokość
   dostępnego miejsca, nie najdłuższego wiersza (CSS nie umie „shrink-wrap”), więc ⌟ wisiał daleko za tekstem. pkieu-corners.js
   mierzy wiersze i ustawia odległość obrysu WSZYSTKICH wierszy od krawędzi treści; narożniki i długość ramienia liczą się od niego.
   Narożniki stawiamy tylko na elementach z pudełkiem (block / inline-block / flex) — na elemencie inline Chrome liczy pozycję
   pseudo-elementów od fragmentu wiersza (⌟ przekreślał następny wiersz). */
.pki-corners{position:relative;--pc-x:0px;--pc-y:0px;--pc-gx:4px;--pc-gy:4px;--pc-w:var(--pki-corner-w);
  --pc-ah:calc((100% - var(--pc-fit-l, 0px) - var(--pc-fit-r, 0px) - 2 * var(--pc-x) + 2 * var(--pc-gx)) * .31 + var(--pc-w));
  --pc-av:calc((100% - 2 * var(--pc-y) + 2 * var(--pc-gy)) * .49 + var(--pc-w));}
.pki-corners::before,.pki-corners::after{content:"";position:absolute;pointer-events:none;opacity:0;box-sizing:border-box;
  width:round(var(--pc-ah),1px);height:round(var(--pc-av),1px);border:0 solid var(--pki-corner-c);
  transition:opacity .15s ease-out,transform .15s ease-out;}
/* --pc-itl-x/-y, --pc-ibr-x/-y (runda 22): „optyczne” wcięcie narożnika do tuszu w JEGO obszarze (np. ⌟ przy „pki” do linii
   bazowej, bo ogonek „p” jest w lewym-dolnym rogu) — liczone w generatorze z konturów glifów */
.pki-corners::before{left:round(calc(var(--pc-x) - var(--pc-gx) - var(--pc-w) + var(--pc-itl-x, 0px) + var(--pc-fit-l, 0px)),1px);top:round(calc(var(--pc-y) - var(--pc-gy) - var(--pc-w) + var(--pc-itl-y, 0px)),1px);
  border-top-width:var(--pc-w);border-left-width:var(--pc-w);transform:translate(-3px,-3px);}
.pki-corners::after{right:round(calc(var(--pc-xr, var(--pc-x)) - var(--pc-gx) - var(--pc-w) + var(--pc-ibr-x, 0px) + var(--pc-fit-r, 0px)),1px);bottom:round(calc(var(--pc-y) - var(--pc-gy) - var(--pc-w) + var(--pc-ibr-y, 0px)),1px);
  border-bottom-width:var(--pc-w);border-right-width:var(--pc-w);transform:translate(3px,3px);}
@media (hover:hover){
  .pki-corners:hover::before,.pki-corners:hover::after{opacity:1;transform:none;}
}
.pki-corners:focus-visible::before,.pki-corners:focus-visible::after,
.pki-corners:has(:focus-visible)::before,.pki-corners:has(:focus-visible)::after{opacity:1;transform:none;}
@media (prefers-reduced-motion:reduce){.pki-corners::before,.pki-corners::after{transition:none;}}
/* runda 12 (Szymon: „jeśli jest |_ to niech nie zmienia się kolor tekstu”): narożniki (--red: czerwień w jasnym, róż
   w ciemnym) SĄ sygnałem hoveru — tekst i ikony zostają w kolorze spoczynku; PROMOCJE / SZYBKA WYSYŁKA mają własny kolor
   spoczynku i go zachowują */
.nav a.pki-corners:hover{color:var(--ink);}
.nav a.fast.pki-corners:hover{color:var(--green);}
.nav a.promo.pki-corners:hover{color:var(--red);}
.htool.pki-corners:hover,.htool.pki-corners:hover .ico{color:var(--body);stroke:var(--ink);}
.htool.cur.pki-corners:hover .cur-sym{color:var(--ink);}
.htool.cur.pki-corners:hover .cur-lbl{color:var(--body);}
/* menu główne: tekst w paddingu linku 14px 13px (mobile 12px 11px); letter-spacing dokleja odstęp ZA ostatnią literą */
/* odstęp kreska→atrament 6 px z każdej strony (pomiar runda 7): boki = 4 px + ~0,75 px łożyska glifu → gx 5,25;
   góra/dół pudełka linii ma ~5 px interlinii nad/pod wersalikami → gy 0,5. Kreska 2 px = trzon Montserrat 700 @12,5 px (~2,0 px) */
/* Runda 14 (wariant C): proporcje narożników LOGO przeniesione względem wysokości wersalika, nie piksele. Logo (render 64 px,
   Montserrat 700 @15,09 px, wersalik 10,56 px): grubość 4,00 px = 0,379·cap, odstęp 5,44 px = 0,515·cap. Ramiona logo
   (3,5 / 3,0 cap) dotyczą bloku 3 linii — na 1 linii pionowe ramię skrzyżowałoby się z drugim narożnikiem, więc ramiona
   są RÓWNE w obu kierunkach i liczone jak pionowe ramię logo: 0,49·(cap + 2g) + t = 1,374·cap — niezależnie od długości
   napisu (BESTSELLERY i KONTO mają identyczne narożniki). Menu: Montserrat 700 @12,5 px → cap 8,75 px; grubość 0,379·cap = 3,32 → 3 px (całe px, runda 15).
   Odstęp do ATRAMENTU: poziomo pudełko tekstu ma ~0,75 px łożyska glifu, pionowo ~5,6 px interlinii nad wersalikami
   (pomiar runda 7) — stąd korekty gx/gy. */
.nav a.pki-corners{--pc-x:13px;--pc-y:14px;--pc-xr:calc(13px + var(--ls-ui) * 1);--cap:8.75px;
  --pc-w:3px;--pc-gx:calc(var(--cap) * .515 - .75px);--pc-gy:calc(var(--cap) * .515 - 5.6px);
  --pc-ah:calc(var(--cap) * 1.374);--pc-av:var(--pc-ah);}
@media (max-width:860px){.nav a.pki-corners{--pc-x:11px;--pc-y:12px;--pc-xr:calc(11px + var(--ls-ui) * 1);}}
/* narzędzia (wariant b): narożniki wokół ikony+etykiety; .htool wyśrodkowany w kolumnie siatki, więc jego pudełko = treść */
/* odstęp 6 px: ikony mają ~3 px marginesu w viewBox nad obrysem → gy 3; kreska 2 px ≈ stroke ikon 1,8 px */
/* runda 13: narożniki obejmują cały (identyczny) box narzędzia — kreska tuż za krawędzią boxu, ten sam kształt dla każdego */
@media (min-width:861px){.hdr-tools .htool.pki-corners{
  /* C: grubość, odstęp i ramiona z proporcji logo względem wersalika etykiety (Roboto 11 px → cap 7,82 px); od wysokości
     ikony (24 px) wyszłaby kreska 9 px przy obrysie ikon 1,8 px — przytłacza. Pole treści identyczne dla każdego boxu:
     szerokość najdłuższej etykiety (35 px → wcięcie (52−35)/2 = 8,5 px), pion = padding boxu 6 px; odstęp do atramentu
     0,515·cap (ikony mają ~3 px marginesu w viewBoxie nad obrysem → gy pomniejszone o 3 px). */
  --cap:7.82px;--pc-x:8.5px;--pc-y:6px;--pc-gx:calc(var(--cap) * .515);--pc-gy:calc(var(--cap) * .515 - 3px);
  --pc-w:3px;--pc-ah:calc(var(--cap) * 1.374);--pc-av:var(--pc-ah);}}
@media (max-width:860px){.hdr-tools .htool.pki-corners{--pc-x:6px;--pc-y:6px;--pc-gx:5.25px;--pc-gy:3px;}}
/* pasek menu 861–1180 px: przy pełnym paddingu/rozstrzeleniu potrzebuje ~1140 px, więc węższe okna (np. 1024) dostawały
   poziomy scroll CAŁEJ strony (PROMOCJE kończyły się na 1114 px). Najmniej inwazyjnie: ciaśniejszy padding i
   letter-spacing (mieści się od ~1020 px), a poniżej pasek przewija się sam w sobie — jak na mobile (panel „Kategorie”
   leży poza .nav, więc overflow go nie przycina). min-width zamiast width: gdy się mieści, li.push dalej dosuwa w prawo. */
@media (min-width:861px) and (max-width:1180px){
  .nav{overflow-x:auto;scrollbar-width:none;}
  .nav::-webkit-scrollbar{display:none;}
  .nav ul{min-width:max-content;gap:0;}
  .nav a{padding-left:8px;padding-right:8px;letter-spacing:.03em;}
  .nav li.kat{margin-right:4px;}
  .nav a.pki-corners{--pc-x:8px;--pc-xr:calc(8px + .03em);}
}
/* logo (runda 12): SVG = sam tekst (currentColor ← --logo-ink: jasny #201d1c, ciemny #fff); narożniki ⌜ ⌟ = .pki-corners
   na .logo-mark, zawsze widoczne, z tymi samymi --pki-corner-w / --pki-corner-c co zaznaczenia hover. Wysokość całości
   (tekst + 2×odstęp + 2×kreska) = --logo-h (64 / mobile 44 / sticky 40 jak dawne <img>); odstęp = 0,1206 × wysokość
   tekstu (proporcja z generatora: 0,67 wysokości x — jak w logo v8/v10). */
:root{--logo-ink:#201d1c;}
:root[data-theme="dark"]{--logo-ink:#ffffff;}
@media (prefers-color-scheme:dark){:root:not([data-theme="light"]){--logo-ink:#ffffff;}}
.logo-mark{--logo-h:64px;--logo-r:.1206;--logo-th:calc((var(--logo-h) - 2 * var(--pki-corner-w)) / (1 + 2 * var(--logo-r)));
  --pc-gx:calc(var(--logo-th) * var(--logo-r));--pc-gy:var(--pc-gx);--pc-x:calc(var(--pc-gx) + var(--pki-corner-w));--pc-y:var(--pc-x);
  display:block;flex:none;padding:var(--pc-y) var(--pc-x);line-height:0;}
.logo-mark::before,.logo-mark::after{opacity:1;transform:none;transition:none;}
.logo-mark .pki-logo{display:block;height:var(--logo-th);width:auto;color:var(--logo-ink);}
/* przypięty pasek (runda 20): „pki” małymi literami — proporcje jak w głównym logo liczone od WYSOKOŚCI x (główne logo też
   ma małe litery; generator: odstęp = 0,67·x, kreska logo 4 px = 0,493·x). Tekst „pki” = 1,823·x (wydłużenie k + p).
   40 = tekst + 2g + 2t → przy t = 5 px (całe px; t/x 0,527 najbliżej 0,493): x 9,48 px, g 6,35 px, tekst 17,29 px;
   --logo-r = g / tekst = 0,67 / 1,823 = 0,3675. Ramiona jak w logo (31% szer. / 49% wys. pudełka z odstępem). */
.sticky .logo-mark{--logo-h:40px;}
.logo-mark.logo-pki{--logo-h:40px;--logo-r:.3675;--pki-corner-w:5px;
  /* runda 22: wcięcia optyczne z generatora (gen.py: optical_insets), ułamki wysokości tekstu: ⌜ w dół do wysokości x
     „p” (nad nim tylko wydłużenie „k”, poza obszarem ramienia), ⌟ w górę do linii bazowej (ogonek „p” jest w lewym-dolnym
     rogu) i w lewo do trzonu „i”. Główne logo: wcięcia ≈ 0 (≤ 0,3 px) — bez zmian. */
  --pc-itl-y:calc(var(--logo-th) * .2457);--pc-ibr-x:calc(var(--logo-th) * .0204);--pc-ibr-y:calc(var(--logo-th) * .1978);}
@media (max-width:860px){.hdr .logo-mark{--logo-h:44px;}}
/* runda 21 (Szymon): MOBILE — waluta w GÓRNYM rzędzie obok Motyw / Konto / Lubisz / Koszyk, jako ten sam element co na
   desktopie (€ nad kodem); osobny rząd pod wyszukiwarką znika. Wariant B (domyślny): podpis zostaje tylko przy walucie
   (kod — bez niego „€” nie mówi, która waluta), pozostałe ikony bez podpisów. Cel dotyku każdej ikony ≥ 40×40 px. */
@media (max-width:860px){
  .hdr .wrap{grid-template-columns:auto minmax(0,1fr) auto;}
  .hdr-tools{display:flex;grid-column:3;grid-row:1;gap:0;align-items:center;}
  .hdr-tools .hdr-sel,.hdr-tools .header-links{display:contents;}
  .hdr-tools .theme,.hdr-tools .header-links,.hdr-sel{grid-column:auto;grid-row:auto;margin:0;}
  .hdr .hdr-tools .htool,.sticky .hdr-tools .htool{min-width:40px;min-height:40px;padding:4px 2px;justify-content:center;font-size:var(--fs-2xs);}
  .hdr .hdr-tools .htool.cur,.sticky .hdr-tools .htool.cur{flex-direction:column;gap:2px;}
  .hdr .hdr-tools .htool.cur .cur-sym,.sticky .hdr-tools .htool.cur .cur-sym{height:var(--ico-24);font-size:24px;font-weight:350;}
  .hdr .hdr-tools .htool:not(.cur) > span:not(.cnt):not(.sr),.sticky .hdr-tools .htool:not(.cur) > span:not(.cnt):not(.sr){display:none;}
  /* ikony (i €) w jednej linii — wyrównanie do góry, kod waluty zwisa pod €; menu też ≥ 40 px szerokości. Przy 360 px rząd
     jest pełny co do piksela: 40 (menu) + 6 + 76 (logo 44 px) + 6 + 5×40 = 328 = 360 − 2×16 — stąd odstęp kolumn 6 px */
  .hdr .wrap{column-gap:6px;}
  .burger{min-width:40px;}
  .hdr-tools{align-items:flex-start;align-self:center;}
  .hdr .hdr-tools .htool,.sticky .hdr-tools .htool{justify-content:flex-start;padding-top:8px;}
}
/* runda 23 (Szymon): MOBILE — w nagłówku „pki” (ten sam SVG i proporcje co przypięty pasek) zamiast pełnego logo,
   hamburger bez podpisu (aria-label „Menu”, cel 40×40); obsługa 320 px. Desktop bez zmian (tam „pki” ukryte). */
.hdr .logo-mark.logo-pki{display:none;}
@media (max-width:860px){
  .hdr .logo-mark.logo-full{display:none;}
  .hdr .logo-mark.logo-pki{display:block;}
  .burger{min-height:40px;justify-content:center;padding:6px 8px;}
}
/* < 360 px: rząd 1 nie mieści się przy paddingu 16 px (40 + 49,5 + 5×40 + 2×6 = 301,5 > 288) — tylko w nagłówku węższy
   margines boczny i odstęp kolumn; podpis „EUR” zostaje */
@media (max-width:359px){
  .hdr .wrap{padding-left:10px;padding-right:10px;column-gap:4px;}
}
/* runda 24: symbol waluty jako IKONA-obrys (sprite i-cur-*) — ten sam rozmiar i kreska co Motyw / Konto / Lubisz / Koszyk;
   mobile: bez podpisu „EUR” (wszystkie ikony bez podpisów; nazwa dostępna „Waluta: Euro (EUR)” w etykiecie selecta) */
.htool.cur .cur-ico{width:var(--ico-24);height:var(--ico-24);stroke:var(--ink);fill:none;stroke-width:var(--ico-sw);}
@media (max-width:860px){.hdr .hdr-tools .htool.cur .cur-lbl,.sticky .hdr-tools .htool.cur .cur-lbl{display:none;}}
/* runda 25c: prawa część menu — Szybka wysyłka / Promocje z ikonami-obrysami (błyskawica, metka jak w karcie Promocje),
   16 px w kolorze tekstu pozycji; narożniki hover w KOLORZE pozycji (zieleń / czerwień-róż motywu) */
.nav a.fast,.nav a.promo{display:inline-flex;align-items:center;gap:var(--sp-2);}
.nav a.fast .ico,.nav a.promo .ico{width:var(--ico-16);height:var(--ico-16);stroke:currentColor;fill:none;stroke-width:var(--ico-sw);flex:none;}
/* ikona 16 px sięga wyżej/niżej niż wersaliki (cap 8,75 px), więc odstęp pionowy od tuszu był 1–2,5 px zamiast g = 4,5 px —
   (runda 25c — zastąpione w rundzie 34: narożniki wokół samego tekstu) */
.nav a.fast.pki-corners{--pki-corner-c:var(--green);}
.nav a.promo.pki-corners{--pki-corner-c:var(--red);}
/* runda 34 (Szymon): na hover/focus ikona znika, tekst przesuwa się na środek pozycji (o połowę ikony + odstępu = 12 px), a
   wokół TEKSTU pojawiają się narożniki jak przy reszcie menu (pion jak PORADNIKI; ⌜ wcięty o ikonę+odstęp − przesunięcie,
   ⌟ o przesunięcie). Tylko transform/opacity — szerokość pozycji i układ bez zmian. */
.nav a:is(.fast,.promo).pki-corners{--nt-shift:calc((var(--ico-16) + var(--sp-2)) / 2);
  --pc-gy:calc(var(--cap) * .515 - 5.6px);--pc-itl-x:var(--nt-shift);--pc-ibr-x:var(--nt-shift);}
.nav a:is(.fast,.promo) .ico,.nav a:is(.fast,.promo) .nt{transition:opacity .15s ease-out,transform .15s ease-out;}
.nav a:is(.fast,.promo) .nt{display:inline-block;}
.nav a:is(.fast,.promo):is(:hover,:focus-visible) .ico{opacity:0;transform:scale(.6);}
.nav a:is(.fast,.promo):is(:hover,:focus-visible) .nt{transform:translateX(calc(var(--nt-shift) * -1));}
@media (prefers-reduced-motion:reduce){.nav a:is(.fast,.promo) .ico,.nav a:is(.fast,.promo) .nt{transition:none;}}
/* runda 31 (Szymon: „żeby wszędzie był taki sam”): JEDEN odstęp bloków w górnej części strony głównej = gutter między Ofertą
   tygodnia a banerem (zmierzony: 16 px desktop, 12 px mobile) — dla Oferta↔baner, baner↔karty, karty↔kółka, kółka↔nagłówek
   Bestsellerów i linii nagłówka Bestsellerów ↔ karty produktów. Dalsze sekcje zostają w rytmie 48 / 32 px (patrz raport). */
:root{--gap-block:var(--sp-4);}
@media (max-width:860px){:root{--gap-block:var(--sp-3);}}
/* --gap-sec: rytm SEKCJI podstron (48 / 32 px) — między sekcjami karty produktu (OPIS, DANE, tagi pod buyboksem, sekcje
   powiązanych); Szymon 21.10 o PDP: „te odstępy są all over the place”. Nad kartą newslettera od 23.10 --gap-nl (RYTM PIONOWY). */
:root{--gap-sec:var(--sp-7);}
@media (max-width:860px){:root{--gap-sec:var(--sp-6);}}
.hero{gap:var(--gap-block);}
.home-page .bs .sec-head{margin-bottom:var(--gap-block);}
/* runda 33 (decyzja Szymona): linki bez niebieskiego — kolor tekstu (--link = --body) z czerwienią akcentu (--red) na hover
   i focus. Rozróżnialność: linki NAWIGACYJNE (→ „Wszystkie…”, „Więcej”, opinie, „pokaż więcej”) podkreślenie na hover/focus;
   linki w TEKŚCIE CIĄGŁYM (treść stron, noty VAT/dostawy/opinii, „wyczyść filtry”) podkreślone ZAWSZE — kolor to nie jedyny
   wyróżnik (WCAG 1.4.1). --blue zostaje tylko dla statusu „przedsprzedaż” (.stock.presale — semantyka, nie link). */
:root{--link:var(--body);}
.lnk,.sec-head .all,.card .eds,.facet .more,.pinfo .meta .rv a,.lede .more,.mg-more{text-decoration:none;text-underline-offset:3px;}
:is(.lnk,.sec-head .all,.card .eds,.facet .more,.pinfo .meta .rv a,.lede .more,.mg-more):is(:hover,:focus-visible){color:var(--red);text-decoration:underline;}
.active-f .clear,.buy .vat a,.dlv .to a,.revs .note a,.page-body a:not(.btn):not(.button-1):not(.button-2){text-decoration:underline;text-underline-offset:3px;}
:is(.active-f .clear,.buy .vat a,.dlv .to a,.revs .note a,.page-body a:not(.btn):not(.button-1):not(.button-2)):is(:hover,:focus-visible){color:var(--red);}
/* stopka: kafle tekstowe płatności (PayU — do podmiany na oficjalny asset; przelew) w rozmiarze logotypów */
.paytile{display:inline-flex;align-items:center;height:26px;padding:0 8px;border:1px solid var(--line2);border-radius:4px;background:#fff;color:#201d1c;font-family:var(--head);font-weight:700;font-size:11px;letter-spacing:.02em;white-space:nowrap;}
/* runda 35 (A): „Z życia księgarni” — karty z miniaturą 16:9, równej wysokości, „Czytaj →” przy dolnej krawędzi */
.news-cards{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--sp-5);align-items:stretch;}
.news-cards article{position:relative;display:flex;flex-direction:column;border:1px solid var(--line);border-radius:var(--r-xs);overflow:hidden;background:var(--surface);}
.nc-thumb{aspect-ratio:16/9;background:var(--wash);position:relative;overflow:hidden;}
.nc-thumb img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block;}
.nc-body{display:flex;flex-direction:column;flex:1;padding:var(--sp-4) var(--sp-5) var(--sp-5);}
.news-cards time{display:block;font-size:var(--fs-sm);color:var(--muted);}
.news-cards h3{font-size:var(--fs-base);line-height:1.35;margin-top:4px;}
.news-cards h3 a::before{content:"";position:absolute;inset:0;}
.news-cards p{margin:6px 0 0;font-size:var(--fs-md);color:var(--body);}
.news-cards article:hover h3{color:var(--red);}
.nc-more{margin-top:auto;padding-top:var(--sp-3);font-size:var(--fs-md);font-weight:500;color:var(--red);}
@media (max-width:860px){.news-cards{grid-template-columns:minmax(0,1fr);gap:var(--sp-4);}}

/* runda 35 (B): newsletter — pełnoszeroki pas (--nl-bg, od rundy 37 szary), lewo: „Newsletter” | kreska | tekst; prawo: pole-pigułka z przyklejonym przyciskiem, zgody pod
   polem (wyrównane do jego lewej krawędzi) drobnym tekstem. Zgody i ich działanie bez zmian. */
/* runda 37 (decyzja Szymona): pas po prostu SZARY — neutralna szarość tła z palety (--wash: jasny #eaeaea, ciemny #2a2726,
   ta sama co inne szare tła motywu; bez odcienia czerwieni/złota) */
:root{--nl-bg:var(--wash);}
.nlband{background:var(--nl-bg);border-top:0;}
.nlband .wrap{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.3fr);column-gap:var(--sp-7);align-items:center;text-align:left;padding-top:var(--sp-6);padding-bottom:var(--sp-6);}
.nl-head{display:flex;align-items:center;gap:var(--sp-5);}
.nl-head h2{margin:0;padding-right:var(--sp-5);border-right:2px solid var(--ink);font-size:var(--fs-xl);letter-spacing:0;text-transform:none;line-height:1.2;}
.nl-head .nl-lead{margin:0;font-size:var(--fs-md);line-height:1.5;color:var(--ink);text-wrap:pretty;}
.nlband .nlrow{display:flex;max-width:none;margin:0;gap:0;background:var(--surface);border:1px solid var(--line2);border-radius:var(--r-pill);}
.nlband .nlrow:focus-within{outline:2px solid var(--red);outline-offset:2px;}
.nlband .nlrow .fld{flex:1;min-width:0;height:46px;border:0;background:transparent;border-radius:var(--r-pill);padding:0 22px;outline:0;}
.nlband .nlrow .btn{height:46px;margin:-1px -1px -1px 0;padding:0 28px;border-radius:var(--r-pill);flex:none;}
.nlband .nlagree{max-width:none;margin:10px 0 0;padding-left:0;font-size:11.5px;line-height:1.45;color:var(--body);}
.nlband small{text-align:left;margin-top:6px;padding-left:0;}
.nlband .nlagree input{margin-left:0;}  /* checkbox też na lewej krawędzi pola (bez domyślnego marginesu przeglądarki) */
@media (max-width:860px){
  .nlband .wrap{grid-template-columns:minmax(0,1fr);row-gap:var(--sp-4);padding-top:var(--sp-5);padding-bottom:var(--sp-5);}
  .nl-head{flex-wrap:wrap;gap:var(--sp-2) var(--sp-4);}
  .nl-head h2{font-size:var(--fs-lg);border-right:0;padding-right:0;}  /* nagłówek nad tekstem — kreska bez sąsiada zbędna */
  .nlband .nlrow{flex-direction:row;}
  .nlband .nlrow .btn{padding:0 20px;}
}
/* runda 36: rząd kafli (dawniej zalet) bezpośrednio pod pierwszym segmentem (bez H1 nad nim) — wspólny odstęp górnej części
   --gap-block, także do nagłówka Bestsellerów; H1 + lead pod Bestsellerami w rytmie sekcji (48 / 32 px) */
.home-page .hero ~ .tiles-rail{margin-top:var(--gap-block);}
.home-page .tiles-rail ~ .bs-row{margin-top:var(--gap-block);}
.home-page .intro-below{margin-top:var(--sp-7);}
@media (max-width:860px){.home-page .intro-below{margin-top:var(--sp-6);}}
/* runda 38 (Szymon: „wszystkie boxy z głównej w takie same ramki jak Oferta tygodnia … i ten sam margines”): tokeny karty
   wydzielone z karty Oferta tygodnia (tło --surface, ramka 1 px --line, zaokrąglenie --r, padding 16/24 px; mobile 12/16) —
   każda sekcja strony głównej (zalety, Bestsellery, H1, Polecane, Promocje, Z życia księgarni, blok SEO) to karta; odstęp
   między wszystkimi kartami = --gap-block (16 / 12 px) zamiast rytmu 48/32 px — na stronie głównej. Newsletter i stopka
   (pasy na całą szerokość) bez zmian. */
:root{--card-bg:var(--surface);--card-border:1px solid var(--line);--card-radius:var(--r);--card-pad:var(--sp-4) var(--sp-5);}
@media (max-width:860px){:root{--card-pad:var(--sp-3) var(--sp-4);}}
.home-page > .sec,.home-page > .bs-row > .sec,.home-page > .pr-row > .sec,.home-page > .intro-below,.home-page > .seo:has(*){background:var(--card-bg);border:var(--card-border);border-radius:var(--card-radius);padding:var(--card-pad);margin-top:var(--gap-block);}
.home-page > .seo:not(:has(*)){display:none;}                       /* pusty topik SEO (same białe znaki — :empty ich nie łapie) */
.home-page .news-cards article{border-color:transparent;background:var(--wash);}  /* karty wpisów w karcie sekcji — bez podwójnej ramki */
.home-page > .sec > .sec-head:first-child{margin-top:0;}
.home-page > .intro-below h1{margin:0;}
.home-page > .intro-below p{margin-bottom:0;}
.home-page > .deals{margin-left:0;margin-right:0;}                  /* dawniej szary pas (na mobile od krawędzi do krawędzi) */
.home-page .deals .sec-head{margin-top:0;}
@media (max-width:860px){.home-page > .deals{border-radius:var(--card-radius);}}

/* ============================================================
   kolejka wyglądu pkt 3–4 (2026-10-19): SWIPERY PRODUKTÓW — Polecane i Bestsellery (strona główna) na tym samym .hrail.
   Ostatnia widoczna okładka zawsze ucięta W POŁOWIE przy prawej krawędzi: N pełnych kart + 0,5. N dobiera container
   query po szerokości railu tak, żeby karta nie spadła poniżej progu kontrolki D5 (desktop ≥172 px = „DO KOSZYKA”
   w 1 wierszu; mobile ≥156 px = decyzja z rundy 47). Strzałki (v2 niżej): kwadrat wpięty w linię krawędzi raila,
   widoczne bez hovera, także na mobile; disabled na początku/końcu (pkieu-v3.js, pkt 4). Nadpisuje wcześniejsze reguły .hrail (te same selektory, blok stoi później).
   ============================================================ */
.hrail-wrap{container-type:inline-size;--rail-n:1;--rail-gap:var(--sp-3);}
.hrail{gap:var(--rail-gap);grid-auto-columns:calc((100% - var(--rail-n) * var(--rail-gap)) / (var(--rail-n) + .5));scroll-padding-inline:0;}
.hrail-wrap > .hrail{grid-template-columns:none;}  /* Bestsellery niosą też .also-purchased-products-grid (initList/GA4) — jego jawne kolumny siatki wyłączone */
/* progi: (N + 0,5)·karta + N·odstęp + lewy odstęp raila (--rail-line-up, najwyżej 24 px — patrz „odstęp lewa = góra” niżej).
   Desktop od N=1: Bestsellery stoją obok Oferty tygodnia, ich rail przy 900–1024 px ma tylko 530–660 px */
@media (min-width:861px){
  .hrail-wrap{--rail-gap:var(--sp-5);}
  @container (min-width:502px){.hrail{--rail-n:2;}}   /* 2,5·172 + 2·24 + 24 */
  @container (min-width:698px){.hrail{--rail-n:3;}}   /* 3,5·172 + 3·24 + 24 */
  @container (min-width:894px){.hrail{--rail-n:4;}}   /* 4,5·172 + 4·24 + 24 */
  @container (min-width:1090px){.hrail{--rail-n:5;}}  /* 5,5·172 + 5·24 + 24 */
}
@media (max-width:860px){
  @container (min-width:438px){.hrail{--rail-n:2;}}   /* 2,5·156 + 2·12 + 24 */
  @container (min-width:606px){.hrail{--rail-n:3;}}
  @container (min-width:774px){.hrail{--rail-n:4;}}
}
/* strzałki v2 (2026-10-19, szkic Szymona): cienka linia separatora pod nagłówkiem sekcji (--line) SCHODZI W DÓŁ wzdłuż
   krawędzi raila (::before lewa, ::after prawa), a kwadratowy przycisk (--r) jest w nią „wpięty” — jego ramka 1 px w tym
   samym kolorze obchodzi przycisk od strony raila i wraca w linię pod nim (od strony tła sekcji bez krawędzi — zrzut 114). W środku symbol marki:
   kątownik z narożnika logo (grubość --pki-corner-w) obrócony w „›”/„‹”, w tekstowej czerwieni sklepu (--arr-c = --red).
   Hover = zmiana tła (bez narożników), disabled = wygaszony symbol (ramka zostaje — linia się nie urywa). */
.hrail-wrap,.car .carr,.mg-list{--arr-w:48px;--arr-out:8px;--arr-a:13px;--arr-c:var(--red);--rail-line-up:var(--sp-5);}
.home-page .bs .hrail-wrap{--rail-line-up:var(--gap-block);}  /* Bestsellery na głównej: odstęp nagłówek→rail = --gap-block */
.hrail-wrap::before,.hrail-wrap::after{content:"";position:absolute;top:calc(-1 * var(--rail-line-up) - 1px);bottom:0;width:0;border-left:1px solid var(--line);z-index:2;pointer-events:none;}
.hrail-wrap::before{left:0;}.hrail-wrap::after{right:0;}
/* odstęp lewa = góra (Szymon, 2026-10-19: „tyle przestrzeni po lewej co od góry”): pierwsza karta odsunięta od lewej linii
   o ten sam --rail-line-up, co rail od linii nagłówka. Odstęp = margines przewijanego kontenera (P − 8 px) + padding 8 px:
   w padding (= wysunięcie plakietki, left:-8px) wjeżdża tylko plakietka, a nie poprzednia karta po przewinięciu
   (odstęp między kartami ≥ 12 px > 8 px). Kolumny liczone od pola treści, więc ucięcie 0,5 przy prawej linii zostaje.
   Prawej strony bez odstępu — tam karta jest ucięta celowo. */
.hrail{--rail-badge-out:8px;margin-left:calc(var(--rail-line-up) - var(--rail-badge-out));padding-left:var(--rail-badge-out);scroll-padding-inline-start:var(--rail-badge-out);}
/* baner F2 (.car .carr) i przełącznik szuflady kategorii (.mg-list .arr, Szymon 6.11 „jak strzałki karuzeli”) biorą ten sam przycisk i symbol; tylko rail ma pozycję na krawędzi i linie (reguły z .hrail-wrap).
   Lista selektorów, nie :is() — :is() brałby specyficzność .car .carr i przebijał niżej regułę szerokości raila */
.hrail-wrap .arr,.car .carr .arr,.mg-list .arr{display:block;width:var(--arr-w);height:var(--arr-w);padding:0;border:1px solid var(--line);border-radius:var(--r);
  background:var(--card-bg);color:var(--arr-c);box-shadow:none;cursor:pointer;z-index:3;transition:background-color .15s;}
.hrail-wrap .arr{top:calc(32% - var(--arr-w) / 2);}
/* poprawka Szymona (zrzut 114): widoczny kwadrat kończy się NA linii raila — ramka tylko po stronie raila (od strony tła sekcji
   brak krawędzi: linia schodzi, obchodzi przycisk i biegnie dalej); dawne wysunięcie --arr-out zostaje jako niewidoczne
   przedłużenie pola klikania (::after, przezroczyste — hover go nie pokazuje) */
.hrail-wrap .arr{width:calc(var(--arr-w) - var(--arr-out));}
.hrail-wrap .arr.next{right:0;border-right:0;border-radius:var(--r) 0 0 var(--r);}
.hrail-wrap .arr.prev{left:0;border-left:0;border-radius:0 var(--r) var(--r) 0;}
.hrail-wrap .arr::after{content:"";position:absolute;top:-1px;bottom:-1px;width:var(--arr-out);background:transparent;}
.hrail-wrap .arr.next::after{left:100%;}.hrail-wrap .arr.prev::after{right:100%;}
/* kątownik: kwadrat a×a z górną i prawą krawędzią grubości narożnika logo, obrócony o 45° (prev: −135°); przesunięty
   o ~0,35·a wstecz, żeby środek tuszu „›” wypadł w środku przycisku */
.hrail-wrap .arr::before,.car .carr .arr::before,.mg-list .arr::before{content:"";position:absolute;left:50%;top:50%;width:var(--arr-a);height:var(--arr-a);box-sizing:border-box;
  border:0 solid currentColor;border-top-width:var(--pki-corner-w);border-right-width:var(--pki-corner-w);
  transform:translate(-50%,-50%) translateX(calc(var(--arr-a) * -.35)) rotate(45deg);}
.hrail-wrap .arr.prev::before,.car .carr .arr.prev::before{transform:translate(-50%,-50%) translateX(calc(var(--arr-a) * .35)) rotate(-135deg);}
@media (hover:hover){.hrail-wrap .arr:hover:not(:disabled),.car .carr .arr:hover:not(:disabled),.mg-list .arr:hover{background:var(--wash);}}
.hrail-wrap .arr:focus-visible,.car .carr .arr:focus-visible,.mg-list .arr:focus-visible{outline:3px solid var(--red);outline-offset:2px;}
.hrail-wrap .arr:disabled,.car .carr .arr:disabled{color:var(--line2);cursor:default;}
.bestsellers.loading .hrail{opacity:.45;transition:opacity .15s;}
/* Szymon: „w swiperach schowaj ten scroll bar na dole i uczyń je przesuwalne za pomocą kursora/kciuka” — pasek przewijania
   ukryty (przewijanie kółkiem/gładzikiem, klawiaturą, palcem i strzałkami ‹ › zostaje), mysz przeciąga rail (pkieu-v3.js 4b):
   kursor „grab” tylko na urządzeniach z precyzyjnym wskaźnikiem; w trakcie przeciągania bez snapu i bez zaznaczania tekstu;
   obrazki i linki nie dają się „wyciągnąć” z raila (natywne drag & drop) */
.hrail{scrollbar-width:none;}
.hrail::-webkit-scrollbar{display:none;}
@media (hover:hover) and (pointer:fine){.hrail{cursor:grab;}}
.hrail.dragging{cursor:grabbing;scroll-snap-type:none;user-select:none;}
.hrail.dragging *{cursor:grabbing;}
.hrail img{-webkit-user-drag:none;user-select:none;}
@media (max-width:860px){
  .hrail-wrap,.car .carr,.mg-list{--arr-w:44px;--arr-out:6px;--arr-a:12px;}
}
/* symbol „›” = tekstowy akcent sklepu --red (Szymon, zrzut 114): jasny #b7171a (czerwień sklepu), ciemny #eb7072 (ten sam róż co
   nagłówki BESTSELLERY), wysoki kontrast --hc-accent; tło hover w kontraście (wszystkie --wash = --hc-bg) jawnie (--hc-hover) */
@media (hover:hover){:root[data-contrast="more"] .hrail-wrap .arr:hover:not(:disabled),:root[data-contrast="more"] .car .carr .arr:hover:not(:disabled),:root[data-contrast="more"] .mg-list .arr:hover{background:var(--hc-hover);}}
:root[data-contrast="more"] .hrail-wrap .arr:disabled::before{opacity:.4;}  /* --line2 = --hc-fg jak tekst — wygaszony symbol odróżnia disabled od aktywnego w kolorze akcentu */

/* ============================================================
   NEWSLETTER 2026-10-20 (Szymon: najpierw „kwadratowe przyciski jak w searchu i narożniki otaczające słowo newsletter”, potem
   „podoba mi się styl 2… box podobny do Oferty tygodnia… połowę ekranu obok promocji, a promocje zrobić przewijane”).
   Jeden formularz (zgody i skrypt bez zmian), dwie oprawy: KAFEL mini-hero (.mhero.mh-nl) w rzędzie .pr-row z railem Promocji
   na stronie głównej i KARTA nad stopką (.nlband) na pozostałych stronach. Wspólne: „Newsletter” w narożnikach marki
   (.pki-corners zawsze widoczne, jak .mhero .mh-t), pole + przycisk o anatomii wyszukiwarki z nagłówka (--h-lg, --r tylko na
   zewnętrznych rogach, przycisk przyklejony, ikona w polu jak lupa), ilustracja C koperty BEZ płytki (jak mini-hero, 405ade4e).
   ============================================================ */
/* formularz — ten sam w obu oprawach */
:is(.nlband,.mh-nl) .nlrow{position:relative;display:flex;max-width:none;margin:0;gap:0;background:none;border:0;border-radius:0;}
:is(.nlband,.mh-nl) .nlrow:focus-within{outline:0;}  /* focus jak w wyszukiwarce: czerwona ramka pola (.fld:focus), przycisk — globalny :focus-visible */
:is(.nlband,.mh-nl) .nlrow .fld{flex:1;min-width:0;height:var(--h-lg);border:1px solid var(--line2);border-right:0;border-radius:var(--r) 0 0 var(--r);
  background:var(--surface);padding:0 14px 0 40px;font-size:var(--fs-base);}
:is(.nlband,.mh-nl) .nlrow .fld:focus{border-color:var(--red);}
:is(.nlband,.mh-nl) .nlrow .btn{flex:none;height:var(--h-lg);margin:0;padding:0 24px;border-radius:0 var(--r) var(--r) 0;}
:is(.nlband,.mh-nl) .nl-ico{position:absolute;left:13px;top:50%;transform:translateY(-50%);z-index:1;width:var(--ico-20);height:var(--ico-20);
  stroke:var(--muted);fill:none;stroke-width:var(--ico-sw);pointer-events:none;}
:is(.nlband,.mh-nl) .nlagree{display:flex;flex-direction:column;gap:6px;max-width:none;margin:10px 0 0;padding-left:0;text-align:left;font-size:11.5px;line-height:1.45;color:var(--body);}
:is(.nlband,.mh-nl) .nlagree label{display:flex;gap:8px;align-items:flex-start;}
:is(.nlband,.mh-nl) .nlagree input{accent-color:var(--red);margin:2px 0 0;flex:none;}  /* checkbox na lewej krawędzi pola */
:is(.nlband,.mh-nl) .nlagree a,:is(.nlband,.mh-nl) small a{color:var(--red);text-decoration:underline;}
:is(.nlband,.mh-nl) small{display:block;margin-top:6px;padding-left:0;text-align:left;font-size:var(--fs-xs);color:var(--muted);}
/* tytuł w narożnikach: kreski wystają o --pc-gx + grubość (13 px) poza pudełko — stąd margines 13 px z obu stron */
.nlband .nl-t{--pc-gx:9px;--pc-gy:6px;margin:10px 13px 4px;padding-right:0;border-right:0;flex:none;
  font-family:var(--head);font-weight:800;font-size:var(--fs-h1m);line-height:1.1;letter-spacing:-.01em;color:var(--ink);}
.nlband .nl-t::before,.nlband .nl-t::after{opacity:1;transform:none;transition:none;}
/* ilustracja bez płytki leży wprost na karcie: w ciemnym --cover-filter (jak okładki i mini-hero), w kontraście biały obrys */
:root[data-theme="dark"] :is(.nlband .nl-ilu,.mh-nl .mh-art) img{filter:var(--cover-filter);}
@media (prefers-color-scheme:dark){:root:not([data-theme="light"]):not([data-contrast="more"]) :is(.nlband .nl-ilu,.mh-nl .mh-art) img{filter:var(--cover-filter);}}
:root[data-contrast="more"] :is(.nlband .nl-ilu,.mh-nl .mh-art) img{filter:drop-shadow(0 0 1px var(--hc-fg));}

/* KARTA nad stopką (strony poza główną): karta sekcji jak bloki strony głównej (--card-*) — ::before wcięty o margines strony
   (.wrap), więc krawędzie trafiają w krawędzie kart; ilustracja | tytuł + tekst nad formularzem; mobile: ilustracja nad treścią */
/* odstępy (Szymon 20.10: „na innych stronach niż główna newsletter ma złe odstępy” — karta stała na stopce, nad nią sztywne
   56 px z czasów pełnoszerokiego pasa): nad kartą rytm sekcji podstron (.sec: --sp-7, mobile --sp-6; od 23.10 --gap-nl, patrz
   RYTM PIONOWY na końcu pliku — tam margines zerowany, odstęp daje padding <main>); pod nią do stopki
   --gap-block — z reguły layoutu .foot (ten sam odstęp co między kartami sekcji strony głównej) */
.nlband{background:none;margin:var(--gap-sec) 0 0;}  /* odstęp pod kartą do stopki daje .foot (margin-top, --gap-block) */
.nlband .wrap{--nl-gut:26px;position:relative;isolation:isolate;display:grid;grid-template-columns:minmax(220px,300px) minmax(0,1fr);
  grid-template-areas:"ilu head" "ilu form";column-gap:var(--sp-6);row-gap:var(--sp-4);align-items:center;text-align:left;
  padding:var(--sp-5) calc(var(--nl-gut) + var(--sp-5));}
.nlband .wrap::before{content:"";position:absolute;inset:0 var(--nl-gut);z-index:-1;background:var(--card-bg);border:var(--card-border);border-radius:var(--card-radius);}
.nlband .nl-ilu{grid-area:ilu;align-self:stretch;display:flex;align-items:center;}
.nlband .nl-ilu img{display:block;width:100%;height:auto;}
.nlband .nl-head{grid-area:head;display:flex;flex-direction:column;align-items:flex-start;gap:var(--sp-3);align-self:end;}
.nlband .nl-head .nl-lead{margin:0;font-size:var(--fs-md);line-height:1.5;color:var(--ink);text-wrap:pretty;}
.nlband .nl-form{grid-area:form;align-self:start;}
@media (max-width:860px){
  .nlband .wrap{--nl-gut:16px;grid-template-columns:minmax(0,1fr);grid-template-areas:"ilu" "head" "form";padding:var(--sp-4) calc(var(--nl-gut) + var(--sp-4));}
  .nlband .nl-ilu{justify-content:center;}
  .nlband .nl-ilu img{max-width:240px;}
  .nlband .nl-t{font-size:var(--fs-xl);}
}

/* KAFEL (strona główna): klasy mini-hero — jasna góra (etykieta ⌜⌟ + podtytuł), formularz, ilustracja na styku zachodząca na
   czerwony pasek marki. To NIE link (w środku formularz): bez hovera tła i bez żółtej ramki hover w kontraście.
   Selektory .mhero.mh-nl: blok mini-hero stoi w arkuszu PÓŹNIEJ z tą samą szczegółowością (.mhero .mh-…) — inaczej on wygrywa. */
.mhero.mh-nl .mh-top{padding-bottom:var(--sp-3);}
.mhero.mh-nl .mh-t{margin:6px 13px 0;}  /* jak .mhero .mh-t, z prawym marginesem na wystający ⌟ */
.mhero.mh-nl .mh-s{max-width:none;-webkit-line-clamp:unset;margin:0;}
.mhero.mh-nl .nl-form{position:relative;z-index:2;padding:0 var(--sp-5);}
/* ilustracja (Szymon po #405: „obrazek jest za bardzo wyciągnięty”): NIE wypełnia wolnego miejsca kafla (dawniej pudełko img
   = cała wolna wysokość × szerokość, 1,8:1 na desktopie, 3,4:1 na tablecie) — własne proporcje płótna SVG 4:3, szerokość do
   --nl-art-w, wyśrodkowana nad paskiem; wolne miejsce zostaje nad nią */
.mhero.mh-nl{--nl-art-w:240px;}
.mhero.mh-nl .mh-art{display:flex;align-items:flex-end;justify-content:center;min-height:0;}
.mhero.mh-nl .mh-art img{position:static;display:block;width:min(100% - 2 * var(--sp-5),var(--nl-art-w));height:auto;aspect-ratio:4/3;margin:0;object-fit:contain;}
@media (hover:hover){.mhero.mh-nl:hover{background-color:var(--mh-bg);}}
@media (hover:hover){:root[data-contrast="more"] .mhero.mh-nl:hover{border-color:var(--hc-fg);}}

/* rząd [Promocje — rail | kafel newslettera] w KOLUMNACH HERO (Szymon po #405: szerokość kafla = box PROMOCJE pod banerem):
   te same kolumny (--hero-side | 1fr | 1fr) i odstęp (--gap-block) co .hero, rail na dwóch pierwszych, kafel w trzeciej —
   więc kafel ma dokładnie szerokość .s-promo; bez kolumny bocznej w hero (.no-side: 1fr | 1fr) — po połowie, jak tam.
   Bez Promocji (pusta kategoria) kafel na całą szerokość; mobile: Promocje nad kafelem (produkty przed zapisem). */
.pr-row{display:grid;grid-template-columns:var(--hero-side) minmax(0,1fr) minmax(0,1fr);grid-template-areas:"promo promo nl";gap:var(--gap-block);align-items:stretch;margin-top:var(--gap-block);}
.home-page:has(> .hero.no-side) .pr-row{grid-template-columns:minmax(0,1fr) minmax(0,1fr);grid-template-areas:"promo nl";}
.home-page .pr-row:not(:has(> .sec)){grid-template-columns:minmax(0,1fr);grid-template-areas:"nl";}
.home-page .pr-row > .sec{grid-area:promo;min-width:0;margin-top:0;}
.pr-row > .mh-nl{grid-area:nl;}
@media (max-width:860px){
  .pr-row,.home-page:has(> .hero.no-side) .pr-row{grid-template-columns:minmax(0,1fr);grid-template-areas:"promo" "nl";}
  .mhero.mh-nl .nl-form{padding:0 var(--sp-4);}
  .mhero.mh-nl .mh-art img{height:auto;}
}

/* ============================================================
   WYSOKI KONTRAST — reguły komponentów (:root[data-contrast="more"], niezależnie od jasnego/ciemnego). Kolory WYŁĄCZNIE
   z prymitywów --hc-* — te, tokeny sklepu w kontraście i przełącznik „Motyw” są w pkieu-theme.css (ładowany po tym pliku).
   ============================================================ */
/* linki w treści: w kolorze akcentu i ZAWSZE podkreślone (kolor nie jest jedynym wyróżnikiem) */
:root[data-contrast="more"] :is(.lnk,.sec-head .all,.card .eds,.facet .more,.pinfo .meta .rv a,.lede .more,.mg-more,.page-body a:not(.btn),.foot a,.nlband a,.crumbs a,.breadcrumb a){color:var(--hc-accent);text-decoration:underline;text-underline-offset:3px;}
/* pola formularzy: ramka 2 px */
:root[data-contrast="more"] :is(.fld,.sel,input[type="text"],input[type="email"],input[type="search"],input[type="password"],input[type="tel"],input[type="number"],textarea,select){border:2px solid var(--hc-fg);background:var(--hc-bg);color:var(--hc-fg);}
:root[data-contrast="more"] ::placeholder{color:var(--hc-fg);opacity:1;}
/* focus z klawiatury: 3 px żółty + odstęp 2 px */
:root[data-contrast="more"] :focus-visible{outline:3px solid var(--hc-accent) !important;outline-offset:2px;}
/* ramki kart i pasów z „szarości” zamieniamy na biel 2 px; górny pas oddzielony linią */
:root[data-contrast="more"] :is(.mhero,.strip,.tile,.news-cards article){border:2px solid var(--hc-fg);}
:root[data-contrast="more"] .topbar{border-bottom:2px solid var(--hc-fg);}
/* --on-fill = --hc-on-accent (tekst na wypełnieniach akcentu); obszary na tle --hc-bg, które go używały, dostają --hc-fg jawnie */
:root[data-contrast="more"] :is(.topbar,.car .art,.car .kick,.car .cpos,.car .cpos b,.thumbs a,.car .chips-h,.car .chips > span,.mhero .mh-band){color:var(--hc-fg);}
/* białe na sztywno na banerze (--banner-bg = --hc-bg): w jasnym kontraście znikały — podpis kafla, chipy, link „następna ›” */
:root[data-contrast="more"] .mhero .mh-band small{opacity:1;}
:root[data-contrast="more"] .car .chips > span{border-color:var(--hc-fg);background:var(--hc-bg);}
:root[data-contrast="more"] .car .cnext{text-decoration-color:currentColor;}
@media (hover:hover){:root[data-contrast="more"] .car .cnext:hover{color:var(--hc-accent);}}
:root[data-contrast="more"] :is(.car .txt,.car .art){border:2px solid var(--hc-fg);}
:root[data-contrast="more"] .car .txt{border-right-width:0;}  /* jedna linia 2 px na styku paneli, nie dwie */
@media (max-width:860px){:root[data-contrast="more"] .car .txt{border-right-width:2px;border-top-width:0;}}
:root[data-contrast="more"] .paytile{background:var(--hc-bg);color:var(--hc-fg);border:2px solid var(--hc-fg);}
/* wypełnienia z twardym #fff w tekście (przycisk Zapłać/.button-1, bieżąca strona pagera, pasek komunikatu) — na wypełnieniu akcentu --hc-on-accent */
:root[data-contrast="more"] :is(.button-1,input[type=submit].button-1,input[type=button].button-1,.pager li.current-page span,.bar-notification,.bar-notification a){color:var(--hc-on-accent);}
/* system Windows „wysoki kontrast” (forced-colors): ikony z obrysu (stroke z CSS nie jest wymuszany) w kolorze tekstu */
@media (forced-colors:active){
  .ico,svg.ico{stroke:CanvasText !important;}  /* !important: reguły komponentów (.htool .ico itd.) są bardziej szczegółowe */
  .pki-corners::before,.pki-corners::after{border-color:CanvasText;}
}

/* ============================================================
   KAFLE STRONY GŁÓWNEJ (kolejka wyglądu pkt 2, wzór: rząd skrótów Allegro) — 5 równych kart w jednym rzędzie:
   odznaka + pogrubiony podpis i podtekst. Zastępują dwa panele pod banerem i pasek zalet (panele wróciły — zrzut 101).
   Karta = tokeny kart strony głównej (--card-*); hover = subtelna zmiana tła (blok HOVER na końcu).
   ODZNAKA (decyzja Szymona — cofnięte wcięcie pod kątem prostym i kolorowe końce; wzór: makieta wyglad-bento, wariant C):
   zakładka WYPEŁNIONA zwisająca z górnej krawędzi kafla, biała ikona 20 px, płytkie wcięcie V u dołu (12 px = 20% wysokości),
   bez żadnych krawędzi/końców. Odstęp górna krawędź → ikona = ikona → wierzchołek V = 14 px (zakładka 40 × 60).
   Wypełnienia: zalety grafit, Szybka wysyłka zieleń, Promocje czerwień #7f1618. Ciemny: jaśniejsze wypełnienia, żeby kształt
   miał ≥ 3:1 do tła kafla (grafit #64727d 3,3; zieleń #26824e 3,4); Promocje #7f1618 1,58 — znaczenie niesie biała ikona
   (10,3:1). Biała ikona ≥ 4,8:1 na każdym wypełnieniu. Wysoki kontrast: --hc-fg / --hc-green / --hc-accent z ikoną --hc-on-accent.
   ≤ 1180 px (kafel węższy niż ~190 px) układ pionowy: odznaka nad podpisem. ≤ 860 px: rząd przewijany
   w poziomie jak karuzele (.hrail), ostatni widoczny kafel ucięty przy krawędzi = sygnał „przewiń”.
   ============================================================ */
.tiles{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:var(--sp-4);}
.tile{display:flex;align-items:flex-start;gap:var(--sp-3);min-width:0;padding:var(--sp-3) var(--sp-4);background:var(--card-bg);border:var(--card-border);border-radius:var(--card-radius);color:var(--body);
  font-size:var(--fs-xs);line-height:1.4;--bm-fill:var(--bm-graphite);--bm-ico:var(--on-fill);--tile-bw:1px;}
.tile.t-fast{--bm-fill:var(--bm-fast-fill);--bm-ico:var(--bm-fast-ico);}
.tile.t-promo{--bm-fill:var(--bm-promo-fill);}
:root{--bm-graphite:var(--graphite);--bm-fast-fill:var(--green-fill);--bm-fast-ico:var(--on-fill);--bm-promo-fill:#7f1618;}
:root[data-theme="dark"]{--bm-graphite:#64727d;--bm-fast-fill:#26824e;--bm-fast-ico:#ffffff;--bm-promo-fill:#7f1618;}
@media (prefers-color-scheme:dark){:root:not([data-theme="light"]):not([data-contrast="more"]){--bm-graphite:#64727d;--bm-fast-fill:#26824e;--bm-fast-ico:#ffffff;--bm-promo-fill:#7f1618;}}
:root[data-contrast="more"]{--bm-graphite:var(--hc-fg);--bm-fast-fill:var(--hc-green);--bm-fast-ico:var(--hc-on-accent);--bm-promo-fill:var(--hc-accent);}
/* zakładka zwisa od górnej ramki kafla: ujemny margines = padding + ramka */
.tile .ros{position:relative;flex:none;width:40px;height:60px;margin-top:calc(-1 * var(--sp-3) - var(--tile-bw));}
.tile .bm{position:absolute;inset:0;width:100%;height:100%;overflow:visible;}
.tile .bm .bm-f{fill:var(--bm-fill);stroke:none;}
.tile .ros .ico{position:absolute;left:10px;top:14px;width:20px;height:20px;fill:none;stroke:var(--bm-ico);stroke-width:2;}
.tile .tl{min-width:0;padding-top:2px;text-wrap:pretty;}
.tile .tl b{display:block;margin-bottom:2px;font-family:var(--head);font-weight:700;font-size:var(--fs-md);line-height:1.3;color:var(--ink);}
@media (max-width:1180px){
  .tile{flex-direction:column;align-items:flex-start;gap:var(--sp-2);}
}
@media (max-width:860px){
  .tiles{grid-template-columns:none;grid-auto-flow:column;grid-auto-columns:max(156px,30%);gap:var(--sp-3);overflow-x:auto;scroll-snap-type:x mandatory;scrollbar-width:none;
    padding:6px;margin-left:-6px;margin-right:-6px;}
  .tiles::-webkit-scrollbar{display:none;}
  .tile{scroll-snap-align:start;scroll-margin-left:6px;}
  .home-page .hero ~ .tiles-rail{margin-top:calc(var(--gap-block) - 6px);}
  .home-page .tiles-rail ~ .bs-row{margin-top:calc(var(--gap-block) - 6px);}
}
:root[data-contrast="more"] .tile{--tile-bw:2px;}
@media (forced-colors:active){.tile .bm .bm-f{fill:CanvasText;}.tile .ros .ico{stroke:Canvas !important;}}

/* ============================================================
   MINI-HERO — układ „I” (makieta wyglad-bento, decyzja Szymona 20.10.2026; wcześniej kolaż okładek, zrzut 111): Poradniki obok
   banera i Oferta tygodnia obok Bestsellerów to kafle-zapowiedzi, nie karty produktu. Jasna góra (karta) — etykieta Montserrat
   w narożnikach marki ⌜⌟ (zawsze widoczne, jak logo) + podtytuł kursywą; ilustracja SVG (Content/ilustracje, styl
   PkiMiniHero.IllustrationStyle; styl „c” bez płytki tła, jeden plik na wszystkie motywy) zachodzi na czerwony pasek marki (--banner-bg)
   z podpisem: tytuł · autor pierwszej pozycji. Bez przycisku, bez cen; cały kafel = jeden link, hover = subtelna zmiana tła
   (blok HOVER). Partial _PkiMiniHero (dane: _PkiShelfHero, _PkiWeeklyOffer).
   Rząd .bs-row (zrzut 102): sekcja Bestsellery | mini-hero Oferty — osobne karty, równa wysokość; mobile: Oferta nad sekcją.
   ============================================================ */
.mhero{grid-area:offer;position:relative;display:flex;flex-direction:column;min-width:0;min-height:0;overflow:hidden;
  border:var(--card-border);border-radius:var(--card-radius);background:var(--mh-bg);color:var(--ink);text-decoration:none;--mh-bg:var(--card-bg);}
.mhero .mh-top{flex:none;display:flex;flex-direction:column;align-items:flex-start;gap:var(--sp-3);padding:var(--sp-5) var(--sp-5) var(--sp-4);}
.mhero .mh-t{--pc-gx:9px;--pc-gy:6px;margin:6px 0 0 9px;font-family:var(--head);font-weight:800;font-size:var(--fs-h1m);line-height:1.1;letter-spacing:-.01em;color:var(--ink);}
.mhero .mh-t::before,.mhero .mh-t::after{opacity:1;transform:none;transition:none;}
.mhero .mh-s{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;max-width:32ch;
  font-size:var(--fs-sm);font-style:italic;line-height:1.4;color:var(--muted);}
/* ilustracja na styku: obszar = cała wysokość kafla między tekstem a paskiem (flex:1; kafel jest wysoki — kolumna obok banera / rząd
   Bestsellerów), rysunek wypełnia go bez ucinania (object-fit:contain) i stoi na pasku (object-position dół); ujemny margines dolny
   wsuwa go na pasek. Styl „c” ma pionowe płótno 320×500 dopasowane do tej proporcji (PkiMiniHero.IllustrationSize). */
.mhero .mh-art{position:relative;z-index:1;display:block;flex:1 1 auto;min-height:240px;margin-bottom:-64px;}
.mhero .mh-art img{position:absolute;top:0;bottom:0;left:14px;width:calc(100% - 28px);height:100%;object-fit:contain;object-position:50% 100%;
  filter:drop-shadow(0 12px 20px rgba(0,0,0,.22));}
/* rysunek bez płytki tła (Szymon 20.10) leży wprost na karcie: w ciemnym ten sam zabieg co okładki (--cover-filter: delikatny jasny
   obrys + cień), w kontraście (--cover-filter: none) cienki biały obrys — inaczej grafitowe części giną na ciemnej karcie */
:root[data-theme="dark"] .mhero .mh-art img{filter:var(--cover-filter);}
@media (prefers-color-scheme:dark){:root:not([data-theme="light"]):not([data-contrast="more"]) .mhero .mh-art img{filter:var(--cover-filter);}}
:root[data-contrast="more"] .mhero .mh-art img{filter:drop-shadow(0 0 1px var(--hc-fg));}
.mhero .mh-band{display:flex;flex-direction:column;gap:2px;padding:78px 22px 18px;background:var(--banner-bg);color:#fff;}
.mhero .mh-band b{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;font-family:var(--head);font-weight:700;font-size:var(--fs-sm);line-height:1.3;}
.mhero .mh-band small{font-size:var(--fs-xs);opacity:.85;}
.mhero:focus-visible{outline:3px solid var(--red);outline-offset:3px;}
/* rząd Bestsellery | Oferta */
.bs-row{display:grid;grid-template-columns:minmax(0,1fr) clamp(250px,22%,300px);grid-template-areas:"bs offer";gap:var(--gap-block);align-items:stretch;margin-top:var(--gap-block);}
.bs-row:not(:has(> .mhero)),.bs-row:not(:has(> .sec)){grid-template-columns:minmax(0,1fr);grid-template-areas:none;}
.home-page .bs-row > .sec{grid-area:bs;min-width:0;margin-top:0;}
.bs-row:not(:has(> .sec)) > .mhero{grid-area:auto;}
@media (max-width:860px){
  .bs-row{grid-template-columns:minmax(0,1fr);grid-template-areas:"offer" "bs";}
  /* mobile: kafel nie jest pionowy (wysokość z treści) — ilustracja o stałej wysokości 320 px pod tekstem, pasek z podpisem pod nią */
  .mhero .mh-top{padding:var(--sp-4) var(--sp-4) var(--sp-3);}
  .mhero .mh-art{flex:none;min-height:0;}
  .mhero .mh-art img{position:static;display:block;width:auto;max-width:calc(100% - 28px);height:320px;margin:0 auto;}
  .mhero .mh-s{max-width:none;}
}

/* ============================================================
   PANELE POD BANEREM (Szybka wysyłka / Promocje + „Sprawdź”) — przywrócone na prośbę Szymona (zrzut 101: „oddaj mi te dwa
   okienka tutaj”) po zdjęciu w kolejce wyglądu pkt 2; rząd kafli zostaje. Style = wynikowa kaskada sprzed 50da8501
   (runda 4 / 30b / mobile jako wiersze listy) zebrana w jednym miejscu; obszary s1/s2 w siatce .hero.
   ============================================================ */
.strip{display:grid;grid-template-columns:minmax(0,1fr) auto;grid-template-areas:"lbl btn" "txt btn";align-items:center;align-content:center;column-gap:var(--sp-4);row-gap:var(--sp-1);
  padding:var(--sp-4) var(--sp-4) var(--sp-4) var(--sp-5);border:1px solid var(--line);border-radius:var(--r);background:var(--surface);font-size:var(--fs-md);line-height:1.4;color:var(--body);}
.strip b{grid-area:lbl;margin:0;display:flex;align-items:center;gap:7px;font-family:var(--head);font-size:var(--fs-sm);letter-spacing:var(--ls-label);text-transform:uppercase;color:var(--red);}
.strip b .ico{width:var(--ico-16);height:var(--ico-16);stroke:currentColor;}
.strip b .fastmark .ico{width:12px;height:12px;stroke:var(--on-fill);fill:var(--on-fill);stroke-width:1.5;}
.strip .btn{grid-area:btn;flex:none;align-self:center;}
.strip .st{grid-area:txt;font-size:var(--fs-md);text-wrap:pretty;}
/* przycisk „Sprawdź” zmienia kolor TYLKO przy najechaniu na sam przycisk (Szymon: „przyciski powinny zmieniać kolor, kiedy
   najeżdżasz na nie, a nie na ich boxy”) — globalne .btn-primary:hover / .btn-green:hover; karta dalej jest w całości linkiem */
.s-fast{grid-area:s1;}
.s-fast b{color:var(--green);}
.s-promo{grid-area:s2;}
/* mobile (Szymon 26.10, zrzut 245: „wyrównać wysokości tych dwóch elementów”): oba wiersze tej samej wysokości — wiersze s1/s2
   siatki .hero mają 1fr przy wysokości z treści, więc wyższy wiersz wyznacza oba (bez sztywnych px); „Sprawdź” w tej samej osi.
   Wiersze stykają się mimo odstępu siatki (gap .hero = --gap-block): po połowie odstępu ujemnego marginesu na każdym
   (symetrycznie — przy jednostronnym 1fr wyrównałby ścieżki siatki, a nie same paski). */
@media (max-width:860px){
  .hero.no-side{grid-template-columns:minmax(0,1fr);grid-template-areas:"car" "s1" "s2";grid-template-rows:auto 1fr 1fr;}
  .hero:not(.no-side){grid-template-rows:auto auto 1fr 1fr;}
  .strip{padding:var(--sp-3) 0;border:0;border-bottom:1px solid var(--line);border-radius:0;background:none;font-size:var(--fs-sm);}
  .s-fast{border-top:1px solid var(--line);}
  .hero .s-fast{margin-bottom:calc(var(--gap-block) / -2);}
  .hero .s-promo{margin-top:calc(var(--gap-block) / -2);}
  .strip .st{font-size:var(--fs-xs);}
}


/* ============================================================
   MINI-KOSZYK (raport UX pkt 3) — #flyout-cart z widoku ShoppingCart/FlyoutShoppingCart, pokazywany przez pkieu-v3.js pkt 5
   po udanym dodaniu. Nienachalny: bez przyciemnienia strony, strona dalej klikalna. Desktop: panel przy prawej krawędzi pod
   górą okna; mobile (≤860): arkusz od dołu na pełną szerokość. Wysuwanie 200 ms, bez animacji przy prefers-reduced-motion.
   .mc-ship = slot na koszt dostawy (pkieu-v3.js pkt 10: /ShippingQuote/Estimate?cart=true), pusty = niewidoczny.
   ============================================================ */
.mcart{position:fixed;top:var(--sp-4);right:var(--sp-4);z-index:140;width:min(380px,calc(100vw - 2 * var(--sp-4)));max-height:calc(100vh - 2 * var(--sp-4));overflow-y:auto;
  background:var(--surface);color:var(--body);border:1px solid var(--line2);border-radius:var(--r-sheet);box-shadow:var(--sh-pop);padding:var(--sp-4) var(--sp-5) var(--sp-5);
  opacity:0;transform:translateX(24px);transition:opacity .2s ease-out,transform .2s ease-out;}
.mcart.on{opacity:1;transform:none;}
.mcart[hidden]{display:none;}
.mcart:focus{outline:none;}
.mcart:focus-visible{outline:3px solid var(--red);outline-offset:2px;}
.mc-head{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-3);margin-bottom:var(--sp-3);}
.mc-h{display:flex;align-items:center;gap:var(--sp-2);margin:0;font-family:var(--head);font-weight:700;font-size:var(--fs-md);letter-spacing:var(--ls-label);text-transform:uppercase;color:var(--green);}
.mc-h .ico{width:var(--ico-20);height:var(--ico-20);stroke:currentColor;fill:none;stroke-width:var(--ico-sw);}
.mc-x{width:var(--h-touch);height:var(--h-touch);margin:calc(-1 * var(--sp-2)) calc(-1 * var(--sp-3)) calc(-1 * var(--sp-2)) 0;border:0;border-radius:50%;background:none;color:var(--ink);font-size:26px;line-height:1;cursor:pointer;}
.mc-x:hover{background:var(--wash);}
.mc-items{list-style:none;margin:0;padding:0 0 var(--sp-3);border-bottom:1px solid var(--line);}
/* tryb „Twój koszyk” (klik w ikonę Koszyk w nagłówku — Szymon: „wciąż nie widzę tego mini carta”): wszystkie pozycje (Nop daje
   do MiniShoppingCartProductNumber = 10, najnowsze pierwsze), lista przewijana, nagłówek „Twój koszyk” zamiast „Dodano do koszyka” */
.mc-h-cart{display:none;}
.mcart.browse .mc-h-add{display:none;}
.mcart.browse .mc-h-cart{display:inline;}
.mcart.browse:not(.pki-drop) .mc-h{color:var(--ink);}
.mcart.browse .mc-items{display:flex;flex-direction:column;gap:var(--sp-3);max-height:min(46vh,380px);overflow-y:auto;overscroll-behavior:contain;}
.mc-it{display:flex;gap:var(--sp-3);align-items:flex-start;}
.mc-it[hidden]{display:none;}
.mc-cv{flex:none;width:56px;}
.mc-cv img{width:56px;height:auto;max-height:84px;object-fit:contain;mix-blend-mode:var(--cover-blend);filter:var(--cover-filter);}
.mc-cv .nocv{display:block;width:56px;height:84px;background:var(--wash);border:1px dashed var(--line2);border-radius:var(--r-xs);} /* zaślepka jak .card .nocv */
.mc-t{min-width:0;display:flex;flex-direction:column;gap:2px;}
.mc-t a{font-weight:500;font-size:var(--fs-base);line-height:1.35;color:var(--ink);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;}
.mc-t a:hover{color:var(--red);text-decoration:underline;}
.mc-t small{font-size:var(--fs-xs);color:var(--muted);}
.mc-t small.mc-pre{color:var(--blue);font-weight:600;}  /* przedsprzedaż w mini-koszyku (PkiPresale) */
.mc-pr{font-size:var(--fs-md);color:var(--body);font-variant-numeric:tabular-nums;}
.mc-pr b{font-family:var(--head);font-size:var(--fs-lg);color:var(--ink);}
.mc-sum{display:flex;justify-content:space-between;align-items:baseline;gap:var(--sp-3);padding:var(--sp-3) 0 0;font-size:var(--fs-md);color:var(--body);}
.mc-sum b{font-family:var(--head);font-size:var(--fs-lg);color:var(--ink);font-variant-numeric:tabular-nums;}
.mc-ship:empty{display:none;}
.mc-ship{padding-top:var(--sp-2);font-size:var(--fs-md);}
.mc-ship{display:flex;gap:var(--sp-2);align-items:flex-start;color:var(--body);}
.mc-ship .ico{flex:none;width:var(--ico-20);height:var(--ico-20);stroke:var(--green);margin-top:1px;}
.mc-ship b{color:var(--ink);font-variant-numeric:tabular-nums;}
.mc-ship a{color:var(--link);text-decoration:underline;text-underline-offset:3px;white-space:nowrap;}
.mc-ship a:is(:hover,:focus-visible){color:var(--red);}
.mc-btns{display:grid;grid-template-columns:1fr 1fr;gap:var(--sp-2);margin-top:var(--sp-4);}
.mc-btns .btn{width:100%;padding-left:var(--sp-2);padding-right:var(--sp-2);}
@media (max-width:860px){
  .mcart{top:auto;bottom:0;left:0;right:0;width:auto;max-height:85vh;border-radius:var(--r-sheet) var(--r-sheet) 0 0;border-width:1px 0 0;
    padding:var(--sp-3) var(--sp-4) calc(var(--sp-4) + env(safe-area-inset-bottom));transform:translateY(24px);}
  .mcart.on{transform:none;}
  .mc-btns .btn{height:var(--h-touch);}
  /* arkusz (e2e mobile 5.11): pełny koszyk (kupon, ilości) musi być osiągalny — gdy przycisk główny idzie do kasy, „Zobacz koszyk”
     widoczny w trzecim polu siatki (przycisk główny na całą szerokość); gdy główny sam prowadzi do koszyka — bez dublowania */
  .mcart:not(.drop):not([data-primary=cart]) .mc-b-cart{display:block;}
  .mcart:not(.drop):not([data-primary=cart]) .mc-btns .mc-b-go{grid-column:1 / -1;grid-row:1;}
  /* sticky pasek PDP (raport UX pkt 4): poza ekranem niedostępny z klawiatury (visibility), przy otwartym koszyku schowany */
  .sbuy{visibility:hidden;transition:transform .2s ease-out,visibility 0s linear .2s;}
  body.sbuy-on .sbuy{visibility:visible;transition:transform .2s ease-out;}
}
@media (prefers-reduced-motion:reduce){.mcart,.sbuy,body.sbuy-on .sbuy{transition:none;}}
:root[data-contrast="more"] .mcart{border:2px solid var(--hc-fg);}

/* ============================================================
   HOVER KLIKALNYCH BOKSÓW (decyzja Szymona — po „diodzie” i narożnikach ⌜⌟): TYLKO subtelna zmiana tła boksu. Jasny:
   lekkie przyciemnienie (na tle #f2f2f2 czytelniejsze niż rozjaśnienie — porównanie w raporcie), ciemny: lekkie rozjaśnienie.
   Mieszanie z kolorem bazowym boksu (color-mix), więc działa też na tonowanych mini-hero. TYLKO boksy bez przycisku, w całości
   linkiem: kafle, mini-hero (przyciski „Zobacz …” usunięte — zrzut 111), karty newsów. Boksy Z przyciskiem (karty Szybka
   wysyłka / Promocje z SPRAWDŹ, baner hero, karta produktu z DO KOSZYKA): tło boksu bez zmian, hover na przycisku
   (--red-fill-deep: w jasnym ciemniejsza, w ciemnym jaśniejsza czerwień; zielony brightness .9) — TYLKO przy najechaniu na sam
   przycisk, nie na boks.
   150 ms, prefers-reduced-motion bez animacji. Fokus z klawiatury: globalny obrys :focus-visible (bez zmian).
   Wysoki kontrast: ramka boksu żółta zamiast białej.
   ============================================================ */
:root{--hov-c:#000;--hov-p:5%;}
:root[data-theme="dark"]{--hov-c:#fff;--hov-p:7%;}
@media (prefers-color-scheme:dark){:root:not([data-theme="light"]):not([data-contrast="more"]){--hov-c:#fff;--hov-p:7%;}}
.tile,.mhero,.news-cards article{transition:background-color .15s ease-out,border-color .15s ease-out;}
@media (hover:hover){
  .tile:hover{background-color:color-mix(in srgb,var(--card-bg),var(--hov-c) var(--hov-p));}
  .mhero:hover{background-color:color-mix(in srgb,var(--mh-bg),var(--hov-c) var(--hov-p));}
  .home-page .news-cards article:hover{background-color:color-mix(in srgb,var(--wash),var(--hov-c) var(--hov-p));}
  :root[data-contrast="more"] :is(.tile,.mhero,.news-cards article):hover{background-color:var(--hc-bg);border-color:var(--hc-accent);}
}
@media (prefers-reduced-motion:reduce){.tile,.mhero,.news-cards article{transition:none;}}

/* ============================================================
   KASA: GOŚĆ DOMYŚLNIE + KONTO PRZED I PO ZAMÓWIENIU (869f7deet, checkout-gosc)
   Wejście do kasy (Customer/Login?checkoutAsGuest): karta gościa pierwsza i jedyny przycisk główny (.button-1),
   logowanie obok jako .button-2, rejestracja linkiem. Mobile: gość na górze, logowanie pod spodem.
   Strona podziękowania: blok „Załóż konto” (Components/CheckoutAccountOffer) — ramka 1 px, przy zamiarze z wejścia
   (.is-intent) ramka w kolorze akcentu. Same tokeny — jasny/ciemny/kontrast bez osobnych bloków.
   ============================================================ */
.pki-entry{display:grid;grid-template-columns:minmax(0,1.15fr) minmax(0,1fr);gap:var(--sp-5);align-items:start;}
.pki-entry > section{border:1px solid var(--line);border-radius:var(--r);background:var(--surface);padding:var(--sp-5);min-width:0;}
.pki-entry h2,.pki-account-offer h2{font-family:var(--head);font-size:var(--fs-lg);font-weight:700;color:var(--ink);margin:0 0 var(--sp-2);}
.pki-entry p{margin:0 0 var(--sp-4);}
.pki-entry-guest{border-color:var(--ink) !important;border-width:2px !important;}
.pki-entry-guest .checkout-as-guest-button{width:100%;min-height:var(--h-lg);font-size:var(--fs-sm);}
.pki-check{display:flex;gap:var(--sp-3);align-items:flex-start;margin:0 0 var(--sp-4);cursor:pointer;color:var(--ink);font-size:var(--fs-md);line-height:1.5;}
.pki-check input{flex:none;width:20px;height:20px;margin:1px 0 0;accent-color:var(--red-fill);}
.pki-check small{display:block;color:var(--muted);font-size:var(--fs-sm);margin-top:2px;}
.pki-entry-login .inputs label{min-width:90px;}
.pki-entry-login .inputs input[type=email],.pki-entry-login .inputs input[type=text],.pki-entry-login .inputs input[type=password]{flex:1 1 200px;}
.pki-entry-login .login-button{min-width:160px;}
.pki-entry-register{margin:var(--sp-4) 0 0 !important;padding-top:var(--sp-3);border-top:1px solid var(--line);font-size:var(--fs-md);}
.pki-entry .external-authentication:empty{display:none;}
@media (max-width:860px){
  .pki-entry{grid-template-columns:minmax(0,1fr);gap:var(--sp-4);}
  .pki-entry > section{padding:var(--sp-4);}
  .pki-entry-login .login-button{width:100%;}
}
.pki-account-offer{border:1px solid var(--line);border-radius:var(--r);background:var(--surface);padding:var(--sp-5);margin:var(--sp-5) 0;max-width:640px;}
.pki-account-offer.is-intent{border:2px solid var(--red);}
.pki-account-offer.is-done{border-color:var(--green);border-width:2px;}
.pki-account-offer.is-done h2{color:var(--green);}
.pki-account-offer p{margin:0 0 var(--sp-3);}
.pki-account-offer .inputs label{min-width:70px;}
.pki-account-offer .inputs input{flex:1 1 220px;}
.pki-account-offer .inputs small{flex-basis:100%;color:var(--muted);font-size:var(--fs-sm);}
.pki-account-offer .message-error p{margin:0 0 var(--sp-2);font-weight:700;}
.pki-account-note{color:var(--muted);font-size:var(--fs-sm);margin:var(--sp-3) 0 0 !important;}
.pki-account-links{display:flex;flex-wrap:wrap;gap:var(--sp-2) var(--sp-5);}
@media (max-width:860px){
  .pki-account-offer{padding:var(--sp-4);}
  .pki-account-offer .afterorder-account-button{width:100%;}
}
/* przypięty pasek — pełny komplet (869f7deet, Szymon: „wyszukiwarka, waluta, motyw, konto, lubisz i koszyk imo i burger
   kategorii”). Desktop: logo · Kategorie · wyszukiwarka (elastyczna) · Waluta · Motyw · Konto · Lubisz · Koszyk, z podpisami
   jak w nagłówku (te same kolumny 52 px). ≤ 860 px: jak nagłówek mobilny — menu · „pki” · ikony bez podpisów (cel 40×40),
   wyszukiwarka zwinięta do ikony i rozwijana drugim rzędem paska (.sq-open). Wąsko ciaśniej: ≤ 419 px cele 36 px,
   ≤ 359 px 34 px i margines 10 px (6 ikon + menu + logo; 320 px mieści się z zapasem ~4 px).
   „Kategorie” = .katbtn z paska menu (czerwony blok, burger + KATEGORIE + ▾, hover/otwarty --red-fill-deep — Szymon 20.10:
   „powinny nawiązywać estetycznie do tych”); tu tylko wysokość 40 px = pole wyszukiwarki paska. ≥ 520 px z tekstem (także
   768 — wyszukiwarka jest wtedy ikoną, miejsca starcza), ≤ 519 px czerwony kwadrat 40×40 z samym burgerem (tekst + ▾ znikają;
   nazwa dla czytnika w aria-label). Rząd przy 520 px (pomiar): przycisk 159 + logo 50 + 6×40 + 3×6 = 467 ≤ 488. */
.sticky .katbtn{flex:none;height:40px;}
@media (max-width:860px){
  :root{--stk-h:56px;}
  .sticky .wrap{gap:6px;flex-wrap:wrap;}
  .sticky .katbtn{order:-1;height:40px;}
  .sticky .hdr-tools{align-self:center;}
  .sticky .hdr-tools .htool.sq{display:inline-flex;}
  .sticky .search{display:none;order:1;flex:1 1 100%;padding-bottom:10px;}
  .sticky.sq-open .search{display:flex;}
  .sticky.sq-open .htool.sq{color:var(--red);}
  .sticky.sq-open .htool.sq .ico{stroke:var(--red);}
  /* lista: pasek Filtruj/Sortuj (.mbar, sticky top 0) zjeżdża pod przypięty pasek, gdy ten jest widoczny */
  .mbar{transition:top .3s ease-out;}
  body.stuck .mbar{top:calc(var(--stk-h) + 1px);}
}
@media (max-width:519px){
  .sticky .katbtn{width:40px;padding:0;justify-content:center;}
  .sticky .katbtn .kt,.sticky .katbtn .car-d{display:none;}
}
@media (max-width:419px){
  .sticky .hdr-tools .htool{min-width:36px;}
  .sticky .katbtn{width:36px;height:36px;}
}
@media (max-width:359px){
  .sticky .wrap{padding-left:10px;padding-right:10px;gap:4px;}
  .sticky .hdr-tools .htool{min-width:34px;}
  .sticky .katbtn{width:34px;height:34px;}
}
/* podgląd koszyka po najechaniu (pkieu-v3.js 5c): ten sam #flyout-cart jako .pki-drop (wspólny panel rozwijany, koniec pliku) —
   wysuwa się SPOD przycisku Koszyk jak panel Kategorii spod swojego bloku (Szymon 21.10: „jedna bryła”): --mc-top = dół
   przycisku, --mc-right = jego prawa krawędź (pkieu-v3.js placeDrop; pełny nagłówek i przypięty pasek), szerszy panel
   rośnie w lewo; przyciemnienie od spodu rzędu przycisku jak dotąd; nagłówek „TWÓJ KOSZYK” = etykieta sekcji (jak tytuł
   podkategorii w panelu Kategorii), bez ikony i ×; przyciski „Koszyk” + „Do kasy” (zamiast „Kontynuuj zakupy”); pusty koszyk = sam komunikat. Obok etykiety
   „Koszyk” ▾ jak przy KATEGORIE, tylko dla myszy (na dotyku najechania nie ma). */
@media (min-width:861px){
  .mcart.pki-drop{top:var(--mc-top,var(--sp-4));right:var(--mc-right,max(26px,calc((100% - var(--maxw)) / 2 + 26px)));max-height:calc(100vh - var(--mc-top,var(--sp-4)) - var(--sp-4));padding:var(--sp-5);}
  /* panel leży NAD przyciskiem (z-index .mcart; przypięty pasek ma własny kontekst z 85), więc 6 px zjazdu .pki-drop
     zasłaniałoby dół przycisku. Przycięcie górą do linii styku (przesuwane razem z zjazdem) = panel wyłania się spod
     krawędzi przycisku jak Kategorie spod swojego bloku; boki i dół zostawiają miejsce na cień --sh-pop (0 16px 40px). */
  /* górna ramka (Szymon 21.10, zrzut 197: „tam, gdzie panel jest szerszy od guzika, ramka u góry musi być”): panel szerszy
     od przycisku ma górną ramkę i zaokrąglony lewy górny róg --r; otwarty zostaje tylko odcinek dokładnie pod przyciskiem.
     Ramka leży na ostatnim rzędzie przycisku (placeDrop: --mc-top = dół przycisku − ramka), a wycięcie w clip-path
     (--mc-bw = szerokość przycisku, --mc-bt = grubość ramki) odsłania w tym miejscu czerwony dół przycisku. Kategorie tego
     nie potrzebują: ich panel zaczyna się lewą krawędzią bloku, a na prawo od niego linię daje dolna ramka paska menu. */
  .mcart.pki-drop{--mc-bt:1px;border-top:var(--mc-bt) solid var(--line);border-radius:var(--r) 0 var(--r) var(--r);
    --mc-notch:calc(100% - var(--mc-bw,0px));
    clip-path:polygon(-48px 6px,var(--mc-notch) 6px,var(--mc-notch) calc(6px + var(--mc-bt)),calc(100% + 48px) calc(6px + var(--mc-bt)),calc(100% + 48px) calc(100% + 64px),-48px calc(100% + 64px));
    transition:opacity .15s ease-out,transform .15s ease-out,clip-path .15s ease-out,visibility 0s linear .15s;}
  .mcart.pki-drop.is-open{clip-path:polygon(-48px 0,var(--mc-notch) 0,var(--mc-notch) var(--mc-bt),calc(100% + 48px) var(--mc-bt),calc(100% + 48px) calc(100% + 64px),-48px calc(100% + 64px));
    transition:opacity .15s ease-out,transform .15s ease-out,clip-path .15s ease-out;}
  :root[data-contrast="more"] .mcart.pki-drop{--mc-bt:2px;border-top:2px solid var(--hc-fg);}
}
.mcart.pki-drop .mc-head{display:block;margin-bottom:0;}
.mcart.pki-drop .mc-h .ico,.mcart.pki-drop .mc-x{display:none;}
.mcart.pki-drop .mc-items{padding-top:0;}
.mcart.pki-drop .mc-t a:hover{text-decoration:none;}   /* hover pozycji jak w panelu Kategorii: sam kolor */
.mcart:not(.drop) .mc-b-cart,.mcart.drop .mc-b-cont{display:none;}
.mc-empty{margin:0;padding:var(--sp-2) 0 var(--sp-1);font-size:var(--fs-md);color:var(--body);}
.mc-empty ~ .mc-sum,.mc-empty ~ .mc-ship,.mc-empty ~ .mc-btns{display:none;}
.htool .car-d{display:inline-block;margin-left:3px;font-size:var(--fs-2xs);transition:transform .15s;}
.htool[aria-expanded="true"] .car-d{transform:rotate(180deg);}
@media not all and (hover:hover) and (pointer:fine){.htool .car-d{display:none;}}
@media (prefers-reduced-motion:reduce){.htool .car-d{transition:none;}}
/* ============================================================
   .pki-drop — JEDEN panel rozwijany nagłówka (Kategorie, podgląd koszyka; pkieu-v3.js PkiDrop). Szymon 21.10: „oba są
   dropdownami, a mają zupełnie inny sposób pojawiania się i stylistykę — wyrównaj do najlepszych”. Wisi pod dolną krawędzią
   paska (pełny nagłówek: spód paska menu; przypięty: spód paska), bez górnej ramki, zaokrąglony tylko u dołu (--r jak reszta
   sklepu), ramka --line i cień --sh-pop (popover, sekcja 8); pojawia się i znika tak samo: 150 ms przenikanie + 6 px zjazd
   z góry (stan .is-open). Treść pod panelem przyciemniona jednakowo (body.drop-dim .oc-ov). Tylko desktop: na mobile .mega
   to szuflada, a podgląd koszyka (.pki-drop) otwiera się wyłącznie najechaniem myszy. Na końcu pliku — wygrywa z .mcart.
   ============================================================ */
@media (min-width:861px){
  .pki-drop{background:var(--surface);border:1px solid var(--line);border-top:0;border-radius:0 0 var(--r) var(--r);box-shadow:var(--sh-pop);
    opacity:0;visibility:hidden;transform:translateY(-6px);transition:opacity .15s ease-out,transform .15s ease-out,visibility 0s linear .15s;}
  .pki-drop.is-open{opacity:1;visibility:visible;transform:none;transition:opacity .15s ease-out,transform .15s ease-out;}
  :root[data-contrast="more"] .pki-drop{border:2px solid var(--hc-fg);border-top:0;}
}
/* ============================================================
   Koszyk jako wezwanie do działania (PkiCartCta w PkiEuV3.cs, klasa .cta-{a|b|c}; Szymon 21.10: „co gdyby z cart zrobić taki
   sam czerwony kwadrat jak przy kategoriach?”). Czerwony blok = parametry .katbtn: Montserrat 700, wersaliki, --red-fill,
   kwadratowe rogi, hover --red-fill-deep; wysokość pola wyszukiwarki w tym samym rzędzie (--h-lg; przypięty pasek 40 px).
   a — zawsze blok: ikona + KOSZYK + licznik + ▾;  b — blok tylko przy niepustym koszyku (.has-items z pkieu-v3.js 5d):
   ikona + kwota (.ct-sum) + „· N” + ▾, pusty = zwykła ikona;  c — zwykła ikona, licznik i ▾ razem w czerwonym kwadraciku.
   Mobile (≤ 860, ikony bez podpisów): a / b(niepusty) = czerwony kwadrat 40×40 z białą ikoną i białym licznikiem; c = licznik
   w czerwonym kwadraciku (▾ tylko dla myszy).
   ============================================================ */
.cart-cta .ct-sum{display:none;}
@media (min-width:861px){
  .hdr-tools{grid-auto-columns:auto;}   /* kolumny jak dotąd 52 px (szerokość .htool), blok koszyka — własna szerokość */
  .hdr-tools .htool.cart-cta:is(.cta-a,.cta-b.has-items){width:auto;flex-direction:row;align-items:center;gap:9px;height:var(--h-lg);padding:0 16px;margin-left:10px;align-self:center;
    background:var(--red-fill);color:var(--on-fill);border-radius:var(--r);font-family:var(--head);font-weight:700;font-size:var(--fs-sm);line-height:1;letter-spacing:var(--ls-ui);text-transform:uppercase;white-space:nowrap;}
  .hdr-tools .htool.cart-cta:is(.cta-a,.cta-b.has-items):hover,.hdr-tools .htool.cart-cta:is(.cta-a,.cta-b.has-items)[aria-expanded="true"]{background:var(--red-fill-deep);color:var(--on-fill);}
  .hdr-tools .htool.cart-cta:is(.cta-a,.cta-b.has-items) .ico,.hdr-tools .htool.cart-cta:is(.cta-a,.cta-b.has-items):hover .ico{width:var(--ico-20);height:var(--ico-20);stroke:var(--on-fill);}
  .hdr-tools .htool.cart-cta:is(.cta-a,.cta-b.has-items)::before,.hdr-tools .htool.cart-cta:is(.cta-a,.cta-b.has-items)::after{display:none;}
  .hdr-tools .htool.cart-cta:is(.cta-a,.cta-b.has-items) .cnt{position:static;background:var(--on-fill);color:var(--red-fill);}
  .sticky .hdr-tools .htool.cart-cta:is(.cta-a,.cta-b.has-items){height:40px;}
  /* b: kwota zamiast słowa KOSZYK, liczba sztuk jako „· N” (bez kółka) */
  .hdr-tools .htool.cart-cta.cta-b.has-items .ct-l{font-size:0;letter-spacing:0;}          /* zostaje samo ▾ */
  .hdr-tools .htool.cart-cta.cta-b.has-items .ct-l .car-d{font-size:var(--fs-2xs);margin-left:0;}
  .hdr-tools .htool.cart-cta.cta-b.has-items .ct-sum{display:inline;order:1;font-size:var(--fs-md);letter-spacing:.02em;text-transform:none;font-variant-numeric:tabular-nums;}
  .hdr-tools .htool.cart-cta.cta-b.has-items .cnt{order:2;background:none;color:var(--on-fill);min-width:0;padding:0;font-size:var(--fs-md);font-weight:700;}
  .hdr-tools .htool.cart-cta.cta-b.has-items .cnt::before{content:"·";margin-right:6px;font-weight:400;}
  .hdr-tools .htool.cart-cta.cta-b.has-items .ct-l{order:3;}
  /* c: licznik + ▾ razem w czerwonym kwadraciku przy ikonie (pusty koszyk: ▾ jak dotąd przy etykiecie) */
  .hdr-tools .htool.cart-cta.cta-c.has-items .ct-l .car-d{display:none;}
  .hdr-tools .htool.cart-cta.cta-c .cnt{border-radius:var(--r);padding:0 5px;gap:3px;height:18px;}
  .hdr-tools .htool.cart-cta.cta-c .cnt::after{content:"▾";font-size:9px;display:inline-block;transition:transform .15s;}
  .hdr-tools .htool.cart-cta.cta-c[aria-expanded="true"] .cnt::after{transform:rotate(180deg);}
}
/* 861–1180 px: blok ciaśniej (wyszukiwarka w tym rzędzie i tak się zwęża — przy 1024 o ~120 px w a/b) */
@media (min-width:861px) and (max-width:1180px){
  .hdr-tools .htool.cart-cta:is(.cta-a,.cta-b.has-items){padding:0 12px;gap:7px;margin-left:6px;}
}
@media (min-width:861px) and (not ((hover:hover) and (pointer:fine))){.hdr-tools .htool.cart-cta.cta-c .cnt::after{content:none;}}
@media (max-width:860px){
  .hdr-tools .htool.cart-cta:is(.cta-a,.cta-b.has-items){background:var(--red-fill);border-radius:var(--r);}
  .hdr-tools .htool.cart-cta:is(.cta-a,.cta-b.has-items) .ico{stroke:var(--on-fill);}
  .hdr-tools .htool.cart-cta:is(.cta-a,.cta-b.has-items)::before,.hdr-tools .htool.cart-cta:is(.cta-a,.cta-b.has-items)::after{display:none;}
  .hdr-tools .htool.cart-cta:is(.cta-a,.cta-b.has-items) .cnt{background:var(--on-fill);color:var(--red-fill);}
  .hdr-tools .htool.cart-cta.cta-c .cnt{border-radius:var(--r);}
}
/* zaokrąglenie czerwonych bloków (Szymon 21.10: jak reszta przycisków i boxów motywu — token --r, jak SZUKAJ / .btn).
   Styk z panelem na desktopie: KATEGORIE w pasku menu (ta sama lewa krawędź) i Koszyk w pełnym nagłówku oraz w przypiętym
   pasku (ta sama prawa krawędź) — panel .pki-drop wisi tuż pod dolną krawędzią przycisku, bez górnej ramki i z prostymi
   górnymi rogami, więc przy otwartym dół przycisku prosty, bez szczeliny. KATEGORIE z przypiętego paska (9 px odstępu)
   i mobile (szuflada / arkusz koszyka) stykają się z niczym. */
@media (min-width:861px){
  body:not(.mega-fix) .nav .katbtn[aria-expanded="true"],
  .hdr-tools .htool.cart-cta:is(.cta-a,.cta-b.has-items)[aria-expanded="true"]{border-radius:var(--r) var(--r) 0 0;}
}
/* ============================================================
   RYTM PIONOWY STRON — raz, w layoucie (869f7deet, Szymon 21.10: „znowu wesołe odstępy”). Dotąd każdy układ i każda strona
   miały własny odstęp od paska menu (14–43 px: .center-1 / .page / .wrap po 24 px, okruszki +16, tytuły ±10) i własny ogon
   nad newsletterem (48–80 px: marginesy ostatnich akapitów, puste <p> z CMS, .pc-empty). Teraz:
   (1) --gap-top: pasek menu → pierwsza treść strony (okruszki albo tytuł) — padding <main>, jednakowo na wszystkich stronach
       (_PkiPage .wrap, _ColumnsOne .center-1, _ColumnsTwo z kolumną i bez); opakowania wewnątrz bez własnego paddingu;
   (2) --gap-sec: między sekcjami treści (48 / 32 px; ten sam token co karta produktu — #buybox-status);
   (3) treść → karta newslettera = --gap-nl liczony RAZ: padding-bottom <main>, .nlband bez własnego marginesu, ogon treści
       bez marginesów (ostatni element w łańcuchu ostatnich dzieci, puste akapity CMS). 23.10 (Szymon: zmniejszyć wszędzie):
       --gap-nl 24 / 16 px zamiast --gap-sec 48 / 32 — w skali odstępów między kartami (siatka aktualności, kafle 404 — --sp-5 /
       --sp-4), o krok większy niż newsletter → stopka (--gap-block 16 / 12), więc koniec treści dalej czyta się jako granica;
   (4) newsletter → stopka bez zmian (.foot margin-top --gap-block, #419); strona główna (newsletter jako kafel w treści, bez
       .nlband) też bez zmian na dole — tam <main> nie dostaje paddingu i stopka trzyma --gap-block.
   Na końcu pliku: wygrywa z regułami układów wyżej (ta sama lub wyższa szczegółowość, później).
   ============================================================ */
:root{--gap-top:var(--sp-6);--gap-nl:var(--sp-5);}  /* --gap-sec (48 / 32) zdefiniowany wyżej, przy PDP (#buybox-status) — jedno źródło */
@media (max-width:860px){:root{--gap-top:var(--sp-5);--gap-nl:var(--sp-4);}}
.master-wrapper-main,.master-wrapper-main:is(:has(> .side-2),:has(> .leftside-3)){padding-top:var(--gap-top);}
/* (0,4,0): wygrywa z „.master-wrapper-main > div:not(.wrap):not(.cols)” (0,3,1) i „.master-wrapper-page.one … > .wrap” (0,4,0, wcześniej) */
.master-wrapper-page .master-wrapper-main > :is(.wrap,.center-1,.center-2,.page,div):not(.side-2){padding-top:0;}
.master-wrapper-main :is(.crumbs,.breadcrumb){padding-top:0;}
.master-wrapper-page:has(> .nlband) > .master-wrapper-main{padding-bottom:var(--gap-nl);}
.master-wrapper-page > .nlband{margin-top:0;}
/* ogon treści: ostatni widoczny potomek w łańcuchu (bez skryptów i pól ukrytych) nie dokłada marginesu pod sobą */
.master-wrapper-main > :nth-last-child(1 of :not(script,style,template,link,input[type=hidden])),
.master-wrapper-main > * > :nth-last-child(1 of :not(script,style,template,link,input[type=hidden])),
.master-wrapper-main > * > * > :nth-last-child(1 of :not(script,style,template,link,input[type=hidden])),
.master-wrapper-main > * > * > * > :nth-last-child(1 of :not(script,style,template,link,input[type=hidden])),
.master-wrapper-main > * > * > * > * > :nth-last-child(1 of :not(script,style,template,link,input[type=hidden])),
.master-wrapper-main > * > * > * > * > * > :nth-last-child(1 of :not(script,style,template,link,input[type=hidden])){margin-bottom:0;}
/* puste akapity z edytora CMS (topiki, newsy, bloki tematów) — mają wyłącznie marginesy */
.master-wrapper-main p:empty{margin:0;}
