/* ==========================================================================
   Tokeny — wszystkie decyzje wizualne w jednym miejscu (brief 4.1–4.5)
   ========================================================================== */
:root {
  /* Kolor */
  --paper: #FAFAF7;
  --ink:   #111111;
  --ink-2: #6E6E6A;                 /* tekst pomocniczy, 4.9:1 */
  --ink-3: #73736E;                 /* metadane: przyciemnione z #A8A8A3, żeby mieć 4.5:1 (patrz README) */
  --ink-4: #A8A8A3;                 /* wartość z briefu — tylko elementy nietekstowe */
  --hair:  rgba(17, 17, 17, .14);
  --accent: var(--ink);             /* marka czarno-biała: kropka w znaku = kolor tuszu */
  --veil:  rgba(0, 0, 0, .5);       /* przyciemnienie nad panelem: widać, że klik wraca */

  /* Typografia */
  --font: "Helvetica Neue", Helvetica, Arial, sans-serif;
  --fw-regular: 400;
  --fw-medium: 500;
  --fs-name: 22px;                  /* imię, tytuły sekcji */
  --fs-project: 18px;               /* tytuł projektu w case study */
  --fs-text: 15px;
  --fs-meta: 12px;
  --fs-mail: 22px;
  --lh-text: 1.6;
  --lh-tight: 1.2;
  --tracking-tight: -0.01em;

  /* Odstępy: wielokrotności 8 px */
  --s-1: 8px;
  --s-2: 16px;
  --s-3: 24px;
  --s-4: 32px;
  --s-5: 40px;
  --s-6: 48px;
  --s-8: 64px;
  --s-12: 96px;
  --section-gap: min(24vh, 200px);
  --header-h: 56px;
  --footer-h: 96px;                 /* stopka na desktopie — podgląd mieści się nad nią */
  --sheet-top: var(--s-4);          /* odstęp panelu od góry ekranu */
  --hairline: 1px;

  /* Siatka */
  --cols: 12;
  --gutter: 24px;
  --margin: 24px;
  --max: 1280px;

  /* Ruch */
  --ease: cubic-bezier(.65, 0, .35, 1);
  --t-draw: 1.8s;
  --t-fade: 600ms;
  --t-stagger: 80ms;
  --t-line: 400ms;
  --t-swap: 500ms;
  --t-sheet: 700ms;                 /* wysuwanie panelu */
  --rise: 8px;
}

@media (min-width: 768px) {
  :root { --margin: 6vw; --sheet-top: var(--s-8); }
}

@media (min-width: 1024px) {
  :root {
    --fs-name: 28px;
    --fs-project: 20px;
    --fs-mail: 28px;
  }
}

/* Tryb ciemny: domyślnie zawsze jasny (niezależnie od systemu); przełącznik w nagłówku włącza ciemny
   i zapisuje wybór (data-theme). */
:root[data-theme="dark"] {
  color-scheme: dark;
  --paper:  #000000;
  --ink:    #EDEDE8;
  --ink-2:  #A3A39E;              /* 7.4:1 */
  --ink-3:  #8C8C87;              /* 5.5:1 */
  --ink-4:  #5A5A56;
  --hair:   rgba(237, 237, 232, .16);
}

/* Grafiki jednokolorowe (SVG z czarną kreską) odwrócone w trybie ciemnym */
:root[data-theme="dark"] .mono { filter: invert(1) hue-rotate(180deg); }

/* Linie 0,5 px na ekranach retina */
@media (min-resolution: 2dppx) {
  :root { --hairline: .5px; }
}

/* ==========================================================================
   Reset
   ========================================================================== */
*, *::before, *::after { box-sizing: border-box; }

html {
  color-scheme: light;
  -webkit-text-size-adjust: 100%;
  text-size-adjust: 100%;
  scroll-behavior: smooth;
}

body {
  margin: 0;
  background: var(--paper);
  color: var(--ink);
  font-family: var(--font);
  font-size: var(--fs-text);
  font-weight: var(--fw-regular);
  line-height: var(--lh-text);
  font-synthesis: none;
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
  overflow-x: clip;
}

h1, h2, h3, h4, p, ul, ol, dl, dd, figure, blockquote { margin: 0; }
ul, ol { padding: 0; list-style: none; }
h1, h2, h3, h4 { font-size: inherit; font-weight: var(--fw-medium); }
img, svg, video { display: block; max-width: 100%; }
img, video { height: auto; }
button { font: inherit; color: inherit; background: none; border: 0; padding: 0; cursor: pointer; }

a { color: inherit; text-decoration: none; }

::selection { background: var(--ink); color: var(--paper); }

/* Focus: cienka linia zamiast systemowej obwódki */
:focus { outline: none; }
:focus-visible {
  outline: 1px solid var(--ink);
  outline-offset: 4px;
}

.visually-hidden {
  position: absolute !important;
  width: 1px; height: 1px;
  overflow: hidden;
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  white-space: nowrap;
}

/* ==========================================================================
   Siatka 12 kolumn
   ========================================================================== */
.wrap {
  width: 100%;
  max-width: calc(var(--max) + 2 * var(--margin));
  margin-inline: auto;
  padding-inline: var(--margin);
}

/* Mobile: jedna kolumna. Od 768 px: 12 kolumn. */
.grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  column-gap: var(--gutter);
}

.grid > * { grid-column: 1 / -1; }

@media (min-width: 768px) {
  .grid { grid-template-columns: repeat(var(--cols), minmax(0, 1fr)); }
}

/* ==========================================================================
   Typografia
   ========================================================================== */
.t-name {
  font-size: var(--fs-name);
  font-weight: var(--fw-medium);
  line-height: var(--lh-tight);
  letter-spacing: var(--tracking-tight);
}

.t-project {
  font-size: var(--fs-project);
  font-weight: var(--fw-medium);
  line-height: var(--lh-tight);
  letter-spacing: var(--tracking-tight);
}

.t-text {
  font-size: var(--fs-text);
  line-height: var(--lh-text);
  max-width: 34em;
}

.t-muted { color: var(--ink-2); }

.t-meta {
  font-size: var(--fs-meta);
  line-height: 1.5;
  color: var(--ink-3);
  font-variant-numeric: tabular-nums;
}

.rule {
  border: 0;
  border-top: var(--hairline) solid var(--hair);
  margin: 0;
}

/* ==========================================================================
   Symbole (SVG, kreska 1 px)
   ========================================================================== */
.symbol {
  --size: 48;                       /* rozmiar w px, ustawiany przy użyciu */
  width: calc(var(--size) * 1px);
  height: calc(var(--size) * 1px);
  fill: none;
  stroke: currentColor;
  stroke-width: calc(48 / var(--size)); /* zawsze 1 px na ekranie */
  overflow: visible;
}

/* Bez vector-effect: non-scaling-stroke. Chrome liczy wtedy kreskowanie w pikselach ekranu,
   więc pathLength="1" przestaje działać i symbol > 48 px rysuje się tylko w części.
   Grubość 1 px trzyma za to stroke-width liczony z --size. */
.symbol .hanko { fill: currentColor; stroke: none; }   /* kropka w znaku w kolorze tuszu */

/* Rysowanie kreską. Stan końcowy jest domyślny — bez JS i w druku znak jest narysowany. */
.is-drawing .symbol .stroke {
  /* 1.02 zamiast 1: bez szwu w miejscu, gdzie linia się zamyka */
  stroke-dasharray: 1.02;
  stroke-dashoffset: 1.02;
  animation: draw var(--t-draw) var(--ease) forwards;
  animation-delay: calc(var(--i, 0) * 120ms);
}

.is-drawing .symbol .hanko {
  opacity: 0;
  animation: appear var(--t-fade) var(--ease) forwards;
  animation-delay: calc(var(--t-draw) * .8);
}

@keyframes draw { to { stroke-dashoffset: 0; } }
@keyframes appear { to { opacity: 1; } }

/* ==========================================================================
   Obrazy i placeholdery — zawsze w docelowej proporcji
   ========================================================================== */
.media {
  position: relative;
  aspect-ratio: var(--ratio, 4 / 5);
  background: var(--paper);
}

