/* ==========================================================================
   Izerskie Alpaki — warstwa komponentów.
   Wszystkie wartości pochodzą z theme.json (--wp--preset--*). Nie wpisuj hexów.
   ========================================================================== */

/* Bez tego padding i obrys doliczają się do zadanej szerokości — elementy
   z `width: 100%` i wewnętrznym paddingiem wychodziły poza rodzica
   (pola formularza, przyciski w panelu menu). Motyw nie miał tego resetu. */
*, *::before, *::after { box-sizing: border-box; }

/* Reguła `[hidden] { display: none }` z arkusza przeglądarki ma specyficzność
   selektora typu, więc każda nasza klasa z `display` ją bije. Elementy chowane
   atrybutem - opcje w oknie zgód, przycisk „Pokaż więcej”, sterowanie karuzeli -
   nadal się wyświetlały. `!important` jest tu na miejscu: `hidden` to deklaracja
   „tego nie ma”, a nie sugestia. */
[hidden] { display: none !important; }

:root {
  /* Margines strony z Design Systemu (§Układ i przestrzeń): 24/40/64px.
     Kontener 1240px zdjęty na życzenie klienta — sekcje, siatki, galeria,
     cennik i mapa idą na pełną szerokość okna. Miara tekstu zostaje przy 760px,
     bo DS nie bez powodu ogranicza wiersz do ~70 znaków. */
  --ia-gutter: clamp(1.5rem, 4.5vw, 4rem);
  --ia-content: 760px;

  /* Jedna definicja toru dla wszystkich kontenerów: margines — treść — margines.
     `1fr` zamiast sufitu, więc pas „wide” wypełnia całą dostępną szerokość. */
  --ia-track:
    [full-start] var(--ia-gutter)
    [wide-start] minmax(0, 1fr)
    [wide-end] var(--ia-gutter)
    [full-end];

  --ia-radius-sm: var(--wp--custom--radius--sm);
  --ia-radius-md: var(--wp--custom--radius--md);
  --ia-radius-lg: var(--wp--custom--radius--lg);
  --ia-radius-pill: var(--wp--custom--radius--pill);
  --ia-dur: var(--wp--custom--duration--base);
  --ia-ease: var(--wp--custom--easing);
  --ia-header-h: var(--wp--custom--header--height);
  --ia-header-h-scrolled: var(--wp--custom--header--height-scrolled);
  --ia-bar-h: var(--wp--custom--contact-bar--height);
}

/* Nagłówek jest `position: fixed`, więc skok do kotwicy (#tresc, #formularz,
   spis treści na stronach prawnych) chowałby górę celu pod paskiem. */
[id] { scroll-margin-top: calc(var(--ia-header-h-scrolled) + var(--wp--preset--spacing--50)); }

/* Na desktopie logo zwiesza się ~70px poniżej paska — cel kotwicy musi ominąć
   także jego, nie tylko sam nagłówek. */
@media (min-width: 900px) {
  [id] { scroll-margin-top: calc(var(--ia-header-h-scrolled) + 70px + var(--wp--preset--spacing--50)); }
}

/* Zaznaczenie tekstu w kolorach marki — drobiazg, ale widoczny przy każdym
   kopiowaniu adresu czy numeru telefonu. */
::selection {
  background: var(--wp--preset--color--purple-tint);
  color: var(--wp--preset--color--purple-deep);
}

/* ------------------------------------------------------------ dostępność */

.ia-skip-link {
  position: absolute;
  left: -9999px;
  z-index: 100;
  padding: 12px 20px;
  background: var(--wp--preset--color--purple);
  color: var(--wp--preset--color--white);
  border-radius: 0 0 var(--ia-radius-sm) 0;
}
.ia-skip-link:focus { left: 0; top: 0; }

/* Każdy blok najwyższego poziomu dostaje od WordPressa `margin-block-start` z blockGap.
   Nagłówek jest `position: fixed`, więc jego wrapper ma zerową wysokość i to hero
   jest pierwszym widocznym blokiem — jego margines przechodził przez <body>
   i zostawiał 24px lnianej szpary nad zdjęciem. */
.wp-site-blocks > *:first-child,
.ia-hero { margin-block-start: 0; }

/* Nagłówek obecny dla czytników ekranu, niewidoczny na ekranie. */
.screen-reader-text {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

:where(a, button, input, select, textarea, summary, [tabindex]):focus-visible {
  outline: 2px solid var(--wp--preset--color--purple);
  outline-offset: 2px;
}

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { transition-duration: 1ms !important; animation-duration: 1ms !important; }
}

/* ---------------------------------------------------------------- nagłówek */

.ia-header {
  position: fixed;
  inset: 0 0 auto;
  z-index: 50;
  display: flex;
  align-items: center;
  justify-content: space-between;
  /* Grupa blokowa ma domyślnie `flex-wrap: wrap` — po dołożeniu profili social
     nagłówek łamał się na drugi wiersz i przy stałej wysokości wychodził na hero. */
  flex-wrap: nowrap;
  gap: var(--wp--preset--spacing--40);
  height: var(--ia-header-h);
  /* Ta sama oś co sekcje — logo i telefon lądują nad treścią, nie przy krawędzi okna. */
  padding-inline: var(--ia-gutter);
  background: transparent;
  transition: height var(--ia-dur) var(--ia-ease), background var(--ia-dur) var(--ia-ease);
}
.ia-header::before {                     /* scrim pod białymi linkami nad hero */
  content: "";
  position: absolute;
  inset: 0 0 auto;
  /* Wyższy i mocniejszy niż sam nagłówek: linki potrafią trafić na jasne niebo
     albo rozświetloną trawę, a wtedy .38 gasnące na 84px jest za słabe. */
  height: calc(var(--ia-header-h) * 2);
  background: linear-gradient(180deg, rgba(38, 35, 34, .62) 0%, rgba(38, 35, 34, .34) 45%, transparent 100%);
  transition: opacity var(--ia-dur) var(--ia-ease);
  pointer-events: none;
}
/* Blok nawigacji wnosi własne reguły koloru, więc samo `.ia-header a` przegrywało
   i linki nad hero renderowały się atramentem na zdjęciu — nieczytelnie. */
.ia-header a,
.ia-header .wp-block-navigation a,
.ia-header .wp-block-navigation .wp-block-navigation-item__content {
  color: var(--wp--preset--color--white);
  text-decoration: none;
}
.ia-header__nav { display: flex; gap: var(--wp--preset--spacing--50); white-space: nowrap; font-weight: 600; }
/* Podkreślenie zamiast koloru: nagłówek bywa na zdjęciu i na tle lnianym,
   a jedna barwa akcentu nie ma kontrastu w obu stanach naraz. */
.ia-header .ia-header__nav a[aria-current] {
  text-decoration: underline;
  text-decoration-thickness: 2px;
  text-underline-offset: 6px;
}

/* stan po przewinięciu i na wszystkich podstronach */
.ia-header.is-solid,
body:not(.home) .ia-header {
  height: var(--ia-header-h-scrolled);
  background: var(--wp--preset--color--linen);
  border-bottom: 1px solid var(--wp--preset--color--sand);
}
.ia-header.is-solid::before,
body:not(.home) .ia-header::before { opacity: 0; }
.ia-header.is-solid a,
.ia-header.is-solid .wp-block-navigation a,
.ia-header.is-solid .wp-block-navigation .wp-block-navigation-item__content,
body:not(.home) .ia-header a,
body:not(.home) .ia-header .wp-block-navigation a,
body:not(.home) .ia-header .wp-block-navigation .wp-block-navigation-item__content { color: var(--wp--preset--color--ink); }
/* Logo wyższe niż pasek — emblemat ma nazwę w pierścieniu i przy 52px jest
   nieczytelny. Zwiesza się poniżej krawędzi nagłówka na własnym, lnianym tle
   z zaokrąglonym dołem.
   Ten sam koszyczek działa we WSZYSTKICH stanach i na obu szerokościach:
   lniane tło daje emblematowi czytelność także na zdjęciu, więc osobny biały
   znak słowny przestał być potrzebny. Na mobile jest po prostu mniejszy. */
.ia-header__logo--dark {
  display: block;
  align-self: flex-start;
  position: relative;
  z-index: 1;
  padding: 8px 14px 12px;
  background: var(--wp--preset--color--linen);
  border: 1px solid var(--wp--preset--color--sand);
  border-top: 0;
  border-radius: 0 0 var(--ia-radius-md) var(--ia-radius-md);
  box-shadow: var(--wp--preset--shadow--sm);
}
/* Odnośnik logo jest domyślnie liniowy — bez tego pod obrazkiem zostaje
   kilka pikseli na linię bazową i koszyczek jest niesymetryczny. */
.ia-header__logo--dark a { display: block; }
/* Emblemat ma nazwę zagrody wpisaną w pierścień. Poniżej ~64px pierścień
   zlewa się w szarą obwódkę, dlatego wysokość jest tu tak duża — to minimum,
   przy którym „IZERSKIE ALPAKI · ŚWIERADÓW ZDRÓJ” daje się przeczytać. */
.ia-header__logo--dark img { display: block; width: auto; height: 68px; }

@media (min-width: 900px) {
  .ia-header__logo--dark { padding: 12px 22px 18px; }
  .ia-header__logo--dark img { height: 104px; }
}

.ia-header.is-solid .ia-phone,
body:not(.home) .ia-phone {
  background: var(--wp--preset--color--purple);
  color: var(--wp--preset--color--white);
}
.ia-header.is-solid .ia-phone:hover,
body:not(.home) .ia-phone:hover { background: var(--wp--preset--color--purple-dark); }

/* Telefon wypełniony od pierwszej klatki, nie dopiero po przewinięciu.
   Sam obrys na zdjęciu ginął i numer wyglądał, jakby pojawiał się później. */
.ia-header .ia-phone {
  display: inline-flex;
  align-items: center;
  height: 42px;
  padding-inline: 20px;
  border: 0;
  border-radius: var(--ia-radius-pill);
  background: var(--wp--preset--color--white);
  color: var(--wp--preset--color--purple-deep);
  font-weight: 700;
  white-space: nowrap;
  box-shadow: var(--wp--preset--shadow--sm);
}
.ia-header .ia-phone:hover { background: var(--wp--preset--color--purple-tint); }

/* Profile social w nagłówku — ikony marek, okrągły obszar dotykowy. */
.ia-social--compact { display: flex; gap: 4px; align-items: center; }
.ia-header .ia-social--compact a {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 38px;
  height: 38px;
  padding: 0;
  border: 0;
  border-radius: 50%;
  background: transparent;
  color: var(--wp--preset--color--white);
  transition: background var(--ia-dur) var(--ia-ease), color var(--ia-dur) var(--ia-ease);
}
.ia-header .ia-social--compact a:hover { background: rgba(255, 255, 255, .18); }
.ia-header.is-solid .ia-social--compact a,
body:not(.home) .ia-header .ia-social--compact a { color: var(--wp--preset--color--graphite); }
.ia-header.is-solid .ia-social--compact a:hover,
body:not(.home) .ia-header .ia-social--compact a:hover {
  background: var(--wp--preset--color--purple-tint);
  color: var(--wp--preset--color--purple);
}

/* Poniżej 1200px nagłówek robi się ciasny — social zostają w menu i stopce. */
@media (max-width: 1199px) { .ia-header .ia-social--compact { display: none; } }

/* Próg nawigacji, osobny od progu układu mobilnego (900px).
   Siedem pozycji menu zajmuje w poziomie tyle, że przy 1024px zostawały
   44px zapasu - poniżej 1150px nagłówek zaczynał się łamać. Poniżej tego progu
   nawigacja przenosi się do wysuwanego panelu, a telefon i profile zostają
   w nagłówku aż do 900px. */
