/* Wygenerowane przez tools/wytnij-css.py z prototypu — nie edytuj recznie. */
/* Biblioteka komponentow tresci (odpowiednik pages.css prototypu). */

/* Komponenty podstron. Wstrzykiwane przez build.py do <head> KAZDEJ podstrony
   (index.html ich nie dostaje — homepage ma komplet stylow u siebie).
   Bazuje na klasach z index.html: .in-wrap/.in-sec/.in-p/.in-lead/.in-btn/.in-card. */

/* hero podstrony — nizsze niz na homepage, tekst do lewej */
/* Jasne hero podstrony dostaje lekki fioletowy gradient (prosba 06.08) —
   ledwie muskniecie koloru marki u gory, przechodzace w biel przy tresci,
   plus miekka poswiata w prawym gornym rogu. Nic mocnego: tekst zostaje
   czarny na niemal bialym tle. */
.in-hero-sub {
    padding: 190px 0 76px; text-align: left;
    position: relative; isolation: isolate;
    background:
        radial-gradient(120% 90% at 88% -10%, rgba(100,59,129,.14) 0%, rgba(100,59,129,0) 58%),
        linear-gradient(180deg, rgba(100,59,129,.10) 0%, rgba(100,59,129,.04) 46%, rgba(255,255,255,0) 100%);
}
.in-hero-sub h1 { margin: 0 0 24px; max-width: 20ch; }
.in-hero-sub .in-lead { margin: 0 0 14px; max-width: 720px; }
.in-hero-sub .in-hero-btns { justify-content: flex-start; }

/* Fioletowy hero dzielony — wariant podstrony Numeroterapia.
   Duzy tytul i CTA po lewej, skondensowane informacje praktyczne w panelu
   po prawej. Pelny ekran i proporcje sa wzorowane na dostarczonej makiecie. */