.media img,
.media video {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.media--16x10 { --ratio: 16 / 10; }
.media--4x5   { --ratio: 4 / 5; }

/* ==========================================================================
   Nagłówek (brief 5.0)
   ========================================================================== */
.skip {
  position: absolute;
  left: var(--margin);
  top: -100px;
  z-index: 20;
  padding: var(--s-1) 0;
  font-size: var(--fs-meta);
}
.skip:focus-visible { top: var(--s-2); }

/* Przełącznik trybu i PL/EN tylko na górze strony - odjeżdżają przy przewijaniu (bez paska nawigacji) */
.site-header {
  position: relative;
  z-index: 10;
}

.site-header__in {
  height: var(--header-h);
  display: flex;
  align-items: center;
  justify-content: space-between;
}

/* Język (lewy górny róg) i przełącznik trybu (prawy) — mają sens tylko z JS */
.theme {
  order: 2;
  display: none;
  width: 32px;
  height: 32px;
  margin-right: -8px;
  align-items: center;
  justify-content: center;
  color: var(--ink);
}
.js .theme { display: inline-flex; }

.site-header__nav {
  display: flex;
  align-items: center;
  gap: var(--s-1);
  color: var(--ink);
}

.site-header__nav a,
.lang { padding-block: var(--s-1); }

/* Przełącznik języka ma sens tylko z JS */
.lang { display: none; }
.js .lang { display: inline; }

.lang [data-lang] { color: var(--ink-3); transition: color var(--t-line) var(--ease); }
html[lang="pl"] .lang [data-lang="pl"],
html[lang="en"] .lang [data-lang="en"] { color: var(--ink); }

/* ==========================================================================
   Paski przewijania w stylu strony: cienkie, kwadratowe, w kolorze szarości metadanych.
   Firefox, Chrome / Edge 121+, Safari 26.2+: standardowe scrollbar-width / scrollbar-color.
   Starsze Safari i Chromium: ::-webkit-scrollbar (tylko gdy przeglądarka nie zna standardu,
   bo Chrome przy ustawionym scrollbar-color pomija pseudo-elementy).
   ========================================================================== */
html { scrollbar-width: thin; scrollbar-color: var(--ink-4) transparent; }
* { scrollbar-width: thin; scrollbar-color: var(--ink-4) transparent; }
@supports not (scrollbar-color: auto) {
  ::-webkit-scrollbar { width: 8px; height: 8px; background: transparent; }
  ::-webkit-scrollbar-track { background: transparent; }
  ::-webkit-scrollbar-thumb { background: var(--ink-4); border: 2px solid var(--paper); border-radius: 0; }
  ::-webkit-scrollbar-thumb:hover { background: var(--ink-3); }
  ::-webkit-scrollbar-corner { background: transparent; }
}

/* ==========================================================================
   Strona główna: hero (awatar, imię, hasło, akapit, karuzela) → Portfolio (linki) → Kontakt.
   Strona przewija się normalnie. Desktop: po prawej sfera z projektami - przyklejona (sticky)
   na czas hero i portfolio, kontakt pod spodem na całą szerokość.
   ========================================================================== */
.home { display: grid; grid-template-columns: minmax(0, 1fr); }
.home__main { min-width: 0; }
.home__sphere { display: none; }
@media (min-width: 1024px) {
  .home { grid-template-columns: repeat(var(--cols), minmax(0, 1fr)); column-gap: var(--gutter); }
  .home__main { grid-column: 1 / 6; }        /* kolumna 6 = stała przerwa od sfery */
  .home__sphere {
    grid-column: 7 / -1;
    grid-row: 1 / span 2;              /* obok hero, portfolio i kontaktu */
    position: sticky;
    top: 0;
    height: 100svh;
    align-self: start;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    --d: min(36vw, 62svh, 640px);             /* średnica sfery (podpis pod nią liczy się od niej) */
  }
}

/* ==========================================================================
   Hero
   ========================================================================== */
.hero { padding-block: var(--s-12); }
/* ==========================================================================
   Desktop: przewijanie po sekcjach. Każda sekcja (start, Portfolio, Rekomendacje, Kontakt) = jeden ekran,
   treść na środku - na wysokości środka sfery; scroll zatrzymuje się na każdej sekcji (scroll snap).
   Nagłówek leży na pierwszym ekranie, pasek z profilami na ostatnim. Systemowy pasek przewijania
   zastępuje nawigator sekcji (.scrollnav).
   ========================================================================== */
@media (min-width: 1024px) {
  .site-header { position: absolute; top: 0; left: 0; right: 0; }
  .home { position: relative; }
  .home .hero, .home .work, .home .process, .home .recs, .home .site-footer {
    min-height: 100svh;
    display: flex;
    flex-direction: column;
    justify-content: center;
    padding-block: var(--s-8);
    scroll-snap-align: start;
  }
  html { scrollbar-width: none; }
  html::-webkit-scrollbar { display: none; }
}
@media (min-width: 1024px) and (min-height: 640px) {
  html { scroll-snap-type: y mandatory; }
}

/* Awatar + trzy szybko zmieniające się ikony kreską (jak wcześniej przy znaku).
   Maska wygasza pasek ikon w prawo: 100% → 0% krycia. Ikony zmienia main.js (ICON_SETS). */
.hero__top { display: flex; align-items: center; gap: var(--s-2); margin-bottom: var(--s-4); }
.hero__icons {
  display: flex;
  gap: var(--s-2);
  -webkit-mask-image: linear-gradient(to right, #000 0%, transparent 100%);
  mask-image: linear-gradient(to right, #000 0%, transparent 100%);
}
.hero__slot { position: relative; width: 32px; height: 32px; }
.hero__icon { position: absolute; inset: 0; width: 32px; height: 32px; visibility: hidden; }
.hero__icon.is-on { visibility: visible; }

/* Awatar-moneta: zdjęcie ↔ rysunek kreską, obrót co ~4,5 s. Tęczowy pierścień i poświata
   (wyjątek kolorystyczny marki - asystent AI); klik → panel asystenta. Bez ruchu w systemie stoi zdjęcie. */
.avatar {
  position: relative;
  display: block;
  flex: none;
  width: 58px;
  height: 58px;
  border-radius: 50%;
  isolation: isolate;
  perspective: 480px;
  transition: scale var(--t-line) var(--ease);
}
.avatar:hover, .avatar:focus-visible { scale: 1.06; }
.avatar:focus-visible { outline-offset: 6px; outline-color: var(--ink); }
.avatar::before,
.avatar__halo {
  content: "";
  position: absolute;
  z-index: -1;
  border-radius: 50%;
  background: var(--rainbow);
  animation: agent-spin 6s linear infinite;   /* obrót koła - kształt się nie zmienia, kolory płyną */
}
.avatar::before { inset: -2px; }
.avatar__halo { inset: -3px; filter: blur(10px); opacity: .75; }
.avatar__coin {
  position: absolute;
  inset: 0;
  transform-style: preserve-3d;
  animation: coin 9s cubic-bezier(.65, 0, .35, 1) infinite;
}
.avatar__face {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  border-radius: 50%;
  background: #FFFFFF;
  backface-visibility: hidden;
}
.avatar__face--drawing { transform: rotateY(180deg); }
@keyframes coin {
  0%, 40% { transform: rotateY(0deg); }
  50%, 90% { transform: rotateY(180deg); }
  100% { transform: rotateY(360deg); }
}

/* Hasło: główny komunikat — 28 px także na telefonie */
.hero__title { font-size: 28px; text-wrap: balance; }
/* Tytuły sekcji (Portfolio, Rekomendacje, Kontakt) - ta sama wielkość co hasło w hero */
.section-title { font-size: 28px; }
.hero__name { font-weight: var(--fw-regular); margin-bottom: var(--s-1); }
/* LinkedIn przy imieniu: ikonka kreską, pole kliknięcia 32 × 32 */
/* Imię + ikona LinkedIn = jeden link do profilu (całe pole klikalne, ikona ciemnieje po najechaniu) */
.hero__li { display: inline-flex; align-items: center; gap: 12px; min-height: 32px; margin-block: -4px; color: var(--ink); }
.hero__li .icon { width: 16px; height: 16px; color: var(--ink-2); transition: color var(--t-line) var(--ease); }
.hero__li:hover .icon, .hero__li:focus-visible .icon { color: var(--ink); }
.hero__line { margin-top: var(--s-2); max-width: 30em; }
/* „kontakt” i karuzela logo w jednej linii; karuzela wypełnia resztę z wygaszonymi bokami */
.hero__row { display: flex; align-items: center; gap: var(--s-4); margin-top: var(--s-4); }
.hero__cta { flex: none; }
.hero__cta .button { display: inline-flex; }
.hero__row .clients { flex: 1; min-width: 0; margin-top: 0; max-width: none; }

/* ==========================================================================
   Karuzela firm „Współpracowałem z” — powolna pętla, pauza po najechaniu, bez ruchu przy reduced-motion
   ========================================================================== */
.clients { margin-top: var(--s-6); max-width: 34em; }
.clients__label { margin-bottom: var(--s-1); }
.clients__marquee {
  overflow: hidden;
  -webkit-mask-image: linear-gradient(to right, transparent, #000 10%, #000 90%, transparent);
  mask-image: linear-gradient(to right, transparent, #000 10%, #000 90%, transparent);
}
.clients__track {
  display: flex;
  width: max-content;
  animation: marquee 40s linear infinite;
}
.clients__marquee:hover .clients__track { animation-play-state: paused; }
.clients__list { display: flex; align-items: center; gap: var(--s-5); padding-right: var(--s-5); }
.clients__list img { height: var(--h, 24px); width: auto; flex: none; opacity: .5; }

@keyframes marquee { to { transform: translateX(-50%); } }

@media (prefers-reduced-motion: reduce) {
  .clients__marquee { -webkit-mask-image: none; mask-image: none; overflow-x: auto; }
  .clients__list[aria-hidden] { display: none; }
}

/* ==========================================================================
   Portfolio: projekty, o mnie (LinkedIn), brandbook, PDF
   ========================================================================== */
.work { padding-block: var(--s-4) var(--s-12); }
.work__title { margin-bottom: var(--s-4); }
/* Odstęp między sekcjami na telefonie: 128 px (96 + 32); desktop - sekcje na wysokość ekranu (niżej) */

.index__row {
  position: relative;
  display: grid;
  grid-template-columns: var(--s-5) 1fr auto;
  align-items: baseline;
  min-height: 56px;                 /* wygodny cel dotyku na telefonie */
  padding-block: var(--s-2);
  border-bottom: var(--hairline) solid var(--hair);
}

.index li:first-child .index__row { border-top: var(--hairline) solid var(--hair); }

.index__row:focus-visible { outline: none; }

/* Linia wydłużająca się od lewej */
.index__row::after {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  bottom: -1px;
  height: 1px;
  background: var(--ink);
  transform: scaleX(0);
  transform-origin: left;
  transition: transform var(--t-line) var(--ease);
}

.index__row:hover::after,
.index__row:focus-visible::after { transform: scaleX(1); }
/* Desktop: aktywny projekt (= karta z przodu sfery) ma linię na stałe */
@media (min-width: 1024px) { .index__row.is-active::after { transform: scaleX(1); } }

.index__year { text-align: right; }
/* Znacznik „beta” (teraz, loom.studio): ramka 1 px, bez zaokrągleń, przy nazwie projektu */
.beta { display: inline-block; margin-left: .5em; padding: 1px 6px; border: var(--hairline) solid var(--ink-3); color: var(--ink-2); font-size: var(--fs-meta); font-weight: var(--fw-regular); line-height: 1.4; letter-spacing: .02em; vertical-align: .25em; }
.pj__title .beta { vertical-align: .55em; }

/* Ikonki w kolumnie numerów: LinkedIn, znak (brandbook), pobieranie */
.index__no { display: flex; align-self: center; }
.index__glyph { width: 14px; height: 14px; color: var(--ink-3); }
.index__mark { --size: 14; }

/* ==========================================================================
   Kalendarz rezerwacji (panel #rozmowa): dni i godziny jako przyciski kreską 1 px, formularz jak czat
   ========================================================================== */
.sheet--booking .sheet__bar .icon { width: 16px; height: 16px; }
.book { max-width: 760px; padding-bottom: var(--s-6); }
.book__intro { max-width: 34em; margin-bottom: var(--s-4); }
.book__nojs { display: block; }
.js .book__nojs { display: none; }
.book__label { margin: var(--s-3) 0 var(--s-1); }
.book__lens, .book__times { display: flex; flex-wrap: wrap; gap: var(--s-1); }
/* Siatka tygodni pn-nd: aktywne tylko dni z wolnymi terminami */
.book__cal { display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); gap: 4px; max-width: 420px; }
.book__wd { text-align: center; padding-block: 4px; text-transform: lowercase; }
.book__date { display: flex; align-items: center; justify-content: center; aspect-ratio: 1; font-variant-numeric: tabular-nums; }
.book__date.is-off { color: var(--ink-4); }
.book__date.is-today { text-decoration: underline; text-underline-offset: 3px; }
.book__len, .book__date:not(.is-off), .book__time {
  min-height: 40px;
  padding-inline: var(--s-2);
  border: var(--hairline) solid var(--hair);
  color: var(--ink);
  transition: border-color var(--t-line) var(--ease), background-color var(--t-line) var(--ease), color var(--t-line) var(--ease);
}
.book__len:hover, .book__date:not(.is-off):hover, .book__time:hover { border-color: var(--ink); }
.book__len[aria-pressed="true"], .book__date[aria-pressed="true"], .book__time[aria-pressed="true"] { background: var(--ink); border-color: var(--ink); color: var(--paper); }
.book__date:not(.is-off) { min-height: 0; padding: 0; }
@media (min-width: 768px) {
  .book__pick { display: grid; grid-template-columns: minmax(0, 420px) minmax(0, 1fr); gap: var(--s-5); align-items: start; }
  .book__pick .book__times { display: grid; grid-template-columns: repeat(auto-fill, minmax(84px, 1fr)); }
}
.book__form { display: grid; gap: var(--s-2); margin-top: var(--s-4); padding-top: var(--s-3); border-top: var(--hairline) solid var(--hair); }
.book__when { font-weight: var(--fw-medium); }
.book__field { display: grid; gap: 4px; }
.book__field input, .book__field textarea {
  min-height: 48px;
  padding: var(--s-1) var(--s-2);
  border: var(--hairline) solid var(--ink);
  border-radius: 0;
  background: transparent;
  color: var(--ink);
  font: inherit;
  font-size: 16px;
}
.book__field textarea { min-height: 96px; resize: vertical; }
.book__field input:focus-visible, .book__field textarea:focus-visible { outline: none; box-shadow: inset 0 0 0 1px var(--ink); }
.book__actions { display: flex; gap: var(--s-2); }
.book__status { max-width: 34em; }
.book__done { display: grid; gap: var(--s-1); outline: none; }

/* ==========================================================================
   Jak pracuję: 3 kroki na pionowej linii 1 px z kółkami (jak nawigator sekcji po prawej).
   Kółka i linia zapełniają się tuszem w miarę przewijania (main.js: .is-on, --p); bez JS - puste.
   ========================================================================== */
.process { padding-block: var(--s-4) var(--s-12); }
.process__title { margin-bottom: var(--s-4); }
.process__steps { position: relative; max-width: 34em; }
.process__steps ol { display: grid; gap: var(--s-4); }
.process__step { position: relative; display: grid; gap: 4px; padding-left: var(--s-5); }
/* kółko na linii, na wysokości nazwy kroku */
.process__step::before {
  content: "";
  position: absolute;
  left: 0;
  top: calc(var(--lh-text, 1.5) * 0.5em - 4.5px);
  width: 9px;
  height: 9px;
  border: var(--hairline) solid var(--ink-3);
  border-radius: 50%;
  background: var(--paper);
  transition: background-color var(--t-line) var(--ease), border-color var(--t-line) var(--ease);
}
.process__step.is-on::before { background: var(--ink); border-color: var(--ink); }
/* linia od środka pierwszego do środka ostatniego kółka (main.js ustawia --top / --bottom) */
.process__line { position: absolute; left: 4px; top: var(--top, 12px); bottom: var(--bottom, 12px); width: 1px; background: var(--hair); }
.process__fill { position: absolute; left: 0; right: 0; top: 0; height: calc(var(--p, 0) * 100%); background: var(--ink); }
.process__head { display: flex; align-items: baseline; gap: var(--s-1); }
.process__name { font-weight: var(--fw-medium); }
.process__text { max-width: 30em; }
.process__result span { color: var(--ink); }

/* ==========================================================================
   Rekomendacje z LinkedIna: karty z krótkim cytatem, przewijane w bok
   ========================================================================== */
.recs { padding-block: var(--s-4) var(--s-12); }
.recs__title { margin-bottom: var(--s-4); }
/* Pętla bez końca: lista + kopia przesuwane o połowę (jak karuzela logo), pauza po najechaniu */
.recs__marquee {
  overflow: hidden;
  -webkit-mask-image: linear-gradient(to right, transparent, #000 6%, #000 94%, transparent);
  mask-image: linear-gradient(to right, transparent, #000 6%, #000 94%, transparent);
}
.recs__track { display: flex; width: max-content; gap: var(--gutter); padding-right: var(--gutter); animation: marquee 70s linear infinite; }
.recs__card { flex: none; width: 280px; display: flex; flex-direction: column; justify-content: space-between; gap: var(--s-3); padding: var(--s-3); border: var(--hairline) solid var(--hair); }
.recs__quote { font-size: var(--fs-text); line-height: var(--lh-text); }
/* Podpis zawsze na tej samej wysokości: rola rezerwuje 2 linie, awatar przy imieniu - kółka w jednej linii */
.recs__who { display: flex; align-items: flex-start; gap: var(--s-2); }
.recs__role { min-height: 2lh; }
.recs__who > span:last-child { display: grid; gap: 2px; min-width: 0; }
.recs__avatar { flex: none; display: inline-flex; align-items: center; justify-content: center; width: 36px; height: 36px; border: var(--hairline) solid var(--ink); border-radius: 50%; font-size: var(--fs-meta); letter-spacing: .02em; }
img.recs__avatar { border-color: var(--hair); object-fit: cover; background: var(--paper-2, var(--hair)); }
.recs__name { font-weight: var(--fw-medium); }
@media (prefers-reduced-motion: reduce) {
  .recs__marquee { -webkit-mask-image: none; mask-image: none; overflow-x: auto; }
  .recs__card[aria-hidden] { display: none; }
}


/* ==========================================================================
   Sfera (desktop): siatka z okręgów kreską 1 px + karty projektów 4:5 (CSS 3D).
   --rx / --ry ustawia sphere.js (przeciąganie, powolny obrót, obrót do karty).
   ========================================================================== */
.sphere {
  position: relative;
  width: var(--d);
  height: var(--d);
  perspective: calc(var(--d) * 2.6);
  cursor: grab;
  touch-action: none;
  user-select: none;
  -webkit-user-select: none;
}
.sphere.is-dragging { cursor: grabbing; }
.sphere__world {
  position: absolute;
  inset: 0;
  transform-style: preserve-3d;
  transform: rotateX(var(--rx)) rotateY(var(--ry));
}
.sphere__ring {
  --s: calc(var(--d) * var(--r, 1));
  position: absolute;
  left: 50%;
  top: 50%;
  width: var(--s);
  height: var(--s);
  margin: calc(var(--s) / -2) 0 0 calc(var(--s) / -2);
  border: var(--hairline) solid var(--ink);
  border-radius: 50%;
  opacity: .2;
  transform: var(--t);
  pointer-events: none;
}
.sphere__ring--lat { transform: translateY(calc(var(--d) / 2 * var(--y))) rotateX(90deg); }
.sphere__ring--eq { opacity: .4; }
.sphere__dot { position: absolute; left: 50%; top: 50%; width: 8px; height: 8px; margin: -4px 0 0 -4px; border-radius: 50%; background: var(--ink); }
.sphere__card {
  --cw: calc(var(--d) * .3);
  position: absolute;
  left: 50%;
  top: 50%;
  width: var(--cw);
  aspect-ratio: 4 / 5;
  margin: calc(var(--cw) * -.625) 0 0 calc(var(--cw) / -2);
  transform: rotateY(var(--lon)) rotateX(var(--lat)) translateZ(calc(var(--d) / 2 + 2px));
  backface-visibility: hidden;
  background: var(--paper);
  outline: var(--hairline) solid var(--hair);
  -webkit-user-drag: none;
}
/* Treść karty (plansza / grafika) przycięta do ramki; nieaktywne przygaszone welonem papieru - karta jest
   pełna, nic nie prześwituje. Gra tylko karta z przodu (.is-active, main.js). */
.sphere__media { position: absolute; inset: 0; overflow: hidden; }
.sphere__media::after { content: ""; position: absolute; inset: 0; z-index: 3; background: var(--paper); opacity: .45; transition: opacity var(--t-swap) var(--ease); pointer-events: none; }
.sphere__card.is-active .sphere__media::after, .sphere__card:hover .sphere__media::after { opacity: 0; }
.sphere__card picture, .sphere__card img { display: block; width: 100%; height: 100%; object-fit: cover; pointer-events: none; }
.sphere__mark {
  --mw: calc(var(--d) * .07);
  position: absolute;
  left: 50%;
  top: 50%;
  width: var(--mw);
  height: var(--mw);
  margin: calc(var(--mw) / -2) 0 0 calc(var(--mw) / -2);
  transform: rotateY(var(--lon)) rotateX(var(--lat)) translateZ(calc(var(--d) / 2 + 1px));
  backface-visibility: hidden;
  opacity: .5;
  pointer-events: none;
}
.sphere__mark img { display: block; width: 100%; height: 100%; }
.sphere__tag { position: absolute; left: 0; top: calc(100% + 6px); white-space: nowrap; color: var(--ink); }
/* Tryb logo (domyślny; poza sekcją Portfolio): na miejscu kart same logo projektów tuszem, bez ramek.
   Najechanie na logo = w jego miejscu pojawia się karta; klik otwiera panel projektu.
   .home__sphere.is-cards (sekcja Portfolio, main.js) = karty jak dotąd, logo schowane. */
.sphere__logo { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; pointer-events: none; transition: opacity var(--t-swap) var(--ease); }
.sphere__logo img { width: calc(var(--ls, .8) * 100%); height: auto; object-fit: contain; }
.sphere__card { transition: background-color var(--t-swap) var(--ease), outline-color var(--t-swap) var(--ease); }
.sphere__media, .sphere__tag { transition: opacity var(--t-swap) var(--ease); }
.home__sphere:not(.is-cards) .sphere__card:not(:hover) { background: transparent; outline-color: transparent; }
.home__sphere:not(.is-cards) .sphere__card:not(:hover) .sphere__media,
.home__sphere:not(.is-cards) .sphere__card:not(:hover) .sphere__tag { opacity: 0; }
.home__sphere:not(.is-cards) .sphere__card:hover .sphere__logo,
.home__sphere.is-cards .sphere__logo { opacity: 0; }
.home__sphere:not(.is-cards) .sphere__card:hover .sphere__media::after { opacity: 0; }
/* Podpis pod sferą poza układem - środek sfery = dokładnie środek ekranu */
.sphere__hint { position: absolute; top: calc(50% + var(--d) / 2 + var(--s-4)); left: 0; right: 0; text-align: center; }

/* Cienka ramka w kolorze linii (--hair) nad grafiką panelu — widoczna też na czarnej planszy w trybie ciemnym */
.sheet__video::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
  border: var(--hairline) solid var(--hair);
  pointer-events: none;
}

/* ==========================================================================
   Plansza w stylu marki projektu (projects[].brand): tło + animowana aurora
   z rozmytych gradientów radialnych — odwzorowanie hero z teraz.eu.
   ========================================================================== */
.brand {
  position: absolute;
  inset: 0;
  isolation: isolate;
  overflow: hidden;
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--brand-bg);
}
.brand::before {
  content: "";
  position: absolute;
  inset: -35% -25%;
  z-index: -1;
  pointer-events: none;
  filter: blur(28px);
  background:
    radial-gradient(34% 40% at 38% 18%, var(--a1, transparent), transparent 70%),
    radial-gradient(30% 34% at 66% 10%, var(--a2, transparent), transparent 72%),
    radial-gradient(42% 36% at 50% 40%, var(--a3, transparent), transparent 76%),
    radial-gradient(22% 26% at 84% 34%, var(--a4, transparent), transparent 70%);
  animation: aurora var(--brand-speed, 26s) ease-in-out infinite alternate;
  will-change: transform;
}
/* Logo na planszy marki: zawsze w całości, niezależnie od reguł dla wideo/obrazów w ramce */
.media .brand img,
.brand .brand__logo { width: 56%; max-width: 420px; height: auto; object-fit: contain; }

@keyframes aurora {
  0%   { transform: translate(0) rotate(0) scale(1); }
  33%  { transform: translate(6%, 4%) rotate(7deg) scale(1.08); }
  66%  { transform: translate(-5%, 6%) rotate(-5deg) scale(1.04); }
  100% { transform: translate(3%, -4%) rotate(4deg) scale(1.1); }
}

/* ==========================================================================
   Reel — plansza animowana teraz (projects[].reel), format 4:5
   Pętla 15 s (--t-reel = REEL_MS w render.js): plakat (znak + hasło z falką + legenda)
   → „najpierw jesteś słuchaczem” (róż, „?”) → „potem stajesz się ekspertem” (błękit, „!”, słuchacz → ekspert)
   → społeczność (kropki ról, dwie zmieniają rolę) → rozmowa 1:1 → plakat.
   Zasady: płaski CSS; animowane tylko opacity i translate / rotate / scale; jedyny filtr to aurora
   z .brand::before. Zegar 15 s steruje kryciem pól kolorów, ich ruch to wolne, niezależne pętle.
   Kolory wyłącznie marki — bez --paper / --ink, więc tryb ciemny niczego nie zmienia.
   ========================================================================== */
/* Open Sans - krój marki teraz, tylko w animacji teraz. Okrojony do znaków PL/EN
   (tools/subset-fonts.py), hostowany lokalnie, licencja SIL OFL 1.1 (assets/fonts/OFL.txt).
   Wagi jak w teraz: 400 opisy, 600 pigułki / chipy / legenda / podpisy, 700 nagłówki i hasło.
   font-display: block - plansza nigdy nie pokazuje zastępczej Helvetiki (pliki ~11 KB, lokalne;
   700 i 600 są w <link rel="preload"> na desktopie, gdzie plakat jest widoczny od razu). */
@font-face {
  font-family: "Open Sans teraz";
  font-style: normal;
  font-weight: 400;
  font-display: block;
  src: url("assets/fonts/open-sans-400-sub.woff2") format("woff2");
}
@font-face {
  font-family: "Open Sans teraz";
  font-style: normal;
  font-weight: 600;
  font-display: block;
  src: url("assets/fonts/open-sans-600-sub.woff2") format("woff2");
}
@font-face {
  font-family: "Open Sans teraz";
  font-style: normal;
  font-weight: 700;
  font-display: block;
  src: url("assets/fonts/open-sans-700-sub.woff2") format("woff2");
}

.reel {
  container: reel / size;
  --reel-play: paused;
  --tz-pink: #FC8AD3;
  --tz-blue: #146EF4;
  --tz-red: #FF4054;
  --tz-ink-pink: #111;
  --tz-tile: #161616;
  color: #fff;
  font-family: "Open Sans teraz", "Open Sans", var(--font);  /* krój marki teraz (okrojony, lokalny) */
  font-weight: 700;
  letter-spacing: 0;                                        /* teraz tracking-normal: pigułki, chipy, legenda, podpisy */
  animation: reel-clock var(--t-reel, 8s) linear infinite; /* zegar fazy dla main.js */
}
@keyframes reel-clock { from, to { opacity: 1; } }

/* Ramki zamkniętych paneli się nie renderują - plansze (obrazy) pobierają się dopiero przy otwarciu,
   nie przy starcie strony. Opóźnienie trzyma ramkę widoczną, gdy panel zjeżdża. */
.sheet .sheet__video { content-visibility: hidden; transition: content-visibility 0s linear var(--t-sheet) allow-discrete; }
.sheet:target .sheet__video { content-visibility: visible; transition-delay: 0s; }

/* Gra tylko w otwartym panelu i na karcie z przodu sfery */
.sheet:target .reel,
.is-cards .sphere__card.is-active .reel,
.home__sphere:not(.is-cards) .sphere__card:hover .reel { --reel-play: running; }
/* Zamknięty panel nie renderuje planszy, więc fonty teraz pobierają się dopiero przy otwarciu. Opóźnienie trzyma planszę widoczną, gdy panel zjeżdża. */
.sheet .reel { content-visibility: hidden; transition: content-visibility 0s linear var(--t-sheet) allow-discrete; }
.sheet:target .reel { content-visibility: visible; transition-delay: 0s; }
.sheet:target .reel.is-paused { --reel-play: paused; }
/* Bez JS: trzy pętle (24 s) i stop na plakacie - 0% = 100%, więc forwards zostawia ten sam kadr */
html:not(.js) .reel,
html:not(.js) .reel * { animation-iteration-count: 3 !important; animation-fill-mode: forwards !important; }
.reel, .reel::before, .reel::after,
.reel *, .reel *::before, .reel *::after { animation-play-state: var(--reel-play) !important; }

/* Geometria 4:5 (zmienne; cq rozwiązują się tam, gdzie są użyte). Panel projektu i karta sfery mają ten sam format. */
.reel--4x5 {
  --pad: 7.5cqw; --lw: 52cqw; --l-s: .42; --ly: 40cqh;    /* plakat: środek znaku na 40% wysokości (optycznie wyżej) */
  --claim-fs: max(13px, 4.8cqw); --claim-gap: calc(var(--lw) * .16); --leg-fs: max(12px, 2.9cqw);
  --f-size: 100cqw; --fm-size: 110cqw; --fl-x: 28cqw; --fl-y: 34cqh; --fe-x: 72cqw; --fe-y: 74cqh;
  --pill-fs: max(12px, 3.2cqw); --head-fs: max(15px, 7.4cqw); --sub-fs: max(12px, 3.6cqw); --sgap: 2.6cqw;
  --call-top: 16cqh; --call-bot: 8cqh; --cgap: 3.6cqw;
  --ts: 40cqw; --tgap: 4cqw; --ring: max(2px, .55cqw);
  --chip-fs: max(12px, 2.7cqw); --title-fs: max(13px, 5cqw); --title-w: 84cqw; --cap-fs: max(12px, 3.1cqw);
}
.reel__stage { position: absolute; inset: 0; }
/* Ciemna linia przy krawędzi kadru (pod linią --hair ramki): biały glif przycięty krawędzią
   nie zlewa się z jasną stroną. Tylko stałe kolory - tryb ciemny bez zmian */
.reel__stage::after {
  content: "";
  position: absolute;
  inset: 0;
  box-shadow: inset 0 0 0 2px rgb(0 0 0 / .85);
  pointer-events: none;
}

/* Pola kolorów ról: statyczne gradienty bez filtra. Kolor = krycie na zegarze 15 s, ruch = wolny dryf 17–31 s */
.reel__field {
  position: absolute;
  width: var(--f-size);
  height: var(--f-size);
  left: calc(var(--x) - var(--f-size) / 2);
  top: calc(var(--y) - var(--f-size) / 2);
  pointer-events: none;
}
.reel__field--l {
  --x: var(--fl-x); --y: var(--fl-y);
  opacity: .35;
  background:
    radial-gradient(46% 38% at 47% 53%, rgb(252 138 211 / .38), rgb(252 138 211 / .14) 55%, transparent 100%),
    radial-gradient(26% 30% at 66% 34%, rgb(252 138 211 / .16), transparent 100%);
  animation: reel-op-l var(--t-reel, 15s) ease-in-out infinite, reel-drift-a 23s ease-in-out infinite alternate, reel-swell 17s ease-in-out infinite alternate;
}
.reel__field--e {
  --x: var(--fe-x); --y: var(--fe-y);
  opacity: .35;
  background:
    radial-gradient(46% 38% at 53% 47%, rgb(20 110 244 / .55), rgb(20 110 244 / .2) 55%, transparent 100%),
    radial-gradient(26% 30% at 34% 66%, rgb(29 62 147 / .5), transparent 100%);
  animation: reel-op-e var(--t-reel, 15s) ease-in-out infinite, reel-drift-b 29s ease-in-out infinite alternate, reel-swell 19s ease-in-out infinite alternate;
}
.reel__field--m {
  --f-size: var(--fm-size); --x: 50cqw; --y: 50cqh;
  opacity: 0;
  background:
    radial-gradient(34% 30% at 38% 50%, rgb(252 138 211 / .30), transparent 100%),
    radial-gradient(34% 30% at 62% 50%, rgb(20 110 244 / .45), transparent 100%);
  animation: reel-op-m var(--t-reel, 15s) ease-in-out infinite, reel-drift-a 31s ease-in-out infinite alternate;
}
@keyframes reel-drift-a { from { translate: -4cqw 3cqh; rotate: -10deg; } to { translate: 5cqw -4cqh; rotate: 14deg; } }
@keyframes reel-drift-b { from { translate: 4cqw -3cqh; rotate: 12deg; } to { translate: -5cqw 4cqh; rotate: -12deg; } }
@keyframes reel-swell   { from { scale: .92; } to { scale: 1.08; } }
/* słuchacz (róż) → ekspert (błękit) → społeczność (oba) → rozmowa (środek) → plakat */
@keyframes reel-op-l { 0%, 16% { opacity: .35; } 21.333%, 38.667% { opacity: 1; } 44%, 60% { opacity: .4; } 65.333%, 77.333% { opacity: .75; } 82.667%, 94.667% { opacity: .2; } 100% { opacity: .35; } }
@keyframes reel-op-e { 0%, 16% { opacity: .35; } 21.333%, 38.667% { opacity: .25; } 44%, 60% { opacity: 1; } 65.333%, 77.333% { opacity: .75; } 82.667%, 94.667% { opacity: .2; } 100% { opacity: .35; } }
@keyframes reel-op-m { 0%, 77.333% { opacity: 0; } 82.667%, 94.667% { opacity: 1; } 98.667%, 100% { opacity: 0; } }

/* Znak: ułożony w rozmiarze plakatu i zmniejszany do nagłówka — ostry i nadal element LCP.
   --lr = wysokość / szerokość / 2 (render.js; dla 575 × 178 = .15478) */
.brand.reel .reel__logo {                                  /* (0,3,0) wygrywa z .media .brand img (0,2,1) */
  position: absolute;
  left: calc(50cqw - var(--lw) / 2);
  top: calc(var(--ly) - var(--lw) * var(--lr, .15478));
  width: var(--lw);
  max-width: none;
  height: auto;
  object-fit: contain;
  transform-origin: 0 0;
  --hx: calc(var(--pad) - 50cqw + var(--lw) / 2);
  --hy: calc(var(--pad) - var(--ly) + var(--lw) * var(--lr, .15478));
  animation: reel-logo var(--t-reel, 15s) cubic-bezier(.65, 0, .35, 1) infinite;
}
@keyframes reel-logo { 0%, 16% { translate: 0 0; scale: 1; } 20%, 94.667% { translate: var(--hx) var(--hy); scale: var(--l-s); } 98.667%, 100% { translate: 0 0; scale: 1; } }

/* Hasło, falka (wycieranie przesunięciem — tylko kompozycja) i legenda ról */
.reel__claim {
  position: absolute;
  inset-inline: 0;
  margin: 0;
  text-align: center;
  line-height: 1.1;
  letter-spacing: -.025em;                                  /* teraz tracking-tight */
  top: calc(var(--ly) + var(--lw) * var(--lr, .15478) + var(--claim-gap));
  font-size: var(--claim-fs);
  animation: reel-claim var(--t-reel, 15s) linear infinite;
}
.reel__key { position: relative; display: inline-block; white-space: nowrap; }
.reel__falka {
  position: absolute;
  left: -3%;
  width: 106%;
  bottom: -.55em;
  height: .6em;
  overflow: hidden;
  animation: reel-falka-w var(--t-reel, 15s) linear infinite;
}
.reel__falka-in {                                         /* przeciwruch na opakowaniu, nie na <svg> (kompozycja) */
  display: block;
  width: 100%;
  height: 100%;
  animation: reel-falka-i var(--t-reel, 15s) linear infinite;
}
.reel .reel__falka svg {
  display: block;
  width: 100%;
  height: 100%;
  max-width: none;
  overflow: visible;
  fill: none;
}
.reel__falka path { stroke: var(--tz-red); stroke-width: max(2px, .11em); stroke-linecap: round; stroke-linejoin: round; vector-effect: non-scaling-stroke; }
.reel__legend {
  position: absolute;
  inset-inline: 0;
  margin: 0;
  display: flex;
  justify-content: center;
  gap: .6em;
  top: calc(var(--ly) + var(--lw) * var(--lr, .15478) + var(--claim-gap) + var(--claim-fs) * 2.3);
  font-size: var(--leg-fs);
  animation: reel-legend var(--t-reel, 15s) linear infinite;
}
.reel__legend span {
  display: inline-flex;
  align-items: center;
  gap: .45em;
  padding: .32em .8em .32em .6em;
  border-radius: 999px;
  background: rgb(255 255 255 / .12);
  line-height: 1.15;
  white-space: nowrap;
}
.reel__pill, .reel__chip, .reel__legend span, .reel__cap { font-weight: 600; }   /* teraz: text-sm font-semibold */
.reel__legend span::before { content: ""; width: .62em; height: .62em; border-radius: 50%; background: var(--tz-pink); }
.reel__legend span + span::before { background: var(--tz-blue); }
@keyframes reel-claim  { 0%, 14.667% { opacity: 1; translate: 0 0; } 16.667% { opacity: 0; translate: 0 0; } 16.67%, 96.333% { opacity: 0; translate: 0 .4em; animation-timing-function: cubic-bezier(.2, .7, .2, 1); } 100% { opacity: 1; translate: 0 0; } }
@keyframes reel-legend { 0%, 15% { opacity: 1; translate: 0 0; } 17% { opacity: 0; translate: 0 0; } 17.003%, 97% { opacity: 0; translate: 0 .4em; animation-timing-function: cubic-bezier(.2, .7, .2, 1); } 100% { opacity: 1; translate: 0 0; } }
/* falka: wytarcie do przodu, niewidoczny skok, rysowanie na końcu pętli (krzywa marki) */
@keyframes reel-falka-w { 0%, 12.667% { translate: 0 0; animation-timing-function: cubic-bezier(.65, 0, .35, 1); } 16% { translate: 100% 0; } 16.003%, 96.667% { translate: -100% 0; animation-timing-function: cubic-bezier(.65, 0, .35, 1); } 100% { translate: 0 0; } }
@keyframes reel-falka-i { 0%, 12.667% { translate: 0 0; animation-timing-function: cubic-bezier(.65, 0, .35, 1); } 16% { translate: -100% 0; } 16.003%, 96.667% { translate: 100% 0; animation-timing-function: cubic-bezier(.65, 0, .35, 1); } 100% { translate: 0 0; } }

/* Sceny: słuchacz → ekspert → społeczność. Ta sama kolumna przy lewej krawędzi, wyśrodkowana w pionie
   między nagłówkiem a dołem. Wejście 500 ms od dołu (wiersz, nagłówek, opis co 150 ms), wyjście 300 ms razem. */
.reel__scene {
  position: absolute;
  inset: 22cqh var(--pad) 14cqh;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: flex-start;
  gap: var(--sgap);
  max-width: 70cqw;
}
.reel__scene > * { margin: 0; opacity: 0; animation: var(--t-reel, 15s) linear infinite; }
.reel__row { display: flex; flex-wrap: wrap; align-items: center; gap: 1.6cqw 2cqw; }   /* wąska ramka: pigułka eksperta pod spodem */
.reel__head { font-size: var(--head-fs); line-height: 1.08; letter-spacing: -.025em; text-wrap: balance; }
.reel__sub { font-size: var(--sub-fs); line-height: 1.35; font-weight: 400; color: rgb(255 255 255 / .86); max-width: 56cqw; }
.reel__scene--l > .reel__row  { animation-name: reel-l-row; }
.reel__scene--l > .reel__head { animation-name: reel-l-head; }
.reel__scene--l > .reel__sub  { animation-name: reel-l-sub; }
.reel__scene--e > .reel__row  { animation-name: reel-e-row; }
.reel__scene--e > .reel__head { animation-name: reel-e-head; }
.reel__scene--e > .reel__sub  { animation-name: reel-e-sub; }
.reel__scene--c > .reel__row  { animation-name: reel-c-row; }
.reel__scene--c > .reel__head { animation-name: reel-c-head; }
.reel__scene--c > .reel__sub  { animation-name: reel-c-sub; }
.reel__pill {
  display: inline-flex;
  align-items: center;
  gap: .38em;
  padding: .34em .9em .34em .62em;
  border-radius: 999px;
  font-size: var(--pill-fs);
  line-height: 1.15;
  white-space: nowrap;
}
.reel .reel__pill svg,
.reel .reel__cap svg { width: 1.2em; height: 1.2em; fill: currentColor; flex: none; }
.reel__pill--l { background: var(--tz-pink); color: var(--tz-ink-pink); }   /* 8.6:1 */
.reel__pill--e { background: var(--tz-blue); color: #fff; }               /* 4.61:1 — pogrubione, min. 12 px, pełne tło */
.reel__pill--was { opacity: .5; }                                          /* „byłeś słuchaczem” */
/* słuchacz → ekspert: kreska ze strzałką rysuje się w prawo, potem wskakuje pigułka eksperta */
.reel__arrow { position: relative; width: 8cqw; height: 2px; background: #fff; opacity: 0; animation: reel-e-arrow var(--t-reel, 15s) linear infinite; }
.reel__arrow::after { content: ""; position: absolute; right: 0; top: 50%; width: 1.6cqw; height: 1.6cqw; border-top: 2px solid #fff; border-right: 2px solid #fff; translate: 0 -50%; rotate: 45deg; }
.reel__scene--e .reel__pill--e { opacity: 0; animation: reel-e-pill var(--t-reel, 15s) linear infinite; }
/* społeczność: kropki słuchaczy (róż) i ekspertów (błękit); dwie przechodzą ze słuchacza w eksperta */
.reel__crowd { gap: 1.8cqw; }
.reel__dot { position: relative; width: 6.4cqw; height: 6.4cqw; border-radius: 50%; background: rgb(255 255 255 / .1); box-shadow: inset 0 0 0 var(--ring) var(--tz-pink); font-style: normal; }
.reel__dot--e { box-shadow: inset 0 0 0 var(--ring) var(--tz-blue); }
.reel__dot::after { content: ""; position: absolute; inset: 0; border-radius: 50%; box-shadow: inset 0 0 0 var(--ring) var(--tz-blue); opacity: 0; }
.reel__dot:nth-child(4)::after, .reel__dot:nth-child(8)::after { animation: reel-c-switch var(--t-reel, 15s) linear infinite; }
@keyframes reel-l-row { 0%, 18.667% { opacity: 0; translate: 0 .5em; animation-timing-function: cubic-bezier(.2, .7, .2, 1); } 22%, 38.667% { opacity: 1; translate: 0 0; } 40.667% { opacity: 0; translate: 0 -.3em; } 40.67%, 100% { opacity: 0; translate: 0 .5em; } }
@keyframes reel-l-head { 0%, 19.667% { opacity: 0; translate: 0 .5em; animation-timing-function: cubic-bezier(.2, .7, .2, 1); } 23%, 38.667% { opacity: 1; translate: 0 0; } 40.667% { opacity: 0; translate: 0 -.3em; } 40.67%, 100% { opacity: 0; translate: 0 .5em; } }
@keyframes reel-l-sub { 0%, 20.667% { opacity: 0; translate: 0 .5em; animation-timing-function: cubic-bezier(.2, .7, .2, 1); } 24%, 38.667% { opacity: 1; translate: 0 0; } 40.667% { opacity: 0; translate: 0 -.3em; } 40.67%, 100% { opacity: 0; translate: 0 .5em; } }
@keyframes reel-e-row { 0%, 40.667% { opacity: 0; translate: 0 .5em; animation-timing-function: cubic-bezier(.2, .7, .2, 1); } 44%, 60% { opacity: 1; translate: 0 0; } 62% { opacity: 0; translate: 0 -.3em; } 62.003%, 100% { opacity: 0; translate: 0 .5em; } }
@keyframes reel-e-head { 0%, 41.667% { opacity: 0; translate: 0 .5em; animation-timing-function: cubic-bezier(.2, .7, .2, 1); } 45%, 60% { opacity: 1; translate: 0 0; } 62% { opacity: 0; translate: 0 -.3em; } 62.003%, 100% { opacity: 0; translate: 0 .5em; } }
@keyframes reel-e-sub { 0%, 42.667% { opacity: 0; translate: 0 .5em; animation-timing-function: cubic-bezier(.2, .7, .2, 1); } 46%, 60% { opacity: 1; translate: 0 0; } 62% { opacity: 0; translate: 0 -.3em; } 62.003%, 100% { opacity: 0; translate: 0 .5em; } }
@keyframes reel-c-row { 0%, 62% { opacity: 0; translate: 0 .5em; animation-timing-function: cubic-bezier(.2, .7, .2, 1); } 65.333%, 77.333% { opacity: 1; translate: 0 0; } 79.333% { opacity: 0; translate: 0 -.3em; } 79.337%, 100% { opacity: 0; translate: 0 .5em; } }
@keyframes reel-c-head { 0%, 63% { opacity: 0; translate: 0 .5em; animation-timing-function: cubic-bezier(.2, .7, .2, 1); } 66.333%, 77.333% { opacity: 1; translate: 0 0; } 79.333% { opacity: 0; translate: 0 -.3em; } 79.337%, 100% { opacity: 0; translate: 0 .5em; } }
@keyframes reel-c-sub { 0%, 64% { opacity: 0; translate: 0 .5em; animation-timing-function: cubic-bezier(.2, .7, .2, 1); } 67.333%, 77.333% { opacity: 1; translate: 0 0; } 79.333% { opacity: 0; translate: 0 -.3em; } 79.337%, 100% { opacity: 0; translate: 0 .5em; } }
@keyframes reel-e-arrow { 0%, 43% { opacity: 0; translate: -.6em 0; animation-timing-function: cubic-bezier(.2, .7, .2, 1); } 46.333%, 60% { opacity: 1; translate: 0 0; } 62% { opacity: 0; translate: 0 0; } 62.003%, 100% { opacity: 0; translate: -.6em 0; } }
@keyframes reel-e-pill { 0%, 45% { opacity: 0; translate: .6em 0; animation-timing-function: cubic-bezier(.2, .7, .2, 1); } 48.333%, 60% { opacity: 1; translate: 0 0; } 62% { opacity: 0; translate: 0 0; } 62.003%, 100% { opacity: 0; translate: .6em 0; } }
@keyframes reel-c-switch { 0%, 67.333% { opacity: 0; } 70.667%, 77.333% { opacity: 1; } 79.333%, 100% { opacity: 0; } }

/* Glify: „?” = słuchacz pyta, „!” = ekspert odpowiada. Białe, duże, przycięte z prawej, bez obrotu */
.reel .reel__glyph { position: absolute; width: auto; max-width: none; opacity: 0; }   /* <span> z <svg> w środku */
.reel .reel__glyph svg { display: block; width: 100%; height: 100%; max-width: none; fill: #fff; }
.reel .reel__glyph--q { height: 38cqh; aspect-ratio: 158.7 / 233.4; right: -13cqw; top: 14cqh; animation: reel-gq var(--t-reel, 15s) linear infinite; }
.reel .reel__glyph--x { height: 34cqh; aspect-ratio: 71.4 / 230.4; right: 6cqw; bottom: -6cqh; animation: reel-gx var(--t-reel, 15s) linear infinite; }
@keyframes reel-gq { 0%, 18% { opacity: 0; translate: 30cqw 0; animation-timing-function: cubic-bezier(.2, .7, .2, 1); } 23.333%, 38.667% { opacity: 1; translate: 0 0; animation-timing-function: cubic-bezier(.4, 0, 1, 1); } 41.333%, 100% { opacity: 0; translate: 30cqw 0; } }
@keyframes reel-gx { 0%, 41.333% { opacity: 0; translate: 0 40cqh; animation-timing-function: cubic-bezier(.2, .7, .2, 1); } 46.667%, 60% { opacity: 1; translate: 0 0; animation-timing-function: cubic-bezier(.4, 0, 1, 1); } 62.667%, 100% { opacity: 0; translate: 0 40cqh; } }

/* Rozmowa 1:1: kolumna wyśrodkowana między nagłówkiem a dołem */
.reel__call {
  position: absolute;
  inset: var(--call-top) 0 var(--call-bot);
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: var(--cgap);
}
.reel__tiles { display: flex; gap: var(--tgap); }
.reel__tile {
  position: relative;
  width: var(--ts);
  height: var(--ts);
  border-radius: calc(var(--ts) * .1);
  background: var(--tz-tile);
  box-shadow: 0 2.2cqw 4cqw -1.4cqw rgb(0 0 0 / .55);
  opacity: 0;
  animation: var(--t-reel, 15s) linear infinite;
}
.reel__tile--l { --role: var(--tz-pink); --from: calc(var(--ts) * -.45) 0; animation-name: reel-tile-l; }
.reel__tile--e { --role: var(--tz-blue); --from: calc(var(--ts) * .45) 0;  animation-name: reel-tile-e; }
.reel__avatar {
  position: absolute;
  left: 30%;
  top: 20%;
  width: 40%;
  height: 40%;
  border-radius: 50%;
  background: rgb(255 255 255 / .1);
  display: grid;
  place-items: center;
}
.reel .reel__avatar svg { width: 50%; height: 50%; fill: #fff; }
.reel__chip {
  position: absolute;
  left: 7%;
  bottom: 7%;
  display: inline-flex;
  align-items: center;
  gap: .42em;
  padding: .3em .72em .3em .55em;
  border-radius: 999px;
  background: rgb(0 0 0 / .6);
  font-size: var(--chip-fs);
  line-height: 1.15;
  white-space: nowrap;
}
.reel__chip::before { content: ""; width: .62em; height: .62em; border-radius: 50%; background: var(--role); }
.reel__ring { position: absolute; inset: 0; border-radius: inherit; opacity: 0; animation: var(--t-reel, 15s) linear infinite; }
.reel__tile--l .reel__ring { animation-name: reel-ring-l; }
.reel__tile--e .reel__ring { animation-name: reel-ring-e; }
.reel__ring::before,
.reel__ring::after { content: ""; position: absolute; inset: 0; border-radius: inherit; }
.reel__ring::before { box-shadow: inset 0 0 0 var(--ring) var(--role); }                                   /* obwódka mówiącego */
.reel__ring::after  { box-shadow: 0 0 0 var(--ring) var(--role); animation: reel-speak 1.5s cubic-bezier(0, 0, .2, 1) infinite; } /* puls „speak” marki (15 s = 10 pulsów) */
@keyframes reel-speak { 0% { scale: 1; opacity: .7; } 70%, 100% { scale: 1.07; opacity: 0; } }
.reel__title {
  margin: 0;
  max-width: var(--title-w);
  text-align: center;
  font-size: var(--title-fs);
  line-height: 1.1;
  letter-spacing: -.025em;
  text-wrap: balance;
  opacity: 0;
  animation: reel-title var(--t-reel, 15s) linear infinite;
}
.reel__cap {
  margin: 0;
  display: inline-flex;
  align-items: center;
  gap: .45em;
  padding: .36em .9em .36em .65em;
  border-radius: 999px;
  background: rgb(0 0 0 / .78);
  font-size: var(--cap-fs);
  line-height: 1.15;
  white-space: nowrap;
  opacity: 0;
  animation: reel-cap var(--t-reel, 15s) linear infinite;
}
@keyframes reel-tile-l { 0%, 79.333% { opacity: 0; translate: var(--from); scale: .9; animation-timing-function: cubic-bezier(.2, .7, .2, 1); } 83.333%, 94.667% { opacity: 1; translate: 0 0; scale: 1; } 96.667% { opacity: 0; translate: 0 0; scale: .94; } 96.67%, 100% { opacity: 0; translate: var(--from); scale: .9; } }
@keyframes reel-tile-e { 0%, 80.333% { opacity: 0; translate: var(--from); scale: .9; animation-timing-function: cubic-bezier(.2, .7, .2, 1); } 84.333%, 94.667% { opacity: 1; translate: 0 0; scale: 1; } 96.667% { opacity: 0; translate: 0 0; scale: .94; } 96.67%, 100% { opacity: 0; translate: var(--from); scale: .9; } }
@keyframes reel-ring-l { 0%, 84% { opacity: 0; } 85.333%, 88.667% { opacity: 1; } 90%, 100% { opacity: 0; } }
@keyframes reel-ring-e { 0%, 89.333% { opacity: 0; } 90.667%, 94.667% { opacity: 1; } 96%, 100% { opacity: 0; } }
@keyframes reel-title { 0%, 81.333% { opacity: 0; translate: 0 .4em; animation-timing-function: cubic-bezier(.2, .7, .2, 1); } 84.667%, 94.667% { opacity: 1; translate: 0 0; } 96.667% { opacity: 0; translate: 0 0; } 96.67%, 100% { opacity: 0; translate: 0 .4em; } }
@keyframes reel-cap   { 0%, 82.667% { opacity: 0; translate: 0 .4em; animation-timing-function: cubic-bezier(.2, .7, .2, 1); } 86%, 94.667% { opacity: 1; translate: 0 0; } 96.667% { opacity: 0; translate: 0 0; } 96.67%, 100% { opacity: 0; translate: 0 .4em; } }

/* Karta sfery (lite): znak u góry i pod nim dwa kafelki - mówią na zmianę; bez tekstów i przejść scen */
.reel--lite { --ly: 30cqh; --ts: 34cqw; --tgap: 3cqw; --chip-fs: max(8px, 4.4cqw); }   /* karta ~190 px: ozdobna, aria-hidden */
.brand.reel--lite .reel__logo { animation: none; }
.reel--lite .reel__call { inset: 44cqh 0 10cqh; justify-content: flex-start; }
.reel--lite .reel__tile { animation: none; opacity: 1; }
.reel--lite .reel__tile--l .reel__ring { animation-name: reel-lite-ring-l; }
.reel--lite .reel__tile--e .reel__ring { animation-name: reel-lite-ring-e; }
@keyframes reel-lite-ring-l { 0%, 4% { opacity: 0; } 8%, 44% { opacity: 1; } 48%, 100% { opacity: 0; } }
@keyframes reel-lite-ring-e { 0%, 52% { opacity: 0; } 56%, 92% { opacity: 1; } 96%, 100% { opacity: 0; } }

/* Progi: tablet / desktop (ramka od 600 px szerokości) - spokojniejsze rozmiary etykiet */
@container reel (min-width: 600px) {
  .reel__stage { --pill-fs: 2.7cqw; --chip-fs: 2.3cqw; --cap-fs: 2.6cqw; --leg-fs: 2.4cqw; --sub-fs: 3cqw; }
}
/* wąska ramka (telefon 320 px): znak w nagłówku nie mniejszy niż 72 px (minimum marki) */
@container reel (max-width: 360px) {
  .reel__stage { --l-s: .52; }
}
@container reel (max-width: 260px) {                       /* telefon poziomo: ramka ~200 px */
  .reel__stage { --l-s: .7; }
}

/* Pauza (tylko w panelu, tylko z JS): okrągły przycisk 40 × 40 obok planszy, nie w niej */
.reel__toggle { display: none; }
.js .reel__toggle {
  display: grid;
  place-items: center;
  position: absolute;
  z-index: 2;
  top: 12px;
  right: 12px;
  width: 40px;
  height: 40px;
  border-radius: 50%;
  border: 0;
  background: rgb(0 0 0 / .6);
  box-shadow: inset 0 0 0 1px rgb(255 255 255 / .25);
  color: #fff;
  cursor: pointer;
}
.reel__toggle svg { width: 14px; height: 14px; fill: currentColor; }
.reel__toggle .reel__ico-play,
.reel__toggle[aria-pressed="true"] .reel__ico-pause { display: none; }
.reel__toggle[aria-pressed="true"] .reel__ico-play { display: block; }
/* Focus niezależny od motywu (--ink na ciemnej planszy byłby niewidoczny w jasnym trybie) */
.reel__toggle:focus-visible { outline: 2px solid #fff; outline-offset: 2px; }

/* Bez ruchu: globalne animation: none zatrzymuje wszystko; tu sensowna klatka stała —
   znak w nagłówku, oba kafelki z obwódkami, tytuł i podpis rozmowy, hasło z narysowaną falką na dole */
@media (prefers-reduced-motion: reduce) {
  .brand.reel:not(.reel--lite) .reel__logo { translate: var(--hx) var(--hy); scale: var(--l-s); }
  .reel__field--l, .reel__field--e { opacity: .35; }
  .reel__field--m { opacity: 1; }
  .reel__tile, .reel__ring, .reel__title, .reel__cap { opacity: 1; }
  .reel__ring::after, .reel__glyph, .reel__scene, .reel__legend, .js .reel__toggle { display: none; }
  .reel .reel__claim { top: auto; bottom: calc(var(--pad) + .5em); opacity: 1; }
  .reel .reel__call { bottom: calc(var(--pad) + var(--claim-fs) * 2.8); }
  .reel__falka, .reel__falka-in { translate: none; }        /* stała, w pełni narysowana */
  .reel--lite .reel__claim { display: none; }
}

.sygnet { width: 20px; height: 20px; flex: none; object-fit: contain; }

/* ==========================================================================
   Panele wysuwane od dołu: projekty (wideo) i „o mnie”.
   Otwiera je kotwica (#teraz, #o-mnie…) przez :target — działa bez JS.
   main.js dokłada: focus w panelu, Esc, tło nieaktywne (inert), powrót focusu.
   ========================================================================== */
.sheet {
  position: fixed;
  inset: 0 0 auto 0;
  height: 100vh;
  height: 100dvh;                   /* wysokość widocznego okna — z paskami Safari */
  z-index: 30;
  visibility: hidden;
  transition: visibility 0s linear var(--t-sheet);
}
.sheet:target {
  visibility: visible;
  transition-delay: 0s;
}

/* Zasłona: ten sam papier, półprzezroczysty — bez cienia i rozmycia */
.sheet__backdrop {
  position: absolute;
  inset: 0;
  background: var(--veil);
  opacity: 0;
  transition: opacity var(--t-sheet) var(--ease);
}
.sheet:target .sheet__backdrop { opacity: 1; }

.sheet__panel {
  position: absolute;
  inset: var(--sheet-top) 0 0 0;
  display: flex;
  flex-direction: column;
  background: var(--paper);
  border-top: var(--hairline) solid var(--hair);
  transform: translateY(100%);
  transition: transform var(--t-sheet) var(--ease);
}
.sheet:target .sheet__panel { transform: none; }

/* Strona pod spodem się nie przewija */
html:has(.sheet:target) { overflow: hidden; }

.sheet__bar {
  flex: none;
  display: flex;
  align-items: center;              /* sygnet, numer, nazwa i typ na jednej osi */
  gap: var(--s-2);
  height: calc(var(--header-h) + var(--s-1));
  padding-top: var(--s-2);
}
.sheet__bar .symbol { --size: 16; align-self: center; flex: none; }
.sheet__year, .sheet__no { display: none; }
/* Link z podkreśleniem: „zobacz projekt ↗” (panel i podpis pod podglądem) */
.link-u { color: var(--ink); border-bottom: var(--hairline) solid var(--ink); white-space: nowrap; }
.sheet__link { margin-left: auto; }
/* Zamknij: sam krzyżyk, kreska 1 px; pole kliknięcia 40 × 40 */
.sheet__close {
  margin-left: auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 40px;
  margin-right: -12px;              /* krzyżyk wyrównany do prawej krawędzi treści */
  color: var(--ink);
}
.sheet__close .icon { width: 16px; height: 16px; }
.sheet__link + .sheet__close { margin-left: var(--s-2); }

.sheet__body {
  flex: 1;
  min-height: 0;
  overflow-y: auto;
  overscroll-behavior: contain;
  padding-block: var(--s-3) var(--s-6);
}

/* Projekt: kadr 4:5 (wideo / animacja) i opis. Telefon i tablet pionowo: kadr na całą szerokość, opis pod
   spodem, panel się przewija. Ekran poziomy (od 560 px): kadr po lewej na całą wysokość ciała panelu,
   opis obok - przewija się tylko opis. */
.pj { display: grid; gap: var(--s-4); }
.sheet__video { width: 100%; }
.sheet__video video { background: var(--ink); }
.pj__info { display: flex; flex-direction: column; gap: var(--s-2); max-width: 34em; }
.pj__tagline { color: var(--ink); }
.pj__rows { display: grid; margin-top: var(--s-2); border-top: var(--hairline) solid var(--hair); }
.pj__row { display: grid; grid-template-columns: minmax(6em, 9em) minmax(0, 1fr); gap: var(--s-2); padding-block: var(--s-2); border-bottom: var(--hairline) solid var(--hair); }
.pj__row dt { padding-top: .2em; }
@media (max-width: 599px) { .pj__row { grid-template-columns: 6.5em minmax(0, 1fr); } }
.pj__points { display: grid; gap: 2px; }
.pj__points li { padding-left: 1.1em; text-indent: -1.1em; }
.pj__points li::before { content: "-"; display: inline-block; width: 1.1em; text-indent: 0; color: var(--ink-3); }
.pj__link { margin-top: var(--s-1); display: flex; flex-wrap: wrap; gap: var(--s-1) var(--s-4); }
.pj__soon { color: var(--ink-2); }
@media screen and (min-width: 560px) and (orientation: landscape) {
  .sheet--project .sheet__body { overflow: hidden; container-type: size; }
  .pj { height: 100%; grid-template-columns: auto minmax(0, 1fr); gap: var(--s-6); align-items: center; }
  .pj__media .sheet__video { width: min(52cqw, 100cqh * var(--ar)); }
  .pj__info { max-height: 100cqh; overflow-y: auto; overscroll-behavior: contain; padding-right: var(--s-2); }
}
/* Telefon poziomo (niski ekran): cieńszy pasek i mniejszy odstęp od góry - więcej miejsca na kadr */
@media (orientation: landscape) and (max-height: 500px) {
  .sheet { --sheet-top: var(--s-1); }
  .sheet__bar { height: var(--s-6); padding-top: 0; }
  .sheet--project .sheet__body { padding-block: 0 var(--s-2); }
}

@media (min-width: 768px) {
  .sheet__year, .sheet__no { display: inline; }
}

/* ==========================================================================
   O mnie (brief 5.3) — w panelu
   ========================================================================== */
.about { row-gap: var(--s-5); }
.about__portrait { width: 66%; }
.about__label { margin-top: var(--s-6); }

/* Wiersze: rok — miejsce — rola */
.rows { margin-top: var(--s-2); }
.row {
  display: grid;
  grid-template-columns: var(--s-8) 1fr;
  column-gap: var(--s-2);
  align-items: baseline;
  padding-block: var(--s-2);
  border-bottom: var(--hairline) solid var(--hair);
}
.row:first-child { border-top: var(--hairline) solid var(--hair); }
.row__role { grid-column: 2; }

.details { margin-top: var(--s-6); display: grid; gap: var(--s-3); }
.detail dd { margin: var(--s-1) 0 0; }

@media (min-width: 768px) {
  .row { grid-template-columns: var(--s-8) 1fr 1fr; }
  .row__role { grid-column: auto; }
  .about__text { grid-column: 1 / 9; }
  .about__portrait { grid-column: 1 / 6; width: auto; }
}

@media (min-width: 1024px) {
  .about__text { grid-column: 1 / 6; grid-row: 1; }
  .about__portrait { grid-column: 9 / -1; grid-row: 1; }
}

/* ==========================================================================
   Kontakt (stopka) - czarna sekcja na końcu strony: tytuł, mail, profile, „umów rozmowę” (Calendly), ©.
   Telefon: jedno pod drugim. Od 768 px: mail z profilami po lewej, przycisk po prawej.
   ========================================================================== */
.site-footer__in {
  display: grid;
  grid-template-areas: "title" "contact" "button";
  grid-template-columns: minmax(0, 1fr);
  gap: var(--s-3);
}
.site-footer__title { grid-area: title; }
.site-footer__contact { grid-area: contact; display: grid; gap: var(--s-2); }
/* „umów rozmowę” + „zapytaj asystenta AI”: telefon - jeden pod drugim, od 768 px obok siebie */
.site-footer__actions { grid-area: button; display: grid; gap: var(--s-2); }
@media (min-width: 768px) {
  .site-footer__actions { display: flex; flex-wrap: wrap; }
  .site-footer__actions > * { flex: none; width: 15em; }   /* oba przyciski tej samej szerokości, obok siebie lub jeden pod drugim */
}
.site-footer__agent { gap: var(--s-1); }
@media (min-width: 400px) { .site-footer .mail { white-space: nowrap; } }   /* przy 320 px adres może się złamać */
.site-footer__button { gap: var(--s-1); }
/* Nawigator sekcji (desktop): linia 1 px z samymi kółkami jak znak, aktywne wypełnione. Nazwy sekcji
   tylko dla czytników ekranu. Linia wypełnia się tuszem wraz z przewijaniem (--p z main.js). */
.scrollnav { display: none; }
@media (min-width: 1024px) {
  .scrollnav { display: block; position: fixed; z-index: 15; right: 24px; top: 50%; translate: 0 -50%; }
  .scrollnav ol { position: relative; display: grid; gap: var(--s-4); }
  /* linia od środka pierwszego do środka ostatniego kółka (wiersz ma 24 px) - bez wystających końców */
  .scrollnav__line { position: absolute; right: 4px; top: 12px; bottom: 12px; width: 1px; background: var(--hair); }
  .scrollnav__fill { position: absolute; left: 0; right: 0; top: 0; height: calc(var(--p, 0) * 100%); background: var(--ink); }
  .scrollnav a { position: relative; display: block; width: 24px; height: 24px; margin-left: auto; margin-right: -7.5px; }   /* pole kliknięcia 24 × 24, kółko przy prawej krawędzi */
  .scrollnav a::after { content: ""; position: absolute; right: 0; top: 50%; width: 9px; height: 9px; translate: 0 -50%; border: var(--hairline) solid var(--ink-3); border-radius: 50%; background: var(--paper); transition: background-color var(--t-line) var(--ease), border-color var(--t-line) var(--ease); }
  .scrollnav a::after { right: 7.5px; }
  .scrollnav__label { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
  .scrollnav__no { display: none; }
  .scrollnav a:hover::after, .scrollnav a[aria-current="true"]::after { background: var(--ink); border-color: var(--ink); }
}

/* Pasek na samym dole strony: profile i ©. Desktop: profile pod treścią, © pod sferą. */
.colophon { display: flex; flex-wrap: wrap; justify-content: space-between; gap: var(--s-2) var(--s-4); padding-block: var(--s-4) var(--s-3); }
.colophon__links { display: flex; flex-wrap: wrap; }
.colophon__links li + li::before { content: "·"; padding-inline: var(--s-1); }
.colophon__links a { color: var(--ink); border-bottom: var(--hairline) solid var(--hair); transition: border-color var(--t-line) var(--ease); }
.colophon__links a:hover { border-color: var(--ink); }
@media (min-width: 1024px) {
  .colophon { grid-column: 1 / -1; display: grid; grid-template-columns: repeat(var(--cols), minmax(0, 1fr)); column-gap: var(--gutter); align-items: baseline; }
  .colophon__links { grid-column: 1 / 6; }
  .colophon__copy { grid-column: 7 / -1; text-align: center; }
  /* © kończy się tam, gdzie podpis „przeciągnij, żeby obrócić” (szerokość podpisu mierzy main.js) */
  .colophon__copy[style*="--hint-w"] { text-align: right; padding-right: calc(50% - var(--hint-w) / 2); }
}

@media (min-width: 768px) {
  .site-footer__in {
    padding-block: var(--s-8) var(--s-5);
    grid-template-areas: "title title" "contact contact" "button button";
    grid-template-columns: 1fr auto;
    align-items: center;
    row-gap: var(--s-4);
  }
  .site-footer__contact { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2) var(--s-5); }
}


.contact__mail {
  display: flex;
  align-items: center;
  gap: var(--s-1);
}

.mail {
  overflow-wrap: anywhere;
  border-bottom: var(--hairline) solid var(--ink);
}

.copy {
  display: none;                    /* bez JS nie ma czego kliknąć */
  width: 32px;
  height: 32px;
  align-items: center;
  justify-content: center;
  color: var(--ink-2);
  transition: color var(--t-line) var(--ease);
}
.js .copy { display: inline-flex; }
.copy:hover { color: var(--ink); }

.icon {
  width: 16px;
  height: 16px;
  fill: none;
  stroke: currentColor;
  stroke-width: 1;
}

.copy__status {
  opacity: 0;
  transition: opacity var(--t-fade) var(--ease);
}
.copy__status.is-on { opacity: 1; }

.contact__links { display: flex; flex-wrap: wrap; }
.contact__links li + li::before {
  content: "·";
  padding-inline: var(--s-1);
}
.contact__links a { color: var(--ink); border-bottom: var(--hairline) solid var(--hair); transition: border-color var(--t-line) var(--ease); }
.contact__links a:hover { border-color: var(--ink); }


/* Przycisk: włosowa ramka, bez zaokrągleń; po najechaniu wypełnienie tuszem */
.button {
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 48px;
  padding-inline: var(--s-4);
  border: 1px solid var(--ink);
  color: var(--ink);
  transition: background-color var(--t-line) var(--ease), color var(--t-line) var(--ease);
}
.button:hover,
.button:focus-visible { background: var(--ink); color: var(--paper); }
/* Przyciski główne („kontakt”, „umów rozmowę”): pełne tuszem; po najechaniu - sama ramka */
.button--primary { background: var(--ink); color: var(--paper); }
.button--primary:hover,
.button--primary:focus-visible { background: transparent; color: var(--ink); }
.button--small { min-height: 32px; padding-inline: var(--s-2); font-size: var(--fs-meta); }

/* Elementy tylko do PDF (rok na okładce, tekst case study, QR) */
.print-only { display: none; }

/* ==========================================================================
   Brandbook - księga znaku marki osobistej (panel #brandbook)
   Etykieta sekcji w kolumnach 1-3, treść 4-12; na telefonie jedna kolumna.
   ========================================================================== */
.bb { padding-bottom: var(--s-8); }
.bb__intro { max-width: 34em; margin-bottom: var(--s-6); }
.bb__sec {
  row-gap: var(--s-2);
  padding-block: var(--s-5);
  border-top: var(--hairline) solid var(--hair);
}
.bb__body { display: grid; gap: var(--s-3); align-content: start; }
.bb__note { margin-top: var(--s-1); }
@media (min-width: 768px) {
  .bb__label { grid-column: 1 / 4; }
  .bb__body  { grid-column: 4 / -1; }
}

/* Znak: jasna i ciemna wersja, rozmiary */
.bb__tiles { display: grid; grid-template-columns: 1fr 1fr; gap: var(--s-3); max-width: 640px; }
.bb__tile { display: grid; place-items: center; aspect-ratio: 4 / 3; border: var(--hairline) solid var(--hair); }
.bb__tile--paper { background: #FAFAF7; color: #111111; }
.bb__tile--ink   { background: #111111; color: #FAFAF7; }
.bb__tile .bb__mark { --size: 96; }
.bb__sizes { display: flex; align-items: center; gap: var(--s-3); margin: 0; }
.bb__mark--16 { --size: 16; }
.bb__mark--24 { --size: 24; }
.bb__mark--40 { --size: 40; }

/* Kolory */
.bb__swatches { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--s-4) var(--s-3); }
@media (min-width: 768px)  { .bb__swatches { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
@media (min-width: 1024px) { .bb__swatches { grid-template-columns: repeat(6, minmax(0, 1fr)); } }
.bb__swatches li { display: grid; gap: 2px; align-content: start; }
.bb__chip { display: block; width: 100%; aspect-ratio: 1; margin-bottom: var(--s-1); border: var(--hairline) solid var(--hair); }
.bb__name { font-size: var(--fs-text); }

/* Typografia - wiersze jak w indeksie */
.bb__type li {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: var(--s-1);
  padding-block: var(--s-2);
  border-bottom: var(--hairline) solid var(--hair);
}
.bb__type li:first-child { border-top: var(--hairline) solid var(--hair); }
@media (min-width: 768px) {
  .bb__type li { grid-template-columns: 220px minmax(0, 1fr); align-items: baseline; gap: var(--s-3); }
}

/* Symbole i ikony */
.bb__symbols { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-4); }
.bb__sym { --size: 40; }
.bb__icon { width: 40px; height: 40px; }

/* Siatka 12 kolumn */
.bb__grid { display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); gap: 6px; height: var(--s-8); }
.bb__grid span { background: var(--hair); }

/* Ruch: wiersze nazwa - wartość */
.bb__row { grid-template-columns: minmax(0, 1fr) auto; }
.bb__row .row__role { grid-column: auto; text-align: right; }

/* Zasady: tak / nie */
.bb__rules { display: grid; grid-template-columns: 1fr; gap: var(--s-4); }
@media (min-width: 768px) { .bb__rules { grid-template-columns: 1fr 1fr; } }
.bb__rules ul { display: grid; gap: var(--s-1); margin-top: var(--s-2); }
.bb__rules li::before { content: "+"; display: inline-block; width: 1.4em; color: var(--ink-3); }
.bb__no li::before { content: "-"; }

/* ==========================================================================
   Asystent AI - czat w panelu #agent (otwiera go awatar w hero).
   Jedyny kolor marki osobistej: tęczowa poświata (decyzja właściciela, patrz brandbook).
   Gradient obraca się przez transform (kompozytor, bez przemalowywania); bez ruchu w systemie stoi.
   ========================================================================== */
:root { --rainbow: conic-gradient(#FF5F6D, #FFB36B, #F4F06A, #5EE6A0, #4FC3F7, #7C6CFF, #F06CFF, #FF5F6D); }
@keyframes agent-spin { to { transform: rotate(1turn); } }

/* Znak asystenta w pasku panelu: kółko wypełnione tęczą, kolory płyną (obrót koła) */
.agent-dot { flex: none; width: 12px; height: 12px; border-radius: 50%; background: var(--rainbow); animation: agent-spin 6s linear infinite; }
/* Awatar w pasku panelu asystenta: rysunek kreską (czarno-biały) z tęczowym cieniem jak w hero */
.agent-face { position: relative; isolation: isolate; flex: none; width: 32px; height: 32px; border-radius: 50%; }
.agent-face::before { content: ""; position: absolute; inset: -2px; z-index: -1; border-radius: 50%; background: var(--rainbow); filter: blur(6px); opacity: .8; animation: agent-spin 6s linear infinite; }
.agent-face img { display: block; width: 100%; height: 100%; border-radius: 50%; background: #FFFFFF; }

/* Telefon: nad asystentem więcej przyciemnienia (klik w nie zamyka), u góry panelu kreska-uchwyt -
   panel można zsunąć palcem (main.js). Pozostałe panele bez uchwytu. */
.sheet__grab { display: none; }
@media (max-width: 767px) {
  .sheet--agent { --sheet-top: 22svh; }
  .sheet--agent .sheet__grab { display: block; position: absolute; z-index: 1; inset: 0 0 auto; height: var(--s-3); touch-action: none; }
  .sheet--agent .sheet__grab::before { content: ""; position: absolute; left: 50%; top: 10px; width: 40px; height: 3px; translate: -50% 0; background: var(--ink-4); }
  .sheet--agent .sheet__bar { touch-action: none; padding-top: var(--s-3); }
}

/* Panel: jak wszystkie panele - wysuwa się od dołu na całą szerokość; czat w kolumnie do czytania */
.sheet--agent .sheet__body { display: flex; flex-direction: column; overflow: hidden; padding-block: var(--s-1) var(--s-3); }

.agent { flex: 1; min-height: 0; width: 100%; max-width: 760px; display: flex; flex-direction: column; gap: var(--s-2); }
.agent__log {
  flex: 1;
  min-height: 0;
  overflow-y: auto;
  overscroll-behavior: contain;
  display: flex;
  flex-direction: column;
  gap: var(--s-2);
}
.agent__msg { max-width: 88%; line-height: var(--lh-text); overflow-wrap: anywhere; }
.agent__msg--bot { align-self: flex-start; }
.agent__msg--user { align-self: flex-end; padding: var(--s-1) var(--s-2); background: var(--ink); color: var(--paper); }
.agent__msg ul { display: grid; gap: 2px; margin-top: var(--s-1); }
.agent__msg ul li { padding-left: 1.2em; text-indent: -1.2em; }
.agent__msg ul li::before { content: "-"; display: inline-block; width: 1.2em; text-indent: 0; color: var(--ink-3); }
.agent__links { display: flex; flex-wrap: wrap; gap: var(--s-1) var(--s-3); margin-top: var(--s-1); }
.agent__offline { display: block; margin-bottom: 4px; color: var(--ink-3); }
/* „pisze…”: trzy kropki */
.agent__typing { display: flex; gap: 4px; padding-block: var(--s-1); }
.agent__typing i { width: 4px; height: 4px; border-radius: 50%; background: var(--ink-2); animation: agent-typing 1.2s var(--ease) infinite; }
.agent__typing i:nth-child(3) { animation-delay: .2s; }
.agent__typing i:nth-child(4) { animation-delay: .4s; }
@keyframes agent-typing { 0%, 100% { opacity: .25; } 40% { opacity: 1; } }

.agent__chips, .agent__form { display: none; }
.js .agent__chips { display: flex; flex-wrap: wrap; gap: var(--s-1); }
.js .agent__form { display: flex; gap: var(--s-1); }
.js .agent__nojs, .agent.has-chat .agent__chips { display: none; }
.agent__chips .button { text-align: left; }
.agent__form input {
  flex: 1;
  min-width: 0;
  min-height: 48px;
  padding-inline: var(--s-2);
  border: var(--hairline) solid var(--ink);
  border-radius: 0;
  background: var(--paper);
  color: var(--ink);
  font: inherit;
  font-size: 16px;                  /* poniżej 16 px iOS powiększa stronę przy pisaniu */
}
.agent__form input::placeholder { color: var(--ink-3); }
.agent__form input:focus-visible { outline: none; box-shadow: inset 0 0 0 1px var(--ink); }   /* fokus = ramka 2 px */
/* FAQ obok czatu - tylko szerokie ekrany (od 1200 px), w wolnym miejscu po prawej. Pytania jak wiersze
   indeksu (linia 1 px, „+” obraca się w „×”), pod odpowiedzią przycisk zadania pytania asystentowi. */
.agent-faq { display: none; }
@media (min-width: 1200px) {
  .sheet--agent .sheet__body { flex-direction: row; align-items: stretch; gap: var(--s-8); }
  .agent-faq { display: flex; flex-direction: column; flex: 0 1 400px; min-height: 0; margin-left: auto; padding-left: var(--s-6); border-left: var(--hairline) solid var(--hair); }
  .agent-faq__title { margin-bottom: var(--s-2); }
  .agent-faq__list { min-height: 0; overflow-y: auto; overscroll-behavior: contain; border-top: var(--hairline) solid var(--hair); }
  .agent-faq__item { border-bottom: var(--hairline) solid var(--hair); }
  .agent-faq__item summary { position: relative; display: block; padding: var(--s-2) var(--s-4) var(--s-2) 0; cursor: pointer; list-style: none; }
  .agent-faq__item summary::-webkit-details-marker { display: none; }
  .agent-faq__item summary::after { content: "+"; position: absolute; right: 0; top: var(--s-2); color: var(--ink-3); transition: rotate var(--t-line) var(--ease); }
  .agent-faq__item[open] summary::after { rotate: 45deg; }
  .agent-faq__item summary:focus-visible { outline: 1px solid var(--ink); outline-offset: 2px; }
  .agent-faq__item p { padding-bottom: var(--s-1); }
  .agent-faq__ask { margin-bottom: var(--s-2); font-size: var(--fs-meta); background: none; border-width: 0 0 var(--hairline); cursor: pointer; }
}
.agent__note { display: none; color: var(--ink-3); }
.js .agent__note { display: block; }
@media (max-height: 500px) { .js .agent__note { display: none; } }

/* Kontakt na telefonie i tablecie: odwrócony blok na całą szerokość - czarny w trybie jasnym, jasny w ciemnym.
   Od 1024 px kontakt jest sekcją jak hero i portfolio (sfera obok), w kolorach strony. */
@media (max-width: 1023px) {
  .site-footer, .colophon {
    --paper:  #111111;
    --ink:    #FAFAF7;
    --ink-2:  #A3A39E;
    --ink-3:  #8C8C87;
    --hair:   rgba(250, 250, 247, .16);
    margin-inline: calc(var(--margin) * -1);
    background: var(--paper);
    color: var(--ink);
  }
  .site-footer__in, .colophon { padding-inline: var(--margin); }
  .colophon { margin-inline: calc(var(--margin) * -1); flex-direction: column; }
}
@media (max-width: 767px) {
  .site-footer { margin-top: var(--s-5); }
  .site-footer__in { padding-block: var(--s-6) var(--s-5); }
}
@media (max-width: 1023px) {
  :root[data-theme="dark"] .site-footer, :root[data-theme="dark"] .colophon {
    --paper:  #FAFAF7;
    --ink:    #111111;
    --ink-2:  #6E6E6A;
    --ink-3:  #73736E;
    --hair:   rgba(17, 17, 17, .14);
  }
}
/* Desktop: kontakt = trzecia sekcja w lewej kolumnie, na wysokość ekranu; sfera stoi obok */
@media (min-width: 1024px) {
  .site-footer { grid-column: 1 / 6; }
  /* Pasek z profilami i © leży na dole ostatniego ekranu (sekcji Kontakt) */
  .colophon { position: absolute; left: 0; right: 0; bottom: 0; min-height: 72px; align-items: center; padding-block: 0; }
  .site-footer__in {
    padding-block: 0;
    grid-template-areas: "title" "contact" "button";
    grid-template-columns: minmax(0, 1fr);
    justify-items: start;
    row-gap: var(--s-4);
  }
  .site-footer__title { margin-bottom: calc(var(--s-3) - var(--s-4)); }
}


/* ==========================================================================
   Wejście na stronę: znak się rysuje, potem wolno pojawia się tekst (brief 4.5)
   ========================================================================== */
.reveal {
  display: inline-block;
  animation: rise var(--t-fade) var(--ease) both;
  /* tekst rusza od razu, kolejne linie co --t-stagger */
  animation-delay: calc(150ms + var(--n, 0) * var(--t-stagger));
}
li.reveal { display: list-item; }

.no-intro .reveal { animation: none; }

@keyframes rise {
  from { opacity: 0; transform: translateY(var(--rise)); }
  to   { opacity: 1; transform: none; }
}

/* ==========================================================================
   Ruch wyłączony na życzenie systemu
   ========================================================================== */
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after {
    animation: none !important;
    transition: none !important;
  }
  .is-drawing .symbol .stroke { stroke-dashoffset: 0; }
  .is-drawing .symbol .hanko { opacity: 1; }
}
