/* ==========================================================================
   Whispet 2026 — wspólny arkusz całego serwisu: landing, przewodnik, pomoc,
   hub dokumentów i same dokumenty prawne. Zero buildu, zero zależności.

   Arkusze podstron dokładają się do tego pliku, nie zastępują go:
   support.css, journal-guide.css, legal-doc.css.
   ========================================================================== */

/* === Reset & Base === */
*,
*::before,
*::after { box-sizing: border-box; margin: 0; padding: 0; }

:root {
  /* --- marka --- */
  --accent: #886878;
  --accent-dark: #7a5a6c;

  /* --- neutralne, ciepłe --- */
  --bg: #fdf8f2;
  --paper: #fcfbf8;
  --surface: #f5f3f0;
  --white: #fff;
  --text: #3a2f33;
  --text-muted: #7d6f6a;
  --text-dim: #6f625d; /* 5.3:1 na bieli — poprzednie #9b8d86 dawało 3.2:1 */
  --border: #e6ded6;
  /* Naglowki sekcji WEWNATRZ tresci (.doc-body h2/h3/h4, .faq-head h2,
     .qa-body h4) — na jasnym motywie to zawsze --text, bez zmian; token
     istnieje po to, zeby cieMNY motyw mogl je przygasic NIEZALEZNIE od
     --text (ktorego uzywaja tez h1/h2/h3 na hero/landingu, gdzie tlem nie
     jest plaski --bg i gdzie ta jasnosc jest OK). */
  --heading-ink: var(--text);

  /* --- semantyczne --- */
  --green: #4a8e4a;
  --warm: #d97757;
  --amber-ink: #c2680a;
  --gold-tint: #fbf0d9;
  --gold-ink: #7a5410;

  /* --- barwy szablonów dziennika (stałe, te same co w aplikacji) --- */
  --journal-epilepsy: #e57373;
  --journal-digestion: #6daf6d;
  --journal-diabetes: #5b9bd5;
  --journal-glucose: #4178a4;

  /* --- kafelki szablonów dziennika (#journals), tylko jasny motyw ---
     Barwy szablonów z aplikacji (Whispet-ios JournalTemplates.swift).
     Tło: tint 14% barwy na bieli, 20% na hover/focus. Ring wypełniony
     barwą przyciemnioną tak, by biała ikona miała >= 3,3:1 (oryginalne
     #e57373 / #6daf6d / #5b9bd5 dają 2,6-3,0:1). Ciemne bloki ustawiają te
     tokeny na initial — tam kafelki zostają jak dotąd (var() spada na
     wartość zapasową). */
  --jt-epilepsy-bg: #fbebeb; --jt-epilepsy-bg-hover: #fae3e3; --jt-epilepsy-ring: #d76c6c;
  --jt-digestion-bg: #ebf4eb; --jt-digestion-bg-hover: #e2efe2; --jt-digestion-ring: #609a60;
  --jt-diabetes-bg: #e8f1f9; --jt-diabetes-bg-hover: #deebf7; --jt-diabetes-ring: #5692c8;
  --jt-glucose-bg: #e4ecf2; --jt-glucose-bg-hover: #d9e4ed; --jt-glucose-ring: #4178a4;
  --jt-add-bg: #fff; --jt-add-bg-hover: #f0eaef; --jt-add-edge: #8f6283;  /* obrys 4,7:1 na kremie */
  --jt-edge: currentColor;  /* krawędź w barwie szablonu (color kafelka) — w ciemnym initial */
  --jt-meta: #5f4f56;       /* 5,9-6,8:1 na tintach */
  --jt-icon: #fff;
  --jt-bar: 0px;            /* pasek u stopy zbędny — barwę niesie tint, krawędź i ring */
  --jt-arrow: "→";
  /* biała krawędź karty .card — wyłania kartę z kremowego tła (1,06:1 wobec
     #fdf8f2, czysto dekoracyjna); w ciemnym przezroczysta jak dotąd */
  --card-edge: #fff;

  /* --- alfy akcentu: jedyne wypełnienia i włoskowate obrysy --- */
  --accent-a08: rgba(136, 104, 120, 0.08);
  --accent-a20: rgba(136, 104, 120, 0.2);
  --accent-a35: rgba(136, 104, 120, 0.35);
  --accent-a55: rgba(136, 104, 120, 0.55);

  /* --- gradienty --- */
  --gradient-band: linear-gradient(158deg, #fbdecb 0%, #f1d8df 52%, #fbf0dc 100%);
  --ground-warm: linear-gradient(158deg, rgba(251, 240, 220, 0.62) 0%, rgba(251, 240, 220, 0.14) 46%, var(--white) 80%);
  --ground-warm-hover: linear-gradient(158deg, rgba(251, 222, 203, 0.5) 0%, rgba(241, 216, 223, 0.26) 42%, var(--white) 78%);

  /* --- cienie: podbarwione mauve, nie neutralnie czarne --- */
  --shadow-rest: 0 1px 0 rgba(230, 222, 214, 0.9);
  --shadow-lift: 0 22px 44px -18px rgba(122, 90, 108, 0.34);
  --shadow-lift-sm: 0 14px 30px -14px rgba(122, 90, 108, 0.3);
  --shadow-photo: 0 28px 56px -26px rgba(122, 90, 108, 0.42);
  --shadow-portrait: 0 34px 70px -26px rgba(122, 90, 108, 0.45);

  /* --- tokeny motywu ---------------------------------------------------
     Wartości w :root są DOKŁADNIE tymi literałami, które stały wcześniej
     wprost w regułach. Wyciągnięcie ich do zmiennych nie zmienia jasnego
     motywu ani o piksel — daje za to jedno miejsce, w którym ciemny motyw
     podmienia całą warstwę barwną. Ciemny motyw nie dokłada ANI JEDNEJ
     reguły poza blokiem tokenów; dzięki temu nie ma dwóch równoległych
     arkuszy, które mogą się rozjechać. */
  --on-accent: #fff;                       /* ink na wypełnieniu akcentem */
  --footer-bg: #3a2f33;                    /* stopka jest ciemna w OBU motywach */
  --footer-ink: #fff;
  --nav-bg: rgba(253, 248, 242, 0.82);
  --border-hair: rgba(230, 222, 214, 0.6);
  --border-soft: rgba(230, 222, 214, 0.8);
  --border-soft-2: rgba(230, 222, 214, 0.9);
  --ring-bg: rgba(255, 255, 255, 0.5);
  --ring-bg-hover: rgba(255, 255, 255, 0.72);
  --subtle-fill: rgba(58, 47, 51, 0.06);
  --subtle-fill-hover: rgba(58, 47, 51, 0.12);
  --subtle-fill-2: rgba(58, 47, 51, 0.07);
  --subtle-fill-2-hover: rgba(58, 47, 51, 0.13);

  /* pasmo (page-hero, section--band, jg-hero) ma własny tusz: leży na
     gradiencie, nie na tle strony */
  --band-ink: #4a3a3f;
  --band-ink-soft: #7a655f;
  --band-ink-mid: #7a5a6c;
  --band-ink-dim: #8a736c;
  --band-ring: rgba(255, 255, 255, 0.5);
  --band-chip-bg: rgba(255, 255, 255, 0.6);
  --band-chip-border: rgba(255, 255, 255, 0.85);
  /* Tarcza pod ikona ostrzezenia. Wlasny token, bo w jasnym motywie to bialy
     welon na kremowej metce, a w ciemnym — cieply welon pod zlota ikona;
     --band-chip-bg (szklo na pasmie) nie jest juz ta sama rola. */
  --caution-ring-bg: rgba(255, 255, 255, 0.6);
  --search-bg: rgba(255, 255, 255, 0.82);
  --search-border: rgba(255, 255, 255, 0.9);
  --search-placeholder: #a39189;

  /* elementy leżące NA zdjęciu — plakietka zostaje jasna w obu motywach,
     bo jej tłem jest fotografia, nie strona */
  --photo-chip-bg: rgba(255, 255, 255, 0.85);
  --photo-chip-ink: #7a5a6c;
  --photo-chip-icon: var(--accent);  /* ikonka w plakietce — w jasnym motywie bez zmian */
  --photo-filter: none;

  /* makiety kontrolek iOS w przewodniku */
  --mock-field: #f6f2ee;
  --mock-track: #e8e2dc;
  --mock-track-2: #ece6e0;
  --mock-on: #fff;
  --zone-ink: #3d7340;
  --caution-ring: rgba(194, 104, 10, 0.35);
  --chart-line: #886878;
  --chart-dot-halo: #fff;
  --chart-warm: #d97757;
  --chart-green: #4a8e4a;
  --chart-axis: #e6ded6;
  --chart-zone-fill: rgba(74, 142, 74, 0.13);
  --chart-zone-line: rgba(74, 142, 74, 0.5);

  /* zasoby, których nie da się przemalować CSS-em */
  --logo-light-display: block;   /* logotyp mono-black — na jasnym */
  --logo-dark-display: none;     /* logotyp zloty — na ciemnym */
  --badge-ring: none;   /* czarna odznaka App Store gubi się na ciemnym tle */
  --qr-plate: transparent; /* kod QR jest ciemny na przezroczystym tle */

  /* --- promienie --- */
  --radius-sm: 12px;
  --radius: 18px;
  --radius-card: 22px;
  --radius-photo: 30px;
  --radius-pill: 999px;

  /* --- typografia --- */
  --font-sans: "Nunito", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
  /* Krój nagłówkowy. DM Serif Display był fontem DISPLAY o kontraście kresek
     7,5:1 (zmierzone: stem pionowy 60 px vs poziomy 8 px przy 400 px kegla) —
     w małych rozmiarach gubił detal, a na ciemnym tle włoskowate szeryfy
     znikały przy odwróconej polaryzacji. Literata ma kontrast 1,74:1 i o 5 %
     większą wysokość x, jest krojem do CZYTANIA (Google Play Books) i ma pełny
     latin-ext, czyli komplet diakrytyków dla PL/DE/ES/FR/IT.
     Literata ma też oś optyczną opsz 7–72, ale link do fontów jej NIE prosi:
     zamówienie zakresu osi każe Google wysłać pełny plik zmienny i podnosi
     wagę kroju z 77 kB do 237 kB. Za tę cenę dostaje się rysunek dobierany do
     kegla; przy skoku o 160 kB nie warto — instancja domyślna to i tak cięcie
     tekstowe, czyli dokładnie to, o co w tej zmianie chodzi. */
  --font-display: "Literata", Georgia, serif;
  /* DM Serif miał tylko wagę 400 i mimo to ważył optycznie dużo — bo miał
     grube stemy. Literata 400 to waga TEKSTOWA; nagłówki wracają do dawnej
     masy dopiero przy 500. To zmiana wagi, nie hierarchii wielkości.
     Konwencja: RZYMSKA odmiana kroju nagłówkowego zawsze var(--display-weight),
     KURSYWA zawsze 400 — i tylko te dwa rysunki są wczytywane. */
  --display-weight: 500;

  /* --- ruch --- */
  --dur: 0.25s;
  --dur-card: 0.34s;
  --dur-reveal: 0.9s;

  /* --- layout --- */
  --container: 1120px;
  --gutter: 44px;
  --section-y: 104px;
  --nav-h: 74px;

  /* --- z-index --- */
  --z-nav: 100;
  --z-menu: 900;
  --z-modal: 10000;
}

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

body {
  font-family: var(--font-sans);
  font-size: 16px;
  line-height: 1.62;
  color: var(--text);
  background: var(--bg);
  -webkit-font-smoothing: antialiased;
}

a { color: var(--accent-dark); text-decoration: none; }
a:hover { color: var(--accent); }

*:focus-visible { outline: 3px solid var(--accent); outline-offset: 2px; border-radius: 6px; }

.skip-link {
  position: absolute; top: -100%; left: 16px; z-index: var(--z-modal);
  padding: 10px 18px; background: var(--accent-dark); color: var(--on-accent);
  border-radius: 0 0 10px 10px; font-weight: 700;
}
.skip-link:focus { top: 0; }

.container { max-width: var(--container); margin: 0 auto; padding: 0 var(--gutter); }

/* === Nagłówki === */
h1, h2, h3, .section-title {
  font-family: var(--font-display);
  font-weight: var(--display-weight);
  letter-spacing: -1px;
  line-height: 1.06;
  color: var(--text);
}
.section-title { font-size: clamp(2rem, 3.6vw, 3.2rem); }
.section-lead {
  margin-top: 16px; font-size: 1.1rem; font-weight: 500;
  color: var(--text-muted); line-height: 1.65;
}

/* Kursywa = głos opiekuna. Podpisy, przykłady, uwagi na marginesie.
   .hand NIE ustawia kroju. Klasa obsługuje dwie grupy o różnych potrzebach:
   krótkie etykiety w 0,92–1,06 rem (hero-kicker, beat-eyebrow, tap-hint,
   jg-hint, gołe .hand przy kodzie QR) i większe, dekoracyjne podpisy
   (timeline-frame-cap 1,14 rem, .no-results 1,5 rem). W tych małych rozmiarach
   kursywa szeryfowa jest najgorzej czytelnym miejscem na stronie — zwłaszcza
   jg-hint, bo to całe zdanie. Bez font-family dziedziczą Nunito i zostają
   kursywą; krój szeryfowy dokładają sobie SAME te dwie reguły, które go chcą
   (.timeline-frame-cap niżej, .no-results w support.css). Jedno miejsce na grupę,
   zero font-family rozsypanego po regułach. */
.hand { font-style: italic; color: var(--accent-dark); }

/* === Nawigacja === */
.site-nav {
  position: sticky; top: 0; z-index: var(--z-nav);
  background: var(--nav-bg);
  backdrop-filter: blur(18px);
  -webkit-backdrop-filter: blur(18px);
}
.nav-inner {
  max-width: var(--container); margin: 0 auto; padding: 0 var(--gutter);
  min-height: var(--nav-h); display: flex; align-items: center; gap: 30px;
}
.nav-logo {
  display: flex; align-items: center; gap: 10px;
  font-weight: 500; font-size: 1.26rem; letter-spacing: -0.5px; color: var(--text);
  flex-shrink: 0; white-space: nowrap;
}
/* Lockup jest poziomy (viewBox 7320x2080). Wysokosc 34 px zostawia SAM ZNAK
   w dokladnie tym rozmiarze co dotychczasowy kwadrat 34x34 — znak wypelnia
   pelna wysokosc lockupu (zmierzone: 208/208 px), wiec nawigacja nie rosnie
   w pionie. Szerokosc liczy przegladarka z proporcji; atrybuty width/height
   na <img> niosa intrinsic ratio, wiec miejsce jest zarezerwowane przed
   pobraniem pliku i nie ma CLS. */
.nav-logo img { height: 34px; width: auto; }
.nav-links { display: flex; gap: 28px; margin-left: auto; list-style: none; align-items: center; }
.nav-links a { font-size: 0.93rem; font-weight: 600; color: var(--text-muted); white-space: nowrap; }
.nav-links a:hover, .nav-links a.active { color: var(--accent-dark); }
.nav-cta {
  padding: 9px 20px; border-radius: var(--radius-pill);
  background: var(--accent); color: var(--on-accent) !important;
  font-size: 0.88rem; font-weight: 700;
  transition: background var(--dur) ease, transform var(--dur) ease;
}
.nav-cta:hover { background: var(--accent-dark); transform: translateY(-1px); }
.nav-toggle {
  display: none; background: none; border: 1px solid var(--border);
  border-radius: 10px; padding: 7px 9px; color: var(--text); cursor: pointer;
}
.nav-toggle svg { width: 20px; height: 20px; display: block; }

/* Przełącznik języka — jeden komponent dla wszystkich podstron */
.lang-switcher { position: relative; }
.lang-switcher summary {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 7px 12px; border: 1px solid var(--border); border-radius: var(--radius-pill);
  font-size: 0.85rem; font-weight: 600; color: var(--text-muted);
  list-style: none; cursor: pointer; white-space: nowrap;
  transition: border-color var(--dur) ease, color var(--dur) ease;
}
.lang-switcher summary::-webkit-details-marker { display: none; }
.lang-switcher summary:hover { color: var(--accent-dark); border-color: var(--accent-a35); }
.lang-switcher .chevron-icon { transition: transform var(--dur) ease; }
.lang-switcher[open] summary .chevron-icon { transform: rotate(180deg); }
.lang-menu {
  position: absolute; top: calc(100% + 6px); right: 0; min-width: 168px;
  padding: 6px; list-style: none; background: var(--white);
  border: 1px solid var(--border); border-radius: var(--radius-sm);
  box-shadow: var(--shadow-lift-sm); z-index: var(--z-menu);
}
.lang-menu button {
  display: block; width: 100%; text-align: left; padding: 8px 12px;
  background: none; border: 0; border-radius: 8px;
  font-family: inherit; font-size: 0.9rem; font-weight: 600; color: var(--text-muted);
  cursor: pointer; transition: background var(--dur) ease, color var(--dur) ease;
}
.lang-menu button:hover { background: var(--surface); color: var(--text); }
.lang-menu button.active { color: var(--accent-dark); background: var(--surface); font-weight: 700; }
.nav-lang-flat { display: none; }

/* === Znaki: ikony liniowe === */
.znak { width: 24px; height: 24px; fill: none; stroke: currentColor; stroke-width: 1.5; stroke-linecap: round; stroke-linejoin: round; overflow: visible; }
/* UWAGA: "żywej kropki" NIE stylujemy tutaj. Ikony wstawiamy przez <use>, a selektor
   potomny nie przenika granicy shadow tree — przechodzą tylko właściwości dziedziczone,
   a fill/stroke są na .znak nadpisane. Kropka ma malowanie wpisane w <symbol> jako
   atrybuty prezentacyjne (fill="#886878" stroke="none"). */
.znak--sm { width: 19px; height: 19px; }
/* Ikony gatunków są wypełniane, nie rysowane jednym śladem — mają własny
   tryb malowania. Wstawia je scripts/build-pet-icons.mjs. */
.znak--fill { fill: currentColor; stroke: none; width: 28px; height: 28px; }

/* Ring — zastąpił kolorowy kafel z emoji */
.ring {
  width: 46px; height: 46px; flex-shrink: 0;
  display: grid; place-items: center;
  border: 1px solid var(--accent-a20); border-radius: 50%;
  background: var(--ring-bg); color: var(--accent-dark);
  transition: border-color var(--dur-card) ease, background var(--dur-card) ease, transform var(--dur-card) ease;
}
.ring--sm { width: 40px; height: 40px; }
.ring--dashed { border-style: dashed; border-color: var(--accent-a55); }

/* === Przyciski === */
.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 9px;
  padding: 13px 26px; border: 0; border-radius: var(--radius-pill);
  font-family: inherit; font-size: 0.98rem; font-weight: 700; cursor: pointer;
  transition: background var(--dur) ease, transform var(--dur) ease, box-shadow var(--dur) ease;
}
.btn-primary { background: var(--accent); color: var(--on-accent); }
.btn-primary:hover { background: var(--accent-dark); color: var(--on-accent); transform: translateY(-2px); box-shadow: var(--shadow-lift-sm); }
.btn-ghost { background: transparent; color: var(--accent-dark); border: 1px solid var(--accent-a35); }
.btn-ghost:hover { background: var(--white); transform: translateY(-2px); }

