/* =========================================================
   Psycholog Michalina Wolniak — pastelowy system projektowy
   Kolory wyprowadzone z logo: szałwiowa zieleń, złoto, krem
   ========================================================= */

/* Kroje pisma wczytuje `assets/fonts/fonty.css`, podpięty w <head> każdej strony
   PRZED tym arkuszem. NIE przywracaj tutaj @import z fonts.googleapis.com:
   przy każdym wejściu przeglądarka klienta przekazywałaby Google swój adres IP,
   co jest sprzeczne z §7 Polityki prywatności (dane nie opuszczają EOG). */

/* ---------------------------------------------------------------
   KROJE ZASTĘPCZE DOPASOWANE METRYCZNIE
   ---------------------------------------------------------------
   Zanim docelowy krój się wczyta, przeglądarka rysuje tekst czcionką
   systemową. Georgia jest o ~30% SZERSZA od Cormorant Garamond (zmierzone:
   2476 px vs 1898 px dla tego samego napisu), więc nagłówki najpierw
   wyglądały na większe i cięższe, a po wczytaniu „siadały" — to właśnie
   ten ułamek sekundy pogrubienia przy odświeżaniu strony.

   `size-adjust` skaluje krój zastępczy tak, żeby zajmował dokładnie tyle
   samo miejsca co docelowy. Podmiana przestaje być widoczna.
   Przeglądarki bez obsługi size-adjust po prostu zignorują te reguły
   i zachowają się jak dotąd.

   Korekty policzone pomiarem szerokości tego samego napisu w obu krojach,
   OSOBNO DLA KAŻDEJ WAGI — jedna wspólna wartość nie wystarcza, bo różnica
   między Cormorant a Georgią rośnie wraz z grubością. */
@font-face{ font-family:'Cormorant-zapas'; src:local('Georgia'), local('Times New Roman');
  font-weight:400; size-adjust:91.4% }
@font-face{ font-family:'Cormorant-zapas'; src:local('Georgia'), local('Times New Roman');
  font-weight:500; size-adjust:91.4% }
@font-face{ font-family:'Cormorant-zapas'; src:local('Georgia'), local('Times New Roman');
  font-weight:600; size-adjust:89.1% }
@font-face{ font-family:'Cormorant-zapas'; src:local('Georgia'), local('Times New Roman');
  font-weight:700; size-adjust:89.5% }
@font-face{ font-family:'Cormorant-zapas'; src:local('Georgia Italic'), local('Georgia');
  font-style:italic; font-weight:400; size-adjust:77.2% }
@font-face{ font-family:'Cormorant-zapas'; src:local('Georgia Italic'), local('Georgia');
  font-style:italic; font-weight:500; size-adjust:77.6% }

@font-face{ font-family:'Nunito-zapas'; src:local('Segoe UI'), local('Helvetica Neue'), local('Arial');
  font-weight:300; size-adjust:91.8% }
@font-face{ font-family:'Nunito-zapas'; src:local('Segoe UI'), local('Helvetica Neue'), local('Arial');
  font-weight:400; size-adjust:102.1% }
@font-face{ font-family:'Nunito-zapas'; src:local('Segoe UI'), local('Helvetica Neue'), local('Arial');
  font-weight:600; size-adjust:103.7% }
@font-face{ font-family:'Nunito-zapas'; src:local('Segoe UI'), local('Helvetica Neue'), local('Arial');
  font-weight:700; size-adjust:105.7% }
@font-face{ font-family:'Nunito-zapas'; src:local('Segoe UI'), local('Helvetica Neue'), local('Arial');
  font-weight:800; size-adjust:107.8% }

:root{
  /* Bazowe z logo */
  --cream:        #F7F2ED;
  --cream-2:      #FBF7F2;
  --paper:        #FFFFFF;
  --sand:         #EFE6D8;

  --sage-deep:    #4C5E48;   /* litera M z logo, nagłówki */
  --sage:         #6E876180; /* nieużywane bezpośrednio */
  --sage-500:     #7C9270;
  --sage-300:     #A9BCA1;
  --sage-100:     #DCE7D6;

  --gold:         #B89B72;   /* złoty łuk z logo */
  --gold-600:     #A6875C;
  --gold-200:     #E3D3B6;

  --ink:          #3A423A;   /* tekst główny */
  --ink-soft:     #5E655C;   /* tekst pomocniczy */
  --line:         #E7DED2;   /* delikatne linie */

  /* Pastelowe akcenty sekcji */
  --blush:        #F3DDD6;
  --blush-deep:   #E6C2B7;
  --lavender:     #E3DCEC;
  --lavender-deep:#C9BEDD;
  --powder:       #D6E6E3;
  --powder-deep:  #B7D3CF;
  --peach:        #F6E6CE;
  --mint:         #E1EFDF;
  --sky:          #DCE8EF;

  --shadow-sm: 0 2px 10px rgba(76,94,72,.06);
  --shadow:    0 12px 40px -18px rgba(76,94,72,.28);
  --shadow-lg: 0 30px 70px -30px rgba(76,94,72,.4);

  --radius:   18px;
  --radius-lg:28px;
  --radius-pill:999px;

  --maxw: 1180px;
  /* Kroje zastępcze („-zapas") są dopasowane metrycznie — patrz @font-face
     wyżej. Muszą stać ZARAZ po kroju docelowym, żeby to one, a nie zwykła
     Georgia czy Segoe UI, rysowały tekst zanim wczyta się właściwy plik. */
  --font-serif: 'Cormorant Garamond', 'Cormorant-zapas', Georgia, 'Times New Roman', serif;
  --font-sans: 'Nunito Sans', 'Nunito-zapas', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;

  --ease: cubic-bezier(.22,.61,.36,1);
  --ease-out: cubic-bezier(.16,1,.3,1);

  /* Wysokość paska nagłówka — jedno źródło prawdy dla menu mobilnego,
     kotwic (scroll-margin) i elementów przyklejonych. */
  --header-h: 78px;
}

