/* ============================================================
   CZYSTE HORYZONTY — premium B2B website
   Sage green · Roboto · ample whitespace · documentary feel
   ============================================================ */

/* ============================================================
   FONTY — hostowane u nas, nie z Google (przeniesione 2026-09-03)
   ------------------------------------------------------------
   Wcześniej trzy rodziny szły z fonts.googleapis.com przez proxy Cloudflare
   z nagłówkiem cache TTL 0: 120 kB pobierane od nowa przy KAŻDYM powrocie na
   stronę. Teraz pliki stoją w /fonts/ z rocznym, niezmiennym cache, a strona
   nie zależy od zewnętrznej usługi (to samo dotyczy zgodności z RODO).

   Pliki wycięte skryptem `scripts/fonts-subset.sh` — pełny łaciński zakres
   z polskimi znakami i typografią. Nazwa niesie wersję (`.v51`); podmiana
   kroju BEZ zmiany numeru byłaby niewidoczna dla wracających przez rok.
   ============================================================ */

/* Roboto — tekst strony. Waga 700 świadomie NIE jest ładowana: w całym
   arkuszu nie ma ani jednego `font-weight: 700`, ani jednego <strong>.
   Gdyby klient wpisał w panelu pogrubienie, przeglądarka je zasymuluje. */
@font-face {
  font-family: "Roboto";
  font-style: normal;
  font-weight: 300;
  font-display: swap;
  src: url("/fonts/roboto-300.v51.woff2") format("woff2");
}
@font-face {
  font-family: "Roboto";
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url("/fonts/roboto-400.v51.woff2") format("woff2");
}
@font-face {
  font-family: "Roboto";
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url("/fonts/roboto-500.v51.woff2") format("woff2");
}

/* Roboto Mono — etykiety, wskaźniki, nadtytuły */
@font-face {
  font-family: "Roboto Mono";
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url("/fonts/roboto-mono-400.v31.woff2") format("woff2");
}
@font-face {
  font-family: "Roboto Mono";
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url("/fonts/roboto-mono-500.v31.woff2") format("woff2");
}

/* Newsreader — serif nagłówkowy. Kursywa świadomie pominięta (strona jej
   nie używa). Waga 400 jest wstępnie ładowana w <head> — to hasło hero. */
@font-face {
  font-family: "Newsreader";
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url("/fonts/newsreader-400.v26.woff2") format("woff2");
}
@font-face {
  font-family: "Newsreader";
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url("/fonts/newsreader-500.v26.woff2") format("woff2");
}

:root {
  /* Sage palette (from Figma scrape) */
  --sage-50:  #f0f7f3;
  --sage-100: #d6e6dd;
  --sage-200: #96c8af;
  --sage-300: #879990;
  --sage-500: #619c7f;
  --sage-700: #5f8874;
  --sage-900: #325c48;

  /* Neutrals */
  --ink:        #131613;
  --ink-2:      #2a2d2a;
  --ink-muted:  #5a615b;
  --ink-subtle: #8a918b;
  --line:       #dfe3df;
  --line-soft:  #eef0ec;
  /* off-white zamiast czystej bieli — czysta #fff to amatorski tell (€15k) */
  --paper:      #fefdfb;
  --paper-warm: #faf8f3;
  --paper-tint: #f4f7f4;
  --night:      #0d0f0d;
  --night-2:    #14171a;

  /* Type */
  --font-display: "Roboto", system-ui, -apple-system, sans-serif;
  --font-mono:    "Roboto Mono", ui-monospace, "SF Mono", Menlo, monospace;
  --font-serif:   "Newsreader", "Newsreader-fallback", ui-serif, Georgia, serif;

  /* Motion — pełny słownik tokenów w warstwie „HORYZONT" na dole pliku
     (--ease-horizon/--ease-exit/--ease-drift + --dur-*). Bez aliasów. */

  /* Hero choreography (tweakable) — oś liczona od ZDJĘCIA ekranu ładowania
     (klasa html.hero-ready z site.js; do tego momentu animacje stoją
     wstrzymane; te same wartości czyta film.js dla osi GSAP): logo 0,1 s →
     złota nić ~1,0 s → litery frazy 1,35 s → słowa hasła 1,9 s (wynurzają się
     z rozmycia do ~3,9 s) → strzałka 3,9 s. Historia: 3,0 / 5,0 / 5,15 / 6,5 s
     od zera („za wolno"), potem 0,2 / 0,7 / 0,85 / 2,4 s („za szybko jak na
     premium") — Sebastian 2026-09-04 wieczór: „nikt się tu nie spieszy, ale
     klient nie może przescrollować zanim zobaczy napisy" → środek. */
  --hero-logo-delay: 100ms;
  --hero-tagline-delay: 1350ms;
  --hero-claim-delay: 1900ms;
  --hero-cue-delay: 3900ms;
  --hero-logo-duration: 1000ms; /* 1400 → 1000: LCP = koniec odsłonięcia logo (2,65 s → ~2 s) */
  --hero-tagline-duration: 1200ms;

  /* Layout */
  --container: 1280px;
  --container-narrow: 880px;
  --gutter: clamp(20px, 4vw, 56px);
  /* Skala odstępów (rytm 8px) + pionowy oddech sekcji */
  --space-1: 8px;
  --space-2: 16px;
  --space-3: 24px;
  --space-4: 32px;
  --space-6: 48px;
  --space-8: 64px;
  --space-12: 96px;
  --space-16: 128px;
  --section-pad: clamp(88px, 10vw, 136px);
  --section-pad-lg: clamp(104px, 12vw, 152px);
}

/* Strona jasna, bez wariantu ciemnego (ustalenie 2026-09-04) */
:root { color-scheme: light; }
* { box-sizing: border-box; min-width: 0; }
/* Pozwala animować block-size do słowa kluczowego `auto` (accordion FAQ) —
   przeglądarki bez wsparcia po prostu przełączają bez tranzycji. */
:root { interpolate-size: allow-keywords; }

/* Fallback-metrics dla Newsreader (anty-CLS na ~100px claimie hero i serif
   nagłówkach): Georgia dostrojona do metryk Newsreader, zanim webfont dojedzie. */
@font-face {
  font-family: "Newsreader-fallback";
  src: local("Georgia");
  size-adjust: 93.5%;
  ascent-override: 97%;
  descent-override: 26%;
  line-gap-override: 0%;
}
/* Defensive overflow guard — chroni przed wyjazdem treści poza viewport
   gdy klient edytuje długie stringi w CMS (np. tytuł benefit kart, KPI label). */
/* overflow-x: CLIP, nie hidden — hidden robi z <body> kontener przewijania i ZABIJA
   position: sticky w całym dokumencie (2026-09-16: film w „Jak działamy” nie przypinał
   się); clip tak samo ucina poziomy nadmiar, ale nie tworzy scrollportu */
html, body { overflow-x: clip; max-width: 100vw; }
/* BEZ scroll-behavior:smooth — stroną scrolluje Lenis (gsap.ticker); natywne
   wygładzanie kotwic walczyłoby z silnikiem (podwójny easing). */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
  }
}

body {
  margin: 0;
  font-family: var(--font-display);
  font-weight: 400;
  font-size: 17px;
  line-height: 1.55;
  color: var(--ink);
  background: var(--paper);
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-rendering: optimizeLegibility;
}

img, video, svg { display: block; max-width: 100%; }
ul, ol { list-style: none; padding: 0; margin: 0; }
a { color: inherit; text-decoration: none; }
button { font: inherit; color: inherit; background: none; border: 0; cursor: pointer; }

/* Tekst wyłącznie dla czytników ekranu. Używany po rozbiciu nagłówka na linie
   lub słowa: widoczne fragmenty dostają aria-hidden, a pełne zdanie ląduje tutaj,
   żeby czytnik przeczytał je raz i naturalnie. Bez tego GSAP dokleja `aria-label`
   do <p>, co jest w ARIA zabronione i psuje ocenę dostępności ORAZ ocenę strony
   dla agentów AI (audyt „accessibility tree is not well-formed"). */