/* Oficjalny badge App Store. NIE ustawiać border-radius na <img> — obcina
   narożniki SVG. Zaokrąglamy tylko <a>, dla pierścienia focusa. */
.appstore-badge {
  display: inline-block; line-height: 0; border-radius: 10px;
  box-shadow: var(--badge-ring);
  transition: transform var(--dur) ease, filter var(--dur) ease;
}
.appstore-badge img { display: block; height: 52px; width: auto; border-radius: 0; }
.appstore-badge:hover { transform: translateY(-2px); filter: drop-shadow(0 10px 22px rgba(122, 90, 108, 0.22)); }
.appstore-badge:focus-visible { outline-offset: 4px; }

/* Most z komputera na telefon. Odznaka App Store otwarta na desktopie prowadzi
   do strony sklepu, a nie do instalacji — kod QR jest jedynym miejscem, gdzie
   ten człowiek może dokończyć akcję bez przepisywania adresu.

   Ukryty na dotyku: na telefonie odznaka działa wprost, a kod byłby prośbą
   o zeskanowanie własnego ekranu. Warunek pyta o WSKAŹNIK (mysz), nie tylko
   o szerokość — szeroki tablet to nadal palec.

   Biała podkładka jest wymagana, nie ozdobna: kod w sekcji „Domknięcie" leży
   na gradiencie pasma, a czytniki potrzebują kontrastu i marginesu ciszy. */
.qr-download { display: none; }
/* Podkładka kodu QR: w jasnym motywie tłem jest samo pasmo (token
   przezroczysty), w ciemnym — jasna płytka rozlana box-shadow poza obrys
   obrazka, żeby czytnik dostał margines ciszy bez zmiany rozmiaru kadru. */
.qr-download img { display: block; width: 92px; height: 92px; background: var(--qr-plate); border-radius: 6px; box-shadow: 0 0 0 9px var(--qr-plate); }
.qr-download span {
  font-size: 0.95rem; line-height: 1.25; max-width: 13ch;
}
.cta-act { display: flex; align-items: center; justify-content: center; gap: 26px; }
@media (min-width: 981px) and (hover: hover) and (pointer: fine) {
  .qr-download { display: flex; align-items: center; gap: 12px; }
}

/* Metka bramki Premium — czyta się jak etykieta, nie przycisk. Nic tu nie klika.
   Kolor stały, nie alfa: metka trafia na różne tła sekcji. Font wymuszony na
   Nunito, bo nagłówki są serifem wczytanym tylko w wadze 400. */
.premium-tag {
  display: inline-flex; align-items: center; gap: 4px; vertical-align: middle;
  margin-left: 8px; padding: 2px 9px; border-radius: var(--radius-pill);
  background: var(--gold-tint); color: var(--gold-ink);
  font-family: var(--font-sans); font-size: 0.7rem; font-weight: 700;
  letter-spacing: 0.02em; white-space: nowrap;
}

/* === HERO === */
.hero { padding: 34px 0 0; position: relative; overflow: hidden; }
.hero-grid {
  position: relative; z-index: 1;
  max-width: var(--container); margin: 0 auto; padding: 0 var(--gutter);
  display: grid; grid-template-columns: 1fr 460px; gap: 56px; align-items: end;
}
.hero-kicker { display: inline-flex; align-items: center; gap: 9px; font-size: 1.06rem; }
/* Kicker na landingu ma własny, wypełniony inline SVG łapy. Znaki są rysowane
   obrysem, więc muszą być z tej reguły wyłączone — inaczej wychodzi kleks. */
.hero-kicker svg:not(.znak) { width: 16px; height: 16px; fill: var(--accent); opacity: 0.8; }
.hero-kicker .znak { fill: none; color: var(--accent); opacity: 0.9; }
/* H1 niesie frazę (dziennik zdrowia psa i kota…) — jest 2–3× dłuższe niż dawny
   slogan, więc mniejszy rozmiar. Dzielenie wyrazów tylko na telefonie (niżej). */