@media (max-width: 1149px) {
  /* `.ia-header` z przodu podnosi wagę selektora ponad `.wp-block-navigation`,
     które WordPress dokłada inline w <head> już po arkuszu motywu — przy równej
     wadze wygrywałoby kolejnością i nawigacja desktopowa zostawałaby widoczna. */
  .ia-header .ia-header__nav { display: none; }
  /* Przełącznik języka zostaje w nagłówku - obcojęzyczny gość ma go widzieć bez
     otwierania menu. Etykietę zwijamy do samego skrótu, żeby zmieścić się
     obok znaku i przycisku „Menu” na 390px. */
  .ia-header .ia-lang--rozwijany summary { padding: 0 4px; gap: 4px; }
}

@media (max-width: 899px) {
  /* Telefon na mobile mieszka w sticky pasku na dole (DS §5.1: „Desktop —
     w nagłówku, Mobile — sticky pasek”). W nagłówku razem ze znakiem słownym
     i przyciskiem Menu nie mieścił się w 390px i wypychał treść poza ekran. */
  .ia-header .ia-phone { display: none; }
}

/* ---------------------------------------------- menu mobilne (panel boczny) */

/* `<dialog>` rozciągnięty na cały ekran robi za tło; sam panel wysuwa się
   z prawej krawędzi. Dzięki temu backdrop łapie kliknięcia poza panelem. */
.ia-menu {
  /* Zaczepienie o cztery krawędzie, nie `width/height: 100%`. Procent liczy się
     od bloku zawierającego, który przy elemencie w warstwie wierzchniej potrafi
     wypaść węższy od okna - panel odklejał się wtedy od prawej krawędzi. */
  inset: 0;
  width: auto;
  max-width: none;
  height: auto;
  max-height: none;
  margin: 0;
  padding: 0;
  border: 0;
  background: transparent;
  overflow: hidden;
}
/* Fokus przenosimy na panel, żeby żaden przycisk nie dostał obwódki po
   dotknięciu. Sam panel jest kontenerem - obwódka na nim niczego nie niesie. */
.ia-menu:focus,
.ia-menu:focus-visible,
.ia-menu__panel:focus,
.ia-menu__panel:focus-visible { outline: none; }
.ia-menu::backdrop { background: rgba(46, 19, 56, .55); }

.ia-menu__panel {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: auto;
  width: min(86vw, 380px);
  max-width: 100%;
  display: flex;
  flex-direction: column;
  gap: var(--wp--preset--spacing--50);
  padding: var(--wp--preset--spacing--40) var(--wp--preset--spacing--50)
           calc(var(--wp--preset--spacing--60) + env(safe-area-inset-bottom));
  background: var(--wp--preset--color--linen);
  box-shadow: var(--wp--preset--shadow--lg);
  overflow-y: auto;
  overscroll-behavior: contain;
  /* Stan zamknięty; klasę `is-open` dokłada JS w następnej klatce po showModal(),
     żeby przeglądarka zdążyła policzyć start animacji. */
  transform: translateX(100%);
  transition: transform var(--wp--custom--duration--slow) var(--ia-ease);
}
.ia-menu.is-open .ia-menu__panel { transform: translateX(0); }

.ia-menu__head { display: flex; align-items: center; justify-content: flex-end; }

.ia-menu__list { display: grid; margin: 0; padding: 0; list-style: none; }
.ia-menu__list a {
  display: flex;
  align-items: center;
  min-height: 52px;             /* cel dotykowy z zapasem */
  border-bottom: 1px solid var(--wp--preset--color--sand);
  font-family: var(--wp--preset--font-family--heading);
  font-size: var(--wp--preset--font-size--lg);
  font-weight: 600;
  color: var(--wp--preset--color--purple-deep);
  text-decoration: none;
}
.ia-menu__list li:first-child a { border-top: 1px solid var(--wp--preset--color--sand); }
.ia-menu__list a:hover { color: var(--wp--preset--color--purple); }
.ia-menu__list a[aria-current] { color: var(--wp--preset--color--purple); }
.ia-menu__list a[aria-current]::before {
  content: "";
  width: 3px;
  align-self: stretch;
  margin-right: var(--wp--preset--spacing--20);
  background: var(--wp--preset--color--purple);
  border-radius: 2px;
}

.ia-menu__foot { display: grid; gap: var(--wp--preset--spacing--30); margin-top: auto; }
.ia-menu__cta { width: 100%; justify-content: center; }
.ia-menu__kontakt {
  display: grid;
  gap: 2px;
  margin: var(--wp--preset--spacing--20) 0 0;
  padding: 0;
  list-style: none;
}
.ia-menu__kontakt a {
  display: flex;
  align-items: center;
  min-height: 44px;
  font-size: var(--wp--preset--font-size--sm);
  color: var(--wp--preset--color--purple);
}
.ia-menu__social { margin-top: var(--wp--preset--spacing--20); }

@media (prefers-reduced-motion: reduce) {
  .ia-menu__panel { transition: none; }
}

/* --------------------------------------------- przycisk menu i hamburger */

.ia-menu-toggle {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  min-height: 44px;
  padding: 0;
  border: 0;
  background: transparent;
  color: var(--wp--preset--color--white);   /* nad hero */
  cursor: pointer;
}
.ia-menu-toggle__label {
  font-family: var(--wp--preset--font-family--heading);
  font-size: var(--wp--preset--font-size--sm);
  font-weight: 600;
  line-height: 1;
  transition: font-size var(--ia-dur) var(--ia-ease), color var(--ia-dur) var(--ia-ease);
}

/* Po przewinięciu i na podstronach: atrament i większa etykieta. */
.ia-header.is-solid .ia-menu-toggle,
body:not(.home) .ia-header .ia-menu-toggle { color: var(--wp--preset--color--ink); }
.ia-header.is-solid .ia-menu-toggle__label,
body:not(.home) .ia-header .ia-menu-toggle__label { font-size: var(--wp--preset--font-size--lg); }

/* Hamburger na trzech kreskach — `currentColor`, więc kolor bierze z przycisku. */
.ia-burger { position: relative; display: block; width: 24px; height: 16px; flex: none; }
.ia-burger i {
  position: absolute;
  left: 0;
  right: 0;
  height: 2px;
  border-radius: 2px;
  background: currentColor;
  transition: top var(--ia-dur) var(--ia-ease),
              transform var(--ia-dur) var(--ia-ease),
              opacity var(--ia-dur) var(--ia-ease);
}
.ia-burger i:nth-child(1) { top: 0; }
.ia-burger i:nth-child(2) { top: 7px; }
.ia-burger i:nth-child(3) { top: 14px; }

/* Stan otwarty: skrajne kreski zjeżdżają na środek i krzyżują się, środkowa gaśnie. */
.ia-burger.is-x i:nth-child(1) { top: 7px; transform: rotate(45deg); }
.ia-burger.is-x i:nth-child(2) { opacity: 0; }
.ia-burger.is-x i:nth-child(3) { top: 7px; transform: rotate(-45deg); }

/* Wariant w panelu: ten sam przycisk, ale na lnie — zawsze atrament i duża
   etykieta. Stoi przy prawej krawędzi panelu, czyli tam, gdzie przed chwilą
   był przycisk w nagłówku; hamburger czyta się więc jako jeden element,
   który przekształcił się w krzyżyk. Reguła musi być PO `.ia-menu-toggle`,
   bo obie mają tę samą wagę i rozstrzyga kolejność. */
.ia-menu__close { color: var(--wp--preset--color--ink); }
.ia-menu__close .ia-menu-toggle__label { font-size: var(--wp--preset--font-size--lg); }

/* Przycisk „Menu” istnieje tylko poniżej progu nawigacji desktopowej. */
.ia-header .ia-menu-toggle { display: none; }
@media (max-width: 1149px) {
  .ia-header .ia-menu-toggle { display: inline-flex; }
}

/* ---------------------------------------------------------------- stopka */

/* Nawigacje w stopce to teraz wzorce PHP z gołymi <a> - blok nawigacji
   WordPressa dawał im wcześniej własną kolumnę flex. */
.ia-footer .ia-header__nav,
.ia-footer__nav { display: flex; flex-direction: column; gap: var(--wp--preset--spacing--30); white-space: normal; font-weight: 400; }
/* Blok nawigacji WordPressa zdejmował podkreślenie i kolor sam z siebie;
   gołe <a> dziedziczą globalny styl odnośnika, więc trzeba to powtórzyć. */
.ia-footer :is(.ia-header__nav, .ia-footer__nav) a { color: inherit; text-decoration: none; }
.ia-footer :is(.ia-header__nav, .ia-footer__nav) a:hover { color: var(--wp--preset--color--purple); }

/* Ta sama oś co nagłówek i sekcje: pełna szerokość okna plus margines strony. */
.ia-footer { padding-inline: var(--ia-gutter); }

/* ------------------------------------------------------------ okno zgód */

/* Panel przy dolnej krawędzi, nad paskiem kontaktu. Nie modal: nie blokuje
   czytania strony, bo zgoda ma być decyzją, a nie przeszkodą - ale nie da się
   go przewinąć poza ekran, więc trudno go przeoczyć. */
.ia-zgody {
  position: fixed;
  inset: auto 0 0;
  z-index: 70;
  padding: var(--ia-gutter);
  padding-bottom: calc(var(--ia-gutter) + env(safe-area-inset-bottom));
  transform: translateY(110%);
  transition: transform var(--wp--custom--duration--slow) var(--ia-ease);
}
.ia-zgody.is-open { transform: none; }
.ia-zgody__panel {
  max-width: 44rem;
  /* Z rozwiniętymi kategoriami panel przerastał ekran telefonu i obcinał się
     u góry - stąd limit wysokości i własne przewijanie. */
  max-height: calc(100dvh - var(--ia-bar-h) - 2 * var(--ia-gutter));
  overflow-y: auto;
  margin-inline: auto;
  padding: var(--wp--preset--spacing--50);
  background: var(--wp--preset--color--white);
  border: 1px solid var(--wp--preset--color--sand);
  border-radius: var(--ia-radius-md);
  box-shadow: var(--wp--preset--shadow--lg);
}
.ia-zgody__tytul { margin: 0 0 var(--wp--preset--spacing--30); font-size: var(--wp--preset--font-size--lg); }
.ia-zgody__tytul:focus-visible { outline: 2px solid var(--wp--preset--color--purple); outline-offset: 4px; }
.ia-zgody__tekst { margin: 0; font-size: var(--wp--preset--font-size--sm); }

.ia-zgody__opcje { display: grid; gap: var(--wp--preset--spacing--30); margin-top: var(--wp--preset--spacing--40); }
.ia-zgody__opcja { display: grid; grid-template-columns: auto 1fr; gap: 12px; align-items: start; font-size: var(--wp--preset--font-size--sm); }
.ia-zgody__opcja input { margin-top: 3px; width: 18px; height: 18px; accent-color: var(--wp--preset--color--purple); }
.ia-zgody__opcja strong { display: block; }

.ia-zgody__akcje { display: flex; flex-wrap: wrap; align-items: center; gap: var(--wp--preset--spacing--30); margin-top: var(--wp--preset--spacing--40); }
.ia-zgody__link {
  min-height: 44px;
  padding: 0 4px;
  border: 0;
  background: none;
  color: var(--wp--preset--color--purple);
  font-size: var(--wp--preset--font-size--sm);
  font-weight: 600;
  text-decoration: underline;
  cursor: pointer;
}

/* Link powrotu w stopce wygląda jak reszta odnośników w kolumnie. */
.ia-zgody__wroc {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  padding: 0;
  border: 0;
  background: none;
  color: inherit;
  font: inherit;
  text-align: left;
  cursor: pointer;
}
.ia-zgody__wroc:hover { color: var(--wp--preset--color--purple); }

/* Na telefonie okno zgód stanęłoby na przyklejonym pasku kontaktu. */
@media (max-width: 899px) {
  .ia-zgody { bottom: calc(var(--ia-bar-h) + 8px); }
}

@media (prefers-reduced-motion: reduce) {
  .ia-zgody { transition: none; }
}

/* -------------------------------------------------- sticky pasek kontaktu */