.sr-only {
  position: absolute;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden;
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

/* ── Skip link ─────────────────────────────────────────── */
.skip-link {
  position: absolute;
  top: -100px; left: 16px;
  background: var(--ink);
  color: var(--paper);
  padding: 12px 20px;
  border-radius: 4px;
  font-family: var(--font-mono);
  font-size: 12px;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  z-index: 1000;
  transition: top 200ms var(--ease-horizon);
}
.skip-link:focus { top: 16px; }

/* ── Containers ────────────────────────────────────────── */
.container {
  max-width: var(--container);
  margin: 0 auto;
  padding-inline: var(--gutter);
}
.container--narrow {
  max-width: var(--container-narrow);
  margin: 0 auto;
  padding-inline: var(--gutter);
}

/* ── Type primitives ───────────────────────────────────── */
.eyebrow {
  font-family: var(--font-mono);
  font-size: 11px;
  font-weight: 400;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  /* sage-800: 5.6:1 na białym (AA dla small-text; sage-700 miał 3.99 = FAIL) */
  color: var(--sage-800, #46705c);
  margin: 0 0 32px;
  display: flex;
  align-items: center;
  gap: 16px;
}
.eyebrow::before {
  content: "";
  display: inline-block;
  width: 32px;
  height: 1px;
  /* złota nić: ta sama linia co etykiety rozdziałów filmu i eyebrow księgi —
     jeden język od góry do dołu (zieleń zostaje interakcją) */
  background: var(--gold-400, #c7a45c);
}
.eyebrow--inverse {
  color: var(--gold-300, #e8c988);
}
.eyebrow--inverse::before {
  background: rgba(199, 164, 92, 0.6);
}

.display-1 {
  font-family: var(--font-display);
  font-weight: 300;
  font-size: clamp(2.5rem, 1.8rem + 3.2vw, 4.5rem);
  line-height: 1.05;
  letter-spacing: -0.025em;
  color: var(--ink);
  margin: 0 0 36px;
  text-wrap: balance;
}
.display-1--inverse { color: var(--paper); }

.display-2 {
  font-family: var(--font-display);
  font-weight: 300;
  font-size: clamp(2rem, 1.5rem + 2.2vw, 3.25rem);
  line-height: 1.1;
  letter-spacing: -0.022em;
  color: var(--ink);
  margin: 0 0 32px;
  text-wrap: balance;
  max-width: 22ch;
}
.display-2--inverse { color: var(--paper); }

.lead {
  font-size: clamp(1.0625rem, 0.95rem + 0.5vw, 1.25rem);
  font-weight: 300;
  line-height: 1.65;
  color: var(--ink-muted);
  margin: 0 0 48px;
  max-width: 56ch;
  text-wrap: pretty;
}
.lead--inverse { color: rgba(255, 255, 255, 0.78); }

.mono {
  font-family: var(--font-mono);
  font-feature-settings: "tnum" 1;
}

/* ── Buttons ───────────────────────────────────────────── */
.btn {
  display: inline-flex;
  align-items: center;
  gap: 12px;
  padding: 16px 28px;
  font-family: var(--font-display);
  font-size: 15px;
  font-weight: 400;
  letter-spacing: 0.01em;
  border-radius: 2px;
  /* bez `all`: przesuwanie do kursora (film.js initMagnetic) pisze transform
     inline i CSS-owa tranzycja transformu robiłaby z ruchu gumę */
  transition: background-color 240ms var(--ease-horizon), color 240ms var(--ease-horizon), border-color 240ms var(--ease-horizon), box-shadow 240ms var(--ease-horizon);
  white-space: nowrap;
}
.btn--primary {
  background: var(--ink);
  color: var(--paper);
  position: relative;
  overflow: hidden;
  isolation: isolate; /* ::before (zalewka) pod tekstem, nad tłem */
}
/* Ożywienie hoveru (2026-09-04): zielona zalewka wjeżdża od lewej pod tekst,
   strzałka odsuwa się w prawo; ruch samego przycisku (przysuwanie do kursora)
   robi film.js initMagnetic — dlatego tu NIE ma transformu na hover. */
.btn--primary::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  /* sage-800: biały tekst 5.6:1 (sage-700 dawał 3.99 = FAIL) */
  background: var(--sage-800, #46705c);
  transform: scaleX(0);
  transform-origin: left;
  transition: transform 460ms var(--ease-horizon);
}
.btn--primary:focus-visible::before { transform: scaleX(1); }
.btn > span[aria-hidden] {
  display: inline-block;
  transition: transform 320ms var(--ease-horizon);
}
@media (hover: hover) {
  .btn--primary:hover::before { transform: scaleX(1); }
  .btn:hover > span[aria-hidden] { transform: translateX(4px); }
}
/* Złoty hairline-glint: błysk przebiega po górnej krawędzi przy hoverze
   (compositor-only — transform na pseudo-elemencie) */
.btn--primary::after {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  width: 40%;
  height: 1px;
  background: linear-gradient(90deg, transparent, var(--gold-300, #e8c988), transparent);
  transform: translateX(-150%);
  transition: transform 600ms var(--ease-horizon);
  pointer-events: none;
}
.btn--primary:hover::after,
.btn--primary:focus-visible::after {
  transform: translateX(350%);
}
.btn--ghost {
  color: var(--ink);
  border-bottom: 1px solid var(--ink);
  border-radius: 0;
  padding: 6px 0 8px;
}
.btn--ghost:hover {
  color: var(--sage-700);
  border-color: var(--sage-700);
}
.btn--large { padding: 20px 36px; font-size: 16px; }

.cta-row {
  display: flex;
  flex-wrap: wrap;
  gap: 32px;
  align-items: center;
  margin-top: 8px;
}

/* ── Sticky header ─────────────────────────────────────── */
.hdr {
  position: fixed;
  top: 0; left: 0; right: 0;
  z-index: 100;
  /* Krycie 0,80 zamiast 0,88 — pasek przestaje być czarną belką nad kinem,
     a nadal trzyma AAA. Zmierzone na najgorszym przypadku (biel okna w kadrze
     klatki schodowej, bez uwzględniania rozmycia, czyli pesymistycznie):
     0,88 → 8,95:1 · 0,80 → 7,01:1 · 0,72 → 5,41:1 dla napisów nawigacji.
     Próg AAA to 7:1 i cała strona go trzyma, więc 0,72 odpada. */
  background: rgba(15, 18, 16, 0.80);
  backdrop-filter: saturate(160%) blur(18px);
  -webkit-backdrop-filter: saturate(160%) blur(18px);
  border-bottom: 1px solid rgba(255, 255, 255, 0.08);
  transform: translateY(-100%);
  transition: transform 420ms var(--ease-horizon);
}
.hdr[data-state="visible"] { transform: translateY(0); }

.hdr__inner {
  max-width: var(--container);
  margin: 0 auto;
  padding: 18px var(--gutter);
  display: grid;
  grid-template-columns: auto 1fr auto;
  align-items: center;
  gap: 32px;
}
.hdr__brand {
  display: inline-flex;
  align-items: center;
  gap: 13px;
}
.hdr__mark { height: 40px; width: 40px; display: block; }
.hdr__name {
  font-family: var(--font-display-serif, "Newsreader", Georgia, serif);
  font-weight: 500;
  font-size: 17.5px;
  letter-spacing: 0.012em;
  color: var(--white-soft, #f4f2ec);
  white-space: nowrap;
}

.hdr__nav {
  display: flex;
  gap: 36px;
  justify-content: center;
}
.hdr__nav a {
  font-size: 13px;
  font-weight: 400;
  color: rgba(255, 255, 255, 0.78);
  position: relative;
  padding: 4px 0;
  transition: color 200ms var(--ease-horizon);
}
.hdr__nav a::after {
  content: "";
  position: absolute;
  left: 0; right: 0; bottom: 0;
  height: 1px;
  background: var(--sage-700);
  transform: scaleX(0);
  transform-origin: left;
  transition: transform 200ms var(--ease-horizon);
}
.hdr__nav a:hover { color: var(--white-soft, #f4f2ec); }
.hdr__nav a:hover::after { transform: scaleX(1); }

.hdr__cta {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-size: 13px;
  font-weight: 500;
  color: #ffffff;
  padding: 11px 22px;
  border: 1px solid var(--sage-500);
  border-radius: 2px;
  background: transparent;
  position: relative;
  overflow: hidden;
  isolation: isolate;
  transition: color 200ms var(--ease-horizon), border-color 200ms var(--ease-horizon), background-color 200ms var(--ease-horizon);
}
/* zalewka od lewej (jak .btn--primary); przysuwanie do kursora = film.js */
.hdr__cta::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  /* sage-800: biel 13 px 5,5:1 (sage-700 = 3,99 — FAIL AA, uwaga adwokata diabła) */
  background: var(--sage-800, #46705c);
  transform: scaleX(0);
  transform-origin: left;
  transition: transform 380ms var(--ease-horizon);
}
.hdr__cta:focus-visible::before { transform: scaleX(1); }
.hdr__cta:focus-visible { color: #ffffff; border-color: var(--sage-500); }
.hdr__cta > span[aria-hidden] { display: inline-block; transition: transform 320ms var(--ease-horizon); }
@media (hover: hover) {
  .hdr__cta:hover::before { transform: scaleX(1); }
  .hdr__cta:hover { color: #ffffff; border-color: var(--sage-500); }
  .hdr__cta:hover > span[aria-hidden] { transform: translateX(3px); }
}

.hdr__menu { display: none; }

@media (max-width: 880px) {
  .hdr__nav, .hdr__cta { display: none; }
  .hdr__inner { grid-template-columns: auto 1fr; }
  .hdr__menu {
    display: flex;
    flex-direction: column;
    justify-content: center;
    gap: 5px;
    width: 28px;
    box-sizing: content-box;
    /* pole dotyku ≥44×44 bez zmiany wyglądu */
    padding: 14px;
    margin: -14px;
    justify-self: end;
  }
  .hdr__menu span {
    display: block;
    height: 1px;
    /* header jest ciemny (rgba(15,18,16,.88)) — kreski muszą być jasne */
    background: rgba(255, 255, 255, 0.92);
    transition: all 240ms var(--ease-horizon);
  }
  .hdr__menu[aria-expanded="true"] span:nth-child(1) { transform: translateY(6px) rotate(45deg); }
  .hdr__menu[aria-expanded="true"] span:nth-child(2) { opacity: 0; }
  .hdr__menu[aria-expanded="true"] span:nth-child(3) { transform: translateY(-6px) rotate(-45deg); }
  .hdr__mobile[hidden] { display: none !important; }
  /* Pełnoekranowe menu = „napisy filmu": noc + ziarno + serif + złota
     numeracja rozdziałów. Scroll strony pod spodem blokuje html.menu-open. */
  .hdr__mobile {
    /* UWAGA: .hdr ma transform (translateY) — fixed dziecka liczyłby się
       względem headera, nie viewportu. Absolute pod paskiem + svh działa. */
    position: absolute;
    top: 100%;
    left: 0;
    right: 0;
    height: calc(100svh - 76px); /* 76px = pasek headera (18+40+18) */
    background:
      url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.05'/%3E%3C/svg%3E"),
      var(--night, #0d0f0d);
    color: var(--white-soft, #f4f2ec);
    padding: 28px var(--gutter) calc(28px + env(safe-area-inset-bottom, 0px));
    display: flex;
    flex-direction: column;
    justify-content: space-between;
    overflow-y: auto;
    counter-reset: navchapter;
    opacity: 1;
    translate: 0 0;
    transition: opacity 320ms var(--ease-horizon), translate 320ms var(--ease-horizon);
    transition-behavior: allow-discrete;
  }
  @starting-style {
    .hdr__mobile { opacity: 0; translate: 0 -12px; }
  }
  html.menu-open { overflow: hidden; }
  .hdr__mobile a:not(.hdr__cta) {
    counter-increment: navchapter;
    display: flex;
    align-items: baseline;
    gap: 18px;
    font-family: var(--font-display-serif, "Newsreader", Georgia, serif);
    font-weight: 400;
    font-size: clamp(26px, 7.2vw, 32px);
    letter-spacing: -0.018em;
    color: var(--white-soft, #f4f2ec);
    padding: 13px 0;
    /* kurtyna: pozycje wchodzą kaskadą 0/60/120… ms (slot --i z markupu) */
    opacity: 1;
    translate: 0 0;
    transition:
      opacity 320ms var(--ease-horizon) calc(var(--i, 0) * 60ms),
      translate 320ms var(--ease-horizon) calc(var(--i, 0) * 60ms);
    transition-behavior: allow-discrete;
  }
  @starting-style {
    .hdr__mobile a:not(.hdr__cta) { opacity: 0; translate: 0 -10px; }
  }
  .hdr__cta--mobile {
    transition-delay: 240ms;
    transition-behavior: allow-discrete;
  }
  @starting-style {
    .hdr__cta--mobile { opacity: 0; translate: 0 -10px; }
  }
  .hdr__mobile a:not(.hdr__cta)::before {
    content: "0" counter(navchapter);
    font-family: var(--font-mono);
    font-size: 11px;
    letter-spacing: 0.18em;
    color: var(--gold-300, #e8c988);
    flex: none;
  }
  .hdr__cta--mobile {
    display: inline-flex;
    justify-content: center;
    align-self: stretch;
    margin-top: 28px;
    padding: 16px 22px;
    font-size: 15px;
    border: 1px solid var(--sage-500);
  }
}

/* ── HERO ──────────────────────────────────────────────── */
.hero {
  position: relative;
  height: 100vh;
  height: 100svh;
  min-height: 640px;
  overflow: hidden;
  background: var(--night);
}
.hero__poster {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
  z-index: 0;
  /* Always visible underneath — keeps the seam between still and video invisible */
}
.hero__video {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
  z-index: 1;
  /* Hidden until JS confirms playback is running from frame 0; then fade in. */
  opacity: 0;
  transition: opacity 700ms var(--ease-horizon);
}
.hero__video.is-running {
  opacity: 1;
}
.hero__scrim {
  position: absolute;
  inset: 0;
  z-index: 2;
  background:
    /* delikatna poduszka pod logo w centrum — biały logotyp z kreskami
       włosowymi ginął na jasnej ścianie kadru (kompozycja hero bez zmian) */
    radial-gradient(ellipse 54% 40% at 50% 50%, rgba(13, 15, 13, 0.34) 0%, rgba(13, 15, 13, 0) 72%),
    linear-gradient(180deg, rgba(13,15,13,0) 0%, rgba(13,15,13,0) 60%, rgba(13,15,13,0.55) 100%),
    linear-gradient(180deg, rgba(13,15,13,0.25) 0%, rgba(13,15,13,0) 30%);
  pointer-events: none;
}
.hero__overlay {
  position: absolute;
  inset: 0;
  z-index: 3;
  display: grid;
  /* Napisy siadają w LEWYM DOLNYM rogu — dokładnie tam, gdzie panele w rozdziałach
     filmowych (wymóg Sebastiana: „hero ma mieć napis tam, gdzie mają wszystkie sekcje
     poniżej"). Wcześniej `place-items: center` trzymał je na środku ekranu. */
  place-items: end start;
  pointer-events: none;
}
.hero__claim-wrap {
  /* Wyrównanie do LEWEJ, tak jak panele w rozdziałach filmowych — wyśrodkowany
     napis czytał się „krzykliwie" (uwaga Sebastiana). Treść bez zmian, zmienia się
     wyłącznie umiejscowienie. Lewa krawędź wspólna z resztą siatki strony. */
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  /* pełna szerokość i start siatki — inaczej rodzic (grid) centruje blok i odstęp
     liczy się od jego krawędzi, przez co napisy odjeżdżały od linii logo o 170 px */
  width: 100%;
  justify-self: start;
  /* więcej oddechu od dołu niż dawny odstęp paneli rozdziałów: pod hasłem
     zostaje czysta strefa na strzałkę „przewiń" (uwaga Sebastiana 2026-09-04:
     „napisy bardziej premium umiejscowione") */
  padding-bottom: clamp(84px, 15vh, 150px);
  gap: 18px;
  text-align: left;
  padding-inline: calc(max(var(--gutter), (100% - var(--container)) / 2) + var(--gutter));
  max-width: 100%;
}
.hero__claim-wrap .hero__tagline,
.hero__claim-wrap .hero__claim { margin-inline: 0; }
.hero__claim { max-width: 18ch; }
/* Logo w lewym GÓRNYM rogu (uwaga Łukasza/Sebastiana 19.08.2026: przy dolnej krawędzi
   wyglądało, „jakby ktoś miał je zaraz zetrzeć mopem"). Pozycja i lewa krawędź celowo
   liczone tak samo jak logo w pasku nawigacji — przy przewijaniu jedno przechodzi
   w drugie bez skoku w bok. Góra: środek paska (77 px) minus połowa wysokości znaku. */
.hero__logo {
  position: absolute;
  /* Siatka identyczna jak w pasku nawigacji: kontener liczony od szerokości dokumentu
     (100%, nie 100vw — vw ignoruje pasek przewijania i dawało rozjazd 51 px) plus
     wewnętrzny odstęp kontenera. Dzięki temu logo hero i logo paska stoją w jednej linii. */
  left: calc(max(var(--gutter), (100% - var(--container)) / 2) + var(--gutter));
  top: clamp(18px, 2.2vw, 30px);
  z-index: 3;
  width: clamp(180px, 19vw, 280px);
  height: auto;
  opacity: 0;
  /* Left-to-right reveal (no slide-in; logo materialises in place) */
  clip-path: inset(0 100% 0 0);
  -webkit-clip-path: inset(0 100% 0 0);
  animation: heroLogoReveal var(--hero-logo-duration) var(--ease-horizon) forwards;
  animation-delay: var(--hero-logo-delay);
  filter: drop-shadow(0 2px 16px rgba(0,0,0,0.32)) drop-shadow(0 0 1px rgba(255,255,255,0.18));
  pointer-events: none;
}
.hero__tagline {
  font-family: var(--font-mono);
  font-size: 12px;
  font-weight: 500;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: rgba(255, 255, 255, 0.86);
  margin: 0;
  /* złota nić przed frazą — ten sam język co nadtytuły sekcji niżej */
  display: flex;
  align-items: center;
  gap: 14px;
  opacity: 0;
  transform: translateY(4px);
  animation: heroTaglineIn var(--hero-tagline-duration) var(--ease-horizon) forwards;
  animation-delay: var(--hero-tagline-delay);
}
.hero__tagline::before {
  content: "";
  flex: none;
  width: 32px;
  height: 1px;
  background: var(--gold-300, #e8c988);
  box-shadow: 0 1px 2px rgba(13, 15, 13, 0.35);
  /* nić rysuje się od lewej — zmienną pisze film.js (0 → 1); bez JS pełna */
  transform: scaleX(var(--hero-line, 1));
  transform-origin: left;
}
/* litery frazy i słowa hasła po rozbiciu (GSAP): własne pudełka pod transform
   i rozmycie; bez JS elementów nie ma, więc reguła nic nie zmienia */
.hero__tagline .split-char,
.hero__claim .split-word { display: inline-block; will-change: transform, filter; }
.hero__tagline .split-w { display: inline-block; white-space: nowrap; } /* wiersz łamie się tylko między słowami */
/* Plakatowy claim — typografia jest bohaterem pierwszego ekranu; od 2026-09-04
   nieco mniejszy (5rem zamiast 5.75rem), żeby trzy wersy nie dociskały dołu kadru */
.hero__claim {
  font-family: var(--font-serif);
  font-weight: 400;
  font-optical-sizing: auto;
  font-size: clamp(2.4rem, 1rem + 5.2vw, 5rem);
  line-height: 1.04;
  letter-spacing: -0.025em;
  color: var(--white-soft, #f4f2ec);
  margin: 0;
  max-width: 15ch;
  text-wrap: balance;
  text-shadow: 0 2px 28px rgba(13, 15, 13, 0.35);
  opacity: 0;
  transform: translateY(6px);
  animation: heroTaglineIn var(--hero-tagline-duration) var(--ease-horizon) forwards;
  animation-delay: var(--hero-claim-delay);
}
@keyframes heroLogoReveal {
  0%   { opacity: 0; clip-path: inset(0 100% 0 0); -webkit-clip-path: inset(0 100% 0 0); }
  15%  { opacity: 1; }
  100% { opacity: 1; clip-path: inset(0 0 0 0); -webkit-clip-path: inset(0 0 0 0); }
}
@keyframes heroLogoIn {
  to { opacity: 1; transform: translateY(0) scale(1); }
}
@keyframes heroTaglineIn {
  to { opacity: 1; transform: translateY(0); }
}

/* ── Strzałka „przewiń" (2026-09-04) — jeden element dla hero i orbity kart ──
   Złota nić z kroplą spływającą w dół + chevron; mała i delikatna, ale
   widoczna także na jasnym tle (złoto + cień), bo poprzednia biała podpowiedź
   10 px wchodząca po 6,5 s ginęła na marmurowej posadzce kadru hero. */
.cue {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 7px;
  width: fit-content;
  color: var(--gold-300, #e8c988);
}
.cue__line {
  position: relative;
  width: 1px;
  height: 34px;
  overflow: hidden;
  background: linear-gradient(180deg, rgba(232, 201, 136, 0) 0%, rgba(232, 201, 136, 0.7) 35%, rgba(232, 201, 136, 0.7) 100%);
}
.cue__dot {
  position: absolute;
  left: 0;
  top: 0;
  width: 1px;
  height: 12px;
  background: #fff;
  animation: cueDrop 2.4s cubic-bezier(0.65, 0, 0.35, 1) infinite;
}
@keyframes cueDrop {
  0% { transform: translateY(-14px); opacity: 0; }
  25% { opacity: 1; }
  75% { opacity: 1; }
  100% { transform: translateY(36px); opacity: 0; }
}
.cue__chev { display: block; animation: cueBob 2.4s ease-in-out infinite; }
@keyframes cueBob {
  0%, 100% { transform: translateY(0); opacity: 0.75; }
  50% { transform: translateY(3px); opacity: 1; }
}
@keyframes cueIn {
  from { opacity: 0; transform: translateY(10px); }
  to { opacity: 1; transform: translateY(0); }
}
.hero__cue {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 26px;
  margin-inline: auto;
  z-index: 3;
  pointer-events: auto;
  opacity: 0;
  filter: drop-shadow(0 1px 3px rgba(13, 15, 13, 0.9)); /* na marmurze kadru złoto miało 2,1:1 — cień daje rysunek */
  animation: cueIn 1.2s var(--ease-horizon) forwards;
  animation-delay: var(--hero-cue-delay);
  transition: color 200ms var(--ease-horizon);
}
.hero__cue:hover { color: var(--gold-100, #f6ebd2); }
/* Choreografia hero startuje od zdjęcia ekranu ładowania: pod html.js animacje
   stoją wstrzymane do klasy hero-ready (site.js removeLoader); bez JS biegną
   od razu z tymi samymi opóźnieniami. */
html.js:not(.hero-ready) .hero__logo,
html.js:not(.hero-ready) .hero__tagline,
html.js:not(.hero-ready) .hero__claim,
html.js:not(.hero-ready) .hero__cue { animation-play-state: paused; }
/* strzałka pod orbitą kart: wejście i zejście steruje film.js initProofRing
   (3 s po wejściu sekcji w ekran; gaśnie, gdy orbita ruszy) */
.cue--ring {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  margin-inline: auto;
  color: var(--gold-600, #a8842c);
  opacity: 0;
  visibility: hidden;
}
.cue--ring .cue__line { background: linear-gradient(180deg, rgba(168, 132, 44, 0) 0%, rgba(168, 132, 44, 0.75) 35%, rgba(168, 132, 44, 0.75) 100%); }
.cue--ring .cue__dot { background: var(--gold-800, #7a5e1c); }

/* ── KPI (dark, with orbit video) ─────────────────────── */
.kpi {
  position: relative;
  padding: var(--section-pad-lg) 0;
  background: var(--night);
  overflow: hidden;
  isolation: isolate;
}
.kpi__video {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  opacity: 0.32;
  z-index: -1;
}
.kpi__scrim {
  position: absolute;
  inset: 0;
  background:
    radial-gradient(ellipse 60% 55% at 50% 60%, rgba(13,15,13,0.62) 0%, rgba(13,15,13,0.18) 60%, rgba(13,15,13,0) 100%),
    linear-gradient(180deg, rgba(13,15,13,0.18) 0%, rgba(13,15,13,0.05) 50%, rgba(13,15,13,0.45) 100%);
  z-index: -1;
}
.kpi__video { opacity: 0.62; }
.kpi__grid {
  display: grid;
  /* auto-fit: siatka rozkłada DOWOLNĄ liczbę realnych KPI (2 dziś, więcej
     gdy klient uzupełni dane w CMS) bez sierot i pustych kolumn */
  grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
  gap: 40px 32px;
  margin-top: 80px;
  border-top: 1px solid rgba(255, 255, 255, 0.16);
  padding-top: 64px;
}
.kpi__cell {
  display: flex;
  flex-direction: column;
  gap: 24px;
}
.kpi__num {
  font-family: var(--font-mono);
  font-size: clamp(56px, 6vw, 88px);
  font-weight: 300;
  line-height: 1;
  letter-spacing: -0.04em;
  color: var(--paper);
  font-feature-settings: "tnum" 1;
}
.kpi__unit {
  font-size: 0.32em;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: rgba(244, 242, 236, 0.85);
}
.kpi__label {
  font-size: 13px;
  font-weight: 400;
  line-height: 1.5;
  color: rgba(255, 255, 255, 0.8);
  margin: 0;
  max-width: 24ch;
}
/* portret: jaśniejsze kadry pionowe wymagają mocniejszej zasłony pod tekstem */
@media (max-width: 880px) and (orientation: portrait) {
  .kpi__scrim {
    background:
      linear-gradient(180deg, rgba(13, 15, 13, 0.34) 0%, rgba(13, 15, 13, 0.42) 50%, rgba(13, 15, 13, 0.62) 100%);
  }
}
/* (responsywność KPI załatwia auto-fit minmax — bez breakpointów) */

/* ── CASE STUDIES ─────────────────────────────────────── */
.cases {
  padding: var(--section-pad) 0;
  background: var(--paper);
}
.cases__head {
  max-width: 760px;
  margin-bottom: 80px;
}
/* ── CLOSING (form) ───────────────────────────────────── */
.closing {
  position: relative;
  padding: var(--section-pad-lg) 0;
  background: var(--night);
  overflow: hidden;
  isolation: isolate;
}
.closing__video {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  opacity: 0.42;
  z-index: -1;
}
.closing__scrim {
  position: absolute;
  inset: 0;
  background:
    radial-gradient(ellipse 70% 60% at 50% 75%, rgba(13,15,13,0.62) 0%, rgba(13,15,13,0.22) 55%, rgba(13,15,13,0) 100%),
    linear-gradient(180deg, rgba(13,15,13,0.05) 0%, rgba(13,15,13,0.20) 60%, rgba(13,15,13,0.50) 100%);
  z-index: -1;
}
.closing__video { opacity: 0.78; }
.closing__head {
  max-width: 720px;
  margin-bottom: 80px;
}

.form {
  display: grid;
  gap: 32px;
  background: rgba(255, 255, 255, 0.04);
  border: 1px solid rgba(255, 255, 255, 0.14);
  padding: clamp(32px, 4vw, 56px);
  backdrop-filter: blur(8px);
}
.form__row {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 32px;
}
@media (max-width: 720px) {
  .form__row { grid-template-columns: 1fr; gap: 32px; }
}
.form__field {
  display: flex;
  flex-direction: column;
  gap: 10px;
}
.form__label {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: rgba(255, 255, 255, 0.65);
}
.form__field input,
.form__field textarea {
  font-family: var(--font-display);
  font-size: 16px;
  font-weight: 400;
  color: var(--paper);
  background: transparent;
  border: 0;
  border-bottom: 1px solid rgba(255, 255, 255, 0.28);
  padding: 8px 0 12px;
  outline: none;
  transition: border-color 200ms var(--ease-horizon);
}
.form__field input::placeholder,
.form__field textarea::placeholder {
  color: rgba(255, 255, 255, 0.32);
}
.form__field input:focus,
.form__field textarea:focus {
  border-color: var(--sage-200);
}
.form__field textarea { resize: vertical; min-height: 80px; }
.form__consent {
  font-size: 13px;
  color: rgba(255, 255, 255, 0.72);
  line-height: 1.55;
}
.form__consent a {
  color: var(--paper);
  border-bottom: 1px solid rgba(255, 255, 255, 0.4);
}
.form__check {
  display: flex;
  align-items: flex-start;
  gap: 12px;
  cursor: pointer;
}
.form__check input { margin-top: 4px; accent-color: var(--sage-500); }
.form__actions {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 32px;
  padding-top: 16px;
  border-top: 1px solid rgba(255, 255, 255, 0.14);
}
.form__actions .btn--primary {
  background: var(--paper);
  color: var(--ink);
}
.form__actions .btn--primary:hover {
  background: var(--sage-200);
}
.form__note {
  font-size: 10px;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: rgba(255, 255, 255, 0.55);
  margin: 0;
}

/* CTA finału (nad kartą kontaktową) */
.closing__cta {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 28px;
  margin: 8px 0 56px;
}
.closing__cta .btn--primary {
  background: var(--white-soft, #f4f2ec);
  color: var(--ink);
}
.closing__cta .btn--primary:hover { color: var(--ink); }
/* zalewka hoveru w jasnej zieleni — ciemna (sage-800) pod ciemnym tekstem
   tego przycisku byłaby nieczytelna w trakcie ruchu; samo tło NIE zmienia się
   na hover, bo w tym samym kolorze gasiło ruch zalewki „od lewej" */
.closing__cta .btn--primary::before { background: var(--sage-200); }
.btn--ghost-inverse {
  color: rgba(244, 242, 236, 0.85);
  border-bottom: 1px solid rgba(244, 242, 236, 0.4);
}
.btn--ghost-inverse:hover {
  color: var(--gold-300);
  border-color: var(--gold-300);
}

/* ── FOOTER ───────────────────────────────────────────── */
.footer {
  background: var(--night-2);
  color: rgba(255, 255, 255, 0.7);
  padding: 64px 0 36px;
}
.footer__grid {
  display: grid;
  grid-template-columns: 1.4fr 0.9fr 0.9fr 0.9fr 0.9fr;
  gap: 48px;
  margin-bottom: 64px;
}
.footer__col--wide { grid-column: span 1; }
.footer__brand {
  display: flex;
  flex-direction: column;
  gap: 24px;
}
/* 76px → ~197px szerokości: powyżej minimum czytelności logotypu z księgi (180px) */
/* +45% wobec 76 px — w stopce jest sporo wolnego miejsca (uwaga Sebastiana) */
.footer__logo { height: 110px; width: auto; max-width: 380px; }
.footer__tag {
  font-size: 13px;
  line-height: 1.7;
  color: rgba(255, 255, 255, 0.5);
  margin: 0;
  max-width: 32ch;
}
.footer__col h3 {
  font-family: var(--font-mono);
  font-size: 10px;
  font-weight: 400;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  /* 0.66 → ~8.4:1 na night-2 (0.55 nie domykało AA przy 10px) */
  color: rgba(255, 255, 255, 0.66);
  margin: 0 0 24px;
}
.footer__col ul { display: flex; flex-direction: column; gap: 12px; }
.footer__col li {
  font-size: 13px;
  color: rgba(255, 255, 255, 0.78);
}
.footer__col a {
  transition: color 200ms var(--ease-horizon);
}
.footer__col a:hover { color: var(--sage-200); }
.footer__col .mono { font-size: 11px; color: rgba(255, 255, 255, 0.64); letter-spacing: 0.06em; }
/* „zgłoszenia awaryjne: całą dobę” w jednej linijce: fraza ma ~178 px, kolumna 146–176 px,
   a do następnej kolumny zostaje 194–224 px (zmierzone 1101–1920 px) — wystaje w odstęp, bez kolizji */
.footer__nowrap { white-space: nowrap; }
.footer__base {
  display: flex;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 16px;
  padding-top: 28px;
  border-top: 1px solid rgba(255, 255, 255, 0.1);
  font-size: 10px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  /* 0.62 → ~7.4:1 (0.4 = 3.4:1 FAIL na small-text) */
  color: rgba(255, 255, 255, 0.62);
}
.footer__base p { margin: 0; }
@media (max-width: 1100px) {
  .footer__grid { grid-template-columns: 1fr 1fr 1fr; gap: 40px 32px; }
  .footer__col--wide { grid-column: span 3; }
}
@media (max-width: 880px) {
  .footer__grid { grid-template-columns: 1fr 1fr; gap: 40px 32px; }
  .footer__col--wide { grid-column: span 2; }
}
@media (max-width: 520px) {
  .footer__grid { grid-template-columns: 1fr; }
  .footer__col--wide { grid-column: span 1; }
}

/* ── Cursor — removed custom cursor; always use system default ── */

/* ── PRINT styles ─────────────────────────────────────── */
@media print {
  .hdr, .hero__cue, #tweaks-mount,
  .closing__video, .kpi__video, .hero__video,
  .closing__scrim, .kpi__scrim, .hero__scrim,
  .hdr__menu, .hdr__mobile, .hdr__cta {
    display: none !important;
  }
  .hero {
    height: auto;
    min-height: auto;
    background: var(--paper);
    padding: 64px 0;
    page-break-after: always;
  }
  .hero__overlay { position: relative; padding: 64px 0; }
  .hero__logo { filter: none !important; position: static; }
  .hero__logo, .hero__tagline, .hero__claim { animation: none !important; opacity: 1 !important; transform: none !important; }
  .hero__claim { color: var(--ink); text-shadow: none; }
  .kpi, .closing, .footer {
    background: var(--paper) !important;
    color: var(--ink) !important;
  }
  .kpi__num, .kpi__label, .display-1--inverse, .display-2--inverse, .lead--inverse,
  .closing__head *, .footer * {
    color: var(--ink) !important;
  }
  .footer__col h3 { color: var(--ink-muted) !important; }
  body { font-size: 11pt; }
  .reveal { opacity: 1 !important; transform: none !important; }
  .display-1, .display-2 { page-break-after: avoid; }
  section { page-break-inside: avoid; }
  a { color: var(--ink) !important; text-decoration: none; }
  a[href^="http"]::after, a[href^="mailto"]::after, a[href^="tel"]::after {
    content: " (" attr(href) ")";
    font-family: var(--font-mono);
    font-size: 9pt;
    color: var(--ink-muted);
  }
}

/* ── REVEAL ON SCROLL ─────────────────────────────────── */
/* Baseline ukrycia TYLKO pod html.js — bez JS (i dla crawlerów bez skryptów)
   cała treść jest widoczna od pierwszego bajtu HTML. */
html.js .reveal {
  opacity: 0;
  transform: translateY(16px);
  transition: opacity var(--dur-reveal) var(--ease-horizon), transform var(--dur-reveal) var(--ease-horizon);
}
html.js .reveal.is-visible {
  opacity: 1;
  transform: translateY(0);
}
/* Consistent delays (księga v1.1): grupa revealów wchodzi kaskadą RÓL, nie
   pozycji DOM — eyebrow 0 → nagłówek 60 → lead 120 → treść 180+n·60 (cap 360).
   Slot --d niesie markup; element samotny (.reveal) zawsze bez delaya. */
html.js .reveal-group [data-reveal] {
  opacity: 0;
  transform: translateY(16px);
  transition: opacity var(--dur-reveal) var(--ease-horizon) var(--d, 0ms),
    transform var(--dur-reveal) var(--ease-horizon) var(--d, 0ms);
}
html.js .reveal-group.is-visible [data-reveal] {
  opacity: 1;
  transform: translateY(0);
}


/* ============================================================
   ADDITIONS — owner-feedback round (May 2026)
   ============================================================ */

/* Footer — placeholder note for social links */
.footer__placeholder {
  font-size: 0.6875rem;
  color: rgba(255,255,255,0.45);
  letter-spacing: 0.04em;
}


/* ──────────────────────────────────────────────────────────
   ROUND-1 ADDITIONS · 2026-05-14
   New sections and placeholders for the redesign.
   ────────────────────────────────────────────────────────── */

/* ── Loading screen — poster-based, replaces black/logo splash ──
   Image URL is injected inline in BaseLayout.astro (using heroPosterImage from CMS),
   so when client swaps hero poster in /zarzad/ the loading screen updates too. */
.ch-loading {
  position: fixed;
  inset: 0;
  z-index: 9999;
  pointer-events: none;
  background-color: #0d0f0d;
  background-repeat: no-repeat;
  background-position: center;
  background-size: cover;
  opacity: 1;
  transition: opacity 700ms var(--ease-horizon);
}
.ch-loading.is-gone {
  opacity: 0;
}
.ch-loading::after {
  /* extremely subtle dark vignette so the hero scrim continuity is preserved */
  content: "";
  position: absolute; inset: 0;
  background: linear-gradient(180deg, rgba(13,15,13,0.15) 0%, rgba(13,15,13,0) 30%, rgba(13,15,13,0) 60%, rgba(13,15,13,0.45) 100%);
}

/* ── REALIZACJE — clean gallery grid ─────────────────────── */
.gallery {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 16px;
}
.gallery__item {
  position: relative;
  aspect-ratio: 4/3;
  overflow: hidden;
  background: var(--paper-tint, #eef2ef);
}
.gallery__img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  transition: transform 800ms var(--ease-horizon);
}
.gallery__item:hover .gallery__img {
  transform: scale(1.03);
}
.gallery__fig { margin: 0; height: 100%; display: flex; flex-direction: column; }
.gallery__cap {
  font-size: 10px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--gold-700);
  padding: 10px 2px 0;
}
@media (max-width: 1100px) {
  .gallery { grid-template-columns: repeat(3, 1fr); }
}
@media (max-width: 720px) {
  .gallery { grid-template-columns: repeat(2, 1fr); gap: 10px; }
}

/* ── KONTAKT — contact card ──────────────────────────────── */
.ccard {
  /* wyrównanie do lewej krawędzi kolumny tekstu — wcześniej `0 auto` centrowało
     panel, przez co odjeżdżał o 24 px w prawo względem nagłówka i przycisku */
  margin: 0;
  max-width: 720px;
  background: rgba(13, 15, 13, 0.55);
  backdrop-filter: blur(10px) saturate(130%);
  -webkit-backdrop-filter: blur(10px) saturate(130%);
  border: 1px solid rgba(244, 242, 236, 0.13);
  /* złota nić na grzbiecie + rim szkła (lit-top / shadow-bottom) */
  border-top: 1px solid rgba(232, 201, 136, 0.5);
  box-shadow:
    inset 0 1px 0 rgba(255, 255, 255, 0.09),
    inset 0 -1px 0 rgba(0, 0, 0, 0.28),
    0 24px 64px rgba(8, 10, 8, 0.32);
  border-radius: 4px;
  /* ciaśniej i równo (uwaga Sebastiana 2026-09-04: „w połowie pusta, za duże
     nierówne przestrzenie u góry"): górny odstęp ≈ dolnemu, jeden rytm między
     logotypem a danymi */
  padding: clamp(30px, 3.6vw, 44px) clamp(28px, 4vw, 56px) clamp(32px, 3.8vw, 46px);
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: clamp(22px, 2.6vw, 30px);
  text-align: center;
}
.ccard__logo {
  /* logotyp jak w stopce (zamiast samego znaku + osobnej nazwy). Plik SVG ma
     28% pustego pola nad i pod znakiem (zmierzone getBBox: treść 304–776
     z 1080), więc ujemny margines pionowy zdejmuje ten zapas — inaczej karta
     miała u góry o ~25 px więcej powietrza niż u dołu. Widoczny znak ≈ 44%
     wysokości obrazka: 112 px → ~49 px znaku (jak logotyp w stopce). */
  --h: clamp(88px, 7.8vw, 112px);
  height: var(--h);
  width: auto;
  margin-block: calc(var(--h) * -0.24);
  filter: drop-shadow(0 2px 10px rgba(31, 27, 14, 0.35));
}
.ccard__list {
  width: 100%;
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 22px 32px;
  margin: 0;
}
.ccard__row {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 6px;
  text-align: center;
}
.ccard__row dt {
  font-size: 10px;
  letter-spacing: 0.22em;
  color: rgba(255,255,255,0.55);
  text-transform: uppercase;
  margin: 0;
}
.ccard__row dd {
  margin: 0;
  overflow-wrap: anywhere; /* 320 px: e-mail szerszy niż pole karty */
  font-family: var(--font-display);
  font-size: 17px;
  font-weight: 400;
  color: var(--white-soft, #f4f2ec);
  line-height: 1.5;
}
.ccard__row dd a {
  color: var(--white-soft, #f4f2ec);
  border-bottom: 1px solid transparent;
  transition: border-color 200ms var(--ease-horizon), color 200ms var(--ease-horizon);
}
.ccard__row dd a:hover,
.ccard__row dd a:focus-visible {
  color: var(--sage-200, #c3dccf);
  border-bottom-color: var(--sage-200, #c3dccf);
}
@media (max-width: 720px) {
  .ccard { padding: 26px 22px 30px; gap: 20px; }
  .ccard__logo { --h: 88px; }
  .ccard__list { grid-template-columns: 1fr; gap: 18px; }
}

/* ── Mobile sticky bottom CTA ───────────────────────────── */
.mobile-cta {
  display: none;
  position: fixed;
  left: 16px; right: 16px;
  bottom: 16px;
  z-index: 80;
  padding: 14px 22px;
  background: var(--ink, #131613);
  color: var(--white-soft, #f4f2ec);
  font-size: 14px;
  font-weight: 500;
  letter-spacing: 0.04em;
  text-align: center;
  border-radius: 2px;
  border: 1px solid var(--sage-500, #619c7f);
  box-shadow: 0 4px 24px rgba(0,0,0,0.32);
  transition: transform 200ms var(--ease-horizon), opacity 200ms var(--ease-horizon);
}
.mobile-cta:hover { background: var(--sage-700, #5f8874); }
@media (max-width: 720px) {
  .mobile-cta { display: block; }
  body { padding-bottom: 72px; }
}

/* (logo stopki: 76px także na mobile — 44px schodziło poniżej czytelności
   kresek włosowych logotypu) */

/* ═══════════════════════════════════════════════════════════════════════
   CO OFERUJEMY (services) — sekcja z 6 kategoriami usług
   Layout inspirowany screenami klienta: zielonkawe karty z ikoną + listy.
   ═══════════════════════════════════════════════════════════════════════ */
.services {
  padding: var(--section-pad) 0;
  background: var(--paper);
  border-top: 1px solid var(--line);
}
.services__head {
  max-width: 760px;
  margin-bottom: clamp(40px, 5vw, 64px);
}
/* ═══════════════════════════════════════════════════════════════════════
   JAK DZIAŁAMY (howwork) — sekcja w stylu LICZBY (video tle + tekst)
   ═══════════════════════════════════════════════════════════════════════ */
.howwork {
  position: relative;
  padding: var(--section-pad) 0;
  color: var(--ink);
  background: var(--paper-warm, var(--paper));
}
.howwork__list {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: clamp(24px, 3vw, 40px);
  margin-top: clamp(40px, 5vw, 64px);
}
@media (max-width: 880px) {
  .howwork__list { grid-template-columns: 1fr; }
}
.howwork__item {
  display: grid;
  grid-template-columns: auto 1fr;
  gap: 16px;
  padding: 20px 0;
  position: relative;
  min-width: 0;
}
/* Hairline-draw: linia kroku „rysuje się" od złota ku kamieniowi przy wejściu
   (zamiast statycznego border-top). Bez JS linia po prostu stoi (transform:none). */
.howwork__item::before {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 1px;
  background: linear-gradient(90deg, var(--gold-400, #c7a45c) 0, var(--line) min(42%, 260px), var(--line));
  transform-origin: left;
}
html.js .howwork__item.reveal::before {
  transform: scaleX(0);
  transition: transform var(--dur-draw) var(--ease-horizon) 120ms;
}
html.js .howwork__item.reveal.is-visible::before {
  transform: scaleX(1);
}
.howwork__num {
  font-size: 13px;
  letter-spacing: 0.12em;
  color: var(--gold-700, #8f6e26);
  padding-top: 4px;
}
.howwork__title {
  font-family: var(--font-display);
  font-size: clamp(18px, 1.4vw, 22px);
  font-weight: 500;
  margin: 0 0 8px 0;
  color: var(--ink);
  text-wrap: balance;
}
.howwork__desc {
  /* Roboto zamiast serifowej kursywy — italic księga rezerwuje dla cytatów
     (to operacyjne opisy kroków, nie emocja) */
  font-family: var(--font-display);
  font-weight: 300;
  font-size: 16px;
  line-height: 1.6;
  color: var(--ink-muted);
  margin: 0;
  max-width: 60ch;
}
.howwork__placeholder {
  margin-top: 32px;
  color: var(--ink-subtle);
  letter-spacing: 0.12em;
  font-size: 13px;
}
.howwork__cta { margin-top: clamp(40px, 5vw, 64px); }

/* ═══════════════════════════════════════════════════════════════════════
   HERO social icons — prawy górny róg ("Odwiedź nasze media · FB · IG")
   ═══════════════════════════════════════════════════════════════════════ */
.hero__social {
  /* rodzic .hero__overlay ma pointer-events:none (żeby nie przechwytywał
     gestów nad wideo) — bez przywrócenia auto ikony są NIEKLIKALNE,
     kliknięcie trafia w <video> pod spodem. Tak samo robi .hero__cue niżej. */
  pointer-events: auto;
  position: absolute;
  top: clamp(20px, 3vw, 36px);
  right: clamp(20px, 4vw, 56px);
  display: flex;
  align-items: center;
  gap: 14px;
  color: #fff;
  z-index: 3;
}
.hero__social-label {
  font-size: 12px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  opacity: 0.85;
}
.hero__social-list {
  display: flex;
  gap: 10px;
  list-style: none;
  padding: 0;
  margin: 0;
}
.hero__social-link {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 38px;
  height: 38px;
  border-radius: 50%;
  background: rgba(255,255,255,0.12);
  border: 1px solid rgba(255,255,255,0.35);
  color: #fff;
  transition: background 0.18s ease, border-color 0.18s ease;
}
.hero__social-link:hover,
.hero__social-link:focus-visible {
  background: rgba(255,255,255,0.22);
  border-color: rgba(255,255,255,0.65);
}
@media (max-width: 640px) {
  .hero__social-label { display: none; } /* tylko ikonki na mobile */
  .hero__social {
    top: 16px;
    right: 16px;
  }
}

/* ════════════════════════════════════════════════════════════
   WARSTWA PRZEBUDOWY 2026-06-12 — scroll-driven film + tokeny
   (złota nić, kamień, Newsreader display, rozdziały podróży)
   ════════════════════════════════════════════════════════════ */

:root {
  /* GOLD — „złota nić": hairline'y/numeracja/selection, NIGDY płaszczyzny */
  --gold-100: #f6ebd2; --gold-200: #e9d3a0; --gold-300: #e8c988; --gold-400: #c7a45c;
  --gold-500: #b08d45; --gold-600: #a8842c; --gold-700: #8f6e26; --gold-800: #7a5e1c;
  /* STONE — kamienna klatka schodowa */
  --stone-100: #f1ede3; --stone-200: #e5dfd2; --stone-300: #d6cdbb;
  --sage-800: #46705c;          /* tekstowa zieleń AA na jasnym */
  --white-soft: #f4f2ec;        /* off-white na ciemnym (zamiast #fff) */
  --paper-soft: #fdfcf9;
  /* Motion language */
  --ease-horizon: cubic-bezier(0.16, 1, 0.3, 1);
  --ease-exit: cubic-bezier(0.7, 0, 0.84, 0);
  --ease-drift: cubic-bezier(0.65, 0, 0.35, 1);
  --dur-micro: 180ms; --dur-small: 280ms; --dur-medium: 600ms;
  --dur-reveal: 900ms; --dur-scene: 1000ms; --dur-draw: 1600ms;
  /* Display serif (Newsreader upright — ta sama rodzina co cytaty) */
  --font-display-serif: "Newsreader", ui-serif, Georgia, serif;
  --track-d1: -0.03em; --track-d2: -0.022em; --track-stat: -0.05em;
}

/* Nagłówki display = serif premium (body zostaje Roboto) */
.display-1, .display-2 {
  font-family: var(--font-display-serif);
  font-weight: 400;
  font-optical-sizing: auto;
}
.display-1 { letter-spacing: var(--track-d1); }
.display-2 { letter-spacing: var(--track-d2); }
body { font-optical-sizing: auto; }

/* ── Polish-pass ── */
::selection { background: rgba(199, 164, 92, 0.28); color: var(--ink); }
html { scrollbar-width: thin; scrollbar-color: var(--sage-700) var(--stone-100); }
:focus-visible { outline: 2px solid var(--sage-800); outline-offset: 3px; border-radius: 1px; }
:focus:not(:focus-visible) { outline: none; }
.kpi__num { letter-spacing: var(--track-stat); font-variant-numeric: tabular-nums lining-nums; }
.footer__base .mono { font-variant-numeric: tabular-nums lining-nums; }

.bcard__desc {
  font-size: 15px; font-weight: 300; line-height: 1.62;
  color: var(--ink-muted); margin: 0;
  max-width: 52ch;
}

/* ── Scroll progress hairline (sage → gold) ── */
.scroll-progress {
  position: fixed; top: 0; left: 0; height: 2px; width: 100%;
  transform-origin: left; transform: scaleX(0);
  background: linear-gradient(90deg, var(--sage-700), var(--gold-400));
  z-index: 200; pointer-events: none;
}

/* Hero mobile: claim+h1 NIE mogą przecinać postaci (pion 9:16 — kobiety w
   centrum kadru). Blok schodzi w spokojną strefę dół-lewo, nad cue/CTA;
   logo ląduje w lewym-górnym rogu (centrum i dół zajęte przez kadr). */
@media (max-width: 880px) and (orientation: portrait) {
  .hero__overlay {
    place-items: end start;
    padding: 0 20px calc(118px + env(safe-area-inset-bottom, 0px));
  }
  .hero__claim-wrap { align-items: flex-start; text-align: left; gap: 14px; padding: 0; }
  .hero__claim {
    font-size: clamp(1.9rem, 8.6vw, 2.75rem);
    max-width: 13ch;
  }
  .hero__logo {
    left: 20px;
    bottom: auto;
    top: calc(18px + env(safe-area-inset-top, 0px));
    width: min(42vw, 190px);
  }
  .hero__tagline {
    font-size: 10.5px;
    letter-spacing: 0.2em;
    line-height: 1.7;
    text-align: left;
    max-width: 76vw;
    text-wrap: balance;
  }
  .hero__cue { bottom: calc(22px + env(safe-area-inset-bottom, 0px)); }
  /* mocniejsza poduszka pod logo w górnym-lewym rogu (kreski włosowe na
     jasnym niebie kadru) + dotychczasowe zasłony */
  .hero__scrim {
    background:
      radial-gradient(ellipse 62% 30% at 16% 6%, rgba(13, 15, 13, 0.42) 0%, rgba(13, 15, 13, 0) 72%),
      radial-gradient(ellipse 54% 40% at 50% 50%, rgba(13, 15, 13, 0.34) 0%, rgba(13, 15, 13, 0) 72%),
      /* dół 0,55 → 0,7 (od 52%): fraza i hasło leżą na beżowych spodniach postaci,
         zmierzone najgorsze miejsce 1,3:1 — ciemniejsza poduszka pod napisami */
      linear-gradient(180deg, rgba(13,15,13,0) 0%, rgba(13,15,13,0) 52%, rgba(13,15,13,0.7) 100%),
      linear-gradient(180deg, rgba(13,15,13,0.25) 0%, rgba(13,15,13,0) 30%);
  }
}

/* ── FAQ ── */
.faq { padding: var(--section-pad) 0; background: var(--paper-soft); border-top: 1px solid var(--line); }
.faq__list { max-width: 800px; }

/* Accordion na natywnym <details> — odpowiedzi w DOM (no-JS/crawlery),
   pierwsza otwarta atrybutem open. Rozwijanie animuje ::details-content
   (block-size 0→auto; nowoczesny odpowiednik grid-rows 0fr→1fr) — starsze
   przeglądarki dostają natychmiastowy toggle bez animacji. */
.faq__item { border-bottom: 1px solid var(--line); }
.faq__item:first-child { border-top: 1px solid var(--line); }
.faq__item summary {
  display: grid;
  grid-template-columns: 1fr 20px;
  gap: 20px;
  align-items: center;
  padding: 20px 0;
  cursor: pointer;
  list-style: none;
}
.faq__item summary::-webkit-details-marker { display: none; }
.faq__q {
  font-family: var(--font-display-serif); font-weight: 500;
  font-size: clamp(1.125rem, 1.05rem + 0.4vw, 1.375rem); line-height: 1.3;
  color: var(--ink); margin: 0; letter-spacing: -0.01em;
  transition: color var(--dur-small) var(--ease-horizon);
}
.faq__item summary:hover .faq__q { color: var(--sage-900); }
.faq__chevron {
  display: grid;
  place-items: center;
  width: 20px;
  height: 20px;
  color: var(--gold-700);
  transition: transform var(--dur-small) var(--ease-horizon);
}
.faq__item[open] .faq__chevron { transform: rotate(180deg); }
.faq__item::details-content {
  block-size: 0;
  overflow-y: clip;
  transition: block-size var(--dur-small) var(--ease-horizon), content-visibility var(--dur-small) allow-discrete;
}
.faq__item[open]::details-content { block-size: auto; }
.faq__a {
  font-size: 16px; font-weight: 300; line-height: 1.65;
  color: var(--ink-muted); margin: 0; max-width: 72ch; text-wrap: pretty;
  padding: 0 0 26px;
}

/* Mikro-CTA pod listą — zdanie z klikalnym linkiem i telefonem */
.faq__cta {
  margin: clamp(32px, 4vw, 48px) 0 0;
  font-size: 15.5px;
  font-weight: 300;
  line-height: 1.7;
  color: var(--ink-muted);
  max-width: 62ch;
}
.faq__cta-link {
  color: var(--sage-900);
  border-bottom: 1px solid var(--gold-400);
  padding-bottom: 2px;
  transition: color var(--dur-small) var(--ease-horizon), border-color var(--dur-small) var(--ease-horizon);
}
.faq__cta-link:hover { color: var(--gold-700); border-color: var(--gold-600); }
.faq__cta-tel { color: var(--sage-800); font-size: 14px; letter-spacing: 0.04em; }
.faq__cta-tel:hover { color: var(--sage-900); }

/* ── Fallbacki twarde ── */
@media (prefers-reduced-motion: reduce) {
  .scroll-progress { display: none !important; }
}

/* ── Polish-pass 2 (sesja-2): typografia, fokus na ciemnym, stopka ── */

/* Delikatny ujemny tracking treści (Apple −0.011em; dla PL diakrytyków
   ostrożniej) + zabijanie wdów we WSZYSTKICH akapitach treściowych. */
body { letter-spacing: -0.004em; }
.mono { letter-spacing: normal; }
.about__copy p, .howwork__desc, .kpi__label, .svc__desc { text-wrap: pretty; }

/* Fokus na ciemnych sekcjach: złota nić zamiast sage (sage-800 ginie na night) */
.hdr :focus-visible,
.kpi :focus-visible,
.closing :focus-visible,
.howwork :focus-visible,
.footer :focus-visible,
.mobile-cta:focus-visible {
  outline-color: var(--gold-300);
}

/* Linki stopki: animowane podkreślenie (scaleX od lewej), nie sam kolor */
.footer__col a {
  position: relative;
  display: inline-block;
}
.footer__col a::after {
  content: "";
  position: absolute;
  left: 0; right: 0; bottom: -2px;
  height: 1px;
  background: var(--sage-200);
  transform: scaleX(0);
  transform-origin: left;
  transition: transform 200ms var(--ease-horizon);
}
.footer__col a:hover::after,
.footer__col a:focus-visible::after { transform: scaleX(1); }

/* Dokument-zapowiedź w stopce (bez udawania linku) */
.footer__doc-soon { color: rgba(255, 255, 255, 0.66); }
.footer__doc-soon .mono { font-size: 9.5px; letter-spacing: 0.14em; text-transform: uppercase; color: rgba(255, 255, 255, 0.6); }

/* FAQ: pojedyncza linia na górze listy (stara warstwa dawała border-top
   na liście ORAZ na pierwszym itemie = podwójna kreska) */
.faq__list { border-top: 0; }

/* Linia horyzontu jako separator sekcji: hairline, ktory "wylania sie ze
   switu" od lewej (zloto -> kamien) — idea znaku z ksiegi par.01 niesie cala
   strone, nie tylko logo. */
.about, .services, .howwork, .benefits, .cases, .faq, .closing {
  border-top: 1px solid;
  border-image: linear-gradient(90deg, var(--gold-400, #c7a45c) 0, var(--line) min(34%, 420px), var(--line)) 1;
}
.footer {
  border-top: 1px solid;
  border-image: linear-gradient(90deg, var(--gold-500, #b08d45) 0, rgba(255, 255, 255, 0.12) min(34%, 420px), rgba(255, 255, 255, 0.12)) 1;
}

/* Scrollbar WebKit (Windows/Linux — macOS ma overlay) w temperaturze marki */
::-webkit-scrollbar { width: 10px; }
::-webkit-scrollbar-track { background: var(--stone-100); }
::-webkit-scrollbar-thumb { background: var(--sage-700); border-radius: 5px; border: 2px solid var(--stone-100); }

/* ════════════════════════════════════════════════════════════
   WARSTWA PRZEBUDOWY 2026-07-10 — sekcja DOWODOWA (about+powody+KPI)
   + tagline kart usług. Jasny oddech po kinie, typografia bohaterem.
   ════════════════════════════════════════════════════════════ */

/* Dowodowa („Nie konkurujemy ceną") stoi w .about pod galerią ekipy. */
.proof {
  padding-top: clamp(56px, 7vw, 96px);
  padding-bottom: clamp(64px, 7vw, 88px);
}

/* Hasło pozycjonujące — typografia gra główną rolę (plakat, nie akapit) */
.proof__haslo {
  font-family: var(--font-display-serif);
  font-weight: 400;
  font-size: clamp(1.75rem, 1.2rem + 2.6vw, 3.25rem);
  line-height: 1.12;
  letter-spacing: var(--track-d2);
  color: var(--ink);
  margin: 0;
  max-width: 20ch;
  text-wrap: balance;
}

/* Pasek KPI w dowodowej (jasne tło — kapitaliki i tabular-nums zostają) */
.proof__kpi {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  gap: 32px;
  margin-top: clamp(32px, 4vw, 44px);
  padding-top: clamp(24px, 3vw, 32px);
  border-top: 1px solid var(--line);
}
.proof__cell { display: flex; flex-direction: column; gap: 12px; }
.proof__num {
  font-size: clamp(42px, 4.2vw, 56px);
  font-weight: 300;
  line-height: 1;
  letter-spacing: var(--track-stat);
  color: var(--ink);
  font-variant-numeric: tabular-nums lining-nums;
}
.proof__unit {
  font-size: 0.32em;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--ink-muted);
}
.proof__label {
  font-size: 13px;
  line-height: 1.5;
  color: var(--ink-muted);
  margin: 0;
  max-width: 26ch;
}

/* Klikalny finał dowodowej — telefon wprost (link, nie przycisk:
   jedyny przycisk środka strony należy do procesu) */
.proof__cta { margin: clamp(36px, 4.4vw, 56px) 0 0; }
.proof__tel {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  font-size: 15px;
  letter-spacing: 0.08em;
  color: var(--sage-900);
  border-bottom: 1px solid var(--gold-400);
  padding-bottom: 6px;
  transition: color var(--dur-small) var(--ease-horizon), border-color var(--dur-small) var(--ease-horizon);
}
.proof__tel:hover { color: var(--gold-700); border-color: var(--gold-600); }


/* ═══════════════════════════════════════════════════════════════════════
   JAK DZIAŁAMY — układ dzielony: papier obok filmu (2026-09-16)
   ═══════════════════════════════════════════════════════════════════════ */
/* Po trzech rundach uwag Sebastiana (04.09: „bloki zasłaniają film", „klocki nadal
   zasłaniają obraz"; 16.09: „ma być widać JEDNOCZEŚNIE film i napisy") tekst schodzi
   z filmu. Lewa kolumna = papier i pełny kontrast atramentu (AA bez poświat i paneli),
   prawa = przelot dronem na całą wysokość ekranu, bez nakładek i ściemniania,
   przypięty (sticky) na czas przewijania kroków. Konsultacja 16.09 (dwa modele)
   potwierdziła kierunek: „separacja przestrzenna — film jako bohater, tekst na
   własnym, skontrastowanym tle". */
.howwork--split {
  padding: 0;
  display: grid;
  grid-template-columns: minmax(0, 46fr) minmax(0, 54fr);
  align-items: start;
  background: var(--paper);
}
.howwork--split .howwork__inner {
  grid-column: 1;
  grid-row: 1;
  box-sizing: border-box;
  min-height: 100vh;
  min-height: 100svh;
  display: flex;
  flex-direction: column;
  justify-content: center;
  /* lewy odstęp = krawędź kontenera pozostałych sekcji (tekst w jednej osi z resztą strony) */
  padding: clamp(72px, 10vh, 120px) clamp(32px, 4vw, 72px) clamp(72px, 10vh, 120px) max(24px, calc((100vw - var(--container)) / 2));
}
.howwork--split .howwork__head { max-width: 560px; }
.howwork--split .howwork__head .display-2 { margin-bottom: 0; }
.howwork--split .howwork__list {
  grid-template-columns: 1fr;
  gap: clamp(6px, 1.2vh, 14px);
  max-width: 560px;
  margin-top: clamp(36px, 5vh, 56px);
}
.howwork--split .howwork__item { padding: clamp(18px, 2.4vh, 26px) 0; }
.howwork--split .howwork__title { font-size: clamp(20px, 1.6vw, 24px); }
.howwork--split .howwork__desc { font-size: 17px; }
.howwork--split .howwork__cta { margin-top: clamp(36px, 5vh, 56px); }
.howwork--split .howwork__media {
  grid-column: 2;
  grid-row: 1;
  align-self: start;
  position: sticky;
  top: 0;
  height: 100vh;
  height: 100svh;
  overflow: hidden;
  background: var(--paper-tint);
  /* krawędź kadru: złota nić oddziela papier od filmu */
  box-shadow: inset 1px 0 0 rgba(199, 164, 92, 0.55);
}
.howwork--split .howwork__video {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  display: block;
  object-fit: cover;
  object-position: 58% center; /* budynek zostaje w kadrze przy pionowym wycinku z 16:9 */
}
@media (max-width: 880px) {
  .howwork--split { display: block; }
  /* film stoi u góry ekranu, kroki przewijają się pod nim */
  .howwork--split .howwork__media {
    position: sticky;
    top: 0;
    z-index: 2;
    height: 38vh;
    height: 38svh;
    box-shadow: 0 1px 0 rgba(199, 164, 92, 0.55);
  }
  .howwork--split .howwork__inner {
    position: relative;
    z-index: 1;
    min-height: 0;
    justify-content: flex-start;
    padding: clamp(40px, 6vh, 56px) 20px clamp(56px, 8vh, 80px);
  }
  .howwork--split .howwork__list { margin-top: 28px; }
}
@media (prefers-reduced-motion: reduce) {
  .howwork--split .howwork__media { position: relative; }
}

/* ════════════════════════════════════════════════════════════
   KIM JESTEŚMY — treść z zapalaniem słów + galeria ekipy (2026-09-04)
   Mechanika z nagrań referencyjnych: (1) słowa zapalają się wraz ze
   scrollem w paśmie czytania, (2) przypięta taśma zdjęć o różnych
   proporcjach, nachylonych jak nierówno powieszone ramki; hover rozjaśnia
   zdjęcie pod kursorem i przygasza pozostałe.
   ════════════════════════════════════════════════════════════ */
.about {
  display: block;
  background: var(--paper);
  padding-top: var(--section-pad);
}
/* Wstęp: nagłówek po lewej, zapalana treść po prawej (jak w nagraniu
   referencyjnym: tytuł i opis na jednej wysokości, w dwóch kolumnach) */
.about__intro {
  display: grid;
  grid-template-columns: minmax(0, 5fr) minmax(0, 6fr);
  column-gap: clamp(40px, 6vw, 96px);
  align-items: start;
  padding-bottom: clamp(48px, 6vw, 88px);
}
.about__intro .eyebrow { grid-column: 1 / -1; }
.about__intro .display-2 { max-width: 14ch; margin-bottom: 0; }
.about__copy { max-width: 52ch; padding-top: clamp(4px, 0.6vw, 10px); }
@media (max-width: 880px) {
  .about__intro { grid-template-columns: 1fr; row-gap: 28px; }
  .about__intro .display-2 { max-width: 20ch; }
}
.about__copy p {
  font-family: var(--font-display);
  font-weight: 300;
  font-size: clamp(1.25rem, 1rem + 1.1vw, 1.8rem);
  line-height: 1.42;
  letter-spacing: -0.012em;
  color: var(--ink);
  margin: 0 0 1.05em;
  text-wrap: pretty;
}
.about__copy p:last-child { margin-bottom: 0; }
/* Słowo po rozbiciu: krycie ustawia JS w każdej klatce przewijania (pasmo
   czytania). Bez JS / przy reduced-motion słowa są pełne od razu. */
.glow-word { display: inline-block; opacity: 1; transition: opacity 140ms linear; }
@media (prefers-reduced-motion: reduce) { .glow-word { opacity: 1 !important; } }

.team {
  position: relative;
  /* zapas bez JS / przy reduced-motion: taśma do przesunięcia palcem lub trackpadem;
     z JS film.js dodaje .team--pinned (przypięcie, przesuw sterowany scrollem) */
  overflow-x: auto;
  overflow-y: hidden;
  scrollbar-width: none;
  background: var(--paper-warm);
  border-top: 1px solid;
  border-image: linear-gradient(90deg, var(--gold-400, #c7a45c) 0, var(--line) min(34%, 420px), var(--line)) 1;
}
.team::-webkit-scrollbar { display: none; }
@media (prefers-reduced-motion: reduce) { .team { scrollbar-width: thin; } }
html.js .team--pinned { overflow: hidden; }
.team__track {
  display: flex;
  align-items: center;
  width: max-content;
  min-height: 100svh;
  gap: clamp(22px, 2.6vw, 40px);
  /* lewa krawędź = wspólna linia pionowa strony (jak nagłówki sekcji) */
  padding: clamp(64px, 9vh, 110px) calc(max(var(--gutter), (100% - var(--container)) / 2) + var(--gutter));
  will-change: transform;
}
.team__lead {
  flex: none;
  width: clamp(260px, 26vw, 360px);
  margin-right: clamp(8px, 2vw, 32px);
}
.team__lead .eyebrow { margin-bottom: 18px; }
.team__h {
  font-family: var(--font-display-serif);
  font-weight: 400;
  font-size: clamp(1.6rem, 1.2rem + 1.6vw, 2.6rem);
  line-height: 1.1;
  letter-spacing: var(--track-d2);
  color: var(--ink);
  margin: 0 0 14px;
  text-wrap: balance;
}
.team__lead-p {
  font-size: 15px;
  font-weight: 300;
  line-height: 1.6;
  color: var(--ink-muted);
  margin: 0;
  max-width: 30ch;
}
.team__item {
  --h: 42svh;
  flex: none;
  margin: 0;
  position: relative;
  height: var(--h);
  aspect-ratio: var(--ratio, 3 / 2);
}
.team__item--S { --h: 30svh; }
.team__item--L { --h: 54svh; }
/* Ramka: tu siedzi nachylenie i wysokość „zawieszenia" (CSS), a GSAP animuje
   wejście na samej figurze — obie warstwy transformów nie walczą ze sobą. */
.team__frame {
  position: absolute;
  inset: 0;
  transform: translateY(calc(var(--lift, 0) * 7vh)) rotate(var(--tilt, 0deg));
  transform-origin: 50% 42%;
  transition: transform var(--dur-medium) var(--ease-horizon);
}
.team__frame img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  border-radius: 6px;
  border: 1px solid rgba(255, 255, 255, 0.72);
  background: var(--stone-100);
  box-shadow:
    0 30px 60px -28px rgba(31, 27, 14, 0.45),
    0 6px 14px -8px rgba(19, 22, 19, 0.25);
  transition: filter var(--dur-medium) var(--ease-horizon);
}
.team__cap {
  position: absolute;
  left: 4px;
  top: calc(100% + 10px);
  font-size: 11px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--ink-muted);
  white-space: nowrap;
}
@media (hover: hover) and (pointer: fine) {
  .team__track:hover .team__frame img { filter: brightness(0.7) saturate(0.85); }
  .team__track .team__item:hover .team__frame img { filter: brightness(1.03) saturate(1); }
  .team__item:hover .team__frame {
    transform: translateY(calc(var(--lift, 0) * 7vh - 8px)) rotate(var(--tilt, 0deg));
  }
  .team__item:hover { z-index: 2; }
}
.team__end {
  flex: none;
  width: clamp(260px, 24vw, 340px);
  margin-left: clamp(8px, 2vw, 32px);
  padding: 28px 28px 24px;
  border-radius: 4px;
  background: rgba(13, 15, 13, 0.9);
  color: var(--white-soft);
  border: 1px solid rgba(244, 242, 236, 0.13);
  border-top: 1px solid rgba(232, 201, 136, 0.5);
  box-shadow:
    inset 0 1px 0 rgba(255, 255, 255, 0.09),
    0 18px 40px -24px rgba(13, 15, 13, 0.5);
}
.team__end-p {
  font-family: var(--font-display-serif);
  font-size: clamp(1.2rem, 1rem + 0.8vw, 1.6rem);
  line-height: 1.25;
  letter-spacing: -0.01em;
  margin: 0 0 18px;
  text-wrap: balance;
}
.team__end-link {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  font-size: 12px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--gold-300);
  border-bottom: 1px solid rgba(232, 201, 136, 0.45);
  padding-bottom: 6px;
  transition: color var(--dur-small) var(--ease-horizon), border-color var(--dur-small) var(--ease-horizon);
}
.team__end-link:hover { color: var(--gold-200); border-color: var(--gold-300); }
.team :focus-visible { outline-color: var(--gold-500); }
/* Sugestia kierunku pod taśmą (2026-09-04): licznik + złota linia postępu na
   wspólnej linii pionowej strony; wypełnienie pisze film.js (scaleX = postęp) */
.team__progress {
  display: none;
  position: absolute;
  left: calc(max(var(--gutter), (100% - var(--container)) / 2) + var(--gutter));
  right: calc(max(var(--gutter), (100% - var(--container)) / 2) + var(--gutter));
  bottom: clamp(28px, 5vh, 48px);
  align-items: center;
  gap: 18px;
  pointer-events: none;
}
html.js .team--pinned .team__progress { display: flex; }
.team__count {
  flex: none;
  font-size: 11px;
  letter-spacing: 0.16em;
  color: var(--ink-muted);
  font-variant-numeric: tabular-nums;
}
.team__bar {
  position: relative;
  flex: 1;
  height: 1px;
  background: var(--line);
}
.team__bar-fill {
  position: absolute;
  inset: 0;
  background: var(--gold-400);
  transform: scaleX(0);
  transform-origin: left;
}

/* Telefon: z JS taśma jest PRZYPIĘTA jak na desktopie (od 2026-09-04 wieczór);
   przesuw palcem z przyciąganiem = wyłącznie zapas bez JS / reduced-motion */
@media (max-width: 880px) {
  .team:not(.team--pinned) {
    scroll-snap-type: x proximity;
    -webkit-overflow-scrolling: touch;
  }
  .team:not(.team--pinned) .team__track { min-height: 0; padding: 44px 20px 58px; }
  /* tryb przypięty: nagłówek stoi u góry ekranu (film.js trzyma go w miejscu
     przesunięciem odwrotnym do taśmy), taśma wyśrodkowana poniżej, linia
     postępu nad paskiem „Umów wizję" */
  html.js .team--pinned .team__track { min-height: 100svh; padding: 120px 20px 0; }
  html.js .team--pinned .team__lead { position: absolute; top: clamp(90px, 11svh, 108px); left: 20px; width: min(84vw, 340px); margin: 0; } /* pod paskiem nawigacji (77 px), który wraca przy ruchu w górę */
  .team__track { gap: 18px; }
  .team__progress { left: 20px; right: 20px; bottom: 92px; }
  /* węższa karta otwierająca: pierwsze zdjęcie wystaje zza niej o ~1/3 ekranu
     = zaproszenie do przesunięcia palcem (72 vw chowało je prawie w całości) */
  .team__lead { width: 62vw; margin-right: 6px; scroll-snap-align: start; }
  /* na telefonie wielkość liczona od SZEROKOŚCI ekranu (wysokość z proporcji),
     żeby poziome kadry nie wyjeżdżały poza 390 px */
  /* większe kadry (2026-09-04 wieczór): przy przypiętej taśmie ekran jest wysoki,
     62/46/80 vw robiło cienki pasek w środku pustki */
  .team__item { height: auto; width: 74vw; scroll-snap-align: center; }
  .team__item--S { width: 56vw; }
  .team__item--L { width: 88vw; }
  .team__frame { transform: translateY(calc(var(--lift, 0) * 4vh)) rotate(var(--tilt, 0deg)); }
  .team__end { width: 72vw; margin-left: 6px; scroll-snap-align: end; }
}

/* ════════════════════════════════════════════════════════════
   NIE KONKURUJEMY CENĄ — pierścień kart 3D (2026-09-04)
   Mechanika z nagrania referencyjnego („Recognition"): karty ustawione
   w przestrzeni wokół osi, boczne obrócone w perspektywie, w centrum stała
   karta ze zdjęciem; ruch kursora obraca pierścień (JS, lerp), na telefonie
   obraca go przewijanie. Bez JS / reduced-motion: siatka 2×2.
   ════════════════════════════════════════════════════════════ */
.ring { position: relative; }
html.js .ring--3d { padding-bottom: 52px; /* miejsce na strzałkę .cue--ring (48 px) pod sceną, 4 px pod krawędzią przedniej karty (tylko tryb 3D) */ }
.ring__head { max-width: 760px; margin-bottom: clamp(8px, 1.4vw, 16px); }
.ring__stage {
  position: relative;
  min-height: 640px;
}
html.js .ring--3d .ring__stage {
  /* scena mieści się w oknie razem z nagłówkiem (sekcja jest przypięta);
     większa od 2026-09-04 („cała animacja ma zajmować więcej miejsca"), ale
     liczona z WYSOKOŚCI okna: start pinu 92 + nagłówek ~185 + scena + strzałka
     52 ≤ 100vh → scena ≤ 100vh − 330 (zapas 1 px). 900 px → 570; 768 → 438; 720 → 390 (min 380).
     Promień pionowy orbity dobiera JS z wysokości sceny (initProofRing). */
  min-height: clamp(380px, min(66vh, 100vh - 330px), 660px);
}
.ring__center {
  width: min(400px, 60vw);
  margin: 0 auto;
  border-radius: 6px;
  overflow: hidden;
  border: 1px solid rgba(255, 255, 255, 0.7);
  box-shadow:
    0 34px 70px -34px rgba(31, 27, 14, 0.5),
    0 8px 18px -10px rgba(19, 22, 19, 0.3);
  background: var(--stone-100);
}
.ring__center img { width: 100%; height: auto; aspect-ratio: 3 / 2; object-fit: cover; display: block; }
.ring__cards {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 20px;
  margin-top: 28px;
}
.ring__card { list-style: none; }
.ring__card-in {
  height: 100%;
  padding: 22px 24px 20px;
  border-radius: 6px;
  /* kryjące (nie szkło): karty nachodzą na siebie w 3D i tekst tylnej
     nie może prześwitywać przez przednią */
  background: rgb(17, 19, 17);
  border: 1px solid rgba(244, 242, 236, 0.13);
  border-top: 1px solid rgba(232, 201, 136, 0.55);
  /* cień rośnie z głębią (--depth 0…1 pisze film.js na li): przód „wychodzi"
     ze strony, tył ledwie muska papier */
  box-shadow:
    inset 0 1px 0 rgba(255, 255, 255, 0.09),
    0 calc(12px + 26px * var(--depth, 1)) calc(28px + 40px * var(--depth, 1)) calc(-30px + 4px * var(--depth, 1)) rgba(13, 15, 13, calc(0.28 + 0.5 * var(--depth, 1)));
  color: var(--white-soft);
  transition:
    transform var(--dur-small) var(--ease-horizon),
    background var(--dur-small) var(--ease-horizon),
    box-shadow var(--dur-small) var(--ease-horizon);
}
.ring__num { display: block; font-size: 11px; letter-spacing: 0.18em; color: var(--gold-300); margin-bottom: 12px; }
.ring__title {
  font-family: var(--font-display-serif);
  font-weight: 400;
  font-size: clamp(1.15rem, 1rem + 0.5vw, 1.4rem);
  line-height: 1.2;
  letter-spacing: -0.01em;
  margin: 0;
  text-wrap: balance;
}
.ring__more { margin-top: 14px; border-top: 1px solid rgba(244, 242, 236, 0.14); }
.ring__more summary {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  padding: 12px 0 2px; cursor: pointer; list-style: none;
  font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.16em; text-transform: uppercase;
  color: rgba(244, 242, 236, 0.72);
  transition: color var(--dur-small) var(--ease-horizon);
}
.ring__more summary::-webkit-details-marker { display: none; }
.ring__more summary:hover, .ring__more[open] summary { color: var(--gold-200); }
.ring__more-icon { position: relative; width: 14px; height: 14px; flex-shrink: 0; }
.ring__more-icon::before, .ring__more-icon::after {
  content: ""; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); background: currentColor;
}
.ring__more-icon::before { width: 12px; height: 1px; }
.ring__more-icon::after { width: 1px; height: 12px; transition: transform var(--dur-small) var(--ease-horizon), opacity var(--dur-small) var(--ease-horizon); }
.ring__more[open] .ring__more-icon::after { transform: translate(-50%, -50%) rotate(90deg); opacity: 0; }
.ring__desc {
  font-size: 14px; font-weight: 300; line-height: 1.55;
  color: rgba(244, 242, 236, 0.86); margin: 0; padding: 10px 0 4px; text-wrap: pretty;
}
/* (podpis „Przewijaj, karty okrążają zdjęcie" zdjęty 2026-09-04 — zastąpiła go
   strzałka .cue--ring, style przy .hero__cue) */
.ring :focus-visible { outline-color: var(--gold-300); }

/* Tryb 3D — włącza JS (klasa na .ring), tylko gdy ruch dozwolony */
html.js .ring--3d .ring__stage { overflow: visible; }
html.js .ring--3d .ring__center {
  position: absolute;
  left: 50%;
  top: 50%;
  width: min(460px, 34vw, 50vh); /* 360 → 460 px (2026-09-04: „zdjęcie w środku ma być większe"); 50vh = niskie okna */
  transform: translate(-50%, -50%);
  z-index: 30;                             /* karty z przodu orbity nad zdjęciem, z tyłu pod nim */
  margin: 0;
}
html.js .ring--3d .ring__orbit {
  position: absolute;
  inset: 0;
  margin: 0;
  /* perspektywa TU (wspólny rodzic zdjęcia i kart), karty w trybie płaskim:
     obrócone płaszczyzny nie przecinają się w prawdziwym 3D (tekst tylnej
     karty „wychodził" przez przednią), a kolejność nakładania daje z-index */
  perspective: 1500px;
  perspective-origin: 50% 45%;
  transform-style: flat;
}
html.js .ring--3d .ring__cards { display: contents; }
html.js .ring--3d .ring__card {
  position: absolute;
  left: 50%;
  top: 50%;
  width: min(316px, 25vw, 40vh); /* 286 → 316 px (2026-09-04); 40vh = niskie okna */
  margin: 0;
  transform-style: flat;
  will-change: transform;
  z-index: 2;
}
html.js .ring--3d .ring__card-in { backface-visibility: hidden; }
@media (hover: hover) and (pointer: fine) {
  html.js .ring--3d .ring__card:hover .ring__card-in {
    transform: translateY(-8px);
    background: rgb(26, 30, 26);
    box-shadow:
      inset 0 1px 0 rgba(255, 255, 255, 0.12),
      0 34px 64px -26px rgba(13, 15, 13, 0.75);
  }
  html.js .ring--3d .ring__card:hover { z-index: 5; }
}
@media (max-width: 880px) {
  .ring__stage { min-height: 0; }
  html.js .ring--3d .ring__orbit { perspective: 1100px; }
  .ring__cards { grid-template-columns: 1fr; }
  /* 58vh zamiast 60: pod sceną musi zostać miejsce na strzałkę NAD paskiem
     „Umów wizję" (przypięta sekcja + pasek zajmuje 66 px od dołu ekranu) */
  html.js .ring--3d .ring__stage { min-height: clamp(360px, min(58vh, 100vh - 295px), 560px); overflow: hidden; margin-inline: calc(-1 * var(--gutter)); } /* 375×667: strzałka nad paskiem CTA; JS (fitStage) doprecyzowuje z realnego nagłówka */
  html.js .ring--3d .ring__center { width: 64vw; top: 50%; }  /* 50 → 64 vw (2026-09-04) */
  html.js .ring--3d .ring__card { width: min(203px, 52vw); top: 50%; } /* 56 → 52 vw: boczna karta ucięta o ~46 px zamiast 60 (świadomy „peek") */
  html.js .ring--3d { padding-bottom: 40px; }
}
@media (prefers-reduced-motion: reduce) {
  html.js .ring--3d .ring__card:hover .ring__card-in { transform: none; }
}

/* ════════════════════════════════════════════════════════════
   CO OFERUJEMY — zakładki usług ze zdjęciem (2026-09-04)
   Mechanika z nagrania referencyjnego: pigułki nad obrazem, aktywna z
   jaśniejszym tłem i obrysem, klik = crossfade ~280 ms, podpis zmienia się
   z zakładką, strzałki ‹ › w dolnych rogach obrazu. U nas 6 pigułek w dwóch
   rzędach po 3 i panel z treścią usługi obok zdjęcia.
   ════════════════════════════════════════════════════════════ */
.svc { margin-top: clamp(8px, 1.5vw, 16px); }
.svc__tabs {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 10px;
  max-width: 900px;
  margin: 0 0 clamp(24px, 3vw, 36px);
}
.svc__tab {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  min-height: 48px;
  padding: 11px 18px;
  border-radius: 999px;
  border: 1px solid var(--line);
  background: rgba(255, 255, 255, 0.5);
  font-family: var(--font-display);
  font-size: 14px;
  font-weight: 500;
  letter-spacing: 0.01em;
  color: var(--ink-muted);
  cursor: pointer;
  transition:
    color var(--dur-small) var(--ease-horizon),
    background var(--dur-small) var(--ease-horizon),
    border-color var(--dur-small) var(--ease-horizon),
    box-shadow var(--dur-small) var(--ease-horizon),
    transform var(--dur-small) var(--ease-horizon);
}
.svc__tab-icon { display: grid; place-items: center; color: var(--gold-700); }
.svc__tab-icon svg { width: 18px; height: 18px; }
@media (hover: hover) {
  .svc__tab:hover { color: var(--ink); border-color: var(--sage-300); background: rgba(255, 255, 255, 0.85); transform: translateY(-2px); }
}
.svc__tab[aria-selected="true"] {
  color: var(--white-soft);
  background: rgba(13, 15, 13, 0.92);
  border-color: rgba(232, 201, 136, 0.55);
  box-shadow:
    inset 0 1px 0 rgba(255, 255, 255, 0.09),
    0 14px 30px -18px rgba(13, 15, 13, 0.6);
}
.svc__tab[aria-selected="true"] .svc__tab-icon { color: var(--gold-300); }
.svc__stage {
  display: grid;
  grid-template-columns: minmax(0, 1.3fr) minmax(0, 1fr);
  grid-template-areas: "media panel" "caps panel";
  column-gap: clamp(28px, 4vw, 56px);
  row-gap: 12px;
  align-items: start;
}
.svc__media {
  grid-area: media;
  position: relative;
  aspect-ratio: 16 / 10;
  border-radius: 8px;
  overflow: hidden;
  border: 1px solid rgba(255, 255, 255, 0.72);
  background: var(--stone-100);
  box-shadow:
    0 30px 60px -30px rgba(31, 27, 14, 0.45),
    0 6px 14px -8px rgba(19, 22, 19, 0.25);
}
.svc__fig {
  position: absolute;
  inset: 0;
  margin: 0;
  opacity: 0;
  transition: opacity 280ms var(--ease-horizon);
}
.svc__fig.is-active { opacity: 1; }
.svc__fig img { width: 100%; height: 100%; object-fit: cover; display: block; }
.svc__arrow {
  position: absolute;
  bottom: 14px;
  width: 42px;
  height: 42px;
  border-radius: 50%;
  display: grid;
  place-items: center;
  color: var(--white-soft);
  background: rgba(13, 15, 13, 0.55);
  border: 1px solid rgba(244, 242, 236, 0.28);
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
  cursor: pointer;
  transition: background var(--dur-small) var(--ease-horizon), border-color var(--dur-small) var(--ease-horizon), box-shadow var(--dur-small) var(--ease-horizon);
}
.svc__arrow--prev { left: 14px; }
.svc__arrow--next { right: 14px; }
@media (hover: hover) {
  .svc__arrow:hover { background: rgba(13, 15, 13, 0.8); border-color: rgba(232, 201, 136, 0.6); }
}
.svc__caps { grid-area: caps; margin: 0; min-height: 1.4em; position: relative; }
.svc__cap {
  display: none;
}
.svc__cap[hidden] { display: none; }
.svc__cap.is-active {
  display: block;
  font-size: 11px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--ink-muted);
}
.svc__cap.is-active { animation: svcIn 320ms var(--ease-horizon); }
.svc__panels { grid-area: panel; }
.svc__panel[hidden] { display: none; }
.svc__panel.is-active { display: block; animation: svcIn 360ms var(--ease-horizon); }
@keyframes svcIn { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }
.svc__title {
  font-family: var(--font-display-serif);
  font-weight: 400;
  font-size: clamp(1.5rem, 1.2rem + 1.1vw, 2.1rem);
  line-height: 1.12;
  letter-spacing: var(--track-d2);
  color: var(--ink);
  margin: 0 0 10px;
  text-wrap: balance;
}
.svc__tagline {
  font-family: var(--font-mono);
  font-size: 11px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--sage-800);
  margin: 0 0 18px;
  display: flex; align-items: center; gap: 12px;
}
.svc__tagline::before { content: ""; width: 24px; height: 1px; background: var(--gold-400); flex: none; }
.svc__desc {
  font-size: 16px;
  font-weight: 300;
  line-height: 1.62;
  color: var(--ink-muted);
  margin: 0 0 18px;
  max-width: 48ch;
}
.svc__more { border-top: 1px solid var(--line); }
.svc__more summary {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  padding: 14px 0 4px; cursor: pointer; list-style: none;
  font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.16em; text-transform: uppercase;
  color: var(--ink-muted);
  transition: color var(--dur-small) var(--ease-horizon);
}
.svc__more summary::-webkit-details-marker { display: none; }
.svc__more summary:hover, .svc__more[open] summary { color: var(--gold-700); }
.svc__more-icon { position: relative; width: 14px; height: 14px; flex-shrink: 0; }
.svc__more-icon::before, .svc__more-icon::after {
  content: ""; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); background: currentColor;
}
.svc__more-icon::before { width: 12px; height: 1px; }
.svc__more-icon::after { width: 1px; height: 12px; transition: transform var(--dur-small) var(--ease-horizon), opacity var(--dur-small) var(--ease-horizon); }
.svc__more[open] .svc__more-icon::after { transform: translate(-50%, -50%) rotate(90deg); opacity: 0; }
.svc__groups { display: flex; flex-direction: column; gap: 14px; padding: 12px 0 6px; }
.svc__group-h {
  font-family: var(--font-mono); font-size: 10.5px; font-weight: 400; letter-spacing: 0.14em;
  text-transform: uppercase; margin: 0 0 8px; color: var(--gold-700);
}
.svc__items { display: flex; flex-direction: column; gap: 7px; }
.svc__items li { font-size: 14.5px; font-weight: 300; line-height: 1.5; color: var(--ink-2); position: relative; padding-left: 16px; }
.svc__items li::before { content: ""; position: absolute; left: 0; top: 0.62em; width: 7px; height: 1px; background: var(--gold-500); }
@media (max-width: 1100px) {
  .svc__stage { grid-template-columns: 1fr; grid-template-areas: "media" "caps" "panel"; }
}
@media (max-width: 880px) {
  .svc__tabs { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; }
  .svc__tab { min-height: 46px; padding: 10px 12px; font-size: 13px; gap: 8px; }
  .svc__tab-icon svg { width: 16px; height: 16px; }
  .svc__media { aspect-ratio: 4 / 3; }
}
@media (prefers-reduced-motion: reduce) {
  .svc__fig, .svc__cap.is-active, .svc__panel.is-active { transition: none; animation: none; }
}

/* ════════════════════════════════════════════════════════════
   OŻYWIENIE PRZYCISKÓW I LINKÓW (2026-09-04, uwaga Sebastiana: „strona nie
   wydaje się żyć, jak się na coś najedzie"). Ruch samych przycisków ku
   kursorowi robi film.js initMagnetic (desktop z myszą); tu: reakcje hoveru
   i dotyku, które nie wymagają JS. Zalewki .btn--primary/.hdr__cta są przy
   ich definicjach wyżej.
   ════════════════════════════════════════════════════════════ */
/* strzałki w linkach tekstowych odsuwają się w prawo */
.proof__tel > span[aria-hidden],
.team__end-link > span[aria-hidden] { display: inline-block; transition: transform 320ms var(--ease-horizon); }
.ring__more-icon, .svc__more-icon { transition: transform var(--dur-small) var(--ease-horizon); }
/* wyłącznie urządzenia z kursorem: na dotyku :hover przykleja się po tapnięciu
   aż do następnego dotknięcia (uwaga adwokata diabła) */
@media (hover: hover) {
  .proof__tel:hover > span[aria-hidden],
  .team__end-link:hover > span[aria-hidden] { transform: translateX(4px); }
  /* akordeony: chevron / plus reagują na najechanie */
  .faq__item summary:hover .faq__chevron { transform: translateY(2px); }
  .faq__item[open] summary:hover .faq__chevron { transform: rotate(180deg) translateY(-2px); }
  .ring__more summary:hover .ring__more-icon,
  .svc__more summary:hover .svc__more-icon { transform: scale(1.18); }
  /* pigułki (uniesienie w ich definicji wyżej) i strzałki galerii usług: cień */
  .svc__tab:hover { box-shadow: 0 12px 26px -16px rgba(13, 15, 13, 0.35); }
  .svc__arrow:hover { box-shadow: 0 10px 24px -12px rgba(13, 15, 13, 0.55); }
}
/* D6: po domknięciu poprzedniego pytania kliknięte przewija się pod pasek */
.faq__item { scroll-margin-block: 100px; }
/* dotyk / klik bez myszy: przycisk ugina się pod palcem (na desktopie z myszą
   transform jest inline z film.js, więc tam tę rolę pełni GSAP) */
.btn:active, .hdr__cta:active, .svc__tab:active, .svc__arrow:active, .hero__social-link:active,
.mobile-cta:active, .team__end-link:active, .proof__tel:active, .faq__cta-link:active { transform: scale(0.97); }
@media (prefers-reduced-motion: reduce) {
  .btn:active, .hdr__cta:active, .svc__tab:active, .svc__arrow:active, .hero__social-link:active,
  .mobile-cta:active, .team__end-link:active, .proof__tel:active, .faq__cta-link:active { transform: none; }
  .btn > span[aria-hidden], .hdr__cta > span[aria-hidden],
  .proof__tel > span[aria-hidden], .team__end-link > span[aria-hidden] { transition: none; }
}