.hero h1 { font-size: clamp(2.3rem, 4vw, 3rem); letter-spacing: -1.2px; margin-top: 16px; }
.hero h1 span { color: var(--accent-dark); }
.hero-help-link { margin-top: 14px; font-size: 0.88rem; font-weight: 600; }
.hero-help-link a { color: var(--text-dim); text-decoration: underline; text-underline-offset: 2px; font-weight: 700; }
.hero-help-link a:hover { color: var(--accent-dark); }
.trust-strip {
  position: relative; z-index: 1; max-width: var(--container); margin: 30px auto 0; padding: 16px var(--gutter);
  display: flex; gap: 28px; flex-wrap: wrap; justify-content: center;
  border-top: 1px solid var(--border);
}
.trust-strip span { display: inline-flex; align-items: center; gap: 8px; font-size: 0.84rem; font-weight: 600; color: var(--text-dim); }
.trust-strip svg { color: var(--accent); opacity: 0.7; }
.hero-sub { margin-top: 22px; font-size: 1.14rem; font-weight: 500; color: var(--text-muted); line-height: 1.65; }
.hero-act { margin-top: 32px; display: flex; align-items: center; gap: 22px; flex-wrap: wrap; }
.hero-note { width: 100%; font-size: 0.86rem; font-weight: 600; color: var(--text-dim); max-width: 34ch; line-height: 1.5; }

/* Portret w łuku — kadr albumowy, nie prostokąt UI */
.portrait {
  position: relative; height: 470px; overflow: hidden;
  border-radius: 230px 230px 34px 34px; box-shadow: var(--shadow-portrait);
}
.portrait img { width: 100%; height: 100%; object-fit: cover; object-position: center 50%; animation: breathe 22s ease-in-out infinite alternate; }
.portrait::after { content: ""; position: absolute; inset: 0; background: linear-gradient(to top, rgba(58, 47, 51, 0.42), transparent 46%); }
@keyframes breathe { from { transform: scale(1.02); } to { transform: scale(1.06); } }
.portrait-tag { position: absolute; left: 22px; bottom: 22px; z-index: 2; color: #fff; }
.portrait-tag b { display: block; font-family: var(--font-display); font-size: 1.5rem; font-weight: var(--display-weight); line-height: 1.1; }
.portrait-tag span { font-size: 0.8rem; font-weight: 600; opacity: 0.9; }
.portrait-heart {
  position: absolute; right: 24px; top: 34px; z-index: 2;
  width: 34px; height: 34px; border-radius: 50%;
  background: rgba(253, 248, 242, 0.9); display: grid; place-items: center;
  animation: heartbeat 3.4s ease-in-out infinite;
}
/* Serce leży na jasnej kremowej płytce NA ZDJĘCIU, nie na tle strony. W
   ciemnym motywie --accent to złoto: złoto na kremie daje ok. 1,35:1.
   --photo-chip-icon jest dokładnie tokenem tej roli (ikona na płytce
   fotograficznej) i w jasnym motywie ma wartość var(--accent), więc jasny
   motyw nie zauważa podmiany. */
.portrait-heart svg { width: 16px; height: 16px; fill: var(--photo-chip-icon); stroke: none; }
.portrait-days {
  position: absolute; right: 22px; bottom: 22px; z-index: 2;
  display: inline-flex; align-items: center; gap: 7px;
  padding: 8px 14px; border-radius: var(--radius-pill);
  background: var(--photo-chip-bg); backdrop-filter: blur(6px);
  font-size: 0.8rem; font-weight: 700; color: var(--photo-chip-ink);
}
.portrait-days svg { color: var(--photo-chip-icon); }
@keyframes heartbeat {
  0%, 100% { transform: scale(1); }
  12% { transform: scale(1.16); }
  24% { transform: scale(1); }
  36% { transform: scale(1.1); }
  48% { transform: scale(1); }
}

/* Kadrowanie zdjec tresciowych — punkt zaczepienia `object-fit: cover`.
   Domyslne `object-position: center` ucinalo zwierze na zdjeciach, ktorych
   proporcja mocno odbiega od proporcji ramki (portrety 2:3 w szerokich,
   ramkach). Punkt dobrany per plik tak, aby obiekt zostawal
   w kadrze przy KAZDEJ proporcji kontenera, jaka wystepuje na stronie.
   Selektor po `src` — dzieki temu regula dziala identycznie we wszystkich
   szesciu wersjach jezykowych index.html bez zmian w markupie. */
.beat-photo img { object-position: center 50%; }

/* portrety pionowe (~0.72:1) — obiekt w gornej polowie kadru */
.beat-photo img[src$="kitten_playing_ball.webp"] { object-position: center 30%; }
.beat-photo img[src$="bird_blossom.webp"] { object-position: center 36%; }

/* poziome kadry — zwierzeta stoja na ziemi, srodek pionu lapie tlo */
.beat-photo img[src$="cat_dog_playing.webp"] { object-position: center 38%; }
.beat-photo img[src$="lab_3.webp"] { object-position: center 40%; }

/* kadry blizkie kwadratu (~1.17:1) — drobna korekta, obiekt lekko ponizej/powyzej srodka */
.beat-photo img[src$="cat_yarn.webp"] { object-position: center 44%; }
.beat-photo img[src$="cat_eating.webp"] { object-position: center 46%; }
/* vet.webp 1040x838 (1.24:1) — proporcja niemal identyczna z ramka 5/4,
   kadrowanie jest zerowe, wiec obowiazuje domyslne `center 50%` (brak reguly). */

/* hero: golden-retriever-pet-journal.webp 1620x940 (1.72:1) w pionowej ramce .portrait —
   kadr przycina sie w poziomie, wiec liczy sie wspolrzedna X: 50% trzyma
   w kadrze jednoczesnie psa (lewa polowa) i telefon na statywie (prawa).
   Wspolrzedna Y dziala tylko w ukladzie jednokolumnowym (<=980px), gdzie
   ramka jest szersza niz zdjecie — 70% zsuwa kadr w dol, na liscie i statyw. */
.portrait img[src$="golden-retriever-pet-journal.webp"] { object-position: 50% 70%; }

/* === Hero podstrony (pomoc, hub dokumentów) === */
.page-hero {
  padding: 56px 0 48px;
  background: var(--gradient-band);
  border-radius: 0 0 44px 44px;
  text-align: center;
}
.page-hero .hero-kicker { justify-content: center; margin-bottom: 14px; }
.page-hero h1 { font-size: clamp(2.2rem, 4.4vw, 3.4rem); letter-spacing: -1.3px; color: var(--band-ink); }
.page-hero-sub {
  margin: 14px auto 0; max-width: 46ch;
  font-size: 1.04rem; font-weight: 500; line-height: 1.6; color: var(--band-ink-soft);
}

/* === Sekcje === */
.section { padding: var(--section-y) 0 40px; }
.section-head { text-align: center; max-width: 640px; margin: 0 auto 66px; }
/* #features nie ma własnego nagłówka — pierwszą treścią jest pas karuzeli
   sytuacji (.situations), który sam daje odstęp pod trust-strip. */
#features { padding-top: 0; }
.section--band {
  position: relative; margin-top: 20px; padding: 90px 0 96px;
  background: var(--gradient-band); border-radius: 44px 44px 0 0; overflow: hidden;
}
.section--band h2 { color: var(--band-ink); }
.band-ring { position: absolute; border-radius: 50%; border: 1px solid var(--band-ring); pointer-events: none; }

/* Opowieść naprzemiennymi blokami — zastąpiła siatkę kart funkcji */
.beat { display: grid; grid-template-columns: 1fr 1fr; gap: 64px; align-items: center; margin-bottom: 88px; }
.beat:nth-child(even) .beat-text { order: 2; }
.beat-eyebrow { font-style: italic; font-size: 1.02rem; color: var(--accent); margin-bottom: 12px; }
.beat-text h3 { font-size: 2.15rem; letter-spacing: -0.7px; line-height: 1.12; }
.beat-text p { margin-top: 16px; font-size: 1.02rem; color: var(--text-muted); font-weight: 500; line-height: 1.7; max-width: 38ch; }
.beat-text p strong { color: var(--accent-dark); font-weight: 600; }
.beat-photo { position: relative; overflow: hidden; border-radius: var(--radius-photo); aspect-ratio: 5 / 4; box-shadow: var(--shadow-photo); }
.beat-photo img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; transition: transform 0.8s ease; opacity: 0; animation: beat-crossfade 16s ease-in-out infinite both; }
.beat-photo img:nth-of-type(1) { animation-delay: 0s; }
.beat-photo img:nth-of-type(2) { animation-delay: 4s; }
.beat-photo img:nth-of-type(3) { animation-delay: 8s; }
.beat-photo img:nth-of-type(4) { animation-delay: 12s; }
.beat-photo--static img { animation: none; opacity: 1; }
.beat:hover .beat-photo img { transform: scale(1.045); }
@keyframes beat-crossfade { 0% { opacity: 0; } 6.25% { opacity: 1; } 25% { opacity: 1; } 31.25% { opacity: 0; } 100% { opacity: 0; } }
.beat-mini { margin-top: 24px; display: flex; gap: 22px; flex-wrap: wrap; }
.beat-mini span { display: inline-flex; align-items: center; gap: 9px; font-size: 0.86rem; font-weight: 600; color: var(--text-dim); }
.beat-mini svg { color: var(--accent); }

/* === Ramka „oś czasu” przy kafelku feat1 ===
   Trzy zdjęcia z podpisem POD ramką; zdjęcie, podpis i meta zmieniają się
   razem (ten sam keyframe i te same opóźnienia, cykl 15 s / 3 elementy).
   Ramka 5:4 siedzi w wewnętrznym .timeline-frame-photo, żeby podpis był
   w zwykłym przepływie pod nią, a nie przycięty przez overflow/aspect-ratio. */
.beat-photo.timeline-frame { position: static; overflow: visible; aspect-ratio: auto; box-shadow: none; border-radius: 0; }
.timeline-frame-photo { position: relative; overflow: hidden; border-radius: var(--radius-photo); aspect-ratio: 5 / 4; box-shadow: var(--shadow-photo); }
.timeline-frame-photo img { animation: timeline-crossfade 15s ease-in-out infinite both; }
.timeline-frame-photo img:nth-of-type(1) { animation-delay: 0s; }
.timeline-frame-photo img:nth-of-type(2) { animation-delay: 5s; }
.timeline-frame-photo img:nth-of-type(3) { animation-delay: 10s; }
@keyframes timeline-crossfade { 0% { opacity: 0; } 6.667% { opacity: 1; } 26.667% { opacity: 1; } 33.333% { opacity: 0; } 100% { opacity: 0; } }
.timeline-frame-cap,
.timeline-frame-meta { position: relative; display: block; min-height: 1.4em; }
.timeline-frame-cap { margin-top: 16px; font-size: 1.14rem; line-height: 1.3; font-family: var(--font-display); }
.timeline-frame-meta { margin-top: 5px; font-size: 0.78rem; font-weight: 600; color: var(--text-dim); min-height: 1.2em; }
.timeline-frame-cap-slide,
.timeline-frame-meta-slide { position: absolute; inset: 0; opacity: 0; animation: timeline-crossfade 15s ease-in-out infinite both; }
.timeline-frame-cap-slide:nth-of-type(1), .timeline-frame-meta-slide:nth-of-type(1) { animation-delay: 0s; }
.timeline-frame-cap-slide:nth-of-type(2), .timeline-frame-meta-slide:nth-of-type(2) { animation-delay: 5s; }
.timeline-frame-cap-slide:nth-of-type(3), .timeline-frame-meta-slide:nth-of-type(3) { animation-delay: 10s; }
.timeline-frame:hover .timeline-frame-photo img,
.timeline-frame:hover .timeline-frame-cap-slide,
.timeline-frame:hover .timeline-frame-meta-slide,
.timeline-frame:focus-within .timeline-frame-photo img,
.timeline-frame:focus-within .timeline-frame-cap-slide,
.timeline-frame:focus-within .timeline-frame-meta-slide { animation-play-state: paused; }

