/* Obramowanie w kolorach Google. Wczesniej bylo tu rotate:360deg na calym
   pseudoelemencie: prostokat obracal sie wokol srodka i jego rogi wychodzily
   daleko poza karte, przez cala stopke. Teraz animujemy KAT gradientu
   (@property --ga), wiec swiatlo plynie po krawedzi, a element stoi w miejscu. */
@property --ga{syntax:"<angle>";inherits:false;initial-value:0deg}
.gpref::before{content:"";position:absolute;inset:0;border-radius:inherit;z-index:-1;
  background:conic-gradient(from var(--ga),#4285F4,#34A853,#FBBC05,#EA4335,#4285F4);
  opacity:.55;transition:opacity .6s var(--ez);
  animation:gspin 7s linear infinite}
.gpref::after{content:"";position:absolute;inset:-14px;border-radius:34px;z-index:-2;
  background:conic-gradient(from var(--ga),#4285F4,#34A853,#FBBC05,#EA4335,#4285F4);
  filter:blur(26px);opacity:0;transition:opacity .7s var(--ez);
  animation:gspin 7s linear infinite}
@keyframes gspin{to{--ga:360deg}}
/* Fallback dla przegladarek bez @property: bez animacji kata conic-gradient
   nie da sie plynnie animowac, wiec zostaje statyczna ramka zamiast wahadla. */
@supports not (background:conic-gradient(from var(--ga),red,blue)){
  .gpref::before,.gpref::after{animation:none}
}
/* ═══════════════════════════════════════════════════════════════
   ULTIMATE BLOG
   Wlasny jezyk wizualny dla tresci: numerowane naglowki, cyjanowa
   linia redakcyjna, siatka kart z mocniejszym kontrastem. Kolory
   wylacznie z palety marki - blog przechyla sie w cyjan (--acc2),
   zeby odroznic tresc od uslug, ktore stoja na fiolecie.
   ═══════════════════════════════════════════════════════════════ */
.blog{--ed:var(--acc2);--ed-lite:var(--acc2-lite)}
[data-mid]{text-align:center}
[data-mid] h2,[data-mid] .lead,[data-mid] .fnote{margin-inline:auto}
.top{position:relative;padding:clamp(6.6rem,11vw,8.4rem) 0 clamp(1.8rem,3vw,2.6rem);
  overflow:hidden;text-align:center}
/* grafika marki jako tlo naglowka: rozmyta, przyciemniona i wygaszona
   maska w dol, zeby tekst byl czytelny, a przejscie w strone nie mialo
   twardej krawedzi */
.top__bg{position:absolute;inset:0;overflow:hidden;pointer-events:none;z-index:0}
/* Grafika marki jest juz ciemna i fioletowa (jasny rdzen u gory, czarne brzegi),
   wiec nie rozmywamy jej na sile. Lekki blur tylko po to, zeby tekst mial
   spokojne tlo, i zejscie do koloru strony u dolu. */
.top__bg img{position:absolute;inset:0;width:100%;height:100%;
  object-fit:cover;object-position:center 18%;
  /* mocniejszy blur rozbija napis "ULTIMATE BLOG" wypalony w grafice,
     zeby nie zderzal sie z naszym H1; kolor i swiatlo zostaja */
  filter:blur(13px) saturate(126%);transform:scale(1.16);opacity:.88}
.top__bg::after{content:"";position:absolute;inset:0;
  background:
    /* przyciemnienie dokladnie pod blokiem tekstu, zeby cyjanowy akcent
       w H1 mial kontrast; brzegi zostaja jasne i widac grafike */
    radial-gradient(52% 46% at 50% 44%,
      color-mix(in srgb,var(--bg) 78%,transparent) 0%,
      color-mix(in srgb,var(--bg) 52%,transparent) 62%,
      transparent 100%),
    linear-gradient(180deg,
      color-mix(in srgb,var(--bg) 30%,transparent) 0%,
      color-mix(in srgb,var(--bg) 30%,transparent) 54%,
      color-mix(in srgb,var(--bg) 74%,transparent) 84%,
      var(--bg) 100%)}
/* tekst dostaje wlasny cien, zeby czytelnosc nie wymagala gaszenia grafiki */
.top h1,.top__lead,.top .tag,.crumb{text-shadow:0 2px 18px rgba(4,3,10,.92),0 1px 4px rgba(4,3,10,.8)}
.top::before{content:"";position:absolute;inset:-34% -10% 0;pointer-events:none;z-index:1;
  background:radial-gradient(58% 60% at 50% 8%,color-mix(in srgb,var(--acc2) 16%,transparent),transparent 72%);
  -webkit-mask-image:linear-gradient(180deg,#000 0,#000 56%,transparent 100%);
  mask-image:linear-gradient(180deg,#000 0,#000 56%,transparent 100%)}
.top>.hold{position:relative;z-index:2}
/* cienka linia redakcyjna pod naglowkiem, sygnatura sekcji tresciowej */
.top::after{content:"";position:absolute;left:50%;bottom:0;translate:-50% 0;
  width:min(560px,72%);height:1px;
  background:linear-gradient(90deg,transparent,color-mix(in srgb,var(--acc2) 60%,transparent),transparent)}
.top>*{position:relative}
/* .top>* nadaje position:relative KAZDEMU dziecku i wygrywa specyficznoscia
   z .top__bg, przez co warstwa tla zapadala sie do wysokosci 0 i grafika
   nigdy nie byla widoczna. Wyjmujemy ja z tej reguly. */
.top>.top__bg{position:absolute}
.top h1{font-size:clamp(2rem,1.4rem + 2.6vw,3.4rem);max-width:18ch;margin:.9rem auto 0}
.top__lead{margin:1rem auto 0;max-width:60ch;font-size:clamp(.98rem,.94rem + .28vw,1.12rem);
  color:var(--ink1);line-height:1.55}
.crumb{display:flex;gap:.5rem;align-items:center;justify-content:center;
  font-family:var(--mono);font-size:.73rem;color:var(--ink3);margin-bottom:1.1rem;flex-wrap:wrap}
.crumb a{color:var(--ink3)}
.crumb a:hover{color:var(--acc2-lite)}
.crumb i{font-style:normal;opacity:.5}
/* ── SZUKAJKA I FILTRY ──────────────────────────────────────────── */
.tools{display:flex;flex-wrap:wrap;gap:.7rem;align-items:center;justify-content:center;margin-top:2rem}
.srch{position:relative;flex:1 1 320px;max-width:440px}
.srch input{width:100%;padding:.85rem 1rem .85rem 2.8rem;border-radius:14px;
  border:2px solid var(--line);background:var(--glass);color:var(--ink);
  font-family:var(--f-body);font-size:.94rem;transition:border-color .35s var(--ez)}
.srch input::placeholder{color:var(--ink3)}
.srch input:focus{outline:0;border-color:color-mix(in srgb,var(--acc2) 58%,transparent)}
.srch svg{position:absolute;left:1rem;top:50%;translate:0 -50%;width:16px;height:16px;
  color:var(--ink3);pointer-events:none}
.chips{display:flex;flex-wrap:wrap;gap:.45rem;justify-content:center}
.chip{font-family:var(--mono);font-size:.74rem;color:var(--ink2);cursor:pointer;
  border:1px solid var(--line);border-radius:10px;padding:.48rem .9rem;background:var(--glass);
  transition:border-color .3s var(--ez),color .3s var(--ez),background .3s var(--ez)}
.chip:hover{border-color:var(--line-hi);color:var(--ink)}
.chip[aria-pressed="true"]{border-color:color-mix(in srgb,var(--acc2) 62%,transparent);
  background:color-mix(in srgb,var(--acc2) 14%,transparent);color:var(--ink)}
.count{font-family:var(--mono);font-size:.74rem;color:var(--ink3);margin-top:1rem}
/* ── LISTA WPISOW ───────────────────────────────────────────────── */
.posts{display:grid;gap:1.1rem;grid-template-columns:1fr;margin-top:2rem}
@media(min-width:720px){.posts{grid-template-columns:repeat(2,1fr)}}
@media(min-width:1120px){.posts{grid-template-columns:repeat(3,1fr)}}
.post{position:relative;display:flex;flex-direction:column;overflow:hidden;border-radius:20px;
  border:2px solid var(--line);background:var(--glass);
  transition:border-color .5s var(--ez),transform .5s var(--ez)}
.post::before{content:"";position:absolute;left:0;right:0;top:0;height:2px;z-index:2;
  background:linear-gradient(90deg,var(--acc2),color-mix(in srgb,var(--acc) 70%,transparent));
  opacity:0;transition:opacity .45s var(--ez)}
.post:hover{border-color:color-mix(in srgb,var(--acc2) 46%,transparent);transform:translateY(-4px)}
.post:hover::before{opacity:1}
.post__img{aspect-ratio:16/9;overflow:hidden;background:#0d0b16;position:relative}
.post__img img{width:100%;height:100%;object-fit:cover;display:block;transition:transform .9s var(--ez)}
.post:hover .post__img img{transform:scale(1.05)}
.post__cat{position:absolute;left:.8rem;top:.8rem;font-family:var(--mono);font-size:.66rem;
  letter-spacing:.06em;text-transform:uppercase;padding:.3rem .65rem;border-radius:8px;
  background:color-mix(in srgb,var(--bg) 84%,transparent);backdrop-filter:blur(12px);
  border:1px solid var(--line);color:var(--ink1)}
.post__b{padding:1.3rem;display:flex;flex-direction:column;gap:.55rem;flex:1;text-align:left}
.post__b h3{font-size:1.02rem;line-height:1.32}
.post__b p{font-size:.85rem;color:var(--ink2);line-height:1.55}
.post__m{margin-top:auto;padding-top:.9rem;border-top:1px solid var(--line);
  display:flex;align-items:center;gap:.6rem;font-family:var(--mono);font-size:.72rem;color:var(--ink3)}
.post__m b{color:var(--ink2);font-weight:600}
.post__m .dot{opacity:.45}
.post.hide{display:none}
/* znacznik swiezosci: wpisy z ostatnich dni dostaja etykiete */
.post__new{position:absolute;right:.8rem;top:.8rem;font-family:var(--mono);font-size:.64rem;
  letter-spacing:.08em;text-transform:uppercase;padding:.3rem .6rem;border-radius:8px;
  background:color-mix(in srgb,var(--acc2) 82%,var(--bg));color:#04030a;font-weight:700}
/* pierwszy wpis na liscie: pelna szerokosc, wieksza okladka */
@media(min-width:900px){
  .posts>.post--lead{grid-column:1/-1;flex-direction:row;align-items:stretch}
  .posts>.post--lead .post__img{aspect-ratio:auto;flex:0 0 46%}
  .posts>.post--lead .post__b{padding:1.8rem 2rem;justify-content:center;gap:.7rem}
  .posts>.post--lead h3{font-size:clamp(1.2rem,1rem + .8vw,1.6rem);line-height:1.25}
  .posts>.post--lead p{font-size:.92rem}
}
/* pasek sekcji nad lista */
.sect{display:flex;align-items:baseline;gap:.9rem;flex-wrap:wrap;margin:2.6rem 0 1.1rem;
  padding-bottom:.75rem;border-bottom:1px solid var(--line)}
.sect h2{font-size:1.25rem;margin:0}
.sect span{font-family:var(--mono);font-size:.74rem;color:var(--ink3)}
.sect a{margin-left:auto;font-family:var(--mono);font-size:.76rem;color:var(--acc2-lite)}
.empty{grid-column:1/-1;text-align:center;padding:3rem 1rem;color:var(--ink3);font-size:.9rem}
/* ── PROMO NARZEDZI ─────────────────────────────────────────────── */
.tls{display:grid;gap:.85rem;grid-template-columns:1fr;margin-top:2.2rem}
@media(min-width:640px){.tls{grid-template-columns:repeat(2,1fr)}}
@media(min-width:1040px){.tls{grid-template-columns:repeat(4,1fr)}}
.tl{display:flex;flex-direction:column;overflow:hidden;border-radius:18px;
  border:2px solid var(--line);background:var(--glass);text-align:left;
  transition:border-color .45s var(--ez),transform .45s var(--ez)}
.tl:hover{border-color:color-mix(in srgb,var(--acc2) 48%,transparent);transform:translateY(-4px)}
.tl__img{aspect-ratio:16/10;overflow:hidden;background:#0d0b16}
.tl__img img{width:100%;height:100%;object-fit:cover;display:block;
  transition:transform .9s var(--ez)}
.tl:hover .tl__img img{transform:scale(1.05)}
.tl__b{padding:1.1rem 1.2rem;display:flex;flex-direction:column;gap:.4rem;flex:1}
.tl b{font-family:var(--f-head);font-size:.95rem;color:var(--ink)}
.tl p{font-size:.82rem;color:var(--ink2);line-height:1.5}
.tl span.free{margin-top:auto;padding-top:.8rem;font-family:var(--mono);font-size:.7rem;
  color:var(--acc2-lite)}
/* ── UKLAD TROJDZIELNY ──────────────────────────────────────────
   Wpis w srodku, po bokach kolumny na narzedzia, spis tresci i CTA.
   Ponizej 1180 px kolumny schodza pod tresc, bo na waskim ekranie
   trzy kolumny sa nieczytelne. */
.wrap3{display:grid;gap:2rem;grid-template-columns:minmax(0,1fr);align-items:start}
/* Kolumny boczne rosna razem z ekranem, srodek trzyma sie dlugosci wiersza
   ktora da sie czytac (ok. 46-52rem). Nadmiar szerokosci idzie do bokow,
   dzieki czemu grafiki narzedzi maja realne miejsce zamiast byc skalowane w dol. */
@media(min-width:1180px){
  .art-hold{max-width:none}
  .wrap3{grid-template-columns:minmax(15rem,20rem) minmax(0,46rem) minmax(16rem,22rem);
    justify-content:center;gap:2.6rem}
  .rail{position:sticky;top:6.2rem;display:grid;gap:1.1rem}
  .rail--l{order:1} .wrap3>.art{order:2} .rail--r{order:3}
}
@media(min-width:1560px){
  .wrap3{grid-template-columns:minmax(18rem,23rem) minmax(0,52rem) minmax(19rem,25rem);gap:3rem}
}
@media(min-width:1800px){
  .wrap3{grid-template-columns:minmax(21rem,26rem) minmax(0,58rem) minmax(22rem,28rem);gap:3.6rem}
}
@media(min-width:2200px){
  .wrap3{grid-template-columns:minmax(24rem,30rem) minmax(0,64rem) minmax(25rem,32rem);gap:4rem}
  .side{padding:1.4rem 1.5rem}
}
@media(min-width:2800px){
  .wrap3{grid-template-columns:minmax(28rem,34rem) minmax(0,70rem) minmax(29rem,36rem);gap:4.6rem}
}
@media(max-width:1179px){
  .rail{display:grid;gap:1rem;width:100%;max-width:min(42rem,100%);margin-inline:auto}
  .wrap3>.art{width:100%;max-width:min(42rem,100%)}
  .rail--l{order:3} .wrap3>.art{order:1} .rail--r{order:2}
  .rail .sticky-only{display:none}
}
/* kafelek w kolumnie bocznej */
.side{padding:1.1rem 1.2rem;border-radius:16px;border:1px solid var(--line);
  background:var(--glass);min-width:0;overflow-wrap:anywhere}
.side__h{display:block;font-family:var(--mono);font-size:.66rem;letter-spacing:.12em;
  text-transform:uppercase;color:var(--ink3);margin-bottom:.75rem}
.side ol,.side ul{margin:0;padding:0;list-style:none;display:grid;gap:.5rem}
.side a{color:var(--ink1);text-decoration:none;font-size:.87rem;line-height:1.4;
  transition:color .3s}
.side a:hover{color:var(--acc2-lite)}
/* spis tresci w kolumnie, z aktywna pozycja */
.side--toc{counter-reset:t}
.side--toc li{counter-increment:t;display:flex;gap:.6rem;align-items:baseline}
.side--toc li::before{content:counter(t,decimal-leading-zero);font-family:var(--mono);
  font-size:.68rem;color:var(--ink3);flex:none;transition:color .3s}
.side--toc li.on::before{color:var(--acc2-lite)}
.side--toc li.on a{color:var(--ink)}
/* narzedzia w kolumnie: z miniatura zamiast ikonki */
.side--tls ul{gap:.3rem}
.side--tls li a{display:flex;gap:.75rem;align-items:center;padding:.5rem;min-width:0;
  border-radius:12px;transition:background .3s var(--ez)}
.side--tls li a:hover{background:color-mix(in srgb,var(--acc2) 10%,transparent)}
.side--tls img{width:46px;height:46px;flex:none;border-radius:9px;object-fit:cover;
  border:1px solid var(--line);background:#0d0b16;
  /* Zrodlo to gotowa miniatura 176 px (2x dla najwiekszego slotu 88 px),
     przygotowana dwustopniowym zmniejszaniem po stronie serwera.
     Wczesniej przegladarka skalowala tu logo 1254 px do 46 px i krawedzie
     zabkowaly. Teraz redukcja jest niewielka i obraz zostaje gladki. */
  image-rendering:auto}
.side__go{flex:none;width:26px;height:26px;display:grid;place-items:center;border-radius:8px;
  font-size:.85rem;color:var(--acc2-lite);background:color-mix(in srgb,var(--acc2) 14%,transparent)}
.side--tls b{font-size:.85rem;font-weight:600;color:var(--ink1);display:block;min-width:0;line-height:1.3}
.side--tls i{font-style:normal;font-size:.72rem;color:var(--ink3);display:block;margin-top:.15rem}
/* Grafiki narzedzi rosna razem z kolumna boczna. Reguly MUSZA byc po bazowej,
   bo maja ta sama specyficznosc i decyduje kolejnosc w kaskadzie. */
@media(min-width:1560px){.side--tls img{width:58px;height:58px}}
@media(min-width:1800px){.side--tls img{width:66px;height:66px}
  .side--tls b{font-size:.92rem}}
@media(min-width:2200px){.side--tls img{width:76px;height:76px}
  .side--tls b{font-size:1rem}}
@media(min-width:2800px){.side--tls img{width:88px;height:88px}
  .side--tls b{font-size:1.05rem}}
/* CTA w kolumnie bocznej */
.side--cta{border-color:color-mix(in srgb,var(--acc) 40%,transparent);
  background:linear-gradient(180deg,color-mix(in srgb,var(--acc) 15%,transparent),
                                    color-mix(in srgb,var(--acc) 7%,transparent));
  padding:1.3rem 1.2rem}
.side--cta b{display:block;font-family:var(--f-head);font-size:1rem;color:var(--ink);
  line-height:1.35;margin-bottom:.5rem}
.side--cta p{font-size:.84rem;color:var(--ink2);line-height:1.55;margin-bottom:1rem}
.side--cta .b{width:100%;justify-content:center;padding:.7rem 1rem;font-size:.87rem}
.side--cta .px{display:block;margin-top:.7rem;font-family:var(--mono);font-size:.72rem;
  color:var(--ink3);text-align:center}
/* udostepnianie */
.side--sh ul{display:flex;gap:.4rem}
.side--sh a{width:34px;height:34px;border-radius:10px;display:grid;place-items:center;
  border:1px solid var(--line);color:var(--ink2);transition:border-color .3s,color .3s}
.side--sh a:hover{border-color:color-mix(in srgb,var(--acc2) 50%,transparent);color:var(--ink)}
.side--sh svg{width:15px;height:15px}
/* ── SZABLON WPISU ──────────────────────────────────────────────── */
.art{max-width:100%;min-width:0;margin-inline:auto;text-align:left}
/* poza ukladem 3-kolumnowym (mobile/tablet) tresc nadal ma limit dlugosci wiersza */
@media(max-width:1179px){.art{max-width:42rem}}
.art__head{text-align:center;max-width:78ch;margin-inline:auto}
.art__meta{display:flex;flex-wrap:wrap;gap:.5rem 1.1rem;justify-content:center;
  font-family:var(--mono);font-size:.76rem;color:var(--ink3);margin-top:1.1rem}
.art__meta b{color:var(--acc2-lite);font-weight:600}
.art__cover{margin:2.2rem 0;border-radius:22px;overflow:hidden;border:1px solid var(--line)}
.art__cover img{display:block;width:100%;height:auto}
/* naglowki numerowane - sygnatura wpisow na blogu */
.art{counter-reset:h2}
.art h2{counter-increment:h2;position:relative;padding-left:3.1rem;
  font-size:clamp(1.4rem,1.2rem + .9vw,1.85rem);margin:2.6rem 0 .9rem;scroll-margin-top:6rem}
.art h2::before{content:counter(h2,decimal-leading-zero);position:absolute;left:0;top:.1em;
  font-family:var(--mono);font-size:.62em;font-weight:700;color:var(--acc2-lite);
  letter-spacing:-.02em}
.art h2::after{content:"";position:absolute;left:0;bottom:-.55rem;width:2.2rem;height:2px;
  border-radius:2px;background:linear-gradient(90deg,var(--acc2),transparent)}
.art h3{font-size:1.14rem;margin:1.9rem 0 .7rem;color:var(--ink)}
.art p{font-size:1.06rem;line-height:1.78;color:var(--ink1);margin-bottom:1.15rem}
.art>p:first-of-type{font-size:1.16rem;line-height:1.7;color:var(--ink)}
.art ul,.art ol{margin:0 0 1.3rem 0;padding-left:1.3rem;display:grid;gap:.55rem}
.art li{font-size:1rem;line-height:1.68;color:var(--ink1)}
.art li::marker{color:var(--acc2-lite)}
.art a{color:var(--acc2-lite);text-decoration:underline;text-underline-offset:3px;
  text-decoration-thickness:1px;text-decoration-color:color-mix(in srgb,var(--acc2) 45%,transparent);
  transition:text-decoration-color .3s}
.art a:hover{text-decoration-color:var(--acc2-lite)}
.art strong{color:var(--ink);font-weight:700}
.art code{font-family:var(--mono);font-size:.9em;padding:.16em .45em;border-radius:6px;
  background:color-mix(in srgb,var(--acc2) 15%,transparent);color:var(--ink);
  border:1px solid color-mix(in srgb,var(--acc2) 22%,transparent)}
.art pre{margin:1.5rem 0;padding:1.15rem 1.35rem;border-radius:16px;overflow-x:auto;
  background:#0d0b16;border:1px solid var(--line);position:relative}
.art pre::before{content:"config";position:absolute;right:.9rem;top:.6rem;
  font-family:var(--mono);font-size:.64rem;letter-spacing:.1em;text-transform:uppercase;color:var(--ink3)}
.art pre code{background:none;padding:0;border:0;color:var(--ink1);font-size:.86rem;line-height:1.75}
.art blockquote{margin:1.7rem 0;padding:1.15rem 1.4rem;border-left:3px solid var(--acc2);
  border-radius:0 14px 14px 0;background:color-mix(in srgb,var(--acc2) 9%,transparent)}
.art blockquote p{margin:0;font-size:1rem;color:var(--ink)}
/* ── OBRAZY W TRESCI ────────────────────────────────────────────── */
.art figure{margin:1.9rem 0}
.art figure img{display:block;width:100%;height:auto;border-radius:16px;
  border:1px solid var(--line)}
.art figcaption{margin-top:.65rem;font-family:var(--mono);font-size:.74rem;color:var(--ink3);
  line-height:1.5;padding-left:.9rem;border-left:2px solid color-mix(in srgb,var(--acc2) 40%,transparent)}
/* szeroki kadr: wychodzi poza kolumne tekstu, zostaje w siatce strony */
/* szeroki kadr: wychodzi poza kolumne tekstu na tyle, na ile pozwala
   uklad, ale nigdy nie wchodzi na kolumny boczne */
.art figure.wide{width:min(58rem,100%);margin-inline:auto}
/* Szeroki kadr. Wczesniej bylo width:min(62rem,112%) z margin-inline:-6%.
   Gdy min() wybieralo 62rem (od ~2200px w gore), szerokosc przestawala
   rosnac, ale ujemny margines dalej liczyl sie od 112% kolumny i zdjecie
   uciekalo w prawo o ponad 150 px. Teraz kadr jest wysrodkowany wzgledem
   kolumny niezaleznie od tego, ktora wartosc wygra. */
@media(min-width:1560px){
  .art figure.wide{width:min(62rem,112%);
    margin-inline:0;
    /* left:50% + translate:-50% centruje kadr wzgledem kolumny.
       margin-inline:auto dokladal tu jeszcze 16 px i psul symetrie. */
    position:relative;left:50%;translate:-50% 0}
}
/* dwa zrzuty obok siebie, np. przed i po */
.art .duo{display:grid;gap:.8rem;margin:1.9rem 0;min-width:0}
.art .duo figure{min-width:0}
@media(min-width:680px){.art .duo{grid-template-columns:1fr 1fr}}
.art .duo figure{margin:0}
.art .duo figcaption{padding-left:.7rem}
/* ── TABELE ─────────────────────────────────────────────────────── */
.art .tbl{width:100%;margin:1.9rem 0;overflow-x:auto;
  border:1px solid var(--line);border-radius:16px}
.art table{width:100%;border-collapse:collapse;font-size:.92rem;min-width:520px}
.art th,.art td{padding:.78rem 1rem;border-bottom:1px solid var(--line);text-align:left}
.art thead th{font-family:var(--f-head);color:var(--ink);font-weight:700;font-size:.88rem;
  background:color-mix(in srgb,var(--acc2) 8%,transparent);white-space:nowrap}
.art tbody tr:last-child td{border-bottom:0}
.art tbody tr{transition:background .3s var(--ez)}
.art tbody tr:hover{background:color-mix(in srgb,var(--acc2) 5%,transparent)}
.art td.fig{font-family:var(--mono);color:var(--ink);font-variant-numeric:tabular-nums;letter-spacing:0;text-transform:none}
/* ── RAMKI INFORMACYJNE ─────────────────────────────────────────── */
.note{margin:1.9rem 0;padding:1.15rem 1.35rem 1.15rem 3.3rem;border-radius:16px;position:relative;
  border:1px solid var(--line);background:var(--glass)}
.note::before{content:"";position:absolute;left:1.2rem;top:1.35rem;width:18px;height:18px;
  border-radius:50%;background:color-mix(in srgb,var(--acc2) 26%,transparent);
  border:1px solid color-mix(in srgb,var(--acc2) 55%,transparent)}
.note b{display:block;font-size:.95rem;color:var(--ink);margin-bottom:.35rem}
.note p{font-size:.94rem;margin:0;color:var(--ink2);line-height:1.65}
.note--warn::before{background:color-mix(in srgb,var(--cta-lite) 30%,transparent);
  border-color:color-mix(in srgb,var(--cta-lite) 60%,transparent)}
.note--warn{border-color:color-mix(in srgb,var(--cta-lite) 30%,transparent)}
/* pasek postepu czytania */
.prog{position:fixed;top:0;left:0;height:3px;z-index:120;width:0;
  background:linear-gradient(90deg,var(--acc2),var(--acc));transition:width .1s linear}
/* spis tresci */
.toc{margin:2rem 0;padding:1.3rem 1.5rem;border-radius:18px;border:1px solid var(--line);
  background:var(--glass);counter-reset:t}
.toc b{display:block;font-family:var(--mono);font-size:.72rem;letter-spacing:.1em;
  text-transform:uppercase;color:var(--ink3);margin-bottom:.75rem}
.toc ol{margin:0;padding:0;list-style:none;display:grid;gap:.45rem}
.toc li{counter-increment:t;display:flex;gap:.7rem;align-items:baseline}
.toc li::before{content:counter(t,decimal-leading-zero);font-family:var(--mono);font-size:.72rem;
  color:var(--acc2-lite);flex:none}
.toc a{color:var(--ink1);text-decoration:none;font-size:.94rem}
.toc a:hover{color:var(--acc2-lite)}
/* ramka autora */
.auth{display:flex;gap:1.1rem;align-items:flex-start;margin:2.6rem 0;padding:1.4rem;
  border-radius:20px;border:2px solid var(--line);background:var(--glass)}
.auth__av{width:52px;height:52px;border-radius:50%;flex:none;display:grid;place-items:center;
  font-family:var(--f-head);font-weight:800;color:#fff;font-size:1.1rem;
  background:linear-gradient(140deg,var(--acc),var(--acc2))}
.auth b{display:block;font-size:.98rem;color:var(--ink)}
.auth span{display:block;margin-top:.3rem;font-size:.86rem;color:var(--ink2);line-height:1.55}
/* wstawka uslugowa w tresci: jedyne miejsce z fioletem. Nie plaski
   prostokat z przyciskiem, tylko karta z liczba, poswiata i podpisem. */
.plug{position:relative;margin:2.8rem 0;padding:1.8rem;border-radius:22px;overflow:hidden;
  border:1px solid color-mix(in srgb,var(--acc) 34%,transparent);
  background:linear-gradient(135deg,
    color-mix(in srgb,var(--acc) 16%,var(--bg)) 0%,
    color-mix(in srgb,var(--acc) 7%,var(--bg)) 52%,
    color-mix(in srgb,var(--cta) 12%,var(--bg)) 100%)}
.plug::before{content:"";position:absolute;right:-18%;top:-60%;width:58%;aspect-ratio:1;
  border-radius:50%;pointer-events:none;
  background:radial-gradient(circle,color-mix(in srgb,var(--acc) 34%,transparent),transparent 68%)}
.plug::after{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;
  background:linear-gradient(180deg,var(--acc),var(--cta-lite))}
.plug__in{position:relative;display:grid;gap:1.2rem}
@media(min-width:640px){.plug__in{grid-template-columns:1fr auto;align-items:center;gap:1.8rem}}
.plug__k{font-family:var(--mono);font-size:.66rem;letter-spacing:.14em;text-transform:uppercase;
  color:var(--acc-lite);margin-bottom:.5rem;display:block}
.plug b{display:block;font-family:var(--f-head);font-size:clamp(1.1rem,1rem + .5vw,1.35rem);
  color:var(--ink);line-height:1.3;margin-bottom:.5rem}
.plug p{font-size:.92rem;color:var(--ink2);margin:0;line-height:1.6}
.plug__r{display:grid;gap:.6rem;justify-items:stretch}
@media(min-width:640px){.plug__r{min-width:13rem}}
.plug .b{justify-content:center;width:100%}
.plug__n{display:flex;align-items:baseline;gap:.4rem;justify-content:center;
  font-family:var(--mono);font-size:.74rem;color:var(--ink3)}
.plug__n b{display:inline;font-family:var(--mono);font-size:1.5rem;color:var(--ink);
  margin:0;letter-spacing:-.03em}
/* promo narzedzia w tresci */
.tlbox{margin:2.2rem 0;padding:1.4rem;border-radius:18px;display:flex;gap:1.1rem;
  align-items:flex-start;border:2px solid color-mix(in srgb,var(--acc2) 38%,transparent);
  background:color-mix(in srgb,var(--acc2) 8%,transparent)}
.tlbox__i{width:42px;height:42px;flex:none;border-radius:12px;display:grid;place-items:center;
  background:color-mix(in srgb,var(--acc2) 20%,transparent);color:var(--acc2-lite)}
.tlbox__i svg{width:20px;height:20px}
.tlbox b{display:block;font-family:var(--f-head);font-size:1rem;color:var(--ink);margin-bottom:.3rem}
.tlbox p{font-size:.9rem;color:var(--ink2);margin:0 0 .8rem;line-height:1.6}
.tlbox a{font-size:.88rem;font-weight:600}
/* nastepne wpisy */
.next{display:grid;gap:.9rem;grid-template-columns:1fr;margin-top:1.6rem}
@media(min-width:820px){.next{grid-template-columns:repeat(3,1fr)}}
/* ── PRZEJSCIE DO STOPKI ─────────────────────────────────────────
   Sekcja "Czytaj dalej" konczyla sie twarda krawedzia nad stopka.
   Miekkie zejscie: swiatlo marki gasnie w tlo strony. */
footer{--foot-fade:clamp(90px,12vh,190px)}
footer::before{content:"";position:absolute;left:0;right:0;
  top:calc(var(--foot-fade) * -1);height:var(--foot-fade);
  pointer-events:none;z-index:0;
  background:linear-gradient(180deg,
    transparent 0%,
    color-mix(in srgb,var(--acc) 5%,transparent) 46%,
    color-mix(in srgb,var(--acc) 9%,transparent) 74%,
    color-mix(in srgb,var(--acc) 12%,transparent) 100%)}
footer>*{position:relative;z-index:1}
.sec-sm:last-of-type{overflow:visible}
/* ── HUB NARZEDZI ──────────────────────────────────────────────── */
.grp{margin-top:3.4rem}
.grp__h{display:flex;align-items:baseline;gap:.9rem;margin-bottom:1.3rem;
  padding-bottom:.85rem;border-bottom:1px solid var(--line)}
.grp__h h2{font-family:var(--f-head);font-size:1.32rem;letter-spacing:-.02em;color:var(--ink)}
.grp__h span{font-family:var(--mono);font-size:.68rem;letter-spacing:.16em;
  text-transform:uppercase;color:var(--ink3)}
.tl{position:relative}
.tl__b{display:flex;flex-direction:column;flex:1;padding:1.35rem 1.4rem 1.4rem;gap:.5rem}
.tl__top{display:flex;align-items:center;gap:.75rem;margin-bottom:.75rem}
.tl__ic{flex:0 0 auto;width:42px;height:42px;border-radius:13px;display:grid;place-items:center;
  border:1px solid var(--line-hi);background:color-mix(in srgb,var(--acc2) 13%,transparent);
  transition:background .4s var(--ez),border-color .4s var(--ez)}
.tl__ic svg{width:20px;height:20px;fill:none;stroke:var(--acc2-lite);stroke-width:1.7;
  stroke-linecap:round;stroke-linejoin:round;color:var(--acc2-lite)}
.tl:hover .tl__ic{background:color-mix(in srgb,var(--acc2) 22%,transparent);
  border-color:color-mix(in srgb,var(--acc2) 50%,transparent)}
.tl__tag{font-family:var(--mono);font-size:.62rem;letter-spacing:.1em;text-transform:uppercase;
  padding:.3rem .6rem;border-radius:7px;border:1px solid var(--line);color:var(--ink2);
  background:color-mix(in srgb,#E7F6FF 4%,transparent)}
.tls{grid-template-columns:1fr}
@media(min-width:700px){.tls{grid-template-columns:repeat(2,1fr)}}
@media(min-width:1180px){.tls{grid-template-columns:repeat(3,1fr)}}
.nofee{display:flex;flex-wrap:wrap;gap:.6rem;margin-top:1.7rem;justify-content:center}
.nofee span{font-family:var(--mono);font-size:.7rem;letter-spacing:.08em;
  padding:.45rem .8rem;border-radius:9px;border:1px solid var(--line);
  background:var(--glass);color:var(--ink2)}
/* Poswiata pod przyciskiem. Kolor krazy w tym samym rytmie co
   pierscien (6 s), wiec jedno swieci razem z drugim zamiast
   zyc wlasnym zyciem. */
@keyframes um-gglow{
  0%  { box-shadow:0 0 26px -6px #4285F4, 0 0 60px -18px #4285F4; }
  25% { box-shadow:0 0 26px -6px #34A853, 0 0 60px -18px #34A853; }
  50% { box-shadow:0 0 26px -6px #FBBC05, 0 0 60px -18px #FBBC05; }
  75% { box-shadow:0 0 26px -6px #EA4335, 0 0 60px -18px #EA4335; }
  100%{ box-shadow:0 0 26px -6px #4285F4, 0 0 60px -18px #4285F4; }
}
.gpref{ animation:um-gglow 6s linear infinite; }
.gpref:hover{ animation-duration:2.8s; }
@media (prefers-reduced-motion:reduce){
  .gpref{ animation:none; box-shadow:0 0 26px -8px #4285F4; }
}
/* Fonty leca z Google Fonts, dokladnie tym samym linkiem co strona
   glowna. Wczesniej wstawilem tu wlasne @font-face wskazujace na
   uploads/um-fonts, ale tam nie ma JetBrains Mono, a strona glowna
   i tak od poczatku uzywa Google Fonts. Jedno zrodlo, nie dwa. */

/* ── CIECIE NAD STOPKA I W POLOWIE STRONY ──────────────────────────
   .cta mialo border-block: 1px solid, czyli twarda fioletowa kreske
   na gornej i dolnej krawedzi sekcji. To ona byla widoczna jako
   ostre ciecie. Zdejmujemy ja i wygaszamy oba tla maskami, wiec
   pasmo CTA wchodzi i wychodzi plynnie. */
.cta{ border-block: 0; }
.cta::before{
  -webkit-mask:linear-gradient(to bottom,transparent 0,#000 110px,#000 calc(100% - 110px),transparent 100%);
          mask:linear-gradient(to bottom,transparent 0,#000 110px,#000 calc(100% - 110px),transparent 100%);
}
.cta__vid{
  -webkit-mask:linear-gradient(to bottom,transparent 0,#000 150px,#000 calc(100% - 150px),transparent 100%);
          mask:linear-gradient(to bottom,transparent 0,#000 150px,#000 calc(100% - 150px),transparent 100%);
}
/* ── PIERSCIEN W KOLORACH GOOGLE ───────────────────────────────────
   Poprzednia wersja animowala kat conic-gradient przez @property.
   Animacja startowala, ale kat stal na 0deg i nic sie nie ruszalo.
   Teraz obraca sie prawdziwy element pod maska, co dziala wszedzie. */
.gpref{ position:relative; isolation:isolate; border:0 !important;
  border-radius:14px; overflow:hidden;
  background:color-mix(in srgb,#E7F6FF 4%,transparent); }
.gpref::before, .gpref::after{ content:none !important; }
.gpref__ring{
  position:absolute; inset:0; z-index:0; border-radius:inherit;
  padding:1.6px; overflow:hidden;
  -webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);
          mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);
  -webkit-mask-composite:xor; mask-composite:exclude;
}
.gpref__ring::before{
  content:""; position:absolute; top:50%; left:50%;
  width:190%; aspect-ratio:1;
  background:conic-gradient(#4285F4,#34A853,#FBBC05,#EA4335,#4285F4);
  transform:translate(-50%,-50%) rotate(0deg);
  animation:um-gspin 6s linear infinite;
}
.gpref:hover .gpref__ring::before{ animation-duration:2.8s; }
.gpref__in{ position:relative; z-index:1; }
@keyframes um-gspin{
  from{ transform:translate(-50%,-50%) rotate(0deg); }
  to  { transform:translate(-50%,-50%) rotate(360deg); }
}
@media (prefers-reduced-motion:reduce){ .gpref__ring::before{ animation:none; } }
/* ── KONTRAST TEKSTU POMOCNICZEGO ──────────────────────────────────
   --ink3 przy 48% daje 4.35:1 na tle #04030a. Tekst pomocniczy jest
   normalnej wielkosci (11-13px), wiec potrzebuje 4.5:1, nie 3:1.
   Zmierzone na zywo w przegladarce na czterech stronach naraz:
   przy 48% oblewalo od 7 do 22 elementow na stronie, przy 56% zero.
   Ten sam problem ma szablon strony glownej, ale jego nie ruszam. */
:root{ --ink3: color-mix(in srgb,#E6EDF5 56%,transparent); }
/* Strzalka przy linkach miala 3.71:1 wlasnym kolorem. Dziedziczenie
   koloru linku zawsze przechodzi, bo tekst linku juz przechodzi. */
.arw{ color: currentColor; }
.gpref__in .arw{ color: var(--ink1); }
.ft-dc .arw{ color: var(--ink1); }
.fqs{display:grid;gap:.7rem;margin-top:2rem;max-width:78ch;margin-inline:auto;text-align:left}
.fq{border:2px solid var(--line);border-radius:16px;background:var(--glass);overflow:hidden;
  transition:border-color .35s var(--ez)}
.fq[open]{border-color:color-mix(in srgb,var(--acc) 40%,transparent)}
.fq summary{list-style:none;cursor:pointer;padding:1.1rem 1.3rem;font-family:var(--f-head);
  font-size:1rem;color:var(--ink);display:flex;align-items:center;gap:.9rem;min-height:56px}
.fq summary::-webkit-details-marker{display:none}
.fq summary::after{content:"+";margin-left:auto;font-family:var(--mono);font-size:1.2rem;
  color:var(--acc2-lite);flex:0 0 auto}
.fq[open] summary::after{content:"–"}
.fq__b{padding:0 1.3rem 1.2rem}
.fq__b p{font-size:.92rem;color:var(--ink2);line-height:1.65;max-width:72ch}
.pick{display:grid;gap:.85rem;margin-top:2rem}
@media(min-width:860px){.pick{grid-template-columns:repeat(3,1fr)}}
.pick div{padding:1.5rem 1.6rem;border-radius:16px;border:2px solid var(--line);
  background:var(--glass);text-align:left}
.pick b{display:block;font-family:var(--f-head);font-size:1rem;color:var(--ink);margin-bottom:.5rem}
.pick p{font-size:.88rem;color:var(--ink2);line-height:1.6}
.pick i{display:block;margin-top:.7rem;font-family:var(--mono);font-size:.7rem;
  letter-spacing:.08em;color:var(--acc2-lite);font-style:normal}