/* Dwa wiersze: „Zadzwoń” i WhatsApp po połowie, „Napisz” na całą szerokość.
   Trzy przyciski w jednej linii mieściły się na 390px tylko na styk, a etykiety
   robiły się nieczytelne. Przyciski są niższe niż standardowe 44px, żeby drugi
   wiersz nie zabrał treści więcej miejsca, niż daje wygoda trafiania w cel.
   Wysokość paska mieszka w `--ia-bar-h` (theme.json) - z tego samego tokenu
   liczy się odstęp treści, pozycja okna zgód i podpisu w lightboksie. */
.ia-contact-bar {
  --ia-cta-h: 36px;
  --ia-cta-gap: 6px;
  --ia-cta-pad: 5px;
  position: fixed;
  inset: auto 0 0;
  z-index: 60;
  display: none;
  grid-template-columns: 1fr 1fr;
  gap: var(--ia-cta-gap);
  padding: var(--ia-cta-pad) 8px calc(var(--ia-cta-pad) + env(safe-area-inset-bottom));
  background: var(--wp--preset--color--purple-deep);
}
.ia-contact-bar a {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: var(--ia-cta-h);
  border-radius: var(--ia-radius-pill);
  font-size: var(--wp--preset--font-size--sm);
  font-weight: 700;
  text-decoration: none;
}
/* „Napisz” zawsze w drugim wierszu, na całą szerokość. */
.ia-contact-bar a:last-child { grid-column: 1 / -1; }
/* Bez numeru WhatsAppa zostają dwa przyciski - wtedy każdy bierze cały wiersz,
   zamiast zostawiać dziurę w prawej kolumnie. */
.ia-contact-bar a:first-child:nth-last-child(2) { grid-column: 1 / -1; }
.ia-contact-bar a:first-child { background: var(--wp--preset--color--white); color: var(--wp--preset--color--purple-deep); }
.ia-contact-bar a:last-child { background: var(--wp--preset--color--purple); color: var(--wp--preset--color--white); }
/* Zieleń WhatsAppa - to znak rozpoznawczy aplikacji, a nie kolor marki zagrody,
   więc trzymamy go poza paletą motywu i używamy tylko tutaj. */
.ia-contact-bar__wa { gap: 6px; background: #25D366; color: #0B141A; }
.ia-contact-bar__wa .ia-wa__ikona { width: 18px; height: 18px; }

/* --- WhatsApp ------------------------------------------------------------- */

.ia-wa {
  display: inline-flex;
  align-items: center;
  gap: var(--wp--preset--spacing--20);
  color: inherit;
  text-decoration: none;
}
.ia-wa .ia-wa__ikona { color: #25D366; flex: none; }
.ia-wa span { text-decoration: underline; text-decoration-color: color-mix(in srgb, currentColor 40%, transparent); text-underline-offset: 3px; }
.ia-wa:hover span { text-decoration-color: currentColor; }
.ia-wa.ia-btn { justify-content: center; }
.ia-wa.ia-btn span { text-decoration: none; }
@media (max-width: 899px) {
  .ia-contact-bar { display: grid; }
  /* Odstęp bierzemy z tokenu, nie z przepisanych na nowo liczb: 5 + 36 + 6 + 36
     + 5 = 88px. Przy jednym rachunku w dwóch miejscach zawsze któryś się
     rozjeżdża i treść wchodzi pod pasek. */
  body { padding-bottom: calc(var(--ia-bar-h) + env(safe-area-inset-bottom)); }
}

/* ------------------------------------------------------------- przyciski */

.ia-btn {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  min-height: 48px;
  padding-inline: 26px;
  border: 0;
  border-radius: var(--ia-radius-pill);
  font-family: var(--wp--preset--font-family--body);
  font-size: var(--wp--preset--font-size--sm);
  font-weight: 600;
  text-decoration: none;
  cursor: pointer;
  transition: background var(--ia-dur) var(--ia-ease), color var(--ia-dur) var(--ia-ease);
}
.ia-btn--primary { background: var(--wp--preset--color--purple); color: var(--wp--preset--color--white); }
.ia-btn--primary:hover { background: var(--wp--preset--color--purple-dark); }
.ia-btn--primary:active { background: var(--wp--preset--color--purple-deep); }
.ia-btn--secondary { background: transparent; color: var(--wp--preset--color--purple); box-shadow: inset 0 0 0 2px var(--wp--preset--color--purple); }
.ia-btn--secondary:hover { background: var(--wp--preset--color--purple-tint); }
.ia-btn--ghost { background: transparent; color: var(--wp--preset--color--ink); }
.ia-btn--ghost:hover { background: var(--wp--preset--color--linen-2); }
.ia-btn--on-photo { background: rgba(255, 255, 255, .14); color: var(--wp--preset--color--white); box-shadow: inset 0 0 0 2px rgba(255, 255, 255, .75); }
.ia-btn--on-photo:hover { background: rgba(255, 255, 255, .26); }
.ia-btn[aria-disabled="true"] { opacity: .45; pointer-events: none; }
@media (max-width: 599px) { .ia-btn { min-height: 52px; width: 100%; justify-content: center; } }

/* Wariant bloku przycisku dla treści na zdjęciu — ten sam wygląd co .ia-btn--on-photo. */
.wp-block-button.is-style-outline-on-photo .wp-block-button__link {
  background: rgba(255, 255, 255, .14);
  color: var(--wp--preset--color--white);
  box-shadow: inset 0 0 0 2px rgba(255, 255, 255, .75);
}
.wp-block-button.is-style-outline-on-photo .wp-block-button__link:hover { background: rgba(255, 255, 255, .26); }

.ia-link-arrow {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  color: var(--wp--preset--color--purple);
  font-weight: 600;
  text-decoration: none;
  border-bottom: 2px solid var(--wp--preset--color--purple-light);
  padding-bottom: 2px;
  transition: border-color var(--ia-dur) var(--ia-ease);
}
.ia-link-arrow:hover { border-color: var(--wp--preset--color--purple); }

/* ----------------------------------------------------------------- hero */

/* Treść hero siada na tej samej osi co sekcje (1240px + margines strony),
   dzięki czemu H1 jest w jednej linii z nagłówkami niżej. */
.ia-hero .wp-block-cover__inner-container {
  width: 100%;
  padding-inline: var(--ia-gutter);
}
.ia-hero__content { max-width: 780px; }

/* Dodatkowy scrim od dołu — sam `dimRatio` równomiernie przygasza całe zdjęcie,
   a tekst potrzebuje kontrastu właśnie pod sobą (DS: „tekst na zdjęciu wymaga scrimu”). */
.ia-hero::after {
  content: "";
  position: absolute;
  inset: auto 0 0;
  height: 62%;
  background: linear-gradient(0deg, rgba(38, 35, 34, .72) 0%, rgba(38, 35, 34, .28) 55%, transparent 100%);
  pointer-events: none;
  /* Nad przyciemnieniem `dimRatio` (span tła ma z-index 1), pod treścią. */
  z-index: 2;
}
.ia-hero .wp-block-cover__inner-container { position: relative; z-index: 3; }

/* --------------------------------------------------- nagłówek podstrony */

/* Ta sama siatka co sekcje, żeby H1 stał w jednej osi z nagłówkami niżej.
   Górny padding musi ominąć przyklejony nagłówek — dlatego niesie go
   nagłówek strony, a nie <main>: inaczej tło mech zaczynałoby się za nisko. */
.ia-page-head {
  display: grid;
  grid-template-columns: var(--ia-track);
  padding-block: var(--wp--preset--spacing--100) var(--wp--preset--spacing--70);
}
.ia-page-head > * { grid-column: wide; }

/* Mech wg DS zarezerwowany dla alpakoterapii i przyrody. */
.ia-page-head--moss { background: var(--wp--preset--color--moss-tint); }

.ia-page-title { margin: 0; font-size: var(--wp--preset--font-size--4-xl); letter-spacing: -0.015em; }
.ia-page-lead {
  margin: var(--wp--preset--spacing--40) 0 0;
  max-width: 60ch;
  font-size: var(--wp--preset--font-size--lg);
}

/* Kontenery w szablonach. Pełna szerokość okna minus margines strony —
   bez sufitu 1240px. Prosty padding zamiast siatki, bo te grupy trzymają
   kolumny i wzorce, które i tak mają zająć całą dostępną szerokość. */
.ia-wrap { padding-inline: var(--ia-gutter); }
/* Lead i pojedyncze akapity nadal z miarą do czytania. */
.ia-wrap > .wp-block-post-excerpt,
.ia-wrap > p { max-width: var(--ia-content); }

/* Blok węższy z założenia — formularz zapytania. */
.ia-narrow { padding-inline: var(--ia-gutter); }
.ia-narrow > * { max-width: var(--ia-content); }

/* Treść strony na tej samej osi co H1. WordPressowy układ „constrained”
   wyśrodkowuje kolumnę 760px, przez co nagłówek stał na 100px, a akapity
   na 340px. DS mówi wprost: nic nie jest wyśrodkowane poza hero i pasem CTA. */
main > .wp-block-post-content,
main.ia-legal {
  display: grid;
  grid-template-columns: var(--ia-track);
  padding-inline: 0;   /* `has-global-padding` dokładałby swoje */
}
main > .wp-block-post-content > *,
main.ia-legal > * {
  grid-column: wide;
  max-width: var(--ia-content);
  /* `margin-inline: 0` nie wystarczało — WordPress domyka układ „constrained”
     automatycznymi marginesami i akapit lądował na środku toru. Jawne
     `auto` po prawej zjada wolne miejsce i dosuwa treść do lewej. */
  margin-inline: 0 auto;
  justify-self: start;
}
/* Na stronach prawnych `post-content` jest dzieckiem `main.ia-legal`, które
   już trzyma tor — bez tego margines strony liczyłby się dwa razy i akapity
   odjeżdżały o kolejne 64px względem H1. */
main.ia-legal > .wp-block-post-content {
  display: block;
  padding-inline: 0;
  max-width: var(--ia-content);
}

main > .wp-block-post-content > .alignwide,
main.ia-legal > .alignwide { max-width: none; justify-self: stretch; }
main > .wp-block-post-content > .alignfull,
main.ia-legal > .alignfull { grid-column: full; max-width: none; justify-self: stretch; }

/* Dwa łamy w treści stron z nagłówkiem-zdjęciem. Miara 760px zajmowała na
   desktopie połowę okna i zostawiała po prawej pustkę; rozbicie na łamy
   wypełnia wiersz, nie wydłużając linii tekstu ponad czytelne ~70 znaków. */
/* Sekcja treści pod nagłówkiem-zdjęciem: równy oddech u góry i u dołu.
   Odstęp niesie wyłącznie padding kontenera. Marginesy pionowe akapitów są
   wyzerowane, bo margines ostatniego z nich doliczał się do dolnej krawędzi
   i sekcja przestawała być symetryczna. */
main > .wp-block-post-content.ia-prose-2col { padding-block: var(--wp--preset--spacing--90); }
.ia-prose-2col > * { margin-block: 0; }
.ia-prose-2col > * + * { margin-top: var(--wp--preset--spacing--40); }
.ia-prose-2col > * + :is(h2, h3) { margin-top: var(--wp--preset--spacing--70); }

@media (min-width: 900px) {
  /* Łamy muszą siedzieć na kontenerze, nie na jego dzieciach — `columns` na
     akapicie rozbija ten jeden akapit na dwie kolumny, a nie całą treść.
     Dlatego kontener przestaje tu być siatką i sam trzyma margines strony. */
  main > .wp-block-post-content.ia-prose-2col {
    display: block;
    padding-inline: var(--ia-gutter);
    columns: 2;
    column-gap: var(--wp--preset--spacing--80);
  }
  main > .wp-block-post-content.ia-prose-2col > * {
    max-width: none;
    margin-inline: 0;
  }
  /* Nagłówek zaczyna łam, a nie kończy go osierocony na dole poprzedniego. */
  .ia-prose-2col :is(h2, h3) { break-after: avoid; break-inside: avoid; }
  .ia-prose-2col p, .ia-prose-2col ul { break-inside: avoid; }
}

/* Zdjęcie wiodące usługi zajmowało 91% okna i spychało tytuł poniżej zgięcia.
   70% wystarcza, żeby niosło stronę, a nagłówek został widoczny. */
@media (min-width: 900px) {
  .ia-usluga-foto { width: 70vw; max-width: 100%; }
}

/* --------------------------------------------------------------- sekcje */

/* Wzorce PHP renderują się poza układem bloków WordPressa, więc kontener
   muszą mieć własny. Siatka z nazwanymi torami zamiast `margin-inline: auto`
   na dzieciach: tło zostaje pełnoszerokie, treść trzyma się 1240px,
   a węższe bloki (nagłówek sekcji, lead) zostają dosunięte do lewej —
   „nic nie jest wyśrodkowane poza hero i paskiem CTA”. */
.ia-section,
.ia-services,
.ia-reasons {
  display: grid;
  grid-template-columns: var(--ia-track);
  padding-block: var(--wp--preset--spacing--90);
}
.ia-section > *,
.ia-services > *,
.ia-reasons > * { grid-column: wide; }

.ia-section > .is-full,
.ia-services > .is-full { grid-column: full; }

.ia-section--tint { background: var(--wp--preset--color--linen-2); }
.ia-section--moss { background: var(--wp--preset--color--moss-tint); }
.ia-section-head { max-width: 56ch; margin-bottom: var(--wp--preset--spacing--60); }
.ia-kicker {
  display: flex;
  align-items: center;
  gap: 12px;
  margin: 0 0 12px;
  font-size: var(--wp--preset--font-size--xs);
  font-weight: 600;
  letter-spacing: .16em;
  text-transform: uppercase;
  color: var(--wp--preset--color--purple);
}
/* Krótka kreska przed nadtytułem — jedyny powtarzalny ozdobnik w serwisie.
   `currentColor` sprawia, że nad hero (tekst biały) sama robi się biała. */
.ia-kicker::before {
  content: "";
  flex: none;
  width: 28px;
  height: 2px;
  background: currentColor;
}
.ia-section-title { margin: 0; font-size: var(--wp--preset--font-size--3-xl); }
.ia-section-foot { margin-top: var(--wp--preset--spacing--60); }
@media (max-width: 899px) { .ia-section { padding-block: var(--wp--preset--spacing--80); } }
@media (max-width: 599px) { .ia-section { padding-block: var(--wp--preset--spacing--70); } }

/* ----------------------------------------------------------- karty usług */

.ia-card-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: var(--wp--preset--spacing--50);
  margin: 0;
  padding: 0;
  list-style: none;
}
@media (max-width: 1023px) { .ia-card-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 649px) { .ia-card-grid { grid-template-columns: minmax(0, 1fr); } }

.ia-card {
  display: flex;
  flex-direction: column;
  background: var(--wp--preset--color--white);
  border-radius: var(--ia-radius-md);
  overflow: hidden;
  box-shadow: var(--wp--preset--shadow--sm);
  transition: box-shadow var(--ia-dur) var(--ia-ease), transform var(--ia-dur) var(--ia-ease);
}
.ia-card:hover { box-shadow: var(--wp--preset--shadow--md); transform: translateY(-2px); }
.ia-card__media { display: block; aspect-ratio: 4 / 3; background: var(--wp--preset--color--sand); }
.ia-card__media img { width: 100%; height: 100%; object-fit: cover; display: block; }
.ia-card__body { display: flex; flex-direction: column; gap: var(--wp--preset--spacing--40); padding: var(--wp--preset--spacing--50); }
/* Karty w siatce mają równą wysokość, ale treść nie — przy różnej długości
   leadu przyciski stały na różnych poziomach. Ciało karty rozciąga się na całą
   wysokość, a blok ceny (razem z CTA pod nim) dosuwamy do dołu.
   Tylko od progu, na którym siatka jest wielokolumnowa — w jednej kolumnie
   nie ma czego wyrównywać, a rozciągnięta karta zostawiałaby pustą przestrzeń. */
@media (min-width: 650px) {
  .ia-card-grid .ia-card__body { flex: 1; }
  .ia-card-grid .ia-card__price { margin-top: auto; }
}
.ia-card__title { margin: 0; font-size: var(--wp--preset--font-size--xl); }
.ia-card__title a { color: inherit; text-decoration: none; }
.ia-card__lead { margin: 0; font-size: var(--wp--preset--font-size--sm); }
.ia-card__meta {
  display: grid;
  grid-template-columns: auto 1fr;
  gap: 6px var(--wp--preset--spacing--40);
  margin: 0;
  padding-block: var(--wp--preset--spacing--40);
  border-block: 1px solid var(--wp--preset--color--sand);
  font-size: var(--wp--preset--font-size--sm);
}
.ia-card__meta dt { color: var(--wp--preset--color--muted); }
.ia-card__meta dd { margin: 0; }
.ia-card__price { display: flex; align-items: baseline; gap: 6px; margin: 0; }
/* Słońce to jedyny kolor palety, któremu DS przypisał zadanie („ceny, nowość,
   voucher”), a projekt go nie używał. Podkreślenie pod samą kwotą — nie kolor
   tekstu, bo tego DS zabrania — i tylko na kartach, żeby zostać w progu <5%. */
.ia-card__price strong {
  font-size: var(--wp--preset--font-size--2-xl);
  color: var(--wp--preset--color--purple-deep);
  text-decoration: underline;
  text-decoration-color: var(--wp--preset--color--sun);
  text-decoration-thickness: 3px;
  text-underline-offset: 5px;
}
.ia-card__price-from, .ia-card__price-unit { font-size: var(--wp--preset--font-size--sm); color: var(--wp--preset--color--muted); }
.ia-card__badge {
  position: absolute;
  inset: 14px auto auto 14px;
  padding: 7px 14px;
  border-radius: var(--ia-radius-pill);
  background: var(--wp--preset--color--moss);
  color: var(--wp--preset--color--white);
  font-size: var(--wp--preset--font-size--xs);
  font-weight: 600;
  letter-spacing: .08em;
  text-transform: uppercase;
}

/* -------------------------------------------------------------- cennik */

.ia-pricing { width: 100%; border-collapse: collapse; background: var(--wp--preset--color--white); border: 1px solid var(--wp--preset--color--sand); }
.ia-pricing caption { text-align: left; padding: var(--wp--preset--spacing--50) var(--wp--preset--spacing--50) 0; font-family: var(--wp--preset--font-family--heading); font-size: var(--wp--preset--font-size--lg); color: var(--wp--preset--color--purple-deep); }
.ia-pricing th {
  text-align: left;
  padding: 14px var(--wp--preset--spacing--50);
  background: var(--wp--preset--color--linen-2);
  border-bottom: 2px solid var(--wp--preset--color--sand);
  font-size: var(--wp--preset--font-size--xs);
  letter-spacing: .1em;
  text-transform: uppercase;
  color: var(--wp--preset--color--graphite);
}
.ia-pricing td { padding: var(--wp--preset--spacing--40) var(--wp--preset--spacing--50); border-bottom: 1px solid var(--wp--preset--color--sand); }
.ia-pricing tbody tr:hover { background: var(--wp--preset--color--linen); }
.ia-pricing .is-amount { text-align: right; font-weight: 700; color: var(--wp--preset--color--purple-deep); white-space: nowrap; }
.ia-pricing .is-group-head { background: var(--wp--preset--color--purple-tint); font-size: var(--wp--preset--font-size--xs); letter-spacing: .1em; text-transform: uppercase; color: var(--wp--preset--color--purple-dark); font-weight: 600; }
.ia-pricing-note { margin: 0; padding: var(--wp--preset--spacing--40) var(--wp--preset--spacing--50); background: var(--wp--preset--color--linen-2); font-size: var(--wp--preset--font-size--xs); color: var(--wp--preset--color--muted); }

/* Cennik to teraz kilka tabel pod sobą — jedna na usługę.
   Wyłącznie `row-gap`: `gap` zabrałoby też odstęp między kolumnami toru
   `--ia-track`, przez co marginesy strony urosłyby o szerokość odstępu. */
.ia-pricing-list { row-gap: var(--wp--preset--spacing--60); }
/* Bez `display: flex` — nadpisanie `display: table-caption` wyrzuca podpis
   z pozycji nagłówka tabeli i ląduje on pod wierszem <thead>. */
.ia-pricing caption { padding-bottom: var(--wp--preset--spacing--30); }
.ia-pricing caption a { color: inherit; }
/* Czas trwania stoi obok nazwy usługi, nie w osobnej kolumnie: dotyczy całej
   tabeli, a nie pojedynczego wariantu ceny. */
.ia-pricing__time {
  margin-left: var(--wp--preset--spacing--30);
  font-family: var(--wp--preset--font-family--body);
  font-size: var(--wp--preset--font-size--xs);
  letter-spacing: .1em;
  text-transform: uppercase;
  color: var(--wp--preset--color--muted);
}
.ia-pricing__cell { display: block; }
.ia-pricing__note { display: block; margin-top: 2px; font-size: var(--wp--preset--font-size--xs); color: var(--wp--preset--color--muted); }
.ia-pricing__unit { font-weight: 400; color: var(--wp--preset--color--muted); }

/* mobile: wiersze jako karty */
@media (max-width: 699px) {
  .ia-pricing thead { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); }
  .ia-pricing tr { display: grid; gap: 4px; padding: var(--wp--preset--spacing--40); border-bottom: 1px solid var(--wp--preset--color--sand); }
  .ia-pricing td { display: grid; grid-template-columns: 10ch 1fr; gap: 12px; padding: 2px 0; border: 0; }
  .ia-pricing td::before { content: attr(data-label); color: var(--wp--preset--color--muted); font-size: var(--wp--preset--font-size--xs); }
  .ia-pricing .is-amount { text-align: left; }
}