/* ---------- Reset / base ---------- */
*{box-sizing:border-box}
html{scroll-behavior:smooth; -webkit-text-size-adjust:100%}
body{
  margin:0;
  font-family:var(--font-sans);
  color:var(--ink);
  background:var(--cream);
  line-height:1.7;
  font-size:17px;
  font-weight:400;
  overflow-x:hidden;
}
img{max-width:100%; height:auto; display:block}
a{color:var(--gold-600); text-decoration:none; transition:color .2s var(--ease)}
a:hover{color:var(--sage-deep)}
h1,h2,h3,h4{font-family:var(--font-serif); color:var(--sage-deep); font-weight:600; line-height:1.12; margin:0 0 .4em; letter-spacing:.2px}
h1{font-size:clamp(2.4rem,6vw,4.2rem); font-weight:600}
h2{font-size:clamp(1.9rem,4vw,3rem)}
h3{font-size:clamp(1.35rem,2.4vw,1.85rem)}
h4{font-size:1.2rem}
p{margin:0 0 1.1em}
strong{font-weight:700; color:var(--ink)}
::selection{background:var(--sage-300); color:#fff}

.container{max-width:var(--maxw); margin:0 auto; padding:0 24px}
/* kotwice: sticky header nie zasłania celu (liczone z realnej wysokości paska) */
[id]{scroll-margin-top:calc(var(--header-h) + 18px)}
/* dostępność: widoczny focus dla klawiatury */
a:focus-visible, button:focus-visible, input:focus-visible, .nav-link:focus-visible, .method:focus-within{
  outline:3px solid var(--gold); outline-offset:2px; border-radius:6px;
}
.narrow{max-width:820px; margin-inline:auto}
.center{text-align:center}
.eyebrow{
  font-family:var(--font-sans);
  text-transform:uppercase;
  letter-spacing:.28em;
  font-size:.72rem;
  font-weight:800;
  color:var(--gold-600);
  margin:0 0 1rem;
  display:inline-block;
}
.section{padding:clamp(3.5rem,7vw,6.5rem) 0}
.section.tight{padding:clamp(2.4rem,4vw,3.6rem) 0}
.lead{font-size:1.18rem; color:var(--ink-soft)}
.muted{color:var(--ink-soft)}

/* ---------- Buttons ---------- */
.btn{
  --btn-bg:var(--sage-deep); --btn-fg:#fff; --btn-bd:var(--sage-deep);
  display:inline-flex; align-items:center; gap:.55em;
  font-family:var(--font-sans); font-weight:700; font-size:.98rem;
  letter-spacing:.02em;
  padding:.85em 1.7em;
  border-radius:var(--radius-pill);
  background:var(--btn-bg); color:var(--btn-fg);
  border:1.5px solid var(--btn-bd);
  cursor:pointer; transition:transform .25s var(--ease), box-shadow .25s var(--ease), background .25s var(--ease), color .2s var(--ease);
  box-shadow:0 10px 24px -14px rgba(76,94,72,.7);
  text-align:center;
}
.btn:hover{transform:translateY(-2px); box-shadow:0 18px 34px -14px rgba(76,94,72,.65); color:#fff}
.btn:active{transform:translateY(0)}
.btn-gold{--btn-bg:var(--gold); --btn-bd:var(--gold); color:#fff}
.btn-gold:hover{--btn-bg:var(--gold-600)}
.btn-outline{--btn-bg:transparent; --btn-fg:var(--sage-deep); --btn-bd:var(--sage-300); box-shadow:none}
.btn-outline:hover{--btn-bg:var(--sage-100); color:var(--sage-deep)}
.btn-cream{--btn-bg:#fff; --btn-fg:var(--sage-deep); --btn-bd:#fff; color:var(--sage-deep)}
.btn-cream:hover{color:var(--sage-deep)}
.btn-lg{padding:1.05em 2.2em; font-size:1.06rem}
.btn-sm{padding:.6em 1.1em; font-size:.86rem}
.btn-block{display:flex; width:100%; justify-content:center}

/* ---------- Pasek „Płatności wkrótce" ---------- */
/* Pasek pojawia się dopiero po odczytaniu trybu z serwera — łagodne wejście,
   żeby treść nie „skoczyła" w oczy. */
.pay-soon-bar{background:var(--gold-200); color:var(--gold-600); border-bottom:1px solid rgba(212,163,74,.35); font-size:.9rem}
.js .pay-soon-bar{animation:bar-in .3s var(--ease-out) both}
@keyframes bar-in{from{opacity:0} to{opacity:1}}
@media (prefers-reduced-motion:reduce){ .js .pay-soon-bar{animation:none} }
.pay-soon-bar .container{display:flex; align-items:flex-start; gap:.55rem; padding-top:.7rem; padding-bottom:.7rem}
.pay-soon-bar .pay-soon-ico{flex-shrink:0; font-size:1.05rem; line-height:1.4}
.pay-soon-bar a{color:inherit; font-weight:700; text-decoration:underline}
.pay-soon-bar b{font-weight:800}
/* Wariant „tryb testowy" — inny kolor niż „wkrótce", żeby był rozróżnialny */
.pay-demo-bar{background:var(--powder); color:#2f5b56; border-bottom-color:rgba(63,117,112,.35)}
/* Ceny testowe (tryb groszowy) — celowo alarmowy, mocniejszy niż pasek trybu
   testowego: to jedyny stan, w którym klient może kupić materiał za grosze. */
.pay-test-bar{background:#fdecec; color:#8a1c1c; border-bottom-color:rgba(138,28,28,.35)}

/* ---------- Header / Nav ---------- */
.site-header{
  position:sticky; top:0; z-index:100;
  background:rgba(247,242,237,.82);
  backdrop-filter:saturate(140%) blur(14px);
  -webkit-backdrop-filter:saturate(140%) blur(14px);
  border-bottom:1px solid rgba(231,222,210,.8);
  transition:box-shadow .3s var(--ease), background .3s var(--ease);
}
.site-header.scrolled{box-shadow:0 6px 24px -18px rgba(76,94,72,.5); background:rgba(247,242,237,.95)}
.nav{display:flex; align-items:center; justify-content:space-between; gap:1.2rem; height:var(--header-h)}
/* min-width:0 + możliwość kurczenia się są KLUCZOWE: bez nich nagłówek wymuszał
   minimalną szerokość całej strony (~474 px) i telefony pomniejszały widok. */
.brand{display:flex; align-items:center; gap:.7rem; flex:0 1 auto; min-width:0}
.brand img{width:46px; height:46px; object-fit:contain; flex-shrink:0}
.brand .wordmark{display:flex; flex-direction:column; line-height:1; min-width:0}
.brand .wordmark b{font-family:var(--font-serif); font-weight:600; font-size:1.22rem; color:var(--sage-deep); letter-spacing:.3px;
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis}
.brand .wordmark span{font-size:.62rem; letter-spacing:.32em; text-transform:uppercase; color:var(--gold-600); font-weight:700; margin-top:2px;
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis}

.nav-menu{display:flex; align-items:center; gap:.35rem; list-style:none; margin:0; padding:0}
.mobile-cta-li, .mobile-auth-li{display:none}
.nav-menu > li{position:relative}
.nav-link{
  display:inline-flex; align-items:center; gap:.35em;
  padding:.6em .9em; border-radius:var(--radius-pill);
  color:var(--ink); font-weight:600; font-size:.96rem; cursor:pointer;
  transition:background .2s var(--ease), color .2s var(--ease);
  white-space:nowrap; background:none; border:none; font-family:inherit;
}
.nav-link:hover,.nav-link:focus{background:var(--sage-100); color:var(--sage-deep)}
.nav-menu li.active > .nav-link{color:var(--sage-deep); background:var(--sage-100)}
.nav-link .caret{width:9px; height:9px; border-right:2px solid currentColor; border-bottom:2px solid currentColor; transform:rotate(45deg); margin-top:-3px; transition:transform .25s var(--ease); opacity:.65}
.has-dropdown:hover .caret, .has-dropdown.open .caret, .has-dropdown:focus-within .caret{transform:rotate(225deg); margin-top:2px}

.dropdown{
  position:absolute; top:calc(100% + 10px); left:50%; transform:translateX(-50%) translateY(8px);
  min-width:264px; background:var(--paper);
  border:1px solid var(--line); border-radius:var(--radius);
  box-shadow:var(--shadow); padding:.5rem;
  opacity:0; visibility:hidden; pointer-events:none;
  transition:opacity .22s var(--ease), transform .22s var(--ease);
}
.has-dropdown:hover .dropdown, .has-dropdown.open .dropdown, .has-dropdown:focus-within .dropdown{opacity:1; visibility:visible; pointer-events:auto; transform:translateX(-50%) translateY(0)}
.dropdown::before{content:""; position:absolute; top:-14px; left:0; right:0; height:14px}
.dropdown a{
  display:flex; flex-direction:column; gap:2px;
  padding:.6rem .8rem; border-radius:12px; color:var(--ink);
}
.dropdown a:hover{background:var(--sage-100)}
.dropdown a b{font-family:var(--font-sans); font-weight:700; font-size:.96rem; color:var(--sage-deep)}
.dropdown a small{color:var(--ink-soft); font-size:.8rem; font-weight:400}

.nav-cta{display:flex; align-items:center; gap:.6rem; flex-shrink:0}
/* Hamburger → X. Odstęp paskrów ustawiamy przez `gap`, a NIE przez margin:
   w kontenerze flex marginesy się nie scalają, więc margin 5px dawałby odstęp
   12 px zamiast 7 px i ramiona X mijałyby się zamiast łączyć.
   Zależność jest sztywna: przesunięcie = wysokość paska + gap = 2 + 5 = 7 px. */
.nav-toggle{display:none; background:none; border:none; cursor:pointer; padding:10px; border-radius:12px;
  min-width:44px; min-height:44px; align-items:center; justify-content:center; flex-direction:column; gap:5px}
.nav-toggle span{display:block; width:24px; height:2px; background:var(--sage-deep); border-radius:2px; margin:0; transition:.3s var(--ease)}
.nav-toggle.open span:nth-child(1){transform:translateY(7px) rotate(45deg)}
.nav-toggle.open span:nth-child(2){opacity:0}
.nav-toggle.open span:nth-child(3){transform:translateY(-7px) rotate(-45deg)}

/* ---------- Wejście nagłówka ----------
   Nagłówek składa skrypt (buildHeader), więc animacje ruszają dokładnie w chwili,
   gdy pasek trafia do dokumentu — nie trzeba ich niczym wyzwalać ani pilnować
   kolejnością. Gatujemy je klasą `.js` na <html>, tak samo jak pasek promo:
   bez skryptu nagłówka i tak nie ma, więc reguła nie zostawia nic ukrytego.
   Kolejność czyta się od lewej do prawej, tak jak wzrok po pasku:
   tło paska → znak firmowy → nazwa → pozycje menu → przycisk zakupu → złota nitka.

   Wszędzie `backwards`, a NIE `both`. Klatka końcowa każdej z tych animacji to
   stan naturalny elementu (opacity:1, transform:none), więc zatrzymywanie go
   przez `forwards` nic nie daje, a szkodzi: właściwości pod kontrolą animacji
   wygrywają w kaskadzie z zwykłymi deklaracjami, przez co `transform` zostałby
   zablokowany na stałe i podniesienie logo kursorem (niżej) przestałoby działać.
   `backwards` nakłada za to klatkę POCZĄTKOWĄ już w trakcie opóźnienia — bez tego
   elementy mignęłyby w pełnej widoczności, zanim ruszy ich animacja. */
.js .site-header{animation:header-in .58s var(--ease-out) .12s backwards}
@keyframes header-in{from{opacity:0; transform:translate3d(0,-14px,0)} to{opacity:1; transform:none}}

/* Znak firmowy dobija na miejsce lekkim obrotem. To jedyny element nagłówka,
   który może sobie pozwolić na skalowanie bez rozpychania układu — ma sztywne
   46×46 px, więc sąsiedzi nie drgną. */
.js .site-header .brand img{animation:header-mark-in .7s var(--ease-out) .24s backwards}
@keyframes header-mark-in{from{opacity:0; transform:scale(.68) rotate(-10deg)} to{opacity:1; transform:none}}

/* Nazwa i podtytuł wysuwają się spod znaku, jedno po drugim. */
.js .site-header .brand .wordmark b{animation:header-brand-in .6s var(--ease-out) .32s backwards}
.js .site-header .brand .wordmark > span{animation:header-brand-in .6s var(--ease-out) .4s backwards}
@keyframes header-brand-in{from{opacity:0; transform:translate3d(-12px,0,0)} to{opacity:1; transform:none}}

@keyframes header-item-in{from{opacity:0; transform:translate3d(0,-9px,0)} to{opacity:1; transform:none}}
/* Pozycje menu wchodzą kaskadą — ale TYLKO na szerokich ekranach. Na wąskich
   `.nav-menu` jest schowane i ma własne wejście przy rozwijaniu (menu-item-in),
   więc druga animacja tylko by z nim kolidowała.
   Kaskada startuje od nth-child(2), bo pierwszym dzieckiem listy jest zawsze
   `li.mobile-auth-li` — na desktopie ukryte, więc pierwsza WIDOCZNA pozycja to
   dopiero druga w kolejności. */
@media (min-width:981px){
  .js .site-header .nav-menu > li{animation:header-item-in .5s var(--ease-out) backwards}
  .js .site-header .nav-menu > li:nth-child(2){animation-delay:.28s}
  .js .site-header .nav-menu > li:nth-child(3){animation-delay:.34s}
  .js .site-header .nav-menu > li:nth-child(4){animation-delay:.4s}
  .js .site-header .nav-menu > li:nth-child(5){animation-delay:.46s}
  .js .site-header .nav-menu > li:nth-child(6){animation-delay:.52s}
  .js .site-header .nav-menu > li:nth-child(n+7){animation-delay:.58s}
}

/* Przycisk zakupu, stan zalogowania i hamburger — wspólne, delikatne dojście. */
.js .site-header .nav-cta{animation:header-cta-in .55s var(--ease-out) .48s backwards}
@keyframes header-cta-in{from{opacity:0; transform:scale(.92)} to{opacity:1; transform:none}}

/* Złota nitka przeciera się pod paskiem i gaśnie — jednorazowy akcent domykający
   wejście. `bottom:-1px` kładzie ją dokładnie na istniejącej krawędzi, więc nic
   nie urasta i układ się nie rusza. Tutaj `both`, bo klatka końcowa (opacity:0)
   NIE jest stanem naturalnym — bez zatrzymania nitka zostałaby na stałe. */
.js .site-header::after{
  content:""; position:absolute; left:0; right:0; bottom:-1px; height:1px;
  pointer-events:none; opacity:0;
  background:linear-gradient(90deg, transparent, var(--gold), transparent);
  animation:header-line 1.5s var(--ease-out) .52s both;
}
@keyframes header-line{
  0%{transform:scaleX(0); opacity:0}
  30%{opacity:1}
  65%{transform:scaleX(1); opacity:1}
  100%{transform:scaleX(1); opacity:0}
}

/* Drobiazg pod kursorem: znak firmowy odchyla się i lekko rośnie. */
.brand img{transition:transform .45s var(--ease-out)}
.brand:hover img{transform:rotate(-6deg) scale(1.06)}

/* ---------- Hero ---------- */
.hero{position:relative; overflow:hidden; padding:clamp(3rem,7vw,6rem) 0 clamp(3.5rem,7vw,6rem)}
.hero-bg{position:absolute; inset:0; z-index:-1;
  background:
    radial-gradient(60% 55% at 82% 12%, rgba(211,195,160,.35), transparent 60%),
    radial-gradient(50% 50% at 8% 88%, rgba(169,188,161,.35), transparent 60%),
    radial-gradient(45% 40% at 50% 0%, rgba(243,221,214,.35), transparent 70%),
    var(--cream);
}
.hero-grid{display:grid; grid-template-columns:1.05fr .95fr; gap:clamp(2rem,4vw,4rem); align-items:center}
.hero-copy h1{margin-bottom:.3em}
.hero-copy h1 em{font-style:italic; color:var(--gold-600)}
.hero-sub{font-size:1.22rem; color:var(--ink-soft); max-width:34ch}
.hero-actions{display:flex; flex-wrap:wrap; gap:.9rem; margin-top:2rem}
.hero-badges{display:flex; flex-wrap:wrap; gap:1.4rem; margin-top:2.4rem; padding-top:1.8rem; border-top:1px solid var(--line)}
.hero-badge{display:flex; flex-direction:column}
.hero-badge b{font-family:var(--font-serif); font-size:2rem; color:var(--sage-deep); line-height:1}
.hero-badge span{font-size:.82rem; color:var(--ink-soft); letter-spacing:.02em}

.hero-visual{position:relative}
.hero-visual .logo-frame{
  background:var(--cream-2);
  border-radius:var(--radius-lg);
  padding:clamp(1.4rem,3vw,2.6rem);
  box-shadow:var(--shadow-lg);
  border:1px solid var(--line);
  position:relative;
}
.hero-visual .logo-frame img{margin:0 auto; max-width:88%}
.float-chip{
  position:absolute; background:var(--paper); border-radius:var(--radius-pill);
  padding:.55rem 1.05rem; box-shadow:var(--shadow); font-weight:700; font-size:.88rem;
  color:var(--sage-deep); display:flex; align-items:center; gap:.5em; border:1px solid var(--line);
}
.float-chip .dot{width:9px;height:9px;border-radius:50%}
.float-chip.c1{top:6%; left:-6%; animation:floaty 6s ease-in-out infinite}
.float-chip.c2{top:8%; right:-5%; animation:floaty 7s ease-in-out infinite .6s}
.float-chip.c3{bottom:-3%; left:14%; animation:floaty 8s ease-in-out infinite 1.2s}
@keyframes floaty{0%,100%{transform:translateY(0)}50%{transform:translateY(-10px)}}
@media (prefers-reduced-motion:reduce){.float-chip{animation:none}}

/* ---------- Promo strip / marquee ---------- */
.promo-strip{background:var(--sage-deep); color:#fff; overflow:hidden; position:relative}
.promo-track{display:flex; gap:3rem; white-space:nowrap; padding:.85rem 0; animation:marquee 32s linear infinite; width:max-content}
.promo-track span{font-weight:700; letter-spacing:.04em; font-size:.95rem; display:inline-flex; align-items:center; gap:1rem; color:#f3ede4}
.promo-track span::before{content:"✦"; color:var(--gold-200)}
@keyframes marquee{from{transform:translateX(0)}to{transform:translateX(-50%)}}
.promo-strip:hover .promo-track{animation-play-state:paused}
@media (prefers-reduced-motion:reduce){.promo-track{animation:none}}

/* ---------- Cards / grids ---------- */
.grid{display:grid; gap:1.6rem}
.g-2{grid-template-columns:repeat(2,1fr)}
.g-3{grid-template-columns:repeat(3,1fr)}
.g-4{grid-template-columns:repeat(4,1fr)}

.tile{
  background:var(--paper); border:1px solid var(--line); border-radius:var(--radius);
  padding:1.8rem; box-shadow:var(--shadow-sm);
  transition:transform .3s var(--ease), box-shadow .3s var(--ease), border-color .3s var(--ease);
  position:relative; overflow:hidden;
}
.tile:hover{transform:translateY(-5px); box-shadow:var(--shadow); border-color:var(--sage-300)}
.tile .ico{width:56px; height:56px; border-radius:16px; display:grid; place-items:center; margin-bottom:1.1rem; font-size:1.6rem; background:var(--sage-100)}
.tile h3{margin-bottom:.4rem}
.tile p{color:var(--ink-soft); font-size:.98rem; margin-bottom:0}
.tile .tile-link{display:inline-flex; align-items:center; gap:.4em; margin-top:1.1rem; font-weight:700; color:var(--gold-600); font-size:.95rem}
.tile .tile-link::after{content:"→"; transition:transform .25s var(--ease)}
.tile:hover .tile-link::after{transform:translateX(4px)}

/* Section landing cards with pastel headers */
.portal{
  border-radius:var(--radius-lg); overflow:hidden; background:var(--paper);
  border:1px solid var(--line); box-shadow:var(--shadow-sm);
  display:flex; flex-direction:column; transition:transform .3s var(--ease), box-shadow .3s var(--ease)}
.portal:hover{transform:translateY(-6px); box-shadow:var(--shadow)}
.portal-head{padding:2.2rem 2rem 1.6rem; position:relative}
.portal-head h3{color:var(--sage-deep)}
.portal.parents .portal-head{background:linear-gradient(135deg,var(--blush),var(--peach))}
.portal.therapists .portal-head{background:linear-gradient(135deg,var(--powder),var(--sage-100))}
.portal-body{padding:1.6rem 2rem 2rem; display:flex; flex-direction:column; gap:.8rem; flex:1}
.portal-body ul{margin:0 0 1.2rem; padding-left:1.1rem; color:var(--ink-soft)}
.portal-body ul li{margin-bottom:.4rem}
.portal-body .btn{margin-top:auto}

/* ---------- Badges / chips ---------- */
.chip{display:inline-flex; align-items:center; gap:.4em; font-size:.76rem; font-weight:700;
  padding:.34em .8em; border-radius:var(--radius-pill); background:var(--sage-100); color:var(--sage-deep); letter-spacing:.01em}
.chip.gold{background:var(--gold-200); color:var(--gold-600)}
.chip.blush{background:var(--blush); color:#a06a5c}
.chip.lav{background:var(--lavender); color:#6d5f8c}
.chip.powder{background:var(--powder); color:#3f7570}
.chip.peach{background:var(--peach); color:#a9803f}
.badge-age{font-size:.72rem; font-weight:800; color:var(--gold-600); letter-spacing:.04em}

/* ---------- Product card (karty pracy thumbnails) ---------- */
.card-thumb{
  background:var(--paper); border:1px solid var(--line); border-radius:var(--radius);
  overflow:hidden; box-shadow:var(--shadow-sm); display:flex; flex-direction:column;
  transition:transform .3s var(--ease), box-shadow .3s var(--ease), border-color .3s var(--ease)}
.card-thumb:hover{transform:translateY(-6px); box-shadow:var(--shadow); border-color:var(--sage-300)}
.card-thumb .thumb-art{aspect-ratio:1/1.25; position:relative; overflow:hidden}
.card-thumb .thumb-art svg{width:100%; height:100%; display:block}
.card-thumb .thumb-meta{padding:1rem 1.15rem 1.25rem}
.card-thumb .thumb-meta h4{font-family:var(--font-serif); font-size:1.22rem; margin:0 0 .35rem; color:var(--sage-deep)}
.card-thumb .thumb-tags{display:flex; flex-wrap:wrap; gap:.4rem; margin-top:.6rem}
.thumb-nurt{font-size:.74rem; font-weight:700; color:var(--gold-600); text-transform:uppercase; letter-spacing:.08em}

/* ---------- Pricing / product hero ---------- */
.product{
  display:grid; grid-template-columns:1.1fr .9fr; gap:clamp(2rem,4vw,3.5rem); align-items:center;
  background:linear-gradient(160deg,var(--cream-2),var(--sand));
  border:1px solid var(--line); border-radius:var(--radius-lg);
  padding:clamp(2rem,4vw,3.4rem); box-shadow:var(--shadow);
}
.price-box{background:var(--paper); border-radius:var(--radius-lg); padding:2.2rem; box-shadow:var(--shadow); border:1px solid var(--line); text-align:center}
.price-box .price{font-family:var(--font-serif); font-size:4rem; color:var(--sage-deep); line-height:1; font-weight:600}
.price-box .price small{font-size:1.3rem; color:var(--ink-soft)}
.price-box .was{color:var(--ink-soft); text-decoration:line-through; font-size:1.1rem}
.price-box ul{list-style:none; margin:1.4rem 0; padding:0; text-align:left}
.price-box ul li{padding:.5rem 0 .5rem 1.9rem; position:relative; border-bottom:1px dashed var(--line); font-size:.96rem}
.price-box ul li:last-child{border-bottom:none}
.price-box ul li::before{content:"✓"; position:absolute; left:0; top:.5rem; width:1.3rem; height:1.3rem; background:var(--sage-100); color:var(--sage-deep); border-radius:50%; display:grid; place-items:center; font-size:.75rem; font-weight:800}

/* ---------- Feature list / science ---------- */
.feature-row{display:grid; grid-template-columns:repeat(3,1fr); gap:1.6rem}
.feature{background:var(--paper); border:1px solid var(--line); border-radius:var(--radius); padding:1.7rem; box-shadow:var(--shadow-sm)}
.feature .ico{font-size:1.7rem; margin-bottom:.7rem}
.feature h4{margin-bottom:.35rem}
.feature p{font-size:.95rem; color:var(--ink-soft); margin:0}

/* ---------- Nurt pills / stats ---------- */
.nurt-cloud{display:flex; flex-wrap:wrap; gap:.7rem; justify-content:center}
.nurt-pill{background:var(--paper); border:1px solid var(--line); border-radius:var(--radius-pill);
  padding:.55em 1.15em; font-weight:700; color:var(--sage-deep); font-size:.92rem; box-shadow:var(--shadow-sm)}
.nurt-pill b{color:var(--gold-600)}

.stat-row{display:grid; grid-template-columns:repeat(4,1fr); gap:1.2rem; text-align:center}
.stat{background:var(--paper); border:1px solid var(--line); border-radius:var(--radius); padding:1.6rem 1rem; box-shadow:var(--shadow-sm)}
.stat b{display:block; font-family:var(--font-serif); font-size:2.8rem; color:var(--sage-deep); line-height:1}
.stat span{font-size:.86rem; color:var(--ink-soft)}

/* ---------- About ---------- */
.about-grid{display:grid; grid-template-columns:.85fr 1.15fr; gap:clamp(2rem,4vw,3.5rem); align-items:start}
.about-photo{position:relative}
.about-photo img{width:100%; aspect-ratio:4/5; object-fit:cover; object-position:50% 18%; border-radius:var(--radius-lg); box-shadow:var(--shadow-lg); border:6px solid #fff}
.about-photo .frame-tag{position:absolute; bottom:-18px; left:50%; transform:translateX(-50%);
  background:var(--paper); border:1px solid var(--line); border-radius:var(--radius-pill);
  padding:.6rem 1.3rem; box-shadow:var(--shadow); font-weight:700; color:var(--sage-deep); font-size:.9rem; white-space:nowrap}
.about-body h2{margin-bottom:.6rem}
.creds{display:flex; flex-direction:column; gap:.8rem; margin:1.8rem 0}
.cred{display:flex; gap:.9rem; align-items:flex-start; background:var(--paper); border:1px solid var(--line); border-radius:14px; padding:1rem 1.2rem; box-shadow:var(--shadow-sm)}
.cred .ci{flex-shrink:0; width:38px; height:38px; border-radius:11px; background:var(--sage-100); display:grid; place-items:center; font-size:1.1rem}
.cred b{display:block; color:var(--sage-deep)}
.cred span{font-size:.9rem; color:var(--ink-soft)}

/* ---------- Book list ---------- */
.books{display:grid; grid-template-columns:repeat(2,1fr); gap:1.3rem}
.book{display:flex; gap:1.1rem; background:var(--paper); border:1px solid var(--line); border-radius:var(--radius); padding:1.3rem; box-shadow:var(--shadow-sm); transition:transform .25s var(--ease), box-shadow .25s var(--ease)}
.book:hover{transform:translateY(-3px); box-shadow:var(--shadow)}
.book .cover{flex-shrink:0; width:74px; height:104px; border-radius:8px; box-shadow:var(--shadow-sm); display:grid; place-items:center; text-align:center; padding:.4rem; color:#fff; font-family:var(--font-serif); font-weight:600; font-size:.8rem; line-height:1.15}
.book .b-info{display:flex; flex-direction:column}
.book .b-info b{color:var(--sage-deep); font-size:1.02rem; font-family:var(--font-serif); font-size:1.2rem; line-height:1.15}
.book .b-info .author{color:var(--gold-600); font-weight:700; font-size:.84rem; margin:.15rem 0 .5rem}
.book .b-info p{font-size:.9rem; color:var(--ink-soft); margin:0}

/* ---------- Ideas (pomysły) ---------- */
.idea{background:var(--paper); border:1px solid var(--line); border-radius:var(--radius); padding:1.6rem; box-shadow:var(--shadow-sm); border-left:4px solid var(--sage-300)}
.idea .idea-cat{font-size:.74rem; font-weight:800; letter-spacing:.14em; text-transform:uppercase; color:var(--gold-600)}
.idea h4{margin:.4rem 0 .5rem}
.idea p{font-size:.95rem; color:var(--ink-soft); margin:0}

/* ---------- Accordion (categories) ---------- */
.accordion{display:flex; flex-direction:column; gap:.8rem}
.acc-item{background:var(--paper); border:1px solid var(--line); border-radius:var(--radius); overflow:hidden; box-shadow:var(--shadow-sm)}
.acc-head{display:flex; align-items:center; justify-content:space-between; gap:1rem; padding:1.15rem 1.4rem; cursor:pointer; user-select:none}
.acc-head:hover{background:var(--cream-2)}
.acc-head .acc-title{display:flex; align-items:center; gap:.8rem; font-family:var(--font-serif); font-size:1.25rem; color:var(--sage-deep)}
.acc-head .acc-count{font-size:.82rem; font-weight:700; color:var(--ink-soft); background:var(--sage-100); padding:.2em .7em; border-radius:var(--radius-pill)}
.acc-head .acc-arrow{margin-left:auto; width:11px; height:11px; border-right:2px solid var(--gold-600); border-bottom:2px solid var(--gold-600); transform:rotate(45deg); transition:transform .3s var(--ease)}
.acc-item.open .acc-arrow{transform:rotate(225deg)}
.acc-body{max-height:0; overflow:hidden; transition:max-height .4s var(--ease)}
.acc-body-inner{padding:.4rem 1.4rem 1.4rem}
.acc-list{display:grid; grid-template-columns:repeat(2,1fr); gap:.5rem .4rem}
.acc-list .ci-row{display:flex; align-items:baseline; gap:.6rem; padding:.45rem .2rem; border-bottom:1px dashed var(--line)}
.acc-list .ci-row .cn{font-weight:700; color:var(--ink)}
.acc-list .ci-row .cm{margin-left:auto; font-size:.78rem; color:var(--ink-soft); white-space:nowrap}
.acc-list .ci-row .ct{font-size:.68rem; font-weight:800; text-transform:uppercase; letter-spacing:.05em; padding:.15em .5em; border-radius:6px}
.ct.karta{background:var(--powder); color:#3f7570}
.ct.plansza{background:var(--peach); color:#a9803f}
.ct.gra{background:var(--lavender); color:#6d5f8c}
.ct.karty{background:var(--blush); color:#a06a5c}
.ct.dom{background:var(--mint); color:#4d7a4a}

/* ---------- Banner / CTA blocks ---------- */
.cta-band{background:linear-gradient(135deg,var(--sage-deep),#3c4d39); color:#fff; border-radius:var(--radius-lg); padding:clamp(2.4rem,5vw,4rem); text-align:center; position:relative; overflow:hidden; box-shadow:var(--shadow-lg)}
.cta-band::before,.cta-band::after{content:""; position:absolute; border-radius:50%; opacity:.14}
.cta-band::before{width:260px; height:260px; background:var(--gold-200); top:-90px; right:-60px}
.cta-band::after{width:200px; height:200px; background:var(--sage-300); bottom:-80px; left:-40px}
.cta-band h2{color:#fff; position:relative}
.cta-band p{color:rgba(255,255,255,.82); position:relative; max-width:56ch; margin-inline:auto}
.cta-band .btn{position:relative}

.quote-band{background:var(--cream-2); border-top:1px solid var(--line); border-bottom:1px solid var(--line)}
.quote{font-family:var(--font-serif); font-style:italic; font-size:clamp(1.5rem,3vw,2.2rem); color:var(--sage-deep); text-align:center; max-width:22ch; margin:0 auto; line-height:1.3}
.quote + .quote-by{text-align:center; color:var(--gold-600); font-weight:700; letter-spacing:.1em; text-transform:uppercase; font-size:.78rem; margin-top:1.2rem}

/* ---------- Callout / info box ---------- */
.callout{background:var(--sage-100); border-radius:var(--radius); padding:1.4rem 1.6rem; border-left:4px solid var(--sage-500); color:var(--ink)}
.callout.gold{background:var(--gold-200); border-left-color:var(--gold)}
.callout.blush{background:var(--blush); border-left-color:var(--blush-deep)}
.callout b{color:var(--sage-deep)}

/* ---------- Footer ---------- */
.site-footer{background:#41513d; color:#e8e2d6; padding:clamp(3rem,5vw,4.5rem) 0 2rem; margin-top:4rem}
.site-footer a{color:#d9cfa9}
.site-footer a:hover{color:#fff}
.footer-grid{display:grid; grid-template-columns:1.6fr 1fr 1fr 1.2fr; gap:2rem}
.footer-brand img{width:58px; height:58px; object-fit:contain; margin-bottom:1rem; background:var(--cream); border-radius:16px; padding:7px; box-shadow:var(--shadow-sm)}
.footer-brand p{color:rgba(232,226,214,.72); font-size:.94rem; max-width:34ch}
.footer-company{color:rgba(232,226,214,.55); font-size:.82rem; line-height:1.6; margin-top:.6rem}
.footer-bottom a{color:rgba(232,226,214,.82); text-decoration:underline}
.footer-bottom a:hover{color:#f3eddf}
.footer-col h5{font-family:var(--font-sans); text-transform:uppercase; letter-spacing:.16em; font-size:.74rem; color:var(--gold-200); margin:0 0 1rem; font-weight:800}
.footer-col ul{list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:.55rem}
.footer-col ul a{color:rgba(232,226,214,.85); font-size:.94rem}
/* Metody płatności w stopce.
   Logotypy kart muszą stać na jasnym tle (organizacje płatnicze nie pozwalają
   zmieniać ich kolorów), ale białe tło NIE może rozlewać się na całą szerokość
   stopki — wtedy mała grafika pływa w wielkiej białej płycie, która przyciąga
   wzrok bardziej niż cokolwiek innego. Dlatego: podpis zostaje na zielonym tle
   stopki, a same logotypy dostają zwartą plakietkę dopasowaną do obrazka. */
.footer-pay{
  margin-top:2.4rem; display:flex; flex-direction:column;
  align-items:center; gap:.65rem; text-align:center;
}
.footer-pay-label{font-size:.82rem; color:rgba(232,226,214,.72)}
.footer-pay-card{
  display:inline-block; max-width:100%; line-height:0;
  background:#fff; border-radius:14px; padding:.5rem .7rem;
  box-shadow:0 8px 22px -12px rgba(0,0,0,.55);
}
/* KLUCZOWE dla ostrości: plik ma 800 px szerokości, a pokazujemy go najwyżej
   w 500 px. Zapas pikseli sprawia, że na ekranach o dużej gęstości (telefony,
   laptopy z ekranem Retina) logotypy nie są rozmyte. Wyświetlenie 1:1 dawało
   widoczną pikselozę. Nie zwiększaj tej wartości bez większego pliku. */
.footer-pay-card img{width:400px; max-width:100%; height:auto}
.footer-bottom{margin-top:1.6rem; padding-top:1.6rem; border-top:1px solid rgba(255,255,255,.12); display:flex; justify-content:space-between; flex-wrap:wrap; gap:1rem; font-size:.84rem; color:rgba(232,226,214,.6)}

/* ---------- Page hero (subpages) ---------- */
.page-hero{padding:clamp(2.6rem,5vw,4.2rem) 0 clamp(2rem,4vw,3rem); text-align:center; position:relative; overflow:hidden}
.page-hero .hero-bg{position:absolute}
.breadcrumb{font-size:.82rem; color:var(--ink-soft); margin-bottom:.6rem; letter-spacing:.02em}
.breadcrumb a{color:var(--gold-600); font-weight:700}

/* ---------- Utilities ---------- */
.mt-1{margin-top:.6rem}.mt-2{margin-top:1.2rem}.mt-3{margin-top:2rem}.mt-4{margin-top:3rem}
.mb-0{margin-bottom:0}

/* =========================================================
   ANIMACJE WEJŚCIA
   Zasady: animujemy wyłącznie transform i opacity (płynne 60 fps także na
   telefonie), czasy krótkie, opóźnienia kaskady małe — treść pojawia się
   od razu po wejściu w kadr. Elementy chowamy TYLKO gdy działa JavaScript
   (klasa .js na <html>), więc bez skryptu strona jest w pełni widoczna.
   ========================================================= */
.js .reveal{
  opacity:0;
  transform:translate3d(0,24px,0);
  transition:opacity .62s var(--ease-out) var(--reveal-delay,0ms),
             transform .62s var(--ease-out) var(--reveal-delay,0ms);
}
.js .reveal.in{opacity:1; transform:none}
/* Warianty kierunkowe — nadawane atrybutem data-anim. */
.js .reveal[data-anim="left"]{transform:translate3d(-30px,0,0)}
.js .reveal[data-anim="right"]{transform:translate3d(30px,0,0)}
/* Sekcje przycinają poziomo, żeby element odjeżdżający w bok na czas animacji
   nie tworzył paska przewijania. „clip" (w odróżnieniu od „hidden") nie robi
   z sekcji kontenera przewijania, więc elementy przyklejone dalej działają. */
.section, .hero, .page-hero{overflow-x:clip}
.js .reveal[data-anim="zoom"]{transform:scale(.93)}
.js .reveal[data-anim="rise"]{transform:translate3d(0,42px,0) scale(.97)}
.js .reveal[data-anim="left"].in,
.js .reveal[data-anim="right"].in,
.js .reveal[data-anim="zoom"].in,
.js .reveal[data-anim="rise"].in{transform:none}

/* Nagłówki sekcji: delikatne odsłonięcie maską zamiast zwykłego przesunięcia. */
.js .reveal[data-anim="mask"]{opacity:1; transform:none; clip-path:inset(0 0 102% 0)}
.js .reveal[data-anim="mask"].in{clip-path:inset(0 0 -2% 0); transition:clip-path .85s var(--ease-out) var(--reveal-delay,0ms)}

/* =========================================================
   WEJŚCIE STRONY GŁÓWNEJ
   Widoczne od razu po otwarciu, bez czekania na przewijanie.
   Wszystko na transform/opacity/clip-path — układ się nie przesuwa,
   a tekst jest czytelny już po ~0,4 s.
   ========================================================= */

/* Klasę `intro-anim` nadaje skrypt blokowi z głównym nagłówkiem strony —
   zarówno na stronie głównej (.hero-copy), jak i na podstronach (.page-hero
   i inne układy). Dzięki temu ten sam efekt działa wszędzie. */

/* Zapobiega MIGNIĘCIU nagłówka. Przeglądarka maluje treść na długo przed
   `DOMContentLoaded`, a podziału na słowa dokonuje dopiero skrypt — bez tej
   reguły nagłówek pojawiał się najpierw jako zwykły tekst, po podziale znikał
   (słowa mają opacity:0) i dopiero wjeżdżał animacją. Zmierzone przy dławieniu
   procesora 6x: od 117 ms na logowaniu do 1400 ms na stronie głównej.
   Klasę `intro-pending` nadaje skrypt w <head>, a zdejmuje ją site.js, gdy
   nagłówek jest już przygotowany. Używamy `visibility`, nie `opacity`, bo
   zachowuje układ strony — nie powstaje żaden skok treści (CLS = 0).
   `intro-ratunek` odsłania nagłówek nawet wtedy, gdy site.js w ogóle się nie
   wykona; bez tego awaria skryptu ukryłaby tekst na stałe. */
.js.intro-pending h1,
.js.intro-pending .page-hero .eyebrow,
.js.intro-pending .hero .eyebrow{
  visibility:hidden;
  animation:intro-ratunek 0s linear 1.5s forwards;
}
@keyframes intro-ratunek{to{visibility:visible}}

/* Nadtytuł odsłania się przetarciem od lewej (nie zmienia rozmiaru — zero skoków). */
.js .intro-anim .eyebrow{clip-path:inset(0 100% 0 0)}
.js .intro-anim.hero-go .eyebrow{
  clip-path:inset(0 -4% 0 0);
  transition:clip-path .8s var(--ease-out) .08s;
}

/* Nagłówek wchodzi słowo po słowie. Podział na słowa robi skrypt;
   bez skryptu nagłówek jest normalnie widoczny. */
/* Rozmycie podane w `em`, a nie w pikselach — skaluje się razem z wielkością
   nagłówka, więc efekt wygląda tak samo na laptopie (nagłówek ~67 px → ~8 px
   rozmycia) i na telefonie (~38 px → ~4,6 px). Stała wartość 8 px byłaby na
   telefonie proporcjonalnie dwa razy mocniejsza. */
.js .intro-anim h1 .word{
  display:inline-block;
  opacity:0;
  transform:translate3d(0,.4em,0) scale(.965);
  filter:blur(.12em);
  transition:opacity .7s var(--ease-out) var(--d,0ms),
             transform .7s var(--ease-out) var(--d,0ms),
             filter .7s var(--ease-out) var(--d,0ms);
}
.js .intro-anim.hero-go h1 .word{opacity:1; transform:none; filter:blur(0)}
/* Wyróżniony fragment „rozświetla się" na złoto, gdy słowa już wylądują. */
.js .intro-anim h1 em .word{color:var(--sage-deep)}
.js .intro-anim.hero-go h1 em .word{
  color:var(--gold-600);
  transition:opacity .7s var(--ease-out) var(--d,0ms),
             transform .7s var(--ease-out) var(--d,0ms),
             color .9s var(--ease) .75s;
}

/* Pasek z hasłami zjeżdża spod nagłówka. */
.js .promo-strip{animation:strip-in .65s var(--ease-out) .1s both}
@keyframes strip-in{from{opacity:0; transform:translate3d(0,-100%,0)} to{opacity:1; transform:none}}

/* Ramka z logo: jednorazowy przejazd światła po szkle. */
.hero-visual .logo-frame{overflow:hidden}
.js .hero-visual .logo-frame::after{
  content:""; position:absolute; inset:0; z-index:2; pointer-events:none;
  background:linear-gradient(102deg, transparent 42%, rgba(255,255,255,.6) 50%, transparent 58%);
  transform:translate3d(-140%,0,0);
  animation:frame-sweep 1.7s var(--ease-out) 1.05s both;
}
@keyframes frame-sweep{from{transform:translate3d(-140%,0,0)} to{transform:translate3d(140%,0,0)}}

/* Plakietki wokół logo najpierw wskakują, potem dopiero zaczynają się unosić. */
.js .float-chip.c1{animation:chip-in .65s var(--ease-out) 1.05s both, floaty 6s ease-in-out 1.7s infinite}
.js .float-chip.c2{animation:chip-in .65s var(--ease-out) 1.18s both, floaty 7s ease-in-out 1.98s infinite}
.js .float-chip.c3{animation:chip-in .65s var(--ease-out) 1.31s both, floaty 8s ease-in-out 2.26s infinite}
@keyframes chip-in{
  from{opacity:0; transform:translate3d(0,10px,0) scale(.88)}
  to{opacity:1; transform:none}
}

/* Pasek postępu czytania — cienka linia nad nagłówkiem. */
.scroll-progress{
  position:fixed; top:0; left:0; right:0; height:3px; z-index:130;
  transform:scaleX(0); transform-origin:0 50%; pointer-events:none;
  background:linear-gradient(90deg,var(--sage-500),var(--gold),var(--sage-300));
}

/* Delikatny „oddech" tła sekcji powitalnej (tylko kompozytor — bez przeliczania układu). */
.hero-bg::before, .hero-bg::after{
  content:""; position:absolute; border-radius:50%; filter:blur(0);
  opacity:.5; will-change:transform;
}
.hero-bg::before{
  width:46vmax; height:46vmax; top:-16vmax; right:-12vmax;
  background:radial-gradient(circle at 50% 50%, rgba(211,195,160,.5), transparent 62%);
  animation:aurora-a 22s var(--ease) infinite alternate;
}
.hero-bg::after{
  width:40vmax; height:40vmax; bottom:-14vmax; left:-10vmax;
  background:radial-gradient(circle at 50% 50%, rgba(169,188,161,.45), transparent 62%);
  animation:aurora-b 27s var(--ease) infinite alternate;
}
@keyframes aurora-a{from{transform:translate3d(0,0,0) scale(1)} to{transform:translate3d(-6%,4%,0) scale(1.12)}}
@keyframes aurora-b{from{transform:translate3d(0,0,0) scale(1.06)} to{transform:translate3d(7%,-5%,0) scale(1)}}

/* Mikrointerakcje: reakcja na dotknięcie/kliknięcie (działa też na telefonie). */
.btn{-webkit-tap-highlight-color:transparent}
.btn:active{transform:translateY(1px) scale(.985)}
.tile, .feature, .portal, .card-thumb, .book{-webkit-tap-highlight-color:transparent}
.tile:active, .feature:active, .book:active{transform:translateY(-2px) scale(.995)}

/* Kafelek karty: przesuwający się połysk przy najechaniu (tylko myszką). */
@media (hover:hover) and (pointer:fine){
  .card-thumb .thumb-art::after{
    content:""; position:absolute; inset:0; z-index:2; pointer-events:none;
    background:linear-gradient(105deg, transparent 35%, rgba(255,255,255,.42) 50%, transparent 65%);
    transform:translateX(-120%); transition:transform .85s var(--ease-out);
  }
  .card-thumb:hover .thumb-art::after{transform:translateX(120%)}
}

/* DRUK: nic nie może zostać ukryte przez animację wejścia — regulamin czy
   politykę prywatności użytkownik musi wydrukować w całości, także fragmenty,
   do których nigdy nie przewinął strony. */
@media print{
  .js .reveal{opacity:1 !important; transform:none !important; clip-path:none !important; transition:none !important}
  .scroll-progress{display:none !important}
}

@media (prefers-reduced-motion:reduce){
  .js .reveal{opacity:1 !important; transform:none !important; clip-path:none !important; transition:none}
  .hero-bg::before, .hero-bg::after{animation:none}
  /* Nagłówek: żadnego wjeżdżania, obracania ani przecierania nitki — pasek jest
     po prostu od razu na miejscu. Wyliczamy elementy pojedynczo, bo każdy ma
     własną animację; sama nitka znika, bo bez ruchu nie ma czego nią domykać. */
  .js .site-header,
  .js .site-header .brand img,
  .js .site-header .brand .wordmark b,
  .js .site-header .brand .wordmark > span,
  .js .site-header .nav-menu > li,
  .js .site-header .nav-cta{animation:none}
  .js .site-header::after{display:none}
  .brand:hover img{transform:none}
  .scroll-progress{display:none}
  .btn:active, .tile:active, .feature:active, .book:active{transform:none}
  /* Wejście strony głównej — wszystko od razu na swoim miejscu.
     KLUCZOWE: bez tego nadtytuł zostałby przycięty clip-path i byłby niewidoczny,
     bo klasa .hero-go (która go odsłania) w tym trybie nigdy nie jest dodawana. */
  .js .intro-anim .eyebrow{clip-path:none !important}
  .js .intro-anim h1 .word{opacity:1 !important; transform:none !important; filter:none !important; transition:none}
  /* W tym trybie animacji wejścia nie ma, więc nie ma czego maskować —
     a wstępne ukrycie byłoby tu wręcz ryzykowne, bo `intro-ratunek` jako
     animacja mógłby zostać wyłączony i nagłówek zostałby niewidoczny. */
  .js.intro-pending h1,
  .js.intro-pending .page-hero .eyebrow,
  .js.intro-pending .hero .eyebrow{visibility:visible; animation:none}
  .js .promo-strip{animation:none}
  .js .hero-visual .logo-frame::after{animation:none; display:none}
  .js .float-chip.c1, .js .float-chip.c2, .js .float-chip.c3{animation:none}
  *{scroll-behavior:auto !important}
}
.divider{height:1px; background:var(--line); border:none; margin:0}
.tag-list{display:flex; flex-wrap:wrap; gap:.5rem}

/* ---------- Toast ---------- */
/* z-index MUSI być wyższy niż baner zgody na cookie (1200). Toast niesie
   komunikaty blokujące zakup — np. „Zaznacz zgodę, aby kontynuować" na
   platnosc.html. Gdy stał niżej, baner go zasłaniał i klient klikał „Zapłać"
   bez żadnej widocznej reakcji. */
.toast{position:fixed; bottom:24px; left:50%; transform:translateX(-50%) translateY(20px); background:var(--sage-deep); color:#fff; padding:.9rem 1.5rem; border-radius:var(--radius-pill); box-shadow:var(--shadow-lg); font-weight:700; opacity:0; pointer-events:none; transition:.35s var(--ease); z-index:1300}
/* Dopóki baner zgody stoi na dole, podnosimy toast ponad niego, żeby oba były
   czytelne naraz (klasę zdejmuje site.js po decyzji klienta). */
body.ma-baner-zgody .toast{bottom:170px}
/* Ten sam próg co układ baneru niżej (768px): od niego baner ma dwa wiersze —
   tekst i pasek przycisków — więc jest wyraźnie wyższy i toast musi wejść nad
   niego, inaczej znów zasłania komunikat blokujący zakup. */
@media (max-width:768px){ body.ma-baner-zgody .toast{bottom:265px} }
.toast.show{opacity:1; transform:translateX(-50%) translateY(0)}

/* =========================================================
   PODGLĄD KARTY PRACY (kliknięcie w miniaturę)
   Świadomie NIE jest to tryb pełnoekranowy: podgląd zajmuje część ekranu,
   z widocznym marginesem dookoła. Ma pozwolić przyjrzeć się karcie —
   nie zastąpić jej zakupu, dlatego jest zabezpieczony przed drukiem
   (reguły @media print niżej) i przed zapisem/przeciąganiem obrazka.
   ========================================================= */
.card-thumb{cursor:zoom-in}
.card-thumb:focus-visible{outline:3px solid var(--gold); outline-offset:3px}

.cardview{
  position:fixed; inset:0; z-index:400;
  display:flex; align-items:center; justify-content:center;
  padding:clamp(.9rem,4vw,2.5rem);
  background:rgba(44,52,42,.62);
  -webkit-backdrop-filter:blur(7px); backdrop-filter:blur(7px);
  opacity:0; visibility:hidden;
  transition:opacity .32s var(--ease-out), visibility .32s;
}
.cardview.open{opacity:1; visibility:visible}
.cardview[hidden]{display:none}
/* Przy otwartym podglądzie tło się nie przewija (na telefonie inaczej „ucieka"). */
body.cv-open{overflow:hidden}

.cv-stage{
  /* Celowe ograniczenie: nigdy nie na cały ekran — dookoła zostaje tło. */
  width:min(90vw, 430px);
  display:flex; flex-direction:column; gap:.6rem;
  transform:translateY(14px) scale(.97);
  transition:transform .38s var(--ease-out);
}
.cardview.open .cv-stage{transform:none}
/* Na dużym ekranie podgląd może być większy — ale nadal z widocznym marginesem. */
@media (min-width:900px){ .cv-stage{width:min(70vw, 520px)} }

.cv-frame{
  position:relative; width:fit-content; max-width:100%; margin-inline:auto;
  border-radius:16px; overflow:hidden; background:var(--cream-2); line-height:0;
  box-shadow:0 30px 70px -18px rgba(20,26,18,.6), 0 0 0 1px rgba(255,255,255,.18);
  touch-action:none; cursor:zoom-in;
}
.cv-frame.zoomed{cursor:grab}
.cv-frame.zoomed:active{cursor:grabbing}
/* Obraz sam ustala rozmiar ramki: ograniczony i szerokością, i wysokością ekranu,
   dzięki czemu podgląd nigdy nie wychodzi poza widok i nie ma pustych pasów. */
.cv-frame img{
  display:block; width:auto; height:auto;
  max-width:100%;
  max-height:min(68vh, 780px);          /* zapas dla starszych przeglądarek */
  max-height:min(68dvh, 780px);
  transform-origin:0 0; transition:transform .35s var(--ease-out);
  -webkit-user-select:none; user-select:none; -webkit-user-drag:none;
  -webkit-touch-callout:none; pointer-events:none;
}
.cv-frame.panning img{transition:none}
/* Warstwa ochronna: przechwytuje długie przytrzymanie i menu kontekstowe,
   żeby obrazek nie dał się łatwo zapisać ani przeciągnąć. */
.cv-shield{position:absolute; inset:0; z-index:3; -webkit-touch-callout:none; -webkit-user-select:none; user-select:none}

/* Podpowiedź pod kartą. Po powiększeniu NIE znika — zmienia treść na wyjaśnienie,
   dlaczego zbliżenie jest miękkie (to podgląd w małej rozdzielczości, a nie
   niska jakość samych materiałów). */
.cv-hint{
  position:absolute; left:50%; bottom:.7rem; transform:translateX(-50%); z-index:4;
  max-width:calc(100% - 1.4rem);
  background:rgba(30,36,28,.78); color:#fff; font-size:.72rem; font-weight:700;
  padding:.4em .85em; border-radius:14px; text-align:center; line-height:1.35;
  pointer-events:none; opacity:1; transition:opacity .3s var(--ease)
}

.cv-bar{display:flex; align-items:center; gap:.7rem; color:#fff}
.cv-meta{min-width:0; flex:1}
.cv-meta b{display:block; font-family:var(--font-serif); font-size:1.2rem; line-height:1.15;
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap}
/* Opis karty może zająć dwie linijki — lepiej niż ucięcie w połowie nurtu. */
.cv-meta span{font-size:.78rem; color:rgba(255,255,255,.78); line-height:1.35;
  display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden}
.cv-btn{
  flex-shrink:0; width:44px; height:44px; border-radius:50%; cursor:pointer;
  border:1px solid rgba(255,255,255,.35); background:rgba(255,255,255,.12); color:#fff;
  font-size:1.15rem; line-height:1; display:grid; place-items:center;
  transition:background .2s var(--ease), transform .2s var(--ease);
}
.cv-btn:hover{background:rgba(255,255,255,.24)}
.cv-btn:active{transform:scale(.94)}
.cv-nav{display:flex; align-items:center; justify-content:space-between; gap:.6rem}
.cv-count{font-size:.8rem; font-weight:700; color:rgba(255,255,255,.85)}
.cv-note{font-size:.72rem; color:rgba(255,255,255,.7); text-align:center; margin:0; line-height:1.45}

@media (max-width:420px){
  .cv-stage{width:92vw; gap:.45rem}
  .cv-meta b{font-size:1.05rem}
  .cv-btn{width:40px; height:40px}
}
/* Telefon w poziomie / niskie okno: mniej wysokości na obraz, mniej opisów. */
@media (max-height:540px){
  .cv-frame img{max-height:60vh; max-height:60dvh}
  .cv-note{display:none}
  .cv-meta span{-webkit-line-clamp:1}
  .cv-stage{gap:.4rem}
}

/* DRUK: podgląd i miniatury kart nigdy nie trafiają na wydruk. */
@media print{
  .cardview{display:none !important}
  .card-thumb .thumb-art img, .cv-frame img{display:none !important}
  body.cv-open > *{display:none !important}
  body.cv-open::after{
    content:"Podglądy kart pracy nie są przeznaczone do druku.";
    display:block; padding:2cm; font-family:sans-serif; font-size:14pt;
  }
}

/* ---------- Responsive ---------- */
@media (max-width:980px){
  /* Na wąskich ekranach kolumny układają się w pionie — ruch w bok nie ma
     wtedy sensu i tylko rozpychałby stronę. Zamieniamy go na ruch w górę. */
  .js .reveal[data-anim="left"], .js .reveal[data-anim="right"]{transform:translate3d(0,24px,0)}
  .hero-grid{grid-template-columns:1fr; text-align:center}
  .hero-sub{margin-inline:auto}
  .hero-actions,.hero-badges{justify-content:center}
  .hero-visual{max-width:440px; margin:0 auto}
  .product{grid-template-columns:1fr}
  .about-grid{grid-template-columns:1fr}
  .about-photo{max-width:420px; margin:0 auto}
  .g-4{grid-template-columns:repeat(2,1fr)}
  .feature-row{grid-template-columns:1fr}
  .stat-row{grid-template-columns:repeat(2,1fr)}
  .footer-grid{grid-template-columns:1fr 1fr}
}
/* ===== PRÓG MENU MOBILNEGO: 960 px =====
   Poniżej tej szerokości poziome menu ustępuje miejsca hamburgerowi.
   UWAGA: ta sama wartość jest w assets/js/site.js (obsługa podmenu na dotyku
   i zamykanie menu po obróceniu ekranu) — zmieniając ją, popraw oba miejsca. */
@media (max-width:960px){
  /* Niższy pasek na węższych ekranach — więcej miejsca na treść. */
  :root{--header-h:64px}
  .nav-menu, .nav-cta .btn.desktop-cta{display:none}
  /* Konto/logowanie przenosimy do menu — pasek musi zmieścić nazwę marki. */
  .nav-cta > .auth-slot{display:none}
  .nav-toggle{display:flex}
  .brand img{width:38px; height:38px}
  .brand .wordmark b{font-size:1.06rem}
  /* Podpis „Psycholog · Psychoterapeuta" zmieściłby się tylko poniżej 10 px —
     to nieczytelne, więc na wąskich ekranach go nie pokazujemy (jest w stopce). */
  .brand .wordmark span{display:none}
  .nav-menu.mobile-open{
    display:flex; flex-direction:column; align-items:stretch; gap:.2rem;
    position:absolute; top:var(--header-h); left:0; right:0;
    background:var(--paper); border-bottom:1px solid var(--line);
    padding:1rem; box-shadow:var(--shadow);
    max-height:calc(100vh - var(--header-h));      /* zapas dla starszych przeglądarek */
    max-height:calc(100dvh - var(--header-h));
    overflow-y:auto; overscroll-behavior:contain;
  }
  .nav-menu.mobile-open > li{width:100%}
  .nav-menu.mobile-open .nav-link{width:100%; justify-content:space-between; padding:.85rem 1rem; font-size:1.05rem}
  .nav-menu.mobile-open .dropdown{
    position:static; transform:none; opacity:1; visibility:visible; pointer-events:auto;
    box-shadow:none; border:none; min-width:0; padding:.2rem .2rem .6rem 1rem; display:none;
  }
  .nav-menu.mobile-open .has-dropdown.open .dropdown{display:block}
  .nav-menu.mobile-open .dropdown a{padding:.7rem .8rem}
  .nav-menu.mobile-open .dropdown::before{display:none}
  .nav-menu.mobile-open .mobile-cta-li{display:block; margin-top:.8rem; padding:0 .4rem}
  /* Konto w menu: pełnej szerokości przyciski, wygodne w kciuku. */
  .nav-menu.mobile-open .mobile-auth-li{display:block; margin-bottom:.4rem; padding:0 .4rem}
  .mobile-auth-li .auth-slot{display:flex; gap:.5rem}
  .mobile-auth-li .auth-slot .btn{flex:1; justify-content:center}

  /* Wysuwanie menu: panel zjeżdża, a pozycje wchodzą kaskadą.
     Animacja jest krótka i nie blokuje kliknięć (ruszamy tylko przezroczystością
     i przesunięciem), więc w pozycję można trafić od razu. */
  .nav-menu.mobile-open{animation:menu-in .26s var(--ease-out) both}
  .nav-menu.mobile-open > li{animation:menu-item-in .3s var(--ease-out) both}
  .nav-menu.mobile-open > li:nth-child(1){animation-delay:.03s}
  .nav-menu.mobile-open > li:nth-child(2){animation-delay:.07s}
  .nav-menu.mobile-open > li:nth-child(3){animation-delay:.11s}
  .nav-menu.mobile-open > li:nth-child(4){animation-delay:.15s}
  .nav-menu.mobile-open > li:nth-child(5){animation-delay:.19s}
  .nav-menu.mobile-open > li:nth-child(n+6){animation-delay:.23s}
}
@keyframes menu-in{from{opacity:0; transform:translateY(-10px)} to{opacity:1; transform:none}}
@keyframes menu-item-in{from{opacity:0; transform:translateY(-7px)} to{opacity:1; transform:none}}
@media (prefers-reduced-motion:reduce){
  .nav-menu.mobile-open, .nav-menu.mobile-open > li{animation:none}
}
@media (max-width:640px){
  body{font-size:16px}
  .g-2,.g-3,.books,.feature-row{grid-template-columns:1fr}
  .acc-list{grid-template-columns:1fr}
  .stat-row{grid-template-columns:repeat(2,1fr)}
  .footer-grid{grid-template-columns:1fr}
  .container{padding:0 18px}
  .float-chip{display:none}
  .brand .wordmark b{font-size:1.1rem}
}
/* Najwęższe telefony (320–360 px): nazwa marki łamie się na dwie linijki,
   zamiast być ucinana wielokropkiem. */
@media (max-width:359px){
  .brand img{width:34px; height:34px}
  .brand{gap:.5rem}
  .brand .wordmark b{white-space:normal; font-size:.98rem; line-height:1.08}
}

/* =========================================================
   Dotyk: wygodne cele kliknięcia i czytelne drobne napisy
   ========================================================= */
@media (max-width:820px){
  /* Odnośniki w stopce i spisach treści były wysokie na ~19 px — za mało,
     żeby trafić w nie kciukiem. Powiększamy pole kliknięcia, nie tekst. */
  .footer-col ul a, .footer-bottom a{display:inline-block; padding:.4rem 0; line-height:1.35}
  .footer-col ul{gap:.15rem}
  .breadcrumb{font-size:.86rem}
  .breadcrumb a{display:inline-block; padding:.3rem .15rem}
  .toc a, nav.toc a{display:inline-block; padding:.35rem 0}
  .tldr li a, .company-card dd a{display:inline-block; padding:.25rem 0}
  /* Etykieta typu materiału w spisie 98 kart (0,68 rem ≈ 10,9 px → za mało). */
  .acc-list .ci-row .ct{font-size:.74rem}
  .acc-list .ci-row .cm{font-size:.8rem}
  .acc-head{padding:1.1rem 1.1rem}
  .acc-head .acc-title{font-size:1.12rem}
  /* Przyciski w rzędzie akcji nie mogą być węższe niż wygodny cel dotyku. */
  .btn{min-height:44px}
  .btn-sm{min-height:38px}
}
/* Tabele panelu: na telefonie przewijamy je w poziomie i sygnalizujemy to
   cieniem na krawędzi, żeby było widać, że jest coś dalej. */
.table-scroll{position:relative}
@media (max-width:820px){
  .table-scroll{
    overflow-x:auto; -webkit-overflow-scrolling:touch; overscroll-behavior-x:contain;
    background:
      linear-gradient(to right, var(--paper) 30%, rgba(255,255,255,0)) left center / 28px 100% no-repeat,
      linear-gradient(to left,  var(--paper) 30%, rgba(255,255,255,0)) right center / 28px 100% no-repeat,
      radial-gradient(farthest-side at 0 50%, rgba(76,94,72,.16), transparent) left center / 12px 100% no-repeat,
      radial-gradient(farthest-side at 100% 50%, rgba(76,94,72,.16), transparent) right center / 12px 100% no-repeat;
    background-attachment: local, local, scroll, scroll;
  }
  .data-table{font-size:.86rem}
  .data-table th, .data-table td{padding:.6rem .7rem}

  /* Tabela zamieniona na karty: każdy wiersz to osobny kafelek, a każda
     komórka pokazuje nazwę swojej kolumny. Koniec z przewijaniem w bok
     i pustymi polami. Nagłówek tabeli chowamy wizualnie, ale zostawiamy
     dla czytników ekranu. */
  .table-scroll.has-stacked{overflow:visible; background:none}
  .data-table.stacked{box-shadow:none; background:none; font-size:.92rem}
  .data-table.stacked thead{
    position:absolute; width:1px; height:1px; overflow:hidden;
    clip:rect(0 0 0 0); clip-path:inset(50%); white-space:nowrap;
  }
  .data-table.stacked tbody tr{
    display:block; background:var(--paper); border:1px solid var(--line);
    border-radius:var(--radius); box-shadow:var(--shadow-sm);
    padding:.35rem .2rem; margin-bottom:.9rem;
  }
  .data-table.stacked tbody tr:hover{background:var(--paper)}
  .data-table.stacked tbody td{
    display:grid; grid-template-columns:minmax(84px, 34%) 1fr; gap:.7rem;
    align-items:start; padding:.5rem .9rem; border-bottom:1px dashed var(--line);
    max-width:none !important;
  }
  .data-table.stacked tbody tr td:last-child{border-bottom:none}
  .data-table.stacked tbody td::before{
    content:attr(data-label); font-weight:800; font-size:.7rem;
    text-transform:uppercase; letter-spacing:.04em; color:var(--sage-deep);
    line-height:1.5;
  }
  .data-table.stacked tbody tr.row-empty{display:block; padding:1rem}
  .data-table.stacked tbody tr.row-empty td{display:block; border:none; padding:0}
  .data-table.stacked tbody tr.row-empty td::before{content:none}
}

/* === Okładki książek: obrazek zamiast kolorowego kafelka === */
.book .cover{position:relative; overflow:hidden; padding:0}
.book .cover .cover-txt{position:absolute; inset:0; display:grid; place-items:center; text-align:center; padding:.4rem; line-height:1.15}
.book .cover img{position:absolute; inset:0; width:100%; height:100%; object-fit:cover; display:block; background:var(--cream-2)}

/* === Miniatury prawdziwych kart (podglad zestawu na stronie glownej) === */
.card-thumb .thumb-art img{position:absolute; inset:0; width:100%; height:100%; object-fit:cover; object-position:center top; display:block; background:var(--cream-2)}

/* === Rzad 4 cech (np. „czym sa te karty") === */
.feature-row.cols-4{grid-template-columns:repeat(4,1fr)}
@media (max-width:980px){ .feature-row.cols-4{grid-template-columns:repeat(2,1fr)} }
@media (max-width:640px){ .feature-row.cols-4{grid-template-columns:1fr} }

/* === Pusty stan (sekcja w przygotowaniu) === */
.empty-state{grid-column:1/-1; text-align:center; max-width:640px; margin:0 auto; padding:2.8rem 1.6rem; background:var(--paper); border:1px dashed var(--sage-300); border-radius:var(--radius); box-shadow:var(--shadow-sm)}
.empty-state .ico{font-size:2.4rem; line-height:1; margin-bottom:.5rem}
.empty-state h3{font-family:var(--font-serif); color:var(--sage-deep); margin:.2rem 0 .5rem}
.empty-state p{color:var(--ink-soft); margin:0 auto 1.4rem; max-width:46ch}
.empty-state .hero-actions{justify-content:center}

/* =========================================================
   Piaskownica terapeutyczna — galeria produktu + wybór koloru
   ========================================================= */
.pw{
  display:grid; grid-template-columns:1.05fr .95fr; gap:clamp(1.6rem,4vw,3rem); align-items:start;
  background:linear-gradient(160deg,var(--cream-2),var(--sand));
  border:1px solid var(--line); border-radius:var(--radius-lg);
  padding:clamp(1.4rem,3.5vw,2.8rem); box-shadow:var(--shadow);
}
.pw-gallery{position:sticky; top:100px}
.pw-main{
  position:relative; aspect-ratio:4/5; max-height:600px; overflow:hidden;
  border-radius:var(--radius); box-shadow:var(--shadow); background:var(--cream-2);
  border:1px solid var(--line);
}
.pw-main img{
  width:100%; height:100%; object-fit:cover; object-position:center 55%;
  transition:filter .4s var(--ease), opacity .3s var(--ease);
}
.pw-caption{
  position:absolute; left:0; right:0; bottom:0;
  background:linear-gradient(0deg,rgba(58,66,58,.78),rgba(58,66,58,0));
  color:#fff; font-size:.82rem; font-weight:600; padding:1.4rem .95rem .7rem; margin:0;
  display:flex; align-items:center; gap:.4em;
}
.pw-thumbs{display:grid; grid-template-columns:repeat(4,1fr); gap:.6rem; margin-top:.7rem}
.pw-thumb{
  aspect-ratio:1/1; border-radius:12px; overflow:hidden; cursor:pointer; padding:0;
  border:2px solid transparent; background:var(--cream-2); box-shadow:var(--shadow-sm);
  transition:border-color .2s var(--ease), transform .2s var(--ease);
}
.pw-thumb img{width:100%; height:100%; object-fit:cover; object-position:center 55%}
.pw-thumb:hover{transform:translateY(-2px)}
.pw-thumb.active{border-color:var(--sage-500)}

.pw-buy{background:var(--paper); border-radius:var(--radius-lg); padding:clamp(1.4rem,3vw,2rem); box-shadow:var(--shadow); border:1px solid var(--line)}
.pw-buy h3{margin:.5rem 0 .2rem; font-size:clamp(1.5rem,2.4vw,1.95rem)}
.pw-buy .price{font-family:var(--font-serif); font-size:3.1rem; color:var(--sage-deep); line-height:1; font-weight:600; margin:.4rem 0}
.pw-buy .price small{font-size:1.2rem; color:var(--ink-soft)}
.pw-buy .price-note{color:var(--ink-soft); font-size:.86rem; margin:.1rem 0 1rem}
.pw-buy ul{list-style:none; margin:1.2rem 0; padding:0; text-align:left}
.pw-buy ul li{padding:.5rem 0 .5rem 1.9rem; position:relative; border-bottom:1px dashed var(--line); font-size:.95rem}
.pw-buy ul li:last-child{border-bottom:none}
.pw-buy ul li::before{content:"✓"; position:absolute; left:0; top:.5rem; width:1.3rem; height:1.3rem; background:var(--sage-100); color:var(--sage-deep); border-radius:50%; display:grid; place-items:center; font-size:.72rem; font-weight:800}

.pw-colors{margin:1.1rem 0 .4rem}
.pw-colors .pw-color-head{display:flex; align-items:center; justify-content:space-between; gap:.5rem; font-size:.92rem; margin-bottom:.55rem}
.pw-colors .pw-color-head b{color:var(--sage-deep)}
.pw-swatches{display:flex; flex-wrap:wrap; gap:.6rem}
.pw-swatch{
  width:38px; height:38px; border-radius:50%; cursor:pointer; padding:0; position:relative;
  border:2px solid var(--line); box-shadow:inset 0 0 0 2px #fff; transition:transform .18s var(--ease);
}
.pw-swatch:hover{transform:scale(1.08)}
.pw-swatch.active{outline:2.5px solid var(--sage-500); outline-offset:2px; border-color:#fff}
.pw-tag{display:inline-block; margin-top:.5rem; font-size:.78rem; font-weight:700; color:var(--gold-600)}
/* drobny druk pod próbnikiem kolorów */
.pw-note{display:block; margin-top:.6rem; font-size:.72rem; line-height:1.45; color:var(--ink-soft); opacity:.85}

@media (max-width:980px){
  .pw{grid-template-columns:1fr}
  .pw-gallery{position:static}
  .pw-main{max-height:none; aspect-ratio:1/1}
}

/* =========================================================
   Formularze / konta / logowanie / panel administratora
   ========================================================= */
.auth-wrap{max-width:460px; margin:0 auto}
.auth-card{background:var(--paper); border:1px solid var(--line); border-radius:var(--radius-lg); padding:clamp(1.6rem,4vw,2.4rem); box-shadow:var(--shadow)}
.auth-tabs{display:flex; gap:.4rem; background:var(--cream-2); border:1px solid var(--line); border-radius:var(--radius-pill); padding:.3rem; margin-bottom:1.6rem}
.auth-tabs button{flex:1; border:none; background:transparent; font-family:inherit; font-weight:700; font-size:.95rem; color:var(--ink-soft); padding:.6rem; border-radius:var(--radius-pill); cursor:pointer; transition:.2s var(--ease)}
.auth-tabs button.active{background:var(--sage-deep); color:#fff; box-shadow:var(--shadow-sm)}
.form-field{margin:0 0 1rem}
.form-field label{display:block; font-weight:700; font-size:.9rem; margin-bottom:.4rem; color:var(--sage-deep)}
.form-field input, .form-field textarea, .form-field select{
  width:100%; padding:.8rem 1rem; border:1.5px solid var(--line); border-radius:12px;
  font-family:inherit; font-size:1rem; background:var(--cream-2); color:var(--ink);
}
.form-field input:focus, .form-field textarea:focus, .form-field select:focus{outline:none; border-color:var(--sage-500)}
.form-field small{display:block; color:var(--ink-soft); font-size:.8rem; margin-top:.3rem}
.form-row{display:grid; grid-template-columns:1fr 1fr; gap:1rem}
@media (max-width:560px){ .form-row{grid-template-columns:1fr} }
.form-msg{border-radius:12px; padding:.8rem 1rem; font-size:.9rem; font-weight:600; margin-bottom:1rem; display:none}
.form-msg.err{display:block; background:var(--blush); color:#a04b3a}
.form-msg.ok{display:block; background:var(--sage-100); color:var(--sage-deep)}

/* Rodzaj nabywcy (do faktury) — na stronach zakupu (platnosc.html, zamowienie.html).
   Dwie karty wyboru „osoba prywatna / firma"; przy firmie odsłaniają się pola. */
.buyer-type{margin:1.3rem 0}
.buyer-legend{display:block; font-weight:700; font-size:.9rem; margin-bottom:.5rem; color:var(--sage-deep)}
.buyer-choices{display:grid; grid-template-columns:1fr 1fr; gap:.6rem}
@media (max-width:520px){ .buyer-choices{grid-template-columns:1fr} }
.buyer-choice{display:flex; align-items:flex-start; gap:.6rem; padding:.8rem 1rem; border:1.5px solid var(--line); border-radius:12px; cursor:pointer; background:var(--cream-2); transition:.15s var(--ease)}
.buyer-choice:hover{border-color:var(--sage-300)}
.buyer-choice.sel{border-color:var(--sage-500); background:var(--sage-100); box-shadow:var(--shadow-sm)}
.buyer-choice input{accent-color:var(--sage-deep); width:18px; height:18px; margin-top:.15rem; flex-shrink:0}
.buyer-choice b{color:var(--sage-deep); font-size:.95rem}
.buyer-choice small{display:block; color:var(--ink-soft); font-size:.8rem; margin-top:.1rem}
.buyer-company{margin-top:1rem}
.buyer-company .form-field:last-child{margin-bottom:0}

/* Wiersz zgody (akceptacja regulaminu, zgoda na treści cyfrowe) — wspólny dla
   platnosc.html i zamowienie.html, dlatego styl jest tutaj, a nie na stronie. */
.consent-row{display:flex; gap:.6rem; align-items:flex-start; margin:1.3rem 0 .2rem;
  font-size:.86rem; color:var(--ink-soft); cursor:pointer; line-height:1.55}
.consent-row input{width:20px; height:20px; margin-top:.1rem; flex-shrink:0;
  accent-color:var(--sage-deep); cursor:pointer}
.consent-row.err{color:#b3503f}
.consent-row.err input{outline:2px solid #d98a7a; outline-offset:2px; border-radius:4px}

/* Informacja przedumowna przy przycisku zapłaty (odstąpienie, zasięg wysyłki). */
.buy-info{
  background:var(--cream-2); border:1px solid var(--line); border-left:4px solid var(--sage-500);
  border-radius:12px; padding:.9rem 1.1rem; margin:1.1rem 0 .2rem;
  font-size:.84rem; line-height:1.55; color:var(--ink-soft);
}
.buy-info p{margin:0 0 .6rem}
.buy-info p:last-child{margin-bottom:0}
.buy-info strong{color:var(--sage-deep)}

/* Baner metod płatności na stronach zakupu (oficjalne logotypy Autopay).
   Tak jak w stopce: plik ma 800 px, pokazujemy go w 440 px — zapas pikseli
   trzyma logotypy ostre na ekranach o dużej gęstości. */
.pay-brands{margin-top:1.1rem; text-align:center}
.pay-brands img{width:400px; max-width:100%; height:auto; margin:0 auto}
.pay-brands small{display:block; margin-top:.5rem; font-size:.76rem; color:var(--ink-soft)}

.data-table{width:100%; border-collapse:collapse; font-size:.92rem; background:var(--paper); border-radius:var(--radius); overflow:hidden; box-shadow:var(--shadow-sm)}
.data-table th, .data-table td{padding:.75rem .9rem; text-align:left; border-bottom:1px solid var(--line); vertical-align:top}
.data-table th{background:var(--cream-2); color:var(--sage-deep); font-weight:800; font-size:.78rem; text-transform:uppercase; letter-spacing:.05em; white-space:nowrap}
.data-table tr:last-child td{border-bottom:none}
.data-table tbody tr:hover{background:var(--cream-2)}
.table-scroll{overflow-x:auto; -webkit-overflow-scrolling:touch}
.badge{display:inline-block; font-size:.72rem; font-weight:800; padding:.22em .7em; border-radius:var(--radius-pill); letter-spacing:.02em}
.badge.paid{background:var(--sage-100); color:var(--sage-deep)}
.badge.pending{background:var(--gold-200); color:var(--gold-600)}
.badge.new{background:var(--powder); color:#3f7570}
.badge.physical{background:var(--lavender); color:#6d5f8c}
.badge.shipped{background:var(--powder); color:#3f7570}
.badge.refunded{background:var(--blush); color:#a04b3a}
.admin-stats{display:grid; grid-template-columns:repeat(4,1fr); gap:1rem; margin:1.5rem 0}
@media (max-width:820px){ .admin-stats{grid-template-columns:repeat(2,1fr)} }
.admin-stat{background:var(--paper); border:1px solid var(--line); border-radius:var(--radius); padding:1.2rem; text-align:center; box-shadow:var(--shadow-sm)}
.admin-stat b{display:block; font-family:var(--font-serif); font-size:2.1rem; color:var(--sage-deep); line-height:1}
.admin-stat span{font-size:.82rem; color:var(--ink-soft)}
.acct-order{background:var(--paper); border:1px solid var(--line); border-radius:var(--radius); padding:1.2rem 1.4rem; box-shadow:var(--shadow-sm); margin-bottom:1rem; display:flex; justify-content:space-between; align-items:center; gap:1rem; flex-wrap:wrap}
.auth-slot{display:inline-flex; gap:.5rem; align-items:center}
@media (max-width:560px){ .auth-slot .btn{padding:.5em .85em; font-size:.82rem} }

/* ---- Banner zgody na cookie reklamowe (Google Ads) ----
   Świadomie NIE jest to nakładka blokująca stronę: treść sklepu musi być
   dostępna także bez podejmowania decyzji. Oba przyciski mają ten sam rozmiar
   i wagę — odmowa nie może być trudniejsza od zgody (art. 7 ust. 3 RODO). */
/* WEJŚCIE: dokładnie ten sam ruch, co słowa głównego nagłówka strony
   (`.js .intro-anim h1 .word` w sekcji „WEJŚCIE STRONY GŁÓWNEJ") — te same
   wartości i ten sam czas: uniesienie o .4em, delikatne skalowanie .965,
   rozmycie .12em i 0,7 s na `--ease-out`. Ruch zamiast dawnego wsuwania od dołu
   (`translateY(120%)`), żeby baner „wywoływał się" tak jak reszta strony.
   Samo OPÓŹNIENIE 2 s siedzi w site.js, a nie w `transition-delay`, i to celowo:
   przez te 2 s baner nie może istnieć w dokumencie, bo stoi na dole ekranu i
   niewidoczny (opacity:0) przechwytywałby kliknięcia w treść pod sobą — czego
   dawny wariant unikał tym, że parkował poza ekranem.
   `pointer-events` to druga warstwa tego zabezpieczenia: między dorysowaniem
   baneru a końcem wejścia klika się „przez niego". */
.consent-banner{position:fixed; left:0; right:0; bottom:0; z-index:1200; padding:0 1rem 1rem;
  opacity:0; transform:translate3d(0,.4em,0) scale(.965); filter:blur(.12em); pointer-events:none;
  transition:opacity .32s var(--ease), transform .32s var(--ease), filter .32s var(--ease)}
/* Wejście trwa 0,7 s (jak nagłówek), ale WYJŚCIE zostaje krótkie — 0,32 s z
   reguły wyżej. Dzięki temu zamknięcie baneru nadal jest natychmiastowe i zgadza
   się z 340 ms, po których site.js usuwa element z dokumentu. */
.consent-banner.is-open{opacity:1; transform:none; filter:blur(0); pointer-events:auto;
  transition:opacity .7s var(--ease-out), transform .7s var(--ease-out), filter .7s var(--ease-out)}
.consent-inner{max-width:var(--maxw); margin:0 auto; background:var(--paper); border:1px solid var(--line);
  border-radius:var(--radius); box-shadow:var(--shadow-lg); padding:1.15rem 1.35rem;
  display:flex; align-items:center; gap:1.4rem; flex-wrap:nowrap}
.consent-text{flex:1 1 380px; min-width:0}
/* Znak `>` jest tu ISTOTNY. Bez niego reguła łapie każde <b> w banerze, także
   „<b>reklamowych Google Ads</b>" w środku akapitu — a wtedy fragment zdania
   robi się blokiem, wymusza złamanie linii przed sobą i po sobie, i przecinek
   stojący zaraz za </b> zostaje sam na początku następnej linii. Przy okazji
   dostawał też stopień pisma i kolor nagłówka zamiast zwykłego tekstu.
   Ta reguła ma opisywać WYŁĄCZNIE tytuł baneru, czyli <b> będące bezpośrednim
   dzieckiem .consent-text. */
.consent-text > b{display:block; color:var(--sage-deep); font-size:.95rem; margin-bottom:.25rem}
.consent-text p{margin:0; font-size:.85rem; line-height:1.55; color:var(--ink-soft)}
/* „margin-left:auto" działa TYLKO wtedy, gdy przyciski zjadą do własnego wiersza:
   w układzie jednowierszowym całą wolną przestrzeń zabiera .consent-text
   (flex-grow:1), więc na automatyczny margines nie zostaje ani piksel i wygląd
   szerokiego ekranu się nie zmienia. Po zawinięciu przyciski trzymają się prawej
   krawędzi zamiast osuwać się w lewo pod tekst. */
.consent-actions{display:flex; gap:.6rem; flex-shrink:0; margin-left:auto}
.consent-actions .btn{white-space:nowrap}
/* Układ łamie się DOKŁADNIE tutaj i nigdzie indziej.
   Wcześniej o momencie zawinięcia decydowała arytmetyka flexboksa, a nie ten
   breakpoint: przy `flex-wrap:wrap` wiersz pękał sam z siebie, gdy tylko podstawa
   .consent-text (380px) plus nieściśliwe przyciski plus odstęp i paddingi
   przestawały się mieścić. Ta granica zależy od tego, ile miejsca zajmą NAPISY
   na przyciskach przy konkretnym foncie — czyli od wielkości, której w CSS nie
   da się przewidzieć. Podnoszenie samego progu tylko przesuwało problem: poniżej
   granicy przyciski zjeżdżały do drugiego wiersza, a reguły niżej jeszcze nie
   działały, więc zostawał wąski klocek przyklejony pod tekstem i skacząca
   wysokość baneru.
   Dlatego wyżej stoi `flex-wrap:nowrap`: powyżej 768px wiersz NIE MOŻE się
   zawinąć, a nadmiar szerokości zjada tekst (ma `flex-shrink:1` i `min-width:0`,
   więc po prostu łamie się na więcej linii). Przyciski zostają nietknięte dzięki
   `flex-shrink:0` i `white-space:nowrap`. Poniżej 768px wracamy do `wrap` i
   dokładamy `width:100%`, co daje przewidywalny układ dwuwierszowy. */
@media (max-width:768px){
  .consent-inner{padding:1rem 1.1rem; gap:.9rem; flex-wrap:wrap}
  .consent-actions{width:100%}
  .consent-actions .btn{flex:1 1 0}
}
/* Ograniczony ruch: baner jest widoczny od razu po dorysowaniu, bez unoszenia,
   skalowania i rozmycia. `pointer-events:auto` jest tu OBOWIĄZKOWE — bez niego
   baner byłby widoczny, ale przyciski „Akceptuję" i „Tylko niezbędne" nie
   przyjmowałyby kliknięć, bo stan spoczynkowy wyżej wyłącza zdarzenia myszy. */
@media (prefers-reduced-motion:reduce){
  .consent-banner{transition:none; opacity:1; transform:none; filter:none; pointer-events:auto}
}