/* === Karuzela sytuacji ===
   Pas pełnej szerokości na tle --accent-a08 (token „tło, nigdy tekst”,
   tematyzowany w obu motywach), sam tekst: ikona + tytuł w jednym rzędzie,
   treść pod spodem, blok wyśrodkowany do ~62ch. Bez JS wszystkie slajdy
   stoją jeden pod drugim; JS dodaje .is-enhanced i pokazuje jeden naraz. */
.situations {
  margin-bottom: 64px;
  width: 100vw; position: relative; left: 50%; right: 50%; margin-left: -50vw; margin-right: -50vw;
  background: var(--accent-a08);
  padding: 56px 0;
}
.situations-viewport { position: relative; overflow: hidden; }
.situations-track { position: relative; display: flex; flex-direction: column; gap: 32px; }
.situations-slide {
  max-width: 62ch; margin: 0 auto;
  display: flex; flex-direction: column; align-items: center; gap: 14px;
  text-align: center;
}
.situations-heading { display: flex; align-items: center; justify-content: center; flex-wrap: wrap; gap: 12px 14px; }
.situations-heading h3 { font-size: 1.7rem; letter-spacing: -0.5px; line-height: 1.16; }
.situations-slide p { font-size: 0.98rem; font-weight: 500; color: var(--text-muted); line-height: 1.65; text-wrap: pretty; }
.situations-controls { margin-top: 30px; display: flex; align-items: center; justify-content: center; gap: 18px; }
.situations-arrow {
  display: inline-flex; align-items: center; justify-content: center;
  width: 40px; height: 40px; border-radius: 50%; border: 1px solid var(--border);
  background: var(--surface); color: var(--text-muted); cursor: pointer;
  transition: color var(--dur) ease, border-color var(--dur) ease, background var(--dur) ease;
}
.situations-arrow:hover { color: var(--accent-dark); border-color: var(--accent-a35); background: var(--ground-warm); }
/* z-chevron to strzałka w dół — obrót o 90° w lewo/prawo daje poprawny kierunek */
.situations-arrow--prev svg { transform: rotate(90deg); }
.situations-arrow--next svg { transform: rotate(-90deg); }
.situations-dots { display: flex; align-items: center; gap: 9px; }
.situations-dot {
  width: 9px; height: 9px; padding: 0; border-radius: 50%; border: none;
  background: var(--accent-a35); cursor: pointer; transition: background var(--dur) ease, transform var(--dur) ease;
}
.situations-dot:hover { background: var(--accent-a55); }
.situations-dot.is-active { background: var(--accent-dark); transform: scale(1.25); }
.situations.is-enhanced .situations-track { display: block; }
.situations.is-enhanced .situations-slide {
  position: absolute; inset: 0; opacity: 0; pointer-events: none;
  transition: opacity 0.5s ease, transform 0.5s ease; transform: translateX(12px);
}
.situations.is-enhanced .situations-slide.is-active { position: relative; opacity: 1; pointer-events: auto; transform: none; }
.situations:not(.is-enhanced) .situations-controls { display: none; }

/* === Karty (język `wash`) === */
.card { position: relative; overflow: hidden; display: flex; flex-direction: column; gap: 14px; padding: 26px 26px 28px; border: 1px solid var(--card-edge); border-radius: var(--radius-card); background: var(--ground-warm); box-shadow: var(--shadow-rest); color: inherit; transition: transform var(--dur-card) ease, box-shadow var(--dur-card) ease, background var(--dur-card) ease; transform-style: preserve-3d; will-change: transform; }
.card:hover { transform: translateY(-3px); background: var(--ground-warm-hover); box-shadow: var(--shadow-lift); }
.card:hover .ring { border-color: var(--accent-a35); background: var(--ring-bg-hover); transform: scale(1.04); }
.card--sm { padding: 22px 22px 24px; border-radius: var(--radius); gap: 12px; }
.card--sm:hover { box-shadow: var(--shadow-lift-sm); }
.card h3 { font-size: 1.46rem; letter-spacing: -0.5px; line-height: 1.14; }
.card--sm h3 { font-size: 1.24rem; letter-spacing: -0.3px; }
.card p { font-size: 0.91rem; font-weight: 500; color: var(--text-muted); line-height: 1.62; text-wrap: pretty; }
.card--sm p { font-size: 0.87rem; line-height: 1.6; }
/* Wielka serifowa numeracja — kotwica kompozycji, nie ozdoba */
.card-index {
  position: absolute; top: -6px; right: 18px; pointer-events: none;
  font-family: var(--font-display); font-weight: var(--display-weight);
  font-size: 3.9rem; line-height: 1;
  color: var(--accent); opacity: 0.1;
  transition: opacity var(--dur-card) ease, transform var(--dur-card) ease;
}
.card:hover .card-index { opacity: 0.17; transform: translateY(-3px); }
.card-more {
  margin-top: auto; padding-top: 12px;
  display: inline-flex; align-items: center; gap: 7px;
  font-size: 0.76rem; font-weight: 700; letter-spacing: 0.07em; text-transform: uppercase;
  color: var(--accent-dark);
}
.card-more span { transition: transform var(--dur) ease; }
.card:hover .card-more span { transform: translateX(4px); }

.cards-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; }
.cards-grid--4 { grid-template-columns: repeat(4, 1fr); gap: 16px; }

/* === Cytat — serce sekcji === */
.pullquote { max-width: 820px; margin: 0 auto; padding: 60px 40px 66px; text-align: center; }
.pullquote-avatar { width: 52px; height: 52px; margin: 0 auto 18px; border-radius: 50%; overflow: hidden; box-shadow: var(--shadow-lift-sm); }
.pullquote-avatar img { width: 100%; height: 100%; object-fit: cover; }
.pullquote blockquote { font-family: var(--font-display); font-weight: var(--display-weight); font-size: 2.05rem; line-height: 1.32; letter-spacing: -0.6px; }
/* Kursywa kroju nagłówkowego jest wczytana tylko w wadze 400 (jedyne jej
   użycia to podpisy). Cytat idzie w 500, więc wyróżnienie dostaje wagę
   wprost — inaczej dziedziczy 500 i przeglądarka i tak sięga po jedyny
   dostępny rysunek 400, tworząc niezamierzony uskok wagi w jednym zdaniu. */
.pullquote blockquote span { color: var(--accent-dark); font-style: italic; font-weight: 400; }
.pullquote figcaption { margin-top: 22px; font-size: 0.88rem; font-weight: 600; color: var(--text-dim); }

/* === Szablony dziennika === */
.journal-templates { display: flex; gap: 14px; flex-wrap: wrap; justify-content: center; }
.journal-template {
  position: relative; overflow: hidden; width: 152px;
  display: flex; flex-direction: column; align-items: flex-start; gap: 12px;
  padding: 18px 16px 20px; border: 1px solid transparent;
  border-radius: var(--radius); background: var(--ground-warm);
  box-shadow: var(--shadow-rest); font: inherit; text-align: left; cursor: pointer;
  transition: transform var(--dur-card) ease, box-shadow var(--dur-card) ease, background var(--dur-card) ease;
}
.journal-template:hover { transform: translateY(-3px); background: var(--ground-warm-hover); box-shadow: var(--shadow-lift-sm); }
.journal-template:hover .ring { border-color: currentColor; background: var(--ring-bg-hover); transform: scale(1.04); }
/* Barwa szablonu żyje w obrysie ringu i pasku u stopy — nie w wypełnieniu */
.journal-template::after { content: ""; position: absolute; left: 0; right: 0; bottom: 0; height: 3px; background: currentColor; }
.journal-template--add { border-style: dashed; border-color: var(--accent-a55); color: var(--accent-dark); }
.journal-template--add::after { display: none; }
.journal-template .ring { border-color: currentColor; color: inherit; }
.journal-template-name { font-family: var(--font-display); font-weight: var(--display-weight); font-size: 1.14rem; line-height: 1.14; letter-spacing: -0.2px; color: var(--text); }
.journal-template-meta { font-size: 0.74rem; font-weight: 600; color: var(--text-muted); }
/* Tint, krawędź i wypełniony ring w barwie szablonu (tylko jasny — tokeny
   w :root, w ciemnym initial, więc var() spada na dotychczasowy wygląd).
   Klikalność: hover/focus = uniesienie, mocniejszy tint i strzałka „→”. */
.jt-epilepsy { --jt-bg: var(--jt-epilepsy-bg); --jt-bg-hover: var(--jt-epilepsy-bg-hover); --jt-ring: var(--jt-epilepsy-ring); }
.jt-digestion { --jt-bg: var(--jt-digestion-bg); --jt-bg-hover: var(--jt-digestion-bg-hover); --jt-ring: var(--jt-digestion-ring); }
.jt-diabetes { --jt-bg: var(--jt-diabetes-bg); --jt-bg-hover: var(--jt-diabetes-bg-hover); --jt-ring: var(--jt-diabetes-ring); }
.jt-glucose { --jt-bg: var(--jt-glucose-bg); --jt-bg-hover: var(--jt-glucose-bg-hover); --jt-ring: var(--jt-glucose-ring); }
.journal-template--add { --jt-bg: var(--jt-add-bg); --jt-bg-hover: var(--jt-add-bg-hover); }
.journal-template { background: var(--jt-bg, var(--ground-warm)); }
.journal-template:not(.journal-template--add) { border-color: var(--jt-edge, transparent); }
.journal-template--add { border-color: var(--jt-add-edge, var(--accent-a55)); }
.journal-template:hover,
.journal-template:focus-visible { transform: translateY(-3px); background: var(--jt-bg-hover, var(--ground-warm-hover)); box-shadow: var(--shadow-lift-sm); }
.journal-template:not(.journal-template--add) .ring,
.journal-template:not(.journal-template--add):hover .ring { border-color: var(--jt-ring, currentColor); background: var(--jt-ring, var(--ring-bg)); color: var(--jt-icon, inherit); }
.journal-template:not(.journal-template--add):hover .ring { background: var(--jt-ring, var(--ring-bg-hover)); }
.journal-template-meta { color: var(--jt-meta, var(--text-muted)); }
.journal-template::after { height: var(--jt-bar, 3px); }
.journal-template::before {
  content: var(--jt-arrow, none);
  position: absolute; right: 14px; bottom: 12px;
  font-weight: 700; font-size: 1.05rem; line-height: 1; color: var(--text);
  opacity: 0; transform: translateX(-4px);
  transition: opacity var(--dur) ease, transform var(--dur) ease;
}
.journal-template:hover::before,
.journal-template:focus-visible::before { opacity: 1; transform: none; }
@media (hover: none) { .journal-template::before { opacity: 0.7; transform: none; } }
.jt-epilepsy { color: var(--journal-epilepsy); }
.jt-digestion { color: var(--journal-digestion); }
.jt-diabetes { color: var(--journal-diabetes); }
.jt-glucose { color: var(--journal-glucose); }

.tap-hint { text-align: center; font-size: 0.95rem; margin: 0 auto 22px; }

/* === Notki i bramki === */
.note { max-width: 720px; margin: 0 auto 28px; font-size: 0.88rem; line-height: 1.6; color: var(--text-muted); text-align: center; }
.note--rules { padding: 22px 0; border-top: 1px solid var(--border); border-bottom: 1px solid var(--border); font-size: 0.98rem; color: var(--text); }
.note-sub { display: block; margin-top: 8px; font-size: 0.82rem; color: var(--text-dim); }

/* === Pasek eksportu === */
.export-strip {
  max-width: 720px; margin: 0 auto 28px; padding: 15px 24px;
  border: 1px solid var(--border); border-radius: var(--radius-pill);
  display: flex; align-items: center; justify-content: center; gap: 16px; flex-wrap: wrap;
  font-size: 0.9rem; font-weight: 600; color: var(--text-muted);
}
.export-strip b { color: var(--text); font-size: 0.74rem; font-weight: 700; letter-spacing: 0.07em; text-transform: uppercase; }
.export-badge { display: inline-flex; align-items: center; gap: 7px; padding: 5px 13px; border-radius: var(--radius-pill); background: var(--accent-a08); color: var(--accent-dark); font-weight: 700; }
.export-badge svg { width: 14px; height: 14px; }