/* -------------------------------------------------------------- galeria */

.ia-gallery-filters { display: flex; flex-wrap: wrap; gap: 10px; margin-bottom: var(--wp--preset--spacing--50); }
/* Na telefonie zawijane chipy kończyły każdy wiersz w innym miejscu - siedem
   nazw o różnej długości dawało poszarpaną prawą krawędź. Dwie równe kolumny
   porządkują listę bez skracania etykiet. */
@media (max-width: 599px) {
  .ia-gallery-filters { display: grid; grid-template-columns: 1fr 1fr; }
  .ia-gallery-filters .ia-chip { justify-content: center; padding-inline: 10px; text-align: center; }
}
.ia-chip {
  display: inline-flex;
  align-items: center;
  min-height: 40px;
  padding-inline: 18px;
  border: 1px solid var(--wp--preset--color--sand);
  border-radius: var(--ia-radius-sm);
  background: var(--wp--preset--color--white);
  color: var(--wp--preset--color--ink);
  font-size: var(--wp--preset--font-size--sm);
  font-weight: 600;
  text-decoration: none;
  transition: background var(--ia-dur) var(--ia-ease), border-color var(--ia-dur) var(--ia-ease);
}
.ia-chip:hover { background: var(--wp--preset--color--purple-tint); border-color: var(--wp--preset--color--purple); }
.ia-chip[aria-current] { background: var(--wp--preset--color--purple); border-color: transparent; color: var(--wp--preset--color--white); }