.in-hero-purple {
    position: relative;
    --in-fade: clamp(340px, 46vh, 620px);   /* wysokosc rozmycia w biel */
    --in-fade-safe: calc(var(--in-fade) * .43 + 18px); /* dokad siega tresc */
    min-height: 100svh; margin-top: -96px;
    padding: clamp(176px, 19vh, 224px) 0 var(--in-fade-safe);
    color: #fff; overflow: hidden; isolation: isolate;
    /* Pionowy przebieg: najciemniejszy fiolet u gory -> fiolet marki ->
       niebieski -> turkus, a nizej przejmuje pasmo bieli (::after). */
    background:
        radial-gradient(circle at 82% 10%, rgba(198,196,216,.18), transparent 34%),
        radial-gradient(circle at 6% 62%, rgba(94,104,154,.24), transparent 38%),
        linear-gradient(176deg,
            #2B1839 0%,
            #46295E 14%,
            #643B81 30%,
            #5F5F94 46%,
            #5C86AC 62%,
            #67B6C0 82%,
            #93CDD4 100%);
}
.in-hero-purple::before {
    content: ""; position: absolute; z-index: -1; inset: 0;
    background: linear-gradient(100deg, rgba(100,59,129,.20), transparent 48%, rgba(94,104,154,.10));
    pointer-events: none;
}
/* Rozmycie dolu hero w biale tlo strony — zamiast twardej krawedzi miedzy
   kolorem a bialym. Poswiata (radial) daje miekkie wybrzuszenie na srodku,
   liniowy gradient domyka przejscie do #fff na samej krawedzi. */
.in-hero-purple::after {
    content: ""; position: absolute; z-index: -1; pointer-events: none;
    left: 0; right: 0; bottom: 0; height: var(--in-fade);
    background:
        radial-gradient(150% 92% at 50% 146%, rgba(231,237,249,.72) 12%, rgba(231,237,249,.26) 50%,
                        rgba(231,237,249,0) 84%),
        linear-gradient(180deg, rgba(231,237,249,0) 0%, rgba(231,237,249,.12) 24%,
                        rgba(231,237,249,.42) 50%, rgba(231,237,249,.74) 70%,
                        rgba(231,237,249,.94) 88%, #E7EDF9 100%);
}
.in-hero-purple > .in-wrap {
    min-height: calc(100svh - clamp(176px, 19vh, 224px) - var(--in-fade-safe));
    display: grid; grid-template-columns: minmax(0, 1.65fr) minmax(340px, .62fr);
    gap: clamp(56px, 8vw, 148px); align-items: end;
}
.in-hero-purple .in-hero-main { min-width: 0; }
/* hero bez panelu i bez pasa liczb — jedna kolumna, żeby nagłówek nie ściskał
   się do połowy szerokości obok pustego miejsca (build.py → render_hero) */
.in-hero-purple--solo > .in-wrap { grid-template-columns: minmax(0, 1fr); }
.in-hero-purple .in-eyebrow {
    display: inline-flex; align-items: center; min-height: 42px; margin: 0 0 46px;
    padding: 10px 19px; border: 1px solid rgba(255,255,255,.62); border-radius: 999px;
    color: #fff; font-size: 12px; font-weight: 500; letter-spacing: .12em;
}
.in-hero-purple h1 {
    max-width: none; margin: 0 0 30px; color: #fff;
    font-size: clamp(64px, 6.2vw, 112px); font-weight: 400; line-height: .94;
    letter-spacing: -.058em; text-wrap: balance;
}
.in-hero-purple .in-lead {
    max-width: 760px; margin: 0 0 34px; color: rgba(255,255,255,.92);
    font-size: clamp(19px, 1.45vw, 26px); line-height: 1.45;
}
.in-hero-purple .in-hero-btns { gap: 12px; }
.in-hero-purple .in-btn,
.in-hero-purple .in-btn-ghost {
    min-height: 60px; display: inline-flex; align-items: center; justify-content: center;
    border-radius: 999px; padding: 7px 8px 7px 25px; font-size: 15px;
    transition: transform .2s ease, background .2s ease, border-color .2s ease;
}
.in-hero-purple .in-btn { gap: 18px; background: #fff; color: #0B1220; }
.in-hero-purple .in-btn-ghost {
    padding-right: 25px; color: #fff; border-color: rgba(255,255,255,.58);
}
.in-hero-purple .in-btn:hover,
.in-hero-purple .in-btn-ghost:hover { transform: translateY(-2px); }
.in-hero-purple .in-btn-ghost:hover { background: rgba(255,255,255,.10); border-color: #fff; }
.in-hero-arrow {
    width: 46px; height: 46px; display: grid; place-items: center; border-radius: 50%;
    background: #5E689A; color: #fff;
}
.in-hero-arrow svg { width: 18px; height: 18px; }
.in-hero-panel {
    align-self: end; padding: clamp(30px, 3vw, 48px); border-radius: 30px;
    background: rgba(94,104,154,.34); border: 1px solid rgba(255,255,255,.09);
    box-shadow: 0 28px 70px rgba(100,59,129,.20);
    -webkit-backdrop-filter: blur(12px); backdrop-filter: blur(12px);
}
.in-hero-panel .in-hero-panel-eyebrow {
    margin: 0 0 24px; color: rgba(255,255,255,.66); font-size: 12px;
    font-weight: 600; letter-spacing: .14em; text-transform: uppercase;
}
.in-hero-panel h2 { margin: 0 0 26px; color: #fff; font-size: 24px; line-height: 1.2; }
.in-hero-panel-item { padding: 22px 0; border-top: 1px solid rgba(255,255,255,.16); }
.in-hero-panel-item:first-of-type { padding-top: 0; border-top: 0; }
.in-hero-panel-item:last-child { padding-bottom: 0; }
/* Przycisk w panelu ma byc subtelniejszy niz CTA z samego hero — mniejsza
   wysciolka i stopien, zeby nie konkurowal z glownymi przyciskami obok.
   Prosba Bartka 27.08.2026. */
/* ⚠️ Selektor MUSI byc dwuklasowy. `.in-hero-panel-item p` to (0,1,1), czyli
   bije samo `.in-hero-panel-cta` (0,1,0) — i narzucalo akapitowi `margin: 0`
   razem z interlinia 1.62, przez co przycisk nie mial odstepu i byl wysoki. */
.in-hero-panel-item .in-hero-panel-cta { margin: 18px 0 0; line-height: 1; }
.in-hero-panel-cta .in-btn-ghost {
    display: inline-block;
    padding: 7px 16px;
    font-size: 13px;
    line-height: 1.2;          /* bez tego dziedziczy 1.62 z akapitu */
    border-radius: 999px;
    color: #fff;
    border-color: rgba(255,255,255,.42);
    text-decoration: none;
}
.in-hero-panel-cta .in-btn-ghost:hover {
    background: rgba(255,255,255,.14);
    border-color: rgba(255,255,255,.75);
}
/* Odnosnik w tekscie sekcji. Serwis ma `a { color: inherit }`, wiec do tej pory
   link w zdaniu byl nie do odroznienia — ale zadne pole sekcji linkow nie
   przepuszczalo, wiec styl nie byl potrzebny. Trzymamy sie wzorca, ktory juz
   dziala w FAQ (.in-faq-sub a) i w tresci wpisow (.in-art-body a): fiolet marki
   i podkreslenie z odstepem 3 px. Prosba Bartka 27.08.2026. */
/* `:not(...)` jest tu konieczne: przycisk panelu tez jest odnosnikiem w akapicie
   i bez tego dostawal podkreslenie razem ze zwyklymi linkami w zdaniu. */
.in-sec .in-lead a:not(.in-btn):not(.in-btn-ghost),
.in-cb-p a:not(.in-btn):not(.in-btn-ghost),
.in-hero-panel-item p a:not(.in-btn):not(.in-btn-ghost) { text-decoration: underline; text-underline-offset: 3px; }
.in-sec .in-lead a:not(.in-btn):not(.in-btn-ghost) { color: var(--brand-primary, #643B81); }
/* Na ciemnym tle fiolet marki jest nieczytelny — tam link zostaje w kolorze
   tekstu, a rozpoznawalnosc daje samo podkreslenie. */
.in-hero-panel-item p a:not(.in-btn):not(.in-btn-ghost),
.in-hero-purple .in-lead a:not(.in-btn):not(.in-btn-ghost) { color: inherit; }
.in-hero-panel-item h3 { margin: 0 0 8px; color: #fff; font-size: 17px; font-weight: 600; }
.in-hero-panel-item p { margin: 0; color: rgba(255,255,255,.83); font-size: 15px; line-height: 1.62; }

/* Zdjęcie zamiast panelu w prawej kolumnie hero (build.py → render_hero).
   Ten sam promień i cień co panel, żeby oba warianty siedziały w jednym rytmie;
   zdjęcia produktowe mają jasne tło, więc dostają delikatną białą ramkę —
   bez niej krawędź kadru ginie w jasnym dole gradientu. */
/* Promień mniejszy niż w panelu (30 px): w kadrze stoi okładka książki, a przy
   dużym zaokrągleniu wyglądałaby, jakby ktoś obciął jej rogi. */
.in-hero-shot {
    align-self: end; margin: 0; border-radius: 16px; overflow: hidden;
    border: 1px solid rgba(255,255,255,.18);
    box-shadow: 0 30px 68px rgba(20,10,32,.42);
}
/* margin: 0 jest konieczne — obrazki w treści mają globalny dolny margines,
   który tutaj zostawiał pasek tła pod zdjęciem, w środku zaokrąglonej ramki */
.in-hero-shot img { display: block; width: 100%; height: auto; margin: 0; }
/* zdjęcie bez tła (PNG z alfą): bez ramki i kadru — sam przedmiot na gradiencie,
   z miękkim cieniem rzucanym po jego kształcie, nie po prostokącie */
.in-hero-shot--cutout {
    border: 0; border-radius: 0; overflow: visible; box-shadow: none;
    filter: drop-shadow(0 26px 42px rgba(20,10,32,.42));
}

/* Wariant z pasem liczb — uzywany przez strone Gry. Liczby zostaja czescia
   hero, zamiast wisiec w osobnej jasnej sekcji pod fioletem. */
/* Liczby sa bialym tekstem i jako ostatni element hero ladowaly najglebiej
   w pasmie wygaszenia — „max. 12" i podpisy siadaly juz na prawie czystej
   bieli. Strefa bezpieczna w tym wariancie konczy sie wiec wyzej (66% zamiast
   43% wysokosci fade), zeby caly pas liczb zostal na kolorze. */
/* DESKTOP: pas liczb ma stac CALKOWICIE NAD wygaszeniem, nie w jego gornej
   czesci. Przy .66 fade konczyl sie 34% w glab bieli i biale „od 1000 zł"
   razem z etykietami po prostu znikalo — na mobile to samo naprawia blok
   @media (max-width: 980px), tam ostatnia jest karta, nie liczby.
   Zamiast odsuwac tresc coraz wyzej (rosnie pusty gradient), SKRACAMY samo
   wygaszenie: 30vh zamiast 46vh. Wysokosc hero zostaje ta sama co dotad
   (294 vs 291 px przy oknie 900), a liczby maja pod soba 24 px zapasu.

   Korekta: caly fade pod liczbami (mnoznik 1.0) sadzal je za wysoko — pod
   pasem zostawal duzy pusty gradient. 75% wygaszenia opuszcza je o ~90 px
   przy oknie 1100 i nadal trzyma nad jego jasna czescia: przy tej wysokosci
   biel ma ~12% krycia, wiec i „od 1000 zł", i szare etykiety zostaja czytelne. */
.in-hero-purple-kpis { padding-top: 144px;
                       --in-fade: clamp(240px, 30vh, 360px);
                       --in-fade-safe: calc(var(--in-fade) * .75 + 18px);
                       padding-bottom: var(--in-fade-safe); }
.in-hero-purple-kpis > .in-wrap {
    min-height: calc(100svh - 144px - var(--in-fade-safe)); grid-template-rows: minmax(0, 1fr) auto;
    row-gap: 28px;
}
.in-hero-purple-kpis h1 { max-width: 16.5ch; font-size: clamp(54px, 5.25vw, 94px); }
.in-hero-purple-kpis .in-eyebrow { margin-bottom: 28px; }
.in-hero-purple-kpis .in-lead { margin-bottom: 24px; font-size: clamp(18px, 1.25vw, 22px); }
.in-hero-purple-kpis .in-hero-note { display: none; }
/* Liczby siedza pod tekstem, w lewej kolumnie hero — grupa obok siebie,
   a nie trzy pola rozciagniete na cala szerokosc sekcji. */
.in-hero-kpis {
    grid-column: 1; list-style: none; margin: 0; padding: 24px 0 0;
    display: flex; flex-wrap: wrap; gap: 20px clamp(38px, 4vw, 68px);
    border-top: 1px solid rgba(255,255,255,.30);
}
/* Kontener „pierwszego ekranu" (tekst + liczby) z build.py. Na desktopie ma
   byc przezroczysty dla siatki — `display: contents` sprawia, ze jego dzieci
   nadal sa elementami gridu `.in-wrap` i uklad jest taki jak przed jego
   wprowadzeniem. Rola kontenera wlacza sie dopiero na mobile (patrz @media). */
.in-hero-fold { display: contents; }
/* Panel przypiety jawnie do prawej kolumny, w pierwszym wierszu. Bez tego
   auto-placement gridu wysyla go do wiersza 2 — kolejnosc w DOM zmienila sie
   na main → liczby → panel, a kursor rozmieszczania nie cofa sie do gory.
   TYLKO od 981px: nizej siatka ma jedna kolumne, a `grid-column: 2` tworzy
   tam kolumne domnieman i wciska tresc w waski slupek. */
@media (min-width: 981px) {
    .in-hero-purple-kpis .in-hero-panel { grid-column: 2; grid-row: 1; }
}
.in-hero-kpis li { min-width: 0; }
.in-hero-kpis b {
    display: block; margin: 0 0 2px; color: #fff;
    font-family: var(--font-heading, 'Baloo 2', sans-serif); font-size: clamp(32px, 2.5vw, 44px);
    font-weight: 400; line-height: 1; letter-spacing: -.02em; white-space: nowrap;
}
.in-hero-kpis span { color: rgba(255,255,255,.72); font-size: 14px; line-height: 1.4; }

@media (max-width: 980px) {
    .in-hero-purple { min-height: auto; padding: 154px 0 68px; }
    .in-hero-purple > .in-wrap { min-height: 0; grid-template-columns: 1fr; gap: 56px; }
    .in-hero-purple h1 { max-width: 12ch; font-size: clamp(58px, 10.2vw, 88px); }
    .in-hero-panel { max-width: 720px; }
    /* Dluzsze rozmycie w biel: hero jest teraz o cala karte wyzsze, a pasmo
       bieli jest zakotwiczone w dolnej krawedzi sekcji. Przy krotkim gradiencie
       karta ladowala w srodku wygaszenia i robila sie nieczytelna.
       `--in-fade-safe` (43% fade + 18px) odsuwa tresc znad bieli — na tym
       breakpoincie padding-bottom byl na sztywno 68px, co te zaleznosc zrywalo. */
    /* Selektor dwuklasowy celowo: dalej w pliku siedza `.in-hero-sub
       { padding: 150px 0 56px }` (860px) i `{ padding: 126px 0 48px }` (600px),
       ktore przy jednej klasie wygrywaja kolejnoscia. `--in-hero-pt` wiaze
       padding gory z `min-height` folda — inaczej liczby rozjezdzaja sie
       z dolna krawedzia ekranu o roznice miedzy jednym a drugim. */
    .in-hero-purple-kpis.in-hero-sub {
        --in-hero-pt: 154px; --in-fade: clamp(440px, 58vh, 720px);
        /* Bazowe .43 stawia dol tresci w 43% wygaszenia — tam biel ma juz ~40%
           i karta robila sie mleczna. Tu ostatnim elementem jest cala karta,
           nie sama linijka liczb, wiec odsuwamy ja do ~22% wygaszenia. */
        --in-fade-safe: calc(var(--in-fade) * .74 + 18px);
        padding-top: var(--in-hero-pt); padding-bottom: var(--in-fade-safe);
    }
    .in-hero-purple-kpis > .in-wrap { grid-template-rows: auto; }
    /* Kontener przejmuje role dopiero tutaj: dokladnie pierwszy ekran, liczby
       dociagniete `margin-top: auto` do jego dolnej krawedzi. Hero ma
       `margin-top: -96px`, wiec jego gora = gora okna i 100svh sie zgadza. */
    .in-hero-purple-kpis .in-hero-fold {
        display: flex; flex-direction: column; min-width: 0;
        min-height: calc(100svh - var(--in-hero-pt));
    }
    .in-hero-purple-kpis .in-hero-kpis { margin-top: auto; }
    .in-hero-purple-kpis h1 { max-width: 13ch; font-size: clamp(52px, 8.8vw, 76px); }
    .in-hero-kpis { gap: 20px 40px; }
}
@media (min-width: 981px) and (max-height: 880px) {
    .in-hero-purple { --in-fade: 310px; padding-top: 124px; }
    .in-hero-purple > .in-wrap { min-height: calc(100svh - 128px - var(--in-fade-safe)); }
    .in-hero-purple-kpis { padding-top: 128px; }
    .in-hero-purple .in-eyebrow { margin-bottom: 30px; }
    .in-hero-purple h1 { margin-bottom: 22px; }
    .in-hero-purple .in-lead { margin-bottom: 24px; font-size: 18px; }
    .in-hero-panel { padding: 28px 30px; }
    .in-hero-panel h2 { margin-bottom: 20px; font-size: 22px; }
    .in-hero-panel-item { padding: 16px 0; }
    .in-hero-panel-item p { font-size: 14px; line-height: 1.5; }
}
@media (max-width: 600px) {
    .in-hero-purple { margin-top: -82px; padding: 128px 0 44px; }
    .in-hero-purple > .in-wrap { gap: 40px; }
    .in-hero-purple .in-eyebrow { margin-bottom: 32px; min-height: 38px; padding: 8px 15px; }
    .in-hero-purple h1 { margin-bottom: 24px; font-size: clamp(48px, 14.2vw, 62px); line-height: .97; }
    .in-hero-purple .in-lead { margin-bottom: 28px; font-size: 18px; }
    .in-hero-purple .in-hero-btns { gap: 14px; }
    .in-hero-purple .in-btn,
    .in-hero-purple .in-btn-ghost { min-height: 56px; }
    .in-hero-purple .in-btn { justify-content: space-between; }
    .in-hero-purple .in-hero-btns > .in-btn,
    .in-hero-purple .in-hero-btns > .in-btn-ghost { text-align: left; }
    .in-hero-arrow { width: 42px; height: 42px; }
    .in-hero-panel { padding: 28px 24px; border-radius: 22px; }
    .in-hero-panel h2 { font-size: 22px; }
    .in-hero-purple-kpis.in-hero-sub { --in-hero-pt: 128px; }
    .in-hero-purple-kpis h1 { font-size: clamp(44px, 12.2vw, 54px); }
    .in-hero-kpis { padding-top: 22px; gap: 20px 28px; }
    .in-hero-kpis b { font-size: 30px; }
    .in-hero-kpis span { font-size: 13px; }
}

.in-h3 { margin: 32px 0 12px; }
/* nagłówek modułu wewnątrz bloku `media` (heading_big) — wielkość sekcyjna,
   bo zastępuje nagłówek sekcji, gdy cały tekst stoi w kolumnie obok zdjęcia */
.in-media-h { margin: 0 0 18px; line-height: 1.1; }
.in-sec > .in-wrap > .in-lead:first-of-type { max-width: 860px; }

/* listy */
.in-check, .in-bullets { list-style: none; padding: 0; margin: 0 0 24px; display: grid; gap: 10px; }
.in-check li, .in-bullets li { position: relative; padding-left: 30px; font-size: 16px; line-height: 1.6; }
.in-check li, .in-bullets li { min-width: 0; overflow-wrap: anywhere; }
.in-check li::before {
    content: ""; position: absolute; left: 4px; top: 7px; width: 6px; height: 11px;
    border: solid var(--brand-primary, #643B81); border-width: 0 2px 2px 0; transform: rotate(45deg);
}
.in-bullets li::before {
    content: ""; position: absolute; left: 6px; top: 10px; width: 6px; height: 6px;
    border-radius: 50%; background: var(--brand-primary, #643B81);
}

/* karty w siatce */
.in-grid2, .in-grid3 { display: grid; gap: 24px; }
.in-grid2 { grid-template-columns: repeat(2, 1fr); }
.in-grid3 { grid-template-columns: repeat(3, 1fr); }
.in-card-b { padding: 22px; }
/* ikona karty — cienka kreska w kolorze marki, ten sam jezyk co ikony
   modulu „Wzorce" na homepage. Wstawia ja pole "icon" przy pozycji
   bloku `cards`; bez niego karta wyglada jak dotad. */
.in-card-ic { display: block; width: 46px; height: 46px; margin: 2px 0 22px;
              color: var(--brand-primary, #643B81); }
.in-card-ic svg { display: block; width: 100%; height: 100%; }
.in-card-b h3 { padding: 0; margin: 0 0 10px; }
.in-card-b p { font-size: 15px; line-height: 1.6; color: var(--color-text-muted, #413B4D); margin: 0; }
.in-card-l { display: inline-block; margin-top: 14px; font-size: 14px; font-weight: 600;
             color: var(--brand-primary, #643B81); }
a.in-card:hover .in-card-l { text-decoration: underline; }

/* Duze kafle z ikonami — wariant sekcji "Dlaczego numeroterapia?".
   Zachowuja tresc kart, ale przejmuja bardziej przestrzenny, miekki wyglad
   kart poziomow pracy z podstrony Gry. */
.in-sec.in-icon-cards .in-grid3 { gap: 24px; align-items: stretch; }
.in-sec.in-icon-cards .in-card {
    min-height: 360px; border-radius: 28px; overflow: hidden;
    /* tlo 1:1 z .in-pn-it na homepage (13.08): poswiaty w rogach na bieli */
    background:
        radial-gradient(78% 62% at 78% 12%, rgba(140,102,178,.20) 0%, rgba(140,102,178,0) 62%),
        radial-gradient(70% 58% at 12% 88%, rgba(103,182,192,.18) 0%, rgba(103,182,192,0) 60%),
        #fff;
    border: 1px solid rgba(198,196,216,.55);
    box-shadow: 0 18px 48px rgba(100,59,129,.08);
    transition: transform .3s ease, box-shadow .3s ease, border-color .3s ease;
}
.in-sec.in-icon-cards .in-card:hover {
    transform: translateY(-4px); border-color: rgba(100,59,129,.46);
    box-shadow: 0 26px 58px rgba(100,59,129,.13);
}
.in-sec.in-icon-cards .in-card-b { height: 100%; padding: 42px 38px 44px; }
.in-sec.in-icon-cards .in-card-ic {
    width: 58px; height: 58px; margin: 0 0 30px; color: var(--brand-primary, #643B81);
}
/* tytul serifem jak na homepage; DM Serif Display ma tylko wage 400 */
.in-sec.in-icon-cards .in-card-b h3 {
    margin: 0 0 14px; font-family: var(--font-display, Georgia, serif);
    font-weight: 400; line-height: 1.25;
}
.in-sec.in-icon-cards .in-card-b p {
    margin: 0; color: var(--color-text-muted, #413B4D); font-size: 16px; line-height: 1.68;
}
@media (max-width: 900px) {
    .in-sec.in-icon-cards .in-grid3 { grid-template-columns: 1fr; }
    .in-sec.in-icon-cards .in-card { min-height: 0; }
}
@media (max-width: 600px) {
    .in-sec.in-icon-cards .in-card { border-radius: 22px; }
    .in-sec.in-icon-cards .in-card-b { padding: 32px 28px 34px; }
    .in-sec.in-icon-cards .in-card-ic { width: 52px; height: 52px; margin-bottom: 24px; }
}

/* ══════════════════════════════════════════════════════════════════
   OBSZARY PRACY JAKO PRZEMIENIAJACE SIE KLOCKI
   variant: "services-stack"
   ──────────────────────────────────────────────────────────────────
   Lewa kolumna zostaje w kadrze, prawa jest pionowym stosem duzych kart.
   Skrypt w shellu wyznacza karte najblizsza srodkowi ekranu i dodaje jej
   .is-active. Sasiednie stany maja inne przesuniecie i skale, dlatego przy
   przewijaniu kompozycja uklada sie na nowo zamiast tylko zmieniac kolor.
   ══════════════════════════════════════════════════════════════════ */
.in-sec.in-services-stack { padding-block: 112px 136px; overflow: clip; }
.in-sec.in-services-stack > .in-wrap {
    /* Kolumny po rowno: naglowek ma zmiescic sie w dwoch linijkach przy
       obowiazujacej skali h2 = 40px (patrz blok skali na koncu index.html).
       Prawa kolumna nadal trzyma minimum 560px, wiec karty sie nie zwezaja. */
    display: grid; grid-template-columns: minmax(330px, 6fr) minmax(560px, 6fr);
    gap: clamp(56px, 5vw, 84px); align-items: start;
}
.in-services-head {
    grid-column: 1; position: sticky; top: 118px; min-width: 0;
    padding-bottom: 34px;
}
.in-services-head h2 {
    /* bylo 10.5ch — dlugie naglowki lamaly sie na piec linijek */
    max-width: 30ch; margin: 0; font-family: var(--font-heading, 'Baloo 2', sans-serif);
    font-weight: 400; line-height: .96;
    letter-spacing: -.035em; text-wrap: balance;
}
.in-services-head::after {
    content: ""; display: block; width: min(100%, 420px); height: 1px;
    margin-top: 36px; background: rgba(100,59,129,.36);
}
.in-services-head .in-lead { max-width: 38ch; margin-top: 28px; }
.in-services-eyebrow {
    margin: 0 0 22px; color: var(--brand-primary, #643B81); font-size: 12px;
    font-weight: 700; line-height: 1.3; letter-spacing: .18em; text-transform: uppercase;
}

.in-services-list {
    grid-column: 2; display: grid; grid-template-columns: 1fr !important;
    gap: 34px !important; margin: 0; counter-reset: in-service;
    perspective: 1200px;
}
.in-services-list > .in-card {
    --service-x: 0px;
    counter-increment: in-service; position: relative; isolation: isolate;
    min-height: 354px; display: grid;
    grid-template-columns: minmax(0, 1.28fr) minmax(220px, .72fr);
    color: var(--color-text, #0B1220); background: rgba(255,255,255,.82);
    border: 1px solid rgba(255,255,255,.94); border-radius: 30px; overflow: hidden;
    box-shadow: 0 18px 48px rgba(100,59,129,.08);
    opacity: .82; transform: translateX(var(--service-x)) scale(.982);
    transform-origin: 50% 50%; will-change: transform;
    transition: transform .7s cubic-bezier(.2,.82,.25,1), opacity .5s ease,
                background-color .55s ease, border-color .55s ease,
                box-shadow .55s ease, color .55s ease;
}
.in-services-list > .in-card:nth-child(3n + 2) { --service-x: 26px; }
.in-services-list > .in-card:nth-child(3n) { --service-x: 10px; }
.in-services-list > .in-card.is-past {
    --service-x: 34px; opacity: .62; transform: translateX(var(--service-x)) scale(.958);
}
.in-services-list > .in-card.is-next {
    --service-x: 16px; opacity: .9; transform: translateX(var(--service-x)) scale(.992);
}
.in-services-list > .in-card.is-active,
.in-services-list > .in-card:hover,
.in-services-list > .in-card:focus-visible {
    --service-x: -30px; z-index: 2; opacity: 1;
    color: #fff; background: var(--brand-900, #643B81);
    border-color: rgba(100,59,129,.44);
    box-shadow: 0 32px 76px rgba(100,59,129,.25);
    transform: translateX(var(--service-x)) scale(1.018);
}

.in-services-list > .in-card > img {
    grid-column: 2; grid-row: 1; align-self: end; justify-self: end;
    display: block; width: calc(100% - 26px); height: calc(100% - 26px);
    margin: 26px 26px 0 0; aspect-ratio: auto; object-fit: cover;
    border-radius: 999px 999px 0 0; filter: saturate(.88) contrast(.98);
    transform: scale(1.001); transform-origin: center bottom;
    transition: transform .8s cubic-bezier(.2,.82,.25,1), filter .55s ease;
}
.in-services-list > .in-card.is-active > img,
.in-services-list > .in-card:hover > img,
.in-services-list > .in-card:focus-visible > img {
    filter: saturate(1) contrast(1.02); transform: scale(1.045);
}
.in-services-list > .in-card > .in-card-b {
    grid-column: 1; grid-row: 1; min-width: 0; display: flex; flex-direction: column;
    align-items: flex-start; padding: 42px 22px 40px 42px;
}
.in-services-list > .in-card > .in-card-b::before {
    content: "OBSZAR " counter(in-service, decimal-leading-zero);
    display: block; margin-bottom: 28px; color: var(--brand-primary, #643B81);
    font-size: 11px; font-weight: 700; line-height: 1.2; letter-spacing: .16em;
    transition: color .55s ease;
}
.in-services-list .in-card-b h3 {
    margin: 0 0 14px; font-weight: 600;
    line-height: 1.12; letter-spacing: -.02em; color: inherit;
}
.in-services-list .in-card-b p {
    margin: 0 0 26px; color: var(--color-text-muted, #413B4D);
    font-size: 15px; line-height: 1.62; transition: color .55s ease;
}
.in-services-list .in-card-l {
    display: inline-flex; align-items: center; gap: 12px; margin: auto 0 0;
    padding: 7px 7px 7px 17px; color: var(--brand-primary, #643B81);
    border: 1px solid currentColor; border-radius: 999px; font-size: 13px;
    font-weight: 650; line-height: 1; text-decoration: none;
    transition: color .45s ease, background-color .45s ease;
}
.in-services-list .in-card-l::after {
    content: "\2192"; display: grid; place-items: center; width: 32px; height: 32px;
    color: #fff; background: var(--brand-primary, #643B81); border-radius: 50%;
    transition: transform .35s ease, color .45s ease, background-color .45s ease;
}
.in-services-list > .in-card.is-active .in-card-b::before,
.in-services-list > .in-card:hover .in-card-b::before,
.in-services-list > .in-card:focus-visible .in-card-b::before { color: var(--brand-300, #C6C4D8); }
.in-services-list > .in-card.is-active .in-card-b p,
.in-services-list > .in-card:hover .in-card-b p,
.in-services-list > .in-card:focus-visible .in-card-b p { color: rgba(255,255,255,.76); }
.in-services-list > .in-card.is-active .in-card-l,
.in-services-list > .in-card:hover .in-card-l,
.in-services-list > .in-card:focus-visible .in-card-l {
    color: #fff; background: rgba(255,255,255,.06);
}
.in-services-list > .in-card.is-active .in-card-l::after,
.in-services-list > .in-card:hover .in-card-l::after,
.in-services-list > .in-card:focus-visible .in-card-l::after {
    color: var(--brand-900, #643B81); background: #fff; transform: translateX(2px);
}
.in-services-list > a.in-card:hover .in-card-l { text-decoration: none; }

@media (max-width: 1050px) {
    .in-sec.in-services-stack { padding-block: 88px 112px; }
    .in-sec.in-services-stack > .in-wrap { grid-template-columns: 1fr; gap: 48px; }
    .in-services-head { grid-column: 1; position: static; padding-bottom: 0; }
    .in-services-head h2 { max-width: 13ch; }
    .in-services-list { grid-column: 1; }
    .in-services-list > .in-card,
    .in-services-list > .in-card.is-past,
    .in-services-list > .in-card.is-next { --service-x: 0px; }
    .in-services-list > .in-card.is-active,
    .in-services-list > .in-card:hover,
    .in-services-list > .in-card:focus-visible {
        --service-x: 0px; transform: translateY(-4px) scale(1.006);
    }
}
@media (max-width: 680px) {
    .in-sec.in-services-stack { padding-block: 72px 88px; }
    .in-sec.in-services-stack > .in-wrap { gap: 34px; }
    .in-services-head h2 { max-width: none; line-height: .98; }
    .in-services-head::after { margin-top: 26px; }
    .in-services-list { gap: 22px !important; }
    /* Karta powtarza luk zdjecia: gora to kopula, dol zwykle zaokraglenie.
       Promien elipsy (50% szerokosci / 124 px wysokosci) jest o 18 px glebszy
       niz na zdjeciu — dokladnie tyle, ile wynosi odsuniecie zdjecia od
       krawedzi — wiec oba luki sa wspolsrodkowe zamiast przecinac sie. */
    .in-services-list > .in-card {
        min-height: 0; grid-template-columns: 1fr; grid-template-rows: 232px auto;
        border-radius: 50% 50% 24px 24px / 124px 124px 24px 24px; opacity: .9;
    }
    .in-services-list > .in-card > img {
        grid-column: 1; grid-row: 1; align-self: end; justify-self: center;
        width: calc(100% - 36px); height: 214px; margin: 18px 18px 0;
        border-radius: 50% 50% 0 0 / 106px 106px 0 0;
    }
    .in-services-list > .in-card > .in-card-b {
        grid-column: 1; grid-row: 2; padding: 29px 25px 30px;
    }
    .in-services-list > .in-card > .in-card-b::before { margin-bottom: 20px; }
    .in-services-list .in-card-b p { font-size: 15px; line-height: 1.58; }
}
/* ══════════════════════════════════════════════════════════════════
   OBRAZ + TEKST (blok `media`)
   ──────────────────────────────────────────────────────────────────
   Zdjecie dostaje ten sam wyglad co portret w module „o zalozycielce"
   na homepage: promien 24 px i miekki cien. Kolumna ze zdjeciem jest
   odrobine wezsza od tekstowej (0.92fr) — dokladnie jak tam.

   Zdjecie jest PRZYKLEJONE przy scrollu: kolumna z tekstem bywa
   znacznie wyzsza, a bez tego zdjecie zostawalo samotnie na gorze
   i pod nim ziala pusta polowa sekcji.

   WAZNE: tekst, ktory ma stac obok zdjecia, musi byc W BLOKU `media`
   (pole `paragraphs` albo zagniezdzone `blocks`). Akapity postawione
   w JSON-ie PO bloku media renderuja sie pod spodem, pelna szerokoscia,
   i uklad sie rozjezdza.
   ══════════════════════════════════════════════════════════════════ */
/* STICKY SIEDZI NA <img>, NIE NA KOMORCE.
   Komorka musi byc WYZSZA od przyklejanego elementu, inaczej sticky nie ma
   po czym jechac. Przy align-items:start komorka kurczyla sie do wysokosci
   zdjecia i przyklejenie nie robilo nic. Teraz komorka rozciaga sie na cala
   wysokosc wiersza (stretch), a przykleja sie samo zdjecie w srodku. */
.in-two { align-items: stretch; }
.in-media-i { position: static; }
.in-media-i img { position: sticky; top: 110px;
                  border-radius: 24px; width: 100%; object-fit: cover;
                  box-shadow: 0 26px 60px rgba(100,59,129,.10); }
.in-two > div > .in-h3:first-child { margin-top: 0; }

@media (max-width: 900px) {
    .in-media-i { position: static; }
    .in-media-i img { position: static; }
}

/* ══════════════════════════════════════════════════════════════════
   KROKI — układ redakcyjny
   ──────────────────────────────────────────────────────────────────
   Bez kafelków i ramek: wielki numer serifem w lewej szynie, kreska,
   obok tytuł wersalikami i treść. Kontrast robi rozmiar liczby
   i odstęp, nie tło.

   Numer jest DOKLEJANY W CSS (::before z content: attr) i dopełniany
   zerem, żeby „1" wyglądało jak „01". Sam <span> chowamy — dzięki temu
   nie trzeba zmieniać ani build.py, ani treści w JSON-ach. Krok z własną
   etykietą (np. „0" albo „A") zachowa ją bez dopełnienia.
   ══════════════════════════════════════════════════════════════════ */
.in-steps { list-style: none; padding: 0; margin: 0;
            display: grid; gap: 0; counter-reset: instep; }
.in-step { counter-increment: instep;
           display: grid; grid-template-columns: 96px 44px minmax(0, 1fr);
           gap: 0 20px; align-items: start;
           padding: 30px 0 32px; border-top: 1px solid rgba(11,18,32,.14); }
.in-step:last-child { border-bottom: 1px solid rgba(11,18,32,.14); }

/* wielka liczba */
.in-step::before {
    grid-column: 1; grid-row: 1;
    content: counter(instep, decimal-leading-zero);
    font-family: var(--font-heading, 'Baloo 2', sans-serif); font-weight: 300;
    font-size: 46px; line-height: 1; letter-spacing: .02em;
    color: var(--brand-400, #5E689A);
}
/* kreska łącząca liczbę z treścią */
.in-step::after {
    grid-column: 2; grid-row: 1;
    content: ""; align-self: start; margin-top: 22px;
    height: 1px; background: rgba(11,18,32,.28);
}
/* oryginalny <span> z numerem zostaje w DOM dla czytników ekranu,
   ale wizualnie zastępuje go ::before */
.in-step-n { position: absolute; width: 1px; height: 1px; overflow: hidden;
             clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap; }

.in-step-b { grid-column: 3; grid-row: 1; }
.in-step-b h3 { font-weight: 700; letter-spacing: .12em;
                text-transform: uppercase; margin: 0 0 12px; line-height: 1.5; }
.in-step-b p { font-size: 15px; line-height: 1.7; color: var(--color-text-muted, #413B4D);
               margin: 0 0 10px; max-width: 68ch; }
.in-step-b p:last-child, .in-step-b ul:last-child { margin-bottom: 0; }
.in-step-b ul { margin-bottom: 14px; }
.in-step-b .in-bullets li { font-size: 15px; color: var(--color-text-muted, #413B4D); }

@media (max-width: 700px) {
    .in-step { grid-template-columns: 54px minmax(0, 1fr); gap: 0 16px; padding: 24px 0 26px; }
    .in-step-b { grid-column: 2; }
    .in-step::before { font-size: 34px; }
    .in-step::after { display: none; }   /* na wąskim ekranie kreska zjada szerokość treści */
}

/* ══════════════════════════════════════════════════════════════════
   OS KROKOWA — variant: "axis"
   ──────────────────────────────────────────────────────────────────
   Po lewej przyklejona glowa sekcji ze zdjeciem, po prawej pionowa os:
   kropka przy kazdym kroku i kreska, ktora wypelnia sie w rytmie scrolla
   (skrypt w sekcji ustawia `--p` 0..1 na liscie i klase `is-on` na kroku).

   Stan poczatkowy (przygaszony krok zsuniety w dol) obowiazuje TYLKO gdy
   sekcja ma klase `in-axis-anim` — doklada ja skrypt. Bez JavaScriptu
   wszystkie kroki sa od razu widoczne i czytelne.

   Efekt NIE jest gated na prefers-reduced-motion — swiadomie, tak samo
   jak hero na homepage (patrz CLAUDE.md).
   ══════════════════════════════════════════════════════════════════ */
.in-sec.in-axis > .in-axis-grid {
    display: grid; grid-template-columns: minmax(0, 5fr) minmax(0, 7fr);
    gap: 0 80px; align-items: start;
}
.in-axis-head { position: sticky; top: 112px; max-width: 46ch; }
.in-axis-eyebrow { margin: 0 0 14px; font-size: 12px; font-weight: 600;
                   letter-spacing: .14em; text-transform: uppercase;
                   color: var(--brand-primary, #643B81); }
.in-axis-head > h2 { margin-top: 0; }
.in-axis-head .in-lead { margin-bottom: 26px; }
/* Scena trzyma proporcje sama (kadry sa w niej absolutne), inaczej kolumna
   zapadalaby sie przy przenikaniu zdjec. */
.in-axis-stage { position: relative; margin: 28px 0 0; aspect-ratio: 4 / 3;
                 border-radius: 24px; overflow: hidden; background: var(--in-soft, #F4F1F7); }
.in-axis-media { position: absolute; inset: 0; margin: 0;
                 opacity: 0; visibility: hidden;
                 transition: opacity .6s ease, transform .9s ease, visibility .6s; }
.in-axis-media.is-active { opacity: 1; visibility: visible; }
/* delikatny najazd kadru przy zmianie — bez niego przenikanie jest plaskie */
/* kadr trzymamy wyzej niz srodek — zrodla sa roznych proporcji (jedno pionowe)
   i przy `center` obcinalo twarze */
.in-axis-media img { display: block; width: 100%; height: 100%; object-fit: cover;
                     object-position: center 28%;
                     transform: scale(1.06); transition: transform 1.2s cubic-bezier(.2,.8,.25,1); }
.in-axis-media.is-active img { transform: scale(1); }
/* zdjecie w samym kroku — potrzebne dopiero na telefonie (patrz @media 1000px) */
.in-axis-step-media { display: none; }

.in-axis-steps { list-style: none; margin: 0; padding: 0; position: relative; --p: 0; }
/* tor osi — cienka kreska pod kropkami, od srodka pierwszej do srodka ostatniej */
.in-axis-steps::before, .in-axis-steps::after {
    content: ""; position: absolute; left: 9px; width: 2px; border-radius: 2px;
    /* ostatni krok nie ma juz kolejnej kropki, wiec kreska nie moze konczyc
       sie tepo pod akapitem — schodzi do zera na ostatniej cwiartce */
    -webkit-mask-image: linear-gradient(180deg, #000 76%, transparent 100%);
            mask-image: linear-gradient(180deg, #000 76%, transparent 100%);
}
/* 14px = margin-top kropki (4) + jej polowa (10), czyli srodek pierwszej kropki */
.in-axis-steps::before { top: 14px; bottom: 0; background: rgba(11,18,32,.12); }
/* wypelnienie — wysokosc sterowana zmienna `--p` ze skryptu */
.in-axis-steps::after {
    top: 14px; height: calc((100% - 14px) * var(--p));
    background: linear-gradient(180deg, var(--brand-primary, #643B81), var(--brand-400, #5E689A));
}
.in-axis-step {
    position: relative; display: grid; grid-template-columns: 20px minmax(0, 1fr);
    gap: 0 26px; padding-bottom: 54px;
}
.in-axis-step:last-child { padding-bottom: 0; }
.in-axis-dot {
    grid-column: 1; margin-top: 4px; width: 20px; height: 20px; border-radius: 50%;
    background: var(--in-bg, #fff); border: 2px solid rgba(11,18,32,.18);
    display: grid; place-items: center;
    transition: border-color .45s ease, transform .45s ease;
}
/* srodek kropki dojezdza dopiero, gdy krok sie zapali — sama zmiana koloru
   ramki bylaby ledwo widoczna przy 20 px */
.in-axis-dot::after {
    content: ""; width: 8px; height: 8px; border-radius: 50%;
    background: var(--brand-primary, #643B81); transform: scale(0);
    transition: transform .45s cubic-bezier(.2,.8,.25,1);
}
.in-axis-step.is-on .in-axis-dot { border-color: var(--brand-primary, #643B81); }
.in-axis-step.is-on .in-axis-dot::after { transform: scale(1); }

.in-axis-b { grid-column: 2; }
.in-axis-n { margin: 0 0 10px; font-family: var(--font-heading, 'Baloo 2', sans-serif);
             font-weight: 300; font-size: 15px; letter-spacing: .16em;
             color: var(--brand-400, #5E689A); }
.in-axis-b h3 { margin: 0 0 12px; font-family: var(--font-heading, 'Baloo 2', sans-serif);
                font-weight: 300; line-height: 1.2; }
.in-axis-b p { margin: 0 0 12px; font-size: 16px; line-height: 1.7;
               color: var(--color-text-muted, #413B4D); max-width: 60ch; }
.in-axis-b > :last-child { margin-bottom: 0; }

/* --- animacja wejscia (tylko z JS) --- */
.in-axis-anim .in-axis-step { opacity: .28; transform: translateY(22px);
                              transition: opacity .55s ease, transform .55s cubic-bezier(.2,.8,.25,1); }
.in-axis-anim .in-axis-step.is-on { opacity: 1; transform: none; }

@media (max-width: 1000px) {
    .in-sec.in-axis > .in-axis-grid { grid-template-columns: 1fr; gap: 34px; }
    .in-axis-head { position: static; max-width: none; }
    /* Kolumna przestaje byc przyklejona, wiec zmienny kadr nie ma jak dzialac —
       stos zdjec wyladowalby nad cala lista. Scena znika, a kazdy krok dostaje
       swoje zdjecie pod trescia. */
    .in-axis-stage { display: none; }
    .in-axis-step-media { display: block; margin: 18px 0 0; aspect-ratio: 16 / 10;
                          border-radius: 18px; overflow: hidden; background: var(--in-soft, #F4F1F7); }
    .in-axis-step-media img { display: block; width: 100%; height: 100%;
                              object-fit: cover; object-position: center 28%; }
}
@media (max-width: 620px) {
    .in-axis-step { gap: 0 18px; padding-bottom: 40px; }
    .in-axis-b p { font-size: 16px; }
}

/* ══════════════════════════════════════════════════════════════════
   KROKI JAKO KARTY — variant: "stack"
   ──────────────────────────────────────────────────────────────────
   Naglowek i lead po lewej (przyklejone przy scrollu), kroki po prawej
   jako biale karty jedna pod druga. Numer schodzi do roli malej etykiety
   nad tytulem — w tym ukladzie wielka cyfra konkurowalaby z naglowkiem.

   To DRUGI wyglad bloku `steps`. Domyslny (bez variantu) zostaje
   redakcyjny: wielka liczba w szynie i cienkie kreski. Wybierasz
   dopisujac "variant": "stack" w content/<slug>.json.
   ══════════════════════════════════════════════════════════════════ */
/* KAZDY element sekcji poza lista krokow ladduje w lewej kolumnie i plynie
   normalnie w dol; kroki zajmuja prawa kolumne. Wczesniej lewa kolumna miala
   sztywne trzy wiersze i dodatkowe bloki (akapit, cytat, zdjecie) wpadaly
   gdziekolwiek — najczesciej pod karty po prawej.

   grid-auto-rows: min-content + duzy span na krokach: nadmiar wysokosci
   kolumny z kartami trafia w puste wiersze na koncu, zamiast rozpychac
   wiersze z naglowkiem i leadem. */
.in-sec.in-stack > .in-wrap { display: grid; grid-template-columns: minmax(0, 5fr) minmax(0, 7fr);
                              gap: 0 80px; align-items: start; }
/* Cala lewa kolumna siedzi we WSPOLNYM wrapperze i to on jest przyklejony.
   Przyklejenie samego <h2> nie dziala: sticky zostawia po elemencie jego
   pierwotne miejsce, ale sam element odjezdza w dol i wjezdza na wlasne
   rodzenstwo (lead, akapity, cytat) — dokladnie ten blad byl na /mentoring. */
.in-sec.in-stack .in-stack-head { grid-column: 1; position: sticky; top: 120px;
                                  max-width: 46ch; }
.in-sec.in-stack .in-stack-head > h2 { margin: 0 0 18px; max-width: 16ch; }
.in-sec.in-stack .in-stack-head > .in-lead { margin: 0 0 18px; }
.in-sec.in-stack .in-stack-head > .in-btn { margin-top: 10px; }
.in-sec.in-stack .in-stack-head > .in-two { display: block; }
.in-sec.in-stack > .in-wrap > .in-steps { grid-column: 2; gap: 16px; }

/* karta zamiast wiersza na kreskach */
.in-sec.in-stack .in-step { display: block; padding: 28px 30px 30px;
                            background: var(--in-surface, #fff); border: 0;
                            border-radius: 18px; box-shadow: 0 14px 38px rgba(100,59,129,.06);
                            transition: background .45s ease, box-shadow .45s ease,
                                        color .45s ease; }
.in-sec.in-stack .in-step:last-child { border-bottom: 0; }
/* numer jako etykieta nad tytulem */
.in-sec.in-stack .in-step::before { font-family: inherit; font-size: 13px; font-weight: 600;
                                    letter-spacing: .1em; color: var(--color-text-muted, #413B4D);
                                    display: block; margin-bottom: 14px;
                                    transition: color .45s ease; }
.in-sec.in-stack .in-step::after { display: none; }
.in-sec.in-stack .in-step-b h3 { font-weight: 600; letter-spacing: 0;
                                 text-transform: none; margin: 0 0 10px; }
.in-sec.in-stack .in-step-b p { font-size: 15px; max-width: 62ch;
                                transition: color .45s ease; }

/* ——— KARTA ZE ZDJECIEM W ARKADZIE ———
   Pole "image" w itemie bloku steps. Kadr jak w katalogu obszarow
   (.in-services-list): prawa kolumna, luk u gory, dosuniety do dolnej
   krawedzi karty. Padding schodzi z karty na kolumne tekstu, inaczej
   zdjecie nie moze dojechac do krawedzi. Karta bez zdjecia zostaje blokiem. */
.in-sec.in-stack .in-step:has(.in-step-th) {
    display: grid; grid-template-columns: minmax(0, 1fr) minmax(186px, .38fr);
    grid-template-rows: auto 1fr; gap: 0 24px;
    padding: 0; overflow: hidden; min-height: 252px;
}
.in-sec.in-stack .in-step:has(.in-step-th)::before {
    grid-column: 1; grid-row: 1; margin: 28px 0 14px 30px;
}
.in-sec.in-stack .in-step:has(.in-step-th) .in-step-b {
    grid-column: 1; grid-row: 2; padding: 0 0 30px 30px;
}
.in-step-th {
    grid-column: 2; grid-row: 1 / span 2; align-self: end; justify-self: end;
    display: block; width: calc(100% - 24px); height: calc(100% - 24px);
    margin: 24px 24px 0 0; overflow: hidden;
    border-radius: 999px 999px 0 0;
}
/* zdjecia w assets/kroki/ sa juz przyciete z brandowanego sygnetu — kadr
   moze byc wysrodkowany */
.in-step-th img { display: block; width: 100%; height: 100%;
                  object-fit: cover; object-position: center;
                  filter: saturate(.92); }
@media (max-width: 760px) {
    .in-sec.in-stack .in-step:has(.in-step-th) {
        grid-template-columns: 1fr; grid-template-rows: auto auto auto;
        min-height: 0; gap: 0; }
    .in-sec.in-stack .in-step:has(.in-step-th)::before { margin: 26px 0 12px 24px; }
    .in-sec.in-stack .in-step:has(.in-step-th) .in-step-b { padding: 0 24px 22px; }
    .in-step-th { grid-column: 1; grid-row: 3; justify-self: stretch;
                  width: calc(100% - 48px); height: auto; margin: 0 24px 24px;
                  border-radius: 999px 999px 18px 18px; }
    .in-step-th img { aspect-ratio: 4 / 3; }
}

/* ——— KARTA W KADRZE ———
   Klase .is-active dokłada skrypt (poza <main> w index.html): zawsze dostaje ja
   dokladnie JEDNA karta — ta, ktorej srodek jest najblizej srodka ekranu.
   Dzieki temu przy scrollu ciemne wypelnienie plynnie przechodzi z karty
   na karte, zamiast zapalac sie po dwie naraz. */
.in-sec.in-stack .in-step.is-active { background: var(--brand-900, #643B81);
                                      box-shadow: 0 26px 60px rgba(100,59,129,.22); }
.in-sec.in-stack .in-step.is-active::before { color: var(--brand-300, #C6C4D8); }
.in-sec.in-stack .in-step.is-active .in-step-b h3 { color: #fff; }
.in-sec.in-stack .in-step.is-active .in-step-b p { color: rgba(255,255,255,.78); }
.in-sec.in-stack .in-step.is-active .in-bullets li { color: rgba(255,255,255,.78); }
.in-sec.in-stack .in-step.is-active .in-bullets li::before { background: var(--brand-300, #C6C4D8); }

@media (max-width: 1000px) {
    .in-sec.in-stack > .in-wrap { grid-template-columns: 1fr; gap: 24px; }
    .in-sec.in-stack .in-stack-head { position: static; max-width: none; }
    .in-sec.in-stack .in-stack-head > h2 { max-width: none; }
    .in-sec.in-stack > .in-wrap > .in-steps { grid-column: 1; margin-top: 8px; }
}

/* ══════════════════════════════════════════════════════════════════
   PROGRAM JAKO ANIMOWANY SHOWCASE — variant: "showcase"
   ──────────────────────────────────────────────────────────────────
   Duzy kadr po lewej zmienia sie razem z aktywnym krokiem po prawej.
   Skrypt siedzi poza <main> w index.html, zeby build.py przenosil go na
   wszystkie podstrony. Tresc i sciezki zdjec pozostaja w JSON-ie strony.
   ══════════════════════════════════════════════════════════════════ */
.in-sec.in-showcase { overflow: clip; }
.in-sec.in-showcase > .in-wrap {
    display: grid; grid-template-columns: minmax(0, 5fr) minmax(0, 7fr);
    gap: 48px 72px; align-items: start;
}
.in-showcase-stage {
    grid-column: 1; grid-row: 2;
    position: relative; aspect-ratio: 1 / 1; overflow: hidden;
    border-radius: 20px; background: var(--brand-100, #E7EDF9);
    box-shadow: 0 24px 60px rgba(100,59,129,.12);
}
.in-showcase-media {
    position: absolute; inset: 0; margin: 0; opacity: 0;
    transform: scale(1.045); pointer-events: none;
    transition: opacity .72s ease, transform 1.1s cubic-bezier(.2,.65,.25,1);
}
.in-showcase-media.is-active { opacity: 1; transform: scale(1); }
.in-showcase-media::after {
    content: ""; position: absolute; inset: 45% 0 0;
    background: linear-gradient(180deg, transparent, rgba(100,59,129,.72));
}
.in-showcase-media img { width: 100%; height: 100%; object-fit: cover; }
.in-showcase-media figcaption {
    position: absolute; z-index: 1; left: 28px; right: 28px; bottom: 24px;
    display: flex; align-items: flex-start; gap: 14px;
    color: #fff; font-size: 15px; font-weight: 600; line-height: 1.35;
}
.in-showcase-media figcaption span {
    flex: 0 0 auto; color: var(--brand-200, #C6C4D8);
    font-size: 12px; letter-spacing: .12em;
}
.in-showcase-copy { grid-column: 1 / -1; grid-row: 1; max-width: 1120px; }
.in-showcase-eyebrow {
    margin: 0 0 12px; color: var(--brand-primary, #643B81);
    font-size: 11px; font-weight: 700; letter-spacing: .16em;
    text-transform: uppercase;
}
.in-showcase-copy > h2 {
    max-width: none; margin: 0 0 18px;
    font-family: var(--font-heading, 'Baloo 2', sans-serif); font-weight: 400;
    line-height: 1.04; letter-spacing: -.015em;
}
.in-showcase-copy > h2 span { display: block; white-space: nowrap; }
.in-showcase-copy > .in-lead { max-width: 68ch; margin: 0 0 22px; font-size: 17px; }
.in-showcase-copy > .in-p { max-width: 68ch; margin: 0 0 11px; font-size: 15px; line-height: 1.6; }
.in-showcase-copy > .in-h3 { margin: 24px 0 10px; }
.in-showcase-copy > .in-quote { margin: 24px 0 0; padding: 0; }

.in-showcase-steps { grid-column: 2; grid-row: 2; list-style: none; margin: 0; padding: 0; }
.in-showcase-steps > li { border-top: 1px solid rgba(11,18,32,.16); }
.in-showcase-steps > li:last-child { border-bottom: 1px solid rgba(11,18,32,.16); }
.in-showcase-step {
    appearance: none; width: 100%; border: 0; margin: 0; padding: 34px 0;
    display: grid; grid-template-columns: 48px 38px minmax(0, 1fr) 78px;
    gap: 18px; align-items: start; background: transparent;
    color: var(--color-text, #0B1220); font: inherit; text-align: left;
    cursor: pointer; opacity: .58;
    transition: opacity .38s ease, transform .5s cubic-bezier(.2,.65,.25,1);
}
.in-showcase-step:hover, .in-showcase-step:focus-visible, .in-showcase-step.is-active {
    opacity: 1; transform: translateX(8px);
}
.in-showcase-step:focus-visible { outline: 2px solid var(--brand-primary, #643B81); outline-offset: 6px; }
.in-showcase-n {
    padding-top: 2px; font-family: var(--font-heading, 'Baloo 2', sans-serif);
    font-size: 28px; line-height: 1; color: var(--brand-primary, #643B81);
}
.in-showcase-line {
    position: relative; height: 1px; margin-top: 14px;
    background: rgba(11,18,32,.2); overflow: hidden;
}
.in-showcase-line::after {
    content: ""; position: absolute; inset: 0;
    background: var(--brand-primary, #643B81);
    transform: translateX(-101%); transition: transform .55s ease;
}
.in-showcase-step.is-active .in-showcase-line::after { transform: translateX(0); }
.in-showcase-step-copy { min-width: 0; }
.in-showcase-step-copy strong {
    display: block; margin: 0 0 10px; font-size: 18px; font-weight: 600; line-height: 1.35;
}
.in-showcase-desc { display: block; }
.in-showcase-p {
    display: block;
    margin: 0; max-width: 60ch; color: var(--color-text-muted, #413B4D);
    font-size: 14px; line-height: 1.62;
}
.in-showcase-p + .in-showcase-p { margin-top: 9px; }
.in-showcase-inline-list {
    display: grid; gap: 4px; margin: 8px 0;
    color: var(--color-text-muted, #413B4D); font-size: 14px; line-height: 1.55;
}
.in-showcase-inline-list > span {
    position: relative; display: block; padding-left: 15px;
}
.in-showcase-inline-list > span::before {
    content: ""; position: absolute; left: 1px; top: .69em;
    width: 4px; height: 4px; border-radius: 50%;
    background: var(--brand-primary, #643B81);
}
.in-showcase-thumb {
    display: block; width: 78px; aspect-ratio: 1; overflow: hidden;
    border-radius: 8px; background: var(--brand-100, #E7EDF9);
}
.in-showcase-thumb img {
    width: 100%; height: 100%; object-fit: cover; filter: saturate(.72);
    transform: scale(1.06); transition: transform .7s ease, filter .45s ease;
}
.in-showcase-step.is-active .in-showcase-thumb img,
.in-showcase-step:hover .in-showcase-thumb img { transform: scale(1); filter: saturate(1); }

/* ── KROKI NA STOSIE ────────────────────────────────────────────────────
   Przy przewijaniu kolejne kroki nakładają się na siebie jak karty: każdy
   przykleja się pod pigułką nawigacji, a następny wsuwa się na wierzch.
   `--i` (numer kroku) ustawia `build.py` na <li>, żeby każda karta zatrzymała
   się o 14 px niżej od poprzedniej — dzięki temu widać krawędzie stosu.
   Tylko od 1001 px: niżej lista jest jednokolumnowa i stos nie ma sensu.  */
@media (min-width: 1001px) {
    /* `overflow: clip` na sekcji odcinałoby przyklejanie (sticky liczy się
       względem najbliższego przewijanego rodzica). Poniżej 1001 px clip
       zostaje — tam pilnuje nagłówka z `white-space: nowrap`. */
    .in-sec.in-showcase { overflow: visible; }
    .in-showcase-stage { position: sticky; top: 112px; }
    .in-showcase-steps > li {
        position: sticky; top: calc(120px + var(--i, 0) * 14px);
        border: 0;
    }
    .in-showcase-steps > li:last-child { border-bottom: 0; }
    .in-showcase-steps > li + li { margin-top: 20px; }
    .in-showcase-step {
        padding: 28px 30px 30px; border-radius: 22px; background: #fff;
        border: 1px solid rgba(11,18,32,.10);
        box-shadow: 0 20px 44px rgba(100,59,129,.13);
        /* karta na wierzchu ma być czytelna — przygaszanie zostawiamy listom
           bez stosu, tu i tak widać naraz tylko jedną */
        opacity: 1;
    }
    /* przesunięcie w bok rozjeżdżało krawędzie stosu */
    .in-showcase-step:hover,
    .in-showcase-step:focus-visible,
    .in-showcase-step.is-active { opacity: 1; transform: none; }
    .in-showcase-step.is-active { border-color: rgba(100,59,129,.34); }
}

@media (max-width: 1000px) {
    .in-sec.in-showcase > .in-wrap { grid-template-columns: 1fr; gap: 38px; }
    .in-showcase-copy, .in-showcase-steps { grid-column: 1; grid-row: auto; }
    /* Zmienny kadr dziala tylko obok listy — po zwinieciu do jednej kolumny
       wszystkie zdjecia stalyby w jednym stosie NAD krokami, a klikniecie
       w krok podmienialoby obrazek gdzies wyzej, poza ekranem. Scena znika,
       a miniatura kroku rosnie do pelnej szerokosci POD jego trescia. */
    .in-showcase-stage { display: none; }
    .in-showcase-copy > h2 { max-width: 16ch; }
    .in-showcase-step { grid-template-columns: 42px 30px minmax(0, 1fr); padding: 28px 0; }
    /* bez sceny nie ma juz „aktywnego" kroku — wszystkie czytamy tak samo */
    .in-showcase-step, .in-showcase-step.is-active { opacity: 1; transform: none; }
    .in-showcase-thumb { grid-column: 3; width: 100%; aspect-ratio: 16 / 10;
                         margin-top: 16px; border-radius: 16px; }
    .in-showcase-thumb img { filter: none; transform: none; }
}
@media (max-width: 620px) {
    .in-showcase-stage { aspect-ratio: 4 / 3; border-radius: 14px; }
    .in-showcase-media figcaption { left: 18px; right: 18px; bottom: 16px; font-size: 13px; }
    .in-showcase-copy { margin-top: 0; }
    .in-showcase-copy > h2 span { white-space: normal; }
    .in-showcase-step { grid-template-columns: 34px 24px minmax(0, 1fr); gap: 12px; padding: 24px 0; }
    .in-showcase-step:hover, .in-showcase-step:focus-visible, .in-showcase-step.is-active { transform: none; }
    /* miniatura zostaje (patrz blok 1000px) — to jedyne zdjecie kroku na telefonie */
    .in-showcase-thumb { grid-column: 3; }
    .in-showcase-step-copy strong { font-size: 16px; }
    .in-showcase-p { font-size: 13px; }
}

/* ══════════════════════════════════════════════════════════════════
   SEKCJA DWUDZIELNA — variant: "split"
   ──────────────────────────────────────────────────────────────────
   Wielki naglowek serifem po lewej, cala tresc po prawej pod cienka
   kreska. Naglowek jest sticky: przy dlugiej kolumnie tekstu zostaje
   w kadrze i mowi, w ktorej sekcji jestesmy.

   Regula jest ogolna — dziala na KAZDEJ sekcji z variant:"split",
   niezaleznie od tego, jakie bloki w niej siedza. Wlaczasz ja dopisujac
   "variant": "split" w content/<slug>.json.
   ══════════════════════════════════════════════════════════════════ */
.in-sec.in-split > .in-wrap { display: grid; grid-template-columns: minmax(0, 5fr) minmax(0, 7fr);
                              gap: 0 80px; align-items: start; }
.in-sec.in-split > .in-wrap > h2 {
    /* Naglowek ciagnie sie przez WSZYSTKIE wiersze siatki. Przy `grid-row: 1`
       jego wysokosc ustawiala wysokosc pierwszego wiersza, wiec w prawej
       kolumnie miedzy pierwszym a drugim blokiem robila sie dziura na kilkaset
       pikseli (widac to bylo na /podswiadomosc-...). Sekcje z jednym blokiem
       po prawej wygladaly dobrze tylko dlatego, ze mialy jeden wiersz. */
    grid-column: 1; grid-row: 1 / span 50;
    position: sticky; top: 120px;
    font-family: var(--font-heading, 'Baloo 2', sans-serif); font-weight: 300;
    line-height: 1.04; letter-spacing: -.015em;
    margin: 0; max-width: 14ch;
}
/* wszystko poza naglowkiem ladduje w prawej kolumnie, jedno pod drugim */
.in-sec.in-split > .in-wrap > :not(h2) { grid-column: 2; }
/* Button jest elementem siatki, wiec domyslnie rozciagalby sie na cala kolumne —
   pigulka ma trzymac swoja szerokosc i stac przy lewej krawedzi tresci. */
/* justify-self: start — bez tego przycisk jako element gridu rozciaga sie na cala
   kolumne i robi sie z niego wielki, pelnoszerokosciowy pasek. */
.in-sec.in-split > .in-wrap > .in-btn,
.in-sec.in-split > .in-wrap > .in-btn-ghost { justify-self: start; margin-top: 38px; }
/* zdanie domykajace liste (np. „to ten mentoring jest dla Ciebie!") potrzebuje oddechu */
.in-sec.in-split .in-check + .in-lead,
.in-sec.in-split .in-bullets + .in-lead,
.in-sec.in-split .in-check + .in-p,
.in-sec.in-split .in-bullets + .in-p { margin-top: 22px; }
/* Bez dekoracyjnej kreski: prawa kolumna zaczyna sie na tej samej osi,
   a oddech buduje sam grid i rytm tresci. */
/* Element tuz po naglowku rownamy do jego gornej krawedzi — ale KARTY (.in-note)
   to nie dotyczy: ona ma wlasny padding i bez niego tekst kleil sie do ramki. */
.in-sec.in-split > .in-wrap > h2 + *:not(.in-note) { border-top: 0; padding-top: 0; margin-top: 6px; }
.in-sec.in-split > .in-wrap > h2 + .in-note { margin-top: 6px; }
.in-sec.in-split .in-h3:first-child { margin-top: 0; }
.in-sec.in-split .in-check { gap: 18px; margin: 0; }
.in-sec.in-split .in-check li {
    padding-left: 42px; font-size: 18px; line-height: 1.55;
}
.in-sec.in-split .in-check li::before {
    left: 8px; top: 4px; width: 8px; height: 15px;
    border-width: 0 2.5px 2.5px 0;
}

/* W tej sekcji osiem elementow tworzy dwie rowne kolumny: pierwsze cztery
   po lewej, kolejne cztery po prawej. Pozostale listy split pozostaja bez zmian. */
#w-srodku-gry .in-check {
    display: grid; grid-template-columns: repeat(2, minmax(0, 1fr));
    grid-template-rows: repeat(4, auto); grid-auto-flow: column;
    gap: 22px 46px;
}

/* Listy „Kiedy szukac pomocy?" na podstronach numeroterapia-*: od szesciu pozycji
   w gore lamiemy je na dwie kolumny — jedna dluga kolumna zostawiala pol ekranu pusto.
   Warunek na :has(li:nth-child(6)) zamiast id, bo tych sekcji jest dziewiec i wiekszosc
   nie ma id; krotsze listy (5 pozycji) zostaja jednokolumnowe, bo 3+2 wyglada przypadkowo. */
.in-sec.in-split .in-check:has(li:nth-child(6)) {
    display: grid; grid-template-columns: repeat(2, minmax(0, 1fr));
    grid-auto-flow: column; gap: 22px 46px;
}
.in-sec.in-split .in-check:has(li:nth-child(6)):not(:has(li:nth-child(7)))  { grid-template-rows: repeat(3, auto); }
.in-sec.in-split .in-check:has(li:nth-child(7)):not(:has(li:nth-child(9)))  { grid-template-rows: repeat(4, auto); }
.in-sec.in-split .in-check:has(li:nth-child(9)):not(:has(li:nth-child(11))) { grid-template-rows: repeat(5, auto); }

/* Biznes: dziewiec wskazan w dwoch czytelnych kolumnach (5 + 4). */
#kiedy-szukac-pomocy .in-check {
    display: grid; grid-template-columns: repeat(2, minmax(0, 1fr));
    grid-template-rows: repeat(5, auto); grid-auto-flow: column;
    gap: 22px 46px;
}

@media (max-width: 1000px) {
    .in-sec.in-split > .in-wrap { grid-template-columns: 1fr; gap: 28px; }
    .in-sec.in-split .in-check:has(li:nth-child(6)) { display: grid; grid-template-columns: 1fr; grid-auto-flow: row; }
    .in-sec.in-split > .in-wrap > h2 { position: static; grid-row: auto; max-width: none; }
    .in-sec.in-split > .in-wrap > :not(h2) { grid-column: 1; }
}
@media (max-width: 600px) {
    .in-sec.in-split .in-check { gap: 14px; }
    .in-sec.in-split .in-check li { padding-left: 36px; font-size: 16px; }
    #w-srodku-gry .in-check,
    #kiedy-szukac-pomocy .in-check {
        grid-template-columns: 1fr; grid-template-rows: none;
        grid-auto-flow: row; gap: 14px;
    }
}

/* ══════════════════════════════════════════════════════════════════
   FAQ — REGULA: na KAZDEJ stronie wyglada tak samo jak na homepage
   ──────────────────────────────────────────────────────────────────
   Naglowek w lewej kolumnie (przyklejony przy scrollu), lista pytan
   po prawej — na cienkich kreskach, bez bialych kafelkow, ramek
   i zaokraglen. Uklad sklada render_section w build.py, gdy sekcja
   zawiera blok `faq` i ma naglowek.

   Rozwijanie animuje skrypt spoza <main> w index.html (build.py roznosi
   go na podstrony). Bez JS akordeon dziala dalej, tylko skokowo.
   ══════════════════════════════════════════════════════════════════ */
.in-faq-grid { display: grid; grid-template-columns: minmax(0, 5fr) minmax(0, 7fr);
               gap: 60px; align-items: start; }
.in-faq-head { position: sticky; top: 120px; }
.in-faq-h { font-family: var(--font-heading, 'Baloo 2', sans-serif); font-weight: 300;
            line-height: 1.1; letter-spacing: -.01em;
            margin: 0 0 18px; max-width: 14ch; }
.in-faq-sub { font-size: 17px; line-height: 1.6; color: var(--color-text-muted, #413B4D); margin: 0; }
.in-faq-sub a { color: var(--brand-primary, #643B81); text-decoration: underline;
                text-underline-offset: 3px; }

.in-faq { border-top: 1px solid rgba(11,18,32,.28); }
/* Sekcja z pytaniami stoi tuz przed stopka albo pasem CTA — domyslne 72px
   dawalo za malo powietrza pod ostatnia odpowiedzia. */
.in-sec.in-faq-sec { padding-bottom: clamp(96px, 9vw, 140px); }
.in-faq-i { border-bottom: 1px solid rgba(11,18,32,.28); }
/* Pytanie serifem w fiolecie marki (jak wzór klientki); DM Serif Display ma
   tylko wagę 400 — wyższa dałaby syntetyczne, rozmazane pogrubienie. */
.in-faq-i summary { display: flex; align-items: flex-start; justify-content: space-between;
                    gap: 32px; cursor: pointer; list-style: none; padding: 26px 2px;
                    font-family: var(--font-display, Georgia, serif); 
                    line-height: 1.3; font-weight: 400; color: var(--brand-primary, #643B81);
                    transition: padding-left .3s cubic-bezier(.4,0,.2,1); }
/* hover: pytanie odsuwa się w prawo; ikona stoi w miejscu, bo trzyma ją
   justify-content: space-between przy prawej krawędzi */
.in-faq-i summary:hover { padding-left: 16px; }
.in-faq-i summary::-webkit-details-marker { display: none; }

/* plus → minus: znika kreska POZIOMA, a cala ikona obraca sie o cwierc obrotu,
   przez co zmiana czyta sie jako jeden ruch. Zgaszenie pionowej daloby odwrotnie:
   pozioma obrocona na sztorc, czyli kreske stojaca. */
.in-faq-c { flex: 0 0 auto; width: 18px; height: 18px; position: relative; margin-top: 6px;
            transition: transform .35s cubic-bezier(.4,0,.2,1); }
.in-faq-c::before, .in-faq-c::after { content: ""; position: absolute;
                                      background: var(--brand-accent, #67B6C0);
                                      transition: transform .35s cubic-bezier(.4,0,.2,1); }
.in-faq-c::before { top: 8px; left: 0; width: 18px; height: 1.5px; }
.in-faq-c::after { left: 8px; top: 0; width: 1.5px; height: 18px; }
.in-faq-i[open] .in-faq-c { transform: rotate(90deg); }
.in-faq-i[open] .in-faq-c::before { transform: scaleX(0); }

/* Odstepy pionowe siedza na MARGINESACH DZIECI, nie na paddingu pudelka.
   Skrypt animuje height do zera — padding zostalby jako pasek i akordeon
   nigdy nie domykalby sie do konca. overflow:hidden domyka tu tez margin
   collapsing, wiec marginesy nie wychodza poza pudelko. */
.in-faq-b { overflow: hidden; padding: 0 50px 0 2px; }
.in-faq-b > :first-child { margin-top: 0; }
.in-faq-b > :last-child { margin-bottom: 30px; }
.in-faq-b .in-p { font-size: 17px; line-height: 1.75; color: var(--color-text-muted, #413B4D);
                  max-width: 62ch; }

@media (max-width: 1100px) {
    .in-faq-grid { grid-template-columns: 1fr; gap: 40px; }
    .in-faq-head { position: static; }
    .in-faq-h { max-width: none; }
}
@media (max-width: 600px) {
    .in-faq-i summary { gap: 20px; padding: 22px 2px; }
    .in-faq-b { padding-right: 0; }
    .in-faq-b .in-p { font-size: 16px; }
}
/* tresc delikatnie wyplywa razem z rozwijaniem — tak samo jak na homepage */
.in-faq-i[open] .in-faq-b > * { animation: in-faq-in .42s cubic-bezier(.4,0,.2,1) both; }
@keyframes in-faq-in {
    from { opacity: 0; transform: translateY(-6px); }
    to   { opacity: 1; transform: none; }
}

/* numeroterapeuci */
/* Karty osob — uklad „arkada": portret z lukiem u gory i prostym dolem,
   pod nim nazwisko serifem, rola i metody. Na hover CALY kafelek dostaje
   fioletowy tint w tym samym ksztalcie luku.

   Kolumny sa STALE (4/2/1), nie auto-fill. auto-fill liczy, ile kolumn
   o zadanej szerokosci zmiesci sie w kontenerze — przy szerokim ekranie
   robil ich piec, czwarta karta konczyla sie w 4/5 szerokosci i z prawej
   zostawala pusta kolumna. Stala liczba kolumn zawsze dociaga siatke
   do prawej krawedzi sekcji. */
.in-people { list-style: none; padding: 0; margin: 44px 0 0; display: grid;
             grid-template-columns: repeat(4, 1fr); gap: 28px 24px; }
@media (max-width: 900px) { .in-people { grid-template-columns: repeat(2, 1fr); } }
/* 999px na gornych rogach: przegladarka skaluje promienie do rozmiaru pudelka,
   wiec luk zawsze wychodzi rownym polkolem o promieniu polowy szerokosci —
   i to samo dzieje sie na kafelku, i na zdjeciu. Dzieki temu oba luki pokrywaja
   sie idealnie przy dowolnej szerokosci kolumny. Wartosci w px by sie rozjechaly. */
/* Karta jest kolumna flex, a .in-person-b rosnie do jej wysokosci — dzieki temu
   przycisk „Zobacz profil" (margin-top:auto nizej) siada na DOLE karty.
   Bez tego CTA lezalo tuz pod tekstem, a ze nazwiska i listy metod maja rozna
   dlugosc, cztery przyciski w rzedzie stały na czterech roznych wysokosciach. */
.in-person { display: flex; flex-direction: column;
             background: transparent; border: 0; padding: 0 0 26px;
             border-radius: 28px; overflow: hidden;
             transition: background .35s ease, transform .35s ease,
                         box-shadow .35s ease, border-radius .35s ease; }
.in-person:hover,
.in-person:focus-within { background: var(--brand-50, #E7EDF9); border-radius: 28px;
                          transform: translateY(-4px);
                          box-shadow: 0 22px 52px rgba(100,59,129,.10); }

.in-person-m { display: block; width: 100%; aspect-ratio: 3 / 4; overflow: hidden;
               background: var(--brand-50, #E7EDF9);
               border-radius: 999px 999px 14px 14px; }
.in-person-m img { display: block; width: 100%; height: 100%; object-fit: cover;
                   object-position: center 18%; }
.in-person-i { display: grid; place-items: center; height: 100%;
               font-family: var(--font-heading, 'Baloo 2', sans-serif); font-size: 54px;
               letter-spacing: .04em; color: var(--brand-primary, #643B81); opacity: .45; }
/* kafelek z inicjalami nie moze zniknac na hoverze — tint ma ten sam kolor */
.in-person:hover .in-person-m,
.in-person:focus-within .in-person-m { background: #fff; }

.in-person-b { flex: 1; display: flex; flex-direction: column; padding: 20px 16px 0; }
.in-person h3 { font-family: var(--font-heading, 'Baloo 2', sans-serif); font-weight: 400;
                line-height: 1.2; margin: 0 0 8px; }
.in-person .in-p { font-size: 15px; line-height: 1.6; margin: 0 0 10px; }
.in-person .in-p:last-of-type { margin-bottom: 12px; }
.in-methods { font-size: 14px; line-height: 1.6; color: var(--color-text-muted, #413B4D); margin: 0 0 24px; }
.in-methods span { font-weight: 600; color: var(--color-text, #0B1220); }

/* CTA w pigulce — obwodka, na hover kafelka wypelnia sie fioletem */
.in-person-cta { display: inline-flex; align-items: center; gap: 12px;
                 align-self: flex-start; margin-top: auto; padding-top: 16px;
                 padding: 9px 10px 9px 20px; border: 1px solid var(--brand-primary, #643B81);
                 border-radius: 999px; font-size: 14px; font-weight: 600;
                 color: var(--brand-primary, #643B81); text-decoration: none;
                 position: relative; z-index: 1; flex-shrink: 0;
                 transition: background .3s ease, color .3s ease; }
.in-person-ar { display: grid; place-items: center; width: 26px; height: 26px;
                border-radius: 50%; background: var(--brand-primary, #643B81); color: #fff;
                font-size: 14px; line-height: 1; transition: background .3s ease, color .3s ease; }
.in-person-cta:hover,
.in-person-cta:focus-visible { color: #fff; }
.in-person-cta:hover .in-person-ar,
.in-person-cta:focus-visible .in-person-ar { background: #fff; color: var(--brand-primary, #643B81); }

/* UWAGA NA KOLEJNOSC: ten blok musi stac PO regulach bazowych `.in-person`
   i `.in-person-m` — media query nie podnosi specyficznosci, wiec postawiony
   wyzej (przy pozostalych breakpointach `.in-people`) po prostu przegrywal. */
/* Telefon: karta klada sie na bok — mala fotografia po lewej, opis po prawej.
   W ukladzie pionowym zdjecie brało pelna szerokosc przy proporcji 3/4, czyli
   ~470 px wysokosci, i na ekran wchodzila DOKLADNIE JEDNA osoba. Teraz karta ma
   ~300 px i widac dwie naraz — o to chodzilo. */
/* Prog byl 520 px, czyli praktycznie nigdzie: przy 560-900 px karta wciaz
   stala pionowo, a portret w jednej kolumnie mial ~470 px wysokosci i na
   ekran wchodzila jedna osoba. Od 760 px w dol karta klada sie na bok. */
@media (max-width: 760px) {
    .in-people { grid-template-columns: 1fr; gap: 14px; }
    /* Delikatnie fioletowe tlo NA STALE, nie tylko pod palcem — na telefonie
       to ono trzyma kafelek w kupie (na dotyku stan :hover i tak zostaje
       przyklejony po tapnieciu, wiec i tak bylo widoczne polowicznie). */
    .in-person { flex-direction: row; align-items: flex-start; gap: 16px;
                 background: var(--in-soft, #F4F1F7); padding: 16px 18px 18px; }
    .in-person:hover, .in-person:focus-within { transform: none; }
    .in-person-m { flex: 0 0 124px; width: 124px;
                   border-radius: 999px 999px 12px 12px; }
    .in-person-b { padding: 2px 0 0; }
    .in-person h3 { margin-bottom: 6px; }
    .in-person .in-p { font-size: 14px; }
    .in-methods { font-size: 13px; margin-bottom: 16px; }
    /* inicjały w kafelku bez zdjęcia musza zejsc razem z kadrem */
    .in-person-i { font-size: 34px; }
    /* Na kafelku zostaje ZAJAWKA, calosc jest na profilu (przycisk pod spodem).
       Bez tego samo zmniejszenie zdjecia nie wystarczylo: opisy maja po 50-90 slow,
       wiec karta i tak mierzyla ~475 px i druga osoba nie wchodzila na ekran. */
    .in-person .in-p, .in-methods {
        display: -webkit-box; -webkit-box-orient: vertical; overflow: hidden;
    }
    .in-person .in-p { -webkit-line-clamp: 5; }
    .in-methods { -webkit-line-clamp: 3; }
}

/* CTA calego modulu nie moze wygladac jak doklejone do pierwszej karty.
   :has ogranicza regule wyłącznie do sekcji zespolu, bez zmiany pozostalych
   przyciskow generowanych bezposrednio pod siatkami. */
.in-sec:has(.in-people) > .in-wrap > .in-btn {
    margin-top: clamp(38px, 4vw, 58px);
}
@media (max-width: 600px) {
    .in-sec:has(.in-people) > .in-wrap > .in-btn { width: 100%; margin-top: 32px; text-align: center; }
}

/* stary link tekstowy zostaje — uzywaja go inne bloki */
.in-link { font-size: 14px; font-weight: 600; color: var(--brand-primary, #643B81); }
.in-link:hover { text-decoration: underline; }

/* cytat */
/* Pojedynczy cytat = stylistyka modulu „insight" z homepage (.in-ig): male
   nadkreslenie i duze fioletowe zdanie, BEZ ramki, tla i kursywy. Wczesniej
   byl to plaski lawendowy pas przez cala szerokosc, ktory nie mowil niczego
   poza „tu jest jakis tekst". Typografia 1:1 z `.in-ig-text` w index.html —
   zmieniasz jedno, sprawdz drugie. */
.in-quote { margin: 0; padding: 0; background: none; border: 0; border-radius: 0; }
.in-quote-k { font-size: 12px; font-weight: 700; letter-spacing: .18em; text-transform: uppercase;
              color: var(--color-text-muted, #413B4D); margin: 0 0 20px; }
.in-quote blockquote { margin: 0; font-family: var(--font-heading, 'Baloo 2', sans-serif);
                       font-weight: 400; font-size: clamp(26px, 3.1vw, 44px); line-height: 1.14;
                       letter-spacing: -.01em; font-style: normal;
                       color: var(--brand-primary, #643B81); }
/* w waskich kolumnach (szyna wpisu, karta showcase) cytat nie moze byc
   naglowkiem — tam schodzi do rozmiaru leadu */
.in-art-rail .in-quote blockquote,
.in-showcase-copy > .in-quote blockquote { font-size: 20px; line-height: 1.4; max-width: none; }
/* w tresci wpisu to cytat srodtytulowy, nie otwarcie sekcji — nie moze byc
   wiekszy od naglowkow artykulu */
.in-art-body .in-quote blockquote { font-size: clamp(24px, 2.2vw, 30px); line-height: 1.28; }
.in-art-body .in-quote { margin: 8px 0 30px; }
.in-quote-a { display: block; margin-top: 18px; font-size: 14px; font-style: normal;
              letter-spacing: .04em; color: var(--color-text-muted, #413B4D); }

/* ══════════════════════════════════════════════════════════════════
   CENNIK
   ──────────────────────────────────────────────────────────────────
   Sekcja z variant:"pricing" (patrz content/<slug>.json) układa się
   w trzy kolumny: nagłówek + lead + ramka „warto wiedzieć" po lewej,
   karty po prawej. Bez wariantu karty stoją pod nagłówkiem, jak dawniej.

   Kartę można wyróżnić flagą "highlight": true w JSON-ie — build.py
   dokłada wtedy .in-price--hl (ciemny fiolet). Jeden akcent na sekcję,
   inaczej przestaje cokolwiek znaczyć.
   ══════════════════════════════════════════════════════════════════ */
.in-price { display: flex; flex-direction: column;
            background: var(--in-surface, #fff); border: 1px solid var(--color-border, #C6C4D8);
            border-radius: var(--radius-lg, 12px); padding: 34px 32px 32px; }
.in-price-l { font-size: 12px; font-weight: 700; letter-spacing: .14em; text-transform: uppercase;
              color: var(--brand-primary, #643B81); margin: 0 0 10px; }
.in-price-n { font-size: 15px; color: var(--color-text-muted, #413B4D); margin: 0 0 6px; }
.in-price-v { display: flex; align-items: baseline; gap: 6px; margin: 0 0 22px; }
.in-price-a { font-family: var(--font-heading, inherit); font-size: 52px; font-weight: 700; line-height: 1; }
.in-price-c { font-size: 20px; color: var(--color-text-muted, #413B4D); }
.in-price .in-check { margin-bottom: 24px; }
/* przycisk siada na dole karty, żeby obie karty miały go w jednej linii
   niezależnie od tego, ile pozycji ma lista */
.in-price .in-btn { margin-top: auto; align-self: flex-start; }

/* --- karta wyróżniona --- */
.in-price--hl { background: var(--brand-900, #643B81); border-color: var(--brand-900, #643B81);
                color: #fff; }
.in-price--hl .in-price-l { color: var(--brand-300, #C6C4D8); }
.in-price--hl .in-price-n,
.in-price--hl .in-price-c { color: rgba(255,255,255,.68); }
.in-price--hl .in-check li { color: rgba(255,255,255,.9); }
.in-price--hl .in-check li::before { color: var(--brand-300, #C6C4D8); }
.in-price--hl .in-btn { background: #fff; color: var(--brand-900, #643B81); }

/* --- układ sekcji: nagłówek po lewej, karty po prawej --- */
/* Wiersze: nagłówek, lead, PUSTY rozpychacz, ramka.
   Rozpychacz (1fr) zjada nadmiar wysokości, przez co nagłówek trzyma się
   góry, a ramka dna — tak jak we wzorze. Bez niego wszystkie trzy elementy
   rozjeżdżały się równomiernie na całą wysokość kart. */
.in-sec.in-pricing > .in-wrap { display: grid; grid-template-columns: minmax(0, 4fr) minmax(0, 8fr);
                                grid-template-rows: auto auto 1fr auto;
                                gap: 0 64px; align-items: start; }
.in-sec.in-pricing > .in-wrap > h2 { grid-column: 1; grid-row: 1; margin: 0 0 16px; }
.in-sec.in-pricing > .in-wrap > .in-lead { grid-column: 1; grid-row: 2; margin: 0; }
.in-sec.in-pricing > .in-wrap > .in-note { grid-column: 1; grid-row: 4; margin: 32px 0 0; }
/* karty zajmują prawą kolumnę przez całą wysokość sekcji */
.in-sec.in-pricing > .in-wrap > .in-grid2 { grid-column: 2; grid-row: 1 / -1; align-items: stretch; }
/* pojedyncza cena (bez siatki dwóch pakietów) — np. kurs online. Bez tego blok
   `pricing` stojący bezpośrednio w sekcji wypadał poza prawą kolumnę i rozlewał
   się na całą szerokość, przez co cena wyglądała na zgubioną w pustym pudle. */
.in-sec.in-pricing > .in-wrap > .in-price { grid-column: 2; grid-row: 1 / -1; }
.in-sec.in-pricing .in-grid2 > * { height: 100%; }

/* TRZY pakiety nie mieszczą się w układzie z nagłówkiem po lewej — w kolumnie
   8fr karta schodzi do ~230 px i pozycje listy łamią się po dwa słowa.
   Dlatego sekcja z trzema cenami zostaje BEZ variantu „pricing": nagłówek
   idzie nad siatką, a karty biorą pełną szerokość. Same karty wyglądają
   identycznie — to ten sam blok `pricing`. */
.in-grid3 > .in-price { height: 100%; }

@media (max-width: 1000px) {
    .in-sec.in-pricing > .in-wrap { grid-template-columns: 1fr; gap: 32px; }
    .in-sec.in-pricing > .in-wrap > h2,
    .in-sec.in-pricing > .in-wrap > .in-lead,
    .in-sec.in-pricing > .in-wrap > .in-note,
    .in-sec.in-pricing > .in-wrap > .in-grid2 { grid-column: 1; grid-row: auto; }
}

/* Certyfikacja w hierarchii sekcji „Wybierz swoj format sesji": lewa
   kolumna wyjasnia oferte i domyka sie ramka, prawa jest jedna karta ceny.
   Kroki procesu trafiaja do checklisty karty przez render_section(). */
.in-sec.in-cert-pricing { padding-block: 112px 128px; }
.in-cert-grid {
    display: grid; grid-template-columns: minmax(0, 5fr) minmax(520px, 7fr);
    gap: clamp(58px, 7vw, 104px); align-items: stretch;
}
.in-cert-head {
    min-width: 0; display: flex; flex-direction: column; align-items: flex-start;
}
.in-cert-head > h2 {
    max-width: 10.5ch; margin: 0 0 28px; 
    line-height: .98; letter-spacing: -.04em; text-wrap: balance;
}
.in-cert-head > .in-lead {
    max-width: 35ch; margin: 0; font-size: clamp(19px, 2vw, 25px);
    line-height: 1.48; color: var(--color-text, #0B1220);
}
.in-cert-head > .in-note {
    width: 100%; margin: auto 0 0; padding: 29px 30px 31px;
    border: 1px solid rgba(100,59,129,.12); border-radius: 18px;
    box-shadow: 0 16px 42px rgba(100,59,129,.055);
}
.in-cert-head > .in-note .in-note-t {
    margin-bottom: 14px; color: var(--brand-primary, #643B81);
    font-size: 12px; letter-spacing: .15em;
}
.in-cert-head > .in-note .in-p {
    color: var(--color-text, #0B1220); font-size: 16px; line-height: 1.65;
}
.in-cert-card { min-width: 0; }
.in-cert-card > .in-price {
    height: 100%; min-height: 720px; padding: 46px 44px 42px;
    border: 1px solid rgba(100,59,129,.12); border-radius: 22px;
    box-shadow: 0 24px 64px rgba(100,59,129,.09);
}
.in-cert-card .in-price-l {
    max-width: 38ch; margin-bottom: 14px; font-size: 13px; line-height: 1.35;
}
.in-cert-card .in-price-n {
    margin-bottom: 12px; font-size: 16px; line-height: 1.5;
}
.in-cert-card .in-price-v { margin-bottom: 34px; }
.in-cert-card .in-price-a { font-size: clamp(64px, 7vw, 92px); letter-spacing: -.055em; }
.in-cert-card .in-price-c { font-size: 24px; }
.in-cert-card .in-check { gap: 22px; margin-bottom: 36px; }
.in-cert-card .in-check li {
    padding-left: 36px; color: var(--color-text, #0B1220);
    font-size: 16px; line-height: 1.58;
}
.in-cert-card .in-check li::before {
    left: 7px; top: 5px; width: 8px; height: 15px; border-width: 0 2.5px 2.5px 0;
}
.in-cert-card .in-check strong { display: inline; font-weight: 650; }
.in-cert-card .in-btn { padding-inline: 28px; }

@media (max-width: 1000px) {
    .in-sec.in-cert-pricing { padding-block: 88px 104px; }
    .in-cert-grid { grid-template-columns: 1fr; gap: 34px; }
    .in-cert-head > h2 { max-width: 13ch; }
    .in-cert-head > .in-lead { max-width: 46ch; }
    .in-cert-head > .in-note { margin-top: 34px; }
    .in-cert-card > .in-price { min-height: 0; }
}
@media (max-width: 600px) {
    .in-sec.in-cert-pricing { padding-block: 72px 88px; }
    .in-cert-head > .in-lead { font-size: 18px; }
    .in-cert-head > .in-note { padding: 25px 23px 27px; border-radius: 16px; }
    .in-cert-card > .in-price { padding: 34px 24px 30px; border-radius: 20px; }
    .in-cert-card .in-price-a { font-size: 64px; }
    .in-cert-card .in-check { gap: 20px; }
    .in-cert-card .in-check li { padding-left: 32px; font-size: 15px; }
    .in-cert-card .in-btn { width: 100%; justify-content: center; text-align: center; }
}

/* ══════════════════════════════════════════════════════════════════
   TABELA — zestawienie na kreskach, bez bialej karty
   ──────────────────────────────────────────────────────────────────
   Wzor: tabela sesji z qpsychology.com.au. Naglowek na delikatnym
   ticie i grubszej kresce, wiersze rozdzielone wlosowa linia, duzo
   powietrza w komorkach. Zadnej ramki, tla ani zaokraglen — tabela
   ma czytac sie jak zestawienie, nie jak kafelek.

   margin-top: nad tabela stoi zwykle przycisk albo akapit i bez tego
   odstepu tabela kleila sie do niego krawedzia.

   Naglowki puste w danych (["", ""]) nie renderuja <thead> wcale —
   patrz render_block w build.py.
   ══════════════════════════════════════════════════════════════════ */
.in-tw { overflow-x: auto; margin: 34px 0 24px; }
.in-table { border-collapse: collapse; width: 100%; min-width: 520px;
            background: transparent; border: 0; border-radius: 0; font-size: 16px; }
.in-table thead th { font-family: var(--font-heading, 'Baloo 2', sans-serif); font-weight: 400;
                     font-size: 22px; line-height: 1.3; text-align: left;
                     padding: 18px 24px; background: var(--brand-50, #E7EDF9);
                     border-bottom: 2px solid var(--color-text, #0B1220); }
.in-table td { padding: 20px 24px; text-align: left; vertical-align: top;
               line-height: 1.6; border-bottom: 1px solid rgba(11,18,32,.14); }
/* pierwsza kolumna to etykieta wiersza — ciemniejsza i grubsza,
   zeby dalo sie skanowac tabele wzrokiem po lewej krawedzi */
.in-table td:first-child { font-weight: 600; color: var(--color-text, #0B1220); white-space: nowrap; }
.in-table td:not(:first-child) { color: var(--color-text-muted, #413B4D); }
/* tabela porownawcza (Przed / Po) ma dwie rownorzedne kolumny z pelnymi
   zdaniami — tam nie ma etykiety do wyroznienia ani czego trzymac w jednej linii */
.in-table thead ~ tbody td:first-child { font-weight: 400; white-space: normal;
                                         color: var(--color-text-muted, #413B4D); }

@media (max-width: 600px) {
    .in-tw { width: 100%; max-width: 100%; margin: 26px 0 20px; overflow-x: visible; }
    .in-table { width: 100%; min-width: 0; table-layout: fixed; font-size: 14px; }
    .in-table thead th { padding: 14px 10px; font-size: 18px; overflow-wrap: anywhere; }
    .in-table td { padding: 14px 8px; line-height: 1.5; overflow-wrap: anywhere; }
    .in-table td:first-child { width: 42%; white-space: normal; }
}

/* Przed / po — interaktywny przełącznik zamiast statycznej tabeli. */
.in-ba { width: 100%; margin: 34px 0 28px; }
.in-ba-switch {
    width: min(100%, 420px); margin: 0 0 22px; padding: 5px;
    display: grid; grid-template-columns: 1fr 1fr; gap: 5px;
    background: var(--color-border, #C6C4D8); border-radius: 999px;
}
.in-ba-tab {
    min-height: 48px; padding: 11px 24px; border: 0; border-radius: 999px;
    background: transparent; color: var(--color-text, #0B1220);
    font: 700 15px/1 var(--font-body, 'Source Sans Pro', sans-serif); cursor: pointer;
    transition: color .28s ease, background-color .28s ease, transform .28s ease;
}
.in-ba-tab:hover { transform: translateY(-1px); }
.in-ba-tab.is-active {
    background: var(--brand-primary, #643B81); color: #fff;
}
.in-ba-stage {
    padding: 34px; background: rgba(255,255,255,.72);
    border: 1px solid var(--color-border, #C6C4D8); border-radius: 24px;
    transition: background-color .34s ease, border-color .34s ease;
}
.in-ba[data-view="after"] .in-ba-stage {
    background: var(--brand-bg, #E7EDF9); border-color: var(--brand-secondary, #5E689A);
}
.in-ba-label {
    display: flex; align-items: center; gap: 10px; margin: 0 0 24px;
    color: var(--brand-primary, #643B81); font-size: 12px; font-weight: 800;
    letter-spacing: .15em; text-transform: uppercase;
}
.in-ba-label span { width: 9px; height: 9px; border-radius: 50%; background: var(--brand-accent, #67B6C0); }
.in-ba-list { list-style: none; padding: 0; margin: 0; display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
.in-ba-list li {
    min-height: 88px; padding: 18px 20px; display: grid;
    grid-template-columns: 34px minmax(0,1fr); gap: 12px; align-items: start;
    background: #fff; border: 1px solid var(--color-border, #C6C4D8); border-radius: 17px;
}
.in-ba-n { color: var(--brand-secondary, #5E689A); font-size: 12px; font-weight: 800; letter-spacing: .08em; }
.in-ba-copy { color: var(--color-text, #0B1220); font-size: 16px; line-height: 1.5; }
.in-ba-stage.is-changing .in-ba-list li { animation: in-ba-reveal .46s both; }
.in-ba-stage.is-changing .in-ba-list li:nth-child(2) { animation-delay: .04s; }
.in-ba-stage.is-changing .in-ba-list li:nth-child(3) { animation-delay: .08s; }
.in-ba-stage.is-changing .in-ba-list li:nth-child(4) { animation-delay: .12s; }
.in-ba-stage.is-changing .in-ba-list li:nth-child(5) { animation-delay: .16s; }
.in-ba-stage.is-changing .in-ba-list li:nth-child(6) { animation-delay: .20s; }
@keyframes in-ba-reveal {
    from { opacity: 0; transform: translateY(10px); }
    to { opacity: 1; transform: translateY(0); }
}
@media (max-width: 680px) {
    .in-ba { margin-top: 26px; }
    .in-ba-switch { width: 100%; }
    .in-ba-stage { padding: 22px 16px 16px; border-radius: 20px; }
    .in-ba-list { grid-template-columns: 1fr; gap: 9px; }
    .in-ba-list li { min-height: 0; padding: 16px; border-radius: 15px; }
}
/* Przed / po jako widoczna od razu transformacja: chaos przechodzi w spiralę,
   a obie listy rezultatów pozostają obok siebie bez klikania. */
.in-ba-transform { margin: 30px 0 28px; }
.in-ba-line { width: 100%; margin: 0 0 18px; overflow: hidden; }
.in-ba-line svg { display: block; width: 100%; height: auto; max-height: 250px; }
.in-ba-line :is(path, polyline) {
    fill: none; stroke-linecap: round; stroke-linejoin: round;
    stroke-dasharray: 1; stroke-dashoffset: 1;
}
.in-ba-chaos path,
.in-ba-bridge,
.in-ba-spiral { stroke: #5E689A; }
.in-ba-chaos path { stroke-width: 3.2; }
.in-ba-bridge { stroke-width: 3.2; }
.in-ba-spiral { stroke-width: 3.5; }
.in-ba-transform.is-visible .in-ba-chaos path {
    stroke-dashoffset: 0; transition: stroke-dashoffset 1.15s cubic-bezier(.25,.7,.2,1);
}
.in-ba-transform.is-visible .in-ba-chaos path:nth-child(2) { transition-delay: .16s; }
.in-ba-transform.is-visible .in-ba-bridge {
    stroke-dashoffset: 0; transition: stroke-dashoffset .9s .55s ease;
}
.in-ba-transform.is-visible .in-ba-spiral {
    stroke-dashoffset: 0; transition: stroke-dashoffset 1.55s 1.08s cubic-bezier(.22,.74,.22,1);
}
.in-ba-cols { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; }
.in-ba-col {
    padding: 28px; background: rgba(255,255,255,.72);
    border: 1px solid var(--color-border, #C6C4D8); border-radius: 22px;
    transition: transform .8s .3s cubic-bezier(.22,.74,.22,1), border-color .4s ease;
}
.in-ba-col--before { transform: translateX(-14px); }
.in-ba-col--after { transform: translateX(14px); border-color: var(--brand-accent, #67B6C0); }
.in-ba-transform.is-visible .in-ba-col { transform: translateX(0); }
.in-ba-col h3 {
    display: flex; align-items: center; gap: 10px; margin: 0 0 18px;
    color: var(--brand-primary, #643B81); font: 800 13px/1 var(--font-body, 'Source Sans Pro', sans-serif);
    letter-spacing: .14em; text-transform: uppercase;
}
.in-ba-col h3 span { width: 9px; height: 9px; border-radius: 50%; background: var(--brand-secondary, #5E689A); }
.in-ba-col--after h3 span { background: var(--brand-accent, #67B6C0); }
.in-ba-col ul { list-style: none; margin: 0; padding: 0; display: grid; gap: 10px; }
.in-ba-col li {
    min-height: 64px; padding: 15px 16px; display: grid;
    grid-template-columns: 34px minmax(0,1fr); gap: 10px; align-items: center;
    background: #fff; border: 1px solid var(--color-border, #C6C4D8); border-radius: 15px;
    color: var(--color-text, #0B1220); font-size: 15px; line-height: 1.45;
}
.in-ba-col .in-ba-n { color: var(--brand-secondary, #5E689A); }
.in-ba-col--after .in-ba-n { color: var(--brand-primary, #643B81); }
@media (max-width: 720px) {
    .in-ba-line { margin-bottom: 8px; }
    .in-ba-line svg { min-width: 0; width: 100%; transform: none; }
    .in-ba-cols { grid-template-columns: 1fr; gap: 14px; }
    .in-ba-col { padding: 20px 16px; border-radius: 19px; }
    .in-ba-col--before, .in-ba-col--after { transform: translateY(10px); }
    .in-ba-transform.is-visible .in-ba-col { transform: translateY(0); }
}
/* ramka "warto wiedziec" — biale tlo, nie fioletowy tint. Tint niknal
   na gradiencie strony i ramka wygladala jak przypadkowa plama; biel
   odcina ja czysto, tak samo jak pozostale kafelki na podstronach. */
/* 13.08: na CZYSTEJ bieli (nie --in-surface, ktore po „otuleniu" jest rozowe)
   i na PELNA szerokosc kolumny — prosba klientki. */
.in-note { display: block; width: 100%;
           background: #fff; border: 1px solid rgba(100,59,129,.12);
           border-radius: 22px; padding: 30px 32px; margin: 40px 0 24px;
           box-shadow: 0 18px 48px rgba(100,59,129,.07); }
/* ramka na poczatku kontenera nie potrzebuje gornego odstepu */
.in-note:first-child { margin-top: 0; }
.in-note-t { font-size: 12px; font-weight: 700; letter-spacing: .12em; text-transform: uppercase;
             color: var(--brand-primary, #643B81); margin: 0 0 14px; }
.in-note > :last-child { margin-bottom: 0; }
.in-note .in-p { font-size: 15px; line-height: 1.65; }
@media (max-width: 600px) {
    .in-note { width: 100%; padding: 25px 22px 27px; border-radius: 18px; }
}

/* Oferta indywidualna: opis i CTA po lewej, karta „Warto wiedzieć” po prawej. */
.in-note-right-grid {
    display: grid; grid-template-columns: minmax(0,1.25fr) minmax(320px,.75fr);
    gap: clamp(42px, 6vw, 96px); align-items: start;
}
.in-note-right-copy .in-lead { max-width: 760px; }
.in-note-right-copy .in-bullets { margin-bottom: 30px; }
.in-note-right-copy > .in-btn { margin-top: 6px; }
.in-note-right-aside { padding-top: 8px; }
.in-note-right-aside .in-note { width: 100%; margin: 0; padding: 34px; }
@media (max-width: 920px) {
    .in-note-right-grid { grid-template-columns: 1fr; gap: 32px; }
    .in-note-right-aside { padding-top: 0; }
}

/* Dwie ścieżki do gry — ten sam uklad 3-kolumnowy co wycena konsultacji:
   opis po lewej, dwie kompletne karty cenowe po prawej. */
.in-game-paths-shell {
    display: grid; grid-template-columns: minmax(200px, 3fr) repeat(3, minmax(0, 4fr));
    gap: clamp(20px, 2.5vw, 32px); align-items: stretch;
}
.in-game-paths-head {
    min-width: 0; margin: 0; padding: 10px 8px 10px 0;
    display: flex; flex-direction: column; align-items: flex-start;
}
.in-game-paths-eyebrow {
    margin: 0 0 14px; color: var(--brand-secondary, #5E689A);
    font-size: 12px; font-weight: 800; letter-spacing: .16em; text-transform: uppercase;
}
.in-game-paths-head h2 {
    max-width: 9ch; margin: 0 0 26px; 
    line-height: .98; letter-spacing: -.04em; text-wrap: balance;
}
.in-game-paths-head .in-lead {
    max-width: 32ch; margin: 0; color: var(--color-text, #0B1220);
    font-size: clamp(18px, 1.65vw, 23px); line-height: 1.5;
}
.in-game-paths-grid { display: contents; }
.in-game-paths-grid .in-price {
    min-width: 0; min-height: 650px; padding: 42px 38px 38px; border-radius: 24px;
    background: #fff; box-shadow: 0 20px 54px rgba(100,59,129,.07);
}
.in-game-paths-grid .in-price--hl {
    background: var(--brand-900, #643B81);
    border-color: var(--brand-900, #643B81);
    color: #fff;
}
.in-game-paths-grid .in-price-l {
    /* ⚠️ `ch` liczy szerokosc cyfry zero i NIE uwzglednia rozstrzelenia liter.
       Przy `letter-spacing: .12em` i wersalikach napis zajmuje okolo 12% wiecej,
       wiec 34ch lamalo „Sesja indywidualna · 4–6 godzin” (30 znakow) na dwie
       linijki bez powodu. Zgloszone przez Bartka 27.08.2026. */
    max-width: 42ch; margin-bottom: 18px; padding: 0; background: transparent;
    color: var(--brand-primary, #643B81); font-size: 13px; line-height: 1.35;
    letter-spacing: .12em;
}
.in-game-paths-grid .in-price-n { margin: 0 0 26px; max-width: 46ch; font-size: 15px; line-height: 1.58; }
.in-game-paths-grid .in-price-v { margin-bottom: 22px; }
.in-game-paths-grid .in-price-a { font-size: clamp(48px, 4.5vw, 72px); letter-spacing: -.045em; }
.in-game-paths-grid .in-check { margin: 0 0 32px; gap: 18px; }
.in-game-paths-grid .in-check li { font-size: 16px; line-height: 1.55; }
.in-game-paths-grid .in-btn { min-height: 54px; padding-inline: 26px; border-radius: 999px; }
.in-game-paths-grid .in-price--hl .in-price-l { color: var(--brand-300, #C6C4D8); }
@media (max-width: 1200px) {
    .in-game-paths-shell { grid-template-columns: repeat(3, minmax(0, 1fr)); }
    .in-game-paths-head { grid-column: 1 / -1; max-width: 720px; padding-bottom: 12px; }
    .in-game-paths-head h2 { max-width: 13ch; }
    .in-game-paths-grid .in-price { min-height: 460px; }
}
@media (max-width: 680px) {
    .in-game-paths-shell { grid-template-columns: 1fr; gap: 16px; }
    .in-game-paths-head { grid-column: 1; padding: 0 0 16px; }
    .in-game-paths-grid .in-price { min-height: 0; padding: 30px 24px; border-radius: 22px; }
    .in-game-paths-grid .in-price .in-btn { width: 100%; justify-content: center; }
}

/* Hero kontaktu: dane kontaktowe w kafelkach po lewej, zdjęcie obok.
   Cały moduł celowo niższy od hero „ofertowych" — to tylko wstęp do
   formularza pod spodem. Zdjęcie jest wąskim, pionowym kadrem po prawej,
   nie połową ekranu (wcześniej 700 px wysokości zjadało cały ekran). */
.in-contact-hero {
    margin-top: -96px; padding: 138px 0 66px; text-align: left;
}
/* Kolumna zdjecia ma STALY limit, nie ulamek: przy 1.32/0.68 kadr konczyl sie
   na 380 px, a po lewej zostawal pas pustego bieli szerszy od samego naglowka. */
.in-contact-hero > .in-wrap {
    display: grid; grid-template-columns: minmax(0, 1fr) minmax(320px, 620px);
    gap: clamp(36px, 4.5vw, 64px); align-items: center;
}
.in-contact-copy { min-width: 0; align-self: center; }
.in-contact-hero h1 {
    max-width: 14ch; margin: 0 0 20px; font-size: clamp(44px, 4.4vw, 68px);
    line-height: 1; letter-spacing: -.05em; text-wrap: balance;
}
.in-contact-hero .in-lead {
    max-width: 46ch; margin: 0; color: var(--color-text, #0B1220);
    font-size: clamp(17px, 1.2vw, 19px); line-height: 1.6;
}
.in-contact-cards:empty { display: none; }
.in-contact-cards {
    display: grid; grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 14px; margin-top: 38px;
}
.in-contact-card {
    min-width: 0; min-height: 142px; display: flex; flex-direction: column;
    padding: 22px; border: 1px solid rgba(198,196,216,.9); border-radius: 22px;
    background: rgba(255,255,255,.78);
}
.in-contact-card-head { display: flex; align-items: center; gap: 12px; margin-bottom: 16px; }
.in-contact-icon {
    flex: 0 0 42px; width: 42px; height: 42px; display: grid; place-items: center;
    border-radius: 50%; background: var(--brand-50, #E7EDF9); color: var(--brand-primary, #643B81);
}
.in-contact-icon svg { width: 21px; height: 21px; }
.in-contact-card h2 { margin: 0; font: 700 14px/1.3 var(--font-body, 'Source Sans Pro', sans-serif); }
.in-contact-card > a,
.in-contact-card > span {
    color: var(--color-text, #0B1220); font-size: 16px; line-height: 1.5;
    overflow-wrap: anywhere;
}
.in-contact-card > a { text-underline-offset: 3px; }
.in-contact-socials { display: flex; flex-wrap: wrap; gap: 8px; }
.in-contact-socials a {
    width: 36px; height: 36px; display: grid; place-items: center; padding: 0;
    border: 1px solid var(--color-border, #C6C4D8);
    border-radius: 50%; color: var(--brand-primary, #643B81); font-size: 13px;
    text-decoration: none;
}
.in-contact-socials a svg { width: 16px; height: 16px; }
.in-contact-socials a:hover { border-color: var(--brand-primary, #643B81); }
/* Kadr poziomy, nie pionowy słupek: zdjęcie źródłowe jest 3:2, więc przy 4/5
   obcinaliśmy mu pół tła. 4/3 przy 620 px daje mniej więcej tę samą wysokość
   co poprzedni wąski kadr (465 vs 475 px) — hero nie urosło, obraz owszem. */
.in-contact-media {
    width: 100%; max-width: 620px; margin: 0 0 0 auto; aspect-ratio: 4 / 3;
    overflow: hidden; border-radius: 26px; background: var(--brand-50, #E7EDF9);
}
.in-contact-media img {
    display: block; width: 100%; height: 100%; object-fit: cover; object-position: 50% center;
    opacity: 1 !important; visibility: visible !important;
}
@media (max-width: 960px) {
    .in-contact-hero > .in-wrap { grid-template-columns: 1fr; }
    .in-contact-hero h1 { max-width: 15ch; }
    .in-contact-media { max-width: 520px; margin-left: 0; }
}
@media (max-width: 600px) {
    .in-contact-hero { margin-top: -82px; padding: 118px 0 56px; }
    .in-contact-hero h1 { font-size: clamp(40px, 11vw, 52px); }
    .in-contact-cards { grid-template-columns: 1fr; margin-top: 30px; }
    .in-contact-card { min-height: 0; border-radius: 18px; }
    .in-contact-media { max-width: 100%; aspect-ratio: 4 / 3; border-radius: 20px; }
}

/* ══════════════════════════════════════════════════════════════════
   KARTY WOKÓŁ ZDJĘCIA — blok `cards` z polem "photo"
   ──────────────────────────────────────────────────────────────────
   Dwie karty z lewej, zdjęcie na środku rozpięte na oba rzędy, dwie
   z prawej — ten sam układ co moduł „Wzorce" na homepage.
   Włącza go samo pole "photo" w bloku `cards` w content/<slug>.json;
   bez niego siatka zostaje zwykłą dwukolumnową.

   Karty stoją w kodzie po kolei 1–4, a rozstawia je dopiero grid —
   czytnik ekranu i tab idą po kolejności treści, nie zygzakiem.
   Zdjęcie świadomie bez aspect-ratio: wysokość ma brać się z rozpięcia
   na oba rzędy, żeby było wyższe od kolumn obok.
   ══════════════════════════════════════════════════════════════════ */
.in-grid-foto { grid-template-columns: minmax(0, 1fr) minmax(260px, 360px) minmax(0, 1fr);
                grid-template-rows: auto auto; align-items: stretch; }
/* Ten sam promien co kafelki modulu „Wzorce" na homepage (20 px). Domyslne
   --radius-md (8 px) przy tej wielkosci karty wygladalo na prawie ostre kanty. */
.in-grid-foto > .in-card { border-radius: 20px; }
.in-grid-foto > .in-card:nth-of-type(1) { grid-column: 1; grid-row: 1; }
.in-grid-foto > .in-card:nth-of-type(2) { grid-column: 3; grid-row: 1; }
.in-grid-foto > .in-card:nth-of-type(3) { grid-column: 1; grid-row: 2; }
.in-grid-foto > .in-card:nth-of-type(4) { grid-column: 3; grid-row: 2; }
.in-cardsfig { grid-column: 2; grid-row: 1 / span 2; margin: 0; min-height: 460px;
               overflow: hidden; border-radius: 20px; background: rgba(11,18,32,.05);
               box-shadow: 0 26px 60px rgba(100,59,129,.10); }
.in-cardsfig img { display: block; width: 100%; height: 100%; object-fit: cover; }

/* Ponizej 1080 px zdjecie w srodku scisnie karty do dwoch slow w wierszu —
   schodzi wiec nad nie, w kadr poziomy. */
@media (max-width: 1080px) {
    .in-grid-foto { grid-template-columns: 1fr 1fr; }
    .in-cardsfig { grid-column: 1 / -1; grid-row: 1; min-height: 0;
                   aspect-ratio: 16 / 9; max-height: 340px; }
    .in-grid-foto > .in-card:nth-of-type(1) { grid-column: 1; grid-row: 2; }
    .in-grid-foto > .in-card:nth-of-type(2) { grid-column: 2; grid-row: 2; }
    .in-grid-foto > .in-card:nth-of-type(3) { grid-column: 1; grid-row: 3; }
    .in-grid-foto > .in-card:nth-of-type(4) { grid-column: 2; grid-row: 3; }
}
@media (max-width: 700px) {
    .in-grid-foto { grid-template-columns: 1fr; }
    .in-cardsfig { aspect-ratio: 4 / 3; }
    .in-grid-foto > .in-card:nth-of-type(1), .in-grid-foto > .in-card:nth-of-type(2),
    .in-grid-foto > .in-card:nth-of-type(3), .in-grid-foto > .in-card:nth-of-type(4)
        { grid-column: 1; grid-row: auto; }
}

/* ══════════════════════════════════════════════════════════════════
   BLOK ROZPOZNANIA — wariant „zdania"
   ──────────────────────────────────────────────────────────────────
   Zdania typu „rozpoznajesz siebie?" w rytmie modułu „Wzorce, które
   wracają mimo wszystko" z homepage: równa siatka kafelków, w każdym
   ikona liniowa, numer w rogu, tytuł i dopowiedzenie.

   Wcześniej były to kafelki przesunięte naprzemiennie w pionie, co drugi
   na fiolecie. Zmiana na prośbę klientki — ten sam blok ma wyglądać tak
   samo na homepage i na podstronie.

   To WARIANT bloku `list`, wybierany przez "variant": "zdania"
   w content/<slug>.json. Domyślny wygląd listy zostaje bez zmian —
   `list` jedzie na 15 podstronach i globalna zmiana rozwaliłaby je wszystkie.

   Markup (ikona, numer, podział zdania na tytuł i dopowiedzenie) robi
   render_zdania() w build.py — numery nie są już licznikiem CSS.
   ══════════════════════════════════════════════════════════════════ */
.in-sec.in-zdania .in-zd-grid { display: grid; grid-template-columns: repeat(3, 1fr);
                                gap: 22px; margin: 40px 0 34px; padding: 0; list-style: none;
                                align-items: stretch; }

/* Kafelek 1:1 jak .in-pn-it z homepage: mleczna biel na gradiencie tla,
   jasna obwodka, rozmycie pod spodem i cien. Zadnego naprzemiennego fioletu
   ani przesuniec w pionie — siatka ma byc rowna. */
.in-sec.in-zdania .in-zd-it {
    position: relative; padding: 38px 40px 42px;
    /* tlo 1:1 z .in-pn-it na homepage (13.08): poswiaty w rogach na bieli */
    background:
        radial-gradient(78% 62% at 78% 12%, rgba(140,102,178,.20) 0%, rgba(140,102,178,0) 62%),
        radial-gradient(70% 58% at 12% 88%, rgba(103,182,192,.18) 0%, rgba(103,182,192,0) 60%),
        #fff;
    border: 1px solid rgba(198,196,216,.55);
    border-radius: 20px;
    box-shadow: 0 18px 46px rgba(100,59,129, .09);
    transition: transform .35s ease, box-shadow .35s ease, border-color .35s ease;
}
.in-sec.in-zdania .in-zd-it:hover { transform: translateY(-4px);
                                    box-shadow: 0 26px 60px rgba(100,59,129, .14);
                                    border-color: rgba(100, 59, 129, .28); }

.in-sec.in-zdania .in-zd-ic { display: block; width: 56px; height: 56px; margin: 0 0 30px;
                              color: var(--brand-primary, #643B81); }
/* numer WIELKIM serifem w pastelowym fiolecie — jak na homepage (13.08) */
.in-sec.in-zdania .in-zd-n { position: absolute; top: 26px; right: 30px; margin: 0;
                             font-family: var(--font-display, Georgia, serif);
                             font-size: 56px; line-height: 1; font-weight: 400;
                             color: rgba(100, 59, 129, .34); }
/* tytul serifem jak na homepage; DM Serif Display ma tylko wage 400 */
.in-sec.in-zdania .in-zd-it h3 { font-family: var(--font-display, Georgia, serif);
                                 line-height: 1.25; font-weight: 400;
                                 margin: 0 0 12px; max-width: 22ch; }
.in-sec.in-zdania .in-zd-it p { font-size: 15px; line-height: 1.65; margin: 0;
                                color: var(--color-text-muted, #413B4D); max-width: 46ch; }

@media (max-width: 1100px) {
    .in-sec.in-zdania .in-zd-grid { grid-template-columns: repeat(2, 1fr); gap: 18px; }
    .in-sec.in-zdania .in-zd-it { padding: 30px 30px 34px; }
    .in-sec.in-zdania .in-zd-n { top: 28px; right: 28px; }
}
@media (max-width: 620px) {
    .in-sec.in-zdania .in-zd-grid { grid-template-columns: 1fr; }
}

/* ══════════════════════════════════════════════════════════════════
   ROZSYPANIE KAFELKÓW PRZY SCROLLU — dokładka do wariantu „zdania"
   ──────────────────────────────────────────────────────────────────
   Sekcja robi się wysoka (220vh), a jej wnętrze przykleja się na wysokość
   ekranu. Przewijanie tej wysokości to postęp animacji 0 → 1, który skrypt
   wpisuje w --p. Kafelki startują ułożone jeden na drugim na środku,
   przykrywając nagłówek, i rozjeżdżają się na swoje miejsca wokół niego.

   Pozycje docelowe są w vw, nie w px: przy sztywnych pikselach na węższym
   ekranie kafelki wyjeżdżały poza sekcję.

   Efekt WŁĄCZA SIĘ DOPIERO OD 1400 px. Niżej nie ma dokąd rozsypywać
   kafelków — zostaje zwykła siatka, bez wysokiej sekcji i bez sticky.

   ⚠️ 19.08.2026 — próg podniesiony z 1100 na 1400 px. Przy 1100–1400 px
   kafelki (sztywne 300 px) wchodziły na nagłówek i wprowadzenie, bo najbliższy
   środka kafelek stoi na 24vw, czyli przy 1200 px zaledwie 288 px od osi —
   mniej niż połowa jego szerokości plus połowa tekstu. Dlatego oprócz progu
   kafelki skalują się z szerokością ekranu, a środkowa kolumna ma sufit
   liczony w vw: korytarz na tekst nigdy nie jest szerszy niż wolne miejsce
   między kafelkami.

   Bez guardu prefers-reduced-motion — tak jak hero, FAQ i karty mentoringu.
   ══════════════════════════════════════════════════════════════════ */
@media (min-width: 1400px) {
    .in-sec.in-rozsyp { min-height: 220vh; padding: 0; }
    .in-sec.in-rozsyp > .in-wrap { position: sticky; top: 0; height: 100vh;
                                   display: flex; flex-direction: column;
                                   align-items: center; justify-content: center; }
    .in-sec.in-rozsyp > .in-wrap > h2 { text-align: center; max-width: min(16ch, 32vw); margin: 0 0 18px; }
    .in-sec.in-rozsyp > .in-wrap > .in-lead { text-align: center; max-width: min(54ch, 28vw); margin: 0; }

    /* siatka przestaje byc siatka — staje sie plaszczyzna, na ktorej
       kafelki sa pozycjonowane absolutnie wzgledem srodka */
    .in-sec.in-rozsyp .in-zd-grid { position: absolute; inset: 0; display: block;
                                    margin: 0; padding: 0; pointer-events: none; }
    /* -50%/-50% w transformie, NIE ujemny margines: kafelki maja rozna wysokosc
       (od dwoch do czterech linijek), wiec staly margines centrowal je zle
       i dolny rzad wyjezdzal poza ekran. */
    .in-sec.in-rozsyp .in-zd-it {
        position: absolute; left: 50%; top: 50%; width: clamp(240px, 18vw, 300px);
        margin: 0; z-index: 2; pointer-events: auto;
        transform: translate(calc(-50% + var(--x, 0px) * var(--p, 0)),
                             calc(-50% + var(--y, 0px) * var(--p, 0)))
                   rotate(calc(var(--r, 0deg) * var(--p, 0)))
                   scale(calc(0.88 + 0.12 * var(--p, 0)));
    }
    /* hover podnosilby kafelek transformem i skasowal pozycje z animacji */
    .in-sec.in-rozsyp .in-zd-it:hover { transform:
        translate(calc(-50% + var(--x, 0px) * var(--p, 0)),
                  calc(-50% + var(--y, 0px) * var(--p, 0)))
        rotate(calc(var(--r, 0deg) * var(--p, 0)))
        scale(calc(0.88 + 0.12 * var(--p, 0))); }

    .in-sec.in-rozsyp .in-zd-it:nth-child(1) { --x: -30vw; --y: -23vh; --r: -3deg; }
    .in-sec.in-rozsyp .in-zd-it:nth-child(2) { --x: -33vw; --y:   10px; --r: -1.5deg; }
    .in-sec.in-rozsyp .in-zd-it:nth-child(3) { --x: -24vw; --y:  23vh; --r:  2.5deg; }
    .in-sec.in-rozsyp .in-zd-it:nth-child(4) { --x:  30vw; --y: -23.5vh; --r:  2deg; }
    .in-sec.in-rozsyp .in-zd-it:nth-child(5) { --x:  33vw; --y:    0px; --r:  1.5deg; }
    .in-sec.in-rozsyp .in-zd-it:nth-child(6) { --x:  25vw; --y:  22.5vh; --r: -2.5deg; }

    /* --- mniej niż sześć kafelków ---------------------------------------
       Domyślne pozycje idą kolumnami: 1-3 po lewej, 4-6 po prawej. Przy
       trzech kafelkach cała trójka wylądowałaby więc po jednej stronie
       nagłówka. Klasę z liczbą dokłada build.py (in-rozsyp--3 / --4).
       Nagłówek dostaje tu więcej miejsca w linii — po bokach nie stoją
       trzy kafelki jeden pod drugim, więc jest gdzie się rozłożyć. */
    .in-sec.in-rozsyp.in-rozsyp--3 > .in-wrap > h2,
    .in-sec.in-rozsyp.in-rozsyp--4 > .in-wrap > h2 { max-width: 22ch; }

    /* -16vh, nie -19vh: kafelki tej sekcji maja po kilka linijek tekstu, wiec
       przy wiekszym odjechaniu w gore chowaly sie pod pigulke nawigacji */
    .in-sec.in-rozsyp.in-rozsyp--3 .in-zd-it:nth-child(1) { --x: -30vw; --y: -16vh; --r: -3deg; }
    .in-sec.in-rozsyp.in-rozsyp--3 .in-zd-it:nth-child(2) { --x:  30vw; --y: -16vh; --r:  2.5deg; }
    .in-sec.in-rozsyp.in-rozsyp--3 .in-zd-it:nth-child(3) { --x:   0vw; --y:  27vh; --r: -1.5deg; }

    .in-sec.in-rozsyp.in-rozsyp--4 .in-zd-it:nth-child(1) { --x: -31vw; --y: -18vh; --r: -3deg; }
    .in-sec.in-rozsyp.in-rozsyp--4 .in-zd-it:nth-child(2) { --x:  31vw; --y: -18vh; --r:  2deg; }
    .in-sec.in-rozsyp.in-rozsyp--4 .in-zd-it:nth-child(3) { --x: -27vw; --y:  21vh; --r:  2.5deg; }
    .in-sec.in-rozsyp.in-rozsyp--4 .in-zd-it:nth-child(4) { --x:  27vw; --y:  21vh; --r: -2.5deg; }

    /* piec kafelkow: po dwa na kolumne i jeden pod naglowkiem. Bez tego
       wpadaly w domyslny uklad kolumnowy (1-3 lewa, 4-5 prawa) i prawa
       strona konczyla sie w polowie wysokosci. */
    .in-sec.in-rozsyp.in-rozsyp--5 > .in-wrap > h2 { max-width: 22ch; }
    .in-sec.in-rozsyp.in-rozsyp--5 .in-zd-it:nth-child(1) { --x: -32vw; --y: -21vh; --r: -3deg; }
    .in-sec.in-rozsyp.in-rozsyp--5 .in-zd-it:nth-child(2) { --x: -30vw; --y:   7vh; --r:  2deg; }
    .in-sec.in-rozsyp.in-rozsyp--5 .in-zd-it:nth-child(3) { --x:  32vw; --y: -21vh; --r:  2.5deg; }
    .in-sec.in-rozsyp.in-rozsyp--5 .in-zd-it:nth-child(4) { --x:  30vw; --y:   7vh; --r: -2deg; }
    .in-sec.in-rozsyp.in-rozsyp--5 .in-zd-it:nth-child(5) { --x:   0vw; --y:  30vh; --r: -1.5deg; }
}

/* ══════════════════════════════════════════════════════════════════
   KONTAKT / FORMULARZ — REGUŁA: tak samo na całym projekcie
   ──────────────────────────────────────────────────────────────────
   Po lewej nagłówek serifem, wprowadzenie i to, co formularz objaśnia;
   po prawej sam formularz, oddzielony pionową kreską. Bez białej karty
   pod formularzem — pola to same podkreślenia, przycisk na całą
   szerokość kolumny.

   Układ składa render_section w build.py, gdy sekcja zawiera blok
   `contact_form`. Nie trzeba nic dopisywać w treści.
   ══════════════════════════════════════════════════════════════════ */
/* ══════════════════════════════════════════════════════════════════
   KONTAKT — trzy szpalty: dane | formularz | szybkie linki
   ------------------------------------------------------------------
   Uklad wzorowany na referencji: waska kolumna z danymi po lewej,
   formularz w srodku (dostaje najwiecej miejsca), po prawej pionowy
   panel z odnosnikami. Wlacza go build.py, gdy sekcja ma `contact_items`.
   ══════════════════════════════════════════════════════════════════ */
.in-ct3-grid {
    display: grid; grid-template-columns: minmax(0, 3fr) minmax(0, 7fr) minmax(0, 3fr);
    gap: clamp(28px, 3vw, 52px); align-items: start;
}
.in-ct-dane, .in-ct-side {
    background: var(--in-soft, #F4F1F7); border-radius: 20px;
    padding: clamp(20px, 1.7vw, 26px);
    /* Boczne panele jada z formularzem — sam formularz jest dwa razy
       wyzszy niz one, wiec bez tego dane kontaktowe i szybkie linki
       znikaja z ekranu w polowie wypelniania. 112px = wysokosc pigulki
       nawigacji (64) + jej padding (2x16) + 16 px oddechu. */
    position: sticky; top: 112px; align-self: start;
    /* awaryjnie, gdy panel jest wyzszy od okna (niskie laptopy) —
       przewija sie w srodku zamiast chowac koncowke pod krawedzia */
    max-height: calc(100vh - 132px); overflow-y: auto;
    /* pasek przewijania tylko wtedy, gdy naprawde jest czego przewijac */
    scrollbar-width: thin; overscroll-behavior: contain;
}
.in-ct-item + .in-ct-item { margin-top: 18px; padding-top: 18px; border-top: 1px solid rgba(11,18,32,.10); }
.in-ct-item-l {
    display: flex; align-items: center; gap: 8px; margin: 0 0 4px;
    font-size: 12px; font-weight: 600; letter-spacing: .06em; text-transform: uppercase;
    color: var(--brand-primary, #643B81);
}
/* Etykieta i wartość mają stać jedna pod drugą przy lewej krawędzi panelu.
   Ikona jest więc samym rysunkiem — kółko 42 px z `.in-contact-icon`
   (hero) wypychało etykietę w prawo, a wartość zostawiało przy krawędzi
   i cała kolumna wyglądała na rozstrzeloną. */
.in-ct-dane .in-contact-icon {
    flex: 0 0 auto; width: auto; height: auto; display: inline-flex;
    background: none; border-radius: 0;
}
.in-ct-item-l svg { width: 16px; height: 16px; flex: 0 0 auto; }
.in-ct-item-v { margin: 0; font-size: 16px; line-height: 1.45; overflow-wrap: anywhere; }
.in-ct-item-v a { border-bottom: 1px solid rgba(100,59,129,.35); }
.in-ct-item-v a:hover { border-bottom-color: var(--brand-primary, #643B81); }
/* Same znaki serwisow zamiast nazw — trzy pigulki z tekstem lamaly sie
   w waskiej kolumnie do dwoch rzedow i zjadaly panel. Nazwa siedzi
   w aria-label/title (markup: social_link() w build.py). */
.in-ct-socials { display: flex; flex-wrap: wrap; gap: 8px; }
.in-ct-socials a {
    width: 38px; height: 38px; display: grid; place-items: center; padding: 0;
    border: 1px solid rgba(11,18,32,.14); border-radius: 50%; border-bottom: 1px solid rgba(11,18,32,.14);
    color: var(--brand-primary, #643B81); font-size: 14px; text-decoration: none;
    transition: background .2s ease, border-color .2s ease, transform .2s ease;
}
.in-ct-socials a svg { width: 17px; height: 17px; }
.in-ct-socials a:hover {
    background: #fff; border-color: var(--brand-primary, #643B81); transform: translateY(-1px);
}

.in-ct-side-h {
    margin: 0 0 18px; font-size: 13px; font-weight: 600;
    letter-spacing: .06em; text-transform: uppercase; color: var(--brand-primary, #643B81);
}
.in-ct-side-l { list-style: none; margin: 0; padding: 0; display: grid; gap: 10px; }
.in-ct-side-l li a {
    display: block; background: #fff; border-radius: 14px; padding: 13px 16px;
    font-size: 15px; line-height: 1.4;
    /* kafelek jest juz sygnalem klikalnosci — podkreslenie robi z niego kase liter */
    text-decoration: none; border-bottom: 0;
    transition: transform .2s ease, box-shadow .2s ease;
}
.in-ct-side-l li a:hover { transform: translateY(-2px); box-shadow: 0 10px 26px rgba(11,18,32,.10); }

/* Srodkowa kolumna to taki sam panel jak dane i szybkie linki — bez tla
   „Umow spotkanie" wisialo na golej bieli miedzy dwoma kaflami.
   Kreska z ukladu 2-kolumnowego jest tu zbedna. */
.in-ct3 .in-ct-body {
    border-left: 0; background: var(--in-soft, #F4F1F7); border-radius: 20px;
    padding: clamp(24px, 2.4vw, 40px);
}
.in-ct3 .in-ct-h { margin-top: 0; }
/* zdanie zamykajace modul — pod przyciskiem, ciszej niz reszta tekstu */
.in-ct-outro { margin-top: 26px; padding-top: 22px; border-top: 1px solid rgba(11,18,32,.10); }
.in-ct-outro p { margin: 0; font-size: 15px; line-height: 1.6; color: var(--color-text-muted, #413B4D); }

@media (max-width: 1180px) {
    .in-ct3-grid { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
    .in-ct3 .in-ct-body { grid-column: 1 / -1; order: 3; }
    /* przy dwoch kolumnach panele stoja NAD formularzem, wiec nie maja
       przy czym stac — sticky tylko blokowalby je w polowie ekranu */
    .in-ct-dane, .in-ct-side { position: static; max-height: none; overflow: visible; }
}
@media (max-width: 760px) {
    .in-ct3-grid { grid-template-columns: 1fr; }
    .in-ct3 .in-ct-body { grid-column: auto; }
}

.in-ct-grid { display: grid; grid-template-columns: minmax(0, 5fr) minmax(0, 7fr);
              gap: 0; align-items: start; }
.in-ct-head { position: sticky; top: 120px; padding-right: 64px; }
.in-ct-h { font-family: var(--font-heading, 'Baloo 2', sans-serif); font-weight: 300;
           line-height: 1.1; letter-spacing: -.01em;
           margin: 0 0 20px; max-width: 14ch; }
.in-ct-head .in-lead { font-size: 17px; line-height: 1.65; max-width: 44ch; margin: 0 0 22px; }
.in-ct-head > :last-child { margin-bottom: 0; }
.in-ct-body { padding-left: 64px; border-left: 1px solid rgba(11,18,32,.16); }

/* formularz — bez karty, pola na samych podkreśleniach */
.in-form { background: transparent; border: 0; border-radius: 0; padding: 0; }
.in-form-g { display: grid; grid-template-columns: 1fr 1fr; gap: 26px 28px; margin-bottom: 34px; }
.in-f-w { grid-column: 1 / -1; }
/* etykiety zostają WIDOCZNE, nie schodzą do placeholderów. We wzorze są
   w środku pola, ale placeholder znika przy pisaniu i użytkownik traci
   informację, co wpisuje — przy dziesięciu polach to realny problem. */
.in-f label, .in-f-w label { display: block; font-size: 12px; font-weight: 600;
                             letter-spacing: .1em; text-transform: uppercase;
                             color: var(--color-text-muted, #413B4D); margin-bottom: 8px; }
.in-form input, .in-form select, .in-form textarea {
    width: 100%; font-family: inherit; font-size: 16px; padding: 10px 2px;
    border: 0; border-bottom: 1px solid rgba(11,18,32,.28); border-radius: 0;
    background: transparent; color: var(--color-text, #0B1220);
    transition: border-color .25s ease;
}
.in-form textarea { resize: vertical; min-height: 96px; }
/* pole daty: wybór z kalendarza, nie wpisywanie z palca. Kliknięcie w dowolne
   miejsce pola otwiera picker (JS w index.html), więc kursor jest wskazujący. */
.in-form input[type="date"] { cursor: pointer; color-scheme: light; }
.in-form input[type="date"]::-webkit-calendar-picker-indicator {
    cursor: pointer; opacity: .5; transition: opacity .2s ease;
}
.in-form input[type="date"]:hover::-webkit-calendar-picker-indicator,
.in-form input[type="date"]:focus::-webkit-calendar-picker-indicator { opacity: 1; }
.in-form input:focus, .in-form select:focus, .in-form textarea:focus {
    outline: none; border-bottom-color: var(--brand-primary, #643B81);
    border-bottom-width: 2px; padding-bottom: 9px;   /* 2px kreski zamiast 1px — bez korekty pole podskakuje */
}
.in-form button { border: 0; cursor: pointer; font-family: inherit; font-size: 16px;
                  width: 100%; border-radius: 999px; padding: 17px 28px; }
/* dopisek pod przyciskiem — czas odpowiedzi, nie kolejna instrukcja */
.in-form-note { margin: 14px 0 0; font-size: 14px; line-height: 1.5;
                color: var(--color-text-muted, #413B4D); }
.in-form ::placeholder { color: rgba(11,18,32,.38); opacity: 1; }

/* TELEFON — kierunkowy z flagą (build.py → `tel_pole`, lista w `KRAJE_TEL`).
   Kierunkowy i numer stoją na JEDNEJ kresce: podkreślenie rysuje wrapper,
   a pola w środku je tracą — inaczej telefon miałby dwie kreski i wypadał
   z rytmu pozostałych pól. Działa tak samo w formularzach (`.in-form`)
   i w quizie z `/test` (`.in-qz-f`), którego style siedzą w `content/test.json`. */
.in-tel { display: flex; align-items: center; gap: 10px;
          border-bottom: 1px solid rgba(11,18,32,.28);
          transition: border-color .25s ease; }
/* 2px kreski zamiast 1px — margines -1px trzyma pole w miejscu przy focusie */
.in-tel:focus-within { border-bottom-color: var(--brand-primary, #643B81);
                       border-bottom-width: 2px; margin-bottom: -1px; }
.in-form .in-tel input, .in-form .in-tel select,
.in-qz-f .in-tel input, .in-qz-f .in-tel select,
.in-form .in-tel input:focus, .in-form .in-tel select:focus,
.in-qz-f .in-tel input:focus, .in-qz-f .in-tel select:focus {
    border: 0; border-radius: 0; padding: 10px 0; outline: none;
}
.in-tel input { flex: 1 1 auto; min-width: 0; }
/* strzałka rysowana tłem: <select> nie przyjmuje pseudoelementów */
.in-form .in-tel .in-tel-k, .in-qz-f .in-tel .in-tel-k {
    flex: 0 0 auto; width: auto; cursor: pointer;
    font-size: 16px;                     /* mniej = iOS przybliża stronę przy otwarciu listy */
    padding-right: 20px; margin-right: 2px;
    border-right: 1px solid rgba(11,18,32,.18);
    -webkit-appearance: none; appearance: none;
    background: transparent url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8'%3E%3Cpath d='M1 1.6 6 6.4l5-4.8' fill='none' stroke='%23413B4D' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat right 4px center/10px 7px;
}
.in-tel:focus-within .in-tel-k { border-right-color: rgba(11,18,32,.28); }

/* ══════════════════════════════════════════════════════════════════
   KALENDARZ REZERWACJI (pole {"type":"calendar"} w formularzu)

   Siatka miesiąca + godziny wybranego dnia. Wybrany termin ląduje
   w ukrytym polu formularza — markup i skrypt składa build.py
   (render_kalendarz / KALENDARZ_JS), dostępność opisuje JSON strony.

   Reguła „bez białej karty pod formularzem" zostaje w mocy — kalendarz
   ma własną, lawendową płytę, bo siatka dni bez obudowy rozpływa się
   w formularzu na samych podkreśleniach. To widget, nie karta na całość.
   ══════════════════════════════════════════════════════════════════ */
.in-cal-lab { font-size: 12px; font-weight: 600; letter-spacing: .1em; text-transform: uppercase;
              color: var(--color-text-muted, #413B4D); margin: 0 0 10px; }
.in-cal-box { background: var(--brand-50, #E7EDF9); border: 1px solid rgba(100,59,129,.16);
              border-radius: 18px; padding: 20px 20px 22px; }

.in-cal-nav { display: flex; align-items: center; justify-content: space-between; gap: 12px;
              margin-bottom: 16px; }
.in-cal-mon { margin: 0; font-size: 17px; font-weight: 600; text-transform: capitalize;
              color: var(--color-text, #0B1220); }
.in-cal .in-cal-arw { width: 38px; height: 38px; flex: 0 0 38px; padding: 0; border-radius: 999px;
                      background: #fff; border: 1px solid rgba(100,59,129,.2);
                      color: var(--brand-primary, #643B81);
                      display: inline-flex; align-items: center; justify-content: center;
                      transition: border-color .2s ease, opacity .2s ease; }
.in-cal .in-cal-arw svg { width: 18px; height: 18px; }
.in-cal .in-cal-arw:hover:not(:disabled) { border-color: var(--brand-primary, #643B81); }
.in-cal .in-cal-arw:disabled { opacity: .3; cursor: default; }

.in-cal-dow { display: grid; grid-template-columns: repeat(7, 1fr); gap: 4px; margin-bottom: 6px; }
.in-cal-dow span { text-align: center; font-size: 11px; font-weight: 600; letter-spacing: .08em;
                   text-transform: uppercase; color: var(--color-text-muted, #413B4D); }

.in-cal-days { display: grid; grid-template-columns: repeat(7, 1fr); gap: 4px; }
.in-cal-d { display: flex; align-items: center; justify-content: center; position: relative;
            min-height: 46px; font-size: 15px; font-family: inherit; }
/* dzień z wolnymi godzinami — biały kafelek z kropką pod liczbą */
.in-cal .in-cal-d { width: auto; padding: 0; border-radius: 12px;
                    background: #fff; border: 1px solid rgba(100,59,129,.18);
                    color: var(--color-text, #0B1220);
                    transition: border-color .2s ease, background .2s ease, color .2s ease; }
.in-cal .in-cal-d:hover { border-color: var(--brand-primary, #643B81); }
.in-cal .in-cal-d i { position: absolute; bottom: 7px; left: 50%; transform: translateX(-50%);
                      width: 4px; height: 4px; border-radius: 999px;
                      background: var(--brand-primary, #643B81); }
.in-cal .in-cal-d.is-on { background: var(--brand-primary, #643B81); border-color: var(--brand-primary, #643B81);
                          color: #fff; font-weight: 600; }
.in-cal .in-cal-d.is-on i { background: #fff; }
/* dzień bez terminów i puste pola przed pierwszym / po ostatnim dniu miesiąca */
.in-cal .in-cal-d--no { background: transparent; border-color: transparent;
                        color: rgba(11,18,32,.3); }
.in-cal .in-cal-d--off { background: transparent; border-color: transparent; }

.in-cal-empty { margin: 14px 0 0; font-size: 14px; color: var(--color-text-muted, #413B4D); }

.in-cal-times { margin-top: 18px; padding-top: 16px; border-top: 1px solid rgba(100,59,129,.16); }
.in-cal-th { margin: 0 0 10px; font-size: 12px; font-weight: 600; letter-spacing: .1em;
             text-transform: uppercase; color: var(--color-text-muted, #413B4D); }
.in-cal-chips { display: flex; flex-wrap: wrap; gap: 8px; }
.in-cal .in-cal-s { width: auto; padding: 11px 18px; border-radius: 999px; font-size: 15px;
                    background: #fff; border: 1px solid rgba(100,59,129,.2);
                    color: var(--color-text, #0B1220);
                    transition: border-color .2s ease, background .2s ease, color .2s ease; }
.in-cal .in-cal-s:hover { border-color: var(--brand-primary, #643B81); }
.in-cal .in-cal-s.is-on { background: var(--brand-primary, #643B81);
                          border-color: var(--brand-primary, #643B81); color: #fff; font-weight: 600; }

.in-cal-sum { margin: 16px 0 0; font-size: 15px; font-weight: 600;
              color: var(--brand-primary, #643B81); }
.in-cal-err { margin: 12px 0 0; font-size: 14px; color: #643B81; }
.in-cal-note { margin: 14px 0 0; font-size: 13px; line-height: 1.55;
               color: var(--color-text-muted, #413B4D); }

@media (max-width: 600px) {
    .in-cal-box { padding: 16px 14px 18px; }
    .in-cal-d { min-height: 40px; font-size: 14px; }
    .in-cal-days, .in-cal-dow { gap: 3px; }
    .in-cal .in-cal-d { border-radius: 10px; }
}

@media (max-width: 1000px) {
    .in-ct-grid { grid-template-columns: 1fr; gap: 36px; }
    .in-ct-head { position: static; padding-right: 0; }
    .in-ct-h { max-width: none; }
    .in-ct-body { padding-left: 0; border-left: 0;
                  border-top: 1px solid rgba(11,18,32,.16); padding-top: 34px; }
}

/* artykul blogowy — waska kolumna do czytania */
/* kolumna do czytania startuje od tego samego guttera co nagłówek artykułu
   (72px) — wyśrodkowana rozjeżdżała się z H1 po przejściu na moduły full-bleed */
/* ══════════════════════════════════════════════════════════════════
   WPIS BLOGOWY — tytuł na osi, pod nim trzy kolumny
   ──────────────────────────────────────────────────────────────────
   Wzór: klasyczny układ blogowy — po lewej szyna „o autorce", w środku
   kolumna do czytania, po prawej polecane wpisy. Szyny są przyklejone
   przy scrollu i oddzielone od treści cienką pionową kreską.

   Układ składa render_main w build.py: wciąga sekcje `autorka`
   i `polecane` na szyny, zamiast stawiać je pod treścią.
   Rozpoznaje wpis po hero.eyebrow == "Blog" — regulamin i polityka
   prywatności mają ten sam wariant `article`, ale szyn nie dostają.
   ══════════════════════════════════════════════════════════════════ */
/* Nagłówek wpisu na osi — tytuł i metryczka wyśrodkowane nad trzema kolumnami.
   Celujemy przez :has(), żeby nie dokładać klasy do hero w build.py; hero
   pozostałych podstron zostaje wyrównane do lewej. */
body:has(.in-art3) .in-hero-sub { text-align: center; padding-bottom: 40px; }
body:has(.in-art3) .in-hero-sub h1 { max-width: 22ch; margin-left: auto; margin-right: auto; }
body:has(.in-art3) .in-hero-sub .in-hero-note { margin-left: auto; margin-right: auto; }

/* Prawa szyna szersza od lewej (290 vs 230): po dolozeniu miniatur na tytul
   zostawalo ~120 px i „Czym jest syndrom oszusta?" lamalo sie na trzy linijki. */
/* Od 27.08.2026 lewej szyny („O autorce") juz nie ma — zostaja dwie kolumny:
   tekst i szyna z polecanymi.

   ⚠️ Kolumna tekstu MUSI miec gorny limit. Po usunieciu lewej szyny `1fr`
   zabralo cala odzyskana szerokosc i na monitorze wiersze mialy po ~140 znakow
   zamiast ~75 — nie do czytania. Zgloszone przez Bartka. 90ch to okolo 880 px
   przy stopniu tekstu ciaglego — 72ch okazalo sie za waskie (Bartek). Para kolumn jest wysrodkowana, wiec artykul nie
   wisi przy lewej krawedzi. */
.in-art3-grid { display: grid; grid-template-columns: minmax(0, 90ch) 290px;
                gap: 0 56px; align-items: start; max-width: none;
                justify-content: center; }
/* ⚠️ Rozmiary pisma dla szyny i artykulu siedza w `skala.css` i sa tam
   ustawione z `!important`, a ten arkusz laduje sie WCZESNIEJ. Deklaracje
   `font-size` powtorzone tutaj nigdy nie wchodzily w zycie — w narzedziach
   deweloperskich widac je jako przekreslone i wygladaja, jakby cos ustawialy.
   Usuniete 27.08.2026 (zgloszone przez Bartka). Ponizsze 14 px zostaje: dotyczy
   elementow szyny, ktorych skala nie obejmuje. */
.in-art-rail { position: sticky; top: 110px; font-size: 14px; line-height: 1.6;
               color: var(--color-text-muted, #413B4D); }
.in-art-rail--l { border-right: 1px solid rgba(11,18,32,.14); padding-right: 40px; }
.in-art-rail--r { border-left: 1px solid rgba(11,18,32,.14); padding-left: 40px; }
.in-art-rail-t { font-weight: 700; letter-spacing: .14em;
                 text-transform: uppercase; color: var(--color-text, #0B1220);
                 margin: 0 0 18px; }
/* w szynach nie ma miejsca na dwukolumnowe „zdjęcie + tekst" ani na siatkę kart */
.in-art-rail .in-two { display: block; }
.in-art-rail .in-media-i { position: static; margin-bottom: 16px; }
.in-art-rail .in-media-i img { position: static; border-radius: 14px; box-shadow: none; }
.in-art-rail .in-p { margin: 0 0 12px; }
.in-art-rail .in-h3 { margin: 0 0 8px; }
.in-art-rail .in-grid2, .in-art-rail .in-grid3 { grid-template-columns: 1fr; gap: 18px; }
/* Miniatura + tytul obok siebie. Zdjecie na pelna szerokosc szyny bylo za wysokie
   — szyna jest sticky, wiec przy trzech kadrach 250x160 jej dol (z kaflem CTA)
   nie miescil sie juz na ekranie. Kwadrat 72 px daje obraz, a nie zjada pionu. */
.in-art-rail .in-card { background: transparent; border: 0; border-radius: 0;
                        display: grid; grid-template-columns: 72px minmax(0, 1fr);
                        gap: 14px; align-items: start; }
.in-art-rail .in-card:not(:has(img)) { grid-template-columns: 1fr; }
.in-art-rail .in-card img { display: block; width: 72px; height: 72px; margin: 0;
                            object-fit: cover; border-radius: 12px;
                            transition: transform .45s cubic-bezier(.22,.61,.36,1),
                                        filter .45s ease; }
.in-art-rail .in-card:hover img { transform: scale(1.04); filter: saturate(1.06); }
.in-art-rail .in-card-b { padding: 0 0 16px; border-bottom: 1px solid rgba(11,18,32,.10); }
.in-art-rail .in-card-b h3 { line-height: 1.4; margin: 0 0 6px; }
.in-art-rail .in-card-b p { display: none; }        /* w szynie zostaje sam tytul */
.in-art-rail .in-btn { display: none; }

/* ── Kafel CTA na dole prawej szyny ────────────────────────────────
   Doklada go build.py (render_main) pod polecanymi wpisami — nie siedzi
   w tresci artykulu, bo ma byc IDENTYCZNY na kazdym wpisie.
   Fiolet marki, nie grafit: kafel ma wybijac sie z jasnej szyny. */
.in-rail-cta { margin-top: 26px; padding: 26px 24px 24px; border-radius: 20px;
               color: #fff; background: linear-gradient(158deg, #46295E 0%, #643B81 62%, #7A4A9D 100%);
               box-shadow: 0 20px 44px rgba(100,59,129,.26); }
.in-rail-cta h3 { margin: 0 0 10px; color: #fff; font-weight: 600;
                  line-height: 1.25; letter-spacing: -.01em; }
/* rozmiar i interlinia: `skala.css`, grupa drobnego druku */
.in-rail-cta p { margin: 0 0 20px; color: rgba(255,255,255,.82); }
.in-art-rail .in-rail-cta-b {
    display: flex; align-items: center; justify-content: center; width: 100%;
    min-height: 48px; padding: 10px 18px; border-radius: 999px;
    background: #fff; color: var(--brand-primary, #643B81);
    /* `line-height: 1` bylo liczone pod dwuwyrazowe „Umow sesje". Napis jest od
       27.08.2026 duzo dluzszy i lamie sie w waskiej szynie na dwie linijki —
       bez interlinii skleja sie w blok. */
    font-size: 14px; font-weight: 650; line-height: 1.3; text-align: center;
    text-decoration: none;
    transition: transform .25s ease, box-shadow .25s ease;
}
.in-art-rail .in-rail-cta-b:hover { transform: translateY(-2px);
                                    box-shadow: 0 12px 26px rgba(11,18,32,.22); }
/* Strzałka w kółku, jak w każdym innym przycisku serwisu. Motyw dokłada ją
   automatycznie do `.in-btn` i `.in-btn-ghost`, ale ten przycisk ma własną
   klasę `.in-rail-cta-b`, więc reguła go nie obejmowała. Zgłoszone przez
   Bartka 27.08.2026. Kółko fioletowe ze strzałką w bieli — przycisk jest
   biały na fioletowej płycie. */
.in-art-rail .in-rail-cta-b { justify-content: space-between; gap: 12px;
                              padding: 9px 9px 9px 20px; }
.in-art-rail .in-rail-cta-b::after {
    content: ""; flex: 0 0 auto; width: 30px; height: 30px; border-radius: 50%;
    background-color: var(--brand-primary, #643B81);
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12h13M12 5l7 7-7 7'/%3E%3C/svg%3E");
    background-size: 15px; background-position: center; background-repeat: no-repeat;
    transition: transform .3s ease;
}
.in-art-rail .in-rail-cta-b:hover::after { transform: translateX(3px); }

@media (max-width: 1200px) {
    /* Poniżej 1200 px szyny nie mieszczą się obok kolumny do czytania —
       schodzą pod nią, jedna obok drugiej, i tracą kreski oraz przyklejenie. */
    .in-art3-grid { grid-template-columns: 1fr; gap: 40px; }
    .in-art-body { grid-column: 1 / -1; order: -1; }
    .in-art-rail { position: static; }
    .in-art-rail--l, .in-art-rail--r { border: 0; padding: 28px 0 0;
                                       border-top: 1px solid rgba(11,18,32,.14); }
}
@media (max-width: 700px) {
    .in-art3-grid { grid-template-columns: 1fr; }
}

.in-article .in-wrap { max-width: 832px; margin-left: 0; }
/* trzykolumnowy wpis rozpycha sie na pelna szerokosc — limit 832 px zostaje
   tylko dla artykulow bez szyn (regulamin, polityka prywatnosci) */
.in-article.in-art3 .in-wrap { max-width: none; }
.in-article h2 { margin: 44px 0 18px; }
/* Rozmiar i interlinia tekstu artykulu: `skala.css`, grupa tekstu ciaglego. */
.in-meta { font-size: 14px; color: var(--color-text-muted, #413B4D); margin: 0 0 8px; }

/* (Reguly dla starej ramki „O autorce" pod wpisem usuniete 11.08 — sekcja
   przeszla na variant `founder`, wiec `#autorka .in-media-i` juz nie istnieje.) */

/* ══════════════════════════════════════════════════════════════════
   GALERIA SKANOW — blok `gallery` („Zobacz, co kryje sie w ksiazce")
   ──────────────────────────────────────────────────────────────────
   Skany maja rozne proporcje (strona vs rozkladowka), wiec `height: auto`
   i zero przycinania — to fotografie druku, obciecie zjadaloby tekst.
   ══════════════════════════════════════════════════════════════════ */
.in-gal { display: grid; grid-template-columns: 1fr 1fr; gap: 28px; margin: 0; }
.in-gal-it { margin: 0; }
.in-gal-it--wide { grid-column: 1 / -1; }
.in-gal-it img { display: block; width: 100%; height: auto; margin: 0;
                 background: #fff; border: 1px solid var(--color-border, #C6C4D8);
                 border-radius: 14px; box-shadow: 0 18px 44px rgba(100,59,129,.10); }
.in-gal figcaption { margin-top: 10px; font-size: 13px; letter-spacing: .04em;
                     color: var(--color-text-muted, #413B4D); }
@media (max-width: 720px) { .in-gal { grid-template-columns: 1fr; gap: 20px; } }

/* „Jedyny taki podrecznik na rynku" — uklad `split`, ale ze zdjeciem w LEWEJ
   kolumnie pod naglowkiem (w kolumnie zostawalo pol ekranu pustki, a kadr
   ladowal pelna szerokoscia pod tekstem). `display: contents` rozpuszcza
   .in-two, wiec kadr i tekst wchodza wprost w siatke sekcji. Naglowek traci
   `grid-row: 1 / span 50` z wariantu split — inaczej zajmowalby cala kolumne
   i nie bylo gdzie wstawic zdjecia. */
#readmore > .in-wrap > h2 { grid-row: 1; position: static; }
#readmore .in-two { display: contents; }
#readmore .in-two > div:not(.in-media-i) { grid-column: 2; grid-row: 1 / span 2; }
#readmore .in-media-i { grid-column: 1; grid-row: 2; margin-top: 34px; }
#readmore .in-media-i img { position: static; border-radius: 20px; }
/* przycisk stal tuz pod ostatnia pozycja listy — w bloku `media` nie ma
   marginesu miedzy trescia a CTA */
#readmore .in-two > div:not(.in-media-i) > .in-btn { margin-top: 28px; }
@media (max-width: 1000px) {
    #readmore .in-media-i { grid-column: 1; grid-row: auto; margin-top: 32px; }
    #readmore .in-two > div:not(.in-media-i) { grid-column: 1; grid-row: auto; }
}

/* „Zamow ksiazke juz dzis" — zdjecie ma zaczynac sie na tej samej linii co
   naglowek. Domyslnie naglowek i lead ida PELNA szerokoscia nad blokiem
   `media`, wiec kadr startowal ~180 px nizej niz tekst. `display: contents`
   rozpuszcza .in-two, dzieki czemu jego dzieci wchodza wprost w siatke sekcji:
   tekst do lewej kolumny, zdjecie do prawej od pierwszego wiersza. */
#zamow > .in-wrap { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
                    gap: 0 56px; align-items: start; }
#zamow > .in-wrap > h2,
#zamow > .in-wrap > .in-lead { grid-column: 1; }
#zamow .in-two { display: contents; }
#zamow .in-two > div:not(.in-media-i) { grid-column: 1; }
#zamow .in-media-i { grid-column: 2; grid-row: 1 / span 20; }
#zamow .in-media-i img { position: static; }
@media (max-width: 900px) {
    /* row-gap: 0 z ukladu dwukolumnowego (`gap: 0 56px`) przenosil sie na uklad
       pionowy i zdjecie przyklejalo sie do przycisku „Kup teraz" bez zadnego
       odstepu. Po zlozeniu do jednej kolumny wiersze musza dostac swiatlo. */
    #zamow > .in-wrap { grid-template-columns: 1fr; row-gap: 32px; }
    #zamow .in-media-i { grid-column: 1; grid-row: auto; }
}

/* Okladka e-booka to pionowy kadr — w kolumnie 1/2 rosla na dwa ekrany, a karta
   z cena po prawej konczyla sie w jednej trzeciej jej wysokosci. Ograniczamy
   SZEROKOSC i nie przycinamy (object-fit: contain) — to grafika z tekstem,
   wiec `cover` obcinalby tytul. */
#ebook .in-two { align-items: center; }
#ebook .in-media-i img { max-width: 340px; width: 100%; height: auto; object-fit: contain;
                         margin-inline: auto; border-radius: 20px;
                         box-shadow: 0 18px 44px rgba(100,59,129,.12); }

/* „Inne obszary” — na wszystkich podstronach sa to teraz pelne kafelki,
   zgodne z kartami wzorcow: jasne tlo, duzy promien, symbol i numer. */
.in-chips .in-list {
    grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 20px;
    counter-reset: in-area-card;
}
.in-chips .in-list li {
    counter-increment: in-area-card;
    position: relative; min-height: 238px; padding: 30px;
    border: 1px solid rgba(198,196,216,.55); border-radius: 30px;
    /* tlo 1:1 z .in-pn-it na homepage (13.08): poswiaty w rogach na bieli */
    background:
        radial-gradient(78% 62% at 78% 12%, rgba(140,102,178,.20) 0%, rgba(140,102,178,0) 62%),
        radial-gradient(70% 58% at 12% 88%, rgba(103,182,192,.18) 0%, rgba(103,182,192,0) 60%),
        #fff;
    overflow: hidden;
    transition: transform .28s ease, border-color .28s ease, box-shadow .28s ease;
}
/* numer WIELKIM serifem w pastelowym fiolecie — jak na homepage (13.08) */
.in-chips .in-list li::after {
    content: counter(in-area-card, decimal-leading-zero);
    position: absolute; top: 24px; right: 26px;
    color: rgba(100,59,129,.34);
    font: 400 56px/1 var(--font-display, Georgia, serif);
}
/* Kafel: ikona u gory, tytul i zdanie opisu przy dolnej krawedzi.
   Wczesniej kazdy obszar mial ten sam kreskowany okrag z ::before i sam tytul —
   szesc identycznych kafelkow z duza pusta plama w srodku. Ikone i opis dobiera
   build.py po docelowym pliku (slownik OBSZARY). */
.in-chips .in-list a {
    display: flex; flex-direction: column; width: 100%; min-height: 176px;
    color: var(--color-text, #0B1220); text-decoration: none;
}
.in-area-ic { display: block; width: 56px; height: 56px; margin-bottom: auto;
              color: var(--brand-primary, #643B81); }
.in-area-ic svg { width: 100%; height: 100%; }
/* tytul serifem jak na homepage; DM Serif Display ma tylko wage 400 */
.in-chips .in-list .in-area-t {
    display: block; margin-top: 24px; font-family: var(--font-display, Georgia, serif);
    font-size: 24px; font-weight: 400; line-height: 1.2;
}
.in-chips .in-list .in-area-d {
    display: block; margin-top: 8px; max-width: 34ch;
    color: var(--color-text-muted, #413B4D); font-size: 15px; line-height: 1.55;
}
/* ikona reaguje razem z kafelkiem, zeby najazd czytalo sie jako jeden ruch */
.in-chips .in-list li:hover .in-area-ic { transform: translateY(-2px); }
.in-area-ic { transition: transform .28s ease; }
/* hover bez podmiany tla — jednolity kolor zabijalby gradient plaszki;
   kafelek unosi sie i dostaje cien jak wzorce na homepage */
.in-chips .in-list li:hover {
    transform: translateY(-3px); border-color: rgba(100,59,129,.28);
    box-shadow: 0 26px 60px rgba(100,59,129,.14);
}
/* CTA domykajace modul — bez odstepu przykleja sie do dolnej krawedzi kafelka
   z pierwszej kolumny i czyta sie jak jego przycisk, a nie jak wyjscie z sekcji.
   Ten sam odstep co pod siatka zespolu (patrz regula z `.in-people`). */
.in-sec.in-chips > .in-wrap > .in-btn { margin-top: clamp(38px, 4vw, 58px); }

@media (max-width: 860px) {
    .in-chips .in-list { grid-template-columns: 1fr 1fr; }
}
@media (max-width: 600px) {
    .in-sec.in-chips > .in-wrap > .in-btn { width: 100%; margin-top: 32px; text-align: center; }
}

/* zgoda RODO w formularzu — checkbox obok tekstu, nie nad nim.
   Zeruje styl etykiet pol (.in-f-w label): to zdanie, nie etykieta, wiec
   wersaliki z rozstrzeleniem robily z niego nieczytelny pasek. */
.in-f-chk label { display: flex; gap: 10px; align-items: flex-start; cursor: pointer;
                  font-size: 13px; line-height: 1.5; color: var(--color-text-muted, #413B4D);
                  text-transform: none; letter-spacing: normal; font-weight: 400; margin-bottom: 0; }
.in-f-chk input { width: auto; margin-top: 2px; accent-color: var(--brand-primary, #643B81); }

/* pas liczb (blok "kpi") — wg makiety IA */
.in-kpi { list-style: none; margin: 0; padding: 26px 0 0; display: grid;
          grid-template-columns: repeat(4, 1fr); gap: 28px;
          border-top: 1px solid rgba(11,18,32,.18); }
.in-kpi b { display: block; font-family: var(--font-heading, 'Baloo 2', sans-serif); font-weight: 400;
            font-size: 52px; line-height: 1; color: var(--brand-primary, #643B81); margin-bottom: 8px; }
.in-kpi span { font-size: 14px; line-height: 1.45; color: var(--color-text-muted, #413B4D); }

/* pigulki z kompetencjami (blok "tags") */
.in-tags { list-style: none; margin: 0 0 24px; padding: 0; display: flex; flex-wrap: wrap; gap: 8px; }
.in-tags li { font-size: 13px; border-radius: 999px; padding: 7px 16px;
              background: var(--brand-50, #E7EDF9); border: 1px solid var(--color-border, #C6C4D8); }

@media (max-width: 860px) {
    .in-kpi { grid-template-columns: 1fr 1fr; gap: 22px; }
    .in-kpi b { font-size: 40px; }
    .in-hero-sub { padding: 150px 0 56px; }
    .in-grid2, .in-grid3 { grid-template-columns: 1fr; }
    .in-form-g { grid-template-columns: 1fr; }
    .in-step { flex-direction: column; gap: 12px; }
    .in-price-a { font-size: 42px; }
}

/* ══════════════════════════════════════════════════════════════════
   SEKCJA KONCOWA CTA — variant: "cta"
   ──────────────────────────────────────────────────────────────────
   Od 13.08 to PLASZKA: zaokraglona karta (36 px) w gutterach strony,
   z tym samym gradientem co karta quizu na homepage (.in-ts-panel,
   „kalkulator") — fiolet→indygo z turkusem w rogu. (Biala wersja
   z 13.08 po poludniu COFNIETA na prosbe klientki — zmiana miala
   dotyczyc tylko ramki .in-note.) Zmieniasz wyglad tutaj I w .in-cb-*
   w index.html, inaczej homepage i podstrony sie rozjada.

   UKLAD: jedna wysrodkowana kolumna (plakietka, naglowek, akapit, przycisk).
   Plakietka powstaje z PIERWSZEGO bloku typu "p" w sekcji — ma ja tylko
   gra-terapeutyczna, pozostale podstrony wchodza bez niej.
   ══════════════════════════════════════════════════════════════════ */
.in-sec.in-cta {
    position: relative; overflow: hidden; contain: paint;
    margin-left: var(--in-hgut, 72px); margin-right: var(--in-hgut, 72px);
    padding: 0; border-top: 0; min-height: 58svh;
    border-radius: 36px; border: 1px solid rgba(198,196,216,.72);
    background:
        radial-gradient(70% 100% at 5% 0%, rgba(255,255,255,.20) 0%, rgba(255,255,255,0) 64%),
        radial-gradient(72% 110% at 100% 100%, rgba(103,182,192,.30) 0%, rgba(103,182,192,0) 68%),
        linear-gradient(125deg, #5E689A 0%, #643B81 55%, #67B6C0 118%);
    display: flex; align-items: stretch;
}

/* Jedna wysrodkowana kolumna (13.08) — plakietka, naglowek, akapit, przycisk
   jeden pod drugim, wszystko na srodku. 1:1 z .in-cb-inner na homepage.
   Bylo grid 1.5fr/.55fr (naglowek po lewej, tekst po prawej) — na szerokich
   ekranach rozjezdzalo sie na dwa oddalone bloki z pusta polowa miedzy nimi.
   Zmieniasz wyglad tutaj I w .in-cb-* w index.html, inaczej homepage
   i podstrony sie rozjada. */
.in-cta-inner {
    position: relative; z-index: 2; max-width: 900px; margin: 0 auto; min-height: 58svh;
    display: flex; flex-direction: column; align-items: center; justify-content: center;
    gap: 30px; text-align: center;
    padding: clamp(64px, 7vh, 92px) var(--in-hgut, 64px);
}
.in-cta-tag {
    margin: 0; padding: 12px 20px;
    border: 1px solid rgba(255,255,255,.72); border-radius: 999px;
    color: #fff; font-size: 14px; background: rgba(94,104,154,.18);
    -webkit-backdrop-filter: blur(5px); backdrop-filter: blur(5px);
}
.in-sec.in-cta h2 {
    max-width: 16ch; margin: 0; color: #fff;   /* naglowki podstron sa dluzsze niz na homepage */
    font-family: var(--font-heading, 'Baloo 2', sans-serif); font-weight: 400;
    line-height: .96; letter-spacing: -.055em;
    text-wrap: balance;
}
.in-sec.in-cta .in-lead {
    max-width: 42ch; margin: 0; font-size: 17px; line-height: 1.65;
    color: rgba(255,255,255,.9);
}
.in-sec.in-cta .in-p { color: rgba(255,255,255,.9); }

/* Pas domykający z DWIEMA kartami (kurs: cennik + ramka „UWAGA!") — jedyny
   wariant, ktory zostaje przy starym ukladzie dwukolumnowym: karty
   potrzebuja szerokosci, nie mieszcza sie w waskiej wysrodkowanej kolumnie
   wyzej. Prawa kolumna dostaje wiecej miejsca, karty staja obok siebie —
   pionowo ciagnely sekcje na dwa ekrany i zostawialy pusta lewa polowe.
   Klase dokłada `render_section`, gdy sekcja `cta` ma co najmniej dwa bloki
   poza plakietka. */
.in-cta--karty .in-cta-inner {
    max-width: none; margin: 0; display: grid;
    grid-template-columns: minmax(0, .95fr) minmax(0, 1.55fr);
    gap: 56px; align-items: end; text-align: left;
}
.in-cta--karty .in-cta-main { align-self: stretch; display: flex; flex-direction: column; justify-content: flex-end; }
.in-cta--karty .in-cta-tag { align-self: flex-start; margin: 0 0 auto; }
.in-cta--karty .in-cta-side {
    align-self: end; display: grid; gap: 22px;
    grid-template-columns: repeat(2, minmax(0, 1fr)); align-items: start;
}
/* wprowadzenie i przycisk idą przez całą szerokość, nad kartami i pod nimi */
.in-cta--karty .in-cta-side > .in-lead,
.in-cta--karty .in-cta-side > .in-btn { grid-column: 1 / -1; }
.in-cta--karty .in-cta-side > .in-btn { justify-self: start; }
.in-cta--karty .in-sec.in-cta h2, .in-cta--karty h2 { max-width: 13ch; }
/* Pas domykający maluje akapity na biało (ciemne tło sekcji), ale ramka `note`
   ma JASNE tło — biały tekst był na niej nieczytelny. Wewnątrz karty wracamy
   do koloru tekstu z reszty serwisu. */
.in-sec.in-cta .in-note .in-p,
.in-sec.in-cta .in-note .in-lead { color: var(--color-text, #0B1220); }
@media (max-width: 980px) {
    .in-cta--karty .in-cta-inner { grid-template-columns: 1fr; }
    .in-cta--karty .in-cta-side { grid-template-columns: 1fr; }
}

/* pigulka z kolkiem i strzalka — 1:1 z .in-cb-btn na homepage */
/* Pigulka odchudzona (prosba 06.08): kolko 38 zamiast 46 px i ciasniejszy
   padding — wysokosc spada z 66 na 54 px. Stopien pisma w gore do 16 px,
   zgodnie z podloga z audytu typografii. */
.in-sec.in-cta .in-btn {
    display: inline-flex; align-items: center; gap: 14px;
    background: #fff; color: var(--brand-900, #643B81);
    font-size: 16px; font-weight: 500;
    padding: 8px 8px 8px 24px; border-radius: 999px;
    transition: transform .3s ease, box-shadow .3s ease;
}
.in-sec.in-cta .in-btn:hover { transform: translateY(-2px); box-shadow: 0 16px 40px rgba(0,0,0,.22); }
.in-cta-ic {
    flex: 0 0 auto; width: 38px; height: 38px; border-radius: 50%;
    background: var(--brand-900, #643B81); color: #fff;
    display: flex; align-items: center; justify-content: center;
    transition: transform .3s ease;
}
.in-sec.in-cta .in-btn:hover .in-cta-ic { transform: translateX(4px); }

@media (max-width: 860px) {
    /* Wysrodkowany stos nie potrzebuje wymuszonej wysokosci ani hacka
       spread-apart — sam dobrze wyglada przy naturalnej wysokosci tresci. */
    .in-sec.in-cta:not(.in-cta--karty) { min-height: auto; }
    .in-cta-inner { min-height: auto; gap: 26px; padding: 64px var(--in-gut, 24px); }
    .in-sec.in-cta h2 { max-width: 13ch; }
    .in-sec.in-cta .in-lead { font-size: 16px; }
    .in-cta-ic { width: 40px; height: 40px; }

    /* Wariant z kartami zachowuje starszy hack: na telefonie kolumny ustawiaja
       sie jedna pod druga i przy `align-items: end` wolna wysokosc
       rozkladala sie po rowno miedzy wiersze — naglowek wisial w polowie
       ekranu. Naglowek idzie do gornej krawedzi, karty i przycisk zostaja
       przy dolnej. */
    .in-cta--karty .in-cta-inner { min-height: 62svh; grid-template-columns: 1fr; gap: 36px;
                    max-width: none; margin: 0; text-align: left;
                    padding: 44px var(--in-gut, 24px) 48px;
                    align-content: space-between; align-items: start; }
    .in-cta--karty.in-sec.in-cta { min-height: 62svh; }
    .in-cta--karty .in-cta-main { gap: 48px; justify-content: flex-start; }
    .in-cta--karty .in-cta-tag { margin-bottom: 0; }
    .in-cta--karty .in-cta-side { width: min(100%, 560px); justify-self: end; }
}
@media (max-width: 600px) {
    .in-cta-inner { padding: 48px 20px; gap: 22px; }
    .in-cta-tag { padding: 10px 16px; font-size: 13px; }
    .in-sec.in-cta .in-lead { font-size: 15px; }
    .in-sec.in-cta .in-btn { width: 100%; justify-content: space-between; padding-left: 18px; font-size: 13px; }
}

/* ══════════════════════════════════════════════════════════════════
   LISTA WPISOW BLOGA — variant: "posts"
   ──────────────────────────────────────────────────────────────────
   Karty bez pudelka: zdjecie z zaokraglonymi rogami, pod nim tytul,
   zajawka i pigulka „Czytaj". Wpisy stoja bezposrednio na gradiencie
   strony — bialy kafelek z obwodka odbieral im oddech i sprawial,
   ze siatka wygladala jak tabela.

   Dotyczy TYLKO sekcji z variant:"posts". Blok `cards` w pozostalych
   miejscach (sciezki, warianty gry, „nie pracujesz tylko w glowie")
   zostaje bialym kafelkiem — tam pudelko ma sens.
   ══════════════════════════════════════════════════════════════════ */
.in-sec.in-posts .in-grid3 { gap: 48px 32px; }
.in-sec.in-posts .in-card { background: transparent; border: 0; border-radius: 0;
                            overflow: visible; display: flex; flex-direction: column; }
.in-sec.in-posts .in-card:hover { border-color: transparent; }
.in-sec.in-posts .in-card img { aspect-ratio: 4 / 3; border-radius: 18px;
                                transition: transform .45s cubic-bezier(.4,0,.2,1); }
/* zdjecie przybliza sie na hover — pudelka nie ma, wiec to jedyny sygnal,
   ze kafelek jest klikalny */
.in-sec.in-posts .in-card:hover img { transform: scale(1.02); }
.in-sec.in-posts .in-card-b { padding: 22px 2px 0; display: flex; flex-direction: column;
                              flex: 1 1 auto; }
.in-sec.in-posts .in-card h3 { padding: 0; line-height: 1.3;
                               margin: 0 0 12px; }
.in-sec.in-posts .in-card-b p { font-size: 15px; line-height: 1.65; margin: 0 0 22px; }

/* pigulka „Czytaj" — dosuwana do dolu karty i do prawej krawedzi,
   zeby wszystkie wpisy w rzedzie mialy ja w jednej linii */
.in-sec.in-posts .in-card-l { margin: auto 0 0 auto; display: inline-flex; align-items: center;
                              gap: 12px; padding: 9px 9px 9px 20px; border-radius: 999px;
                              border: 1px solid rgba(11,18,32,.22);
                              font-size: 14px; font-weight: 600;
                              color: var(--color-text, #0B1220);
                              transition: background .25s ease, border-color .25s ease, color .25s ease; }
.in-sec.in-posts .in-card-l::after {
    content: "→"; display: grid; place-items: center; width: 30px; height: 30px;
    border-radius: 50%; background: var(--brand-primary, #643B81); color: #fff;
    font-size: 15px; line-height: 1;
    transition: transform .25s ease;
}
.in-sec.in-posts .in-card:hover .in-card-l { background: var(--brand-50, #E7EDF9);
                                             border-color: var(--brand-primary, #643B81);
                                             color: var(--brand-primary, #643B81); }
.in-sec.in-posts .in-card:hover .in-card-l::after { transform: translateX(3px); }
.in-sec.in-posts a.in-card:hover .in-card-l { text-decoration: none; }

.in-post-browser [hidden] { display: none !important; }
.in-pagination {
    display: flex; align-items: center; justify-content: center; gap: 10px;
    margin-top: 62px; padding-top: 34px;
    border-top: 1px solid var(--color-border, #C6C4D8);
}
.in-page-numbers { display: flex; align-items: center; gap: 8px; }
.in-page-nav,
.in-page-num {
    min-height: 48px; border: 1px solid var(--color-border, #C6C4D8);
    background: #fff; color: var(--color-text, #0B1220); font: 700 15px/1 var(--font-body, 'Source Sans Pro', sans-serif);
    cursor: pointer; transition: color .22s ease, background .22s ease, border-color .22s ease;
}
.in-page-nav { padding: 0 24px; border-radius: 999px; }
.in-page-num { min-width: 48px; padding: 0 12px; border-radius: 12px; }
.in-page-num.is-active {
    border-color: var(--brand-primary, #643B81); background: var(--brand-primary, #643B81); color: #fff;
}
.in-page-nav:not(:disabled):hover,
.in-page-num:not(.is-active):hover {
    border-color: var(--brand-primary, #643B81); color: var(--brand-primary, #643B81);
}
.in-page-nav:disabled { opacity: .42; cursor: default; }

/* Opinie zgodne z kartami z homepage, bez duzych inicjalow nad cytatem. */
/* bez wymuszonej bieli — sekcja stoi na mgle z body (13.08) */
.in-sec.in-testimonials { padding-block: 104px; }
.in-testimonials-eyebrow {
    margin: 0 0 14px; color: var(--brand-primary, #643B81);
    font: 800 12px/1.25 var(--font-body, 'Source Sans Pro', sans-serif);
    letter-spacing: .17em; text-transform: uppercase;
}
.in-sec.in-testimonials h2 { max-width: 18ch; margin-bottom: 42px; }
.in-testimonials-grid {
    display: flex; gap: 22px; overflow-x: auto; padding: 2px 2px 14px;
    scroll-snap-type: x mandatory; scrollbar-width: thin;
}
.in-testimonial {
    flex: 1 0 min(360px, calc(100vw - 56px)); min-width: 0; min-height: 410px;
    display: flex; flex-direction: column; margin: 0; padding: 42px;
    border: 1px solid rgba(198,196,216,.82); border-radius: 30px;
    background: var(--brand-50, #E7EDF9); scroll-snap-align: start;
}
.in-testimonial blockquote {
    margin: 0 0 36px; color: var(--color-text, #0B1220);
    font: 500 22px/1.5 var(--font-heading, 'Baloo 2', sans-serif);
}
.in-testimonial footer {
    display: flex; align-items: center; gap: 14px; margin-top: auto; padding-top: 24px;
    border-top: 1px solid rgba(198,196,216,.72);
}
.in-testimonial-avatar { display: none; }
.in-testimonial-person { display: grid; gap: 4px; }
.in-testimonial-person strong { font-size: 15px; }
.in-testimonial-person span { color: var(--color-text-muted, #413B4D); font-size: 14px; }

/* Podstrony korzystaja z tego samego poziomego ukladu opinii co homepage. */
.in-sec.in-testimonials .in-tm-track {
    display: flex; gap: 24px; margin-top: 40px;
    margin-right: calc(-1 * var(--in-hgut)); padding: 2px var(--in-hgut) 10px 2px;
    overflow-x: auto; scroll-snap-type: x mandatory; scroll-behavior: smooth;
    scrollbar-width: none; -ms-overflow-style: none;
}
.in-sec.in-testimonials .in-tm-track::-webkit-scrollbar { display: none; }
/* Gdy wszystkie opinie mieszcza sie w kadrze (klase `is-fits` nadaje skrypt
   ta sama miara, ktora chowa strzalki), tasma jest wysrodkowana i traci
   ujemny margines z prawej — inaczej trzy karty wisialy przy lewej krawedzi,
   a po prawej zostawala dziura na czwarta. */
.in-sec.in-testimonials .in-tm-track.is-fits { justify-content: center;
                                               margin-right: 0; padding-right: 2px; }
/* rowne-wysokosci-19-08: karty w jednym rzedzie maja te sama wysokosc.
   Wczesniej `align-items:start` + brak min-height dawaly schodki. */
.in-sec.in-testimonials .in-tm-track { align-items: stretch; }
.in-sec.in-testimonials .in-tm-it {
    /* bez min-height — karta ma wysokość swojej treści (13.08) */
    position: relative; overflow: hidden;
    flex: 0 0 360px; scroll-snap-align: start;
    display: flex; flex-direction: column; gap: 22px; margin: 0;
    padding: 34px 32px 36px; border: 1px solid rgba(198,196,216,.82);
    /* biale karty na lawendowej sekcji — 13.08, spojnie z modulem opinii
       na stronie glownej */
    border-radius: 30px; background: #fff;
}
/* jak na homepage: font tekstowy, waga 400 — Baloo w dluzszym cytacie
   czyta sie jak pogrubienie */
.in-sec.in-testimonials .in-tm-it > figcaption { margin-top: auto; }
.in-sec.in-testimonials .in-tm-q {
    margin: 0; color: var(--color-text, #0B1220);
    font: 400 20px/1.55 var(--font-body, 'Source Sans Pro', sans-serif);
}
/* Karty BEZ podpisu (opinie, przy ktorych klientka nie podaje nazwiska) nie
   potrzebuja 410 px wysokosci zarezerwowanych na stopke z imieniem — inaczej
   krotki cytat wisi w polowie pustego kafla. */
.in-sec.in-testimonials .in-tm-it:nth-child(3n+2) {
    background:
        radial-gradient(78% 62% at 78% 12%, rgba(140,102,178,.20) 0%, rgba(140,102,178,0) 62%),
        radial-gradient(70% 58% at 12% 88%, rgba(103,182,192,.18) 0%, rgba(103,182,192,0) 60%),
        #fff;
}
.in-sec.in-testimonials .in-tm-it::after {
    content: "\201D"; position: absolute; right: 22px; bottom: -6px; z-index: 0;
    pointer-events: none; font-family: var(--font-display, Georgia, serif);
    font-size: 90px; line-height: 1; color: rgba(100,59,129,.16);
}
.in-sec.in-testimonials .in-tm-it > * { position: relative; z-index: 1; }
.in-sec.in-testimonials .in-tm-a {
    margin: 0; padding-top: 20px;
    border-top: 1px solid rgba(11,18,32,.12);
}
.in-sec.in-testimonials .in-tm-n { margin: 0 0 3px; font-size: 15px; font-weight: 700; }
.in-sec.in-testimonials .in-tm-r { margin: 0; color: var(--color-text-muted, #413B4D); font-size: 13px; }
.in-sec.in-testimonials .in-tm-foot {
    display: flex; justify-content: center; margin-top: 34px;
}
/* `hidden` z JS musi wygrac z `display: flex` — bez tego atrybut nic nie robi
   i strzalki zostawaly widoczne, mimo ze nie bylo czego przewijac */
.in-sec.in-testimonials .in-tm-foot[hidden] { display: none; }
.in-sec.in-testimonials .in-tm-nav { display: flex; gap: 12px; }
/* Wyglad `.in-tm-btn` siedzi teraz razem z `.in-kar-nav` w motyw.css —
   jedna definicja dla wszystkich strzalek karuzel. Zostaje tu tylko to,
   co jest specyficzne dla opinii: same kreski ikony. */
.in-tm-btn svg { fill: none; stroke: currentColor; stroke-width: 1.8;
                 stroke-linecap: round; stroke-linejoin: round; }

@media (max-width: 700px) {
    .in-sec.in-posts .in-grid3 { gap: 36px 20px; }
    .in-pagination { flex-wrap: wrap; gap: 8px; margin-top: 44px; }
    .in-page-nav { order: 2; flex: 1 1 calc(50% - 4px); padding-inline: 14px; }
    .in-page-numbers { order: 1; flex-basis: 100%; justify-content: center; }
    .in-testimonial { flex-basis: min(86vw, 340px); min-height: 370px; padding: 28px; border-radius: 24px; }
    .in-sec.in-testimonials .in-tm-track { gap: 16px; margin-top: 28px; }
    .in-sec.in-testimonials .in-tm-it {
        flex-basis: min(84vw, 320px); min-height: 370px; padding: 28px 24px 30px; border-radius: 24px;
    }
    .in-sec.in-testimonials .in-tm-q { font-size: 18px; line-height: 1.5; }
    .in-sec.in-testimonials .in-tm-foot { margin-top: 28px; }
}

/* ============================================================
   ZAMYKAJACY CTA (#cta) — zostaly TYLKO poprawki stykowe
   ------------------------------------------------------------
   Wyglad tej sekcji definiuje blok .in-sec.in-cta wyzej (baner z
   czastkami, plakietka, naglowek u dolu po lewej, pigulka po prawej).
   Wczesniej stal tu drugi, starszy zestaw regul: plaski fioletowy pas.
   Selektor #cta (id) bije .in-cta (klasa) i lezal nizej w pliku, wiec
   ZAWSZE wygrywal — baner z czastkami byl w CSS, ale nigdy sie nie
   pokazywal. Usuniete 06.08; jesli fiolet ma wrocic, to jako osobny
   wariant w JSON-ie, nie jako nadpisanie po id.
   ============================================================ */
/* stopka ma wlasna kreske u gory — przy pasie bylaby druga linia na styku */
.in-sec#cta + .in-ftr, .in-sec#cta + footer { border-top: 0; }

/* ══════════════════════════════════════════════════════════════════
   KAFELKI Z IKONA — variant: "feature"
   ──────────────────────────────────────────────────────────────────
   Ten sam kafelek co modul „wzorce blokujace" na homepage (.in-pn-it):
   szklista biel, promien 20 px, miekki cien, abstrakcyjna ikona liniowa
   u gory i numer w rogu. Wczesniej byly to plaskie biale prostokaty
   z obwodka — nie trzymaly poziomu strony glownej.

   Numer dokleja CSS (licznik), wiec nie trzeba go wpisywac w tresci.
   Ikone wybierasz polem "icon" w karcie; zestaw siedzi w build.py
   pod IKONY — dorzucenie nowej to jeden wpis ze sciezkami SVG.
   ══════════════════════════════════════════════════════════════════ */
/* margines pod siatka: kafelki maja cien, wiec tekst tuz pod nimi
   wyglada jakby sie o nie opieral */
.in-sec.in-feature .in-grid3,
.in-sec.in-feature .in-grid2 { gap: 22px; counter-reset: infeat; margin-bottom: 34px; }
.in-sec.in-feature .in-grid3:last-child,
.in-sec.in-feature .in-grid2:last-child { margin-bottom: 0; }
/* ⚠️ Bylo tu srodkowanie samotnego kafelka w ostatnim rzedzie (`nth-child(3n+1)
   :last-child` -> `grid-column: 2`), dodane 27.08.2026 pod siedem kafelkow
   w trzech kolumnach na stronie glownej. Usuniete tego samego dnia: warunek
   „co trzeci" trafial takze w 16. pozycje listy polecanej literatury, ktora
   renderuje sie w czterech kolumnach — ostatnia ksiazka lądowala w drugiej
   kolumnie nowego rzedu i zostawiala dziure. Strona glowna ma juz szesc
   kafelkow, wiec regula nie jest do niczego potrzebna. */
/* Tlo 1:1 z .in-pn-it na homepage (13.08): biel z dwiema pastelowymi
   poswiatami w przeciwleglych rogach, jasna lawendowa obwodka. */
.in-sec.in-feature .in-card {
    counter-increment: infeat; position: relative;
    background:
        radial-gradient(78% 62% at 78% 12%, rgba(140,102,178,.20) 0%, rgba(140,102,178,0) 62%),
        radial-gradient(70% 58% at 12% 88%, rgba(103,182,192,.18) 0%, rgba(103,182,192,0) 60%),
        #fff;
    border: 1px solid rgba(198,196,216,.55);
    border-radius: 20px; padding: 34px 34px 38px; overflow: visible;
    box-shadow: 0 18px 46px rgba(100,59,129,.09);
    transition: transform .35s ease, box-shadow .35s ease, border-color .35s ease;
}
.in-sec.in-feature a.in-card:hover,
.in-sec.in-feature .in-card:hover { transform: translateY(-4px);
                                    box-shadow: 0 26px 60px rgba(100,59,129,.14);
                                    border-color: rgba(100,59,129,.28); }
/* numer WIELKIM serifem w pastelowym fiolecie — jak na homepage (13.08) */
.in-sec.in-feature .in-card::after {
    content: counter(infeat, decimal-leading-zero);
    position: absolute; top: 26px; right: 30px;
    font-family: var(--font-display, Georgia, serif); font-size: 56px; line-height: 1;
    font-weight: 400; color: rgba(100,59,129,.34);
}
.in-sec.in-feature .in-card-ic { display: block; width: 56px; height: 56px; margin: 0 0 28px;
                                 color: var(--brand-primary, #643B81); }
.in-sec.in-feature .in-card-ic svg { width: 100%; height: 100%; display: block; }
.in-sec.in-feature .in-card-b { padding: 0; }
/* tytul serifem jak na homepage; DM Serif Display ma tylko wage 400 */
.in-sec.in-feature .in-card-b h3 { font-family: var(--font-display, Georgia, serif);
                                   line-height: 1.25; font-weight: 400;
                                   margin: 0 0 12px; max-width: 20ch; }
.in-sec.in-feature .in-card-b p { font-size: 15px; line-height: 1.65; margin: 0; }

@media (max-width: 700px) {
    .in-sec.in-feature .in-card { padding: 28px 26px 30px; border-radius: 16px; }
    .in-sec.in-feature .in-card::after { top: 20px; right: 22px; font-size: 44px; }
}

/* ══════════════════════════════════════════════════════════════════
   WEJSCIE TRESCI PRZY SCROLLU (podstrony)
   ──────────────────────────────────────────────────────────────────
   Elementy wsuwaja sie z dolu, gdy wchodza w kadr. Klase .rv nakalada
   SKRYPT (poza <main> w index.html) — przy wylaczonym JS nic sie nie
   chowa, strona po prostu stoi.

   Opoznienie per element ustawia skrypt zmienna --rv-d, wiec rodzenstwo
   w jednej siatce wchodzi kaskada, a nie wszystko naraz.

   Bez guardu na prefers-reduced-motion — tak samo jak animacje
   na stronie glownej (patrz notatka o macOS „Zredukuj ruch").
   ══════════════════════════════════════════════════════════════════ */
.rv { opacity: 0; transform: translateY(20px);
      transition: opacity .6s ease, transform .6s cubic-bezier(.4,0,.2,1);
      transition-delay: var(--rv-d, 0ms); }
.rv.is-in { opacity: 1; transform: none; }

/* ══════════════════════════════════════════════════════════════════
   HERO ZE ZDJECIEM — pole "image" w hero podstrony
   ──────────────────────────────────────────────────────────────────
   Tekst po lewej, kadr po prawej. Zdjecia obszarow terapeutycznych sa
   kwadratowe (900×900 ze zrodlowego serwisu klientki), wiec kolumna
   z fotografia ma staly limit szerokosci — inaczej przy 1440 px rosla
   do polowy ekranu i przykrywala naglowek.

   Bez pola "image" hero renderuje sie jak dotad, jednokolumnowo —
   regula dotyka wylacznie stron, ktore zdjecie maja.
   ══════════════════════════════════════════════════════════════════ */
.in-hero-foto > .in-wrap { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 440px);
                           gap: 64px; align-items: center; }
.in-hero-foto .in-hero-txt h1 { max-width: 16ch; }
.in-hero-foto .in-hero-fig { margin: 0; overflow: hidden; border-radius: 24px;
                             background: rgba(255, 255, 255, .5);
                             box-shadow: 0 26px 60px rgba(100,59,129, .12); }
/* height:auto jest OBOWIAZKOWE: shell z index.html ma regule
   `.in-hero img { height: 84px; width: auto }` pod logo w hero homepage.
   Bez zdjecia jej nie widac, ale kadr podstrony scisnelaby do paska 84 px. */
.in-hero-foto .in-hero-fig img { display: block; width: 100%; height: auto;
                                 aspect-ratio: 1 / 1; object-fit: cover; margin: 0; }

@media (max-width: 1000px) {
    .in-hero-foto > .in-wrap { grid-template-columns: 1fr; gap: 34px; }
    .in-hero-foto .in-hero-txt h1 { max-width: none; }
    .in-hero-foto .in-hero-fig { width: min(100%, 460px); }
}

/* ══════════════════════════════════════════════════════════════════
   WEJSCIE KAFELKOW WOKOL ZDJECIA (.in-grid-foto)
   ──────────────────────────────────────────────────────────────────
   Ten sam efekt co modul „Wzorce" na homepage: karty wysuwaja sie
   spod zdjecia na boki. Zdjecie musi lezec NAD nimi (z-index), inaczej
   jada po wierzchu i caly sens znika.

   Klase .js-anim dokłada skrypt reveal (poza <main> w index.html),
   wiec bez JS karty sa po prostu widoczne — nic nie chowa sie na stale.
   Ta siatka jest WYLACZONA z ogolnego reveal `.rv`, zeby dwie animacje
   nie bily sie o te same elementy.
   ══════════════════════════════════════════════════════════════════ */
.in-cardsfig { position: relative; z-index: 2; }
.in-grid-foto.js-anim > .in-card {
    opacity: 0; will-change: transform, opacity;
    transition: transform .95s cubic-bezier(.22,.85,.3,1), opacity .6s ease-out; }
.in-grid-foto.js-anim > .in-card:nth-of-type(1),
.in-grid-foto.js-anim > .in-card:nth-of-type(3) { transform: translateX(180px) scale(.94); }
.in-grid-foto.js-anim > .in-card:nth-of-type(2),
.in-grid-foto.js-anim > .in-card:nth-of-type(4) { transform: translateX(-180px) scale(.94); }
.in-grid-foto.js-anim.is-in > .in-card { opacity: 1; transform: none; }
/* gorna para rusza pierwsza, dolna chwile po niej */
.in-grid-foto.js-anim.is-in > .in-card:nth-of-type(1) { transition-delay: .04s; }
.in-grid-foto.js-anim.is-in > .in-card:nth-of-type(2) { transition-delay: .12s; }
.in-grid-foto.js-anim.is-in > .in-card:nth-of-type(3) { transition-delay: .20s; }
.in-grid-foto.js-anim.is-in > .in-card:nth-of-type(4) { transition-delay: .28s; }

/* Gra: środkowe zdjęcie pojawia się razem z kafelkami, a po wejściu sekcji
   bardzo delikatnie „oddycha”. Ruch jest czytelny, lecz nie odciąga od tekstu. */
#game-mind .in-grid-foto.js-anim > .in-cardsfig {
    opacity: 0; transform: scale(.88) rotate(-2.4deg); transform-origin: center;
    will-change: transform, opacity;
    transition: transform 1.05s cubic-bezier(.22,.85,.3,1), opacity .7s ease-out;
}
#game-mind .in-grid-foto.js-anim.is-in > .in-cardsfig {
    opacity: 1; transform: none; transition-delay: .08s;
}
#game-mind .in-grid-foto.js-anim.is-in > .in-cardsfig img {
    animation: in-game-cards-float 7s 1.15s ease-in-out infinite alternate;
}
@keyframes in-game-cards-float {
    from { transform: scale(1.015) translate3d(0, 0, 0); }
    to   { transform: scale(1.075) translate3d(0, -8px, 0); }
}

/* Pierwsze dwa zdania opisu gry mają ten sam rytm typograficzny co dalszy
   akapit „To kilkugodzinny proces…”. */
#game-intro > .in-wrap > .in-lead,
#game-intro .in-media .in-p { font-size: 17px; line-height: 1.7; }

/* Ponizej 1080 px zdjecie idzie NAD karty, wiec wysuwanie na boki traci sens —
   karty wchodza wtedy zwyklym podniesieniem z dolu. */
@media (max-width: 1080px) {
    .in-grid-foto.js-anim > .in-card:nth-of-type(1),
    .in-grid-foto.js-anim > .in-card:nth-of-type(2),
    .in-grid-foto.js-anim > .in-card:nth-of-type(3),
    .in-grid-foto.js-anim > .in-card:nth-of-type(4) { transform: translateY(26px) scale(.98); }
}

/* ══════════════════════════════════════════════════════════════════
   MODUL „O ZALOZYCIELCE" — variant: "founder"
   ──────────────────────────────────────────────────────────────────
   Odwzorowanie modulu ze strony glownej: portret w karcie po LEWEJ
   (z dwiema plakietkami), tresc po prawej — etykieta, naglowek serifem,
   akapity, zaslugi w dwoch kolumnach, CTA.

   Style sa SKOPIOWANE z index.html (tam siedza wewnatrz <main>, wiec
   build.py ich nie roznosi). Zmieniasz wyglad tutaj I tam, inaczej
   homepage rozjedzie sie z podstronami.
   ══════════════════════════════════════════════════════════════════ */
.in-sec.in-founder > .in-fd-grid { display: grid;
                                   grid-template-columns: minmax(0, 0.92fr) minmax(0, 1fr);
                                   gap: 72px; align-items: start; }
/* `align-items: start` zamiast `center`: przy dlugim biogramie (podrecznik
   „Numeroterapia" — dziesiec akapitow) wysrodkowany portret zjezdzal na dol,
   a nad nim zostawal pusty pol-ekran. Portret przykleja sie do gory kolumny
   i jedzie ze scrollem, dopoki tekst obok sie nie skonczy. */
.in-sec.in-founder .in-fd-media { position: sticky; top: 120px; }
@media (max-width: 1100px) { .in-sec.in-founder .in-fd-media { position: static; } }

/* --- portret --- */
.in-fd-media { position: relative; margin: 0; overflow: hidden;
               border-radius: 24px; background: rgba(11,18,32,.06);
               box-shadow: 0 26px 60px rgba(100,59,129,.10); }
.in-fd-media img { display: block; width: 100%; aspect-ratio: 4 / 5;
                   object-fit: cover; object-position: center 15%; }
/* plakietki — matowe szklo, zeby czytaly sie na kazdym kadrze */
.in-fd-chip { position: absolute; z-index: 1; font-size: 13px; line-height: 1;
              padding: 10px 16px; border-radius: 999px; white-space: nowrap;
              background: rgba(255,255,255,.82); color: var(--color-text, #0B1220);
              border: 1px solid rgba(255,255,255,.6);
              -webkit-backdrop-filter: blur(6px); backdrop-filter: blur(6px); }
.in-fd-chip--name { top: 22px; left: 22px; font-weight: 600; }
.in-fd-chip--role { right: 22px; bottom: 22px; color: var(--brand-primary, #643B81); }

/* --- tresc --- */
.in-fd-tag { font-size: 14px; font-weight: 600; letter-spacing: .04em;
             color: var(--brand-primary, #643B81); margin: 0 0 18px; }
.in-fd-title { font-family: var(--font-heading, 'Baloo 2', sans-serif); font-weight: 400;
               line-height: 1.1; letter-spacing: -.015em;
               margin: 0 0 10px; color: var(--color-text, #0B1220); }
.in-fd-title span { color: var(--color-text-muted, #413B4D); }
.in-fd-role { font-size: 16px; line-height: 1.6; color: var(--color-text-muted, #413B4D);
              margin: 0 0 26px; }
.in-fd-body .in-p { font-size: 16px; margin-bottom: 18px; color: var(--color-text-muted, #413B4D); }

/* zaslugi: dwie kolumny, oddzielone od tekstu cienka linia — tak jak „fakty"
   na homepage, tylko bez ikon (kazda pozycja to jedno zdanie, nie temat) */
.in-fd-facts { list-style: none; padding: 28px 0 0; margin: 30px 0 32px;
               display: grid; grid-template-columns: 1fr 1fr; gap: 14px 32px;
               border-top: 1px solid rgba(11,18,32,.14); }
.in-fd-facts li { position: relative; font-size: 15px; line-height: 1.6;
                  color: var(--color-text-muted, #413B4D); }
/* Kafelki z ikona (sekcja `facts`). Te trzy reguly zyly tylko w <style> modulu
   na homepage, a ten siedzi WEWNATRZ <main>, wiec build ich nie splice'uje do
   podstron — bez nich ikony wychodzily na pelnej wielkosci i na czarno. */
.in-fd-facts h3 { font-weight: 600; margin: 14px 0 6px;
                  color: var(--color-text, #0B1220); }
.in-fd-facts p { font-size: 14px; line-height: 1.6; margin: 0;
                 color: var(--color-text-muted, #413B4D); }
.in-fd-ic { width: 26px; height: 26px; color: var(--brand-primary, #643B81); }

@media (max-width: 1100px) {
    .in-sec.in-founder > .in-fd-grid { grid-template-columns: 1fr; gap: 40px; }
    .in-fd-media { width: min(100%, 460px); }
}
@media (max-width: 560px) {
    .in-fd-facts { grid-template-columns: 1fr; }
}

/* ══════════════════════════════════════════════════════════════════
   PROCES — naglowek po lewej, numerowane kroki po prawej ("variant": "process")
   ──────────────────────────────────────────────────────────────────
   Modul zyl dotad wylacznie na homepage (.in-st-*), a jego <style> siedzi
   WEWNATRZ <main>, wiec build nie splice'owal go do podstron. Reguly sa
   przeniesione 1:1, bez warstwy animacji — ta zostaje na stronie glownej.
   ══════════════════════════════════════════════════════════════════ */
.in-st-grid { display: grid; grid-template-columns: minmax(0, .9fr) minmax(0, 1.1fr);
              gap: 64px; align-items: start; }
.in-st-grid h2 { margin: 0 0 18px; }
.in-st-grid > .in-lead { margin: 0; }
.in-st-list { display: grid; gap: 0; border-top: 1px solid rgba(11,18,32,.18); }
.in-st-it { display: grid; grid-template-columns: 74px 1fr; gap: 20px;
            border-bottom: 1px solid rgba(11,18,32,.18); padding: 24px 2px 26px; }
.in-st-n { font-family: var(--font-display, Georgia, serif); font-size: 46px; line-height: 1;
           color: rgba(100,59,129,.42); letter-spacing: -.02em; font-variant-numeric: lining-nums; }
.in-st-it h3 { margin: 0 0 8px; }
.in-st-it p { font-size: 15px; line-height: 1.65; color: var(--color-text-muted, #413B4D); margin: 0; }
/* lewa kolumna: zdjecie pod leadem zamiast pustki (na homepage tej pustki nie
   widac, bo kolumna jest krotsza — na podstronie produktowej kadr sie przydaje) */
.in-st-figure { margin: 28px 0 0; }
.in-st-figure img { display: block; width: 100%; height: auto; border-radius: var(--radius-lg, 12px); }
.in-st-grid > .in-btn, .in-st-grid > .in-btn-ghost { justify-self: start; margin-top: 28px; }
@media (max-width: 980px) { .in-st-grid { grid-template-columns: 1fr; gap: 32px; } }

/* Wariant ze zdjęciem: po lewej sam kadr, po prawej CAŁY tekst — nadkreślenie,
   nagłówek, wprowadzenie, kroki i przycisk. Bez zdjęcia zostaje układ z homepage
   (nagłówek po lewej), więc reguły niżej wiszą na `in-process--foto`. */
.in-st-body { min-width: 0; }
.in-process--foto .in-st-figure { margin: 0; }
.in-process--foto .in-st-body > h2 { margin: 0 0 14px; }
.in-process--foto .in-st-body > .in-lead { margin: 0 0 30px; }
.in-process--foto .in-st-body > .in-btn,
.in-process--foto .in-st-body > .in-btn-ghost { margin-top: 30px; }
/* zdjęcie jest tu bohaterem kolumny, więc dostaje jej całą szerokość i wysokość
   dopasowaną do treści obok — inaczej przy krótkiej liście kroków wisiało samo */
.in-process--foto .in-st-figure img { aspect-ratio: 4 / 5; object-fit: cover; }
@media (max-width: 980px) {
    .in-process--foto .in-st-figure img { aspect-ratio: 3 / 2; }
}

/* ══════════════════════════════════════════════════════════════════
   TEST — quiz w proporcjach modulu „Jaki wzorzec Cie blokuje?" z homepage
   ──────────────────────────────────────────────────────────────────
   Fioletowy panel sekcji zostaje (to ten sam gest, co .in-ts-panel na
   stronie glownej), ale KARTA JEST JEDNA: .in-qz-card z paskiem postepu
   w srodku. Wczesniej ten blok robil druga karte z .in-qz-s (padding
   44/48, radius 32) — wychodzily dwa pudelka jedno w drugim, a wiersze
   odpowiedzi rosly do 62 px wysokosci. Selektory z `body ` zostaja:
   musza wygrac z inline CSS w test.json.
   ══════════════════════════════════════════════════════════════════ */
/* sekcja jest pierwsza na stronie — gorny padding musi wyminac sticky naglowek */
#test.in-sec { padding-block: 128px 72px; }
#test.in-sec > .in-wrap {
    max-width: none; margin-inline: var(--in-hgut, 4vw); padding: 58px;
    border-radius: 40px;
    background: linear-gradient(135deg, var(--brand-secondary, #5E689A), var(--brand-primary, #643B81));
}
body .in-qz { max-width: none; margin-inline: 0; }
body .in-qz-card {
    padding: 32px 34px;
    border: 1px solid rgba(198,196,216,.92);
    border-radius: 32px;
    background: rgba(255,255,255,.94);
}
/* pasek siedzi WEWNATRZ jasnej karty, wiec etykieta i tor musza byc ciemne */
body .in-qz-bar { margin: 0 0 24px; }
body .in-qz-bar-h { color: var(--color-text-muted, #413B4D); }
body .in-qz-track { height: 4px; background: rgba(11,18,32,.12); }
body .in-qz-fill { border-radius: inherit; background: var(--brand-primary, #643B81); }

/* krok jest plaski — cala rama nalezy do .in-qz-card */
body .in-qz-s { padding: 0; border: 0; border-radius: 0; background: none; box-shadow: none; min-width: 0; }
body .in-qz-done { padding: 12px 0 4px; border: 0; background: none; box-shadow: none; }

body .in-qz-opts { gap: 10px; }
body .in-qz-o {
    align-items: flex-start;
    gap: 12px;
    padding: 14px 18px;
    border: 1px solid rgba(198,196,216,.92);
    border-radius: 16px;
    background: var(--brand-50, #E7EDF9);
    box-shadow: none;
    font-size: 16px;
    transition: border-color .2s ease, background .2s ease;
}
body .in-qz-o:hover { border-color: rgba(100,59,129,.45); background: #fff; }
/* natywne radio zostaje schowane — kropke rysuje .in-qz-dot */
body .in-qz-o input { position: absolute; width: 0; height: 0; margin: 0; opacity: 0; }
body .in-qz-o:has(input:checked) {
    border-color: var(--brand-primary, #643B81);
    background: var(--brand-50, #E7EDF9); box-shadow: none;
}

@media (max-width: 720px) {
    #test.in-sec > .in-wrap { margin-inline: var(--in-gut, 18px); padding: 26px 16px; border-radius: 28px; }
    body .in-qz-card { padding: 24px 20px; border-radius: 24px; }
    body .in-qz-o { padding: 13px 15px; border-radius: 15px; }
}

/* ══════════════════════════════════════════════════════════════════
   WSPOLNA WARSTWA MOBILNA
   ──────────────────────────────────────────────────────────────────
   Ostatnia warstwa zabezpiecza wszystkie warianty podstron: elementy
   siatek moga sie kurczyc, dlugie adresy i naglowki sie lamia, a hero,
   karty i formularze zachowuja wygodne proporcje na waskich telefonach.
   ══════════════════════════════════════════════════════════════════ */
.in-two > *, .in-grid2 > *, .in-grid3 > *, .in-art3-grid > *,
.in-showcase-step-copy, .in-stack-head, .in-ct-grid > * { min-width: 0; }

@media (max-width: 600px) {
    .in-hero-sub { padding: 126px 0 48px; }
    .in-hero-sub h1 { max-width: none; margin-bottom: 18px; font-size: 34px; line-height: 1.12; }
    .in-hero-sub .in-lead { font-size: 18px; line-height: 1.55; }
    .in-hero-sub .in-hero-note { line-height: 1.55; }

    .in-h3 { margin-top: 26px; }
    .in-p { font-size: 16px; line-height: 1.68; }
    .in-lead { font-size: 18px; line-height: 1.58; }
    .in-card-b, .in-note, .in-price { padding-left: 20px; padding-right: 20px; }

    .in-showcase-copy > h2 { max-width: none; line-height: 1.08; }
    .in-showcase-step { grid-template-columns: 32px 20px minmax(0, 1fr); gap: 10px; }
    .in-showcase-n { font-size: 25px; }

    .in-article h2 { margin: 36px 0 16px; line-height: 1.2; }
    /* rozmiar: skala.css */
    .in-article, .in-art-body, .in-step-b { overflow-wrap: anywhere; }

    .in-form input, .in-form select, .in-form textarea { font-size: 16px; }
    .in-sec.in-cta { min-height: 70svh; }
}

@media (max-width: 520px) {
    .in-chips .in-list { grid-template-columns: 1fr; }
    .in-chips .in-list li { min-height: 210px; padding: 24px; border-radius: 26px; }
    .in-chips .in-list li::before { top: 24px; left: 24px; }
    .in-chips .in-list li::after { top: 20px; right: 20px; font-size: 44px; }
    .in-chips .in-list a { min-height: 158px; font-size: 21px; }
}

@media (max-width: 360px) {
    .in-hero-sub h1 { font-size: 31px; }
    .in-sec.in-cta .in-btn { width: 100%; justify-content: space-between; }
}

/* ══════════════════════════════════════════════════════════════════
   WSPOLNY HOVER CTA — TURKUSOWA KULA
   ──────────────────────────────────────────────────────────────────
   Wypelnienie nie podnosi sie juz rowna linia. Okrag startuje pod dolna
   krawedzia przycisku i rosnie do chwili, w ktorej przykryje cala pigulke.
   ══════════════════════════════════════════════════════════════════ */
:is(.in-btn, .in-btn-ghost, .in-nav-cta, .in-person-cta, .in-tm-cta, .in-cb-btn) {
    --cta-base: var(--brand-primary, #643B81);
    --cta-fill: var(--brand-accent, #67B6C0);
    --cta-hover-text: #fff;
    position: relative; z-index: 0; isolation: isolate; overflow: hidden;
    background-color: var(--cta-base) !important;
    background-image: none !important;
    border-radius: 999px !important;
    box-shadow: none !important; filter: none !important;
    transition: color .3s ease, border-color .3s ease, transform .25s ease !important;
}
:is(.in-btn, .in-btn-ghost, .in-nav-cta, .in-person-cta, .in-tm-cta, .in-cb-btn)::before {
    content: ""; position: absolute; z-index: -1; pointer-events: none;
    left: 50%; top: 100%; width: 104%; aspect-ratio: 1; border-radius: 50%;
    background: var(--cta-fill);
    transform: translate(-50%, -10%) scale(0);
    transform-origin: 50% 50%;
    transition: transform .95s cubic-bezier(.16,.78,.22,1);
}
:is(.in-btn, .in-btn-ghost, .in-nav-cta, .in-person-cta, .in-tm-cta, .in-cb-btn):is(:hover, :focus-visible) {
    background-color: var(--cta-base) !important;
    color: var(--cta-hover-text) !important;
    border-color: var(--cta-fill) !important;
    box-shadow: none !important; filter: none !important;
}
:is(.in-btn, .in-btn-ghost, .in-nav-cta, .in-person-cta, .in-tm-cta, .in-cb-btn):is(:hover, :focus-visible)::before {
    transform: translate(-50%, -50%) scale(2.45);
}
.in-btn-ghost,
.in-person-cta,
.in-tm-cta { --cta-base: transparent; --cta-fill: var(--brand-accent, #67B6C0); }
.in-nav-cta { --cta-base: var(--brand-primary, #643B81); }
.in-cb-btn,
.in-hero-purple .in-btn,
.in-sec.in-cta .in-btn,
.in-sec#cta .in-btn {
    --cta-base: #fff; --cta-fill: var(--brand-accent, #67B6C0); --cta-hover-text: #fff;
}
.in-hero-purple .in-btn-ghost {
    --cta-base: transparent; --cta-fill: var(--brand-accent, #67B6C0); --cta-hover-text: #fff;
}
.in-price--hl .in-btn {
    --cta-base: #fff; --cta-fill: var(--brand-accent, #67B6C0);
    --cta-hover-text: #fff;
}

/* Pigulki wewnatrz klikalnych kart uruchamia caly hover karty. */
.in-services-list .in-card-l,
.in-sec.in-posts .in-card-l {
    --cta-base: transparent; --cta-fill: var(--brand-accent, #67B6C0);
    --cta-hover-text: #fff;
    position: relative; z-index: 0; isolation: isolate; overflow: hidden;
    background-color: var(--cta-base) !important;
    background-image: none !important; box-shadow: none !important;
    transition: color .3s ease !important;
}
.in-services-list .in-card-l {
    --cta-fill: var(--brand-accent, #67B6C0); --cta-hover-text: #fff;
}
.in-services-list .in-card-l::before,
.in-sec.in-posts .in-card-l::before {
    content: ""; position: absolute; z-index: -1; pointer-events: none;
    left: 50%; top: 100%; width: 104%; aspect-ratio: 1; border-radius: 50%;
    background: var(--cta-fill);
    transform: translate(-50%, -10%) scale(0);
    transition: transform .95s cubic-bezier(.16,.78,.22,1);
}
.in-services-list > .in-card:hover .in-card-l,
.in-services-list > .in-card:focus-visible .in-card-l,
.in-sec.in-posts > .in-wrap .in-card:hover .in-card-l,
.in-sec.in-posts > .in-wrap .in-card:focus-visible .in-card-l {
    color: var(--cta-hover-text) !important;
    box-shadow: none !important;
}
.in-services-list > .in-card:hover .in-card-l::before,
.in-services-list > .in-card:focus-visible .in-card-l::before,
.in-sec.in-posts > .in-wrap .in-card:hover .in-card-l::before,
.in-sec.in-posts > .in-wrap .in-card:focus-visible .in-card-l::before {
    transform: translate(-50%, -50%) scale(2.45);
}

/* Kola ze strzalka odwracaja kolory razem z wypelnieniem przycisku. */
:is(.in-cb-btn, .in-sec.in-cta .in-btn, .in-sec#cta .in-btn, .in-hero-purple .in-btn):is(:hover, :focus-visible)
    :is(.in-cb-ic, .in-cta-ic, .in-hero-arrow),
.in-person-cta:is(:hover, :focus-visible) .in-person-ar {
    background: #fff; color: var(--color-text, #0B1220); box-shadow: none;
}

/* Jasne powierzchnie kart na bialym tle strony. Uzywamy najjasniejszego
   fioletu i blekitu z palety; biel pozostaje tylko dla tla oraz kontrolek. */
:root { --in-card-surface: var(--brand-50, #E7EDF9); --in-card-surface-alt: #E7EDF9; }

/* .in-quote CELOWO POZA ta lista — od 11.08 cytat nie jest karta, tylko
   zdaniem w stylistyce modulu „insight" (patrz blok CYTAT wyzej).
   13.08 (po poludniu) WYJETE z listy: .in-note (ma byc na CZYSTEJ bieli),
   .in-sec.in-zdania .in-zd-it i .in-sec.in-feature .in-card (maja gradient
   1:1 z .in-pn-it na homepage — ta regula go nadpisywala, bo lezy nizej). */
.in-card,
.in-list li,
.in-price:not(.in-price--hl),
.in-contact-card,
.in-testimonial,
.in-sec.in-stack .in-step:not(.is-active),
.in-game-paths-grid .in-price:not(.in-price--hl),
.in-services-list > .in-card:not(.is-active):not(:hover):not(:focus-visible) {
    background: var(--in-card-surface);
    border-color: rgba(198,196,216,.78);
}

.in-ba-stage,
.in-ba-col { background: var(--in-card-surface); }
.in-ba-list li,
.in-ba-col li { background: var(--in-card-surface-alt); }

/* karta quizu to .in-qz-card — .in-qz-s (pojedynczy krok) jest plaskie,
   inaczej wychodza dwa pudelka jedno w drugim */
body .in-qz-card { background: rgba(255,255,255,.94); }
body .in-qz-o { background: var(--brand-50, #E7EDF9); }

/* Sekcje rozdzielamy oddechem i zmiana kompozycji, nie kreskami. */
body .in-sec + .in-sec { border-top: 0; }

/* ══════════════════════════════════════════════════════════════════
   STRZALKA W KOLKU PRZY KAZDYM CTA (06.08)
   ──────────────────────────────────────────────────────────────────
   Wzorzec z pasa CTA („Zagraj w gre") rozciagniety na wszystkie pigulki.
   Kolko rysuje ::after (::before jest zajete przez turkusowa kule hoveru),
   a strzalka to tlo SVG w data-URI — ZERO zmian w markupie, dziala na
   wszystkich wygenerowanych stronach naraz.

   Wyjatki: przyciski, ktore juz maja ikone w srodku, nawigacja quizu
   i testu (sterowanie krokami, nie CTA) oraz paginacja bloga.
   ══════════════════════════════════════════════════════════════════ */
:is(.in-btn, .in-btn-ghost):not(:has(.in-cta-ic)):not(:has(.in-cb-ic)):not(:has(.in-hero-arrow)):not(:has(svg)):not(.in-qz-nav *):not(.in-ts-nav *) {
    display: inline-flex; align-items: center; justify-content: space-between; gap: 14px;
    padding-block: 8px; padding-inline: 26px 8px;
}
:is(.in-btn, .in-btn-ghost):not(:has(.in-cta-ic)):not(:has(.in-cb-ic)):not(:has(.in-hero-arrow)):not(:has(svg)):not(.in-qz-nav *):not(.in-ts-nav *)::after {
    content: ""; flex: 0 0 auto; width: 34px; height: 34px; border-radius: 50%;
    background-color: #fff;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23643B81' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12h13M12 5l7 7-7 7'/%3E%3C/svg%3E");
    background-size: 17px; background-position: center; background-repeat: no-repeat;
    transition: transform .3s ease;
}
.in-btn-ghost:not(:has(.in-cta-ic)):not(:has(.in-cb-ic)):not(:has(.in-hero-arrow)):not(:has(svg))::after {
    background-color: var(--brand-primary, #643B81);
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12h13M12 5l7 7-7 7'/%3E%3C/svg%3E");
}
:is(.in-btn, .in-btn-ghost):hover::after { transform: translateX(3px); }
/* na hoverze pigulke zalewa turkus — kolko zostaje biale, strzalka fioletowa */
.in-btn-ghost:is(:hover, :focus-visible)::after {
    background-color: #fff; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23643B81' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12h13M12 5l7 7-7 7'/%3E%3C/svg%3E");
}


/* ══════════════════════════════════════════════════════════════════
   CENA JAKO TEKST — „Zapytaj o cene"
   ──────────────────────────────────────────────────────────────────
   Kwoty ida stopniem wyswietlaniowym (52-92 px zaleznie od modulu).
   Zdanie w tym miejscu rozwalalo kafelek, wiec build.py dokleja
   modyfikator --txt, gdy w polu „amount" nie ma ani jednej cyfry.
   Blok stoi na KONCU pliku celowo: musi wygrac z modulowymi
   nadpisaniami .in-cert-card / .in-game-paths-grid .in-price-a.
   ══════════════════════════════════════════════════════════════════ */
.in-price-a.in-price-a--txt,
.in-cert-card .in-price-a.in-price-a--txt,
.in-game-paths-grid .in-price-a.in-price-a--txt {
    font-size: 26px; font-weight: 600; line-height: 1.3; letter-spacing: 0;
}


/* ══════════════════════════════════════════════════════════════════
   WEJSCIE HERO PODSTRONY (wariant fioletowy)
   ──────────────────────────────────────────────────────────────────
   Hero stoi nad zagiecciem, wiec nie czeka na scroll — animacja leci
   od razu po zaladowaniu (`animation ... both`, bez JS). Lewa kolumna
   wchodzi kaskada (plakietka → naglowek → lead → przyciski), panel po
   prawej wjezdza chwile pozniej i dopiero wtedy odslania swoje pozycje.

   Poswiata w tle sunie w kolko bardzo powoli — gradient przestaje byc
   martwa plama, a nic sie nie rusza na tyle, zeby odciagac od tekstu.

   Bez guardu prefers-reduced-motion — jak reszta animacji w projekcie
   (patrz notatka o macOS „Zredukuj ruch").
   ══════════════════════════════════════════════════════════════════ */
@keyframes in-hero-up {
    from { opacity: 0; transform: translateY(28px); }
    to   { opacity: 1; transform: none; }
}
@keyframes in-hero-panel-in {
    from { opacity: 0; transform: translateY(38px) scale(.98); }
    to   { opacity: 1; transform: none; }
}
@keyframes in-hero-aura {
    from { transform: translate3d(-2%, -1%, 0) scale(1.04); }
    to   { transform: translate3d(3%, 2%, 0) scale(1.12); }
}

.in-hero-purple .in-hero-main > * {
    animation: in-hero-up .95s cubic-bezier(.22,.61,.36,1) both;
}
.in-hero-purple .in-hero-main > :nth-child(1) { animation-delay: .10s; }
.in-hero-purple .in-hero-main > :nth-child(2) { animation-delay: .22s; }
.in-hero-purple .in-hero-main > :nth-child(3) { animation-delay: .34s; }
.in-hero-purple .in-hero-main > :nth-child(4) { animation-delay: .46s; }
.in-hero-purple .in-hero-main > :nth-child(n+5) { animation-delay: .58s; }

.in-hero-purple .in-hero-panel {
    animation: in-hero-panel-in 1.05s .40s cubic-bezier(.22,.61,.36,1) both;
}
.in-hero-purple .in-hero-panel > * {
    animation: in-hero-up .8s cubic-bezier(.22,.61,.36,1) both;
}
.in-hero-purple .in-hero-panel > :nth-child(1) { animation-delay: .70s; }
.in-hero-purple .in-hero-panel > :nth-child(2) { animation-delay: .80s; }
.in-hero-purple .in-hero-panel > :nth-child(3) { animation-delay: .90s; }
.in-hero-purple .in-hero-panel > :nth-child(n+4) { animation-delay: 1.00s; }

.in-hero-purple::before {
    animation: in-hero-aura 22s ease-in-out infinite alternate;
    will-change: transform;
}

/* ══════════════════════════════════════════════════════════════════
   WEJSCIE IKON W KARTACH (.in-card-ic)
   ──────────────────────────────────────────────────────────────────
   Ikona nie pojawia sie razem z karta — RYSUJE sie kreska chwile po
   niej. Dziala dzieki pathLength="1", ktore dokleja build.py: dlugosc
   kazdej sciezki jest znormalizowana, wiec jedna regula rysuje okrag
   o promieniu 3 i fale przez caly kadr w tym samym czasie.

   Wisi na `.rv` (klasa od skryptu reveal), wiec bez JS ikona po prostu
   stoi narysowana. Kropkowane okregi kreca sie wolno w kolko — ten sam
   detal co przy module „Zalozycielka" na homepage.
   ══════════════════════════════════════════════════════════════════ */
/* Stan startowy BEZ przejscia — inaczej w momencie, gdy skrypt doklada `.rv`,
   ikona odrysowywalaby sie wstecz na oczach uzytkownika. Przejscie wisi dopiero
   na stanie docelowym, wiec dziala tylko w strone rysowania. */
.in-card.rv .in-card-ic .in-ic-draw { stroke-dasharray: 1; stroke-dashoffset: 1; }
.in-card.rv.is-in .in-card-ic .in-ic-draw {
    stroke-dashoffset: 0;
    transition: stroke-dashoffset 1.15s cubic-bezier(.3,.75,.25,1);
    transition-delay: calc(var(--rv-d, 0ms) + 240ms);
}

.in-card-ic circle[stroke-dasharray] {
    transform-box: fill-box; transform-origin: center;
    animation: in-ic-spin 30s linear infinite;
}
@keyframes in-ic-spin { to { transform: rotate(360deg); } }

/* ══════════════════════════════════════════════════════════════════
   PRZYKLEJONY NAGLOWEK SEKCJI Z KARTAMI (.in-services-head)
   ──────────────────────────────────────────────────────────────────
   Naglowek wchodzil dotad bez zapowiedzi — jest sticky, wiec wypadal
   ze wszystkich grup ogolnego reveal. Teraz sam dostaje `.rv` (grupa
   dopisana w skrypcie), a kreska pod nim dorysowuje sie od lewej.
   ══════════════════════════════════════════════════════════════════ */
.in-services-head.rv::after {
    transform: scaleX(0); transform-origin: left center;
    transition: transform .95s cubic-bezier(.22,.61,.36,1);
    transition-delay: calc(var(--rv-d, 0ms) + 280ms);
}
.in-services-head.rv.is-in::after { transform: none; }

/* ══════════════════════════════════════════════════════════════════
   SKLEP — SIATKA PRODUKTÓW (blok `products`)
   ──────────────────────────────────────────────────────────────────
   Karta: zdjęcie w zaokrąglonej ramce z plakietką kategorii, tytuł,
   krótki opis, a na dole cena w pigułce i jeden przycisk. Wzór z
   referencji klientki (Made Trade), przełożony na paletę Instytutu.

   Przycisk „Do koszyka" wpina się w szufladę koszyka z index.html
   (atrybuty data-cart-add), więc siatka nie ma własnej logiki zakupu.
   Produkt z wariantami (np. książka w trzech wersjach) dostaje zamiast
   tego odnośnik na swoją podstronę — do koszyka nie da się wrzucić
   czegoś, czego klient jeszcze nie wybrał.
   ══════════════════════════════════════════════════════════════════ */
.in-prod-filters { display: flex; flex-wrap: wrap; gap: 10px; margin-bottom: 34px; }
.in-prod-fl { font-family: inherit; font-size: 12px; font-weight: 650; letter-spacing: .1em;
              text-transform: uppercase; cursor: pointer; padding: 11px 20px; border-radius: 999px;
              background: #fff; border: 1px solid rgba(100,59,129,.2);
              color: var(--color-text, #0B1220);
              transition: background .2s ease, color .2s ease, border-color .2s ease; }
.in-prod-fl:hover { border-color: var(--brand-primary, #643B81); }
.in-prod-fl.is-on { background: var(--brand-primary, #643B81);
                    border-color: var(--brand-primary, #643B81); color: #fff; }

.in-prod-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(258px, 1fr));
                gap: 24px; }
.in-prod { display: flex; flex-direction: column; background: #fff;
           border: 1px solid rgba(100,59,129,.14); border-radius: 22px; padding: 12px;
           transition: transform .25s ease, box-shadow .25s ease, border-color .25s ease; }
.in-prod:hover { transform: translateY(-4px); border-color: rgba(100,59,129,.28);
                 box-shadow: 0 22px 48px rgba(100,59,129,.10); }
/* BEZ TEJ LINIJKI FILTRY NIE DZIAŁAJĄ: skrypt chowa karty atrybutem `hidden`,
   a `display: flex` z reguły wyżej jest silniejszy niż `display: none` od
   przeglądarki. Karta zostawała widoczna mimo `hidden`. */
.in-prod[hidden] { display: none; }

.in-prod-im { position: relative; display: block; overflow: hidden; border-radius: 16px;
              aspect-ratio: 4 / 3; background: var(--brand-50, #E7EDF9); }
/* margin: 0 jest konieczny — obrazki w treści mają globalny dolny margines
   i zostawiałby biały pasek w środku zaokrąglonej ramki */
.in-prod-im img { display: block; width: 100%; height: 100%; margin: 0; object-fit: cover;
                  transition: transform .5s cubic-bezier(.2,.6,.2,1); }
.in-prod:hover .in-prod-im img { transform: scale(1.04); }
.in-prod-tag { position: absolute; top: 12px; left: 12px; padding: 7px 13px; border-radius: 999px;
               font-size: 11px; font-weight: 700; letter-spacing: .1em; text-transform: uppercase;
               color: var(--brand-primary, #643B81); background: rgba(255,255,255,.92);
               -webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px); }

.in-prod-b { display: flex; flex-direction: column; flex: 1 1 auto; padding: 18px 10px 8px; }
.in-prod-b h3 { margin: 0 0 8px; line-height: 1.3; }
.in-prod-b h3 a { color: inherit; text-decoration: none; }
.in-prod-b h3 a:hover { color: var(--brand-primary, #643B81); }
.in-prod-d { margin: 0; font-size: 14px; line-height: 1.55; color: var(--color-text-muted, #413B4D); }
/* stopka karty siada na dole niezależnie od długości opisu — ceny w rzędzie
   kart stoją wtedy w jednej linii */
.in-prod-f { display: flex; align-items: center; justify-content: space-between; gap: 12px;
             flex-wrap: wrap; margin-top: auto; padding-top: 18px; }
.in-prod-c { margin: 0; padding: 8px 15px; border-radius: 999px; white-space: nowrap;
             background: var(--brand-50, #E7EDF9); color: var(--brand-primary, #643B81);
             font-size: 15px; font-weight: 650; }
.in-prod-btn { display: inline-flex; align-items: center; justify-content: center;
               font-family: inherit; font-size: 14px; font-weight: 600; cursor: pointer;
               padding: 11px 18px; border-radius: 999px; border: 1px solid transparent;
               text-decoration: none; white-space: nowrap;
               background: var(--brand-primary, #643B81); color: #fff;
               transition: filter .2s ease, background .2s ease, color .2s ease; }
.in-prod-btn:hover { filter: brightness(1.1); }
.in-prod-none { margin: 28px 0 0; font-size: 15px; color: var(--color-text-muted, #413B4D); }

@media (max-width: 620px) {
    .in-prod-grid { grid-template-columns: 1fr 1fr; gap: 14px; }
    .in-prod { padding: 8px; border-radius: 18px; }
    .in-prod-b { padding: 14px 6px 6px; }
    .in-prod-d { display: none; }
    .in-prod-f { justify-content: flex-start; gap: 8px; padding-top: 12px; }
    .in-prod-c, .in-prod-btn { font-size: 13px; padding: 8px 12px; }
    .in-prod-fl { padding: 9px 14px; font-size: 11px; }
}

/* ══════════════════════════════════════════════════════════════════
   JASNY WARIANT HERO DWUDZIELNEGO — `"light": true` w hero
   ──────────────────────────────────────────────────────────────────
   Ten sam układ co `purple-split` (wielki tytuł po lewej, panel po
   prawej), ale bez fioletowego gradientu: tło jest takie jak na
   /kontakt, czyli jasne z ledwie muśnięciem koloru marki u góry.
   Używa tego /sklep — siatka produktów pod spodem stoi na bieli,
   więc pełnoekranowy fiolet nad nią wyglądał jak dwie różne strony.

   Klasę dokłada build.py (render_hero). UWAGA: skrypt w index.html,
   który przełącza nagłówek w tryb „nad ciemnym hero", pomija ten
   wariant — inaczej białe menu zniknęłoby na jasnym tle.
   ══════════════════════════════════════════════════════════════════ */
.in-hero.in-hero-purple--light {
    color: var(--color-text, #0B1220);
    background:
        radial-gradient(circle at 8% 8%, rgba(103,182,192,.34), transparent 42%),
        radial-gradient(circle at 96% 0%, rgba(198,196,216,.85), transparent 52%),
        radial-gradient(circle at 62% 104%, rgba(100,59,129,.22), transparent 54%),
        linear-gradient(158deg, #F2EAFA 0%, #E4E2F3 46%, #DCE7F5 100%);
    /* bez pasa rozmycia w biel — tło i tak kończy się bielą */
    --in-fade: 0px; --in-fade-safe: 76px;
    min-height: 0; padding-top: clamp(150px, 16vh, 196px);
}
.in-hero-purple--light::before { display: none; }
/* Rozmycie dolu w mgle strony (#E7EDF9, patrz `body` w index.html) — było
   `display: none` na obu, więc gradient hero kończył się twardą krawędzią
   tuż nad sekcją "Oferta Instytutu", zamiast płynnie przejść w jej tło. */
.in-hero-purple--light::after {
    content: ""; position: absolute; z-index: -1; pointer-events: none;
    left: 0; right: 0; bottom: 0; height: 140px;
    background: linear-gradient(180deg, rgba(231,237,249,0) 0%, #E7EDF9 100%);
}
.in-hero-purple--light > .in-wrap { min-height: 0; align-items: center; }

.in-hero-purple--light .in-eyebrow {
    color: var(--brand-primary, #643B81); border-color: rgba(100,59,129,.34);
    margin-bottom: 30px;
}
.in-hero-purple--light h1 { color: var(--brand-800, #643B81);
                            font-size: clamp(52px, 4.9vw, 88px); }
.in-hero-purple--light .in-lead { color: var(--color-text-muted, #413B4D); }

/* przyciski wracają do wersji z jasnych podstron: pełny fiolet + obrys */
/* Kolor przycisku idzie przez token --cta-base (blok „CTA — wypelnienie"),
   wiec samo `background` nic by nie dalo — na fiolecie token jest bialy. */
.in-hero-purple--light .in-btn {
    --cta-base: var(--brand-primary, #643B81); --cta-hover-text: #fff;
    color: #fff;
}
.in-hero-purple--light .in-btn-ghost {
    --cta-base: transparent; --cta-hover-text: #fff;
}
.in-hero-purple--light .in-btn .in-hero-arrow { background: #fff; color: var(--brand-primary, #643B81); }
.in-hero-purple--light .in-btn-ghost {
    color: var(--brand-primary, #643B81); border-color: rgba(100,59,129,.34);
}
.in-hero-purple--light .in-btn-ghost:hover {
    background: var(--brand-50, #E7EDF9); border-color: var(--brand-primary, #643B81);
}

/* panel: biała karta z delikatnym obrysem zamiast szkła na fiolecie */
.in-hero-purple--light .in-hero-panel {
    background: #fff; border-color: rgba(100,59,129,.16);
    box-shadow: 0 24px 60px rgba(100,59,129,.10);
}
.in-hero-purple--light .in-hero-panel .in-hero-panel-eyebrow { color: var(--brand-primary, #643B81); }
.in-hero-purple--light .in-hero-panel h2 { color: var(--brand-800, #643B81); }
.in-hero-purple--light .in-hero-panel h3 { color: var(--brand-800, #643B81); }
.in-hero-purple--light .in-hero-panel p { color: var(--color-text-muted, #413B4D); }
.in-hero-purple--light .in-hero-panel-item { border-top-color: rgba(100,59,129,.14); }

/* Pas liczb w jasnym hero — był pisany bielą pod fioletowe tło (13.08).
   Liczba w kolorze marki, podpis w szarości, kreska nad pasem w lawendzie. */
.in-hero-purple--light .in-hero-kpis { border-top-color: rgba(100,59,129,.18); }
.in-hero-purple--light .in-hero-kpis b { color: var(--brand-primary, #643B81); }
.in-hero-purple--light .in-hero-kpis span { color: var(--color-text-muted, #413B4D); }
/* dopisek pod nagłówkiem (godziny, terminy) też był biały */
.in-hero-purple--light .in-hero-note { color: var(--color-text-muted, #413B4D); }

/* ── #readmore: lista, która nie mieści się w kolumnie ────────────────
   Ostatni punkt („Wyposaży Cię w szereg ćwiczeń i kart pracy…") jest
   znacznie dłuższy od pozostałych trzech i w prawej kolumnie tego modułu
   (zdjęcie + tekst) łamał się na dwie linie wszędzie poniżej 1440 px —
   cztery punkty przestawały wtedy tworzyć równy rytm. Sama korekta proporcji
   kolumn nie wystarcza: przy 1280 px tekst potrzebuje ~690 px, a kolumna ma
   ~660 px nawet po przesunięciu podziału. Dlatego poniżej 1600 px ten jeden
   moduł składa się pionowo: zdjęcie u góry, tekst z listą pełną szerokością.
   Reszta modułów `media` na serwisie zostaje bez zmian. */
@media (max-width: 1599px) {
    #readmore .in-two { grid-template-columns: 1fr; gap: 32px; }
    #readmore .in-media-i img { position: static; max-height: 420px; object-fit: cover; }
}

/* ══════════════════════════════════════════════════════════════════
   PLAYLISTA OPINII VIDEO — blok `video_playlist`
   Lista klipów po lewej (na cienkich kreskach, jak FAQ), odtwarzacz po
   prawej. Filmy są PIONOWE (nagrania telefonem), więc scena ma stałą
   wysokość i ciemne tło, a film dopasowuje się wysokością — inaczej
   pionowy kadr w szerokiej kolumnie miałby ponad tysiąc pikseli.
   ══════════════════════════════════════════════════════════════════ */
/* Druga kolumna bierze tyle, ile ma pionowa scena (~350 px) — przy 7fr scena
   wisiała pośrodku pustego pola. Lista dostaje resztę szerokości. */
.in-vid { display: grid; grid-template-columns: minmax(0, 1fr) auto;
          gap: clamp(28px, 4vw, 64px); align-items: start; }
.in-vid-list { list-style: none; margin: 0; padding: 0;
               border-top: 1px solid rgba(11,18,32,.16); }
.in-vid-it {
    width: 100%; display: grid; grid-template-columns: 46px minmax(0, 1fr) auto;
    gap: 16px; align-items: center; text-align: left; cursor: pointer;
    background: none; border: 0; border-bottom: 1px solid rgba(11,18,32,.16);
    padding: 20px 6px; font: inherit; color: var(--color-text, #0B1220);
    transition: background .2s ease, padding-left .2s ease;
}
.in-vid-it:hover { background: var(--in-hover, rgba(0,0,0,.03)); padding-left: 12px; }
.in-vid-it:focus-visible { outline: 2px solid var(--brand-primary, #643B81); outline-offset: -2px; }
.in-vid-n { font-family: var(--font-heading, 'Baloo 2', sans-serif); font-size: 22px;
            line-height: 1; color: var(--brand-primary, #643B81); }
.in-vid-t { font-size: 17px; font-weight: 600; }
.in-vid-d { font-size: 14px; color: var(--color-text-muted, #413B4D);
            font-variant-numeric: tabular-nums; }
.in-vid-it.is-on { background: var(--brand-50, #E7EDF9); }
.in-vid-it.is-on .in-vid-t { color: var(--brand-primary, #643B81); }
/* Scena ma proporcje PIONOWEGO nagrania (9:16 — opinie kręcone telefonem),
   więc kadr wypełnia ją dokładnie: żadnego przycinania ani czarnych pasów.
   Wcześniej scena była szeroka, a film dopasowywany w środku — przeglądarka
   rozciągała wtedy klatkę na całą szerokość i z rozmówczyni zostawało czoło. */
.in-vid-stage {
    margin: 0 auto; border-radius: 22px; overflow: hidden; background: #16101E;
    height: clamp(420px, 52vh, 620px); aspect-ratio: 9 / 16; width: auto;
    max-width: 100%; display: grid; place-items: center;
    box-shadow: 0 24px 60px rgba(100,59,129,.14);
}
/* `object-fit: contain` jest tu OBOWIĄZKOWE. Wcześniej stało `height: 100%;
   width: auto; max-width: 100%` — przy pionowym nagraniu `max-width` ściskało
   pudełko w poziomie, wysokość zostawała pełna i przeglądarka pokazywała tylko
   środek kadru: z rozmówczyni było widać samo czoło. `contain` nie przycina
   nigdy, niezależnie od proporcji pliku. */
.in-vid-stage video {
    width: 100%; height: 100%; display: block;
    object-fit: contain; object-position: center;
}
@media (max-width: 980px) {
    .in-vid { grid-template-columns: 1fr; }
    .in-vid-stage { order: -1; height: clamp(360px, 60vh, 520px); }
}

/* ══════════════════════════════════════════════════════════════════
   KAFLE „CO DOSTAJESZ" — blok `stats`
   Ikona, liczba, podpis. Pięć pozycji stoi w rzędzie na desktopie —
   wcześniej ta sama treść szła blokiem `cards` w trzech kolumnach
   i wychodziło 3 + 2, z pustym miejscem po prawej w drugim rzędzie.
   ══════════════════════════════════════════════════════════════════ */
.in-stats { list-style: none; margin: 0 0 30px; padding: 0; display: grid;
            grid-template-columns: repeat(5, minmax(0, 1fr)); gap: 16px; }
.in-stats li {
    display: flex; flex-direction: column; align-items: flex-start; gap: 4px;
    padding: 26px 22px 24px; border-radius: 20px;
    background: var(--brand-50, #E7EDF9);
}
.in-stats-i {
    display: grid; place-items: center; width: 46px; height: 46px; margin-bottom: 12px;
    border-radius: 50%; background: #fff; color: var(--brand-primary, #643B81);
}
.in-stats-i svg { width: 23px; height: 23px; }
.in-stats b {
    font-family: var(--font-heading, 'Baloo 2', sans-serif); font-weight: 400;
    font-size: clamp(30px, 2.6vw, 40px); line-height: 1; letter-spacing: -.03em;
    color: var(--brand-primary, #643B81);
}
.in-stats span { font-size: 15px; line-height: 1.4; color: var(--color-text-muted, #413B4D); }
@media (max-width: 1100px) { .in-stats { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
@media (max-width: 700px)  { .in-stats { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; }
                             .in-stats li { padding: 20px 18px; }
                             .in-stats-i { width: 40px; height: 40px; margin-bottom: 8px; } }

/* ══════════════════════════════════════════════════════════════════
   WŁASNA LISTA ROZWIJANA — `.in-sel`
   Natywny <select> zostaje w formularzu (wysyłka, preselekcja, brak JS),
   ale jest schowany: jego rozwiniętą listę rysuje system operacyjny
   i CSS jej nie dotyka — stąd szara ramka z niebieskim paskiem, obca
   wobec reszty serwisu. Przycisk i lista niżej są nasze.
   ══════════════════════════════════════════════════════════════════ */
.in-sel { position: relative; }
.in-sel-native { position: absolute; opacity: 0; pointer-events: none; width: 1px; height: 1px; }
.in-sel-btn {
    width: 100%; display: flex; align-items: center; justify-content: space-between; gap: 14px;
    padding: 10px 2px; border: 0; border-bottom: 1px solid rgba(11,18,32,.28);
    background: transparent; font: inherit; font-size: 16px; text-align: left;
    color: var(--color-text, #0B1220); cursor: pointer;
    transition: border-color .25s ease;
}
.in-sel-btn:hover { border-bottom-color: rgba(11,18,32,.5); }
.in-sel-btn:focus-visible { outline: 2px solid var(--brand-primary, #643B81); outline-offset: 3px; }
.in-sel.is-open .in-sel-btn { border-bottom-color: var(--brand-primary, #643B81); border-bottom-width: 2px; padding-bottom: 9px; }
.in-sel-chev { flex: none; width: 18px; height: 18px; color: var(--color-text-muted, #413B4D);
               transition: transform .2s ease; }
.in-sel.is-open .in-sel-chev { transform: rotate(180deg); }
.in-sel-list {
    position: absolute; z-index: 30; left: 0; right: 0; top: calc(100% + 8px);
    margin: 0; padding: 6px; list-style: none; max-height: 320px; overflow-y: auto;
    background: var(--in-surface, #fff); border: 1px solid var(--color-border, #C6C4D8);
    border-radius: 18px; box-shadow: 0 22px 54px rgba(100,59,129,.16);
}
.in-sel-list:focus { outline: none; }
.in-sel-list li {
    padding: 12px 14px; border-radius: 12px; font-size: 15.5px; line-height: 1.45;
    color: var(--color-text, #0B1220); cursor: pointer;
}
.in-sel-list li:hover { background: var(--in-hover, rgba(0,0,0,.04)); }
.in-sel-list li.is-on {
    background: var(--brand-50, #E7EDF9); color: var(--brand-primary, #643B81); font-weight: 600;
}
@media (max-width: 600px) { .in-sel-list li { font-size: 15px; padding: 11px 12px; } }

/* ── Odstęp między modułem `media` a przyciskiem sekcji ────────────────
   Po złożeniu do jednej kolumny CTA sekcji lądowało 9 px pod zdjęciem —
   wyglądało, jakby przycisk był przyklejony do kadru. Reguła działa na
   każdej szerokości: na desktopie też dokłada oddech pod blokiem. */
.in-two + .in-btn,
.in-two + .in-btn-ghost { margin-top: 30px; }

/* Galeria jako przewijana taśma (`"carousel": true` w bloku `gallery`).
   Mechanika i strzałki wspólne z opiniami (TASMA_JS), style tutaj — bo tam
   są przypięte do `.in-sec.in-testimonials`, a to inna sekcja. */
.in-gal--kar { display: block; }
.in-gal--kar .in-tm-track {
    display: flex; gap: 24px; overflow-x: auto; scroll-behavior: smooth;
    scroll-snap-type: x mandatory; scrollbar-width: none; padding-bottom: 4px;
}
.in-gal--kar .in-tm-track::-webkit-scrollbar { display: none; }
.in-gal--kar .in-tm-track.is-fits { justify-content: center; }
.in-gal--kar .in-gal-it {
    flex: 0 0 auto; width: min(46%, 520px); margin: 0; scroll-snap-align: start;
}
.in-gal--kar .in-gal-it--wide { width: min(92%, 1000px); }
.in-gal--kar .in-tm-foot { display: flex; justify-content: center; margin-top: 26px; }
.in-gal--kar .in-tm-foot[hidden] { display: none; }
.in-gal--kar .in-tm-nav { display: flex; gap: 14px; }
@media (max-width: 700px) {
    .in-gal--kar .in-gal-it,
    .in-gal--kar .in-gal-it--wide { width: min(86%, 420px); }
}

/* ══════════════════════════════════════════════════════════════════
   KARTY TRESCI (blok `cards`) — FIOLET + PERLOWY GRADIENT (13.08)
   ──────────────────────────────────────────────────────────────────
   Prosba klientki: karty maja byc "fioletowego koloru", z ikonkami
   i gradientem jak perlowe tlo hero na /dla-kogo (blekit → perla →
   lawenda). Ikony dokladasz polem "icon" w pozycji karty (IKONY
   w build.py) — maja je m.in. metody pracy i "Co dostajesz po tescie".
   Regula lezy NA KONCU pliku celowo: nadpisuje blok "Jasne
   powierzchnie kart" wyzej (ta sama specyficznosc, pozniejsza wygrywa).
   Warianty o wyzszej specyficznosci (feature, icon-cards, posts,
   art-rail, services-list) zachowuja swoje style. */
.in-card {
    background: linear-gradient(120deg, #EAF0F7 0%, #F3F0F6 46%, #DFD9EC 100%);
    border-color: rgba(100,59,129,.30);
}
/* tytul karty w fiolecie marki — tylko w zwyklych kartach; kafelki
   z ikona (feature/icon-cards) trzymaja ciemny naglowek jak homepage */
.in-sec:not(.in-feature):not(.in-icon-cards) .in-card .in-card-b h3 {
    color: var(--brand-primary, #643B81);
}

/* Showcase bez ani jednego kadru — nagłówek zostaje po lewej, a karty wchodzą
   w kolumnę po prawej, w miejsce zdjęcia. Wcześniej wszystko szło jedno pod
   drugim: nagłówek na całą szerokość, a pod nim wąski słupek kart z połową
   ekranu pustą po prawej. Zgłoszone przez Bartka 31.08.2026.

   Nagłówek jest przyklejony — przy trzech krokach lista bywa wyższa niż on,
   a tak wprowadzenie zostaje w polu widzenia podczas czytania.

   ⚠️ Tylko na szerokich ekranach. Poniżej 1000 px komponent i tak zwija się do
   jednej kolumny (niżej w tym pliku), a ta reguła stoi PO tamtej i bez zawężenia
   przebiłaby ją na telefonie. */
@media (min-width: 1001px) {
    .in-showcase-bez-kadru > .in-wrap { grid-template-columns: minmax(0, 5fr) minmax(0, 7fr); }
    /* Przyklejanie kart ZOSTAJE także bez zdjęć — stos przy przewijaniu jest
       zamierzony (Bartek, 31.08.2026). Karty mają własne białe tło i cień, więc
       górna zasłania dolną. */
    .in-showcase-bez-kadru .in-showcase-copy {
        grid-column: 1; grid-row: 1;
        position: sticky; top: calc(var(--header-height, 96px) + 24px);
    }
    .in-showcase-bez-kadru .in-showcase-steps { grid-column: 2; grid-row: 1; }
}

/* ——— Treść wpisu bloga ———————————————————————————————————————
   Prototyp pisze artykuł ręcznie i każdy akapit ma tam klasę `.in-p`.
   Z WordPressa przychodzi goły HTML z edytora, więc te same odstępy i rozmiary
   ustawiamy po znacznikach. Bez tego wpisy miały domyślną typografię
   przeglądarki i wyglądały jak surowa strona obok reszty serwisu. */
.in-art-body > p,
.in-art-body > ul,
.in-art-body > ol { font-size: 17px; line-height: 1.7; margin: 0 0 20px; }

.in-art-body > h2 { margin: 38px 0 14px; }
.in-art-body > h3 { margin: 32px 0 12px; }
.in-art-body > h4 { margin: 26px 0 10px; }
.in-art-body > :is(h2, h3, h4):first-child { margin-top: 0; }

.in-art-body > :is(ul, ol) { padding-left: 22px; }
.in-art-body > :is(ul, ol) li { margin-bottom: 8px; }

.in-art-body a { color: var(--brand-800, #643B81); text-decoration: underline; text-underline-offset: 3px; }
.in-art-body a:hover { text-decoration-thickness: 2px; }

.in-art-body :is(img, video) { max-width: 100%; height: auto; border-radius: 16px; }
/* Ramka `iframe` NIE zachowuje proporcji przy `height: auto` — YouTube podaje
   1200×675, a `auto` te wysokosc zeruje i film zapada sie do paska. Dlatego
   osadzenia dostaja proporcje wprost. Zgloszone przez Bartka 27.08.2026. */
.in-art-body iframe { width: 100%; max-width: 100%; aspect-ratio: 16 / 9;
                      height: auto; border: 0; border-radius: 16px; display: block; }
.in-art-body figure { margin: 26px 0; }
.in-art-body figcaption { margin-top: 10px; font-size: 14px; color: var(--color-text-muted, #413B4D); }

.in-art-body blockquote {
    margin: 28px 0;
    padding: 4px 0 4px 24px;
    border-left: 3px solid var(--brand-primary, #643B81);
    font-size: 20px;
    line-height: 1.5;
}
.in-art-body blockquote p:last-child { margin-bottom: 0; }

/* Zdjęcie główne wpisu — nad treścią, w proporcji panoramy. */
.in-art-fig { margin: 0 0 32px; }
.in-art-fig img { display: block; width: 100%; border-radius: 20px; }

/* Nagłówek szyny to teraz <h2> (poziomy nagłówków muszą lecieć po kolei),
   a nie <h3> jak w makiecie — wygląd zostaje ten sam. */
.in-art-rail .in-rail-cta h2 {
    margin: 0 0 10px;
    color: #fff;
    
    font-weight: 600;
    line-height: 1.3;
}

/* ——— Okno rezerwacji (kalendarz z cennika) ————————————————————
   Ten sam wzór co szuflada koszyka: klasa na <html> pokazuje okno, zasłona
   zamyka je kliknięciem. Panel przewija się sam, bo kalendarz z listą godzin
   bywa wyższy niż telefon. */
.in-rez-okno { position: fixed; inset: 0; z-index: 90; display: none; }
html.in-rez-open .in-rez-okno { display: block; }
html.in-rez-open { overflow: hidden; }

.in-rez-scrim { position: absolute; inset: 0; background: rgba(43, 24, 57, .55); -webkit-backdrop-filter: blur(3px); backdrop-filter: blur(3px); }

.in-rez-panel {
    position: relative;
    width: min(560px, calc(100% - 32px));
    max-height: min(88vh, 900px);
    margin: 6vh auto 0;
    overflow-y: auto;
    padding: 26px clamp(18px, 4vw, 32px) 30px;
    border-radius: 26px;
    background: var(--in-surface, #fff);
    box-shadow: 0 40px 90px rgba(43, 24, 57, .35);
}
.in-rez-panel-h { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; margin-bottom: 18px; }
.in-rez-panel-h h2 { margin: 0; }

.in-rez-x {
    flex: 0 0 auto; width: 40px; height: 40px; display: grid; place-items: center;
    padding: 0; border: 1px solid var(--color-border, #C6C4D8); border-radius: 999px;
    background: transparent; color: var(--color-text, #0B1220); cursor: pointer;
}
.in-rez-x svg { width: 18px; height: 18px; }
.in-rez-x:hover { border-color: var(--brand-primary, #643B81); }

/* W oknie formularz jest jednokolumnowy — na dwie kolumny nie ma tu miejsca. */
.in-rez--popup .in-form-g { grid-template-columns: 1fr; }

/* Godziny wybranego dnia. */
/* Kafelek godziny ma być szeroki na tyle, co godzina — w formularzu obowiązuje
   reguła „przyciski na całą szerokość", więc jedna wolna godzina rozciągała się
   przez cały kalendarz i wyglądała jak pasek postępu. */
.in-cal-chips .in-cal-chip { width: auto; flex: 0 0 auto; }
.in-cal-chip {
    appearance: none; padding: 9px 15px; border-radius: 999px;
    border: 1px solid var(--color-border, #C6C4D8); background: #fff;
    color: var(--color-text, #0B1220); font: inherit; font-size: 14px; cursor: pointer;
    transition: border-color .2s ease, background .2s ease, color .2s ease;
}
.in-cal-chip:hover { border-color: var(--brand-primary, #643B81); }
.in-cal-chip.is-on { background: var(--brand-primary, #643B81); border-color: var(--brand-primary, #643B81); color: #fff; }

.in-cal-sum { margin: 14px 0 0; font-size: 14px; font-weight: 600; color: var(--brand-800, #643B81); }
.in-cal-err { margin: 12px 0 0; font-size: 14px; color: #B3261E; }

/* Okładka / zdjęcie w prawej kolumnie hero (warianty z panelem) — 19.08.2026 */
.in-hero-panel-foto {
    display: block; width: 100%; height: auto; border-radius: 18px;
    margin-bottom: 22px; box-shadow: 0 18px 42px -26px rgba(11,18,32,.55);
}
.in-hero-panel--sama-foto { padding: 0; background: none; border: 0; box-shadow: none; }
.in-hero-panel--sama-foto .in-hero-panel-foto { margin-bottom: 0; }

/* Hero z dużym zdjęciem po prawej (bez panelu) — 19.08.2026 */
.in-hero-purple--foto > .in-wrap {
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    align-items: center; gap: clamp(40px, 5vw, 80px);
}
.in-hero-purple--foto h1 {
    font-size: clamp(38px, 3.6vw, 60px); line-height: 1.04; letter-spacing: -.03em;
    margin-bottom: 22px;
}
.in-hero-purple--foto .in-lead { max-width: 52ch; }
.in-hero-purple--foto .in-hero-panel--sama-foto { align-self: center; }
.in-hero-purple--foto .in-hero-panel-foto {
    width: 100%; max-width: 520px; margin-inline: auto; border-radius: 24px;
}
@media (max-width: 860px) {
    .in-hero-purple--foto > .in-wrap { grid-template-columns: minmax(0, 1fr); }
    .in-hero-purple--foto .in-hero-panel-foto { max-width: 360px; }
}

/* Okładka w hero musi przebić globalne `.in-hero img { height: 84px }` ze szkieletu
   (reguła dla logotypu). Stąd selektor dwuklasowy — 19.08.2026. */
.in-hero .in-hero-panel-foto,
.in-hero-purple--foto .in-hero-panel-foto {
    height: auto; width: 100%; max-width: 520px; margin: 0 auto;
    aspect-ratio: auto; object-fit: contain;
}

}

/* Split ze zdjęciem — 19.08.2026.
   Tekst dostaje własny kontener (.in-split-tresc), więc nie walczymy z siatką
   „nagłówek w kolumnie 1, reszta w kolumnie 2". Bez tego każdy akapit był
   osobnym wierszem, a rozpięte na nie zdjęcie robiło puste przestrzenie. */
.in-sec.in-split--z-foto > .in-wrap {
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    align-items: center; gap: clamp(32px, 5vw, 72px);
}
.in-sec.in-split--z-foto > .in-wrap > .in-split-tresc { grid-column: 1; display: grid; gap: 18px; align-content: center; }
.in-sec.in-split--z-foto > .in-wrap > .in-split-tresc > * { margin: 0; }
.in-sec.in-split--z-foto > .in-wrap > .in-split-foto { grid-column: 2; margin: 0; }
.in-sec.in-split--foto-lewo > .in-wrap > .in-split-tresc { grid-column: 2; }
.in-sec.in-split--foto-lewo > .in-wrap > .in-split-foto { grid-column: 1; }
.in-split-foto img {
    display: block; width: 100%; height: auto; border-radius: 24px;
    box-shadow: 0 24px 56px -32px rgba(11,18,32,.5);
}
@media (max-width: 860px) {
    .in-sec.in-split--z-foto > .in-wrap { grid-template-columns: minmax(0, 1fr); }
    .in-sec.in-split--z-foto > .in-wrap > .in-split-tresc,
    .in-sec.in-split--z-foto > .in-wrap > .in-split-foto { grid-column: 1; }
    .in-sec.in-split--foto-lewo > .in-wrap > .in-split-foto { order: -1; }
}

/* Wyrównanie wprost na dzieciach — bazowa reguła sekcji ustawia `align-items: start`,
   a przy jednym wierszu siatki zdjęcie potrafiło osiąść przy dolnej krawędzi. */
.in-sec.in-split--z-foto > .in-wrap > .in-split-tresc,
.in-sec.in-split--z-foto > .in-wrap > .in-split-foto { align-self: center; }

/* Filmy pionowe — trzy kadry 9:16 obok siebie, na telefonie taśma. 19.08.2026 */
.in-fp-track {
    --in-fp-gap: clamp(16px, 2.4vw, 28px);
    display: grid; grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: var(--in-fp-gap); margin-top: 34px;
}

/* Powyzej trzech filmow siatka zlamalaby sie na 3 + reszte, wiec zamiast tego
   robimy z tego tasme: dalej widac trzy kadry, kolejne dojezdzaja strzalkami.
   To ta sama konwencja co na telefonie i co w karuzeli opinii — bez Swipera. */
@media (min-width: 861px) {
    .in-fp-track:has(> :nth-child(4)) {
        display: flex; overflow-x: auto;
        scroll-snap-type: x mandatory; scroll-behavior: smooth;
        scrollbar-width: none; -ms-overflow-style: none;
    }
    .in-fp-track:has(> :nth-child(4))::-webkit-scrollbar { display: none; }
    .in-fp-track:has(> :nth-child(4)) > .in-fp-it {
        flex: 0 0 calc((100% - 2 * var(--in-fp-gap)) / 3);
        scroll-snap-align: start;
    }
    .in-fp:has(.in-fp-track > :nth-child(4)) .in-fp-nav { display: flex; }
}
.in-fp-it { margin: 0; display: flex; flex-direction: column; gap: 12px; }
.in-fp-v {
    display: block; width: 100%; aspect-ratio: 9 / 16; height: auto;
    border-radius: 22px; background: #0f0b18; object-fit: cover;
    box-shadow: 0 22px 52px -30px rgba(11,18,32,.55);
}
.in-fp-it figcaption { display: grid; gap: 2px; }
.in-fp-it figcaption strong { font-size: 15px; }
.in-fp-it figcaption span { font-size: 13px; opacity: .72; }
.in-fp-nav { display: none; gap: 10px; justify-content: center; margin-top: 20px; }
/* `.in-fp-btn` — wyglad wspolny z reszta strzalek, patrz motyw.css. */

@media (max-width: 860px) {
    .in-fp-track {
        display: flex; overflow-x: auto; scroll-snap-type: x mandatory;
        scroll-behavior: smooth; scrollbar-width: none; -ms-overflow-style: none;
        margin-inline: calc(-1 * var(--in-hgut, 20px));
        padding-inline: var(--in-hgut, 20px);
    }
    .in-fp-track::-webkit-scrollbar { display: none; }
    .in-fp-it { flex: 0 0 78%; scroll-snap-align: center; }
    .in-fp-nav { display: flex; }
}
@media (prefers-reduced-motion: reduce) { .in-fp-track { scroll-behavior: auto; } }

/* Oba elementy MUSZĄ mieć jawnie wskazany wiersz. Przy samym `grid-column`
   auto-rozmieszczanie nie wraca do wolnej komórki w wierszu 1 — zdjęcie
   lądowało w wierszu 2, czyli pod tekstem, zostawiając pustą przestrzeń.
   19.08.2026. */
.in-sec.in-split--z-foto > .in-wrap > .in-split-tresc,
.in-sec.in-split--z-foto > .in-wrap > .in-split-foto { grid-row: 1; }
@media (max-width: 860px) {
    .in-sec.in-split--z-foto > .in-wrap > .in-split-tresc,
    .in-sec.in-split--z-foto > .in-wrap > .in-split-foto { grid-row: auto; }
}

/* Podpunkty w krokach „przebiegu" — szczegółowy program modułu. 19.08.2026 */
.in-showcase-punkty { list-style: none; margin: 10px 0 0; padding: 0; display: grid; gap: 6px; }
.in-showcase-punkty li { position: relative; padding-left: 18px; font-size: 14px; opacity: .85; line-height: 1.5; }
.in-showcase-punkty li::before {
    content: ""; position: absolute; left: 0; top: .62em;
    width: 6px; height: 6px; border-radius: 50%; background: currentColor; opacity: .45;
}


/* Górny oddech w karcie „Skąd wziął się ten kurs" — nadtytuł dotykał krawędzi. */
.in-fd-body > .in-fd-tag:first-child { margin-top: 0; padding-top: 4px; }
.in-sec.in-founder .in-fd-body { padding-top: clamp(24px, 3vw, 40px); }

/* Notka „UWAGA" — osobny blok POD fioletową sekcją CTA. 19.08.2026 */
.in-note.in-cta-uwaga {
    max-width: var(--in-strona, 1288px);
    margin: 18px auto 0;
    padding-inline: var(--in-hgut, 20px);
    background: none; border: 0; box-shadow: none;
}
.in-note.in-cta-uwaga .in-note-t { margin-bottom: 6px; }
.in-note.in-cta-uwaga .in-p { margin: 0; opacity: .8; font-size: 14px; }

/* Tytuł w wariancie z kartami — mniejszy, żeby nie wchodził pod kartę z ceną. */
.in-cta--karty h2 {
    
    line-height: 1.08;
    max-width: 16ch;
}

/* ——— kafelki z pionowym filmem obok (strona gry) ——————————————————————
   Na produkcji rolka stoi jako osobna kolumna po prawej stronie kafelków.
   Odtwarzamy ten układ: kafelki zwężają się do dwóch kolumn, film dostaje
   własną, wąską kolumnę i wyrównuje się do góry razem z nimi. */
.in-cards-media {
    display: grid;
    grid-template-columns: minmax(0, 1fr) clamp(230px, 21vw, 310px);
    gap: clamp(20px, 2.4vw, 34px);
    align-items: start;
}
.in-cards-media > [class^="in-grid"] {
    grid-template-columns: repeat(2, minmax(0, 1fr));
}
.in-cards-rolka { margin: 0; }
.in-cards-rolka-v {
    display: block;
    width: 100%;
    aspect-ratio: 9 / 16;
    height: auto;
    border-radius: 22px;
    background: #0f0b18;
    object-fit: cover;
    box-shadow: 0 22px 52px -30px rgba(11, 18, 32, .55);
}
@media (max-width: 980px) {
    .in-cards-media { grid-template-columns: 1fr; }
    .in-cards-media > [class^="in-grid"] { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .in-cards-rolka { max-width: 320px; margin-inline: auto; }
}
@media (max-width: 640px) {
    .in-cards-media > [class^="in-grid"] { grid-template-columns: 1fr; }
}

/* Rola pod nazwiskiem na liście osób (np. „Twórczyni gry · certyfikująca"). */
.in-person-rola {
    margin: 0 0 10px;
    font-size: 12px;
    font-weight: 700;
    letter-spacing: .09em;
    text-transform: uppercase;
    color: var(--brand-primary, #643B81);
}

/* ——— lista osób: siatka dopasowana do liczby osób ——————————————————————
   Siatka stoi na sztywnych czterech kolumnach. Przy jednej osobie (tak zaczyna
   lista certyfikowanych prowadzących) zostawała wąska karta przy lewej
   krawędzi — wyglądało to na błąd, a nie na listę z jednym wpisem.
   Dlatego przy jednej i dwóch osobach zwężamy siatkę — ale zostawiamy karty
   PRZY LEWEJ KRAWĘDZI, w osi nagłówka sekcji. Wyśrodkowanie (próba z 19.08)
   odrywało kartę od nagłówka i wyglądało gorzej niż przed zmianą. */
.in-people:not(:has(> :nth-child(2))) {
    grid-template-columns: minmax(0, 420px);
    justify-content: start;
}
.in-people:has(> :nth-child(2)):not(:has(> :nth-child(3))) {
    grid-template-columns: repeat(2, minmax(0, 360px));
    justify-content: start;
}
.in-people:has(> :nth-child(3)):not(:has(> :nth-child(4))) {
    grid-template-columns: repeat(3, minmax(0, 1fr));
}


/* Kafelki PRODUKTÓW (sekcja #produkty w woocommerce.php) — kwadrat kadrowany
   od góry. Blog zostaje przy 4:3, bo tam kadr poziomy jest właściwy. */
.in-sec.in-posts#produkty .in-card img {
    aspect-ratio: 1 / 1;
    object-fit: cover;
    object-position: center top;
}
.in-sec.in-posts#produkty .in-card-ph { aspect-ratio: 1 / 1; }

/* ——— wybór prowadzącej w rezerwacji ————————————————————————————————
   Wcześniej były to zwykłe „chipy" (.in-cal-chip) — te same, którymi wybiera
   się godzinę. Wybór CZŁOWIEKA wyglądał przez to jak filtr, a nie jak decyzja,
   z kim się spotkasz. Teraz to karta ze zdjęciem z profilu. 20.08.2026 */
.in-rez-osoby-lista {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));
    gap: 12px;
}
.in-rez-osoba-chip {
    display: flex;
    align-items: center;
    gap: 13px;
    padding: 12px 16px 12px 12px;
    text-align: left;
    background: var(--in-surface, #fff);
    border: 1px solid var(--color-border, #C6C4D8);
    border-radius: 16px;
    cursor: pointer;
    font: inherit;
    color: inherit;
    transition: border-color .16s ease, box-shadow .16s ease, transform .16s ease;
}
.in-rez-osoba-chip:hover { border-color: var(--brand-primary, #643B81); transform: translateY(-1px); }
.in-rez-osoba-chip[aria-pressed="true"] {
    border-color: var(--brand-primary, #643B81);
    box-shadow: 0 0 0 2px rgba(100, 59, 129, .18);
    background: var(--brand-50, #f3eff5);
}
.in-rez-osoba-foto {
    flex: 0 0 52px;
    width: 52px;
    height: 52px;
    border-radius: 50%;
    overflow: hidden;
    display: grid;
    place-items: center;
    background: var(--brand-50, #f3eff5);
}
.in-rez-osoba-foto img { width: 100%; height: 100%; object-fit: cover; object-position: center top; display: block; }
.in-rez-osoba-ini { font-size: 20px; font-weight: 700; color: var(--brand-primary, #643B81); }
.in-rez-osoba-txt { display: grid; gap: 2px; min-width: 0; }
.in-rez-osoba-txt strong { font-size: 15px; font-weight: 600; line-height: 1.25; }
.in-rez-osoba-txt small { font-size: 12.5px; color: var(--color-text-muted, #413B4D); }

/* ——— okno z biografią prowadzącej („Czytaj więcej") ——————————————— */
.in-person-akcje { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; margin-top: auto; }
.in-person-wiecej {
    border: 0; background: none; padding: 0; cursor: pointer; font: inherit;
    font-size: 14px; font-weight: 600; color: var(--brand-primary, #643B81);
    text-decoration: underline; text-underline-offset: 3px;
}
.in-person-wiecej:hover { text-decoration-thickness: 2px; }
.in-bio-ov {
    position: fixed; inset: 0; z-index: 10000; display: grid; place-items: center;
    padding: 20px; background: rgba(28, 20, 38, .55); backdrop-filter: blur(3px);
}
.in-bio-ov[hidden] { display: none; }
.in-bio-box {
    position: relative; width: min(640px, 100%); max-height: 88vh; overflow: auto;
    background: var(--in-surface, #fff); border-radius: 22px; padding: 32px 34px 28px;
    box-shadow: 0 30px 70px -20px rgba(28, 20, 38, .5);
}
.in-bio-x {
    position: absolute; top: 14px; right: 16px; width: 36px; height: 36px; border: 0;
    border-radius: 50%; background: var(--brand-50, #f3eff5); color: var(--brand-800, #643B81);
    font-size: 22px; line-height: 1; cursor: pointer;
}
.in-bio-tyt { margin: 0 0 16px; font-size: 24px; }
.in-bio-tresc p { font-size: 15.5px; line-height: 1.65; margin: 0 0 14px; }
.in-bio-tresc p:last-child { margin-bottom: 22px; }

/* ——— motto na stronie prowadzącej ————————————————————————————————
   Cytat stał dotąd jako goły akapit między sekcjami i ginął. To zwykle
   najbardziej osobiste zdanie na całej stronie, więc dostaje własny panel
   z dużym znakiem cudzysłowu i podpisem. 20.08.2026 */
.in-sec.in-motto > .in-wrap { max-width: 960px; }
.in-sec.in-motto .in-quote {
    position: relative;
    padding: clamp(34px, 4vw, 54px) clamp(26px, 4vw, 60px) clamp(30px, 3.4vw, 46px);
    background: linear-gradient(150deg, var(--brand-50, #f3eff5) 0%, rgba(243, 239, 245, .45) 100%);
    border: 1px solid rgba(100, 59, 129, .16);
    border-radius: 26px;
    overflow: hidden;
}
.in-sec.in-motto .in-quote::before {
    content: "\201C";
    position: absolute;
    top: -22px;
    left: 14px;
    font-family: var(--font-display, Georgia, serif);
    font-size: 170px;
    line-height: 1;
    color: rgba(100, 59, 129, .13);
    pointer-events: none;
}
.in-sec.in-motto .in-quote-k {
    position: relative;
    font-size: 11.5px;
    letter-spacing: .2em;
    color: var(--brand-primary, #643B81);
    margin: 0 0 14px;
}
.in-sec.in-motto .in-quote > p:not(.in-quote-k),
.in-sec.in-motto .in-quote blockquote {
    position: relative;
    font-family: var(--font-display, Georgia, serif);
    font-size: clamp(21px, 2.3vw, 30px);
    line-height: 1.45;
    color: var(--brand-800, #372047);
    margin: 0;
}
.in-sec.in-motto .in-quote-a {
    position: relative;
    margin-top: 22px;
    font-weight: 600;
    color: var(--brand-primary, #643B81);
}