/* === Gatunki === */
.pets-row { display: flex; justify-content: center; gap: 22px; flex-wrap: wrap; margin-top: 26px; }
.pet-badge { display: flex; flex-direction: column; align-items: center; gap: 8px; font-size: 0.85rem; font-weight: 600; color: var(--text-muted); }
.pet-badge .ring { width: 58px; height: 58px; }
.pet-badge:hover .ring { transform: scale(1.08); border-color: var(--accent-a35); }

/* === Języki === */
.lang-row { display: flex; flex-wrap: wrap; justify-content: center; gap: 12px; }
.lang-pill {
  display: inline-flex; align-items: center; gap: 9px; padding: 10px 20px;
  border: 1px solid var(--border); border-radius: var(--radius-pill);
  background: var(--white); font-family: inherit; font-size: 0.95rem; font-weight: 600;
  color: var(--text); cursor: pointer;
  transition: transform var(--dur) ease, box-shadow var(--dur) ease, border-color var(--dur) ease;
}
.lang-pill:hover { transform: translateY(-2px); box-shadow: var(--shadow-lift-sm); }
.lang-pill.active { border-color: var(--accent-a35); background: var(--ground-warm); }

/* === Stopka === */
.site-footer { padding: 56px 0 32px; background: var(--footer-bg); color: rgba(255, 255, 255, 0.7); }
.footer-inner { display: flex; justify-content: space-between; align-items: flex-start; flex-wrap: wrap; gap: 32px; }
.footer-brand { max-width: 300px; }
.footer-brand .nav-logo { color: var(--footer-ink); margin-bottom: 12px; }
/* Stopka jest ciemna w OBU motywach, wiec ma wlasny, staly wariant logotypu
   (mono-white) i nie uczestniczy w przelaczaniu. Wczesniej znak byl wybielany
   filtrem — teraz bierzemy gotowy plik z kitu, bez filtra. */
.footer-brand .nav-logo img { display: block; opacity: 0.9; }
.footer-brand p { font-size: 0.88rem; line-height: 1.6; }
.footer-col h4 { font-family: var(--font-sans); font-size: 0.95rem; font-weight: 700; color: var(--footer-ink); margin-bottom: 12px; letter-spacing: 0; }
.footer-col a { display: block; padding: 4px 0; font-size: 0.88rem; color: rgba(255, 255, 255, 0.6); transition: color var(--dur) ease; }
.footer-col a:hover { color: var(--footer-ink); }
.footer-bottom { margin-top: 36px; padding-top: 24px; border-top: 1px solid rgba(255, 255, 255, 0.1); text-align: center; font-size: 0.85rem; }
.footer-bottom a { color: rgba(255, 255, 255, 0.8); }
.ai-disclosure { font-size: 0.75rem; opacity: 0.5; margin-bottom: 8px; }

/* === Modal === */
.modal { position: fixed; inset: 0; z-index: var(--z-modal); display: none; align-items: center; justify-content: center; padding: 20px; background: rgba(58, 47, 51, 0.55); backdrop-filter: blur(4px); }
.modal.is-open { display: flex; }
.modal-box { position: relative; width: 100%; max-width: 460px; max-height: 90vh; overflow-y: auto; padding: 28px 28px 24px; background: var(--white); border-radius: var(--radius-card); box-shadow: 0 30px 70px -20px rgba(58, 47, 51, 0.5); }
.modal-close { position: absolute; top: 14px; right: 14px; width: 34px; height: 34px; border: 0; border-radius: 50%; background: var(--subtle-fill); font-size: 1.2rem; line-height: 1; color: var(--text); cursor: pointer; transition: background var(--dur) ease; }
.modal-close:hover { background: var(--subtle-fill-hover); }
.modal-title { font-size: 1.7rem; letter-spacing: -0.5px; margin: 14px 0 4px; }
.modal-subtitle { font-size: 0.92rem; color: var(--text-muted); margin-bottom: 18px; }
.modal-fields { list-style: none; margin: 0 0 18px; border-top: 1px solid var(--border); }
.modal-fields li { display: flex; align-items: center; gap: 10px; padding: 9px 0; border-bottom: 1px solid var(--border); font-size: 0.94rem; }
.modal-fields li::before { content: ""; flex: 0 0 6px; height: 6px; border-radius: 50%; background: var(--accent); opacity: 0.6; }
.modal-footer { padding: 14px 16px; background: var(--ground-warm); border: 1px solid var(--border); border-radius: var(--radius-sm); font-size: 0.88rem; line-height: 1.5; }

/* === Motyw: zasoby, których nie da się przemalować zmienną === */

/* Zdjęcia treściowe są jasne i ciepłe — na kremowym tle to atut, na grafitowym
   świecą jak okno w nocy. Token przygasza je w ciemnym motywie o 8 % jasności
   i 4 % nasycenia: tyle wystarcza, żeby przestały odrywać się od strony, a za
   mało, żeby zwierzę zrobiło się szare. W jasnym motywie token to "none",
   więc filtr nie tworzy nawet kontekstu stackingu. */
.portrait img,
.beat-photo img,
.pullquote-avatar img,
.jg-shot img { filter: var(--photo-filter); }

/* Logotyp per motyw. W nagłówku leżą DWA <img> z pełnym lockupem z brand kitu
   — mono-black na jasnym, złoty na ciemnym — a arkusz pokazuje dokładnie
   jeden. Dwa <img> przełączane widocznością, a nie `content: url(...)` na
   jednym — powód jest konkretny: `content` na elemencie zastepowanym Firefox obsluguje
   dopiero od 119, a przy pelnym logotypie awaria nie jest kosmetyczna — na
   grafitowym tle wyszedlby czarny lockup, praktycznie niewidoczny (1,2:1).
   `display` dziala wszedzie. Element ukryty przez display:none wypada tez
   z drzewa dostepnosci, wiec czytnik oglasza nazwe "Whispet" raz, nie dwa. */
.nav-logo .logo-light { display: var(--logo-light-display); }
.nav-logo .logo-dark { display: var(--logo-dark-display); }

/* Wykres w przewodniku ma barwy wpisane w atrybuty inline SVG — w szesciu
   kopiach journal-guide.html. CSS nadpisuje atrybut prezentacyjny, wiec
   ciemny motyw obchodzi sie bez edycji markupu. Wartosci jasne sa dokladnie
   te, ktore stoja w atrybutach, wiec jasny motyw nic nie zauwaza. */
.jg-chart .jg-line { stroke: var(--chart-line); }
.jg-chart .jg-dots { stroke: var(--chart-dot-halo); }
.jg-chart .jg-dots [fill="#d97757"] { fill: var(--chart-warm); }
.jg-chart .jg-dots [fill="#4a8e4a"] { fill: var(--chart-green); }
.jg-chart [stroke="#e6ded6"] { stroke: var(--chart-axis); }
/* Selektor atrybutu porównuje ŁAŃCUCH ZNAK PO ZNAKU, nie kolor. W markupie
   stoi `rgba(74,142,74,.13)` — bez spacji i bez zera wiodącego — więc zapis
   `rgba(74, 142, 74, 0.13)` nie trafiał w nic i oba tokeny były martwe.
   Wartości jasnego motywu są identyczne z literałami w atrybutach, więc jasny
   motyw nadal nic nie zauważa; naprawa działa wyłącznie w ciemnym. */
.jg-chart [fill="rgba(74,142,74,.13)"] { fill: var(--chart-zone-fill); }
.jg-chart [stroke="rgba(74,142,74,.5)"] { stroke: var(--chart-zone-line); }

/* === Przełącznik motywu === */
/* Ten sam komponent co pigułka języka obok: obrys włoskowaty, promień pigułki,
   tekst w --text-muted. Trzy stany, nie dwa — patrz theme.js. */
.theme-toggle {
  display: inline-flex; align-items: center; gap: 7px;
  padding: 7px 12px; border: 1px solid var(--border); border-radius: var(--radius-pill);
  background: none; font-family: inherit; font-size: 0.85rem; font-weight: 600;
  color: var(--text-muted); cursor: pointer; white-space: nowrap;
  transition: border-color var(--dur) ease, color var(--dur) ease;
}
.theme-toggle:hover { color: var(--accent-dark); border-color: var(--accent-a35); }
.theme-toggle .znak { width: 18px; height: 18px; flex-shrink: 0; }
.theme-toggle-label { font-size: 0.85rem; }
.nav-theme-item { display: flex; align-items: center; }
@media (max-width: 768px) {
  .nav-theme-item { width: 100%; padding: 6px 16px 4px; }
  .theme-toggle { width: 100%; justify-content: flex-start; gap: 10px; padding: 10px 14px; }
}

/* Tekstowy odpowiednik grafiki: niewidoczny, ale czytany przez VoiceOver */
.visually-hidden {
  position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0;
  overflow: hidden; clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap;
}

/* === Reveal === */
.reveal { opacity: 0; transform: translateY(20px); transition: opacity var(--dur-reveal) ease, transform var(--dur-reveal) ease; }
.reveal.is-visible { opacity: 1; transform: none; }

/* === Responsive === */
@media (max-width: 980px) {
  .hero-grid { grid-template-columns: 1fr; gap: 40px; }
  .portrait { height: 420px; border-radius: 180px 180px 30px 30px; }
  .cards-grid, .cards-grid--4 { grid-template-columns: repeat(2, 1fr); }
  .beat { grid-template-columns: 1fr; gap: 30px; }
  .beat:nth-child(even) .beat-text { order: 0; }
  .beat-photo, .timeline-frame { order: -1; }
}
@media (max-width: 768px) {
  :root { --gutter: 20px; --section-y: 68px; }
  .nav-links {
    display: none; position: fixed; top: calc(var(--nav-h) + 2px); right: 12px; left: 12px;
    flex-direction: column; gap: 2px; padding: 10px; margin: 0;
    background: var(--white); border: 1px solid var(--border); border-radius: var(--radius);
    box-shadow: var(--shadow-lift); z-index: var(--z-menu);
  }
  .nav-links.is-open { display: flex; }
  .nav-links li { width: 100%; }
  .nav-links a { display: block; padding: 11px 16px; border-radius: 10px; font-size: 1rem; }
  .nav-cta { text-align: center; margin-top: 4px; }
  .nav-toggle { display: block; margin-left: auto; }
  /* Jedno menu, nie dwa: na mobile ukrywamy zagnieżdżony dropdown języka i
     pokazujemy płaski rząd pigułek wprost w arkuszu nawigacji. */
  .nav-lang-item { width: 100%; }
  .lang-switcher { display: none; }
  .nav-lang-flat { display: flex; flex-wrap: wrap; gap: 8px; padding: 6px 16px 4px; }
  .nav-lang-flat button {
    padding: 7px 14px; border: 1px solid var(--border); border-radius: var(--radius-pill);
    background: none; font-size: 0.86rem; font-weight: 700; color: var(--text-muted); cursor: pointer;
  }
  .nav-lang-flat button.active { color: var(--accent-dark); border-color: var(--accent-a35); background: var(--ground-warm); }
  .cards-grid, .cards-grid--4 { grid-template-columns: 1fr; }
  .page-hero { border-radius: 0 0 28px 28px; padding: 40px 0 36px; }
  .pullquote { padding: 40px 0 46px; }
  .pullquote blockquote { font-size: 1.6rem; }
  .section--band { border-radius: 28px 28px 0 0; }
  .footer-inner { flex-direction: column; }
  .situations-controls { gap: 12px; }
  .situations-dots { gap: 7px; }
}
@media (max-width: 420px) {
  /* długie złożenia DE („Gesundheitstagebuch”) nie mieszczą się w 375 px */
  .hero h1 { font-size: 2.05rem; letter-spacing: -0.8px; hyphens: auto; -webkit-hyphens: auto; overflow-wrap: break-word; }
  .portrait { height: 320px; border-radius: 150px 150px 26px 26px; }
  .appstore-badge img { height: 46px; }
  .journal-template { width: calc(50% - 7px); }
  .situations-heading h3 { font-size: 1.32rem; }
  .situations-arrow { width: 34px; height: 34px; }
}