.ia-gallery { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--wp--preset--spacing--40); margin: 0; padding: 0; list-style: none; }
@media (max-width: 899px) { .ia-gallery { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
@media (max-width: 599px) { .ia-gallery { grid-template-columns: repeat(2, minmax(0, 1fr)); } }

/* Wariant do wąskiej kolumny (galeria usługi obok boxu „W skrócie”). */
.ia-gallery--tight { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--wp--preset--spacing--30); }
/* Na telefonie trzy kafle w rzędzie schodzą poniżej 100px — za mało, żeby
   cokolwiek na zdjęciu rozpoznać. Dwa dają czytelny kadr. */
@media (max-width: 599px) { .ia-gallery--tight { grid-template-columns: repeat(2, minmax(0, 1fr)); } }

/* Kafel: `overflow: hidden` na odnośniku, żeby powiększany obrazek nie wychodził
   poza zaokrąglenie. Skaluje się obrazek, nie kafel — sąsiedzi zostają na miejscu. */
.ia-gallery__item {
  display: block;
  position: relative;
  overflow: hidden;
  border-radius: var(--ia-radius-md);
  background: var(--wp--preset--color--sand);
  cursor: zoom-in;
}
.ia-gallery img {
  width: 100%;
  /* Jak przy zdjęciu nakładanym: atrybut height="540" bije `aspect-ratio`,
     więc kafle wychodziły prostokątne zamiast kwadratowych. */
  height: auto;
  aspect-ratio: 1;
  object-fit: cover;
  display: block;
  transition: transform 420ms var(--ia-ease), filter 420ms var(--ia-ease);
}
.ia-gallery__item::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg, transparent 45%, rgba(46, 19, 56, .55) 100%);
  opacity: 0;
  transition: opacity var(--ia-dur) var(--ia-ease);
}
.ia-gallery__zoom {
  position: absolute;
  right: 10px;
  bottom: 10px;
  z-index: 1;
  display: grid;
  place-items: center;
  width: 36px;
  height: 36px;
  border-radius: 50%;
  background: var(--wp--preset--color--linen);
  color: var(--wp--preset--color--purple-deep);
  opacity: 0;
  transform: translateY(8px) scale(.9);
  transition: opacity var(--ia-dur) var(--ia-ease), transform var(--ia-dur) var(--ia-ease);
}
/* `:hover` tylko tam, gdzie istnieje wskaźnik — na dotyku stan najazdu potrafi
   zostać przyklejony po tapnięciu. Fokus działa wszędzie (nawigacja klawiaturą). */
@media (hover: hover) {
  .ia-gallery__item:hover img { transform: scale(1.06); }
  .ia-gallery__item:hover::after { opacity: 1; }
  .ia-gallery__item:hover .ia-gallery__zoom { opacity: 1; transform: none; }
}
.ia-gallery__item:focus-visible img { transform: scale(1.06); }
.ia-gallery__item:focus-visible::after { opacity: 1; }
.ia-gallery__item:focus-visible .ia-gallery__zoom { opacity: 1; transform: none; }

/* Galeria usługi stoi w kolumnie tekstu, więc ma własny, lżejszy nagłówek. */
.ia-service-gallery { margin-block: var(--wp--preset--spacing--60); }
.ia-service-gallery__title {
  margin: 0 0 var(--wp--preset--spacing--40);
  font-size: var(--wp--preset--font-size--xl);
}

/* Podmiana kategorii bez przeładowania: stare kafle gasną, nowe wjeżdżają
   kaskadą. Opóźnienie startu niesie zmienna ustawiana z JS. */
.ia-gallery.is-ladowanie { opacity: .25; pointer-events: none; transition: opacity 180ms var(--ia-ease); }
.ia-gallery { transition: opacity 180ms var(--ia-ease); }

@keyframes ia-kafel-wchodzi {
  from { opacity: 0; transform: translateY(14px) scale(.97); }
  to   { opacity: 1; transform: none; }
}
.ia-gallery li.is-wchodzi {
  animation: ia-kafel-wchodzi 340ms var(--ia-ease) both;
  animation-delay: var(--ia-opoznienie, 0ms);
}

.ia-gallery__blad {
  grid-column: 1 / -1;
  padding: var(--wp--preset--spacing--50);
  background: var(--wp--preset--color--linen-2);
  border-radius: var(--ia-radius-md);
  color: var(--wp--preset--color--muted);
  font-size: var(--wp--preset--font-size--sm);
}

@media (prefers-reduced-motion: reduce) {
  .ia-gallery, .ia-gallery.is-ladowanie { transition: none; }
  .ia-gallery li.is-wchodzi { animation: none; }
}

/* ------------------------------------------------------------- lightbox */

.ia-lightbox {
  width: 100%;
  max-width: none;
  height: 100%;
  max-height: none;
  margin: 0;
  padding: 0;
  border: 0;
  background: transparent;
  overflow: hidden;
}
.ia-lightbox::backdrop { background: rgba(38, 35, 34, .92); }
.ia-lightbox__stage {
  position: absolute;
  inset: 0;
  display: grid;
  place-items: center;
  padding: clamp(3.5rem, 8vw, 6rem) clamp(1rem, 6vw, 5rem);
  /* `touch-action: pan-y` zostawia przeglądarce pionowe przewijanie,
     a nam poziomy gest — bez tego na telefonie gubione są zdarzenia pointer. */
  touch-action: pan-y;
}
.ia-lightbox img {
  max-width: 100%;
  max-height: 100%;
  /* Element siatki ma domyślnie `min-height: auto`, co dla obrazka oznacza jego
     rozmiar własny — a minimum wygrywa z maksimum. Bez tego zdjęcie nie dawało
     się zmniejszyć do wysokości pola i wychodziło poza dolny padding,
     przez co wyglądało na odsunięte ku górze. */
  min-width: 0;
  min-height: 0;
  border-radius: var(--ia-radius-lg);
  box-shadow: var(--wp--preset--shadow--lg);
  transform: translateX(var(--ia-drag, 0)) scale(1);
  opacity: 1;
  transition: transform 180ms var(--ia-ease), opacity 180ms var(--ia-ease);
  cursor: grab;
  user-select: none;
}
/* W trakcie przeciągania obrazek ma iść za palcem natychmiast. */
.ia-lightbox__stage.is-dragging img { transition: none; cursor: grabbing; }

/* Otwarcie: przygaszenie i lekkie przybliżenie. */
.ia-lightbox:not(.is-open) img { opacity: 0; transform: scale(.96); }

/* Zmiana zdjęcia — wyjście w jedną stronę, wejście z drugiej. */
.ia-lightbox__stage.is-out-left  img { opacity: 0; transform: translateX(-40px); }
.ia-lightbox__stage.is-out-right img { opacity: 0; transform: translateX(40px); }
.ia-lightbox__stage.is-in-left   img { opacity: 0; transform: translateX(-40px); transition: none; }
.ia-lightbox__stage.is-in-right  img { opacity: 0; transform: translateX(40px); transition: none; }

.ia-lightbox__btn {
  position: absolute;
  z-index: 2;
  display: grid;
  place-items: center;
  width: 48px;
  height: 48px;
  padding: 0;
  border: 1px solid rgba(250, 248, 244, .28);
  border-radius: 50%;
  background: rgba(38, 35, 34, .55);
  color: var(--wp--preset--color--white);
  cursor: pointer;
  transition: background var(--ia-dur) var(--ia-ease), border-color var(--ia-dur) var(--ia-ease);
}
.ia-lightbox__btn:hover { background: var(--wp--preset--color--purple); border-color: transparent; }
.ia-lightbox__btn--close { top: clamp(.75rem, 3vw, 1.5rem); right: clamp(.75rem, 3vw, 1.5rem); }
.ia-lightbox__btn--prev,
.ia-lightbox__btn--next { top: 50%; transform: translateY(-50%); }
.ia-lightbox__btn--prev { left: clamp(.5rem, 3vw, 1.5rem); }
.ia-lightbox__btn--next { right: clamp(.5rem, 3vw, 1.5rem); }
/* Pojedyncze zdjęcie nie ma dokąd nawigować. */
.ia-lightbox:not(.has-nav) .ia-lightbox__btn--prev,
.ia-lightbox:not(.has-nav) .ia-lightbox__btn--next,
.ia-lightbox:not(.has-nav) .ia-lightbox__counter { display: none; }

.ia-lightbox__counter,
.ia-lightbox__caption {
  position: absolute;
  left: 50%;
  transform: translateX(-50%);
  margin: 0;
  max-width: min(90vw, 60ch);
  text-align: center;
  color: rgba(250, 248, 244, .82);
  font-size: var(--wp--preset--font-size--xs);
}
.ia-lightbox__counter { top: clamp(1rem, 3vw, 1.75rem); letter-spacing: .12em; }
.ia-lightbox__caption { bottom: clamp(1rem, 3vw, 1.75rem); }

/* Na mobile przy dolnej krawędzi stoi przyklejony pasek kontaktu. Jest wprawdzie
   przygaszony backdropem, ale podpis wypadał dokładnie na nim i robił się
   nieczytelny — dlatego i podpis, i zdjęcie omijają tę wysokość. */
@media (max-width: 899px) {
  /* Lightbox nie rośnie razem z paskiem CTA. Pasek dostał drugi wiersz i 88px,
     ale zdjęcie nie ma powodu się o to kurczyć - zostawiamy odstęp, przy którym
     ustawialiśmy podpis i strzałki. */
  .ia-lightbox { --ia-bar-h: 56px; }
  .ia-lightbox__caption { bottom: calc(var(--ia-bar-h) + .75rem); }
  /* Odstęp musi być symetryczny: strzałki stoją na 50% wysokości okna, więc
     samo powiększenie dolnego paddingu podnosiło zdjęcie, a strzałki zostawały
     niżej niż jego środek. */
  .ia-lightbox__stage { padding-block: calc(var(--ia-bar-h) + 2.5rem); }
}

@media (prefers-reduced-motion: reduce) {
  .ia-lightbox img, .ia-gallery img, .ia-gallery__zoom { transition: none; }
}

/* ----------------------------------------------------------------- FAQ */

.ia-faq { background: var(--wp--preset--color--white); border-radius: var(--ia-radius-md); overflow: hidden; box-shadow: var(--wp--preset--shadow--sm); }
.ia-faq details + details { border-top: 1px solid var(--wp--preset--color--sand); }
.ia-faq summary { padding: 18px var(--wp--preset--spacing--50); cursor: pointer; font-weight: 600; font-size: var(--wp--preset--font-size--base); color: var(--wp--preset--color--purple-deep); list-style: none; }
.ia-faq summary::-webkit-details-marker { display: none; }
.ia-faq p { margin: 0; padding: 0 var(--wp--preset--spacing--50) var(--wp--preset--spacing--50); }

/* ------------------------------------------------------------- opinie */

.ia-quote {
  display: flex;
  flex-direction: column;
  gap: var(--wp--preset--spacing--40);
  height: 100%;
  margin: 0;
  background: var(--wp--preset--color--white);
  border-radius: var(--ia-radius-md);
  padding: var(--wp--preset--spacing--60);
  box-shadow: var(--wp--preset--shadow--sm);
}
/* Cytat idzie krojem tekstowym w rozmiarze akapitu: nagłówkowy `xl` przy
   czterech zdaniach czytał się jak śródtytuł, a nie jak wypowiedź gościa. */
.ia-quote__tresc {
  margin: 0;
  font-family: var(--wp--preset--font-family--body);
  font-size: var(--wp--preset--font-size--base);
  font-weight: 400;
  line-height: 1.6;
  color: var(--wp--preset--color--ink);
  text-wrap: pretty;
}
.ia-quote__zrodlo {
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: var(--wp--preset--font-size--xs);
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--wp--preset--color--muted);
}
.ia-logo-google { flex: none; display: block; }
.ia-quote__ocena { margin: 0; font-size: var(--wp--preset--font-size--lg); line-height: 1; color: var(--wp--preset--color--sun); letter-spacing: .08em; }
.ia-quote footer { display: flex; align-items: center; gap: 14px; margin-top: auto; font-size: var(--wp--preset--font-size--sm); }
.ia-quote__avatar { display: inline-flex; align-items: center; justify-content: center; flex: none; width: 44px; height: 44px; border-radius: var(--ia-radius-pill); background: var(--wp--preset--color--purple-tint); color: var(--wp--preset--color--purple); font-weight: 700; }
.ia-quote__meta { display: block; color: var(--wp--preset--color--muted); }

/* ---------------------------------------------------------- karuzela */

/* Przewijanie natywne ze snapem - bez JS działa gest i kółko myszy, skrypt
   dokłada tylko strzałki i kropki. Slajd ma stałą część szerokości, więc
   następna karta zawsze wystaje i widać, że jest co przewijać. */
/* `min-width: 0` i `overflow: hidden` na opakowaniu, nie tylko na torze:
   przy emulacji urządzenia mobilnego przeglądarka liczyła szerokość układu
   z intrinsic width toru (cztery slajdy = 1248px) i rozciągała viewport
   z 390 do 1093px, przez co nagłówek uciekał poza ekran. */
.ia-karuzela { position: relative; min-width: 0; max-width: 100%; overflow: hidden; }
.ia-karuzela__tor {
  max-width: 100%;
  min-width: 0;
  display: flex;
  gap: var(--wp--preset--spacing--50);
  margin: 0;
  padding: 4px 0;
  list-style: none;
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  scroll-behavior: smooth;
  scrollbar-width: none;
}
.ia-karuzela__tor::-webkit-scrollbar { display: none; }
.ia-karuzela__slajd { flex: 0 0 min(86%, 24rem); scroll-snap-align: start; }
@media (min-width: 700px)  { .ia-karuzela__slajd { flex-basis: calc((100% - var(--wp--preset--spacing--50)) / 2); } }
@media (min-width: 1100px) { .ia-karuzela__slajd { flex-basis: calc((100% - 2 * var(--wp--preset--spacing--50)) / 3); } }

.ia-karuzela__ster { display: flex; align-items: center; gap: var(--wp--preset--spacing--30); margin-top: var(--wp--preset--spacing--50); }
.ia-karuzela__btn {
  display: grid;
  place-items: center;
  width: 44px;
  height: 44px;
  padding: 0;
  border: 1px solid var(--wp--preset--color--sand);
  border-radius: 50%;
  background: var(--wp--preset--color--white);
  color: var(--wp--preset--color--purple-deep);
  cursor: pointer;
  transition: background var(--ia-dur) var(--ia-ease), border-color var(--ia-dur) var(--ia-ease), opacity var(--ia-dur) var(--ia-ease);
}
.ia-karuzela__btn:hover:not(:disabled) { background: var(--wp--preset--color--purple); border-color: transparent; color: var(--wp--preset--color--white); }
.ia-karuzela__btn:disabled { opacity: .35; cursor: default; }

.ia-karuzela__kropki { display: flex; gap: 8px; }
.ia-karuzela__kropka {
  width: 8px;
  height: 8px;
  padding: 0;
  border: 0;
  border-radius: 50%;
  background: var(--wp--preset--color--sand);
  cursor: pointer;
  transition: background var(--ia-dur) var(--ia-ease), transform var(--ia-dur) var(--ia-ease);
}
.ia-karuzela__kropka[aria-current="true"] { background: var(--wp--preset--color--purple); transform: scale(1.35); }

@media (prefers-reduced-motion: reduce) {
  .ia-karuzela__tor { scroll-behavior: auto; }
}

/* ------------------------------------------------------- godziny, mapa */

.ia-hours { display: grid; grid-template-columns: 1fr auto; margin: 0; font-size: var(--wp--preset--font-size--sm); }
.ia-hours dt, .ia-hours dd { padding-block: 10px; margin: 0; border-bottom: 1px solid var(--wp--preset--color--sand); }
.ia-hours dd { text-align: right; }
.ia-hours dt { color: var(--wp--preset--color--muted); }
.ia-hours .is-today, .ia-hours .is-today + dd { color: var(--wp--preset--color--purple-deep); font-weight: 700; }
.ia-note { margin: var(--wp--preset--spacing--40) 0 0; padding: 14px 16px; background: var(--wp--preset--color--moss-tint); border-radius: var(--ia-radius-sm); font-size: var(--wp--preset--font-size--sm); }

.ia-map { position: relative; aspect-ratio: 16 / 9; border-radius: var(--ia-radius-lg); overflow: hidden; background: var(--wp--preset--color--moss-tint); }
.ia-map iframe { width: 100%; height: 100%; border: 0; }
.ia-map__consent { position: absolute; inset: 0; display: grid; place-content: center; gap: 16px; padding: var(--wp--preset--spacing--50); text-align: left; }
/* Gondola wypełnia pole zgody, które inaczej jest pustą płachtą mchu.
   Mech na mech-tincie — kontrast celowo niski, ma być tłem, nie treścią. */
.ia-gondola {
  width: 132px;
  height: auto;
  color: var(--wp--preset--color--moss);
  opacity: .5;
}
@media (max-width: 599px) { .ia-gondola { display: none; } }

/* --------------------------------------------------------- formularze */

/* Styl pod markup Contact Form 7: CF7 owija każde pole w
   `span.wpcf7-form-control-wrap`, więc etykieta i input NIE są rodzeństwem
   w prostym układzie — stąd wcześniejsze rozjazdy. */

/* Wartości odczytane wprost z `design-reference.html` (§Komponenty):
   pole 48px / radius 8 / tło len / obrys 1px piasek, „Liczba osób” 120px,
   przycisk pełną szerokością i 52px, karta biała z promieniem 14 i cieniem sm. */

.ia-form {
  max-width: var(--ia-content);
  background: var(--wp--preset--color--white);
  border-radius: var(--ia-radius-md);
  padding: 28px;
  box-shadow: var(--wp--preset--shadow--sm);
}
.ia-form .wpcf7 { margin: 0; }
.ia-form .wpcf7-form > p,
.ia-form .wpcf7-form > div { margin: 0 0 var(--wp--preset--spacing--50); }
.ia-form .wpcf7-form > p:last-of-type { margin-bottom: 0; }

/* Etykieta jako blok. Wcześniej była siatką, przez co dopisek przy etykiecie
   lądował w osobnym wierszu jako kolejny rząd siatki. */
.ia-form label {
  display: block;
  margin-bottom: 6px;
  font-size: var(--wp--preset--font-size--sm);
  font-weight: 600;
  color: var(--wp--preset--color--ink);
}

/* Opakowanie CF7 musi być blokiem, inaczej input nie ma czego wypełnić
   i zostaje przy swojej domyślnej, krótkiej szerokości. */
.ia-form .wpcf7-form-control-wrap { display: block; }

.ia-form :is(input[type="text"], input[type="tel"], input[type="email"], input[type="date"], input[type="number"], select, textarea) {
  /* Bez tego padding i obrys doliczają się do wymiaru: pole rosło do 50px
     zamiast 48, wychodziło poza kartę, a „Liczba osób” miała 150px zamiast 120. */
  box-sizing: border-box;
  width: 100%;
  height: 48px;
  padding: 0 14px;
  border: 1px solid var(--wp--preset--color--sand);
  border-radius: var(--ia-radius-sm);
  background: var(--wp--preset--color--linen);
  font-family: inherit;
  font-size: var(--wp--preset--font-size--base);
  font-weight: 400;
  color: var(--wp--preset--color--ink);
}
.ia-form textarea { height: auto; min-height: 120px; padding: 12px 14px; }
.ia-form :is(input, select, textarea)::placeholder { color: var(--wp--preset--color--muted); }
.ia-form :is(input, select, textarea):focus {
  border-color: var(--wp--preset--color--purple);
  outline: 2px solid var(--wp--preset--color--purple);
  outline-offset: 1px;
}

/* Telefon i preferowany dzień w parze — tak jak w DS. */
.ia-form__row { display: grid; grid-template-columns: 1fr 1fr; gap: var(--wp--preset--spacing--40); }
.ia-form__row > p { margin: 0 !important; }
@media (max-width: 599px) { .ia-form__row { grid-template-columns: 1fr; gap: var(--wp--preset--spacing--50); } }

/* „Liczba osób” to pole na dwie cyfry — pełna szerokość wyglądałaby na pomyłkę. */
.ia-field--narrow .wpcf7-form-control-wrap { max-width: 120px; }

/* Zgoda RODO: checkbox i tekst z linkiem do polityki prywatności. */
.ia-form__consent .wpcf7-list-item { margin: 0; }
.ia-form__consent label {
  display: flex;
  gap: 12px;
  align-items: flex-start;
  margin: 0;
  font-weight: 400;
}
.ia-form__consent .wpcf7-list-item-label {
  font-size: var(--wp--preset--font-size--xs);
  line-height: 1.5;
  color: var(--wp--preset--color--muted);
}
.ia-form__consent a { color: var(--wp--preset--color--purple); }
.ia-form input[type="checkbox"] {
  flex: none;
  width: 18px;
  height: 18px;
  margin-top: 2px;
  accent-color: var(--wp--preset--color--purple);
}

/* Przycisk na pełną szerokość karty — wprost z DS. */
.ia-form__submit { margin-top: var(--wp--preset--spacing--50) !important; }
.ia-form input[type="submit"] { width: 100%; min-height: 52px; justify-content: center; }

/* Komunikaty CF7 w kolorach stanu błędu z theme.json. */
.ia-form .wpcf7-not-valid-tip {
  display: block;
  margin-top: 6px;
  font-size: var(--wp--preset--font-size--xs);
  color: var(--wp--custom--error--text);
}
.ia-form :is(input, select, textarea).wpcf7-not-valid { border-color: var(--wp--custom--error--line); background: var(--wp--custom--error--bg); }
/* CF7 stylizuje komunikat per stan (`form.invalid` itd.) i jego arkusz ładuje się
   po motywie — przy równej wadze wygrywał kolejnością i krawędź robiła się
   żółta, 2px. Stąd selektory ze stanem, mocniejsze niż wtyczkowe. */
.ia-form .wpcf7 form .wpcf7-response-output,
.ia-form .wpcf7 form.invalid .wpcf7-response-output,
.ia-form .wpcf7 form.unaccepted .wpcf7-response-output,
.ia-form .wpcf7 form.failed .wpcf7-response-output,
.ia-form .wpcf7 form.aborted .wpcf7-response-output,
.ia-form .wpcf7 form.spam .wpcf7-response-output {
  margin: var(--wp--preset--spacing--40) 0 0;
  padding: 12px 14px;
  border: 0;
  border-left: 3px solid var(--wp--custom--error--line);
  border-radius: var(--ia-radius-sm);
  background: var(--wp--custom--error--bg);
  font-size: var(--wp--preset--font-size--sm);
  color: var(--wp--custom--error--text);
}
/* Sukces mchem, nie zielenią systemową — mech jest w palecie, ta zieleń nie. */
.ia-form .wpcf7 form.sent .wpcf7-response-output {
  border-left-color: var(--wp--preset--color--moss);
  background: var(--wp--preset--color--moss-tint);
  color: var(--wp--preset--color--ink);
}
.ia-form .wpcf7-spinner { margin-left: 12px; }

/* ------------------------------------------------- karty na stronie usługi */

/* Bez `position: sticky` — box urósł o cenę i „co w cenie”, więc przyklejony
   do nagłówka potrafił być wyższy niż okno i chować własny dół. */
.ia-facts__part { padding-top: var(--wp--preset--spacing--40); border-top: 1px solid var(--wp--preset--color--sand); }
.ia-facts__title {
  margin: 0 0 var(--wp--preset--spacing--30);
  font-family: var(--wp--preset--font-family--heading);
  font-size: var(--wp--preset--font-size--xs);
  font-weight: 600;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--wp--preset--color--purple);
}
.ia-facts__list { margin: 0; padding-left: 1.1em; display: grid; gap: 8px; font-size: var(--wp--preset--font-size--sm); }
/* Listy definicji mają własne obramowanie z góry i z dołu — sensowne, gdy stoją
   samotnie na karcie usługi, ale w tym boxie sąsiadowały z kreską nagłówka
   sekcji i linie zbierały się po dwie, trzy pod rząd. Wewnątrz „W skrócie”
   jedynym separatorem jest kreska nad tytułem sekcji. */
.ia-card--facts .ia-card__meta { margin: 0; padding-block: 0; border-block: 0; }
.ia-facts__part .ia-note { margin: 0; }

/* Kopia formularza w kolumnie obok faktów. */
.ia-form-block { margin-top: var(--wp--preset--spacing--50); }
.ia-form-block .ia-section-head { margin-bottom: var(--wp--preset--spacing--40); }
.ia-form-block .ia-section-title { font-size: var(--wp--preset--font-size--xl); }
.ia-form-block .ia-form { max-width: none; padding: var(--wp--preset--spacing--50); }