/* === Reduced motion === */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
  .reveal { opacity: 1; transform: none; }
  .beat-photo img { animation: none !important; opacity: 0; }
  .beat-photo img:first-of-type { opacity: 1; }
  .timeline-frame img,
  .timeline-frame-cap-slide,
  .timeline-frame-meta-slide { animation: none !important; opacity: 0; }
  .timeline-frame img:first-of-type,
  .timeline-frame-cap-slide:first-of-type,
  .timeline-frame-meta-slide:first-of-type { opacity: 1; }
  .situations.is-enhanced .situations-slide { transition: none; }
}


/* ==========================================================================
   CIEMNY MOTYW
   Cała różnica między motywami to wartości tokenów — poniżej nie ma ani
   jednej reguły, która dotykałaby układu, rozmiaru czy widoczności czegoś.
   Blok jest wpisany dwa razy, bo warunek "systemowy" i warunek "wymuszony
   przyciskiem" nie dają się złączyć w jedną listę selektorów przez @media.

   Paleta pochodzi z brand kitu Whispet (~/Zasoby/logo_Whispet/export,
   README z 2026-09-03): #1E1E22 i #3A3A3E to dwa końce gradientu produkcyjnej
   ikony App Store, #E8CC8A to złoto znaku na ciemnych powierzchniach,
   #E6E6E6 to mono-light logotypu. Jasny motyw zostaje przy mauve.
   ========================================================================== */