/* ------------------------------------------------- nagłówek ze zdjęciem */

/* Zdjęcie na spad z lewej, panel z tekstem z prawej. Panel nachodzi na zdjęcie
   zaokrąglonym rogiem — to jedyne miejsce w serwisie, gdzie dwa bloki na siebie
   wchodzą, i dlatego ta strona wygląda inaczej niż reszta. */
/* Nagłówek jest `position: fixed`, więc pierwsze 64px sekcji leżało pod nim.
   Górny margines panelu znikał wtedy z widoku i box wyglądał na dosunięty do
   paska, mimo że w liczbach był symetryczny. Odsuwamy całą sekcję o wysokość
   nagłówka - i tak jest on nieprzezroczysty, więc nic pod nim nie widać. */
.ia-feature { display: grid; margin-block-start: 0; padding-top: var(--ia-header-h-scrolled); }
/* `main` dostaje od WordPressa odstęp blockGap; tutaj zdjęcie ma zaczynać się
   dokładnie pod paskiem, więc odstęp znosimy - pion niesie padding sekcji. */
main.ia-main--feature { margin-block-start: 0; }

.ia-feature__media { position: relative; min-height: clamp(18rem, 52vw, 26rem); }
/* Bezwzględne pozycjonowanie, bo `height: 100%` w bloku o wysokości `auto`
   liczy się jak `auto` — zdjęcie narzucało wtedy sekcji swoje proporcje.
   Kwadratowy kadr alpakoterapii rozpychał ją przez to do 1423px wysokości. */
.ia-feature__photo {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

/* Drugie zdjęcie w lnianej ramce — ten sam koszyczek co pod logotypem.
   Lekki obrót, żeby nie wyglądało na przypadkowo przyklejony prostokąt. */
.ia-feature__inset {
  position: absolute;
  left: var(--ia-gutter);
  bottom: calc(var(--wp--preset--spacing--50) * -1);
  z-index: 2;
  width: clamp(7rem, 22vw, 11rem);
  margin: 0;
  padding: 8px;
  background: var(--wp--preset--color--linen);
  border-radius: var(--ia-radius-md);
  box-shadow: var(--wp--preset--shadow--md);
  transform: rotate(-2.5deg);
}
/* `height: auto` jest konieczne: atrybut height="540" z wp_get_attachment_image()
   działa jak reguła CSS i unieważnia `aspect-ratio` — ramka rosła do 540px. */
.ia-feature__inset img { display: block; width: 100%; height: auto; aspect-ratio: 4 / 3; object-fit: cover; border-radius: var(--ia-radius-sm); }

.ia-feature__panel {
  position: relative;
  display: grid;
  align-items: center;
  overflow: hidden;
  padding: var(--wp--preset--spacing--80) var(--ia-gutter);
  background: var(--wp--preset--color--linen-2);
  color: var(--wp--preset--color--ink);
}
.ia-feature--moss .ia-feature__panel { background: var(--wp--preset--color--moss-tint); }

/* Grzbiet górski jako znak wodny w dolnym rogu panelu. */
.ia-feature__ridge {
  position: absolute;
  right: 0;
  bottom: 0;
  width: min(70%, 26rem);
  height: auto;
  color: var(--wp--preset--color--purple);
  opacity: .16;
  pointer-events: none;
}

.ia-feature__text { position: relative; z-index: 1; max-width: 46ch; }
.ia-feature__title {
  margin: 0 0 var(--wp--preset--spacing--40);
  font-size: var(--wp--preset--font-size--4-xl);
  letter-spacing: -.02em;
}
.ia-feature__lead { margin: 0; font-size: var(--wp--preset--font-size--lg); }

/* Pasek faktów: liczba nad podpisem, oddzielony cienką linią. */
.ia-feature__fakty {
  display: flex;
  flex-wrap: wrap;
  gap: var(--wp--preset--spacing--60);
  margin: var(--wp--preset--spacing--60) 0 0;
  padding-top: var(--wp--preset--spacing--50);
  border-top: 1px solid var(--wp--preset--color--sand);
}
.ia-feature__fakty dt {
  font-family: var(--wp--preset--font-family--heading);
  font-size: var(--wp--preset--font-size--2-xl);
  font-weight: 700;
  line-height: 1;
  color: var(--wp--preset--color--purple);
}
.ia-feature__fakty dd {
  margin: 6px 0 0;
  font-size: var(--wp--preset--font-size--xs);
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--wp--preset--color--muted);
}

@media (min-width: 900px) {
  /* Zdjęcie idzie na całą szerokość okna, a panel z tekstem leży NA nim,
     dosunięty do prawej i odsunięty marginesem od góry, prawej i dołu —
     dzięki temu wokół panelu widać jeszcze kawałek fotografii.
     Oba elementy dzielą jedną komórkę siatki, więc nakładają się bez
     `position: absolute` i bez wypadania z przepływu. */
  .ia-feature { grid-template-columns: minmax(0, 1fr); }
  .ia-feature__media,
  .ia-feature__panel { grid-column: 1; grid-row: 1; }

  .ia-feature__media { min-height: clamp(26rem, 38vw, 34rem); }

  .ia-feature__panel {
    justify-self: end;
    align-self: stretch;
    width: min(46%, 38rem);
    /* Prawy margines równy marginesowi strony — panel stoi na tej samej osi
       co treść pod spodem. */
    margin: var(--wp--preset--spacing--60) var(--ia-gutter) var(--wp--preset--spacing--60) 0;
    padding: var(--wp--preset--spacing--70) var(--wp--preset--spacing--70);
    border-radius: var(--ia-radius-lg);
    box-shadow: 0 24px 60px rgba(38, 35, 34, .22);
  }

  /* Nakładka zostaje NA zdjęciu, przy lewej krawędzi — po lewej stronie panelu
     jest teraz najwięcej wolnej fotografii. */
  .ia-feature__inset { left: var(--ia-gutter); bottom: var(--wp--preset--spacing--70); }
}

/* Bez obrazka wyróżniającego zostaje sam panel — wtedy trzyma oś strony. */
.ia-feature--bez-foto { grid-template-columns: minmax(0, 1fr); }
.ia-feature--bez-foto .ia-feature__panel { margin-left: 0; border-radius: 0; box-shadow: none; }

@media (prefers-reduced-motion: reduce) {
  .ia-feature__inset { transform: none; }
}

/* ------------------------------------------------------ opinie w Google */

/* Wariant przyciskowy - pod karuzelą opinii i wszędzie, gdzie ma zachęcać. */
/* --- Adres z pinezką ------------------------------------------------------ */

/* Pinezka wisi w marginesie, a nie w strumieniu tekstu: druga linia adresu
   równa się wtedy z pierwszą, zamiast chować się pod ikoną. */
.ia-adres {
  display: grid;
  grid-template-columns: auto 1fr;
  align-items: start;
  gap: var(--wp--preset--spacing--20);
}
.ia-adres__pin {
  color: var(--wp--preset--color--purple);
  /* Wyrównanie do wysokości wersalika pierwszego wiersza, nie do jego pudełka. */
  margin-top: 0.15em;
  flex: none;
}
.ia-adres a {
  color: inherit;
  text-decoration-color: color-mix(in srgb, currentColor 40%, transparent);
  text-underline-offset: 3px;
}
.ia-adres a:hover { color: var(--wp--preset--color--purple); text-decoration-color: currentColor; }

.ia-google-opinie {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  min-height: 44px;
  padding: 0 var(--wp--preset--spacing--40);
  border: 1px solid var(--wp--preset--color--sand);
  border-radius: var(--ia-radius-pill);
  background: var(--wp--preset--color--white);
  color: var(--wp--preset--color--ink);
  font-size: var(--wp--preset--font-size--sm);
  font-weight: 600;
  text-decoration: none;
  transition: border-color var(--ia-dur) var(--ia-ease), box-shadow var(--ia-dur) var(--ia-ease);
}
.ia-google-opinie:hover { border-color: var(--wp--preset--color--purple); box-shadow: var(--wp--preset--shadow--sm); }

/* Wariant tekstowy - w stopce i w menu, gdzie przycisk konkurowałby z CTA. */
.ia-google-opinie--link {
  padding: 0;
  border: 0;
  background: none;
  color: inherit;
  font-weight: 400;
}
.ia-google-opinie--link:hover { box-shadow: none; color: var(--wp--preset--color--purple); }

/* W panelu menu odnośnik ma być celem na palec, nie drobnym linkiem. */
.ia-menu__foot .ia-google-opinie { min-height: 48px; }

/* ---------------------------------------------------------- nasze stado */

/* Karty w tym samym stylu co zdjęcia w galerii: prostokąt z zaokrągleniem,
   nie kółko. Imię leży NA kadrze, wsparte przyciemnieniem od dołu - inaczej
   biały tekst ginie na jasnej sierści. */
/* Stałe kolumny zamiast `auto-fill`: przy ośmiu alpakach automat układał
   sześć w pierwszym rzędzie i dwie sieroty w drugim. Cztery na rząd dają
   równe 4 + 4 i tak samo czyta się to przy dziewięciu czy dziesięciu. */
.ia-stado {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--wp--preset--spacing--40);
  margin: 0;
  padding: 0;
  list-style: none;
}
@media (min-width: 600px)  { .ia-stado { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
@media (min-width: 900px)  { .ia-stado { grid-template-columns: repeat(4, minmax(0, 1fr)); } }
.ia-stado__karta {
  position: relative;
  display: grid;
  overflow: hidden;
  aspect-ratio: 3 / 4;
  border-radius: var(--ia-radius-md);
  background: var(--wp--preset--color--sand);
  box-shadow: var(--wp--preset--shadow--sm);
  transition: transform var(--ia-dur) var(--ia-ease), box-shadow var(--ia-dur) var(--ia-ease);
}
.ia-stado__foto {
  grid-area: 1 / 1;
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  transition: transform 420ms var(--ia-ease);
}
@media (hover: hover) {
  /* Najazd odsłania portret: karta lekko się unosi, zdjęcie przybliża,
     a podpis zjeżdża w dół i gaśnie razem z przyciemnieniem - dzięki temu
     widać całą głowę, którą imię zasłaniało. Kafle bez zdjęcia zachowują
     podpis, bo pod nim nie ma czego odsłaniać. */
  .ia-stado__karta:hover { transform: translateY(-3px); box-shadow: var(--wp--preset--shadow--md); }
  .ia-stado__karta:hover .ia-stado__foto { transform: scale(1.07); }
  .ia-stado__karta:not(.ia-stado__karta--bez-foto):hover .ia-stado__podpis {
    opacity: 0;
    transform: translateY(45%);
  }
}

/* Kafel zastępczy: inicjał imienia, dopóki nie ma portretu. */
.ia-stado__karta--bez-foto { background: var(--wp--preset--color--purple-tint); }
.ia-stado__inicjal {
  grid-area: 1 / 1;
  display: grid;
  place-items: center;
  font-family: var(--wp--preset--font-family--heading);
  font-size: var(--wp--preset--font-size--4-xl);
  font-weight: 700;
  color: var(--wp--preset--color--purple-light);
}

.ia-stado__podpis {
  grid-area: 1 / 1;
  align-self: end;
  transition: opacity 260ms var(--ia-ease), transform 320ms var(--ia-ease);
  display: grid;
  gap: 2px;
  padding: var(--wp--preset--spacing--40) var(--wp--preset--spacing--30) var(--wp--preset--spacing--30);
  background: linear-gradient(180deg, transparent 0%, rgba(38, 35, 34, .78) 65%);
  color: var(--wp--preset--color--white);
}
.ia-stado__karta--bez-foto .ia-stado__podpis {
  background: none;
  color: var(--wp--preset--color--purple-deep);
}
.ia-stado__imie {
  font-family: var(--wp--preset--font-family--heading);
  font-size: var(--wp--preset--font-size--lg);
  line-height: 1.2;
}
.ia-stado__opis { font-size: var(--wp--preset--font-size--xs); opacity: .9; }

@media (prefers-reduced-motion: reduce) {
  /* Bez ruchu i bez chowania imienia - odsłonięcie portretu nie jest tu
     informacją, więc nic nie tracimy, rezygnując z efektu. */
  .ia-stado__foto,
  .ia-stado__karta,
  .ia-stado__podpis { transition: none; }
  .ia-stado__karta:hover { transform: none; }
  .ia-stado__karta:hover .ia-stado__foto { transform: none; }
  .ia-stado__karta:hover .ia-stado__podpis { opacity: 1; transform: none; }
}

/* ---------------------------------------------------------- trzy powody */

.ia-reasons { padding-block: var(--wp--preset--spacing--80); }
.ia-reasons__list {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: var(--wp--preset--spacing--70);
  margin: 0;
  padding: 0;
  list-style: none;
}
/* Cienka linia u góry każdej kolumny zamiast pustki — nadaje wierszowi rytm
   i wiąże trzy powody w jedną sekcję bez dodawania nagłówka. */
.ia-reason { border-top: 2px solid var(--wp--preset--color--sand); padding-top: var(--wp--preset--spacing--40); }
.ia-reason__icon {
  display: block;
  margin-bottom: var(--wp--preset--spacing--40);
  color: var(--wp--preset--color--graphite);   /* grafit wg DS — nie fiolet */
}
.ia-reason__title { margin: 0 0 10px; font-size: var(--wp--preset--font-size--lg); }
/* To jest treść, nie metadana — `muted` zarezerwowany dla podpisów, więc atrament. */
.ia-reason__text { margin: 0; max-width: 40ch; color: var(--wp--preset--color--ink); }

@media (max-width: 899px) {
  .ia-reasons__list { grid-template-columns: 1fr; gap: var(--wp--preset--spacing--50); }
}

/* -------------------------------------------------------- siatki sekcji */

.ia-services { padding-block: var(--wp--preset--spacing--90); }
.ia-columns { display: grid; grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr); gap: var(--wp--preset--spacing--60); }
.ia-cta-band__actions { display: flex; flex-wrap: wrap; gap: var(--wp--preset--spacing--30); align-items: center; }

@media (max-width: 899px) {
  .ia-columns { grid-template-columns: 1fr; }
  .ia-card--facts { position: static; }
}

/* ---------------------------------------------------------- pas CTA */

.ia-cta-band {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: var(--wp--preset--spacing--60);
  /* Pas jest pełnoszerokim tłem, ale treść trzyma się 1240px:
     na wąskich ekranach działa margines strony, na szerokich — wyśrodkowanie. */
  padding-block: var(--wp--preset--spacing--80);
  padding-inline: var(--ia-gutter);
  background: var(--wp--preset--color--purple-deep);
  color: var(--wp--preset--color--white);
  position: relative;
  overflow: hidden;
}
/* Kreska, nie sylwetka — logo klienta jest rysunkiem liniowym i pas ma mówić
   tym samym językiem. Dwie nakładające się linie dają głębię jak w znaku. */
.ia-cta-band__ridge {
  position: absolute;
  inset: auto 0 0;
  width: 100%;
  height: 130px;
  fill: none;
  stroke: var(--wp--preset--color--white);
  stroke-width: 2;
  stroke-linejoin: round;
  vector-effect: non-scaling-stroke;
  pointer-events: none;
}
.ia-cta-band__ridge-back { opacity: .10; }
.ia-cta-band__ridge-front { opacity: .20; }
.ia-cta-band > *:not(.ia-cta-band__ridge) { position: relative; z-index: 1; }
.ia-cta-band h2 { max-width: 34ch; margin: 0; color: var(--wp--preset--color--white); text-wrap: balance; }
.ia-cta-band .ia-btn--primary { background: var(--wp--preset--color--white); color: var(--wp--preset--color--purple-deep); }
.ia-cta-band .ia-btn--primary:hover { background: var(--wp--preset--color--purple-light); }

/* --------------------------------------------------- przełącznik języka */

/* --- Przełącznik języka ---------------------------------------------------
   Dwa warianty tego samego komponentu: zwinięty w nagłówku (mysz, kursor,
   mało miejsca) i rozłożony w panelu mobilnym (kciuk, dużo miejsca). */

.ia-lang ul { display: flex; margin: 0; padding: 0; list-style: none; }
.ia-lang a {
  display: flex;
  align-items: center;
  gap: 8px;
  border-radius: var(--ia-radius-pill);
  font-size: var(--wp--preset--font-size--sm);
  font-weight: 600;
  text-decoration: none;
  color: inherit;
}

/* -- wariant zwinięty (nagłówek) -- */

.ia-lang--rozwijany { position: relative; }
/* Ten sam schemat kolorów co przycisk „Menu” i ikony społecznościowe: biel nad
   zdjęciem hero, atrament po przewinięciu i na podstronach. */
.ia-header .ia-lang--rozwijany { color: var(--wp--preset--color--white); }
.ia-header.is-solid .ia-lang--rozwijany,
body:not(.home) .ia-header .ia-lang--rozwijany { color: var(--wp--preset--color--ink); }
.ia-lang--rozwijany summary {
  display: flex;
  align-items: center;
  gap: 6px;
  min-height: 36px;
  padding: 0 10px;
  border-radius: var(--ia-radius-pill);
  font-size: var(--wp--preset--font-size--sm);
  font-weight: 700;
  cursor: pointer;
  list-style: none;              /* Firefox rysuje trójkąt mimo ::-webkit- */
}
.ia-lang--rozwijany summary::-webkit-details-marker { display: none; }
.ia-lang--rozwijany summary:hover { background: color-mix(in srgb, currentColor 10%, transparent); }
.ia-lang--rozwijany .ia-lang__strzalka { transition: transform var(--wp--custom--duration--fast, .15s) ease; }
.ia-lang--rozwijany[open] .ia-lang__strzalka,
.ia-lang--rozwijany details[open] .ia-lang__strzalka { transform: rotate(180deg); }
.ia-lang--rozwijany ul {
  position: absolute;
  top: calc(100% + 8px);
  right: 0;
  z-index: 70;
  flex-direction: column;
  gap: 2px;
  min-width: 170px;
  padding: 6px;
  border-radius: var(--ia-radius-md, 14px);
  background: var(--wp--preset--color--white);
  box-shadow: var(--wp--preset--shadow--md);
  color: var(--wp--preset--color--purple-deep);
}
.ia-lang--rozwijany ul a { padding: 10px 12px; border-radius: 10px; }
.ia-lang--rozwijany ul a:hover { background: var(--wp--preset--color--linen); }
.ia-lang--rozwijany .ia-lang__skrot {
  min-width: 2.2em;
  font-variant-numeric: tabular-nums;
  letter-spacing: .04em;
  opacity: .65;
}
.ia-lang--rozwijany ul a[aria-current] { background: var(--wp--preset--color--purple); color: var(--wp--preset--color--white); }
.ia-lang--rozwijany ul a[aria-current] .ia-lang__skrot { opacity: .8; }

/* -- wariant rozłożony (panel mobilny) -- */

.ia-lang--listwa ul {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 8px;
}
.ia-lang--listwa a {
  justify-content: center;
  min-height: 48px;              /* cel dotykowy z zapasem */
  border: 1px solid var(--wp--preset--color--sand);
  color: var(--wp--preset--color--purple-deep);
}
.ia-lang--listwa .ia-lang__skrot { opacity: .55; }
.ia-lang--listwa a[aria-current] {
  border-color: transparent;
  background: var(--wp--preset--color--purple);
  color: var(--wp--preset--color--white);
}
.ia-lang--listwa a[aria-current] .ia-lang__skrot { opacity: .75; }

/* ------------------------------------------------------------- zdjęcia */

.ia-figure { margin: 0; }
.ia-figure img { width: 100%; height: auto; border-radius: var(--ia-radius-lg); display: block; }
.ia-figure figcaption { margin-top: 10px; font-size: var(--wp--preset--font-size--xs); color: var(--wp--preset--color--muted); }
.ia-scrim { position: absolute; inset: 0; background: var(--wp--preset--gradient--photo-scrim); pointer-events: none; }

/* ------------------------------------------------------ kontakt, social */

/* --------------------------------------------------- układ strony Kontakt */

/* Kolumny wyrównane do góry — bez tego krótsza (dane kontaktowe) rozciągałaby
   się na wysokość formularza i zostawiała pod sobą pustkę. */
.ia-contact-layout { align-items: flex-start; }
.ia-contact-layout .ia-contact-block { margin-top: var(--wp--preset--spacing--60); }
/* Formularz stoi w kolumnie, więc odstęp pionowy niesie już układ nadrzędny. */
.ia-form-block .ia-section-head { margin-bottom: var(--wp--preset--spacing--50); }
.ia-form-block .ia-form { max-width: none; }

@media (max-width: 899px) {
  .ia-contact-layout .ia-contact-block { margin-top: var(--wp--preset--spacing--50); }
}

/* Telefon jako nagłówek na stronie Kontakt — najważniejsza informacja na stronie. */
.ia-contact-phone {
  margin: 8px 0 12px;
  font-size: var(--wp--preset--font-size--3-xl);
  line-height: 1.05;
}
.ia-contact-phone a { color: var(--wp--preset--color--purple); text-decoration: none; }
.ia-contact-phone a:hover { color: var(--wp--preset--color--purple-dark); text-decoration: underline; }

.ia-legal-meta { gap: 6px; align-items: baseline; }
.ia-legal-meta p, .ia-legal-meta time { margin: 0; }

.ia-contact-block { font-style: normal; font-size: var(--wp--preset--font-size--sm); }
.ia-contact-block p { margin: 0 0 10px; }
.ia-contact-block a { color: var(--wp--preset--color--purple); }

/* Ikony marek zamiast etykiet tekstowych — decyzja klienta względem DS §10.
   Obszar dotykowy 44px zgodnie z wymogiem dostępności; nazwę serwisu
   niesie `aria-label`, więc czytnik ekranu nadal ją odczyta. */
.ia-social { display: flex; flex-wrap: wrap; gap: 8px; margin-top: var(--wp--preset--spacing--40); }
.ia-social a {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  border: 1px solid var(--wp--preset--color--sand);
  border-radius: 50%;
  background: var(--wp--preset--color--white);
  color: var(--wp--preset--color--graphite);
  text-decoration: none;
  transition: background var(--ia-dur) var(--ia-ease), border-color var(--ia-dur) var(--ia-ease), color var(--ia-dur) var(--ia-ease);
}
.ia-social a:hover {
  background: var(--wp--preset--color--purple-tint);
  border-color: var(--wp--preset--color--purple);
  color: var(--wp--preset--color--purple);
}

/* ============================================================================
   CELE DOTYKOWE NA MOBILE — na końcu pliku celowo.
   DS wymaga minimum 44px. Reguły bazowe komponentów (.ia-chip, .ia-phone…)
   stoją wyżej w pliku, więc przy równej wadze wygrywałyby kolejnością.
   Odnośniki w linii tekstu (np. „polityką prywatności” w zdaniu zgody)
   są z wymogu wyłączone — powiększenie rozbiłoby interlinię akapitu.
   ========================================================================== */

@media (max-width: 899px) {
  /* Nawigacja i listy w stopce */
  footer .wp-block-navigation a,
  footer .wp-block-list a,
  /* Telefon i e-mail w bloku kontaktu */
  .ia-contact-block a,
  /* Tytuły kart usług i pozycje cennika prowadzące do podstrony */
  .ia-card__title a,
  .ia-pricing a,
  /* Telefon jako nagłówek na stronie Kontakt */
  .ia-contact-phone a,
  /* Odnośniki ze strzałką stojące samodzielnie */
  .ia-link-arrow {
    display: inline-flex;
    align-items: center;
    min-height: 44px;
  }

  /* Filtry galerii */
  .ia-chip { min-height: 44px; }


  /* Przycisk „Pokaż więcej” i przyciski w treści */
  .ia-section-foot .ia-btn { min-height: 48px; }
}