/* System mówi "ciemno", a użytkownik nie wymusił jasnego. */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) {
  color-scheme: dark;

  /* --- marka: na ciemnym akcentem jest złoto z brand kitu, nie mauve ---
     #E8CC8A to kolor znaku i wordmarku na ciemnych powierzchniach (kit
     2026-09-03) i najczęstszy piksel produkcyjnej ikony App Store. Mauve
     #886878 na grafitowym tle daje 2,3:1 — nie nadaje się nawet na obrys.
     "accent-dark" znaczy tu "mocniejszy wariant akcentu" (linki, hover),
     więc na ciemnym jest JAŚNIEJSZY od --accent; relacja się odwraca,
     rola nie. */
  --accent: #e8cc8a;
  --accent-dark: #f2dcaa;
  --on-accent: #1e1e22;

  /* --- neutralne: grafit marki, minimalnie ocieplony na powierzchniach ---
     Ziemia strony to dokładnie #1E1E22 (dolny róg gradientu ikony), obrys to
     dokładnie #3A3A3E (górny). Powierzchnie uniesione leżą na tej samej osi,
     przesunięte o 1-2 punkty w stronę czerwieni — bez tego kremowa
     fotografia czyta się jako zafarb, a to ona jest tu głównym atutem. */
  --bg: #1e1e22;
  --paper: #232327;
  --surface: #2a2a2e;
  --white: #26262b;
  /* --- skala tekstu: swiatlo, nie reflektor ---
     #E6E6E6 z kitu to kolor WYPELNIENIA LOGOTYPU — grafiki ogladanej ulamek
     sekundy. Na akapicie czytanym przez minute te same 13,3:1 daja halacje:
     jasne litery rozlewaja sie optycznie na krawedziach i mecza oko. Skala
     schodzi wiec do 10,9 / 7,0 / 6,1 — nadal daleko ponad progiem WCAG, ale w
     pasmie, w ktorym ciemne motywy realnie sie czyta. Logotyp i zloto zostaja
     bez zmian; to jest doprecyzowanie roli, nie zmiana palety marki.
     Wszystkie trzy stopnie sa minimalnie cieple (R > G > B o 3-4 punkty) —
     slad ciepla w JASNYM kolorze, ktory dobrze gra ze zlotem. To nie ma nic
     wspolnego z pigmentem jako TLEM, ktory w tej palecie zawsze brudzi. */
  --text: #d4d1cd;       /* 10,9:1 na --bg, 6,1:1 na najjasniejszej makiecie #45454b */
  --text-muted: #aba8a4; /* 7,0:1 na --bg, 4,8:1 na torze segmentu #3a3a3f — najciezsze tlo tego stopnia */
  --text-dim: #9f9c98;   /* 6,1:1 na --bg, 5,5:1 na karcie --white, 5,3:1 na pasmie pod .support-meta */
  --border: #3a3a3e;
  /* Naglowek sekcji w tresci swiecil: --text (10,9:1) na plaskim --bg, w
     Literacie 500 przy 1,6-1,7rem, obok akapitu na --text-muted (7,0:1) —
     ta sama etykieta co reszta motywu, ale wyraznie jasniejsza. Przygaszone
     tu do 8,5:1: nadal jasniejsze od akapitu (hierarchia), ale nie "swieci". */
  --heading-ink: #bab7b2;

  /* --- semantyczne: te same barwy, podniesione nad grafit --- */
  --green: #86cc86;
  --warm: #e59070;
  --amber-ink: #e8b86a;
  /* Zloto jest tu tuszem, nie gruntem. #3a3324 to zolty pigment o jasnosci
     0,03 — na graficie oko czyta go jako brud, nie jako cieplo (ta sama
     mechanika, ktora wyrzucila zloto z --ground-warm). Metka Premium i ramka
     ostrzezenia dostaja wiec neutralna plyte z osi marki #1E1E22 -> #3A3A3E,
     dokladnie ta sama, na ktorej stoi jasny koniec gruntu kart. Cieplo niesie
     --gold-ink, --amber-ink i lewa krawedz. */
  --gold-tint: #34343a;
  --gold-ink: #eed9a6;

  /* --- alfy akcentu liczone od złota, nie od mauve --- */
  /* a08 jest w calym serwisie wylacznie TLEM (wyroznienia w dokumentach
     prawnych i w pomocy, naglowki tabel, .export-badge) — pozostale alfy sa
     obrysami. Zloto przy 9 % na #1E1E22 dawalo #302d2b, czyli ten sam
     oliwkowy zafarb co --gold-tint. Plyta jest wiec neutralna: rozjasnia
     podklad, nie barwi go. Obrysy (a20/a35/a55) zostaja zlote. */
  --accent-a08: rgba(255, 255, 255, 0.055);
  --accent-a20: rgba(232, 204, 138, 0.22);
  --accent-a35: rgba(232, 204, 138, 0.4);
  --accent-a55: rgba(232, 204, 138, 0.6);

  /* --- gradienty: pasmo to gradient marki z ikony, wprost --- */
  --gradient-band: linear-gradient(158deg, #3a3a3e 0%, #2c2c30 52%, #1e1e22 100%);
  /* Grunt kart NIE jest barwiony, tylko rozjasniany. Zloto przy 10 % na
     graficie dawalo #322f2c (hover #403c34) — oliwkowo-brazowy zafarb, ktory
     oko czyta jako brud, nie jako cieplo: pigment o niskiej jasnosci na
     neutralnej szarosci nie ociepla, tylko brudzi. Na jasnym motywie ta sama
     mechanika dziala, bo tam oba kolory sa jasne.
     Karty ida wiec ta sama osia co gradient marki (#1E1E22 -> #3A3A3E), a
     hover laduje dokladnie na jej jasnym koncu. Cieplo strony niesie
     fotografia i zloty akcent, nie plaszczyzna pod tekstem. */
  --ground-warm: linear-gradient(158deg, #34343a 0%, #2c2c30 46%, var(--white) 80%);
  --ground-warm-hover: linear-gradient(158deg, #3a3a3e 0%, #313136 42%, var(--white) 78%);

  /* --- cienie: na ciemnym cień nie rzeźbi, więc unosi go poświata ---
     krawędź "rest" to nie cień pod spodem, tylko włoskowate światło u góry;
     duże cienie zostają, ale czarne i głębsze, bo mauve na graficie znika. */
  --shadow-rest: inset 0 1px 0 rgba(255, 255, 255, 0.045);
  --shadow-lift: 0 22px 44px -18px rgba(0, 0, 0, 0.72), 0 0 0 1px rgba(232, 204, 138, 0.07);
  --shadow-lift-sm: 0 14px 30px -14px rgba(0, 0, 0, 0.66), 0 0 0 1px rgba(232, 204, 138, 0.06);
  --shadow-photo: 0 28px 56px -26px rgba(0, 0, 0, 0.78);
  --shadow-portrait: 0 34px 70px -26px rgba(0, 0, 0, 0.82);

  /* --- tokeny motywu --- */
  --footer-bg: #17171a;   /* stopka nadal ciemniejsza od strony */
  --nav-bg: rgba(30, 30, 34, 0.86);
  --border-hair: rgba(230, 230, 230, 0.1);
  --border-soft: rgba(230, 230, 230, 0.13);
  --border-soft-2: rgba(230, 230, 230, 0.15);
  --ring-bg: rgba(255, 255, 255, 0.04);
  --ring-bg-hover: rgba(255, 255, 255, 0.1);   /* stan spoczynku jest bialy przy 4 % — hover nie ma powodu zmieniac pigmentu na zloty */
  --subtle-fill: rgba(255, 255, 255, 0.08);
  --subtle-fill-hover: rgba(255, 255, 255, 0.15);
  --subtle-fill-2: rgba(255, 255, 255, 0.09);
  --subtle-fill-2-hover: rgba(255, 255, 255, 0.16);

  --band-ink: #d4d1cd;
  --band-ink-soft: #aba8a4;
  --band-ink-mid: #e8cc8a;
  --band-ink-dim: #9f9c98;
  --band-ring: rgba(255, 255, 255, 0.06);
  --band-chip-bg: rgba(255, 255, 255, 0.06);
  --band-chip-border: rgba(232, 204, 138, 0.28);
  --caution-ring-bg: rgba(232, 184, 106, 0.12);   /* 34 px tarcza pod zlota ikona — welon, nie grunt pod tekstem */
  --search-bg: rgba(20, 20, 23, 0.66);
  --search-border: rgba(232, 204, 138, 0.28);
  --search-placeholder: #8d8a89;

  --mock-field: #2e2e33;
  --mock-track: #3a3a3f;
  --mock-track-2: #3a3a3f;
  --mock-on: #45454b;
  --zone-ink: #86cc86;
  --caution-ring: rgba(232, 184, 106, 0.38);
  --chart-line: #e8cc8a;
  --chart-dot-halo: #26262b;   /* halo punktu = kolor panelu, nie biel */
  --chart-warm: #e59070;
  --chart-green: #86cc86;
  --chart-axis: #4a4a4f;
  --chart-zone-fill: rgba(134, 204, 134, 0.14);
  --chart-zone-line: rgba(134, 204, 134, 0.55);

  --photo-chip-ink: #7a5a6c;   /* plakietka leży na zdjęciu — ink zostaje ciemny */
  --photo-chip-icon: #886878;
  --photo-filter: brightness(0.92) saturate(0.96);
  --logo-light-display: none;
  --logo-dark-display: block;
  --badge-ring: 0 0 0 1px rgba(230, 230, 230, 0.45);  /* 3,8:1 wobec tla — czarna plyta odznaki inaczej znika */
  --qr-plate: #ece7de;
  /* kafelki szablonów i krawędź kart: w ciemnym jak dotąd */
  --jt-epilepsy-bg: initial; --jt-epilepsy-bg-hover: initial; --jt-epilepsy-ring: initial;
  --jt-digestion-bg: initial; --jt-digestion-bg-hover: initial; --jt-digestion-ring: initial;
  --jt-diabetes-bg: initial; --jt-diabetes-bg-hover: initial; --jt-diabetes-ring: initial;
  --jt-glucose-bg: initial; --jt-glucose-bg-hover: initial; --jt-glucose-ring: initial;
  --jt-add-bg: initial; --jt-add-bg-hover: initial; --jt-add-edge: initial;
  --jt-edge: initial; --jt-meta: initial; --jt-icon: initial; --jt-bar: initial; --jt-arrow: initial;
  --card-edge: transparent;
  }
  .vet-box-body .vet-box-recommend { color: var(--accent); }
}

/* Użytkownik wymusił ciemny — niezależnie od ustawienia systemu. */
:root[data-theme="dark"] {
  color-scheme: dark;

  /* --- marka: na ciemnym akcentem jest złoto z brand kitu, nie mauve ---
     #E8CC8A to kolor znaku i wordmarku na ciemnych powierzchniach (kit
     2026-09-03) i najczęstszy piksel produkcyjnej ikony App Store. Mauve
     #886878 na grafitowym tle daje 2,3:1 — nie nadaje się nawet na obrys.
     "accent-dark" znaczy tu "mocniejszy wariant akcentu" (linki, hover),
     więc na ciemnym jest JAŚNIEJSZY od --accent; relacja się odwraca,
     rola nie. */
  --accent: #e8cc8a;
  --accent-dark: #f2dcaa;
  --on-accent: #1e1e22;

  /* --- neutralne: grafit marki, minimalnie ocieplony na powierzchniach ---
     Ziemia strony to dokładnie #1E1E22 (dolny róg gradientu ikony), obrys to
     dokładnie #3A3A3E (górny). Powierzchnie uniesione leżą na tej samej osi,
     przesunięte o 1-2 punkty w stronę czerwieni — bez tego kremowa
     fotografia czyta się jako zafarb, a to ona jest tu głównym atutem. */
  --bg: #1e1e22;
  --paper: #232327;
  --surface: #2a2a2e;
  --white: #26262b;
  /* --- skala tekstu: swiatlo, nie reflektor ---
     #E6E6E6 z kitu to kolor WYPELNIENIA LOGOTYPU — grafiki ogladanej ulamek
     sekundy. Na akapicie czytanym przez minute te same 13,3:1 daja halacje:
     jasne litery rozlewaja sie optycznie na krawedziach i mecza oko. Skala
     schodzi wiec do 10,9 / 7,0 / 6,1 — nadal daleko ponad progiem WCAG, ale w
     pasmie, w ktorym ciemne motywy realnie sie czyta. Logotyp i zloto zostaja
     bez zmian; to jest doprecyzowanie roli, nie zmiana palety marki.
     Wszystkie trzy stopnie sa minimalnie cieple (R > G > B o 3-4 punkty) —
     slad ciepla w JASNYM kolorze, ktory dobrze gra ze zlotem. To nie ma nic
     wspolnego z pigmentem jako TLEM, ktory w tej palecie zawsze brudzi. */
  --text: #d4d1cd;       /* 10,9:1 na --bg, 6,1:1 na najjasniejszej makiecie #45454b */
  --text-muted: #aba8a4; /* 7,0:1 na --bg, 4,8:1 na torze segmentu #3a3a3f — najciezsze tlo tego stopnia */
  --text-dim: #9f9c98;   /* 6,1:1 na --bg, 5,5:1 na karcie --white, 5,3:1 na pasmie pod .support-meta */
  --border: #3a3a3e;
  /* Naglowek sekcji w tresci swiecil: --text (10,9:1) na plaskim --bg, w
     Literacie 500 przy 1,6-1,7rem, obok akapitu na --text-muted (7,0:1) —
     ta sama etykieta co reszta motywu, ale wyraznie jasniejsza. Przygaszone
     tu do 8,5:1: nadal jasniejsze od akapitu (hierarchia), ale nie "swieci". */
  --heading-ink: #bab7b2;

  /* --- semantyczne: te same barwy, podniesione nad grafit --- */
  --green: #86cc86;
  --warm: #e59070;
  --amber-ink: #e8b86a;
  /* Zloto jest tu tuszem, nie gruntem. #3a3324 to zolty pigment o jasnosci
     0,03 — na graficie oko czyta go jako brud, nie jako cieplo (ta sama
     mechanika, ktora wyrzucila zloto z --ground-warm). Metka Premium i ramka
     ostrzezenia dostaja wiec neutralna plyte z osi marki #1E1E22 -> #3A3A3E,
     dokladnie ta sama, na ktorej stoi jasny koniec gruntu kart. Cieplo niesie
     --gold-ink, --amber-ink i lewa krawedz. */
  --gold-tint: #34343a;
  --gold-ink: #eed9a6;

  /* --- alfy akcentu liczone od złota, nie od mauve --- */
  /* a08 jest w calym serwisie wylacznie TLEM (wyroznienia w dokumentach
     prawnych i w pomocy, naglowki tabel, .export-badge) — pozostale alfy sa
     obrysami. Zloto przy 9 % na #1E1E22 dawalo #302d2b, czyli ten sam
     oliwkowy zafarb co --gold-tint. Plyta jest wiec neutralna: rozjasnia
     podklad, nie barwi go. Obrysy (a20/a35/a55) zostaja zlote. */
  --accent-a08: rgba(255, 255, 255, 0.055);
  --accent-a20: rgba(232, 204, 138, 0.22);
  --accent-a35: rgba(232, 204, 138, 0.4);
  --accent-a55: rgba(232, 204, 138, 0.6);

  /* --- gradienty: pasmo to gradient marki z ikony, wprost --- */
  --gradient-band: linear-gradient(158deg, #3a3a3e 0%, #2c2c30 52%, #1e1e22 100%);
  /* Grunt kart NIE jest barwiony, tylko rozjasniany. Zloto przy 10 % na
     graficie dawalo #322f2c (hover #403c34) — oliwkowo-brazowy zafarb, ktory
     oko czyta jako brud, nie jako cieplo: pigment o niskiej jasnosci na
     neutralnej szarosci nie ociepla, tylko brudzi. Na jasnym motywie ta sama
     mechanika dziala, bo tam oba kolory sa jasne.
     Karty ida wiec ta sama osia co gradient marki (#1E1E22 -> #3A3A3E), a
     hover laduje dokladnie na jej jasnym koncu. Cieplo strony niesie
     fotografia i zloty akcent, nie plaszczyzna pod tekstem. */
  --ground-warm: linear-gradient(158deg, #34343a 0%, #2c2c30 46%, var(--white) 80%);
  --ground-warm-hover: linear-gradient(158deg, #3a3a3e 0%, #313136 42%, var(--white) 78%);

  /* --- cienie: na ciemnym cień nie rzeźbi, więc unosi go poświata ---
     krawędź "rest" to nie cień pod spodem, tylko włoskowate światło u góry;
     duże cienie zostają, ale czarne i głębsze, bo mauve na graficie znika. */
  --shadow-rest: inset 0 1px 0 rgba(255, 255, 255, 0.045);
  --shadow-lift: 0 22px 44px -18px rgba(0, 0, 0, 0.72), 0 0 0 1px rgba(232, 204, 138, 0.07);
  --shadow-lift-sm: 0 14px 30px -14px rgba(0, 0, 0, 0.66), 0 0 0 1px rgba(232, 204, 138, 0.06);
  --shadow-photo: 0 28px 56px -26px rgba(0, 0, 0, 0.78);
  --shadow-portrait: 0 34px 70px -26px rgba(0, 0, 0, 0.82);

  /* --- tokeny motywu --- */
  --footer-bg: #17171a;   /* stopka nadal ciemniejsza od strony */
  --nav-bg: rgba(30, 30, 34, 0.86);
  --border-hair: rgba(230, 230, 230, 0.1);
  --border-soft: rgba(230, 230, 230, 0.13);
  --border-soft-2: rgba(230, 230, 230, 0.15);
  --ring-bg: rgba(255, 255, 255, 0.04);
  --ring-bg-hover: rgba(255, 255, 255, 0.1);   /* stan spoczynku jest bialy przy 4 % — hover nie ma powodu zmieniac pigmentu na zloty */
  --subtle-fill: rgba(255, 255, 255, 0.08);
  --subtle-fill-hover: rgba(255, 255, 255, 0.15);
  --subtle-fill-2: rgba(255, 255, 255, 0.09);
  --subtle-fill-2-hover: rgba(255, 255, 255, 0.16);

  --band-ink: #d4d1cd;
  --band-ink-soft: #aba8a4;
  --band-ink-mid: #e8cc8a;
  --band-ink-dim: #9f9c98;
  --band-ring: rgba(255, 255, 255, 0.06);
  --band-chip-bg: rgba(255, 255, 255, 0.06);
  --band-chip-border: rgba(232, 204, 138, 0.28);
  --caution-ring-bg: rgba(232, 184, 106, 0.12);   /* 34 px tarcza pod zlota ikona — welon, nie grunt pod tekstem */
  --search-bg: rgba(20, 20, 23, 0.66);
  --search-border: rgba(232, 204, 138, 0.28);
  --search-placeholder: #8d8a89;

  --mock-field: #2e2e33;
  --mock-track: #3a3a3f;
  --mock-track-2: #3a3a3f;
  --mock-on: #45454b;
  --zone-ink: #86cc86;
  --caution-ring: rgba(232, 184, 106, 0.38);
  --chart-line: #e8cc8a;
  --chart-dot-halo: #26262b;   /* halo punktu = kolor panelu, nie biel */
  --chart-warm: #e59070;
  --chart-green: #86cc86;
  --chart-axis: #4a4a4f;
  --chart-zone-fill: rgba(134, 204, 134, 0.14);
  --chart-zone-line: rgba(134, 204, 134, 0.55);

  --photo-chip-ink: #7a5a6c;   /* plakietka leży na zdjęciu — ink zostaje ciemny */
  --photo-chip-icon: #886878;
  --photo-filter: brightness(0.92) saturate(0.96);
  --logo-light-display: none;
  --logo-dark-display: block;
  --badge-ring: 0 0 0 1px rgba(230, 230, 230, 0.45);  /* 3,8:1 wobec tla — czarna plyta odznaki inaczej znika */
  --qr-plate: #ece7de;
  /* kafelki szablonów i krawędź kart: w ciemnym jak dotąd */
  --jt-epilepsy-bg: initial; --jt-epilepsy-bg-hover: initial; --jt-epilepsy-ring: initial;
  --jt-digestion-bg: initial; --jt-digestion-bg-hover: initial; --jt-digestion-ring: initial;
  --jt-diabetes-bg: initial; --jt-diabetes-bg-hover: initial; --jt-diabetes-ring: initial;
  --jt-glucose-bg: initial; --jt-glucose-bg-hover: initial; --jt-glucose-ring: initial;
  --jt-add-bg: initial; --jt-add-bg-hover: initial; --jt-add-edge: initial;
  --jt-edge: initial; --jt-meta: initial; --jt-icon: initial; --jt-bar: initial; --jt-arrow: initial;
  --card-edge: transparent;
}

:root[data-theme="dark"] .vet-box-body .vet-box-recommend {
  color: var(--accent);
}

/* ==========================================================================
   DRUK — papier jest bialy w obu motywach
   Bez tego wydruk zrobiony przy wlaczonym ciemnym motywie wychodzi bialym
   tekstem na bialej kartce (drukarki nie malują teł, ale kolor tekstu biorą
   z arkusza). Wracamy tylko tymi tokenami, które druk realnie maluje.
   Lista selektorów musi obejmować oba warianty ciemnego, bo mają wyższą
   specyficzność niż samo :root — remis rozstrzyga kolejność, a ten blok
   jest ostatni w pliku.
   ========================================================================== */
@media print {
  :root,
  :root[data-theme="dark"],
  :root:not([data-theme="light"]) {
    color-scheme: light;
    --bg: #fdf8f2;
    --paper: #fcfbf8;
    --surface: #f5f3f0;
    --white: #fff;
    --text: #3a2f33;
    --text-muted: #7d6f6a;
    --text-dim: #6f625d;
    --border: #e6ded6;
    --accent: #886878;
    --accent-dark: #7a5a6c;
    --on-accent: #fff;
    --green: #4a8e4a;
    --warm: #d97757;
    --amber-ink: #c2680a;
    --gold-tint: #fbf0d9;
    --gold-ink: #7a5410;
    --accent-a08: rgba(136, 104, 120, 0.08);
    --accent-a20: rgba(136, 104, 120, 0.2);
    --accent-a35: rgba(136, 104, 120, 0.35);
    --accent-a55: rgba(136, 104, 120, 0.55);
    --band-ink: #4a3a3f;
    --band-ink-soft: #7a655f;
    --band-ink-mid: #7a5a6c;
    --band-ink-dim: #8a736c;
    --zone-ink: #3d7340;
    --chart-line: #886878;
    --chart-dot-halo: #fff;
    --chart-warm: #d97757;
    --chart-green: #4a8e4a;
    --chart-axis: #e6ded6;
    --gradient-band: linear-gradient(158deg, #fbdecb 0%, #f1d8df 52%, #fbf0dc 100%);
    --ground-warm: linear-gradient(158deg, rgba(251, 240, 220, 0.62) 0%, rgba(251, 240, 220, 0.14) 46%, var(--white) 80%);
    --ground-warm-hover: linear-gradient(158deg, rgba(251, 222, 203, 0.5) 0%, rgba(241, 216, 223, 0.26) 42%, var(--white) 78%);
    --footer-bg: #3a2f33;
    --photo-filter: none;
    --logo-light-display: block;
    --logo-dark-display: none;
    --badge-ring: none;
    --qr-plate: transparent;
  }
}

/* === Boks dla lekarzy weterynarii (#vets) + podgląd przykładowego eksportu === */
.vet-box { flex-direction: row; align-items: flex-start; gap: 20px; margin-top: 56px; padding: 28px 30px; scroll-margin-top: calc(var(--nav-h) + 24px); }
.vet-box--jg { margin-top: 0; }
.vet-box--search { margin-bottom: 28px; }
.vet-box-label { font-size: 0.78rem !important; font-weight: 700; letter-spacing: 0.12em; text-transform: uppercase; color: var(--text-muted); }
.vet-box .ring { margin-top: 2px; }
.vet-box-body { display: flex; flex-direction: column; gap: 10px; min-width: 0; }
.vet-box-body h3 { font-size: 1.3rem; letter-spacing: -0.3px; }
.vet-box-body h4 { font-size: 1.05rem; letter-spacing: -0.2px; margin-top: 8px; }
.vet-box-body p { max-width: 62ch; font-size: 0.95rem; line-height: 1.65; color: var(--text-muted); text-wrap: wrap; }
.vet-box-body .vet-box-list { max-width: 62ch; margin: 0; padding-left: 1.3em; display: flex; flex-direction: column; gap: 14px; list-style: disc; }
.vet-box-body .vet-box-list li { font-size: 0.95rem; line-height: 1.65; color: var(--text-muted); padding-left: 4px; }
.vet-box-body .vet-box-list li::marker { color: var(--accent); font-size: 1.1em; }
.vet-box-body a { text-decoration: underline; text-underline-offset: 3px; font-weight: 600; }
.vet-box-body .vet-box-recommend {
  color: var(--accent-dark);
  font-weight: 600;
}
.vet-preview-btns { flex: none; display: flex; flex-direction: column; gap: 16px; align-self: flex-start; margin-left: auto; padding-left: 8px; }
/* gdy podgląd wyłączony (oba kafle hidden) — kolumna znika całkiem, tekst wraca do pełnej szerokości */
.vet-preview-btns:not(:has(.vet-tile:not([hidden]))) { display: none; }
.vet-tile { width: 176px; aspect-ratio: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 8px; padding: 14px; border: 1px solid var(--accent-a35); border-radius: var(--radius-card); background: var(--white); color: var(--accent-dark); font: inherit; text-align: center; cursor: pointer; transition: transform var(--dur) ease, box-shadow var(--dur) ease, background var(--dur) ease, border-color var(--dur) ease; }
.vet-tile[hidden] { display: none; }
.vet-tile .znak { width: 54px; height: 54px; stroke-width: 1.4; color: var(--accent); }
.vet-tile-label { font-weight: 700; font-size: 0.95rem; line-height: 1.25; color: var(--text); text-wrap: balance; }
.vet-tile-fmt { font-size: 0.75rem; font-weight: 600; letter-spacing: 0.06em; color: var(--text-muted); }
.vet-tile:hover { transform: translateY(-3px); background: var(--accent-a08); border-color: var(--accent); box-shadow: var(--shadow-lift-sm); }
.vet-tile:focus-visible { outline: 3px solid var(--accent); outline-offset: 3px; border-radius: var(--radius-card); }
@media (max-width: 899px) {
  .vet-box { flex-wrap: wrap; }
  .vet-preview-btns { flex: 0 0 100%; flex-direction: row; margin-left: 0; padding-left: 0; gap: 14px; }
  .vet-tile { width: auto; flex: 1 1 0; max-width: 220px; }
}
@media (max-width: 560px) {
  .vet-box { flex-direction: column; gap: 14px; padding: 24px 20px; }
  .vet-preview-btns { align-self: stretch; }
  .vet-tile { padding: 10px; }
  .vet-tile .znak { width: 48px; height: 48px; }
}
.vet-dialog { position: fixed; inset: 0; margin: auto; width: min(720px, calc(100vw - 24px)); max-height: calc(100dvh - 24px); padding: 0; border: 1px solid var(--border); border-radius: var(--radius-card); background: var(--bg); color: var(--text); box-shadow: 0 30px 80px -20px rgba(0, 0, 0, 0.45); overflow: hidden; }
.vet-dialog[open] { display: flex; flex-direction: column; }
.vet-dialog::backdrop { background: rgba(30, 24, 28, 0.6); }
.vet-dialog-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 14px 16px 10px 20px; }
.vet-dialog-head h2 { font-size: 1.05rem; letter-spacing: -0.2px; }
.vet-icon-btn { display: inline-grid; place-items: center; width: 44px; height: 44px; flex: none; border: 1px solid var(--accent-a35); border-radius: 50%; background: transparent; color: var(--accent-dark); font: inherit; font-size: 1.3rem; line-height: 1; cursor: pointer; transition: background var(--dur) ease; }
.vet-icon-btn:hover:not(:disabled) { background: var(--white); }
.vet-icon-btn:disabled { opacity: 0.35; cursor: default; }
.vet-carousel { position: relative; display: flex; flex-direction: column; min-height: 0; flex: 1; }
.vet-viewport { flex: 1; min-height: 0; overflow-y: auto; padding: 4px 20px 12px; touch-action: pan-y; }
.vet-slide { display: none; margin: 0; }
.vet-slide.is-active { display: block; }
.vet-slide-media { margin: 0 auto; max-width: 560px; border: 1px solid var(--border); border-radius: var(--radius-sm); background: #fff; overflow: hidden; }
.vet-slide-media img { display: block; width: 100%; height: auto; background: #fff; }
.vet-slide--screenshot .vet-slide-media { max-width: 300px; border: 0; background: transparent; }
.vet-slide-cap { margin: 10px 0 0; text-align: center; font-size: 0.9rem; font-weight: 600; color: var(--text); }
.vet-sheet { background: #fff; color: #3a2f33; padding: 14px; font-size: 0.8rem; }
.vet-sheet-title { display: flex; flex-direction: column; gap: 2px; margin: 0 0 10px; }
.vet-sheet-title strong { font-size: 0.95rem; }
.vet-sheet-scroll {
  overflow-x: auto;
  scrollbar-width: thin;
  scrollbar-color: #c9cfd6 transparent;
  -webkit-overflow-scrolling: touch;
  position: relative;
}
.vet-sheet-scroll::-webkit-scrollbar { height: 8px; }
.vet-sheet-scroll::-webkit-scrollbar-track { background: transparent; }
.vet-sheet-scroll::-webkit-scrollbar-thumb { background-color: #c9cfd6; border-radius: 4px; }
.vet-sheet-scroll::-webkit-scrollbar-thumb:hover { background-color: #9aa5b1; }
.vet-sheet-scroll::after {
  content: "";
  position: absolute;
  top: 0;
  right: 0;
  bottom: 8px;
  width: 12px;
  pointer-events: none;
  background: linear-gradient(to right, transparent, rgba(0, 0, 0, 0.05));
  opacity: 0;
  transition: opacity 0.2s ease;
}
.vet-sheet-scroll[data-scrollable]::after { opacity: 1; }
.vet-sheet table { border-collapse: collapse; min-width: 100%; white-space: nowrap; }
.vet-sheet th, .vet-sheet td { padding: 5px 9px; border: 1px solid #d9d2cb; text-align: left; }
.vet-sheet th { background: #f1ece6; font-weight: 700; }
.vet-sheet-more td { text-align: center; color: #6f625d; }
.vet-sheet-note { margin: 10px 0 0; font-size: 0.74rem; line-height: 1.5; color: #5f524d; }
.vet-slide--xlsx .vet-slide-media, .vet-slide--health .vet-slide-media { max-width: 680px; }
.vet-sheet--grid, .vet-sheet--info { padding: 0; font-family: Calibri, "Helvetica Neue", Arial, sans-serif; font-size: 0.7rem; }
.vet-tabs { display: flex; gap: 2px; padding: 6px 8px 0; background: #eef0f3; border-bottom: 1px solid #c9cfd6; }
.vet-tab { padding: 4px 14px; border: 1px solid transparent; border-bottom: 0; border-radius: 5px 5px 0 0; font-size: 0.74rem; color: #5d6670; }
.vet-tab.is-active { background: #fff; border-color: #c9cfd6; color: #1f2933; font-weight: 600; margin-bottom: -1px; }
.vet-sheet--grid table { table-layout: auto; width: max-content; min-width: 100%; white-space: normal; }
.vet-sheet--grid th, .vet-sheet--grid td { border-color: #c9cfd6; padding: 0 7px; height: 26px; vertical-align: middle; overflow-wrap: normal; word-break: normal; }
.vet-sheet--grid td { white-space: nowrap; }
.vet-sheet--grid th { background: #e3e7ed; border-bottom-color: #9aa5b1; height: 41px; }
.vet-sheet--grid .al-center { text-align: center; }
.vet-sheet--grid .al-right { text-align: right; }
.vet-sheet--grid .vet-sheet-more td { height: auto; border: 0; }
.vet-info { padding: 12px 16px 16px; max-width: 540px; }
.vet-info p { margin: 0 0 8px; line-height: 1.4; }
.vet-info-title { font-size: 1.05rem; font-weight: 700; }
.vet-info-range { margin-bottom: 18px !important; }
.vet-dialog-foot { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 10px 16px 14px 20px; border-top: 1px solid var(--border); }
.vet-dialog-foot .vet-note { font-size: 0.82rem; color: var(--text-muted); }
.vet-nav { display: flex; align-items: center; gap: 10px; }
.vet-counter { min-width: 4.2em; text-align: center; font-size: 0.9rem; font-weight: 600; font-variant-numeric: tabular-nums; }
@media (max-width: 480px) {
  .vet-dialog-foot { flex-direction: column-reverse; align-items: stretch; text-align: center; }
  .vet-nav { justify-content: center; }
}
.vet-tabs--many { overflow-x: auto; scrollbar-width: none; }
.vet-tabs--many::-webkit-scrollbar { display: none; }
.vet-tabs--many .vet-tab { padding: 4px 9px; white-space: nowrap; font-size: 0.68rem; flex: 0 0 auto; }
