/* ==========================================================================
   Mannaz — Akademia Fotografii
   Główny arkusz stylów (landing + podstrona "szkolenia")
   Styl: ciemny, edytorialny, inspirowany szablonem "Kimono"
   ========================================================================== */

/* Fonty (Plus Jakarta Sans, Inter) są ładowane przez <link rel="preconnect">
   + <link rel="stylesheet"> w <head> każdej strony HTML (z &display=swap).
   Celowo NIE duplikujemy tego przez @import tutaj — @import w CSS blokuje
   renderowanie i uniemożliwia wykorzystanie preconnect/wczesnego fetchu. */

/* ==========================================================================
   === ROOT / DESIGN TOKENS ===
   ========================================================================== */
:root {
  --bg: #0c0b0a;
  --bg-alt: #15130f;
  --bg-card: #1c1a16;
  --text: #f6f3ee;
  --text-muted: #a8a299;
  --accent: #ff4d1f;
  --accent-dim: rgba(255, 77, 31, 0.15);
  --accent-2: #ffb199;
  --border: rgba(245, 243, 238, 0.1);
  /* Wariant --border o podniesionej opacity (0.1 -> 0.24), używany TYLKO
     tam, gdzie zwykłe --border jest zbyt subtelne, żeby pełnić rolę
     samodzielnie czytelnego elementu (np. tor .stage-rail-track w
     spoczynku, przed wypełnieniem akcentem) — patrz sekcja STAGE RAIL
     TIMELINE. Theme-aware jak --border, żeby działać poprawnie w obu
     trybach. */
  --border-strong: rgba(245, 243, 238, 0.24);

  --font-display: 'Plus Jakarta Sans', sans-serif;
  --font-accent: 'Plus Jakarta Sans', sans-serif;
  --font-body: 'Inter', sans-serif;

  --radius-sm: 4px;
  --radius-lg: 999px;
  --container-w: 1280px;
  --header-h: 92px;
  --header-h-scrolled: 72px;

  --ease: cubic-bezier(0.4, 0, 0.2, 1);
}

/* ==========================================================================
   === LIGHT MODE (toggled via #themeToggle, adds .light-mode to <html>) ===
   ========================================================================== */
:root.light-mode {
  --bg: #f6f3ee;
  --bg-alt: #ece7dd;
  --bg-card: #ffffff;
  --text: #15130f;
  --text-muted: #5b564c;
  --border: rgba(21, 19, 15, 0.1);
  --border-strong: rgba(21, 19, 15, 0.24);
}

:root.light-mode .site-header.scrolled {
  background: rgba(246, 243, 238, 0.92);
}

:root.light-mode .testimonial-card {
  background: rgba(255, 255, 255, 0.85);
}

:root.light-mode .footer-overlay {
  background: rgba(246, 243, 238, 0.92);
}

:root.light-mode .hero-overlay {
  background: linear-gradient(
      to top,
      rgba(246, 243, 238, 0.95) 0%,
      rgba(246, 243, 238, 0.55) 38%,
      rgba(246, 243, 238, 0.25) 65%,
      rgba(246, 243, 238, 0.55) 100%
    ),
    linear-gradient(
      to right,
      rgba(246, 243, 238, 0.65) 0%,
      rgba(246, 243, 238, 0) 45%
    );
}

:root.light-mode .gallery-item::after {
  background: rgba(246, 243, 238, 0.55);
}

:root.light-mode ::-webkit-scrollbar-thumb {
  background: #cfc8ba;
}

/* Highlighted title words (accent + glow em's): on the cream light-mode bg,
   #ff4d1f only ~2.99:1 against #f6f3ee (just under the 3:1 AA large-text
   threshold) and the neon-style text-shadow reads as a muddy halo rather
   than a glow on a light surface. Reuse the existing darker shade already
   used for .btn-accent:hover (#d93b14, ~4.1:1 on this bg) and tone the
   glow down to a soft tint instead of a strong neon blur. */
:root.light-mode .accent-italic,
:root.light-mode .section-title em,
:root.light-mode .hero-title em,
:root.light-mode .gc-reframe-title em,
:root.light-mode .gc-final-cta-title em {
  color: #d93b14;
  text-shadow: 0 0 10px rgba(217, 59, 20, 0.2);
}

/* ==========================================================================
   === RESET / BASE ===
   ========================================================================== */
*,
*::before,
*::after {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
}

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

body {
  background: var(--bg);
  color: var(--text);
  font-family: var(--font-body);
  font-weight: 400;
  line-height: 1.6;
  font-size: 16px;
  overflow-x: hidden;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

img {
  max-width: 100%;
  height: auto;
  display: block;
  border-radius: 0;
}

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

ul,
ol {
  list-style: none;
}

button,
input,
textarea {
  font-family: inherit;
  color: inherit;
  background: none;
  border: none;
}

button {
  cursor: pointer;
}

h1, h2, h3, h4, h5, h6 {
  font-family: var(--font-display);
  font-weight: 600;
  line-height: 1.1;
}

.container {
  max-width: var(--container-w);
  margin: 0 auto;
  padding: 0 32px;
  width: 100%;
}

/* focus-visible accessibility */
a:focus-visible,
button:focus-visible,
input:focus-visible,
textarea:focus-visible,
[tabindex]:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 2px;
}

/* selection */
::selection {
  background: var(--accent);
  color: #fff;
}

/* scrollbar (webkit) */
::-webkit-scrollbar {
  width: 10px;
}
::-webkit-scrollbar-track {
  background: var(--bg);
}
::-webkit-scrollbar-thumb {
  background: #34302a;
  border-radius: 10px;
}
::-webkit-scrollbar-thumb:hover {
  background: var(--accent);
}

/* ==========================================================================
   === UTILITIES ===
   ========================================================================== */
.badge {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-family: var(--font-display);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 3px;
  text-transform: uppercase;
  color: var(--text-muted);
  border: 1px solid var(--border);
  padding: 8px 16px;
  border-radius: var(--radius-lg);
}

.accent-italic,
.section-title em {
  font-family: var(--font-accent);
  font-style: normal;
  font-weight: 700;
  text-transform: none;
  color: var(--accent);
  text-shadow: 0 0 12px rgba(255, 77, 31, 0.6), 0 0 30px rgba(255, 77, 31, 0.35);
  letter-spacing: 0;
}

.reveal {
  opacity: 0;
  transform: translateY(30px);
  transition: opacity 0.8s var(--ease), transform 0.8s var(--ease);
}

.reveal.visible {
  opacity: 1;
  transform: translateY(0);
}

/* ==========================================================================
   === BUTTONS ===
   ========================================================================== */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  padding: 16px 36px;
  border-radius: var(--radius-lg);
  font-family: var(--font-display);
  font-size: 13px;
  font-weight: 600;
  letter-spacing: 2px;
  text-transform: uppercase;
  border: 1px solid transparent;
  transition: background var(--ease) 0.3s, color var(--ease) 0.3s,
    border-color var(--ease) 0.3s, transform var(--ease) 0.3s;
  white-space: nowrap;
}

.btn:active {
  transform: scale(0.97);
}

.btn-white {
  background: #fff;
  color: #0c0b0a;
}
.btn-white:hover {
  background: var(--accent);
  color: #fff;
}

.btn-outline {
  background: transparent;
  color: var(--text);
  border-color: rgba(255, 255, 255, 0.3);
  transition: background var(--ease) 0.3s, color var(--ease) 0.3s,
    border-color var(--ease) 0.3s, box-shadow var(--ease) 0.3s,
    transform var(--ease) 0.3s;
}
.btn-outline:hover {
  background: var(--accent);
  color: #fff;
  border-color: var(--accent);
  box-shadow: 0 0 30px rgba(255, 77, 31, 0.45);
}

.btn-accent {
  background: var(--accent);
  color: #fff;
}
.btn-accent:hover {
  background: #d93b14;
}

.btn-accent-sm {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  background: var(--accent);
  color: #fff;
  font-family: var(--font-display);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 1.5px;
  text-transform: uppercase;
  padding: 10px 22px;
  border-radius: var(--radius-lg);
  transition: background var(--ease) 0.3s;
  position: relative;
  overflow: hidden;
}
.btn-accent-sm:hover {
  background: #d93b14;
}

/* Subtelny, premium efekt "shine sweep": ukośny jasny pasek przesuwa się
   powoli przez powierzchnię guzika w cyklu 7s (sam przelot trwa ~3.15s,
   45% -> 100% animacji to długa przerwa), zanim błysk wróci na start.
   Pseudo-element leży pod tekstem guzika w normalnym porządku malowania
   (before renderuje się przed właściwą treścią elementu), więc nie
   przesłania napisu; overflow:hidden na .btn-accent-sm przycina pasek do
   granic guzika. Efekt wyłączony dla prefers-reduced-motion. */
.btn-accent-sm::before {
  content: '';
  position: absolute;
  top: 0;
  left: -150%;
  width: 60%;
  height: 100%;
  background: linear-gradient(
    100deg,
    transparent 20%,
    rgba(255, 255, 255, 0.45) 50%,
    transparent 80%
  );
  transform: skewX(-20deg);
  animation: btnAccentShine 7s ease-in-out infinite;
  pointer-events: none;
}

@keyframes btnAccentShine {
  0% {
    left: -150%;
  }
  45% {
    left: 150%;
  }
  100% {
    left: 150%;
  }
}

.btn-circle {
  width: 110px;
  height: 110px;
  border-radius: 50%;
  background: var(--accent);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
  font-family: var(--font-display);
  font-size: 13px;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 1px;
  line-height: 1.2;
  transition: transform 0.4s var(--ease), background 0.3s var(--ease);
  flex-shrink: 0;
}
.btn-circle:hover {
  transform: scale(1.08);
  background: #d93b14;
}

/* ==========================================================================
   === HEADER ===
   ========================================================================== */
.site-header {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  z-index: 1000;
  background: transparent;
  transition: background var(--ease) 0.35s, padding var(--ease) 0.35s,
    box-shadow var(--ease) 0.35s;
  padding: 14px 0;
}

.site-header.scrolled {
  background: rgba(21, 19, 15, 0.92);
  /* NOTE: intentionally no backdrop-filter here. backdrop-filter (like
     transform/filter/perspective/will-change:transform) creates a new
     containing block for descendants, so it would hijack the
     position:fixed on the nested #mainNav.open mobile menu and make it
     size itself to this header bar instead of the real viewport. The
     92%-opacity background is solid enough on its own — do not re-add
     backdrop-filter to this rule. */
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.35);
  padding: 6px 0;
}

.header-inner {
  display: flex;
  align-items: center;
  justify-content: space-between;
  min-height: 64px;
}

.logo {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 24px;
  letter-spacing: 4px;
  text-transform: uppercase;
  color: var(--text);
  display: inline-flex;
  align-items: baseline;
}

.logo-accent {
  color: var(--accent);
  margin-left: 2px;
}

.main-nav {
  display: flex;
  align-items: center;
  gap: 40px;
}

.main-nav a {
  position: relative;
  font-family: var(--font-display);
  font-size: 13px;
  font-weight: 500;
  letter-spacing: 1.5px;
  text-transform: uppercase;
  color: var(--text);
  padding: 6px 0;
  transition: color var(--ease) 0.25s;
}

.main-nav a::after {
  content: '';
  position: absolute;
  left: 0;
  bottom: 0;
  width: 0;
  height: 1px;
  background: var(--accent);
  transition: width var(--ease) 0.3s;
}

.main-nav a:hover {
  color: var(--accent);
}

.main-nav a:hover::after,
.main-nav a.active::after {
  width: 100%;
}

.main-nav a.active {
  color: var(--accent);
}

.header-actions {
  display: flex;
  align-items: center;
  gap: 18px;
}

.theme-toggle {
  width: 42px;
  height: 42px;
  border-radius: 50%;
  border: 1px solid var(--border);
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--text);
  transition: border-color var(--ease) 0.3s, background var(--ease) 0.3s;
}

.theme-toggle:hover {
  border-color: var(--accent);
  background: var(--accent-dim);
}

.theme-toggle svg {
  width: 18px;
  height: 18px;
}

.nav-toggle {
  display: none;
  flex-direction: column;
  justify-content: center;
  gap: 5px;
  width: 42px;
  height: 42px;
}

.nav-toggle span {
  display: block;
  width: 24px;
  height: 2px;
  background: var(--text);
  transition: transform var(--ease) 0.3s, opacity var(--ease) 0.3s;
}

.nav-toggle.open span:nth-child(1) {
  transform: translateY(7px) rotate(45deg);
}
.nav-toggle.open span:nth-child(2) {
  opacity: 0;
}
.nav-toggle.open span:nth-child(3) {
  transform: translateY(-7px) rotate(-45deg);
}

/* Locks body scroll while the mobile menu overlay is open (class added by js/script.js). */
body.menu-open {
  overflow: hidden;
}

/* ==========================================================================
   === SECTIONS (GENERAL) ===
   ========================================================================== */
.section {
  padding: 140px 0;
  position: relative;
}

.section-alt {
  background: var(--bg-alt);
}

.eyebrow {
  display: inline-flex;
  align-items: center;
  gap: 14px;
  font-family: var(--font-display);
  font-size: 13px;
  font-weight: 600;
  letter-spacing: 3px;
  text-transform: uppercase;
  color: var(--accent);
  margin-bottom: 24px;
}

.eyebrow::before {
  content: '';
  width: 40px;
  height: 1px;
  background: var(--accent);
  display: inline-block;
}

.section-title {
  font-family: var(--font-display);
  font-size: 42px;
  font-weight: 700;
  text-transform: none;
  line-height: 1.15;
  letter-spacing: -0.3px;
  color: var(--text);
  margin-bottom: 24px;
}

.section-sub {
  color: var(--text-muted);
  font-size: 18px;
  font-weight: 400;
  line-height: 1.7;
  max-width: 560px;
}

/* Wyróżnienie słowa kluczowego w treści (nie nagłówek) — do użycia wewnątrz
   akapitów, tam gdzie chcemy podkreślić korzyść bez zmiany całej struktury. */
.hl {
  color: var(--accent);
  font-weight: 600;
}

.section-head {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: 40px;
  margin-bottom: 64px;
  flex-wrap: wrap;
}

/* ==========================================================================
   === HERO ===
   ========================================================================== */
.hero {
  position: relative;
  min-height: 92vh;
  overflow: hidden;
  display: flex;
  align-items: center;
  color: var(--text);
}

.hero-bg {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  z-index: 0;
}

.hero-overlay {
  position: absolute;
  inset: 0;
  z-index: 1;
  background: linear-gradient(
      to top,
      rgba(12, 11, 10, 0.95) 0%,
      rgba(12, 11, 10, 0.55) 38%,
      rgba(12, 11, 10, 0.25) 65%,
      rgba(12, 11, 10, 0.55) 100%
    ),
    linear-gradient(
      to right,
      rgba(12, 11, 10, 0.65) 0%,
      rgba(12, 11, 10, 0) 45%
    );
}

.hero-content {
  position: relative;
  z-index: 2;
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  width: 100%;
  padding: calc(var(--header-h) + 60px) 0 64px;
}

.hero-eyebrow {
  display: inline-flex;
  align-items: center;
  gap: 14px;
  font-family: var(--font-display);
  font-size: 13px;
  font-weight: 600;
  letter-spacing: 3px;
  text-transform: uppercase;
  color: var(--accent);
  margin-bottom: 24px;
}

.hero-eyebrow::before {
  content: '';
  width: 40px;
  height: 1px;
  background: var(--accent);
  display: inline-block;
}

.hero-title {
  font-family: var(--font-display);
  font-weight: 800;
  text-transform: none;
  font-size: 72px;
  line-height: 1.08;
  letter-spacing: -1px;
  max-width: 900px;
  margin: 0 auto 36px;
  text-shadow: 0 8px 40px rgba(0, 0, 0, 0.4);
}

.hero-title em {
  font-family: var(--font-accent);
  font-style: normal;
  font-weight: 800;
  text-transform: none;
  color: var(--accent);
  text-shadow: 0 0 14px rgba(255, 77, 31, 0.6), 0 0 34px rgba(255, 77, 31, 0.35);
}

.hero-text {
  color: var(--text-muted);
  font-size: 18px;
  max-width: 560px;
  margin: 0 auto 40px;
}

.hero-actions {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 20px;
  flex-wrap: wrap;
}

.hero-microtrust {
  margin-top: 20px;
  font-size: 13px;
  color: rgba(246, 243, 238, 0.65);
}

.hero-arrows {
  position: absolute;
  z-index: 3;
  top: 50%;
  left: 0;
  right: 0;
  display: flex;
  justify-content: space-between;
  transform: translateY(-50%);
  padding: 0 32px;
  pointer-events: none;
}

.hero-arrow {
  pointer-events: all;
  width: 56px;
  height: 56px;
  border-radius: 50%;
  border: 1px solid rgba(255, 255, 255, 0.3);
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--text);
  transition: background var(--ease) 0.3s, border-color var(--ease) 0.3s;
  background: rgba(12, 11, 10, 0.3);
  backdrop-filter: blur(6px);
}

.hero-arrow:hover {
  background: var(--accent);
  border-color: var(--accent);
}

.hero-decor {
  position: absolute;
  inset: 0;
  z-index: 1;
  pointer-events: none;
  overflow: hidden;
}

.blob {
  position: absolute;
  border-radius: 50%;
  background: var(--accent);
  filter: blur(80px);
  opacity: 0.35;
  pointer-events: none;
}

.blob-sm {
  width: 180px;
  height: 180px;
}

.blob-md {
  width: 320px;
  height: 320px;
  opacity: 0.3;
}

.blob-lg {
  width: 520px;
  height: 520px;
  opacity: 0.25;
}

.ring-deco {
  position: absolute;
  border: 1px solid rgba(245, 243, 238, 0.15);
  border-radius: 50%;
  pointer-events: none;
}

/* ==========================================================================
   === HERO FIGURE — sylwetka właściciela studia, dopełnienie tła po prawej
   stronie hero. Ma być DODATKIEM, nie priorytetem: ten sam z-index co
   .hero-decor (1, pod tekstem hero-content na z-index:2), zredukowana
   opacity, a sam plik graficzny ma już wypalone (w pikselach) zanikanie
   krawędzi lewej/górnej/dolnej, żeby sylwetka rozpływała się w tle hero
   zamiast wyglądać jak wklejone zdjęcie z twardą krawędzią. Bokeh
   (.blob) i winieta (.hero-overlay) zostają całkowicie nietknięte. Ukryta
   na węższych ekranach, gdzie wyśrodkowany tekst hero nie zostawia miejsca
   z boku bez kolizji. */
.hero-figure {
  position: absolute;
  inset: 0;
  z-index: 1;
  display: flex;
  align-items: flex-end;
  justify-content: flex-end;
  pointer-events: none;
  opacity: 0.9;
}

.hero-figure-img {
  height: 100%;
  width: auto;
  /* Sylwetka nie może nigdy wchodzić na wyśrodkowany blok tekstu (hero-title
     max-width:900px). Górny limit liczony jest więc względem realnie wolnej
     przestrzeni po bokach kontenera (100vw - 900px tekstu) / 2, pomniejszonej
     o margines bezpieczeństwa — a nie o stały % szerokości ekranu, który przy
     średnich szerokościach nachodził na tekst. */
  max-width: min(34vw, calc((100vw - 900px) / 2 - 48px));
  object-fit: contain;
  object-position: bottom right;
  display: block;
}

@media (max-width: 1500px) {
  .hero-figure {
    display: none;
  }
}

/* ==========================================================================
   === TESTIMONIAL ===
   ========================================================================== */
.testimonial-card {
  position: relative;
  background: rgba(28, 26, 22, 0.7);
  backdrop-filter: blur(14px);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  padding: 44px 40px;
  max-width: 520px;
  z-index: 2;
}

.quote-mark {
  position: absolute;
  top: 10px;
  right: 28px;
  font-family: var(--font-accent);
  font-size: 120px;
  line-height: 1;
  color: var(--accent);
  opacity: 0.2;
  pointer-events: none;
  user-select: none;
}

.stars {
  display: flex;
  gap: 4px;
  color: var(--accent);
  font-size: 16px;
  margin-bottom: 18px;
}

.testimonial-text {
  font-family: var(--font-body);
  font-size: 22px;
  font-weight: 400;
  line-height: 1.5;
  color: var(--text);
  margin-bottom: 28px;
}

.testimonial-author {
  display: flex;
  align-items: center;
  gap: 16px;
}

.avatar {
  width: 56px;
  height: 56px;
  border-radius: 50%;
  object-fit: cover;
  flex-shrink: 0;
}

.testimonial-author-info strong {
  display: block;
  font-family: var(--font-display);
  font-size: 15px;
  letter-spacing: 0.5px;
  text-transform: uppercase;
  font-weight: 600;
}

.testimonial-author-info span {
  display: block;
  font-size: 13px;
  color: var(--text-muted);
}

.testimonial-nav {
  display: flex;
  gap: 12px;
  margin-top: 28px;
}

.testimonial-nav button {
  width: 44px;
  height: 44px;
  border-radius: 50%;
  border: 1px solid var(--border);
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--text);
  transition: background var(--ease) 0.3s, border-color var(--ease) 0.3s;
}

.testimonial-nav button:hover {
  background: var(--accent);
  border-color: var(--accent);
}

/* Individual slides inside [data-testimonial-slider]; js/script.js toggles .active. */
.testimonial-slide {
  display: none;
}

.testimonial-slide.active {
  display: block;
}

/* ==========================================================================
   === ABOUT ===
   ========================================================================== */
.about-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 80px;
  align-items: start;
}

.about-grid .about-images {
  position: sticky;
  top: calc(var(--header-h) + 40px);
}

.about-images {
  position: relative;
  min-height: 560px;
}

.about-img-1 {
  position: absolute;
  top: 0;
  left: 0;
  width: 72%;
  height: 380px;
  object-fit: cover;
}

.about-img-2 {
  position: absolute;
  bottom: 0;
  right: 0;
  width: 60%;
  height: 320px;
  object-fit: cover;
  border: 6px solid var(--bg);
}

.floating-cta {
  position: absolute;
  top: 38%;
  left: 56%;
  transform: translate(-50%, -50%);
  z-index: 3;
}

.about-text h2 {
  margin-bottom: 24px;
}

.about-text p {
  color: var(--text-muted);
  font-size: 17px;
  margin-bottom: 20px;
  line-height: 1.8;
}

.stats-row {
  display: flex;
  gap: 56px;
  margin-top: 48px;
  flex-wrap: wrap;
}

.about-cta {
  margin-top: 40px;
}

.vt-list-col {
  display: flex;
  flex-direction: column;
  min-height: 0;
  min-width: 0;
}

.vt-youtube-cta {
  display: flex;
  align-self: flex-start;
  width: fit-content;
  margin-top: 20px;
}

.vt-youtube-cta svg {
  width: 18px;
  height: 18px;
  flex-shrink: 0;
}

.stat-item {
  display: flex;
  flex-direction: column;
  gap: 10px;
  min-width: 110px;
}

.stat-number {
  font-family: var(--font-display);
  font-size: 56px;
  font-weight: 700;
  color: var(--text);
  line-height: 1;
}

.stat-number span {
  color: var(--accent);
}

.stat-label {
  font-size: 12px;
  letter-spacing: 1.5px;
  text-transform: uppercase;
  color: var(--text-muted);
}

.stat-bar {
  width: 100%;
  height: 2px;
  background: var(--border);
  position: relative;
  overflow: hidden;
}

.stat-bar::after {
  content: '';
  position: absolute;
  left: 0;
  top: 0;
  bottom: 0;
  width: 60%;
  background: var(--accent);
}

/* ==========================================================================
   === SERVICES / OFERTA ===
   ========================================================================== */
.services-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 64px;
}

.trust-grid {
  grid-template-columns: repeat(4, 1fr);
  gap: 40px;
}

.service-item {
  background: none;
  border: none;
}

.service-icon {
  width: 48px;
  height: 48px;
  color: var(--accent);
  margin-bottom: 24px;
  stroke-width: 1.4;
}

.service-item h3 {
  font-size: 22px;
  font-weight: 700;
  text-transform: none;
  letter-spacing: 0.2px;
  margin-bottom: 14px;
}

.service-item p {
  color: var(--text-muted);
  font-size: 15px;
  line-height: 1.75;
}

/* "Decyzja, której nie będziesz żałował" — ten sam czytelny "kwadrat"
   (bg-card + border + radius-sm) co .stage-block .service-item na szkoleniu,
   dla spójności designu. Scoped tylko do .trust-grid, żeby nie dotknąć
   .services-grid używanego gdzie indziej bez kart. */
.trust-grid .service-item {
  position: relative;
  z-index: 1;
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  padding: 32px;
  transition: border-color 0.3s var(--ease), transform 0.3s var(--ease);
}

.trust-grid .service-item:hover {
  border-color: var(--accent);
  transform: translateY(-4px);
}

/* ==========================================================================
   === BIG TYPE EDITORIAL SECTION ===
   ========================================================================== */
.big-type-section {
  position: relative;
  overflow: hidden;
  background: linear-gradient(135deg, var(--accent) 0%, #5c0f02 100%);
  min-height: 640px;
  display: flex;
  align-items: center;
}

.big-type-grid {
  position: relative;
  z-index: 2;
  display: grid;
  grid-template-columns: 1fr 1fr;
  align-items: center;
  width: 100%;
}

.big-type-text {
  font-family: var(--font-display);
  font-weight: 700;
  text-transform: none;
  font-size: 110px;
  line-height: 0.9;
  color: #fff;
  text-shadow: 0 10px 50px rgba(0, 0, 0, 0.35);
  position: relative;
  z-index: 3;
}

.big-type-image {
  position: relative;
  height: 560px;
}

.big-type-image img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.slide-counter {
  font-family: var(--font-display);
  font-size: 80px;
  font-weight: 700;
  color: rgba(255, 255, 255, 0.85);
  position: absolute;
  bottom: 40px;
  left: 32px;
  z-index: 4;
}

.slide-counter span {
  font-size: 28px;
  opacity: 0.6;
}

.slide-dots {
  display: flex;
  flex-direction: column;
  gap: 14px;
  position: absolute;
  right: 32px;
  top: 50%;
  transform: translateY(-50%);
  z-index: 4;
}

.slide-dots .dot {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.4);
  transition: all var(--ease) 0.3s;
}

.slide-dots .dot.active {
  width: 10px;
  height: 28px;
  border-radius: 6px;
  background: #fff;
}

/* ==========================================================================
   === GALLERY ===
   ========================================================================== */
.gallery-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-auto-rows: 260px;
  gap: 12px;
}

.gallery-item {
  position: relative;
  overflow: hidden;
  cursor: pointer;
}

.gallery-item.span-2 {
  grid-column: span 2;
}

.gallery-item.row-2 {
  grid-row: span 2;
}

.gallery-item img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform 0.6s var(--ease);
}

.gallery-item::after {
  content: '';
  position: absolute;
  inset: 0;
  background: rgba(12, 11, 10, 0.55);
  opacity: 0;
  transition: opacity 0.4s var(--ease);
}

.gallery-item-label {
  position: absolute;
  left: 24px;
  bottom: 24px;
  z-index: 2;
  font-family: var(--font-display);
  font-size: 14px;
  letter-spacing: 1.5px;
  text-transform: uppercase;
  color: #fff;
  opacity: 0;
  transform: translateY(12px);
  transition: opacity 0.4s var(--ease), transform 0.4s var(--ease);
}

.gallery-item:hover img {
  transform: scale(1.08);
}

.gallery-item:hover::after {
  opacity: 1;
}

.gallery-item:hover .gallery-item-label {
  opacity: 1;
  transform: translateY(0);
}

/* ==========================================================================
   === MANNAZ — KAFELKI STYLÓW TATUAŻU ===
   ========================================================================== */
.mannaz-section .eyebrow {
  justify-content: center;
}

.mannaz-section .section-title,
.mannaz-section .section-sub {
  text-align: center;
  margin-left: auto;
  margin-right: auto;
}

.mannaz-section .eyebrow,
.mannaz-section .section-title,
.mannaz-section .section-sub {
  opacity: 0;
  transform: translateY(24px);
  transition: opacity 0.7s var(--ease), transform 0.7s var(--ease);
}

.mannaz-section.visible .eyebrow {
  opacity: 1;
  transform: translateY(0);
  transition-delay: 0.05s;
}

.mannaz-section.visible .section-title {
  opacity: 1;
  transform: translateY(0);
  transition-delay: 0.15s;
}

.mannaz-section.visible .section-sub {
  opacity: 1;
  transform: translateY(0);
  transition-delay: 0.25s;
}

.mannaz-grid {
  /* Flexbox zamiast Grid: przy 7 kafelkach ostatni, niepelny rzad ma byc
     WYSRODKOWANY, a nie przyklejony do lewej krawedzi (tak dzieje sie
     domyslnie w CSS Grid bez dodatkowych trikow). flex-wrap +
     justify-content:center daje to "za darmo". */
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 16px;
  margin-top: 64px;
}

/* Pod przyciskiem "Sprawdź całe portfolio", wyśrodkowany niezależnie od
   tego, czy rodzic ma ustawiony text-align:center czy nie. */
.mannaz-portfolio-cta {
  text-align: center;
  margin-top: 40px;
}

.mannaz-micro-cta {
  text-align: center;
  margin-top: 16px;
  color: var(--text-muted);
  font-size: 15px;
}

.mannaz-micro-cta a {
  color: var(--accent);
  text-decoration: underline;
  text-underline-offset: 3px;
}

.mannaz-tile {
  position: relative;
  display: flex;
  flex-direction: column;
  border-radius: var(--radius-sm);
  overflow: hidden;
  background: var(--bg-card);
  border: 1px solid var(--border);
  text-decoration: none;
  color: var(--text);
  opacity: 0;
  transform: translateY(40px);
  transition: opacity 0.7s var(--ease), transform 0.7s var(--ease);
  /* Szerokosc kafelka = 5 na rzad (dopasuj przez media query nizej dla
     wezszych ekranow). flex-grow:0 + flex-shrink:1, zeby niepelny ostatni
     rzad nie rozciagal sie na cala szerokosc kontenera. */
  /* 3 kolumny na desktopie — po usunięciu kafelka Fine Line zostało 6
     stylów, więc dwa równe rzędy po 3: Realizm/Botaniczny/Dotwork w
     pierwszym, Napisy/Whip Shading/Concept Tattoo w drugim. Kolejność
     kafelków w HTML daje ten podział "za darmo" przy naturalnym wrapie
     flexboksa. */
  flex: 0 1 calc((100% - 2 * 16px) / 3);
  max-width: calc((100% - 2 * 16px) / 3);
}

.mannaz-section.visible .mannaz-tile {
  opacity: 1;
  transform: translateY(0);
}

.mannaz-section.visible .mannaz-tile:nth-child(1) { transition-delay: 0.3s; }
.mannaz-section.visible .mannaz-tile:nth-child(2) { transition-delay: 0.38s; }
.mannaz-section.visible .mannaz-tile:nth-child(3) { transition-delay: 0.46s; }
.mannaz-section.visible .mannaz-tile:nth-child(4) { transition-delay: 0.54s; }
.mannaz-section.visible .mannaz-tile:nth-child(5) { transition-delay: 0.62s; }

/* hover lift comes after the reveal-transform rule so it wins on equal specificity */
.mannaz-tile:hover {
  transform: translateY(-6px);
  border-color: var(--accent);
}

/* Media zone: photo dissolves smoothly into the card's solid background (Booksy-style) */
.mannaz-tile-media {
  position: relative;
  height: 260px;
  overflow: hidden;
  flex-shrink: 0;
}

.mannaz-tile-media img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform 0.7s var(--ease);
  -webkit-mask-image: linear-gradient(to bottom, #000 58%, transparent 96%);
  mask-image: linear-gradient(to bottom, #000 58%, transparent 96%);
}

.mannaz-tile:hover .mannaz-tile-media img {
  transform: scale(1.08);
}

.mannaz-tile-icon {
  position: absolute;
  top: 20px;
  left: 20px;
  z-index: 2;
  width: 46px;
  height: 46px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  background: rgba(246, 243, 238, 0.12);
  border: 1px solid rgba(246, 243, 238, 0.25);
  backdrop-filter: blur(4px);
  color: var(--text);
  transition: background 0.4s var(--ease), color 0.4s var(--ease), transform 0.4s var(--ease), border-color 0.4s var(--ease);
}

.mannaz-tile-icon svg {
  width: 22px;
  height: 22px;
}

.mannaz-tile:hover .mannaz-tile-icon {
  background: var(--accent);
  border-color: var(--accent);
  color: #fff;
  transform: scale(1.08);
}

/* Content zone: sits on the card's solid background — always visible, no hover reveal needed */
.mannaz-tile-content {
  position: relative;
  padding: 4px 24px 26px;
  flex: 1;
  display: flex;
  flex-direction: column;
}

.mannaz-tile-content h3 {
  font-family: var(--font-display);
  font-size: 20px;
  font-weight: 700;
  text-transform: none;
  letter-spacing: 0.2px;
  margin-bottom: 8px;
  color: var(--text);
}

.mannaz-tile-content p {
  font-size: 14px;
  line-height: 1.6;
  color: var(--text-muted);
  margin-bottom: 16px;
  flex: 1;
}

.mannaz-tile-cta {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  align-self: flex-start;
  font-family: var(--font-display);
  font-size: 12px;
  font-weight: 500;
  letter-spacing: 0.5px;
  text-transform: uppercase;
  color: var(--accent);
  transition: gap 0.3s var(--ease), color 0.3s var(--ease);
}

.mannaz-tile:hover .mannaz-tile-cta {
  gap: 10px;
  color: var(--accent-2);
}

/* ==========================================================================
   === VIDEO OPINIE (lokalne pliki mp4, format pionowy 9:16) ===
   ========================================================================== */
.vt-wrap {
  display: grid;
  grid-template-columns: 380px 1fr;
  gap: 40px;
  margin-top: 56px;
  align-items: start;
  min-width: 0;
}

.vt-player {
  max-width: 380px;
  width: 100%;
  margin: 0 auto;
  min-width: 0;
}

/* ==========================================================================
   === ODTWARZACZ WIDEO — PREMIUM, "REELS-STYLE" ===
   Przebudowa z klasycznego <video controls> na w pełni własny,
   nowoczesny interfejs: full-bleed wideo, delikatna poświata wokół ramki,
   gradientowa "scrim" (czytelność ikon/podpisu na dowolnym tle wideo), duży
   centralny przycisk play/pauza (widoczny tylko gdy wideo jest
   zatrzymane — znika podczas odtwarzania, żeby nic nie zasłaniało kadru),
   mały stały przycisk wyciszenia w rogu, cienki pasek postępu na dole
   (jak w Reels/Shorts) i podpis z imieniem klienta nad paskiem postępu.
   Cała logika (play/pause/mute/progress) w js/script.js, funkcja
   initVideoTestimonials(). ========================================================================== */
.vt-player-frame {
  position: relative;
  width: 100%;
  aspect-ratio: 9 / 16;
  background: #000;
  border-radius: 20px;
  overflow: hidden;
  border: 1px solid var(--border);
  cursor: pointer;
  box-shadow:
    0 24px 60px -24px rgba(255, 77, 31, 0.28),
    0 8px 30px -12px rgba(0, 0, 0, 0.55);
  transition: box-shadow 0.4s var(--ease);
}

.vt-player-frame:hover {
  box-shadow:
    0 24px 70px -20px rgba(255, 77, 31, 0.38),
    0 8px 30px -12px rgba(0, 0, 0, 0.6);
}

.vt-player-frame video {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  background: #000;
}

/* Gradientowa "scrim" — delikatnie przyciemnia górę (czytelność ikony
   wyciszenia) i mocniej dół (czytelność podpisu + pasek postępu) na
   DOWOLNYM, nieprzewidywalnym tle wideo. Czysto dekoracyjna, nie
   przechwytuje kliknięć — cały frame ma własny handler kliknięcia. */
.vt-scrim {
  position: absolute;
  inset: 0;
  pointer-events: none;
  background: linear-gradient(
    180deg,
    rgba(12, 11, 10, 0.45) 0%,
    rgba(12, 11, 10, 0) 20%,
    rgba(12, 11, 10, 0) 52%,
    rgba(12, 11, 10, 0.82) 100%
  );
}

/* Wspólny styl "szklanego" przycisku (mute + play/pause) — półprzezroczyste
   tło + rozmycie tła (premium, "glassmorphism"), spójne z resztą akcentów
   strony (var(--accent) na hover/aktywnym stanie). */
.vt-mute-toggle,
.vt-play-toggle {
  position: absolute;
  display: flex;
  align-items: center;
  justify-content: center;
  border: 1px solid rgba(246, 243, 238, 0.25);
  background: rgba(12, 11, 10, 0.4);
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
  color: #fff;
  border-radius: 50%;
  cursor: pointer;
  z-index: 2;
  transition: background 0.25s var(--ease), border-color 0.25s var(--ease),
    transform 0.25s var(--ease), opacity 0.25s var(--ease);
}

.vt-mute-toggle {
  top: 14px;
  right: 14px;
  width: 36px;
  height: 36px;
}

.vt-mute-toggle:hover,
.vt-mute-toggle:focus-visible {
  border-color: var(--accent);
  background: rgba(255, 77, 31, 0.3);
}

.vt-play-toggle {
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: 64px;
  height: 64px;
  opacity: 1;
}

.vt-play-toggle:hover,
.vt-play-toggle:focus-visible {
  background: rgba(255, 77, 31, 0.55);
  border-color: var(--accent);
  transform: translate(-50%, -50%) scale(1.06);
}

/* Podczas odtwarzania duży przycisk play znika (skala w dół + fade),
   żeby nie zasłaniał kadru — kliknięcie GDZIEKOLWIEK na ramce (patrz JS)
   nadal pauzuje wideo, więc funkcjonalność zostaje, znika tylko wizualny
   "guzik" na czas odtwarzania. */
.vt-player-frame.is-playing .vt-play-toggle {
  opacity: 0;
  transform: translate(-50%, -50%) scale(0.8);
  pointer-events: none;
}

.vt-icon {
  width: 20px;
  height: 20px;
}

.vt-play-toggle .vt-icon {
  width: 24px;
  height: 24px;
  margin-left: 2px; /* optyczne wyśrodkowanie trójkąta "play" */
}

.vt-play-toggle .vt-icon-pause,
.vt-player-frame.is-playing .vt-play-toggle .vt-icon-play {
  display: none;
}

.vt-player-frame.is-playing .vt-play-toggle .vt-icon-pause {
  display: block;
  margin-left: 0;
}

.vt-mute-toggle .vt-icon-muted,
.vt-mute-toggle.is-muted .vt-icon-unmuted {
  display: none;
}

.vt-mute-toggle.is-muted .vt-icon-muted {
  display: block;
}

/* Podpis z imieniem klienta — mała plakietka nad paskiem postępu, zawsze
   czytelna dzięki .vt-scrim. Pełny tytuł/opis zostaje pod ramką
   (.vt-player-info) — ta plakietka to szybki, "premium" kontekst "kto
   mówi" widoczny bezpośrednio na kadrze, w duchu Reels/Stories. */
.vt-caption {
  position: absolute;
  left: 16px;
  right: 16px;
  bottom: 22px;
  z-index: 1;
}

.vt-caption-client {
  display: inline-block;
  font-family: var(--font-display);
  font-size: 13px;
  font-weight: 600;
  letter-spacing: 0.3px;
  color: #fff;
  text-shadow: 0 1px 4px rgba(0, 0, 0, 0.5);
}

.vt-caption-client::before {
  content: '';
  display: inline-block;
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--accent);
  margin-right: 8px;
  box-shadow: 0 0 6px rgba(255, 77, 31, 0.8);
  vertical-align: middle;
}

/* Cienki pasek postępu na samej krawędzi ramki, jak w Reels/Shorts —
   aktualizowany na żywo z 'timeupdate' (patrz initVideoTestimonials). */
.vt-progress {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  height: 3px;
  background: rgba(246, 243, 238, 0.2);
  z-index: 2;
}

.vt-progress-fill {
  height: 100%;
  width: 0%;
  background: var(--accent);
  box-shadow: 0 0 8px rgba(255, 77, 31, 0.7);
  transition: width 0.15s linear;
}

.vt-player-info {
  margin-top: 20px;
}

.vt-player-info h3 {
  font-family: var(--font-display);
  font-size: 20px;
  font-weight: 600;
  color: var(--text);
  margin-bottom: 8px;
}

.vt-player-info p {
  font-size: 14px;
  line-height: 1.6;
  color: var(--text-muted);
}

@media (prefers-reduced-motion: reduce) {
  .vt-player-frame,
  .vt-mute-toggle,
  .vt-play-toggle,
  .vt-progress-fill {
    transition: none;
  }
}

.vt-list {
  display: flex;
  flex-direction: column;
  gap: 12px;
  max-height: 675px;
  overflow-y: auto;
  padding-right: 4px;
}

/* Lista miniatur — świadomie NIE kopiuje 1:1 promienia zaokrągleń playera
   (20px): player ma zostać wizualnym "bohaterem" sekcji, lista subtelnym,
   bardziej zwartym akompaniamentem. Zamiast tabelarycznego --radius-sm
   (4px, współdzielonego z inputami/kartami w reszcie strony) karty i
   miniatury dostają własny, pośredni promień 12px/10px — na tyle
   zaokrąglony, żeby "mówić tym samym językiem" co ramka playera, na tyle
   mniejszy, żeby zachować hierarchię głównego elementu. */
.vt-item {
  display: flex;
  align-items: center;
  gap: 14px;
  padding: 10px;
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: 12px;
  cursor: pointer;
  text-align: left;
  transition: border-color 0.3s var(--ease), background 0.3s var(--ease),
    transform 0.3s var(--ease), box-shadow 0.3s var(--ease);
  font-family: var(--font-body);
}

.vt-item:hover {
  border-color: var(--accent-dim);
  transform: translateX(2px);
  box-shadow: 0 6px 16px -10px rgba(0, 0, 0, 0.5);
}

/* Poświata na active dobrana tak, by pasowała intensywnością do innych
   "premium" akcentów strony (np. .stage-panel-badge.is-highlighted:
   0 0 20px rgba(255,77,31,.5)) — ten sam rodzaj efektu, proporcjonalnie
   przyciszony dla mniejszego elementu listy. */
.vt-item.active {
  border-color: var(--accent);
  background: var(--accent-dim);
  box-shadow: 0 0 0 1px var(--accent), 0 8px 20px -10px rgba(255, 77, 31, 0.45);
}

/* Miniatury 9:16 to "mini-repliki" proporcji .vt-player-frame — subtelny
   cień w spoczynku i delikatne uwypuklenie na stanie aktywnym łączą
   wizualnie listę z rozbudowanym playerem obok, żeby obie kolumny czytały
   się jako jeden spójny, "premium" komponent, a nie dwa osobne style.
   Dodatkowy hover/active scale na samej miniaturze (osobno od translateX
   całej karty) sprawia, że klikalny obrazek też subtelnie "żyje", podobnie
   jak duży kadr playera reaguje własnym box-shadow na hover. */
.vt-item-thumb {
  position: relative;
  flex-shrink: 0;
  width: 54px;
  height: 88px;
  border-radius: 10px;
  overflow: hidden;
  background: var(--bg-alt);
  box-shadow: 0 4px 10px -6px rgba(0, 0, 0, 0.6);
  transition: box-shadow 0.3s var(--ease), transform 0.3s var(--ease);
}

.vt-item:hover .vt-item-thumb {
  transform: scale(1.03);
}

.vt-item.active .vt-item-thumb {
  box-shadow: 0 0 0 1px var(--accent), 0 4px 14px -6px rgba(255, 77, 31, 0.5);
}

.vt-item-thumb img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

/* Mała "glass" ikonka play na miniaturze — subtelne echo dużego
   glassmorphism przycisku playera (obwódka + blur tła), przeskalowane do
   rozmiaru 54x88px thumbnaila. Nie kopiuje pełnego stylu 1:1 (okrąg + blur
   6px byłby zbyt ciężki na tak małej powierzchni), ale dodaje ten sam
   "szklany" akcent, żeby lista i player czuły się jak ten sam projekt. */
.vt-play-icon {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  background: rgba(12, 11, 10, 0.35);
  border: 1px solid rgba(246, 243, 238, 0.12);
  color: #fff;
  transition: background 0.3s var(--ease);
}

.vt-play-icon svg {
  width: 18px;
  height: 18px;
  filter: drop-shadow(0 1px 3px rgba(0, 0, 0, 0.5));
}

.vt-item:hover .vt-play-icon {
  background: rgba(12, 11, 10, 0.5);
}

.vt-item.active .vt-play-icon {
  background: rgba(255, 77, 31, 0.55);
  border-color: rgba(255, 77, 31, 0.5);
}

.vt-item-meta {
  display: flex;
  flex-direction: column;
  gap: 2px;
  min-width: 0;
}

.vt-item-meta strong {
  font-family: var(--font-display);
  font-size: 14px;
  font-weight: 600;
  color: var(--text);
  text-transform: uppercase;
  letter-spacing: 0.4px;
}

.vt-item-meta span {
  font-size: 12px;
  color: var(--text-muted);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* ==========================================================================
   === CTA BANNER ===
   ========================================================================== */
.cta-banner {
  background: var(--bg-alt);
  padding: 120px 0;
  text-align: center;
}

.cta-banner .section-title {
  max-width: 760px;
  margin-left: auto;
  margin-right: auto;
}

.cta-banner-actions {
  display: flex;
  justify-content: center;
  margin-top: 40px;
}

/* ==========================================================================
   === DLA KOGO (SEKCJA FILTRUJĄCA) — TEST ===
   ========================================================================== */
.fit-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 32px;
  margin-top: 56px;
}

.fit-col {
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-left: 3px solid var(--border);
  border-radius: var(--radius-sm);
  padding: 40px;
}

.fit-col.fit-yes {
  border-left-color: var(--accent);
}

.fit-col h3 {
  font-family: var(--font-display);
  font-size: 20px;
  font-weight: 700;
  text-transform: none;
  letter-spacing: 0.2px;
  margin-bottom: 24px;
}

.fit-list {
  display: flex;
  flex-direction: column;
  gap: 16px;
}

.fit-list li {
  list-style: none;
  padding-left: 30px;
  position: relative;
  color: var(--text-muted);
  font-size: 15px;
  line-height: 1.6;
}

.fit-list li::before {
  position: absolute;
  left: 0;
  top: 0;
  font-family: var(--font-display);
  font-weight: 600;
}

.fit-yes .fit-list li::before {
  content: '✓';
  color: var(--accent);
}

.fit-no .fit-list li::before {
  content: '✕';
  color: var(--text-muted);
}

/* ==========================================================================
   === OFERTA SUMMARY (CO OBEJMUJE / REZULTAT / CENA) — TEST ===
   ========================================================================== */
.offer-summary {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 24px;
  margin: 48px 0 0;
  padding: 32px;
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
}

.offer-summary-item {
  font-size: 14px;
  line-height: 1.7;
  color: var(--text-muted);
}

.offer-summary-item strong {
  display: block;
  color: var(--text);
  font-family: var(--font-display);
  font-size: 13px;
  text-transform: uppercase;
  letter-spacing: 0.5px;
  margin-bottom: 8px;
}

/* Wariant "podświetlony" dla jednej kolumny .offer-summary (np. Cena) —
   wydziela ją wizualnie z pozostałych, tym samym pomarańczowym akcentem
   co .col-accent / .priority-glow */
.offer-summary-item.offer-price-highlight {
  background: var(--bg-alt);
  border: 1px solid var(--accent);
  border-radius: var(--radius-sm);
  padding: 20px;
  box-shadow: 0 0 40px rgba(255, 77, 31, 0.16);
}

/* ==========================================================================
   === NAPISZ DO NAS (CONTACT CHANNELS) — TEST ===
   ========================================================================== */
.contact-channels {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 24px;
  margin-top: 56px;
}

.contact-channel-card {
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  gap: 12px;
  padding: 36px 24px;
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  transition: transform var(--ease) 0.3s, border-color var(--ease) 0.3s;
}

.contact-channel-card:hover {
  transform: translateY(-6px);
  border-color: var(--accent);
}

.contact-channel-icon {
  width: 40px;
  height: 40px;
  color: var(--accent);
}

.contact-channel-card h3 {
  font-family: var(--font-display);
  font-size: 17px;
  font-weight: 700;
  text-transform: none;
  letter-spacing: 0.2px;
}

.contact-channel-card p {
  color: var(--text-muted);
  font-size: 14px;
}

.contact-prompts {
  max-width: 640px;
  margin: 56px auto 0;
  padding: 32px;
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
}

.contact-prompts-title {
  font-family: var(--font-display);
  font-size: 14px;
  font-weight: 700;
  text-transform: none;
  letter-spacing: 0.2px;
  color: var(--text);
  margin-bottom: 18px;
}

.contact-prompts-list {
  display: flex;
  flex-direction: column;
  gap: 14px;
}

.contact-prompts-list li {
  list-style: none;
  padding-left: 24px;
  position: relative;
  color: var(--text-muted);
  font-size: 15px;
  font-style: italic;
  line-height: 1.6;
}

.contact-prompts-list li::before {
  content: '"';
  position: absolute;
  left: 0;
  top: -4px;
  font-family: var(--font-accent);
  font-size: 24px;
  color: var(--accent);
}

/* ==========================================================================
   === REVIEWS GRID (szkolenia.html) ===
   ========================================================================== */
.reviews-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 32px;
}

.reviews-grid .testimonial-card {
  max-width: none;
}

/* ==========================================================================
   === COURSES / SZKOLENIA ===
   ========================================================================== */
.course-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 40px;
}

.course-card {
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  overflow: hidden;
  display: flex;
  flex-direction: column;
  transition: transform var(--ease) 0.35s, border-color var(--ease) 0.35s;
}

.course-card:hover {
  transform: translateY(-6px);
  border-color: var(--accent);
}

.course-card img {
  width: 100%;
  height: 220px;
  object-fit: cover;
}

.course-card-body {
  padding: 32px;
  display: flex;
  flex-direction: column;
  gap: 16px;
  flex: 1;
}

.course-meta {
  display: flex;
  gap: 16px;
  flex-wrap: wrap;
  font-family: var(--font-display);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 1.5px;
  text-transform: uppercase;
  color: var(--text-muted);
}

.course-meta span {
  display: inline-flex;
  align-items: center;
  gap: 6px;
}

.course-card h3 {
  font-size: 22px;
  font-weight: 700;
  text-transform: none;
  letter-spacing: 0.2px;
}

.course-card p {
  color: var(--text-muted);
  font-size: 15px;
  line-height: 1.7;
}

.course-price {
  font-family: var(--font-display);
  font-size: 32px;
  font-weight: 700;
  color: var(--accent);
  margin-top: auto;
}

.course-price span {
  font-size: 14px;
  color: var(--text-muted);
  font-weight: 400;
  font-family: var(--font-body);
}

.course-card .btn {
  margin-top: 8px;
  align-self: flex-start;
}

/* ==========================================================================
   === SCHEDULE TABLE ===
   ========================================================================== */
.schedule-table {
  display: flex;
  flex-direction: column;
  border-top: 1px solid var(--border);
}

.schedule-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 24px;
  padding: 24px 0;
  border-bottom: 1px solid var(--border);
  flex-wrap: wrap;
  transition: background var(--ease) 0.3s;
}

.schedule-row:hover {
  background: rgba(255, 255, 255, 0.02);
}

.schedule-date {
  font-family: var(--font-display);
  font-size: 20px;
  font-weight: 600;
  min-width: 160px;
}

.schedule-date span {
  display: block;
  font-family: var(--font-body);
  font-size: 12px;
  font-weight: 400;
  color: var(--text-muted);
  text-transform: uppercase;
  letter-spacing: 1px;
  margin-top: 4px;
}

.schedule-course {
  flex: 1;
  min-width: 200px;
  font-size: 15px;
  color: var(--text-muted);
}

.schedule-status {
  font-family: var(--font-display);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 1.5px;
  text-transform: uppercase;
  padding: 8px 16px;
  border-radius: var(--radius-lg);
  border: 1px solid var(--border);
}

.schedule-status.open {
  color: var(--accent);
  border-color: var(--accent);
}

/* ==========================================================================
   === WHY GRID (4 col) ===
   ========================================================================== */
.why-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 48px;
}

.why-item {
  text-align: left;
}

.why-icon {
  width: 44px;
  height: 44px;
  color: var(--accent);
  margin-bottom: 20px;
  stroke-width: 1.4;
}

.why-item h3 {
  font-size: 17px;
  font-weight: 700;
  text-transform: none;
  letter-spacing: 0.2px;
  margin-bottom: 12px;
}

.why-item p {
  color: var(--text-muted);
  font-size: 14px;
  line-height: 1.7;
}

/* ==========================================================================
   === FAQ ===
   ========================================================================== */
.faq-list {
  display: flex;
  flex-direction: column;
  border-top: 1px solid var(--border);
  max-width: 820px;
}

.faq-item {
  border-bottom: 1px solid var(--border);
}

.faq-question {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 24px;
  padding: 28px 4px;
  cursor: pointer;
  font-family: var(--font-display);
  font-size: 18px;
  font-weight: 500;
  letter-spacing: 0.3px;
  color: var(--text);
}

.faq-icon {
  width: 28px;
  height: 28px;
  border-radius: 50%;
  border: 1px solid var(--border);
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  position: relative;
  transition: transform var(--ease) 0.35s, background var(--ease) 0.35s,
    border-color var(--ease) 0.35s;
}

.faq-icon::before,
.faq-icon::after {
  content: '';
  position: absolute;
  background: var(--text);
  transition: transform var(--ease) 0.35s, opacity var(--ease) 0.35s;
}

.faq-icon::before {
  width: 10px;
  height: 1px;
}

.faq-icon::after {
  width: 1px;
  height: 10px;
}

.faq-item.open .faq-icon {
  background: var(--accent);
  border-color: var(--accent);
  transform: rotate(180deg);
}

.faq-item.open .faq-icon::after {
  opacity: 0;
}

.faq-answer {
  max-height: 0;
  overflow: hidden;
  transition: max-height var(--ease) 0.4s;
}

.faq-item.open .faq-answer {
  max-height: 400px;
}

.faq-answer-inner {
  padding: 0 4px 28px;
  color: var(--text-muted);
  font-size: 15px;
  line-height: 1.8;
  max-width: 680px;
}

/* ==========================================================================
   === FOOTER ===
   ========================================================================== */
.site-footer {
  position: relative;
  overflow: hidden;
  color: var(--text);
}

.footer-bg {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  z-index: 0;
}

.footer-overlay {
  position: absolute;
  inset: 0;
  z-index: 1;
  background: rgba(12, 11, 10, 0.92);
}

.footer-inner {
  position: relative;
  z-index: 2;
  padding: 100px 0 0;
}

.footer-grid {
  display: grid;
  grid-template-columns: 1.6fr 1fr 1fr 1fr;
  gap: 48px;
  padding-bottom: 64px;
}

.footer-map {
  margin-top: 8px;
  border-radius: var(--radius-sm);
  overflow: hidden;
  border: 1px solid var(--border);
}

.footer-brand .logo {
  margin-bottom: 18px;
}

.footer-brand p {
  color: var(--text-muted);
  font-size: 15px;
  line-height: 1.8;
  max-width: 320px;
  margin-bottom: 28px;
}

.social-icons {
  display: flex;
  gap: 12px;
}

.social-icons a {
  width: 40px;
  height: 40px;
  border-radius: 50%;
  border: 1px solid var(--border);
  display: flex;
  align-items: center;
  justify-content: center;
  transition: background var(--ease) 0.3s, border-color var(--ease) 0.3s;
}

.social-icons a svg {
  width: 16px;
  height: 16px;
}

.social-icons a:hover {
  background: var(--accent);
  border-color: var(--accent);
}

.footer-col h4 {
  font-family: var(--font-display);
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 2px;
  text-transform: uppercase;
  color: var(--accent);
  margin-bottom: 24px;
}

.footer-col ul {
  display: flex;
  flex-direction: column;
  gap: 14px;
}

.footer-col a {
  color: var(--text-muted);
  font-size: 15px;
  transition: color var(--ease) 0.25s;
}

.footer-col a:hover {
  color: var(--text);
}

.newsletter-form {
  display: flex;
  border-bottom: 1px solid var(--border);
  padding-bottom: 12px;
  margin-top: 8px;
}

.newsletter-form input {
  flex: 1;
  font-size: 14px;
  color: var(--text);
  padding: 8px 0;
}

.newsletter-form input::placeholder {
  color: var(--text-muted);
}

.newsletter-form button {
  color: var(--accent);
  display: flex;
  align-items: center;
  justify-content: center;
}

.newsletter-form button svg {
  width: 20px;
  height: 20px;
}

.footer-bottom {
  position: relative;
  z-index: 2;
  border-top: 1px solid var(--border);
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 24px 0;
  font-size: 13px;
  color: var(--text-muted);
  flex-wrap: wrap;
  gap: 12px;
}

.footer-bottom a {
  color: var(--text-muted);
  transition: color var(--ease) 0.25s;
}

.footer-bottom a:hover {
  color: var(--accent);
}

.footer-bottom-links {
  display: flex;
  gap: 24px;
}

/* ==========================================================================
   === BACK TO TOP ===
   ========================================================================== */
.back-to-top {
  position: fixed;
  right: 32px;
  bottom: 32px;
  width: 52px;
  height: 52px;
  border-radius: 50%;
  border: 1px solid var(--border);
  background: var(--bg-alt);
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--text);
  z-index: 900;
  opacity: 0;
  visibility: hidden;
  transform: translateY(12px);
  transition: opacity var(--ease) 0.3s, transform var(--ease) 0.3s,
    background var(--ease) 0.3s, border-color var(--ease) 0.3s,
    visibility var(--ease) 0.3s;
}

.back-to-top.visible {
  opacity: 1;
  visibility: visible;
  transform: translateY(0);
}

.back-to-top:hover {
  background: var(--accent);
  border-color: var(--accent);
}

.back-to-top svg {
  width: 18px;
  height: 18px;
}

/* ==========================================================================
   === RESPONSIVE ===
   ========================================================================== */
@media (max-width: 1024px) {
  .section {
    padding: 100px 0;
  }

  .hero-title {
    font-size: 56px;
  }

  .section-title {
    font-size: 36px;
  }

  .big-type-text {
    font-size: 80px;
  }

  .about-grid {
    grid-template-columns: 1fr;
    gap: 100px;
  }

  .about-grid .about-images {
    position: static;
  }

  .about-images {
    min-height: 460px;
  }

  .services-grid,
  .course-grid {
    grid-template-columns: repeat(2, 1fr);
  }

  .trust-grid {
    grid-template-columns: repeat(2, 1fr);
  }

  .process-grid {
    grid-template-columns: repeat(2, 1fr);
  }

  .offer-summary,
  .contact-channels {
    grid-template-columns: 1fr;
  }

  .why-grid {
    grid-template-columns: repeat(2, 1fr);
  }

  .gallery-grid {
    grid-template-columns: repeat(3, 1fr);
  }

  .mannaz-tile {
    flex-basis: calc((100% - 2 * 16px) / 3);
    max-width: calc((100% - 2 * 16px) / 3);
  }

  .footer-grid {
    grid-template-columns: 1fr 1fr;
  }
}

@media (max-width: 900px) {
  .main-nav {
    display: none;
  }

  .main-nav.open {
    display: flex;
    position: fixed;
    inset: 0;
    z-index: 999;
    background: var(--bg);
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 36px;
  }

  .main-nav.open a {
    font-size: 22px;
  }

  .nav-toggle {
    display: flex;
  }
}

@media (max-width: 768px) {
  .container {
    padding: 0 24px;
  }

  .section {
    padding: 80px 0;
  }

  .hero-title {
    font-size: 46px;
  }

  .hero-content {
    padding: calc(var(--header-h-scrolled) + 40px) 0 80px;
  }

  .hero-arrows {
    display: none;
  }

  .section-title {
    font-size: 30px;
  }

  .big-type-grid {
    grid-template-columns: 1fr;
    gap: 40px;
  }

  .big-type-text {
    font-size: 56px;
    text-align: center;
  }

  .big-type-image {
    height: 360px;
  }

  .services-grid,
  .course-grid,
  .why-grid,
  .reviews-grid,
  .trust-grid,
  .process-grid {
    grid-template-columns: 1fr;
  }

  .fit-grid {
    grid-template-columns: 1fr;
  }

  .fit-col {
    padding: 28px;
  }

  .gallery-grid {
    grid-template-columns: repeat(2, 1fr);
    grid-auto-rows: 200px;
  }

  .gallery-item.span-2 {
    grid-column: span 2;
  }

  .mannaz-tile {
    flex-basis: calc((100% - 16px) / 2);
    max-width: calc((100% - 16px) / 2);
  }

  .mannaz-tile-media {
    height: 220px;
  }

  .vt-wrap {
    grid-template-columns: 1fr;
  }

  .vt-player {
    max-width: 320px;
    width: 100%;
  }

  .vt-list {
    flex-direction: row;
    overflow-x: auto;
    overflow-y: visible;
    max-height: none;
    min-width: 0;
  }

  .vt-item {
    flex-shrink: 0;
    width: 260px;
  }

  /* Cel dotykowy przycisku wyciszenia (36px) jest poniżej zalecanego
     minimum 44px (Apple HIG / Material). Na mobile powiększamy widoczny
     krąg do 44px bez zmiany pozycji górnego-prawego rogu, żeby ułatwić
     trafienie palcem — ikona wewnątrz zostaje tej samej wielkości. */
  .vt-mute-toggle {
    top: 10px;
    right: 10px;
    width: 44px;
    height: 44px;
  }

  .footer-inner {
    padding: 64px 0 0;
  }

  .footer-grid {
    grid-template-columns: 1fr;
    gap: 40px;
  }

  .footer-bottom {
    flex-direction: column;
    align-items: flex-start;
  }

  .gc-mentor {
    padding: 72px 0;
  }

  .stats-row {
    gap: 32px;
  }

  .floating-cta .btn-circle {
    width: 84px;
    height: 84px;
    font-size: 11px;
  }
}

@media (max-width: 480px) {
  .hero-title {
    font-size: 34px;
  }

  .section-title {
    font-size: 24px;
  }

  /* Blur dobrany do 72px+ tekstu robi się nieproporcjonalnie ciężki na
     zmniejszonym, mobilnym tytule — zmniejszamy promień poświaty, żeby
     litery zostały czytelne zamiast rozmytej plamy koloru. */
  .hero-title em,
  .section-title em,
  .gc-reframe-title em,
  .gc-final-cta-title em {
    text-shadow: 0 0 6px rgba(255, 77, 31, 0.6), 0 0 14px rgba(255, 77, 31, 0.35);
  }

  .big-type-text {
    font-size: 38px;
  }

  .testimonial-card {
    padding: 28px 22px;
  }

  .testimonial-text {
    font-size: 18px;
  }

  .stat-number {
    font-size: 38px;
  }

  .gallery-grid {
    grid-template-columns: 1fr;
  }

  .gallery-item.span-2 {
    grid-column: span 1;
  }

  .mannaz-tile {
    flex-basis: 100%;
    max-width: 100%;
  }

  .course-card-body {
    padding: 24px;
  }

  .btn {
    padding: 14px 26px;
    font-size: 12px;
  }

  .btn-circle {
    width: 84px;
    height: 84px;
    font-size: 11px;
  }
}

/* === SZKOLENIA: PROGRAM "FIRST STEP" === */

/* ==========================================================================
   === COMPARE GRID (przed/po, mit vs. rzeczywistość) ===
   ========================================================================== */
.compare-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 40px;
  align-items: stretch;
}

.compare-col {
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  padding: 40px;
}

.compare-col.col-muted {
  background: var(--bg-alt);
  border-style: dashed;
  color: var(--text-muted);
}

.compare-col.col-accent {
  border-color: var(--accent);
  background: var(--bg-card);
  box-shadow: 0 0 40px rgba(255, 77, 31, 0.15);
}

.compare-col h3 {
  font-family: var(--font-display);
  text-transform: uppercase;
  font-size: 22px;
  margin-bottom: 24px;
}

.compare-list {
  display: flex;
  flex-direction: column;
  gap: 16px;
}

.compare-list li {
  display: flex;
  align-items: flex-start;
  gap: 12px;
  font-size: 15px;
  line-height: 1.6;
  color: var(--text);
}

.compare-list.negative li {
  color: var(--text-muted);
}

.compare-list.negative li::before {
  content: '✕';
  color: var(--text-muted);
  flex-shrink: 0;
  font-weight: 700;
}

.compare-list.positive li::before {
  content: '✓';
  color: var(--accent);
  flex-shrink: 0;
  font-weight: 700;
}

/* ==========================================================================
   === PRIORITY GLOW — podświetlenie elementów kluczowych (site-wide) ===
   Ten sam efekt co .col-accent w "First Step": pomarańczowa obwódka
   + delikatna łuna. Dodawać wyłącznie do elementów-kart (mają już
   background + border), max kilka na sekcję/stronę — ma wyróżniać,
   nie tapetować.
   ========================================================================== */
.priority-glow {
  border-color: var(--accent) !important;
  box-shadow: 0 0 40px rgba(255, 77, 31, 0.16);
  position: relative;
}

/* Wariant dla przycisków / CTA — mocniejsza łuna wokół już pomarańczowego tła */
.priority-glow-btn {
  box-shadow: 0 0 30px rgba(255, 77, 31, 0.35);
}

/* ==========================================================================
   === BTN PREMIUM — "prestiżowy", glansowany 3D styl dla najważniejszych CTA
   Nakładka na istniejące .btn / .btn-accent-sm / .ig-follow-cta: zachowuje
   layout (padding, rozmiar, kształt pigułki z var(--radius-lg)), podmienia
   tylko tło/obramowanie/cień na trójwarstwowy gradient + statyczny połysk
   na górnej połowie (pseudo-element ::after) — wzorowane na referencyjnym
   guziku klienta ("KLIKNIJ TUTAJ", Geekwork). Używać WYŁĄCZNIE na
   pojedynczych, najważniejszych CTA danej sekcji — nie tapetować całej
   strony tym stylem. */
.btn-premium,
.btn-premium-sm {
  position: relative;
  background: linear-gradient(180deg, #ff9a5c 0%, var(--accent) 48%, #d93b14 100%);
  border: 1px solid rgba(255, 200, 160, 0.5);
  box-shadow:
    0 10px 24px rgba(255, 77, 31, 0.38),
    inset 0 1px 0 rgba(255, 255, 255, 0.55),
    inset 0 -8px 12px rgba(0, 0, 0, 0.16);
  color: #fff;
  overflow: hidden;
  transition: transform 0.25s var(--ease), box-shadow 0.25s var(--ease),
    background 0.25s var(--ease);
}

/* Połysk: jasny, zanikający pas na górnej połowie guzika — nie zasłania
   tekstu (blaknie do przezroczystości ok. w połowie wysokości),
   pointer-events:none żeby nie przechwytywał kliknięć/hovera. */
.btn-premium::after,
.btn-premium-sm::after {
  content: '';
  position: absolute;
  inset: 0;
  border-radius: inherit;
  background: linear-gradient(
    180deg,
    rgba(255, 255, 255, 0.5) 0%,
    rgba(255, 255, 255, 0) 60%
  );
  pointer-events: none;
}

.btn-premium:hover,
.btn-premium-sm:hover {
  background: linear-gradient(180deg, #ffab78 0%, #ff5b28 48%, #c8340f 100%);
  transform: translateY(-2px);
  box-shadow:
    0 14px 30px rgba(255, 77, 31, 0.48),
    inset 0 1px 0 rgba(255, 255, 255, 0.6),
    inset 0 -8px 12px rgba(0, 0, 0, 0.16);
}

.btn-premium:active,
.btn-premium-sm:active {
  transform: translateY(0) scale(0.97);
}

/* Guzik "Obserwuj nas na Instagramie" (.ig-follow-cta) miał inny kształt
   (--radius-sm, prostokątny) niż reszta guzików na stronie (--radius-lg,
   pigułka) — na wyraźną prośbę dopasowany tu do pigułki. Selektory
   dwuklasowe (specyficzność 0,2,0 / 0,2,1) celowo nadpisują bazowe
   .ig-follow-cta i .ig-follow-cta:hover niezależnie od kolejności reguł
   w pliku. */
.ig-follow-cta.btn-premium {
  border-radius: var(--radius-lg);
  background: linear-gradient(180deg, #ff9a5c 0%, var(--accent) 48%, #d93b14 100%);
  border: 1px solid rgba(255, 200, 160, 0.5);
  box-shadow:
    0 10px 24px rgba(255, 77, 31, 0.38),
    inset 0 1px 0 rgba(255, 255, 255, 0.55),
    inset 0 -8px 12px rgba(0, 0, 0, 0.16);
  overflow: hidden;
}

.ig-follow-cta.btn-premium:hover {
  background: linear-gradient(180deg, #ffab78 0%, #ff5b28 48%, #c8340f 100%);
  color: #fff;
  transform: translate(-50%, -50%) scale(1.05);
  box-shadow:
    0 14px 30px rgba(255, 77, 31, 0.48),
    inset 0 1px 0 rgba(255, 255, 255, 0.6),
    inset 0 -8px 12px rgba(0, 0, 0, 0.16);
}

/* ==========================================================================
   === QUOTE CALLOUT ===
   ========================================================================== */
.quote-callout {
  border-left: 3px solid var(--accent);
  background: var(--bg-alt);
  padding: 28px 32px;
  font-family: var(--font-display);
  font-size: 19px;
  line-height: 1.5;
  color: var(--text);
  margin: 40px 0;
}

.quote-callout strong {
  color: var(--accent);
}

/* Wariant "tight": używany gdy quote-callout kończy listę/kartę i nie
   potrzebuje dolnego marginesu bazowej reguły (zastępuje powtórzony
   inline style="margin-top:32px; margin-bottom:0;") */
.quote-callout--tight {
  margin-top: 32px;
  margin-bottom: 0;
}

/* --- Emotion callout ---
   Zdanie "obrazowo-emocjonalne" (technika 3 pięter korzyści — funkcja/
   obraz/emocja) wyraźnie oddzielone od reszty opisu, żeby się z nim nie
   zlewało. Ten sam język wizualny co .quote-callout (border-left w
   kolorze akcentu), ale lżejszy — bez własnego tła — bo domyślnie ląduje
   WEWNĄTRZ .service-item, który już ma tło .stage-block .service-item
   (var(--bg-alt)); pełne tło quote-callout (to samo bg-alt) zlałoby się
   z kartą. Kursywa dodatkowo odróżnia ten fragment od reszty opisu. */
.emotion-callout {
  display: block;
  margin-top: 14px;
  padding-left: 14px;
  border-left: 2px solid var(--accent);
  font-style: italic;
  color: var(--text);
}

/* Wariant pełnej szerokości — używany gdy zdanie stoi jako osobny akapit
   w bloku etapu (nie wewnątrz małego kafelka usługi), więc może dostać
   trochę więcej oddechu i nieco większy rozmiar czcionki. */
.emotion-callout--block {
  margin-top: 24px;
  padding: 2px 0 2px 18px;
  font-size: 16px;
  line-height: 1.6;
}

/* ==========================================================================
   === STAGE TAB: "WYBUCH PIKSELI" PRZY DOTARCIU LINII CZASU DO TYTUŁU ===
   Gdy przewijanie strony wnosi kolejny tytuł etapu (h3.stage-title-target)
   w pole aktywacji, JS (initStageTimeline w js/script.js) dokleja
   tymczasowy kontener .stage-tab-burst wypełniony drobnymi kwadracikami
   .stage-tab-particle, które rozlatują się promieniście od środka celu i
   gasną — po zakończeniu animacji JS usuwa cały kontener z DOM. Celem jest
   teraz badge etapu (.stage-panel-badge, ma position:relative), NIE tytuł
   h3 — więc kontener burst (position:absolute; inset:0) pokrywa dokładnie
   obszar badge'a, a pojedyncze cząsteczki i tak "wylatują" poza jego
   granice dzięki overflow:visible. Nazwy klas
   (.stage-tab-burst/.stage-tab-particle) zachowane bez zmian z poprzedniej
   wersji (kliknięcie kafelka) — funkcja spawnStageTabParticleBurst() jest
   generyczna i przyjmuje dowolny cel.
   ========================================================================== */
.stage-tab-burst {
  position: absolute;
  inset: 0;
  pointer-events: none;
  overflow: visible;
  z-index: 2;
}

.stage-tab-particle {
  position: absolute;
  top: 50%;
  left: 50%;
  width: var(--size, 5px);
  height: var(--size, 5px);
  background: var(--accent);
  border-radius: 1px;
  opacity: 0;
  transform: translate(-50%, -50%) translate(0, 0) rotate(0deg) scale(1);
  box-shadow: 0 0 6px rgba(255, 77, 31, 0.7);
  animation: stage-tab-particle-burst 0.65s cubic-bezier(0.16, 1, 0.3, 1) forwards;
  animation-delay: var(--delay, 0s);
}

@keyframes stage-tab-particle-burst {
  0% {
    opacity: 1;
    transform: translate(-50%, -50%) translate(0, 0) rotate(0deg) scale(1);
  }
  65% {
    opacity: 1;
  }
  100% {
    opacity: 0;
    transform: translate(-50%, -50%) translate(var(--dx), var(--dy)) rotate(var(--rot)) scale(0.4);
  }
}

@media (prefers-reduced-motion: reduce) {
  .stage-tab-particle {
    animation: none;
    opacity: 0;
  }
}

/* ==========================================================================
   === PROGRAM SECTION — wyśrodkowany layout ===
   Od nagłówka "04 // PROGRAM" po ostatni akapit ostatniego etapu: nagłówki,
   wstępy i treść każdego etapu wyśrodkowane. Listy z checkmarkami
   (.compare-list) i rząd "Pierwszy projekt" (.stage-milestone) zostają
   wewnętrznie wyrównane do lewej — z ikoną obok tekstu wyśrodkowanie
   tekstu wygląda nieczytelnie, więc te dwa wyjątki celowo pomijam.
   ========================================================================== */
#program .container {
  text-align: center;
  position: relative;
}

#program .container > .eyebrow {
  justify-content: center;
}

#program .section-sub {
  margin-left: auto;
  margin-right: auto;
}

#program .stage-panel-header p {
  margin-left: auto;
  margin-right: auto;
}

#program .stage-block-head {
  justify-content: center;
}

#program .stage-block-lead,
#program .stage-block > p {
  margin-left: auto;
  margin-right: auto;
}

#program .service-icon {
  margin-left: auto;
  margin-right: auto;
}

#program .process-step {
  text-align: center;
}

#program .cadence-row {
  justify-content: center;
}

#program .compare-list {
  margin-left: auto;
  margin-right: auto;
}

#program .compare-list li {
  text-align: left;
}

#program .stage-milestone-body {
  text-align: left;
}

/* Kontener dwukolumnowy: stały pasek-oś czasu po lewej (.stage-rail) +
   kolumna paneli (.stage-panels). align-items domyślne (stretch) —
   .stage-rail nie ma żadnej treści "w przepływie" (wszystkie dzieci są
   position:absolute), więc jego wysokość automatycznie rozciąga się do
   wysokości .stage-panels (najwyższego elementu w wierszu flex) bez
   potrzeby liczenia tego w JS. Na mobile (patrz RESPONSIVE) pasek jest
   całkowicie ukryty i układ wraca do zwykłej kolumny pełnej szerokości. */
.stage-timeline {
  position: relative;
  display: flex;
  align-items: stretch;
  gap: 40px;
}

.stage-rail {
  position: relative;
  flex: 0 0 24px;
  width: 24px;
}

.stage-panels {
  position: relative;
  flex: 1 1 auto;
  min-width: 0;
}

/* Wszystkie etapy są teraz WIDOCZNE NARAZ, jeden pod drugim (lista, bez
   klikania w kafelki) — to była wyraźna prośba: poprzedni system zakładek
   (jeden panel na raz, reszta ukryta) był nieintuicyjny. Wejście na scenę
   każdego panelu obsługuje ogólny, już istniejący sitewide mechanizm
   .reveal/.visible (patrz initScrollReveal w js/script.js) — panele mają
   klasę .reveal w HTML, więc fadeInStage/aktywność przez .active nie są
   już potrzebne do WIDOCZNOŚCI. Klasa .active zostaje wyłącznie jako
   znacznik stanu używany gdzie indziej (np. pierwszy panel), ale NIE
   steruje już display — patrz brak reguły .stage-panel.active { display }
   poniżej. */
.stage-panel {
  display: block;
  position: relative;
}

/* Wyraźna, czytelna separacja jednego etapu od drugiego podczas
   przewijania: teraz zapewniają ją RAZEM dwa elementy — (1) spory odstęp
   pionowy między panelami (margin-top poniżej) i (2) stały pasek
   .stage-rail po lewej, widoczny NIEPRZERWANIE przez całą sekcję (nie
   tylko w przerwach jak poprzednio), z węzłem zapalającym się przy każdym
   tytule. Treść/układ WEWNĄTRZ każdego panelu pozostają bez zmian. */
.stage-panel + .stage-panel {
  margin-top: 140px;
}

/* ==========================================================================
   === POŚWIATA TŁA CAŁEGO PANELU (.stage-panel), ZSYNCHRONIZOWANA Z LINIĄ
   CZASU I WYBUCHEM PIKSELI ===
   Trzeci element tej samej, jednej zsynchronizowanej animacji: gdy
   przewijanie strony wnosi tytuł etapu (h3.stage-title-target) w pole
   aktywacji, JS (initStageTimeline w js/script.js) dokłada klasę
   .is-glowing DOKŁADNIE w tym samym momencie co
   .stage-panel-badge.is-highlighted i spawnStageTabParticleBurst()
   (odpalany teraz na badge'u, nie na tytule).
   Efekt dotyczy WYŁĄCZNIE tła zewnętrznego kontenera .stage-panel
   (pseudo-element ::before, position:absolute, inset:0, pointer-events:none,
   bez z-index — maluje się jako "pierwsze dziecko" więc realna treść
   panelu i tak renderuje się nad nim) — żadne elementy wewnętrzne/kafelki
   (.stage-block itd.) nie są modyfikowane. Poświata jest RADIALNA,
   zakotwiczona (przez zmienną CSS --glow-origin-y) DOKŁADNIE w pozycji
   prostokąta h3.stage-title-target — nie w statycznej górnej krawędzi
   panelu. JS mierzy realną pozycję tego tytułu względem .stage-panel i
   ustawia --glow-origin-y w TYM SAMYM momencie co dodanie klasy
   .is-glowing, więc światło zawsze "wypływa" dokładnie z tytułu etapu,
   niezależnie od długości nagłówka/łamania tekstu na różnych szerokościach
   ekranu. Fallback 12% na wypadek braku JS — sensowne przybliżenie, bo
   tytuł zwykle jest blisko górnej krawędzi panelu. Miękka poświata
   pomarańczowa (var(--accent)) przenika od miejsca tytułu w dół i płynnie
   gaśnie — subtelny, "premium" błysk, nie agresywna migawka.
   Moc poświaty podniesiona o +20% na wyraźną prośbę (0.16→0.192,
   0.07→0.084) względem pierwotnych wartości — reszta animacji
   (timing, easing, zasięg elipsy) bez zmian. */
.stage-panel::before {
  content: '';
  position: absolute;
  inset: 0;
  pointer-events: none;
  border-radius: var(--radius-sm);
  background: radial-gradient(
    ellipse 90% 55% at 50% var(--glow-origin-y, 12%),
    rgba(255, 77, 31, 0.192) 0%,
    rgba(255, 77, 31, 0.084) 45%,
    rgba(255, 77, 31, 0) 78%
  );
  opacity: 0;
}

.stage-panel.is-glowing::before {
  animation: stagePanelGlow 1.5s ease-out;
}

@keyframes stagePanelGlow {
  0% {
    opacity: 0;
    transform: translateY(-18px);
  }
  25% {
    opacity: 1;
  }
  100% {
    opacity: 0;
    transform: translateY(14px);
  }
}

.stage-panel-header {
  position: relative;
  margin-bottom: 48px;
}

/* Etykieta etapu ("Etap I"/"Etap II"/"Etap III"/"Bonus"/"Certyfikat"), NAD
   tytułem każdego panelu, na własnej linii (display:block + width:fit-content
   + margin:auto, żeby nadal wyśrodkowywała się przez odziedziczony
   text-align:center z #program .container, ale bez "sklejania się" w tym
   samym wierszu co h3 — dwa sąsiadujące display:inline-block elementy
   zostałyby wyrenderowane obok siebie w jednej linii, a na wyraźną prośbę
   badge ma być NAD tytułem). TO WŁAŚNIE TEN ELEMENT jest teraz punktem
   docelowym animowanej linii-łącznika (patrz sekcja STAGE RAIL TIMELINE
   niżej) — ramka/tło + stan .is-highlighted + wybuch pikseli
   (spawnStageTabParticleBurst w js/script.js) działają TUTAJ, NIE na h3
   (h3 pozostaje zwykłym, dużym tytułem bez własnej ramki/podświetlenia). */
.stage-panel-badge {
  display: block;
  width: fit-content;
  margin: 0 auto 20px;
  position: relative;
  font-family: var(--font-display);
  font-size: 13px;
  font-weight: 600;
  letter-spacing: 1.2px;
  text-transform: uppercase;
  color: var(--accent);
  background: var(--accent-dim);
  border: 1px solid rgba(255, 77, 31, 0.35);
  border-radius: var(--radius-lg);
  padding: 5px 14px;
  transition:
    background-color 0.28s ease-out,
    border-color 0.28s ease-out,
    color 0.28s ease-out,
    box-shadow 0.28s ease-out;
}

/* Stan "podświetlony" — dodawany przez JS (initStageTimeline) w momencie
   aktywacji etapu, DOKŁADNIE synchronicznie z "zapaleniem się" węzła na
   pasku bocznym (.stage-rail-node.is-active) i poświatą tła panelu
   (.stage-panel.is-glowing). Kontrast: badge to 13px/700 uppercase — NIE
   kwalifikuje się jako "large text" wg WCAG, więc wymagany próg to 4.5:1
   (nie 3:1). Prawie-czarny tekst (#0c0b0a) na #ff4d1f daje ~5.9:1,
   bezpiecznie ponad próg w OBU trybach (dark/light). */
.stage-panel-badge.is-highlighted {
  background: var(--accent);
  border-color: var(--accent);
  color: #0c0b0a;
  box-shadow: 0 0 20px rgba(255, 77, 31, 0.5);
}

.stage-panel-header h3,
.stage-panel-header h2 {
  font-family: var(--font-display);
  font-size: 42px;
  font-weight: 700;
  text-transform: none;
  letter-spacing: -0.3px;
  margin-bottom: 16px;
}

.stage-panel-header p {
  color: var(--text-muted);
  font-size: 17px;
  max-width: 640px;
  line-height: 1.7;
}

/* ==========================================================================
   === STAGE RAIL TIMELINE — stały, pionowy pasek po lewej stronie,
   widoczny NIEPRZERWANIE przez całą sekcję ===
   Zastępuje poprzedni system .stage-gap, gdzie linia/węzeł były widoczne
   TYLKO wewnątrz krótkich, 140px przerw między panelami (czyli w praktyce
   znikały z widoku na długie odcinki przewijania wewnątrz samych paneli).
   Na wyraźną prośbę: pasek ma "iść po lewej stronie i być widoczny cały
   czas" — .stage-rail jest teraz osobną kolumną (patrz .stage-timeline
   wyżej), rozciągniętą przez flexbox do PEŁNEJ wysokości .stage-panels,
   więc tor linii (.stage-rail-track) towarzyszy treści przez całą sekcję,
   nie tylko w przerwach.

   Węzły (.stage-rail-node, po jednym NA TYTUŁ etapu, nie na przerwę —
   ich liczba dopasowuje się automatycznie do liczby paneli) są
   pozycjonowane przez JS (initStageTimeline w js/script.js, funkcja
   positionRailNodes) na wysokości DOKŁADNIE odpowiadającej środkowi
   każdego h3.stage-title-target — mierzone przez getBoundingClientRect
   względem .stage-rail, więc węzły zostają wyrównane do tytułów
   niezależnie od tego, jak długi jest tekst nad nimi czy jak łamie się na
   różnych szerokościach ekranu.

   Wypełnienie paska (.stage-rail-fill) jest CIĄGŁE — JS (updateRailFill)
   ustawia jego wysokość na KAŻDĄ klatkę scrolla (przez
   requestAnimationFrame), jako bezpośrednią funkcję pozycji przewijania
   względem tej samej linii odniesienia, której używa IntersectionObserver
   do aktywacji tytułów. Dlatego CELOWO BRAK transition na height —
   jakikolwiek transition walczyłby z aktualizacjami co klatkę i
   wprowadzałby dokładnie ten "zacinający się" efekt, który to rozwiązanie
   ma eliminować. Gdy ciągłe wypełnienie mija węzeł danego etapu (mniej
   więcej w tym samym momencie, gdy IntersectionObserver aktywuje jego
   tytuł), węzeł "zapala się" (.is-active) DOKŁADNIE w tym samym momencie
   co .stage-panel-badge.is-highlighted, wybuch pikseli
   (spawnStageTabParticleBurst, teraz na badge'u) i poświata tła panelu
   (.stage-panel.is-glowing).
   ========================================================================== */
.stage-rail-track {
  position: absolute;
  top: 4px;
  bottom: 4px;
  left: 50%;
  width: 2px;
  transform: translateX(-50%);
  /* Zwykłe --border (opacity 0.1) jest zbyt subtelne, żeby przy 2px
     szerokości pełnić rolę czytelnego "toru" linii czasu widocznego
     ZANIM się wypełni. --border-strong (opacity 0.24, theme-aware) daje
     wyraźnie dostrzegalny tor w OBU trybach, nadal wyraźnie "cichszy" niż
     wypełniony, pomarańczowy odcinek poniżej. */
  background: var(--border-strong);
  overflow: hidden;
  border-radius: 2px;
}

.stage-rail-fill {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 0;
  background: linear-gradient(180deg, var(--accent), var(--accent-2));
  /* Dwuwarstwowa poświata (ciasny rdzeń + szersze, delikatniejsze halo) —
     ta sama intensywność co reszta zsynchronizowanej animacji
     (h3.is-highlighted ma 20px, więc ten odcinek nie może być słabszy). */
  box-shadow: 0 0 6px rgba(255, 77, 31, 0.85), 0 0 18px rgba(255, 77, 31, 0.45);
  /* Wysokość w px, ustawiana CO KLATKĘ scrolla z JS (updateRailFill w
     js/script.js) — celowo BEZ transition: wypełnienie ma nadążać za
     przewijaniem jeden-do-jednego, a transition wprowadzałby opóźnienie/
     "doganianie" (dokładnie ten stutter-efekt, którego się pozbywamy). */
  transition: none;
}

.stage-rail-node {
  position: absolute;
  left: 50%;
  /* top ustawiany z JS (positionRailNodes), wyrównany do środka
     odpowiadającego mu h3.stage-title-target. Wartość startowa 0 to
     tylko bezpieczny fallback zanim JS zdąży policzyć realną pozycję. */
  top: 0;
  width: 16px;
  height: 16px;
  transform: translate(-50%, -50%);
}

.stage-rail-node-glow {
  position: absolute;
  inset: -10px;
  border-radius: 50%;
  background: var(--accent);
  opacity: 0;
  filter: blur(6px);
  transition: opacity 0.3s ease-out;
}

.stage-rail-node-core {
  position: absolute;
  inset: 2px;
  border-radius: 50%;
  background: var(--bg-card);
  border: 2px solid var(--border-strong);
  transition: background 0.3s ease-out, border-color 0.3s ease-out,
    box-shadow 0.3s ease-out, transform 0.3s ease-out;
}

.stage-rail-node.is-active .stage-rail-node-glow {
  opacity: 0.5;
}

.stage-rail-node.is-active .stage-rail-node-core {
  background: var(--accent);
  border-color: var(--accent);
  box-shadow: 0 0 10px rgba(255, 77, 31, 0.85);
  transform: scale(1.15);
}

/* Tytuł etapu WEWNĄTRZ .stage-panel-header (np. "Fundamenty", "Pierwszy
   tatuaż i praca z klientem", "Marka i marketing", "Materiały na start") —
   na wyraźną prośbę h3 NIE ma już własnej ramki/tła/stanu "podświetlony".
   Cała ta funkcja (widoczna prostokątna ramka + stan .is-highlighted +
   wybuch pikseli) została przeniesiona na badge NAD tytułem (patrz
   .stage-panel-badge wyżej) — to badge się teraz "zapala", nie tytuł.
   Klasa .stage-title-target zostaje w HTML wyłącznie jako hak dla JS
   (initStageTimeline: IntersectionObserver + wyliczanie --glow-origin-y
   względem pozycji tytułu) — bez żadnej dodatkowej stylistyki poza
   ogólną regułą .stage-panel-header h3 powyżej. */

@media (prefers-reduced-motion: reduce) {
  .stage-rail-fill {
    transition: none;
  }

  .stage-rail-node-glow,
  .stage-rail-node-core {
    transition: none;
  }

  .stage-panel.is-glowing::before {
    animation: none !important;
    opacity: 0;
  }

  /* Podświetlenie badge'a etapu ma być natychmiastowe, bez animacji
     przejścia — spójnie z resztą reguł prefers-reduced-motion powyżej. */
  .stage-panel-badge {
    transition: none;
  }
}

/* ==========================================================================
   === ETAP "CERTYFIKAT" (etap-5) — układ zdjęcie + tekst ===
   Ostatni panel programu, poświęcony certyfikatowi ukończenia. Zdjęcie to
   teraz DWA prawdziwe zdjęcia certyfikatu (images/certyfikat-1.jpg —
   ujęcie produktowe, images/certyfikat-2.jpg — absolwentka trzymająca
   certyfikat), które płynnie przenikają się w pętli (.cert-crossfade,
   patrz niżej) zamiast pokazywać jedno statyczne ujęcie. .stage-certificate
   to lokalny, dwukolumnowy układ (zdjęcie po lewej / tekst po prawej, te
   same proporcje 0.85fr/1.15fr co .gc-mentor-grid) osadzający tę ramkę
   wewnątrz panelu etapu. */
.stage-certificate {
  display: grid;
  grid-template-columns: 0.85fr 1.15fr;
  gap: 56px;
  align-items: center;
  text-align: left;
  margin-top: 8px;
}

/* --- Crossfade dwóch zdjęć certyfikatu ---
   Dwa <img> nałożone na siebie (position: absolute, ten sam obszar),
   każdy ze swoją animacją opacity przesuniętą tak, żeby jeden znikał
   dokładnie w tempie, w jakim drugi się pojawia — czyli klasyczny,
   płynny crossfade, bez migotania i bez momentu "pustej" klatki.
   9s pełny cykl: ~4s ekspozycji na zdjęcie, ~0.9s płynnego przejścia. */
.cert-crossfade {
  position: relative;
  width: 100%;
  max-width: 380px;
  aspect-ratio: 3 / 4;
  margin: 0 auto;
  border-radius: 20px;
  overflow: hidden;
  border: 1px solid var(--border);
  box-shadow: 0 30px 60px -30px rgba(0, 0, 0, 0.55), 0 0 40px rgba(255, 77, 31, 0.12);
}

.cert-crossfade-img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center top;
}

.cert-crossfade-img--a {
  animation: cert-crossfade-a 9s ease-in-out infinite;
}

.cert-crossfade-img--b {
  animation: cert-crossfade-b 9s ease-in-out infinite;
}

@keyframes cert-crossfade-a {
  0%, 40% { opacity: 1; }
  50%, 90% { opacity: 0; }
  100% { opacity: 1; }
}

@keyframes cert-crossfade-b {
  0%, 40% { opacity: 0; }
  50%, 90% { opacity: 1; }
  100% { opacity: 0; }
}

/* Użytkownicy preferujący ograniczony ruch: zero animacji, statycznie
   pokazujemy pierwsze zdjęcie (ujęcie produktowe certyfikatu). */
@media (prefers-reduced-motion: reduce) {
  .cert-crossfade-img--a,
  .cert-crossfade-img--b {
    animation: none;
  }
  .cert-crossfade-img--a { opacity: 1; }
  .cert-crossfade-img--b { opacity: 0; }
}

.stage-certificate-body {
  display: flex;
  flex-direction: column;
  gap: 20px;
}

.stage-certificate-body > p {
  color: var(--text-muted);
  font-size: 17px;
  line-height: 1.7;
  margin: 0;
}

.stage-certificate-list {
  display: flex;
  flex-direction: column;
  gap: 14px;
  margin: 0;
  padding: 0;
  list-style: none;
}

.stage-certificate-list li {
  position: relative;
  padding-left: 26px;
  color: var(--text-muted);
  font-size: 16px;
  line-height: 1.6;
}

.stage-certificate-list li::before {
  content: '';
  position: absolute;
  left: 0;
  top: 9px;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--accent);
}

.stage-certificate-list strong {
  color: var(--text);
}

@media (max-width: 900px) {
  .stage-certificate {
    grid-template-columns: 1fr;
    gap: 32px;
  }

  .stage-certificate-photo .cert-crossfade {
    max-width: 320px;
  }
}

/* ==========================================================================
   === SUBSECTION TITLE ===
   ========================================================================== */
.subsection-title {
  font-family: var(--font-display);
  font-size: 22px;
  font-weight: 700;
  text-transform: none;
  letter-spacing: -0.2px;
  margin: 48px 0 28px;
}

.subsection-title:first-child {
  margin-top: 0;
}

/* ==========================================================================
   === SPECIALIZATION PATH — "winding journey" SVG diagram ===
   Zastępuje płaski rząd tagów: jedna wijąca się linia prowadzi przez
   7 stylów tatuażu i kończy się na większym, świecącym węźle docelowym
   ("Twój Największy Potencjał"). Cała grafika (linia + węzły + etykiety)
   żyje w jednym <svg viewBox>, więc skaluje się płynnie bez JS.
   ========================================================================== */
.spec-path {
  width: 100%;
  margin: 28px 0 8px;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
}

.spec-path-svg {
  display: block;
  width: 100%;
  height: auto;
  overflow: visible;
}

.spec-path-svg--desktop {
  aspect-ratio: 1200 / 300;
  min-height: 140px;
}

.spec-path-svg--mobile {
  aspect-ratio: 320 / 900;
  min-height: 480px;
  display: none;
}

.spec-path-line {
  stroke: var(--border);
  stroke-width: 1.5;
  stroke-linecap: round;
  fill: none;
  vector-effect: non-scaling-stroke;
}

.spec-node circle {
  fill: var(--bg-card);
  stroke: var(--border);
  stroke-width: 1.5;
  vector-effect: non-scaling-stroke;
  transition: stroke 0.3s var(--ease);
}

.spec-node text {
  font-family: var(--font-display);
  font-size: 16px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 1px;
  fill: var(--text-muted);
}

.spec-node--dest circle.spec-node-dest-glow {
  fill: var(--accent);
  opacity: 0.35;
}

.spec-node--dest circle.spec-node-dest-ring {
  fill: var(--accent-dim);
  stroke: var(--accent);
  stroke-width: 1.5;
  vector-effect: non-scaling-stroke;
}

.spec-node--dest circle.spec-node-dest-core {
  fill: var(--accent);
}

.spec-node--dest .spec-node-dest-label {
  font-family: var(--font-display);
  font-size: 18px;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 1.2px;
  fill: var(--text);
}

/* Tablet "tweener" band: SVG text scales down with the whole graphic,
   so nudge font-size up here to keep labels legible as the card narrows. */
@media (min-width: 769px) and (max-width: 1024px) {
  .spec-node text {
    font-size: 18px;
  }

  .spec-node--dest .spec-node-dest-label {
    font-size: 20px;
  }
}

@media (max-width: 768px) {
  .spec-path {
    margin: 20px 0 4px;
  }

  .spec-path-svg--desktop {
    display: none;
  }

  .spec-path-svg--mobile {
    display: block;
    max-width: 340px;
    margin: 0 auto;
  }

  .spec-node text {
    font-size: 15px;
  }

  .spec-node--dest .spec-node-dest-label {
    font-size: 17px;
  }
}

/* Narrow phones: card padding eats into available width, so the SVG
   scale factor drops further — bump font-size once more. */
@media (max-width: 400px) {
  .spec-node text {
    font-size: 16px;
  }

  .spec-node--dest .spec-node-dest-label {
    font-size: 18px;
  }
}

@media (prefers-reduced-motion: reduce) {
  .spec-node circle {
    transition: none;
  }
}

/* ==========================================================================
   === STAGE BLOCK — czytelne "okienka" dla podsekcji Etapu I ===
   Owija każdą podsekcję (Bezpieczny start / Poznaj technikę / Specjalizacja /
   Zaplecze cyfrowe) we własną kartę z numerowanym nagłówkiem, żeby długi
   panel przestał być jednolitą ścianą tekstu. Nie zmienia globalnych
   .services-grid / .service-item (używanych też gdzie indziej) — stylowanie
   kart działa tylko przez selektor potomny .stage-block .service-item.
   ========================================================================== */
.stage-block {
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  padding: 40px;
  margin-top: 32px;
}

.stage-panel-header + .stage-banner + .stage-block,
.stage-panel-header + .stage-block {
  margin-top: 40px;
}

.stage-block-head {
  display: flex;
  align-items: center;
  gap: 16px;
  margin-bottom: 28px;
}

.stage-block-num {
  flex: 0 0 auto;
  width: 40px;
  height: 40px;
  border-radius: 50%;
  border: 1px solid var(--accent);
  color: var(--accent);
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 15px;
}

.stage-block-head .subsection-title {
  margin: 0;
}

.stage-block-lead {
  color: var(--text-muted);
  font-size: 17px;
  line-height: 1.7;
  max-width: 680px;
  margin: 0 0 32px;
}

/* Kartuje siatki usług WYŁĄCZNIE wewnątrz .stage-block — .services-grid /
   .service-item poza tym kontekstem (np. trust-grid na stronie głównej)
   zostają bez zmian. */
.stage-block .services-grid {
  grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
  gap: 24px;
}

/* Wariant 2×2 dla siatek dokładnie 4-elementowych ("Bezpieczny start" i
   "Poznaj każdą technikę" w Etapie I) — auto-fit z minmax(220px,1fr)
   potrafił przy niektórych szerokościach kontenera dopasować 3 kolumny,
   dając nieestetyczny układ "3 na górze + 1 samotny na dole". Sztywne 2
   kolumny na wyraźną prośbę + większy padding/gap na kafelek (bliżej skali
   samego .stage-block, 40px), żeby kafelki czuły się tak przestronne jak
   reszta przebudowanej sekcji, nie jak ciasnu wypełniacz. */
.stage-block .services-grid--2col {
  grid-template-columns: repeat(2, 1fr);
  gap: 28px;
}

.stage-block .services-grid--2col .service-item {
  padding: 36px;
}

.stage-block .services-grid--2col .service-item p {
  font-size: 15px;
  line-height: 1.7;
}

/* Poniżej 768px zbiera to już istniejąca ogólna reguła mobilna
   ".stage-block .services-grid { grid-template-columns: 1fr }" niżej w
   pliku (ta sama specyficzność, dalej w kaskadzie = wygrywa) — więc wariant
   --2col na telefonie i tak poprawnie spada do jednej kolumny bez
   dodatkowej, zdublowanej reguły tutaj. */
.stage-block .service-item {
  background: var(--bg-alt);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  padding: 28px;
  transition: border-color 0.3s var(--ease);
}

.stage-block .service-item:hover {
  border-color: var(--accent);
}

.stage-block .service-item h3 {
  font-size: 18px;
}

.stage-block .service-icon {
  margin-bottom: 16px;
}

.stage-block .stage-block-lead:last-child {
  margin-bottom: 0;
}

/* Wariant wyróżniony — "Pierwszy projekt", duży kamień milowy w Etapie I */
.stage-milestone {
  background: var(--bg-alt);
  border: 1px solid var(--accent);
  border-radius: var(--radius-sm);
  padding: 40px;
  margin-top: 32px;
  display: flex;
  align-items: flex-start;
  gap: 24px;
  box-shadow: 0 0 40px rgba(255, 77, 31, 0.16);
}

.stage-milestone-icon {
  flex: 0 0 auto;
  width: 56px;
  height: 56px;
  color: var(--accent);
}

.stage-milestone-body h4 {
  font-family: var(--font-display);
  font-size: 22px;
  font-weight: 700;
  text-transform: none;
  letter-spacing: -0.2px;
  margin: 0 0 12px;
}

.stage-milestone-body p {
  margin: 0;
  color: var(--text-muted);
  font-size: 17px;
  line-height: 1.7;
}

@media (max-width: 1024px) {
  .stage-block {
    padding: 32px;
  }

  .stage-milestone {
    padding: 32px;
  }
}

@media (max-width: 768px) {
  .stage-block {
    padding: 24px;
    margin-top: 24px;
  }

  .stage-block-num {
    width: 34px;
    height: 34px;
    font-size: 13px;
  }

  .stage-block .services-grid {
    grid-template-columns: 1fr;
    gap: 16px;
  }

  .stage-milestone {
    flex-direction: column;
    padding: 24px;
    margin-top: 24px;
  }

  .stage-milestone-icon {
    width: 44px;
    height: 44px;
  }
}

/* ==========================================================================
   === STAGE PANEL — "PREMIUM CARD" UPGRADE (refresh wizualny, lipiec 2026) ===
   Wyłącznie warstwa wizualna: samego .stage-panel dotąd nie było widać jako
   osobnej "karty" (display:block, brak tła/obwódki/cienia) — teraz każdy
   etap (Etap I/II/III/Bonus/Certyfikat) dostaje własne, wyraźnie
   wydzielone tło + duże, eleganckie zaokrąglenie + bardzo subtelny cień,
   żeby czytać się jako jeden, spójny, "premium" blok, tak jak proszono
   (inspiracja: Apple / Framer / Linear / Vercel / Stripe — dużo przestrzeni,
   mało ramek). CAŁA logika JS (is-glowing, --glow-origin-y,
   .stage-panel::before poświata) zostaje nietknięta — ::before nadal maluje
   się jako pierwsze dziecko tego samego elementu, więc świeci ponad nowym
   tłem karty dokładnie tak jak wcześniej ponad przezroczystym tłem. */
.stage-panel {
  background: linear-gradient(180deg, var(--bg-card) 0%, var(--bg-alt) 100%);
  border: 1px solid var(--border);
  border-radius: 28px;
  padding: 56px 64px 64px;
  box-shadow:
    0 40px 80px -40px rgba(0, 0, 0, 0.5),
    0 1px 0 rgba(255, 255, 255, 0.03) inset;
  overflow: hidden;
}

.stage-panel::before {
  border-radius: 28px;
}

@media (max-width: 1024px) {
  .stage-panel {
    padding: 44px 40px 48px;
  }
}

@media (max-width: 768px) {
  .stage-panel {
    padding: 32px 24px 36px;
    border-radius: 20px;
  }

  .stage-panel::before {
    border-radius: 20px;
  }
}

/* ==========================================================================
   === PROCESS FLOW ===
   ========================================================================== */
.process-flow {
  display: flex;
  align-items: stretch;
  gap: 20px;
}

.process-step {
  flex: 1;
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  padding: 32px;
  text-align: left;
}

.process-step .step-number {
  font-family: var(--font-display);
  font-size: 40px;
  font-weight: 700;
  color: var(--accent);
  display: block;
  margin-bottom: 16px;
}

.process-step h3 {
  font-size: 18px;
  font-weight: 700;
  text-transform: none;
  margin-bottom: 12px;
}

.process-step p {
  color: var(--text-muted);
  font-size: 14px;
  line-height: 1.7;
}

.process-arrow {
  flex-shrink: 0;
  width: 32px;
  height: 32px;
  color: var(--accent);
  display: flex;
  align-items: center;
  justify-content: center;
  /* .process-flow ma align-items: stretch, ale ta strzałka ma własną,
     stałą wysokość (32px) — przy kartach różnej wysokości (bo tekst w
     każdym kroku jest inny) nie rozciąga się razem z nimi i domyślnie
     ląduje przy górnej krawędzi wiersza zamiast na środku. align-self
     wymusza wyśrodkowanie względem faktycznej (rozciągniętej) wysokości
     sąsiednich kafelków, niezależnie od różnic w długości tekstu. */
  align-self: center;
}

/* ==========================================================================
   === CADENCE ROW (rytm zajęć / korepetycji) ===
   ========================================================================== */
.cadence-row {
  display: flex;
  gap: 56px;
  align-items: flex-start;
  flex-wrap: wrap;
}

.cadence-col {
  display: flex;
  gap: 16px;
  align-items: flex-start;
}

.cadence-label {
  writing-mode: horizontal-tb;
  padding: 10px 18px;
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  font-family: var(--font-display);
  font-size: 12px;
  text-transform: uppercase;
  letter-spacing: 1.5px;
  color: var(--text-muted);
  white-space: nowrap;
  align-self: center;
}

.cadence-icons {
  display: flex;
  flex-direction: column;
  gap: 10px;
}

.cadence-icons span {
  width: 44px;
  height: 44px;
  border-radius: 50%;
  border: 1px solid var(--border);
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--accent);
}

.cadence-icons span svg {
  width: 18px;
  height: 18px;
}

/* ==========================================================================
   === URGENCY / CTA NOTE ===
   ========================================================================== */
.cta-banner.urgent .section-title {
  margin-bottom: 16px;
}

.urgency-note {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  padding: 10px 20px;
  border: 1px solid var(--accent);
  border-radius: var(--radius-lg);
  color: var(--accent);
  font-family: var(--font-display);
  font-size: 12px;
  text-transform: uppercase;
  letter-spacing: 1.5px;
  margin-bottom: 24px;
}

/* ==========================================================================
   === RESPONSIVE: SZKOLENIA "FIRST STEP" ===
   ========================================================================== */
@media (max-width: 900px) {
  .stage-panel-header h3,
  .stage-panel-header h2 {
    font-size: 28px;
  }

  /* Badge etapu odrobinę ciaśniejszy na mniejszych ekranach — sama
     ramka/tło/podświetlenie (patrz .stage-panel-badge wyżej) pozostają
     bez zmian, tylko padding lekko zmniejszony. */
  .stage-panel-badge {
    padding: 4px 12px;
  }

  /* Stały pasek boczny (.stage-rail) wymaga sporo poziomego oddechu, żeby
     nie kolidować z wyśrodkowaną treścią panelu na wąskich ekranach — na
     mobile jest więc całkowicie ukryty, a układ dwukolumnowy wraca do
     zwykłej, pełnoszerokościowej kolumny. Separację między etapami
     zapewnia wtedy WYŁĄCZNIE odstęp (margin-top), nieco ciaśniejszy niż
     na desktopie, ale nadal wyraźnie widoczny. */
  .stage-rail {
    display: none;
  }

  .stage-timeline {
    gap: 0;
  }

  .stage-panel + .stage-panel {
    margin-top: 96px;
  }

  .compare-grid {
    grid-template-columns: 1fr;
  }

  .cadence-row {
    flex-direction: column;
    gap: 32px;
  }
}

@media (max-width: 768px) {
  .compare-grid {
    grid-template-columns: 1fr;
  }

  .process-flow {
    flex-direction: column;
  }

  .process-arrow {
    transform: rotate(90deg);
    margin: 0 auto;
  }

  /* Bez tej reguły h3 wracał do pełnych 42px na telefonie (media query
     powyżej definiuje tylko próg @900px), podczas gdy sąsiadujące h2 na
     tej samej stronie (.section-title) są wtedy już 30px — niespójne. */
  .stage-panel-header h3,
  .stage-panel-header h2 {
    font-size: 26px;
  }
}

@media (max-width: 480px) {
  .stage-panel-header h3,
  .stage-panel-header h2 {
    font-size: 22px;
  }
}

/* === SZKOLENIA: dodatki integracyjne ===
   .checklist-2col: dwukolumnowa lista. CSS Grid z domyślnym auto-flow:row
   parował elementy 1+2, 3+4, 5+6 w tych samych wierszach — przy różnej
   długości tekstu (jedna pozycja 1-liniowa, sąsiednia 2-liniowa) dawało
   to nierówne, poszarpane wiersze. Multi-column layout pozwala każdej
   kolumnie płynąć niezależnie (naturalna kolejność czytania: najpierw
   cała lewa kolumna, potem prawa), więc wysokość jednej pozycji nie
   psuje wyrównania sąsiedniej. */
@media (min-width: 769px) {
  .checklist-2col {
    display: block;
    column-count: 2;
    column-gap: 40px;
  }

  .checklist-2col li {
    break-inside: avoid;
    margin-bottom: 16px;
  }

  .checklist-2col li:last-child {
    margin-bottom: 0;
  }
}

/* ==========================================================================
   === STAGE BANNER (grafika akcentująca tekst w panelach/sekcjach) ===
   ========================================================================== */
.stage-banner {
  position: relative;
  width: 100%;
  height: 340px;
  overflow: hidden;
  border-radius: var(--radius-sm);
  margin: 8px 0 48px;
}

.stage-banner img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  transition: transform 0.6s var(--ease);
}

.stage-banner::after {
  content: '';
  position: absolute;
  inset: 0;
  background: linear-gradient(to top, rgba(12, 11, 10, 0.55) 0%, rgba(12, 11, 10, 0) 55%);
}

.stage-banner:hover img {
  transform: scale(1.04);
}

@media (max-width: 768px) {
  .stage-banner {
    height: 220px;
  }
}

/* ==========================================================================
   === BLOG: LISTA ARTYKUŁÓW ===
   ========================================================================== */
.blog-hero {
  padding: calc(var(--header-h) + 80px) 0 80px;
  position: relative;
  overflow: hidden;
  text-align: center;
}

.blog-hero .container {
  position: relative;
  z-index: 2;
  max-width: 780px;
}

.blog-hero .eyebrow {
  justify-content: center;
}

.blog-hero .section-title {
  font-size: 48px;
}

.blog-hero .section-sub {
  max-width: 620px;
  margin: 0 auto;
}

.blog-filter {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  justify-content: center;
  margin-top: 40px;
}

.blog-filter button {
  padding: 10px 22px;
  border-radius: var(--radius-lg);
  border: 1px solid var(--border);
  background: transparent;
  color: var(--text-muted);
  font-family: var(--font-display);
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 1.2px;
  text-transform: uppercase;
  cursor: pointer;
  transition: background var(--ease) 0.3s, color var(--ease) 0.3s, border-color var(--ease) 0.3s;
}

.blog-filter button.active,
.blog-filter button:hover {
  background: var(--accent);
  border-color: var(--accent);
  color: #fff;
}

.blog-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 40px;
}

.blog-card {
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  overflow: hidden;
  display: flex;
  flex-direction: column;
  transition: transform var(--ease) 0.35s, border-color var(--ease) 0.35s;
}

.blog-card:hover {
  transform: translateY(-6px);
  border-color: var(--accent);
}

.blog-card-image {
  position: relative;
  width: 100%;
  height: 220px;
  overflow: hidden;
}

.blog-card-image img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform 0.6s var(--ease);
  -webkit-mask-image: linear-gradient(to bottom, #000 62%, transparent 98%);
  mask-image: linear-gradient(to bottom, #000 62%, transparent 98%);
}

.blog-card:hover .blog-card-image img {
  transform: scale(1.06);
}

.blog-card-category {
  position: absolute;
  top: 16px;
  left: 16px;
  z-index: 2;
  background: var(--accent);
  color: #fff;
  font-family: var(--font-display);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 1.2px;
  text-transform: uppercase;
  padding: 6px 14px;
  border-radius: var(--radius-lg);
}

.blog-card-body {
  padding: 24px 28px 28px;
  display: flex;
  flex-direction: column;
  gap: 10px;
  flex: 1;
}

.blog-card h3 {
  font-size: 21px;
  line-height: 1.3;
  text-transform: none;
  letter-spacing: 0;
}

/* Tytuły kart bloga to <a> dziedziczące kolor tekstu (zamiast domyślnego
   koloru linku) — zastępuje 25x powtórzony inline style="color:inherit;" */
.blog-card h3 a {
  color: inherit;
}

.blog-card p {
  color: var(--text-muted);
  font-size: 15px;
  line-height: 1.7;
  flex: 1;
}

/* Meta row: reading time + date on the left, circular "next" arrow on the right (Booksy-style) */
.blog-card-meta {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  margin-top: auto;
  padding-top: 6px;
}

.blog-card-meta-text {
  display: flex;
  flex-direction: column;
  gap: 3px;
}

.blog-card-readtime {
  font-family: var(--font-display);
  font-size: 14px;
  font-weight: 600;
  letter-spacing: 0.3px;
  color: var(--text);
}

.blog-card-date {
  font-size: 12px;
  letter-spacing: 0.5px;
  text-transform: uppercase;
  color: var(--text-muted);
}

.blog-card-arrow {
  flex-shrink: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  border-radius: 50%;
  background: var(--accent-dim);
  color: var(--accent);
  transition: background 0.3s var(--ease), color 0.3s var(--ease), transform 0.3s var(--ease);
}

.blog-card-arrow svg {
  width: 18px;
  height: 18px;
}

.blog-card:hover .blog-card-arrow {
  background: var(--accent);
  color: #fff;
  transform: translateX(3px);
}

/* ==========================================================================
   === ARTYKUŁ: HERO + LAYOUT ===
   ========================================================================== */
.article-hero {
  padding: calc(var(--header-h) + 56px) 0 64px;
  border-bottom: 1px solid var(--border);
}

.article-breadcrumbs {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  align-items: center;
  font-size: 13px;
  color: var(--text-muted);
  margin-bottom: 28px;
}

.article-breadcrumbs a {
  color: var(--text-muted);
  transition: color var(--ease) 0.25s;
}

.article-breadcrumbs a:hover {
  color: var(--accent);
}

.article-hero .badge {
  margin-bottom: 20px;
}

.article-hero h1 {
  font-family: var(--font-display);
  font-size: 48px;
  text-transform: none;
  line-height: 1.15;
  max-width: 900px;
  margin-bottom: 24px;
}

.article-meta {
  display: flex;
  flex-wrap: wrap;
  gap: 24px;
  align-items: center;
  color: var(--text-muted);
  font-size: 14px;
  margin-bottom: 32px;
}

.article-meta span {
  display: inline-flex;
  align-items: center;
  gap: 8px;
}

.article-lead {
  font-family: var(--font-body);
  font-size: 20px;
  font-weight: 300;
  line-height: 1.7;
  color: var(--text);
  max-width: 780px;
}

.article-hero-image {
  width: 100%;
  height: 460px;
  overflow: hidden;
  border-radius: var(--radius-sm);
  margin-top: 48px;
}

.article-hero-image img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.article-layout {
  display: grid;
  grid-template-columns: 260px 1fr;
  gap: 72px;
  align-items: start;
  padding: 80px 0 40px;
}

.article-toc {
  position: sticky;
  top: calc(var(--header-h) + 24px);
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  padding: 28px;
}

.article-toc h4 {
  font-family: var(--font-display);
  font-size: 13px;
  text-transform: uppercase;
  letter-spacing: 1.5px;
  color: var(--accent);
  margin-bottom: 18px;
}

.article-toc ol {
  list-style: none;
  display: flex;
  flex-direction: column;
  gap: 12px;
  counter-reset: toc;
}

.article-toc ol li {
  counter-increment: toc;
  font-size: 14px;
  line-height: 1.5;
}

.article-toc ol li a {
  display: flex;
  gap: 10px;
  color: var(--text-muted);
  transition: color var(--ease) 0.25s;
}

.article-toc ol li a::before {
  content: counter(toc);
  flex-shrink: 0;
  color: var(--accent);
  font-family: var(--font-display);
  font-weight: 600;
}

.article-toc ol li a:hover {
  color: var(--text);
}

/* ==========================================================================
   === ARTYKUŁ: TREŚĆ (PROSE) ===
   ========================================================================== */
.article-content {
  max-width: 760px;
  color: var(--text);
  font-size: 17px;
  line-height: 1.85;
}

.article-content h2 {
  font-family: var(--font-display);
  font-size: 32px;
  text-transform: none;
  line-height: 1.2;
  margin: 64px 0 20px;
  scroll-margin-top: calc(var(--header-h) + 24px);
}

.article-content h2:first-child {
  margin-top: 0;
}

.article-content h3 {
  font-family: var(--font-display);
  font-size: 22px;
  text-transform: none;
  line-height: 1.3;
  margin: 40px 0 16px;
  scroll-margin-top: calc(var(--header-h) + 24px);
}

.article-content p {
  margin-bottom: 22px;
  color: var(--text);
}

.article-content p.text-muted-note {
  color: var(--text-muted);
  font-size: 15px;
}

.article-content strong {
  color: #fff;
  font-weight: 600;
}

.article-content a {
  color: var(--accent);
  text-decoration: underline;
  text-decoration-color: rgba(255, 77, 31, 0.4);
  text-underline-offset: 3px;
  transition: text-decoration-color var(--ease) 0.25s;
}

.article-content a:hover {
  text-decoration-color: var(--accent);
}

.article-content ul,
.article-content ol.article-list {
  margin: 0 0 28px;
  padding-left: 0;
  list-style: none;
  display: flex;
  flex-direction: column;
  gap: 12px;
}

.article-content ul li,
.article-content ol.article-list li {
  display: flex;
  gap: 12px;
  align-items: flex-start;
  color: var(--text);
}

.article-content ul li::before {
  content: '';
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--accent);
  flex-shrink: 0;
  margin-top: 9px;
}

.article-content ol.article-list {
  counter-reset: alist;
}

.article-content ol.article-list li::before {
  counter-increment: alist;
  content: counter(alist);
  flex-shrink: 0;
  width: 26px;
  height: 26px;
  border-radius: 50%;
  border: 1px solid var(--accent);
  color: var(--accent);
  font-family: var(--font-display);
  font-size: 12px;
  font-weight: 600;
  display: flex;
  align-items: center;
  justify-content: center;
}

.article-content blockquote {
  border-left: 3px solid var(--accent);
  background: var(--bg-alt);
  padding: 24px 28px;
  margin: 32px 0;
  font-family: var(--font-accent);
  font-style: normal;
  font-weight: 600;
  font-size: 20px;
  color: var(--accent);
  line-height: 1.5;
}

.article-content figure {
  margin: 40px 0;
}

.article-content figure img {
  width: 100%;
  border-radius: var(--radius-sm);
  display: block;
}

.article-content figcaption {
  margin-top: 12px;
  font-size: 13px;
  color: var(--text-muted);
  text-align: center;
}

.article-table-wrap {
  overflow-x: auto;
  margin: 32px 0;
}

.article-content table {
  width: 100%;
  border-collapse: collapse;
  font-size: 15px;
}

.article-content table th,
.article-content table td {
  padding: 14px 18px;
  border: 1px solid var(--border);
  text-align: left;
}

.article-content table th {
  background: var(--bg-card);
  font-family: var(--font-display);
  text-transform: uppercase;
  font-size: 12px;
  letter-spacing: 1px;
  color: var(--accent);
}

.article-content table tr:nth-child(even) td {
  background: rgba(255, 255, 255, 0.02);
}

.article-inline-cta {
  background: var(--bg-card);
  border: 1px solid var(--accent);
  border-radius: var(--radius-sm);
  padding: 32px;
  margin: 48px 0;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 24px;
  flex-wrap: wrap;
}

.article-inline-cta p {
  margin: 0;
  font-family: var(--font-display);
  font-size: 19px;
  color: var(--text);
  text-transform: none;
  max-width: 460px;
}

/* The generic ".article-content a" link rule (orange text, underline) has
   higher specificity than ".btn-accent" alone and was overriding the
   button's white text with orange-on-orange — invisible. Force it back. */
.article-inline-cta .btn {
  color: #fff;
  text-decoration: none;
  flex-shrink: 0;
}

.article-inline-cta .btn:hover {
  color: #fff;
}

.article-tags {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  margin: 40px 0;
}

.article-tags a {
  padding: 8px 18px;
  border-radius: var(--radius-lg);
  border: 1px solid var(--border);
  color: var(--text-muted);
  font-size: 13px;
  text-decoration: none;
}

.article-tags a:hover {
  border-color: var(--accent);
  color: var(--accent);
}

.article-related {
  border-top: 1px solid var(--border);
  padding-top: 48px;
  margin-top: 48px;
}

.article-related h4 {
  font-family: var(--font-display);
  font-size: 20px;
  font-weight: 700;
  text-transform: none;
  letter-spacing: -0.2px;
  color: var(--accent);
  margin-bottom: 28px;
}

.article-related-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 24px;
}

.article-related-grid a {
  color: var(--text);
  font-family: var(--font-display);
  font-size: 15px;
  line-height: 1.4;
  padding: 20px;
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  display: block;
  transition: border-color var(--ease) 0.25s, transform var(--ease) 0.25s;
}

.article-related-grid a:hover {
  border-color: var(--accent);
  transform: translateY(-4px);
}

/* ==========================================================================
   === RESPONSYWNOŚĆ: BLOG I ARTYKUŁ ===
   ========================================================================== */
@media (max-width: 1024px) {
  .blog-grid {
    grid-template-columns: repeat(2, 1fr);
  }

  .article-layout {
    grid-template-columns: 1fr;
  }

  .article-toc {
    position: static;
    margin-bottom: 40px;
  }

  .article-related-grid {
    grid-template-columns: repeat(2, 1fr);
  }
}

@media (max-width: 768px) {
  .blog-hero .section-title {
    font-size: 30px;
  }

  .blog-grid {
    grid-template-columns: 1fr;
  }

  .article-hero h1 {
    font-size: 32px;
  }

  .article-hero-image {
    height: 260px;
  }

  .article-content h2 {
    font-size: 26px;
  }

  .article-content blockquote {
    font-size: 17px;
  }

  .article-related-grid {
    grid-template-columns: 1fr;
  }

  .article-inline-cta {
    flex-direction: column;
    align-items: flex-start;
  }
}

/* ==========================================================================
   === AKTUALNOŚCI: OSADZONY FEED FACEBOOKA (aktualnosci.html) ===
   Oficjalny widget Meta (Facebook Page Plugin, data-tabs="timeline") — samo
   OKNO widgetu ma twardy, narzucony przez Meta limit szerokości (Facebook
   po prostu ignoruje/przycina większe wartości), więc karta jest dopasowana
   do rzeczywistej szerokości treści, a nie rozciągnięta na cały kontener —
   inaczej wąska treść wyglądałaby jak zgubiona w za dużej, pustej ramce.
   ========================================================================== */
/* Domyślne .section ma padding 140px 0 — w połączeniu z paddingiem
   .blog-hero (80px na dole) dawało to nieestetycznie dużą przerwę między
   tytułem H1 a oknem widgetu. Zmniejszone TYLKO tutaj (selektor ID), żeby
   nie ruszać odstępów .section używanych na innych stronach. */
#fb-feed {
  padding-top: 48px;
}

.fb-feed-note {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  font-size: 13px;
  color: var(--text-muted);
  margin-bottom: 28px;
}

.fb-feed-note svg {
  width: 15px;
  height: 15px;
  color: var(--accent);
  flex-shrink: 0;
}

/* Karta ma zanikać w tło u DOŁU zamiast kończyć się ostrą krawędzią
   (border) — ta sama technika co maska na .blog-card-image img (stopniowe
   zanikanie treści w tło strony), tylko zastosowana na całej karcie
   (tło + border + wnętrze iframe), nie tylko na obrazku. Maska zaczyna
   gasić treść już od połowy wysokości karty (50%) i dochodzi do pełnej
   przezroczystości wcześniej niż sama krawędź (92%) — świadomie szersza
   i mocniejsza strefa zanikania niż w pierwszej wersji (był 0-72-100%),
   bo przy wąskiej strefie efekt czytał się jako "prawie niewidoczny".
   border-bottom (część tej samej krawędzi co reszta ramki) znika płynnie
   razem z resztą, zamiast urywać się twardą linią. */
.fb-feed-card {
  position: relative;
  max-width: 560px;
  margin: 0 auto;
  padding: 24px;
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  display: flex;
  justify-content: center;
  -webkit-mask-image: linear-gradient(to bottom, #000 0%, #000 50%, transparent 92%);
  mask-image: linear-gradient(to bottom, #000 0%, #000 50%, transparent 92%);
}

.fb-feed-card iframe {
  border-radius: var(--radius-sm);
  max-width: 100%;
}

.fb-feed-fallback {
  text-align: center;
  color: var(--text-muted);
  font-size: 14px;
  padding: 40px 20px;
}

.fb-feed-fallback a {
  color: var(--accent);
}

/* Miękki, rozmyty "wygaszający" pas pod kartą (nie NA niej) — ta sama idea
   co blur-fade na zdjęciach bloga (stopniowe zanikanie), tylko przeniesiona
   POD okno widgetu zamiast zasłaniać jego treść: karta zanika w tło (patrz
   maska na .fb-feed-card), a tuż pod nią ta poświata wzmacnia wrażenie
   "gaśnięcia". Wzmocniona wersja (było: height 110px, blur 26px, opacity
   0.35/0.12) — poprzednia była zbyt subtelna/prawie niewidoczna, więc
   zwiększono siłę (wyższa opacity, mocniejszy blur) i wysokość (dopasowana
   do wydłużonego o 1/3 okna FB). */
.fb-feed-fade {
  max-width: 560px;
  height: 150px;
  margin: -70px auto 0;
  background: radial-gradient(ellipse at center, rgba(255, 77, 31, 0.55) 0%, rgba(255, 77, 31, 0.22) 45%, transparent 78%);
  filter: blur(38px);
  pointer-events: none;
  position: relative;
  z-index: -1;
}

.fb-feed-more {
  display: table;
  margin: 40px auto 0;
}

@media (max-width: 640px) {
  .fb-feed-card {
    padding: 14px;
  }
}

/* ==========================================================================
   === GALERIA INSTAGRAM: ZAKŁADKI STYLÓW + HOVER + LIGHTBOX ===
   ========================================================================== */
.ig-gallery-note {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  font-size: 13px;
  color: var(--text-muted);
  margin-top: 18px;
}

.ig-gallery-note svg {
  width: 15px;
  height: 15px;
  color: var(--accent);
  flex-shrink: 0;
}

.ig-profile-cta {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  width: fit-content;
  margin: 18px auto 0;
}

.ig-profile-cta svg {
  width: 16px;
  height: 16px;
  flex-shrink: 0;
}

.ig-filter {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 10px;
  margin: 40px 0 8px;
}

.ig-filter button {
  padding: 10px 22px;
  border-radius: var(--radius-lg);
  border: 1px solid var(--border);
  background: transparent;
  color: var(--text-muted);
  font-family: var(--font-display);
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 1.2px;
  text-transform: uppercase;
  cursor: pointer;
  transition: background var(--ease) 0.3s, color var(--ease) 0.3s, border-color var(--ease) 0.3s;
}

.ig-filter button.active,
.ig-filter button:hover {
  background: var(--accent);
  border-color: var(--accent);
  color: #fff;
}

.ig-empty-state {
  display: none;
  align-items: center;
  justify-content: center;
  flex-direction: column;
  gap: 14px;
  text-align: center;
  color: var(--text-muted);
  padding: 70px 24px;
  margin-top: 24px;
  border: 1px dashed var(--border);
  border-radius: 18px;
  font-family: var(--font-display);
  font-size: 15px;
  line-height: 1.6;
}

.ig-empty-state::before {
  content: '';
  display: block;
  width: 46px;
  height: 46px;
  flex-shrink: 0;
  background: var(--accent);
  opacity: 0.14;
  border-radius: 50%;
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='3' width='18' height='18' rx='3'/%3E%3Ccircle cx='9' cy='9' r='1.8'/%3E%3Cpath d='M21 15l-5-5L5 21'/%3E%3C/svg%3E") center / 22px no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='3' width='18' height='18' rx='3'/%3E%3Ccircle cx='9' cy='9' r='1.8'/%3E%3Cpath d='M21 15l-5-5L5 21'/%3E%3C/svg%3E") center / 22px no-repeat;
}

/* Zwijany kontener galerii — pokazuje ok. 3 rzędy, resztę "zasłania"
   rozmytą, winietowaną nakładką z przyciskiem "Pokaż więcej". */
.ig-gallery-wrap {
  position: relative;
}

.ig-gallery-wrap.collapsed {
  max-height: 900px;
  overflow: hidden;
}

.ig-gallery-fade {
  display: none;
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  height: 320px;
  align-items: flex-end;
  justify-content: center;
  padding-bottom: 48px;
  /* Zasłona w kolorze tła (nie przezroczysta), ale z miękką maską —
     mask-image "wycina" górną krawędź stopniowo, więc blur + kolor
     narastają płynnie zamiast urywać się ostrą linią. Maska obejmuje
     CAŁY element (kolor tła + backdrop-filter), więc rozmycie też
     rozmywa się płynnie, a nie kończy się twardą krawędzią. */
  background: rgba(12, 11, 10, 0.92);
  backdrop-filter: blur(16px);
  -webkit-backdrop-filter: blur(16px);
  -webkit-mask-image: linear-gradient(to bottom, transparent 0%, rgba(0, 0, 0, 0.5) 30%, black 60%);
  mask-image: linear-gradient(to bottom, transparent 0%, rgba(0, 0, 0, 0.5) 30%, black 60%);
}

.ig-gallery-wrap.collapsed .ig-gallery-fade {
  display: flex;
}

.ig-gallery-more {
  position: relative;
  z-index: 2;
}

.ig-gallery-more.is-loading {
  opacity: 0.7;
  cursor: wait;
}

@media (max-width: 768px) {
  .ig-gallery-wrap.collapsed {
    max-height: 700px;
  }

  .ig-gallery-fade {
    height: 260px;
    padding-bottom: 36px;
  }
}

/* Nakładka serce + polubienia na kafelku (hover) */
.gallery-item-like-overlay {
  position: absolute;
  inset: 0;
  z-index: 3;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 8px;
  color: #fff;
  opacity: 0;
  transition: opacity var(--ease) 0.35s;
  pointer-events: none;
}

.gallery-item-like-overlay svg {
  width: 34px;
  height: 34px;
  fill: #fff;
  stroke: #fff;
  filter: drop-shadow(0 2px 10px rgba(0, 0, 0, 0.5));
  transform: scale(0.85);
  transition: transform var(--ease) 0.35s;
}

.gallery-item-like-overlay span {
  font-family: var(--font-display);
  font-size: 15px;
  font-weight: 600;
  letter-spacing: 0.5px;
  text-shadow: 0 2px 10px rgba(0, 0, 0, 0.6);
}

.gallery-item.ig-item:hover img {
  filter: blur(3px) brightness(0.65);
}

.gallery-item.ig-item:hover .gallery-item-like-overlay {
  opacity: 1;
}

.gallery-item.ig-item:hover .gallery-item-like-overlay svg {
  transform: scale(1);
}

.gallery-item.ig-item:hover .gallery-item-label {
  opacity: 0;
}

/* Lightbox */
.ig-lightbox {
  position: fixed;
  inset: 0;
  z-index: 2000;
  display: none;
  align-items: center;
  justify-content: center;
  padding: 32px;
  background: rgba(6, 5, 5, 0.92);
  backdrop-filter: blur(6px);
}

.ig-lightbox.open {
  display: flex;
}

.ig-lightbox-inner {
  position: relative;
  display: grid;
  grid-template-columns: 1.3fr 1fr;
  max-width: 1000px;
  width: 100%;
  max-height: 86vh;
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  overflow: hidden;
}

.ig-lightbox-image {
  position: relative;
  background: #000;
  min-height: 320px;
}

.ig-lightbox-image img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

.ig-lightbox-info {
  display: flex;
  flex-direction: column;
  padding: 32px;
  overflow-y: auto;
}

.ig-lightbox-account {
  display: flex;
  align-items: center;
  gap: 12px;
  margin-bottom: 20px;
}

.ig-lightbox-account .ig-avatar {
  width: 40px;
  height: 40px;
  border-radius: 50%;
  background: linear-gradient(135deg, var(--accent), #ffb199);
  display: flex;
  align-items: center;
  justify-content: center;
  color: #fff;
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 14px;
  flex-shrink: 0;
}

.ig-lightbox-account strong {
  font-family: var(--font-display);
  font-size: 14px;
  letter-spacing: 0.3px;
}

.ig-lightbox-account span {
  display: block;
  font-size: 12px;
  color: var(--text-muted);
}

.ig-lightbox-caption {
  color: var(--text);
  font-size: 15px;
  line-height: 1.75;
  margin-bottom: 24px;
  white-space: pre-line;
}

.ig-lightbox-caption .ig-tag {
  color: var(--accent);
}

.ig-lightbox-likes {
  display: flex;
  align-items: center;
  gap: 10px;
  padding-top: 20px;
  border-top: 1px solid var(--border);
  margin-top: auto;
}

.ig-lightbox-likes svg {
  width: 20px;
  height: 20px;
  fill: var(--accent);
  stroke: var(--accent);
}

.ig-lightbox-likes strong {
  font-family: var(--font-display);
  font-size: 15px;
}

.ig-lightbox-date {
  font-size: 12px;
  color: var(--text-muted);
  margin-top: 6px;
}

.ig-lightbox-link {
  margin-top: 20px;
  align-self: flex-start;
}

.ig-lightbox-close {
  position: absolute;
  top: 16px;
  right: 16px;
  z-index: 5;
  width: 40px;
  height: 40px;
  border-radius: 50%;
  background: rgba(12, 11, 10, 0.6);
  border: 1px solid rgba(255, 255, 255, 0.2);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  transition: background var(--ease) 0.25s;
}

.ig-lightbox-close:hover {
  background: var(--accent);
}

@media (max-width: 768px) {
  .ig-lightbox-inner {
    grid-template-columns: 1fr;
    max-height: 92vh;
    overflow-y: auto;
  }

  .ig-lightbox-image {
    min-height: 260px;
  }

  .gallery-item-like-overlay svg {
    width: 28px;
    height: 28px;
  }
}

/* ==========================================================================
   === REVIEWS MARQUEE (prawdziwe opinie z Google — auto-przewijany pas) ===
   ========================================================================== */
.reviews-marquee-section {
  position: relative;
  background: var(--bg);
  padding: 64px 0;
  overflow: hidden;
  border-bottom: 1px solid var(--border);
}

.reviews-marquee-heading {
  margin-bottom: 30px;
}

.reviews-marquee-wrap {
  overflow: hidden;
  width: 100%;
  -webkit-mask-image: linear-gradient(to right, transparent 0, black 80px, black calc(100% - 80px), transparent 100%);
  mask-image: linear-gradient(to right, transparent 0, black 80px, black calc(100% - 80px), transparent 100%);
}

.reviews-track {
  display: flex;
  gap: 24px;
  width: max-content;
  padding: 18px 0 32px;
  animation: reviews-scroll 85s linear infinite;
}

/* Najedź myszką na dowolną opinię -> cały pas się zatrzymuje */
.reviews-marquee-wrap:hover .reviews-track {
  animation-play-state: paused;
}

@keyframes reviews-scroll {
  from { transform: translateX(0); }
  to { transform: translateX(-50%); }
}

.review-card {
  position: relative;
  flex: 0 0 340px;
  max-width: 340px;
  background: rgba(28, 26, 22, 0.7);
  backdrop-filter: blur(14px);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  padding: 36px 30px 30px;
  cursor: pointer;
  transition: transform 0.35s var(--ease), border-color 0.35s var(--ease), box-shadow 0.35s var(--ease);
}

.review-card:hover {
  transform: translateY(-6px);
  border-color: var(--accent);
  box-shadow: 0 20px 40px -20px rgba(0, 0, 0, 0.5);
}

.review-card .quote-mark {
  font-size: 90px;
  top: 4px;
  right: 20px;
}

.review-card .stars {
  margin-bottom: 14px;
  font-size: 14px;
}

.review-card-text {
  font-family: var(--font-body);
  font-size: 15px;
  line-height: 1.6;
  color: var(--text-muted);
  margin-bottom: 22px;
  display: -webkit-box;
  -webkit-line-clamp: 5;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

.review-card .avatar {
  width: 44px;
  height: 44px;
}

.review-card .testimonial-author-info strong {
  font-size: 13px;
}

/* --- modal: powiększona opinia po kliknięciu --- */
.review-modal {
  position: fixed;
  inset: 0;
  z-index: 2000;
  display: none;
  align-items: center;
  justify-content: center;
  padding: 32px;
  background: rgba(6, 5, 5, 0.92);
  backdrop-filter: blur(6px);
}

.review-modal.open {
  display: flex;
}

.review-modal-inner {
  position: relative;
  max-width: 640px;
  width: 100%;
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  padding: 56px 48px 44px;
  animation: review-modal-in 0.35s var(--ease);
}

@keyframes review-modal-in {
  from { opacity: 0; transform: scale(0.94) translateY(10px); }
  to { opacity: 1; transform: scale(1) translateY(0); }
}

.review-modal-inner .testimonial-text {
  font-size: 20px;
}

.review-modal-close {
  position: absolute;
  top: 16px;
  right: 16px;
  z-index: 5;
  width: 40px;
  height: 40px;
  border-radius: 50%;
  background: rgba(12, 11, 10, 0.6);
  border: 1px solid rgba(255, 255, 255, 0.2);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: background var(--ease) 0.3s;
}

.review-modal-close:hover {
  background: var(--accent);
}

@media (max-width: 768px) {
  .reviews-marquee-section {
    padding: 44px 0;
  }

  .review-card {
    flex-basis: 280px;
    max-width: 280px;
    padding: 28px 22px 24px;
  }

  .review-modal-inner {
    padding: 44px 26px 32px;
  }

  .review-modal-inner .testimonial-text {
    font-size: 17px;
  }
}

/* ==========================================================================
   === IG FOLLOW STRIP (pas zdjęć z Instagrama nad stopką) ===
   ========================================================================== */
.ig-follow-strip {
  position: relative;
  overflow: hidden;
  height: 220px;
  background: var(--bg-card);
}

.ig-follow-track {
  display: flex;
  height: 100%;
  width: max-content;
  animation: ig-follow-scroll 110s linear infinite;
}

.ig-follow-strip:hover .ig-follow-track {
  animation-play-state: paused;
}

@keyframes ig-follow-scroll {
  from { transform: translateX(0); }
  to { transform: translateX(-50%); }
}

.ig-follow-track a {
  display: block;
  flex-shrink: 0;
  height: 100%;
  aspect-ratio: 1 / 1;
}

.ig-follow-track img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  filter: grayscale(0.15) brightness(0.75);
  transition: filter 0.4s var(--ease), transform 0.4s var(--ease);
}

.ig-follow-track a:hover img {
  filter: grayscale(0) brightness(0.9);
  transform: scale(1.04);
}

.ig-follow-cta {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  z-index: 3;
  display: flex;
  align-items: center;
  gap: 10px;
  background: var(--accent);
  color: #fff;
  font-family: var(--font-display);
  font-size: 14px;
  font-weight: 600;
  letter-spacing: 0.5px;
  text-transform: uppercase;
  padding: 18px 30px;
  border-radius: var(--radius-sm);
  white-space: nowrap;
  transition: transform 0.3s var(--ease), background 0.3s var(--ease);
  pointer-events: auto;
}

.ig-follow-cta:hover {
  transform: translate(-50%, -50%) scale(1.05);
  background: var(--accent-2);
  color: var(--bg);
}

@media (max-width: 768px) {
  .ig-follow-strip {
    height: 150px;
  }

  .ig-follow-cta {
    font-size: 12px;
    padding: 14px 20px;
    gap: 8px;
  }

  .ig-follow-cta svg {
    width: 18px;
    height: 18px;
  }
}


/* ==========================================================================
   === SEKCJE "GANCARZ-STYLE" — szkolenia-test-gancarz.html ===
   Większe, bardziej wyszczególnione bloki wzorowane na analizie strony
   konkurencyjnej. Prefiks klas: .gc-*
   ========================================================================== */

/* ==========================================================================
   === GC — SYGNATUROWA LICZBA (STAT SECTION) ===
   Samodzielna, kontrastowa sekcja tuż po hero z jedną wyeksponowaną liczbą.
   Tło oparte o var(--accent), głębsze i ciemniejsze niż reszta strony —
   inspirowane istniejącą klasą .big-type-section, ale wydzielone jako
   nowy, dedykowany komplet klas .gc-stat-*.
   ========================================================================== */

.gc-stat-section {
  position: relative;
  overflow: hidden;
  background: radial-gradient(circle at 50% 0%, #4a1206 0%, var(--bg) 65%),
    linear-gradient(180deg, #2a0a03 0%, var(--bg) 100%);
  padding: 140px 0;
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
  isolation: isolate;
}

/* subtelna aura koloru akcentu w tle, żeby liczba "świeciła" */
.gc-stat-section::before {
  content: '';
  position: absolute;
  top: 50%;
  left: 50%;
  width: 900px;
  height: 900px;
  background: radial-gradient(circle, var(--accent-dim) 0%, transparent 70%);
  transform: translate(-50%, -50%);
  z-index: 0;
  pointer-events: none;
}

.gc-stat-container {
  position: relative;
  z-index: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
}

.gc-stat-eyebrow {
  font-family: var(--font-display);
  font-size: 13px;
  font-weight: 600;
  letter-spacing: 3px;
  text-transform: uppercase;
  color: var(--accent-2);
  margin: 0 0 28px;
}

.gc-stat-number-wrap {
  line-height: 1;
  margin-bottom: 28px;
  display: inline-flex;
  align-items: baseline;
  gap: 18px;
}

.gc-stat-number {
  display: inline-block;
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 240px;
  line-height: 0.85;
  color: var(--text);
  letter-spacing: -4px;
  text-shadow: 0 20px 80px rgba(255, 77, 31, 0.35);
}

.gc-stat-unit {
  font-family: var(--font-accent);
  font-style: normal;
  font-weight: 700;
  text-transform: none;
  letter-spacing: 0;
  font-size: 56px;
  color: var(--accent-2);
}

.gc-stat-desc {
  max-width: 560px;
  font-family: var(--font-body);
  font-size: 18px;
  line-height: 1.6;
  color: var(--text-muted);
  margin: 0 0 40px;
}

.gc-stat-btn {
  position: relative;
  z-index: 1;
}

/* ==========================================================================
   === GC — RESPONSYWNOŚĆ ===
   ========================================================================== */
@media (max-width: 1024px) {
  .gc-stat-number {
    font-size: 180px;
  }

  .gc-stat-unit {
    font-size: 42px;
  }

  .gc-stat-section {
    padding: 110px 0;
  }
}

@media (max-width: 768px) {
  .gc-stat-section {
    padding: 90px 0;
  }

  .gc-stat-eyebrow {
    font-size: 11px;
    letter-spacing: 2px;
    margin-bottom: 20px;
  }

  .gc-stat-number {
    font-size: 120px;
    letter-spacing: -2px;
  }

  .gc-stat-number-wrap {
    gap: 10px;
  }

  .gc-stat-unit {
    font-size: 28px;
  }

  .gc-stat-desc {
    font-size: 16px;
    padding: 0 12px;
  }
}

@media (max-width: 480px) {
  .gc-stat-number {
    font-size: 88px;
  }

  .gc-stat-unit {
    font-size: 22px;
  }
}

/* ============================
   GC-THESIS — sekcja tezy/kontrastu
   ============================ */
.gc-thesis {
  padding: 96px 0;
}

.gc-thesis-inner {
  max-width: 800px;
  margin: 0 auto;
  text-align: center;
}

.gc-thesis .eyebrow {
  justify-content: center;
  margin-bottom: 28px;
}

.gc-thesis-text {
  font-family: var(--font-display);
  text-transform: none;
  font-size: 40px;
  font-weight: 700;
  line-height: 1.35;
  letter-spacing: -0.3px;
  color: var(--text);
  margin: 0;
}

.gc-thesis-text strong {
  color: var(--text-muted);
  font-weight: 500;
}

.gc-thesis-text em {
  font-family: var(--font-accent);
  font-style: normal;
  text-transform: none;
  color: var(--accent);
  text-shadow: 0 0 12px rgba(255, 77, 31, 0.6), 0 0 30px rgba(255, 77, 31, 0.35);
  font-weight: 800;
}

@media (max-width: 768px) {
  .gc-thesis {
    padding: 64px 0;
  }

  .gc-thesis-text {
    font-size: 28px;
  }
}

/* ============================
   GC-AGENDA — numerowana lista programu
   ============================ */
.gc-agenda {
  padding: 96px 0;
}

.gc-agenda .section-sub {
  max-width: 680px;
  margin-left: auto;
  margin-right: auto;
  text-align: center;
}

.gc-agenda .eyebrow,
.gc-agenda .section-title {
  text-align: center;
}

.gc-agenda .section-title {
  text-align: center;
  margin-left: auto;
  margin-right: auto;
}

.gc-agenda-list {
  list-style: none;
  margin: 64px 0 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 20px;
}

.gc-agenda-item {
  display: flex;
  align-items: flex-start;
  gap: 32px;
  padding: 32px;
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  transition: border-color 0.3s var(--ease), transform 0.3s var(--ease), background 0.3s var(--ease);
}

.gc-agenda-item:hover {
  border-color: var(--accent);
  background: var(--bg-alt);
  transform: translateX(4px);
}

.gc-agenda-num {
  flex: 0 0 auto;
  width: 76px;
  height: 76px;
  display: flex;
  align-items: center;
  justify-content: center;
  border: 2px solid var(--accent);
  border-radius: var(--radius-sm);
  font-family: var(--font-display);
  font-size: 30px;
  font-weight: 600;
  color: var(--accent);
  background: var(--accent-dim);
  letter-spacing: 0.02em;
}

.gc-agenda-content h3 {
  font-family: var(--font-display);
  text-transform: none;
  letter-spacing: -0.2px;
  font-size: 22px;
  font-weight: 700;
  line-height: 1.3;
  color: var(--text);
  margin: 6px 0 10px;
}

.gc-agenda-content p {
  font-family: var(--font-body);
  font-size: 16px;
  line-height: 1.6;
  color: var(--text-muted);
  margin: 0;
  max-width: 640px;
}

@media (max-width: 768px) {
  .gc-agenda {
    padding: 64px 0;
  }

  .gc-agenda-list {
    margin-top: 40px;
    gap: 16px;
  }

  .gc-agenda-item {
    flex-direction: column;
    align-items: flex-start;
    gap: 16px;
    padding: 24px;
  }

  .gc-agenda-num {
    width: 60px;
    height: 60px;
    font-size: 24px;
  }

  .gc-agenda-content h3 {
    font-size: 19px;
  }

  .gc-agenda-content p {
    font-size: 15px;
  }
}

/* ==========================================================================
   === GC MOTTO STRIP + TRUST BADGES ===
   ========================================================================== */
/* ==========================================================================
   === GC — OZDOBA "+" I DIAGONALNY CIEŃ (wspólna dla "statement" banerów) ===
   Inspiracja: siatka drobnych "+" w tle + ukośny cień/gradient przygaszający
   jeden róg sekcji. Dodawana przez ::after (żeby nie kolidować z istniejącymi
   ::before — glow w .gc-stat-section, kreska w .gc-final-cta), zawsze
   z-index:0, treść sekcji musi mieć position:relative + z-index:1.

   Wzór "+" jest dodatkowo maskowany kilkoma radialnymi gradientami (mask-image),
   żeby siatka nie była jednolitą tapetą — w kilku miejscach jest w pełni
   widoczna, między nimi płynnie zanika, a w pozostałych obszarach znika
   całkowicie. Efekt jest ten sam we wszystkich sekcjach (spójny motyw), ale
   każda ma inny układ "kieszeni" widoczności, żeby całość wyglądała żywo,
   a nie jak powtarzalny kafelek.
   ========================================================================== */
.gc-motto-strip,
.gc-stat-section,
.gc-reframe-cta,
.gc-final-cta,
.gc-trust-section {
  position: relative;
  overflow: hidden;
}

/* #dla-kogo NIE dostaje tekstury "plusików" (tło ma być jednolite, płaskie,
   na wyraźną prośbę) — usunięty z tej grupy selektorów. */
.gc-motto-strip::after,
.gc-stat-section::after,
.gc-reframe-cta::after,
.gc-final-cta::after,
.gc-trust-section::after {
  content: '';
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  background-image:
    linear-gradient(115deg, rgba(0, 0, 0, 0.38) 0%, rgba(0, 0, 0, 0) 42%),
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='40' height='40'%3E%3Cpath d='M20 13v14M13 20h14' stroke='rgba(245,243,238,0.07)' stroke-width='1.5' stroke-linecap='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat, repeat;
  background-size: 100% 100%, 40px 40px;
  -webkit-mask-repeat: no-repeat;
  mask-repeat: no-repeat;
}

/* Domyślny (i najczęstszy) układ "kieszeni" zanikania — dwie mocne plamy
   po przekątnej, reszta sekcji płynnie gaśnie do zera. */
.gc-motto-strip::after,
.gc-reframe-cta::after {
  -webkit-mask-image:
    radial-gradient(circle at 12% 25%, #000 0%, transparent 45%),
    radial-gradient(circle at 88% 75%, #000 0%, transparent 50%);
  mask-image:
    radial-gradient(circle at 12% 25%, #000 0%, transparent 45%),
    radial-gradient(circle at 88% 75%, #000 0%, transparent 50%);
  -webkit-mask-composite: source-over;
  mask-composite: add;
}

.gc-stat-section::after {
  -webkit-mask-image:
    radial-gradient(circle at 80% 15%, #000 0%, transparent 40%),
    radial-gradient(circle at 15% 85%, #000 0%, transparent 55%),
    radial-gradient(circle at 50% 50%, #000 0%, transparent 65%);
  mask-image:
    radial-gradient(circle at 80% 15%, #000 0%, transparent 40%),
    radial-gradient(circle at 15% 85%, #000 0%, transparent 55%),
    radial-gradient(circle at 50% 50%, #000 0%, transparent 65%);
  -webkit-mask-composite: source-over;
  mask-composite: add;
}

.gc-final-cta::after,
.gc-trust-section::after {
  -webkit-mask-image:
    radial-gradient(circle at 20% 80%, #000 0%, transparent 42%),
    radial-gradient(circle at 78% 20%, #000 0%, transparent 48%);
  mask-image:
    radial-gradient(circle at 20% 80%, #000 0%, transparent 42%),
    radial-gradient(circle at 78% 20%, #000 0%, transparent 48%);
  -webkit-mask-composite: source-over;
  mask-composite: add;
}

.gc-motto-inner {
  position: relative;
  z-index: 1;
}

.gc-trust-container {
  position: relative;
  z-index: 1;
}

#dla-kogo > .container {
  position: relative;
  z-index: 1;
}

/* Tło identyczne jak .gc-stat-section ("100+ opinii") — na wyraźną
   prośbę klienta. Ten sam dwuwarstwowy gradient (ciemna aura pomarańczowa
   u góry + przejście do --bg) PLUS ten sam ::before z miękką, okrągłą
   poświatą akcentu (patrz reguła .gc-motto-strip::before niżej,
   analogiczna do .gc-stat-section::before) — isolation:isolate zapewnia
   tę samą, poprawną kolejność malowania (aura ::before → tekstura ::after
   → treść .gc-motto-inner) co w oryginale. #dla-kogo NIE jest częścią tej
   zmiany — zachowuje swoje dotychczasowe, płaskie tło --bg-alt. */
.gc-motto-strip {
  background: radial-gradient(circle at 50% 0%, #4a1206 0%, var(--bg) 65%),
    linear-gradient(180deg, #2a0a03 0%, var(--bg) 100%);
  isolation: isolate;
  padding: 72px 0 56px;
  /* border-top usunięty: .reviews-marquee-section (sekcja tuż powyżej)
     już ma własny border-bottom — dwie linie obok siebie tworzyły
     wizualnie podwójną kreskę. */
  border-bottom: 1px solid var(--border);
}

#dla-kogo {
  background: var(--bg-alt);
  padding: 72px 0 56px;
  border-top: 1px solid var(--border);
  border-bottom: 1px solid var(--border);
}

/* Aura poświaty akcentu — dosłowna kopia .gc-stat-section::before, żeby
   tło było w pełni identyczne (nie tylko sam gradient bazowy). */
.gc-motto-strip::before {
  content: '';
  position: absolute;
  top: 50%;
  left: 50%;
  width: 900px;
  height: 900px;
  background: radial-gradient(circle, var(--accent-dim) 0%, transparent 70%);
  transform: translate(-50%, -50%);
  z-index: 0;
  pointer-events: none;
}

.gc-motto-inner {
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
}

.gc-motto-text {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: clamp(24px, 3.4vw, 40px);
  line-height: 1.3;
  color: var(--text);
  letter-spacing: 0.2px;
  margin: 0 0 48px;
  max-width: 900px;
}

.gc-motto-text strong {
  color: var(--accent);
  font-weight: 600;
}

.gc-badges-row {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  align-items: flex-start;
  gap: 48px;
  width: 100%;
  max-width: 900px;
}

.gc-badge {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 12px;
  flex: 1 1 160px;
  min-width: 140px;
}

.gc-badge-icon {
  width: 40px;
  height: 40px;
  color: var(--accent);
  stroke-width: 1.5;
  flex-shrink: 0;
}

.gc-badge-icon svg {
  width: 100%;
  height: 100%;
}

.gc-badge-label {
  font-family: var(--font-body);
  font-size: 13px;
  font-weight: 500;
  text-transform: uppercase;
  letter-spacing: 0.6px;
  color: var(--text-muted);
  line-height: 1.4;
}

@media (max-width: 768px) {
  .gc-motto-strip,
  #dla-kogo {
    padding: 56px 0 40px;
  }

  .gc-motto-text {
    margin-bottom: 36px;
  }

  .gc-badges-row {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 32px 24px;
    max-width: 360px;
  }

  .gc-badge {
    min-width: 0;
  }
}

/* ==========================================================================
   === GC — KARUZELA OPINII (GOOGLE REVIEWS O STUDIU / MENTORZE) ===
   Poziomy scroll-snap zamiast JS-owej karuzeli: prosty, niezawodny,
   dostępny z klawiatury i na touchpadzie/telefonie. 4 ciemne karty
   .gc-quote-card, częściowo widoczna kolejna karta na krawędzi jak we wzorze.
   ========================================================================== */

.gc-quotes {
  padding: 140px 0 100px;
  overflow: hidden;
}

.gc-quotes .container {
  margin-bottom: 56px;
}

.gc-quotes .section-sub {
  max-width: 640px;
}

/* --- Track: poziomy scroll ze snapowaniem --- */
.gc-quotes-track {
  display: flex;
  gap: 24px;
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  padding: 4px calc((100% - var(--container-w)) / 2 + 24px) 24px;
  scrollbar-width: none;
  -ms-overflow-style: none;
}

.gc-quotes-track::-webkit-scrollbar {
  display: none;
}

/* jeśli viewport węższy niż container, zachowaj margines boczny */
@media (max-width: 1360px) {
  .gc-quotes-track {
    padding-left: 40px;
    padding-right: 40px;
  }
}

.gc-quote-card {
  flex: 0 0 auto;
  scroll-snap-align: start;
  width: calc(50% - 12px);
  min-width: 340px;
  max-width: 560px;
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  padding: 48px 44px 36px;
  display: flex;
  flex-direction: column;
  transition: border-color 0.3s var(--ease), transform 0.3s var(--ease);
}

.gc-quote-card:hover {
  border-color: rgba(255, 77, 31, 0.35);
  transform: translateY(-4px);
}

.gc-quote-mark {
  font-family: var(--font-accent);
  font-style: italic;
  font-weight: 700;
  font-size: 72px;
  line-height: 1;
  color: var(--accent);
  margin-bottom: 12px;
  display: block;
}

.gc-quote-text {
  font-family: var(--font-body);
  font-size: 21px;
  font-weight: 300;
  line-height: 1.5;
  color: var(--text);
  margin: 0 0 32px;
  flex-grow: 1;
}

.gc-quote-footer {
  display: flex;
  flex-direction: column;
  gap: 4px;
  padding-top: 20px;
  border-top: 1px solid var(--border);
}

.gc-quote-author {
  font-family: var(--font-display);
  font-size: 15px;
  font-weight: 600;
  letter-spacing: 0.5px;
  color: var(--text);
  text-transform: uppercase;
}

.gc-quote-source {
  font-family: var(--font-body);
  font-size: 13px;
  font-weight: 400;
  color: var(--text-muted);
}

/* --- Kropki nawigacyjne (dekoracyjne + podświetlane przez lekki JS) --- */
.gc-quotes-dots {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 12px;
  margin-top: 44px;
}

.gc-quotes-dot {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--border);
  cursor: pointer;
  transition: background 0.3s var(--ease), transform 0.3s var(--ease);
}

.gc-quotes-dot.is-active {
  background: var(--accent);
  transform: scale(1.3);
}

/* ==========================================================================
   === GC — RESPONSYWNOŚĆ ===
   ========================================================================== */
@media (max-width: 900px) {
  .gc-quote-card {
    width: 82%;
    min-width: 300px;
    padding: 40px 32px 32px;
  }

  .gc-quote-mark {
    font-size: 60px;
  }

  .gc-quote-text {
    font-size: 19px;
  }
}

@media (max-width: 640px) {
  .gc-quotes {
    padding: 100px 0 80px;
  }

  .gc-quotes-track {
    gap: 16px;
    padding-left: 24px;
    padding-right: 24px;
  }

  .gc-quote-card {
    width: 90%;
    min-width: 260px;
    padding: 36px 26px 28px;
  }

  .gc-quote-mark {
    font-size: 52px;
    margin-bottom: 8px;
  }

  .gc-quote-text {
    font-size: 17px;
    margin-bottom: 24px;
  }

  .gc-quote-author {
    font-size: 14px;
  }

  .gc-quote-source {
    font-size: 12px;
  }
}

.gc-mentor {
  padding: 120px 0;
  background: var(--bg);
}

.gc-mentor-grid {
  display: grid;
  grid-template-columns: 0.85fr 1.15fr;
  gap: 72px;
  align-items: center;
}

/* --- Photo placeholder --- */
.gc-mentor-photo-frame {
  position: relative;
  width: 100%;
  aspect-ratio: 3 / 4;
  border-radius: var(--radius-sm);
  border: 1px solid var(--border);
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 24px;
  overflow: hidden;
}

/* Stan "pusty" (bez zdjęcia) — zachowuje oryginalne tło-placeholder.
   Gdy dodane jest .gc-mentor-photo-frame--filled, zdjęcie samo staje się
   tłem, a gradient/ramka przerywana stają się nakładkami na nim. */
.gc-mentor-photo-frame:not(.gc-mentor-photo-frame--filled) {
  background: linear-gradient(160deg, var(--bg-card) 0%, var(--bg) 100%);
}

.gc-mentor-photo-img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center top;
  z-index: 0;
}

/* Ten sam gradient co wcześniej na pustej ramce, teraz jako półprzezroczysta
   nakładka na zdjęciu źródłowym — nie chowa zdjęcia, tylko lekko je toniuje
   w stronę tła strony dla spójności. */
.gc-mentor-photo-frame--filled::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
  background: linear-gradient(160deg, rgba(28, 26, 22, 0) 45%, rgba(12, 11, 10, 0.55) 100%);
  pointer-events: none;
}

.gc-mentor-photo-frame::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 2;
  border: 1px dashed var(--border);
  margin: 16px;
  border-radius: var(--radius-sm);
  pointer-events: none;
}

.gc-mentor-photo-icon {
  position: relative;
  z-index: 1;
  width: 96px;
  height: 96px;
  color: var(--text-muted);
  opacity: 0.6;
}

.gc-mentor-photo-caption {
  position: relative;
  z-index: 1;
  font-family: var(--font-body);
  font-size: 13px;
  letter-spacing: 0.02em;
  color: var(--text-muted);
  text-align: center;
  padding: 0 24px;
}

/* --- Bio --- */
.gc-mentor-bio {
  display: flex;
  flex-direction: column;
  gap: 20px;
}

.gc-mentor-name {
  font-family: var(--font-display);
  font-weight: 700;
  text-transform: none;
  letter-spacing: -0.3px;
  font-size: 48px;
  line-height: 1.05;
  color: var(--text);
  margin: 4px 0 0;
}

.gc-mentor-role {
  font-family: var(--font-accent);
  font-style: normal;
  font-weight: 600;
  font-size: 20px;
  color: var(--text-muted);
  margin: -8px 0 4px;
}

.gc-mentor-text {
  display: flex;
  flex-direction: column;
  gap: 16px;
}

.gc-mentor-text p {
  font-family: var(--font-body);
  font-size: 16px;
  line-height: 1.7;
  color: var(--text-muted);
  margin: 0;
}

.gc-mentor-text .hl {
  color: var(--accent);
  font-weight: 600;
}

/* --- Stats chips --- */
.gc-mentor-stats {
  display: flex;
  flex-wrap: wrap;
  gap: 16px;
  margin-top: 12px;
}

.gc-mentor-stat {
  display: flex;
  flex-direction: column;
  gap: 4px;
  padding: 16px 24px;
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  min-width: 140px;
  transition: border-color 0.3s var(--ease), transform 0.3s var(--ease);
}

.gc-mentor-stat:hover {
  border-color: var(--accent);
  transform: translateY(-2px);
}

.gc-mentor-stat-num {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 26px;
  color: var(--accent);
  line-height: 1;
}

.gc-mentor-stat-label {
  font-family: var(--font-body);
  font-size: 13px;
  color: var(--text-muted);
  letter-spacing: 0.01em;
}

/* --- Responsive --- */
@media (max-width: 1024px) {
  .gc-mentor {
    padding: 80px 0;
  }

  .gc-mentor-grid {
    grid-template-columns: 1fr;
    gap: 40px;
  }

  .gc-mentor-photo-frame {
    max-width: 420px;
    margin: 0 auto;
    aspect-ratio: 4 / 3;
  }

  .gc-mentor-name {
    font-size: 40px;
  }

  .gc-mentor-stats {
    justify-content: flex-start;
  }
}

@media (max-width: 560px) {
  .gc-mentor-name {
    font-size: 34px;
  }

  .gc-mentor-role {
    font-size: 17px;
  }

  .gc-mentor-stat {
    flex: 1 1 calc(50% - 8px);
    min-width: 0;
  }
}

/* ==========================================================================
     === GC REFRAME CTA (loss aversion, wtórne CTA) ===
     ========================================================================== */
  .gc-reframe-cta {
    position: relative;
    padding: 128px 0;
    text-align: center;
    background: radial-gradient(
        ellipse at 50% 0%,
        rgba(255, 77, 31, 0.16) 0%,
        rgba(255, 77, 31, 0) 55%
      ),
      var(--bg);
    border-top: 1px solid var(--border);
    border-bottom: 1px solid var(--border);
    overflow: hidden;
  }

  .gc-reframe-inner {
    position: relative;
    z-index: 1;
    max-width: 780px;
    margin: 0 auto;
  }

  .gc-reframe-kicker {
    font-family: var(--font-display);
    font-size: 13px;
    font-weight: 600;
    letter-spacing: 3px;
    text-transform: uppercase;
    color: var(--accent);
    margin-bottom: 20px;
  }

  .gc-reframe-title {
    font-family: var(--font-display);
    font-size: 42px;
    line-height: 1.15;
    font-weight: 700;
    text-transform: none;
    letter-spacing: -0.3px;
    color: var(--text);
    margin: 0 0 28px;
  }

  .gc-reframe-title em {
    display: inline;
    font-style: normal;
    color: var(--accent);
    text-shadow: 0 0 12px rgba(255, 77, 31, 0.6), 0 0 30px rgba(255, 77, 31, 0.35);
  }

  .gc-reframe-sub {
    font-family: var(--font-body);
    font-size: 18px;
    line-height: 1.7;
    color: var(--text-muted);
    max-width: 620px;
    margin: 0 auto 40px;
  }

  .gc-reframe-actions {
    display: flex;
    justify-content: center;
  }

  @media (max-width: 1024px) {
    .gc-reframe-cta {
      padding: 96px 0;
    }

    .gc-reframe-title {
      font-size: 36px;
    }
  }

  /* ==========================================================================
     === GC COUNTDOWN (odliczanie — zasada niedostępności / ograniczonego czasu) ===
     ========================================================================== */
  .gc-countdown {
    /* Szare tło (--bg-alt) — na wyraźną prośbę: to samo tło co #program
       (sekcja "Twoja droga do własnego studia", gdzie żyje etap
       "Certyfikat ukończenia programu") — ta sekcja też ma klasę
       .section-alt, która ustawia dokładnie ten sam kolor. */
    background: var(--bg-alt);
    padding: 96px 0;
  }

  .gc-countdown-inner {
    display: grid;
    grid-template-columns: 1.1fr 0.9fr;
    gap: 64px;
    align-items: center;
  }

  .gc-countdown-badge {
    display: inline-block;
    padding: 8px 18px;
    border: 1px solid var(--accent);
    border-radius: var(--radius-lg);
    color: var(--accent);
    font-family: var(--font-display);
    font-size: 12px;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    margin-bottom: 20px;
  }

  .gc-countdown-copy .section-title {
    margin-bottom: 16px;
  }

  .gc-countdown-copy .section-sub {
    margin: 0;
  }

  .gc-countdown-timer {
    display: flex;
    align-items: flex-start;
    gap: 12px;
    margin: 36px 0;
  }

  .gc-countdown-item {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    min-width: 76px;
    padding: 16px 8px;
    background: var(--bg-card);
    border: 1px solid var(--accent);
    border-radius: var(--radius-sm);
    box-shadow: 0 0 40px rgba(255, 77, 31, 0.16);
  }

  .gc-countdown-num {
    font-family: var(--font-display);
    font-size: 36px;
    font-weight: 600;
    line-height: 1;
    color: var(--text);
    font-variant-numeric: tabular-nums;
  }

  .gc-countdown-label {
    font-size: 11px;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: var(--text-muted);
    margin-top: 6px;
  }

  .gc-countdown-sep {
    font-family: var(--font-display);
    font-size: 28px;
    color: var(--text-muted);
    align-self: center;
    padding-bottom: 18px;
  }

  .gc-countdown-note {
    font-size: 13px;
    color: var(--text-muted);
    margin: 0 0 32px;
  }

  .gc-countdown-video-frame {
    position: relative;
    width: 100%;
    aspect-ratio: 16 / 9;
    border-radius: var(--radius-sm);
    border: 1px solid var(--border);
    background: linear-gradient(160deg, var(--bg-card) 0%, var(--bg) 100%);
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 16px;
  }

  .gc-countdown-video-frame::before {
    content: "";
    position: absolute;
    inset: 0;
    border: 1px dashed var(--border);
    margin: 16px;
    border-radius: var(--radius-sm);
    pointer-events: none;
  }

  .gc-countdown-video-icon {
    width: 64px;
    height: 64px;
    color: var(--text-muted);
    opacity: 0.6;
  }

  .gc-countdown-video-caption {
    font-family: var(--font-body);
    font-size: 13px;
    letter-spacing: 0.02em;
    color: var(--text-muted);
    text-align: center;
    padding: 0 24px;
  }

  @media (max-width: 1024px) {
    .gc-countdown-inner {
      grid-template-columns: 1fr;
      gap: 40px;
    }
  }

  @media (max-width: 768px) {
    .gc-countdown {
      padding: 64px 0;
    }

    .gc-countdown-timer {
      gap: 8px;
      margin: 28px 0;
    }

    .gc-countdown-item {
      min-width: 58px;
      padding: 12px 6px;
    }

    .gc-countdown-num {
      font-size: 24px;
    }

    .gc-countdown-sep {
      font-size: 20px;
      padding-bottom: 14px;
    }
  }

  /* ==========================================================================
     === GC FINAL CTA (duży, finalny pas CTA) ===
     ========================================================================== */
  .gc-final-cta {
    padding: 160px 0;
    text-align: center;
    background: linear-gradient(180deg, var(--bg-alt) 0%, var(--bg) 100%);
    position: relative;
  }

  .gc-final-cta::before {
    content: '';
    position: absolute;
    top: 0;
    left: 50%;
    transform: translateX(-50%);
    width: 1px;
    height: 64px;
    background: var(--accent);
    opacity: 0.6;
    z-index: 1;
  }

  .gc-final-cta-inner {
    position: relative;
    z-index: 1;
    max-width: 840px;
    margin: 0 auto;
  }

  .gc-final-cta-kicker {
    font-family: var(--font-display);
    font-size: 13px;
    font-weight: 600;
    letter-spacing: 2.5px;
    text-transform: uppercase;
    color: var(--text-muted);
    margin-bottom: 28px;
  }

  .gc-final-cta-title {
    font-family: var(--font-display);
    font-size: clamp(40px, 6vw, 76px);
    line-height: 1.1;
    font-weight: 700;
    text-transform: none;
    letter-spacing: -0.3px;
    color: var(--text);
    margin: 0 0 32px;
  }

  .gc-final-cta-title em {
    display: block;
    font-style: normal;
    color: var(--accent);
    text-shadow: 0 0 12px rgba(255, 77, 31, 0.6), 0 0 30px rgba(255, 77, 31, 0.35);
  }

  .gc-final-cta-sub {
    font-family: var(--font-body);
    font-size: 19px;
    line-height: 1.7;
    color: var(--text-muted);
    max-width: 640px;
    margin: 0 auto 52px;
  }

  .gc-final-cta-sub strong {
    color: var(--text);
    font-weight: 600;
  }

  .gc-final-cta-actions {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 20px;
    flex-wrap: wrap;
  }

  .gc-final-cta-actions .btn {
    padding: 20px 44px;
    font-size: 14px;
  }

  /* ==========================================================================
     === RESPONSIVE ===
     ========================================================================== */
  @media (max-width: 768px) {
    .gc-reframe-cta {
      padding: 64px 0;
    }

    .gc-reframe-title {
      font-size: 30px;
      margin-bottom: 20px;
    }

    .gc-reframe-sub {
      font-size: 18px;
      margin-bottom: 32px;
    }

    .gc-reframe-actions .btn {
      width: 100%;
    }

    .gc-final-cta {
      padding: 80px 0;
    }

    .gc-final-cta::before {
      height: 40px;
    }

    .gc-final-cta-kicker {
      font-size: 11px;
      letter-spacing: 1.5px;
      margin-bottom: 20px;
    }

    .gc-final-cta-title {
      font-size: 34px;
      margin-bottom: 22px;
    }

    .gc-final-cta-sub {
      font-size: 16px;
      margin-bottom: 36px;
    }

    .gc-final-cta-actions {
      flex-direction: column;
      align-items: stretch;
      gap: 14px;
    }

    .gc-final-cta-actions .btn {
      width: 100%;
      padding: 18px 32px;
    }
  }

/* ==========================================================================
   === PŁATNOŚĆ (06 // PŁATNOŚĆ) — "floating cards on alt band" ===
   Full-bleed section-alt band; two payment options presented as
   independent --bg-card cards floating on the alt background, with
   generous negative space and a faint radial glow behind the
   featured "raty" card. Reuses existing tokens/components only —
   no new colors introduced.

   MERGED FINAL — combines two independent hardening passes done on top
   of the original concept (payment-section/concepts/C-styles.css):

   ACCESSIBILITY PASS additions (source: C-a11y-styles.css):
   - Added .sr-only utility (site's style.css has no equivalent) for the
     "opens in new tab" label on the Revolut link.
   - Added an explicit :focus-visible rule for .payment-external-link.
     The site already has a global `a:focus-visible { outline: 2px solid
     var(--accent); outline-offset: 2px; }` rule (style.css line ~154) that
     covers .btn.btn-accent with no changes needed. .payment-external-link
     inherits that same global rule too — this override is not strictly
     required for a visible outline to appear, but it bumps outline-offset
     up slightly so the focus ring doesn't collide with the link's own
     border-bottom underline, which sits only 2px below the text.
   - Flagged (and fixed here, see below) a WCAG AA contrast issue on
     .payment-external-caption.

   RESPONSIVE PASS additions (source: C-responsive-styles.css):
   - #platnosc now explicitly sets position: relative itself (previously
     relied on the inherited .section base rule) — makes the component
     self-contained so overflow:hidden reliably clips .payment-band-glow
     regardless of reuse context.
   - New intermediate breakpoint @media (max-width: 1024px): trims grid
     gap, card padding, badge inset, title/price/desc font sizes — fixes
     cramped cards in the 769–1024px band (2-col grid still active there
     but container padding hadn't dropped yet).
   - .payment-card gets min-width: 0 (grid/flex shrink safety net).
   - .payment-card-badge gets white-space: nowrap + max-width safety net
     so it can never wrap or overflow the card.
   - .payment-external-link gets max-width: 100% (future-proofing for
     longer label text).
   - .payment-external-caption gets display: block (unambiguous wrapping
     behavior for the max-width rule).
   - New @media (max-width: 360px) breakpoint: trims button/card padding
     and price font-size for narrow-mobile safety margin around the
     "Zapytaj o raty" button label.

   CONTRAST FIX (this merge, applied per a11y pass's own flagged finding):
   - .payment-external-caption originally combined var(--text-muted) with
     opacity: 0.75, which the a11y pass computed at ~4.43:1 against
     --bg-card (#1c1a16) — just under the WCAG AA 4.5:1 minimum for
     12px text. var(--text-muted) alone was independently computed at
     6.86:1 (comfortably passing). Fix applied: removed opacity: 0.75.
     No other visual property of the caption changed.
   ========================================================================== */

#platnosc {
  position: relative;
  overflow: hidden;
}

/* Faint full-bleed decorative wash behind the featured card. Purely
   decorative — sits behind everything, never intercepts clicks.
   Contained by #platnosc's own position:relative + overflow:hidden,
   so it can never cause horizontal overflow/scroll regardless of
   viewport width. */
#platnosc .payment-band-glow {
  position: absolute;
  top: 50%;
  right: 8%;
  width: 620px;
  height: 620px;
  transform: translateY(-50%);
  background: radial-gradient(circle, var(--accent-dim) 0%, rgba(255, 77, 31, 0) 70%);
  filter: blur(40px);
  pointer-events: none;
  z-index: 0;
}

#platnosc .container {
  position: relative;
  z-index: 1;
}

/* Trust-note sits with the header block, quiet and small */
#platnosc .payment-trust-note {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-top: 20px;
  font-size: 13px;
  color: var(--text-muted);
  letter-spacing: 0.2px;
}

#platnosc .payment-trust-note svg {
  width: 15px;
  height: 15px;
  color: var(--accent);
  flex-shrink: 0;
}

/* ---- Cards grid: spacious, side by side, room to breathe ---- */
.payment-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 40px;
  margin-top: 72px;
  align-items: stretch;
}

.payment-card {
  position: relative;
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  padding: 48px 44px;
  display: flex;
  flex-direction: column;
  min-width: 0; /* allow grid item to shrink below content's intrinsic width */
  transition: transform 0.4s var(--ease), border-color 0.4s var(--ease);
}

.payment-card:hover {
  transform: translateY(-4px);
}

/* Featured "raty" card reuses the site-wide .priority-glow treatment
   exactly as specified — border-color + glow shadow. */
.payment-card.priority-glow {
  background: var(--bg-card);
}

.payment-card-badge {
  position: absolute;
  top: -14px;
  right: 40px;
  background: var(--accent);
  color: #fff;
  font-family: var(--font-display);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 1.5px;
  text-transform: uppercase;
  padding: 8px 18px;
  border-radius: var(--radius-lg);
  white-space: nowrap;
  max-width: calc(100% - 32px); /* never exceeds card width, even on very narrow cards */
}

.payment-card-icon {
  width: 52px;
  height: 52px;
  border-radius: 50%;
  border: 1px solid var(--border);
  background: var(--bg-alt);
  display: flex;
  align-items: center;
  justify-content: center;
  margin-bottom: 28px;
  color: var(--accent);
  flex-shrink: 0;
}

.payment-card.priority-glow .payment-card-icon {
  border-color: var(--accent);
  background: var(--accent-dim);
}

.payment-card-icon svg {
  width: 24px;
  height: 24px;
}

.payment-card-title {
  font-family: var(--font-display);
  font-size: 24px;
  font-weight: 700;
  text-transform: none;
  letter-spacing: -0.2px;
  color: var(--text);
  margin-bottom: 20px;
}

.payment-card-price-row {
  display: flex;
  align-items: baseline;
  gap: 12px;
  flex-wrap: wrap;
  margin-bottom: 24px;
}

.payment-card-price {
  font-family: var(--font-display);
  font-size: 40px;
  font-weight: 700;
  color: var(--accent);
  letter-spacing: 0.3px;
}

.payment-card-price-note {
  font-size: 13px;
  color: var(--text-muted);
  line-height: 1.5;
}

/* Modyfikator UŻYWANY WYŁĄCZNIE na "3825 zł" w karcie "Płatność w ratach"
   (NIE w karcie "Płatność jednorazowa" — tam .payment-card-price zostaje
   bez zmian, w pełnym rozmiarze 40px). W karcie ratach kwota łączna jest
   celowo zdegradowana do drugoplanowej informacji — rozmiar zamieniony
   z tym, co wcześniej miała .installment-viz-amount strong (19px) — bo
   teraz to pojedyncza rata (~159 zł/mies., patrz wyżej) jest pierwszą,
   największą liczbą, jaką widzi odbiorca w tej karcie. */
.payment-card-price--in-installments {
  font-size: 19px;
  font-weight: 800;
  letter-spacing: 0.1px;
  text-shadow: 0 0 12px rgba(255, 77, 31, 0.6), 0 0 30px rgba(255, 77, 31, 0.35);
}

/* Compact per-card countdown — deliberately smaller/quieter than the
   hero .gc-countdown-timer in the "Zniżka 15%" section: a single-line
   accent chip rather than four boxed digit blocks. Uses its own
   payment-card-countdown-* namespace (not gc-countdown-*) so it never
   inherits the hero timer's larger sizing/box styling by accident. */
.payment-card-countdown {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
  margin-bottom: 20px;
  padding: 10px 14px;
  background: var(--accent-dim);
  border-radius: var(--radius-sm);
  color: var(--accent);
  font-size: 13px;
}

.payment-card-countdown-icon {
  width: 16px;
  height: 16px;
  flex-shrink: 0;
}

.payment-card-countdown-text {
  display: inline-flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: 6px;
  line-height: 1.4;
}

.payment-card-countdown-item {
  display: inline-flex;
  align-items: baseline;
  gap: 3px;
  font-variant-numeric: tabular-nums;
}

.payment-card-countdown-num {
  font-family: var(--font-display);
  font-weight: 700;
  color: var(--accent);
}

.payment-card-countdown-label {
  font-size: 12px;
  color: var(--text);
  opacity: 0.85;
}

.payment-card-desc {
  color: var(--text-muted);
  font-size: 15px;
  font-weight: 300;
  line-height: 1.75;
  margin-bottom: 32px;
  flex-grow: 1;
}

.payment-card-actions {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 14px;
  margin-top: auto;
}

.payment-card .btn {
  width: 100%;
}

/* Secondary Revolut link — deliberately smaller/quieter than the
   primary CTA, clearly external, sits below it. */
.payment-external-link {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-family: var(--font-body);
  font-size: 13px;
  font-weight: 500;
  color: var(--text-muted);
  border-bottom: 1px solid var(--border);
  padding-bottom: 2px;
  transition: color 0.3s var(--ease), border-color 0.3s var(--ease);
  max-width: 100%;
}

.payment-external-link:hover {
  color: var(--accent-2);
  border-color: var(--accent-2);
}

/* Explicit focus-visible for this custom link class. The site already
   defines a global `a:focus-visible` outline (style.css) that applies
   here automatically; this rule is additive, not a replacement — it
   just gives the ring slightly more breathing room so it doesn't
   visually merge with the link's own border-bottom underline. */
.payment-external-link:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 4px;
  border-radius: 2px;
}

.payment-external-link svg {
  width: 13px;
  height: 13px;
  flex-shrink: 0;
}

.payment-external-caption {
  display: block;
  font-size: 12px;
  color: var(--text-muted);
  font-style: normal;
  line-height: 1.5;
  max-width: 280px;
}

/* Visually-hidden utility for screen-reader-only text (e.g. "opens in a
   new tab" labels). The site's global style.css has no sr-only /
   visually-hidden equivalent, so it's added here, scoped to this
   section's needs but written as a standard reusable utility class in
   case it's promoted to style.css later. */
.sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

/* ==========================================================================
   RESPONSIVE
   ========================================================================== */

/* ---- Intermediate breakpoint (1024px down to the 769px floor) ----
   The two-column grid stays active in this range (per the concept's
   intent — cards should only stack at the same point the rest of the
   site's grids stack, 768px). But container padding is already 32px
   here (the site only drops to 24px at <=768px), so at the narrow end
   of this range (~769px) each card's available inner content width
   drops to roughly 244px while still carrying full desktop padding
   (44px) and full desktop type sizes (40px price, 24px title). This
   step trims padding/gap/type modestly so the cards keep breathing
   room instead of feeling squeezed just before the stack point. */
@media (max-width: 1024px) {
  .payment-grid {
    gap: 24px;
  }

  .payment-card {
    padding: 36px 28px;
  }

  .payment-card-badge {
    right: 24px;
  }

  .payment-card-title {
    font-size: 21px;
    margin-bottom: 16px;
  }

  .payment-card-price {
    font-size: 32px;
  }

  .installment-viz-amount strong {
    font-size: 32px;
  }

  .payment-card-desc {
    font-size: 14px;
    margin-bottom: 24px;
  }

  .payment-card-countdown {
    font-size: 12px;
  }
}

@media (max-width: 768px) {
  #platnosc .payment-band-glow {
    width: 320px;
    height: 320px;
    right: 50%;
    top: 30%;
    transform: translate(50%, -50%);
  }

  .payment-grid {
    grid-template-columns: 1fr;
    gap: 28px;
    margin-top: 48px;
  }

  .payment-card {
    padding: 36px 28px;
  }

  .payment-card-badge {
    right: 28px;
  }

  .payment-card-price {
    font-size: 34px;
  }

  .installment-viz-amount strong {
    font-size: 34px;
  }

  .payment-card-title {
    font-size: 21px;
  }

  #platnosc .payment-trust-note {
    flex-wrap: wrap;
  }
}

/* ---- Narrow-mobile safety margin (<=360px) ----
   At 320px the primary CTA button ("Zapytaj o raty", the longer of
   the two button labels) has only ~10px of slack between its fitted
   text width and the available button box width once desktop
   horizontal padding (36px per side) is kept. Trimming padding here
   restores a comfortable margin without visibly changing the button's
   proportions at this size. */
@media (max-width: 360px) {
  .payment-card .btn {
    padding-left: 24px;
    padding-right: 24px;
  }

  .payment-card {
    padding: 32px 20px;
  }

  .payment-card-price {
    font-size: 30px;
  }
}

/* ==========================================================================
   REDUCED MOTION
   No override needed here: the only motion in this section is a simple
   translateY(-4px) card lift on hover (.payment-card:hover) and plain
   color/border-color transitions (.payment-external-link:hover,
   .payment-card). All are short, subtle, opacity/position deltas well
   under thresholds associated with motion-triggered discomfort — not
   scale-bounce, not parallax, not auto-playing animation. Left as-is
   per the standard reduced-motion guidance of only overriding movement
   that is large, looping, or user-uncontrollable.
   ========================================================================== */
/* ==========================================================================
   === HERO GALLERY MARQUEE — pas zdjęć tatuaży pod tytułem hero ===
   Mechanizm pętli: identyczny jak .reviews-track / .reviews-marquee-wrap
   (lista kart wypisana w HTML dwa razy, kontener width:max-content,
   translateX(0) -> translateX(-50%), animation-play-state:paused na hover).
   Nowość względem wzorca: zanikanie DOLNEJ krawędzi każdego zdjęcia
   w tło sekcji (var(--bg)), analogicznie do .mannaz-tile-media img /
   .blog-card-image img, ale dostrojone pod portretowe kadry i żywszy,
   przesunięty pionowo układ w stylu "Kimono".

   FINAL — scalenie dwóch niezależnych hardeningów Konceptu A
   (hardening-a11y + hardening-fit). Żadna z dwóch gałęzi nie zmieniała
   tej samej reguły w sposób sprzeczny z drugą — scalenie jest sumą,
   bez konieczności odrzucania żadnego z wariantów. Jedyna decyzja
   redakcyjna: gdzie oba zestawy komentarzy nachodziły na ten sam blok
   (np. sekcja odpowiedzialności/hero-gallery-heading), komentarze
   połączono w jeden, spójny opis zamiast zostawiać duplikaty.

   DOPASOWANIE DO ŻYWEJ STRONY (z hardening-fit, względem concept-a):
   - Sekcja wchodzi BEZPOŚREDNIO pod .hero (id="hero"). Uwaga na kierunek
     gradientu .hero-overlay w css/style.css: "linear-gradient(to top, …)"
     oznacza, że stop 0% leży na DOLE sekcji, a stop 100% na GÓRZE.
     Czyli DÓŁ hero (przy złączeniu z tą karuzelą) ma stop 0% =
     rgba(12,11,10, 0.95) — prawie nieprzezroczysta warstwa koloru
     var(--bg) (12,11,10) nałożona na zdjęcie tła. Karuzela poniżej ma
     tło płaskie var(--bg) = #0c0b0a, czyli TEN SAM kolor przy pełnej
     (0.95 ~ wizualnie pełnej) krycie. Różnica jest minimalna i tonalnie
     spójna — brak twardej linii "szwu". (Stop 100% = 0.55 dotyczy
     GÓRY hero, przy nagłówku, więc nie ma wpływu na to połączenie.)
     ::before poniżej to czysto kosmetyczna, opcjonalna poświata na
     wypadek innego zdjęcia tła hero — można ją usunąć bez ryzyka.
   - Breakpointy ujednolicone do progów używanych w reszcie style.css
     (1024px / 768px / 480px) zamiast jednorazowych 900px/560px.
   - Blok .hero-gallery-heading NIE jest używany w snippet.html na
     żywej stronie (hero ma już własny h1 + opis) — reguły zostawione
     w CSS jako udokumentowany, nieużywany kod na wypadek przyszłego
     samodzielnego użycia sekcji (patrz komentarz przy tym bloku niżej).
   ========================================================================== */

.hero-gallery {
  position: relative;
  background: var(--bg);
  padding: 12px 0 96px;
  overflow: hidden;
}

/* Górny "łącznik" z sekcją hero — delikatna poświata, żeby przejście
   z ciemnego zdjęcia hero na jednolite tło nie było nagłe. Opcjonalne,
   usuń jeśli hero już kończy się na pełnym var(--bg). */
.hero-gallery::before {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 140px;
  background: linear-gradient(to bottom, rgba(255, 77, 31, 0.06), transparent);
  pointer-events: none;
}

.hero-gallery-wrap {
  overflow: hidden;
  width: 100%;
  /* maskowanie lewej/prawej krawędzi paska, tak samo jak .reviews-marquee-wrap,
     żeby karty "wpływały" i "wypływały" zza krawędzi ekranu zamiast urywać się pionową kreską */
  -webkit-mask-image: linear-gradient(to right, transparent 0, black 60px, black calc(100% - 60px), transparent 100%);
  mask-image: linear-gradient(to right, transparent 0, black 60px, black calc(100% - 60px), transparent 100%);
}

.hero-gallery-track {
  display: flex;
  align-items: flex-start;
  gap: 22px;
  width: max-content;
  padding: 34px 0 6px;
  animation: hero-gallery-scroll 55s linear infinite;
  will-change: transform;
}

/* Najedź myszką na dowolną kartę -> cały pas się zatrzymuje (jak w opiniach) */
.hero-gallery-wrap:hover .hero-gallery-track {
  animation-play-state: paused;
}

@keyframes hero-gallery-scroll {
  from { transform: translateX(0); }
  to   { transform: translateX(-50%); }
}

/* --------------------------------------------------------------------
   Karty zdjęć — portret 3:4, wysokości naprzemienne (offset pionowy)
   dla żywszego, mniej "sztywnego" rzędu, jak w referencji Kimono.
   Karta ma tło var(--bg), żeby po zamaskowaniu dołu zdjęcia było widać
   spójne, ciemne tło strony, a nie białą/pustą dziurę.
   -------------------------------------------------------------------- */
.hero-gallery-card {
  position: relative;
  flex: 0 0 auto;
  width: 260px;
  height: 360px;
  border-radius: 28px;
  overflow: hidden;
  background: var(--bg);
}

/* Naprzemienny offset pionowy — powtarza się co 4 karty, żeby rytm
   nie wyglądał na mechaniczny 1-2-1-2. Karty "wystają" ponad górną
   krawędź widocznego pasa, tak jak w referencji. */
.hero-gallery-card:nth-child(4n+1) { margin-top: 0; }
.hero-gallery-card:nth-child(4n+2) { margin-top: -34px; }
.hero-gallery-card:nth-child(4n+3) { margin-top: -14px; }
.hero-gallery-card:nth-child(4n+4) { margin-top: -48px; }

/* co trzecia/piąta karta odrobinę węższa i niższa, dla dodatkowej
   nieregularności szerokości rzędu (opcjonalne, subtelne) */
.hero-gallery-card.is-compact {
  width: 210px;
  height: 300px;
}

.hero-gallery-card img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform 0.8s var(--ease);
  /* Zanikanie dolnej krawędzi zdjęcia w tło karty/strony (var(--bg)).
     58% pełnej krycia, potem stopniowe przejście do transparent na 94% —
     wystarczająco długi gradient (36% wysokości), żeby zanik był płynny,
     "oddechowy", a nie ostrą, widoczną linią odcięcia. */
  -webkit-mask-image: linear-gradient(to bottom, #000 58%, transparent 94%);
  mask-image: linear-gradient(to bottom, #000 58%, transparent 94%);
}

.hero-gallery-wrap:hover .hero-gallery-card img {
  transform: scale(1.02);
}

/* Weryfikacja: hover-scale skaluje <img> (position:absolute; inset:0)
   WEWNĄTRZ .hero-gallery-card, która ma overflow:hidden na tym samym
   elemencie co border-radius (patrz reguła .hero-gallery-card powyżej).
   overflow:hidden przycina każde dziecko wychodzące poza granice
   rodzica niezależnie od jego position, więc scale(1.02) nie wystaje
   poza zaokrąglone rogi karty — brak konfliktu, dodatkowe reguły
   nie są potrzebne. */

/* --------------------------------------------------------------------
   MARTWY KOD (celowo) — .hero-gallery-heading / -eyebrow.
   Na ŻYWEJ stronie karuzela stoi bezpośrednio pod sekcją .hero, która
   już ma własny h1 ("Tatuaż to nie ryzyko...") i opis (.hero-text) —
   snippet.html na produkcji NIE zawiera znaczników .hero-gallery-heading,
   więc te reguły się tam nie renderują (brak dublowania nagłówka).
   Zostawione tu udokumentowane jako gotowy, opcjonalny wariant na
   wypadek użycia sekcji .hero-gallery SAMODZIELNIE (np. na innej
   podstronie bez własnego hero) — wtedy wystarczy dodać z powrotem
   blok <div class="hero-gallery-heading">...</div> w HTML.
   -------------------------------------------------------------------- */
.hero-gallery-heading {
  text-align: center;
  max-width: 640px;
  margin: 0 auto 8px;
  padding: 0 24px;
}

.hero-gallery-eyebrow {
  display: inline-flex;
  align-items: center;
  gap: 14px;
  font-family: var(--font-display);
  font-size: 13px;
  font-weight: 600;
  letter-spacing: 3px;
  text-transform: uppercase;
  color: var(--accent);
  margin-bottom: 18px;
}

.hero-gallery-eyebrow::before,
.hero-gallery-eyebrow::after {
  content: '';
  width: 40px;
  height: 1px;
  background: var(--accent);
}

.hero-gallery-heading p {
  color: var(--text-muted);
  font-size: 16px;
  line-height: 1.7;
}

/* --------------------------------------------------------------------
   Responsywność — progi ujednolicone z resztą style.css (1024/768/480px,
   zamiast jednorazowych 900/560px z concept-a).

   Dolny padding .hero-gallery dobrany względem padding-top sekcji, która
   następuje zaraz po niej na żywej stronie (.gc-stat-section):
     desktop  : 96px + 140px (gc-stat) = 236px odstępu
     <=1024px : 72px +  110px (gc-stat) = 182px
     <=768px  : 64px +   90px (gc-stat) = 154px  <- nowy próg (dodany)
     <=480px  : 56px +   90px (gc-stat) = 146px
   Płynne, malejące zwężanie odstępu, spójne z tym, jak gc-stat-section
   sama zwęża swój padding-top na coraz mniejszych ekranach — bez tego
   dodatkowego 768px kroku odstęp na tabletach/dużych telefonach byłby
   nieproporcjonalnie duży względem responsywnego zagęszczenia reszty strony.
   -------------------------------------------------------------------- */
@media (max-width: 1024px) {
  .hero-gallery {
    padding: 8px 0 72px;
  }

  .hero-gallery-card {
    width: 200px;
    height: 280px;
    border-radius: 22px;
  }

  .hero-gallery-card.is-compact {
    width: 168px;
    height: 236px;
  }

  .hero-gallery-card:nth-child(4n+2) { margin-top: -22px; }
  .hero-gallery-card:nth-child(4n+3) { margin-top: -10px; }
  .hero-gallery-card:nth-child(4n+4) { margin-top: -30px; }

  .hero-gallery-track {
    gap: 16px;
    animation-duration: 40s;
  }
}

@media (max-width: 768px) {
  .hero-gallery {
    padding: 8px 0 64px;
  }
}

@media (max-width: 480px) {
  .hero-gallery {
    padding: 8px 0 56px;
  }

  .hero-gallery-card {
    width: 158px;
    height: 220px;
    border-radius: 18px;
  }

  .hero-gallery-card.is-compact {
    width: 132px;
    height: 186px;
  }
}

/* Uszanuj preferencję ograniczonego ruchu — pas nadal widoczny, ale statyczny */
@media (prefers-reduced-motion: reduce) {
  .hero-gallery-track {
    animation: none;
  }

  /* Skoro animacja stoi, ZESTAW 2 (duplikat, aria-hidden="true") nigdy
     się nie przewinie do widoku — jest to czysty balast: 12 dodatkowych
     <img> w DOM/warstwie renderowania bez żadnej korzyści wizualnej.
     Ukrywamy go całkowicie, żeby nie dublować kosztu pamięci/dekodowania
     u użytkowników z tą preferencją (często starsze urządzenia lub
     świadomy wybór ograniczenia ruchu/zużycia baterii). */
  .hero-gallery-card[aria-hidden="true"] {
    display: none;
  }
}

/* ==========================================================================
   === BRAND PATH — "ścieżka budowania marki" SVG diagram (Etap III) ===
   Analogiczne do .spec-path (Etap I), ale osobne klasy .brand-path* żeby
   nie kolidować strukturalnie z sekcją specjalizacji. Jedna wijąca się
   linia prowadzi przez kroki budowania marki (Treści → Zaufanie →
   Automatyzacja/AI → Ekosystem FB/IG/TikTok/Google) i kończy się większym,
   świecącym węzłem docelowym ("Pełny Kalendarz Klientów").
   ========================================================================== */
.brand-path {
  width: 100%;
  margin: 28px 0 8px;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
}

.brand-path-svg {
  display: block;
  width: 100%;
  height: auto;
  overflow: visible;
}

.brand-path-svg--desktop {
  aspect-ratio: 1200 / 300;
  min-height: 160px;
}

.brand-path-svg--mobile {
  aspect-ratio: 320 / 900;
  min-height: 420px;
  display: none;
}

.brand-path-line {
  stroke: var(--border);
  stroke-width: 1.5;
  stroke-linecap: round;
  fill: none;
  vector-effect: non-scaling-stroke;
}

.brand-node circle {
  fill: var(--bg-card);
  stroke: var(--border);
  stroke-width: 1.5;
  vector-effect: non-scaling-stroke;
  transition: stroke 0.3s var(--ease);
}

.brand-node text {
  font-family: var(--font-display);
  font-size: 16px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 1px;
  fill: var(--text-muted);
}

.brand-node text.brand-node-sub {
  font-family: var(--font-body);
  font-size: 12px;
  font-weight: 400;
  text-transform: none;
  letter-spacing: 0;
  fill: var(--text-muted);
  opacity: 0.75;
}

.brand-node--dest circle.brand-node-dest-glow {
  fill: var(--accent);
  opacity: 0.35;
}

.brand-node--dest circle.brand-node-dest-ring {
  fill: var(--accent-dim);
  stroke: var(--accent);
  stroke-width: 1.5;
  vector-effect: non-scaling-stroke;
}

.brand-node--dest circle.brand-node-dest-core {
  fill: var(--accent);
}

.brand-node--dest .brand-node-dest-label {
  font-family: var(--font-display);
  font-size: 18px;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 1.2px;
  fill: var(--text);
}

/* Tablet "tweener" band: SVG text scales down with the whole graphic,
   so nudge font-size up here to keep labels legible as the card narrows. */
@media (min-width: 769px) and (max-width: 1024px) {
  .brand-node text {
    font-size: 18px;
  }

  .brand-node text.brand-node-sub {
    font-size: 13px;
  }

  .brand-node--dest .brand-node-dest-label {
    font-size: 20px;
  }
}

@media (max-width: 768px) {
  .brand-path {
    margin: 20px 0 4px;
  }

  .brand-path-svg--desktop {
    display: none;
  }

  .brand-path-svg--mobile {
    display: block;
    max-width: 340px;
    margin: 0 auto;
  }

  .brand-node text {
    font-size: 15px;
  }

  .brand-node text.brand-node-sub {
    font-size: 11px;
  }

  .brand-node--dest .brand-node-dest-label {
    font-size: 17px;
  }
}

/* Narrow phones: card padding eats into available width, so the SVG
   scale factor drops further — bump font-size once more. */
@media (max-width: 400px) {
  .brand-node text {
    font-size: 16px;
  }

  .brand-node text.brand-node-sub {
    font-size: 12px;
  }

  .brand-node--dest .brand-node-dest-label {
    font-size: 18px;
  }
}

@media (prefers-reduced-motion: reduce) {
  .brand-node circle {
    transition: none;
  }
}

/* ==========================================================================
   === "FIRST STEP" WORDMARK (.fs-mark) ===
   Indywidualny, rozpoznawalny "wordmark" dla nazwy własnej programu
   mentoringowego "First Step" (patrz szkolenia.html, sekcja #program).
   To NIE jest zwykłe wyróżnienie słowa — od ogólnej klasy .hl (zwykłe
   "color: var(--accent); font-weight: 600;" używane wszędzie do
   podbicia dowolnego słowa/liczby) celowo odstaje mocniej: cięższa waga
   fontu, delikatnie poszerzony tracking i własny akcent-kropka za tekstem
   (echo loga w nagłówku: "MANNAZ●", patrz .logo / .logo-accent, linia
   ~372-386), żeby "First Step" czytało się jako osobna, zapamiętywalna
   marka wewnątrz marki Mannaz, a nie jako kolejne podkreślone słowo.

   Glow (text-shadow) to ten sam, przyjęty na całej stronie wzorzec
   poświaty co np. .hero-title em, .gc-stat-number czy .section-title em
   (patrz "0 0 12px rgba(255, 77, 31, 0.6)" — grep znajdzie pozostałe
   użycia). Kolor budujemy WYŁĄCZNIE ze zmiennej --accent (bez twardo
   zakodowanych hexów), więc automatycznie działa poprawnie w trybie
   jasnym (patrz #themeToggle / .light-mode na górze pliku, sekcja
   "LIGHT MODE"), bez potrzeby osobnych override'ów.

   Efekt jest celowo STATYCZNY (bez @keyframes/animacji) — prostszy,
   tańszy, nie odwraca uwagi od treści tytułu i nie wymaga bloku
   prefers-reduced-motion (nic tu się nie rusza).

   UŻYCIE — WYŁĄCZNIE w kontekstach tytułowych w szkolenia.html:
     - nagłówki h1 / h2 / h3,
     - .eyebrow / kicker (małe etykiety-oznaczenia nad tytułem).
   NIGDY w zwykłym tekście/akapitach opisowych ani na blogu — to
   świadoma decyzja projektowa: wordmark ma się pojawiać tylko tam,
   gdzie nazwa "First Step" pełni rolę tytułu/nagłówka, a nie w biegu
   zdania, żeby nie "krzyczeć" z każdego wspomnienia programu w treści. */
.fs-mark {
  display: inline-block;
  position: relative;
  font-weight: 800;
  letter-spacing: 0.02em;
  color: var(--accent);
  text-shadow: 0 0 12px rgba(255, 77, 31, 0.6), 0 0 30px rgba(255, 77, 31, 0.35);
  padding-right: 0.45em;
}

/* Mała, świecąca kropka-akcent tuż po tekście — echo kropki z loga
   "MANNAZ●" (.logo-accent, linia ~383). Uniesiona względem baseline
   (translateY), żeby wizualnie siedziała na wysokości x-height liter,
   a nie zwisała na linii bazowej jak zwykły znak interpunkcyjny. */
.fs-mark::after {
  content: '';
  position: absolute;
  right: 0;
  top: 0.35em;
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--accent);
  box-shadow: 0 0 8px rgba(255, 77, 31, 0.75), 0 0 16px rgba(255, 77, 31, 0.4);
  transform: translateY(-0.25em);
}

/* ==========================================================================
   === PROGRAM CALLOUT (.program-callout) ===
   Wyróżniona "ramka" (card/blockquote) wokół pojedynczego akapitu bio,
   który wspomina autorski program szkoleniowy First Step. Używana w
   DOKŁADNIE DWÓCH miejscach:
     1) index.html — sekcja "O mnie" (#o-nas, .gc-mentor-text) — akapit
        "Rafał prowadzi też autorski program szkoleniowy First Step...".
     2) szkolenia.html — sekcja "Instruktor programu" (.gc-mentor,
        .gc-mentor-text) — akapit "...w autorskim programie szkoleniowym
        First Step, skierowanym do przyszłych tatuażystów.".

   Cel: wizualnie "wyjąć" ten jeden akapit z biegu zwykłego tekstu opisowego
   i podkreślić, że to osobna, ważna informacja (odnośnik do programu
   szkoleniowego), a nie kolejne zdanie w akapicie. Lewy akcentowany
   border + subtelny glow (box-shadow) w tonie --accent (#ff4d1f /
   rgb(255, 77, 31)) to ten sam ton poświaty, co .fs-mark czy .hero-title
   em gdzie indziej na stronie — spójność wizualna.

   WYJĄTEK od reguły ".fs-mark tylko w tytułach" (patrz komentarz nad
   .fs-mark powyżej w tym pliku): wewnątrz .program-callout fraza
   "First Step" jest owinięta w <span class="fs-mark">, ponieważ cały
   ten akapit pełni teraz rolę wyróżnionego, tytułowo-callout'owego
   komponentu, a nie zwykłego tekstu w biegu zdania. To świadomy,
   celowy wyjątek ograniczony wyłącznie do tych dwóch miejsc — NIE
   traktować jako precedens do używania .fs-mark w innych akapitach.

   Zmienne CSS (var(--accent), var(--bg-card), var(--border)) zapewniają
   poprawne działanie w obu motywach (dark/light, patrz :root.light-mode
   na górze pliku) bez osobnych override'ów. */
.program-callout {
  margin: 24px 0;
  padding: 24px 28px;
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-left: 3px solid var(--accent);
  border-radius: var(--radius-sm);
  box-shadow: 0 0 0 1px rgba(255, 77, 31, 0.15), 0 8px 24px rgba(255, 77, 31, 0.08);
}

.program-callout p {
  margin: 0;
}

/* ==========================================================================
   === INSTALLMENT VISUALIZATION — ".installment-viz" ===
   Minimalistyczny, statyczny (bez JS/animacji) wskaźnik "rozłożenia na
   raty" dla karty "Płatność w ratach" na szkolenia.html (sekcja
   #platnosc, .payment-card.priority-glow). Siedzi POD ceną
   (.payment-card-price-row) i NAD opisem (.payment-card-desc) — patrz
   .payment-card-desc powyżej w tym pliku dla dokładnego miejsca w
   przepływie karty.

   Cena programu: 3825 zł (promocyjna; regularnie 4500 zł, patrz
   .payment-card-price / .payment-card-price-note wyżej). Rozłożone na
   24 miesiące: 3825 / 24 = 159,375 zł -> zaokrąglone do "~159 zł/mies."
   Wartości (24, ~159 zł) są wpisane bezpośrednio w HTML (tekst), CSS tu
   tylko je stylizuje — jeśli cena programu się zmieni, HTML trzeba
   zaktualizować ręcznie, ten blok CSS nie przelicza niczego.

   Struktura (klasy, do użycia w HTML):
     .installment-viz              — kontener całości (flex column, gap)
       .installment-viz-amount    — wiersz tekstu "159 zł / mies."; zawiera
                                     <strong> (kwota, duża/mocna/--accent/glow)
                                     + zwykły tekst " / mies." (wyciszony)
       .installment-viz-bar        — poziomy pasek, 24 segmenty (flex row)
         .installment-viz-segment  — pojedynczy mały prostokąt-kreska (x24 w HTML)
       .installment-viz-note       — podpis pod paskiem, np. "24 raty × ~159 zł
                                     = 3825 zł łącznie" — małe, wyciszone

   Design celowo skromny: te same tokeny co reszta .payment-card-*
   (--accent, --accent-dim, --text-muted, --border, --radius-sm), żeby
   komponent wizualnie "należał" do karty, a nie wyglądał jak osobny
   widget. Pasek segmentów używa --accent w niskiej stałej opacity
   (0.35) zamiast --accent-dim, bo --accent-dim jest już zajęty przez tło
   ikony/countdown w tej samej karcie (patrz .payment-card-countdown
   wyżej) — inny odcień intensywności pozwala segmentom czytać się jako
   osobny, subtelny element, nie duplikat tamtych.

   Ciągła animacja "spłaty": .installment-viz-bar::after to pojedynczy
   podświetlony prostokąt (pełna jasność --accent + glow), który w pętli
   przejeżdża od lewej do prawej przez wszystkie 24 segmenty, zanika przy
   prawej krawędzi i zaczyna od nowa od lewej — czysto CSS (dwie
   niezależne animacje na tym samym pseudoelemencie: jedna steruje
   pozycją w dyskretnych krokach co 1/24 szerokości — steps(24) — druga
   steruje płynnym pojawianiem/znikaniem na początku i końcu każdego
   przejazdu). Wyłączona całkowicie dla prefers-reduced-motion (patrz
   media query niżej) — ciągła, nieustająca pętla byłaby uciążliwa dla
   osób z tą preferencją, więc pasek wraca wtedy do czysto statycznego
   wskaźnika (segmenty w stałej opacity 0.35, bez ruchu). */

.installment-viz {
  display: flex;
  flex-direction: column;
  gap: 10px;
  margin-bottom: 24px;
  transition: opacity 0.3s var(--ease);
}

.installment-viz-amount {
  font-family: var(--font-body);
  font-size: 15px;
  color: var(--text-muted);
  line-height: 1.5;
}

/* Ta liczba ("~159 zł") jest CELOWO teraz największym, najmocniejszym
   akcentem w karcie "Płatność w ratach" — zamieniona rozmiarem z
   .payment-card-price (patrz .payment-card-price--in-installments
   niżej): pojedyncza, przystępna rata ma być widoczna od razu, zamiast
   dużej kwoty łącznej — to ona lepiej działa na decyzję o zapisie niż
   pokazanie 3825 zł jako pierwszej, największej liczby w karcie. */
.installment-viz-amount strong {
  font-family: var(--font-display);
  font-size: 40px;
  font-weight: 800;
  color: var(--accent);
  text-shadow: 0 0 12px rgba(255, 77, 31, 0.6), 0 0 30px rgba(255, 77, 31, 0.35);
  letter-spacing: 0.3px;
}

/* Pozioma "oś czasu": 24 małe, równe segmenty w jednym rzędzie.
   flex: 1 1 0 na segmentach = równa szerokość niezależnie od karty;
   gap trzyma je jako wyraźnie odrębne "raty", nie jeden pasek. */
.installment-viz-bar {
  position: relative;
  display: flex;
  align-items: center;
  gap: 2px;
  width: 100%;
}

.installment-viz-segment {
  flex: 1 1 0;
  height: 5px;
  min-width: 2px;
  border-radius: 2px;
  background: var(--accent);
  opacity: 0.35;
  transition: opacity 0.3s var(--ease);
}

.installment-viz:hover .installment-viz-segment {
  opacity: 0.55;
}

/* Podświetlony prostokąt "w ruchu" — jeden świecący segment, który
   nieustannie przejeżdża od lewej do prawej przez pasek 24 rat i wraca
   na początek, jak wskaźnik postępującej spłaty. Szerokość ~1/24 paska,
   żeby wizualnie pokrywał dokładnie jeden .installment-viz-segment na
   raz. steps(24) na pozycji sprawia, że "przeskakuje" od raty do raty
   (a nie płynnie się ślizga) — stąd "pojedynczy podświetlony prostokąt",
   nie smuga światła. Druga animacja (opacity, ease-in-out) odpowiada za
   miękkie pojawienie się na starcie i zanik przy prawej krawędzi przed
   powrotem na start — 6s na pełny przejazd to spokojne, niepospieszne
   tempo (ok. 250ms na ratę), zgodnie z prośbą "nie za szybko / płynnie". */
.installment-viz-bar::after {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  width: calc(100% / 24);
  height: 100%;
  border-radius: 2px;
  background: var(--accent);
  box-shadow: 0 0 8px rgba(255, 77, 31, 0.85), 0 0 16px rgba(255, 77, 31, 0.5);
  pointer-events: none;
  animation:
    installment-sweep-move 6s steps(24, jump-end) infinite,
    installment-sweep-fade 6s ease-in-out infinite;
}

@keyframes installment-sweep-move {
  0% {
    left: 0%;
  }
  100% {
    left: calc(100% - 100% / 24);
  }
}

@keyframes installment-sweep-fade {
  0%, 100% {
    opacity: 0;
  }
  6%, 90% {
    opacity: 1;
  }
}

.installment-viz-note {
  margin-top: 8px;
  font-size: 12px;
  color: var(--text-muted);
  line-height: 1.5;
}

/* ---- Responsive: keep the 24-segment bar from looking cramped/broken ---- */
@media (max-width: 640px) {
  .installment-viz {
    gap: 8px;
    margin-bottom: 20px;
  }

  .installment-viz-amount {
    font-size: 14px;
  }

  .installment-viz-amount strong {
    font-size: 30px;
  }

  .installment-viz-bar {
    gap: 1.5px;
  }

  .installment-viz-segment {
    height: 4px;
    min-width: 1.5px;
  }

  .installment-viz-note {
    font-size: 11px;
  }

  .payment-card-price--in-installments {
    font-size: 17px;
  }
}

/* Osoby z prefers-reduced-motion: reduce nie dostają nieustającej pętli
   "spłaty" — pasek wraca do czysto statycznego wskaźnika (segmenty w
   stałej opacity, bez podświetlonego prostokąta w ruchu). */
@media (prefers-reduced-motion: reduce) {
  .installment-viz-bar::after {
    animation: none !important;
    opacity: 0 !important;
  }
}

/* ==========================================================================
   === EXPERIENCE TIMELINE (".experience-timeline") ===
   Pozioma "linia czasu" 2016 → 2026 (10 lat działalności), umieszczona w
   index.html, sekcja "O nas" (id="o-nas", .gc-mentor), TUŻ POD blokiem
   statystyk .gc-mentor-stats ("10 lat doświadczenia / 100+ opinii /
   1500+ realizacji") — wizualnie jako rozwinięcie/dowód liczby "10 lat".

   Komponent obsługuje WIELE niezależnych instancji na jednej stronie
   (np. na szkolenia.html występuje dwukrotnie: pod .gc-mentor-stats
   jako #experienceTimelineMentor, i w .gc-stat-section jako
   #experienceTimelineStat z dodatkowym modyfikatorem
   .experience-timeline--compact) — dlatego wszystkie selektory poniżej
   są oparte WYŁĄCZNIE o klasę .experience-timeline, nigdy o ID.

   Struktura:
     .experience-timeline[id="..."]
       .experience-timeline-line-wrap
         .experience-timeline-line
       .experience-timeline-points
         .experience-timeline-point[style="--i:0"..."--i:10"]  (11 punktów, 2016-2026)
           .experience-timeline-dot
           .experience-timeline-year
           .experience-timeline-label  (TYLKO na --i:0 [2016] i --i:4 [2020, .experience-timeline-point--highlight])

   Animacja (trigger, dodawany przez js/script.js):
     initExperienceTimeline() obserwuje WSZYSTKIE elementy .experience-timeline
     na stronie jednym współdzielonym IntersectionObserver i JEDNORAZOWO
     dodaje klasę .is-in-view do KAŻDEJ instancji osobno, gdy TA KONKRETNA
     instancja wjedzie w viewport (klasa nie jest później usuwana — tak
     jak inne scroll-reveal na tej stronie, np. .mannaz-section.visible).
     Cały efekt wizualny żyje tutaj, w CSS, jako reakcja na tę klasę:
       - .experience-timeline-line "rysuje się" od lewej (2016) do prawej
         (2026) przez transform: scaleX(0) → scaleX(1) z
         transform-origin: left center (symbolizuje upływ czasu do dziś),
       - każdy .experience-timeline-point pojawia się (opacity+translateY)
         z narastającym transition-delay sterowanym zmienną --i (inline
         w HTML) — "linia dociera do kolejnego roku" po kolei.
   ========================================================================== */
.experience-timeline {
  position: relative;
  margin-top: 44px;
  padding: 0 4px;
}

/* Wrapper trzyma samą linię w jednej płaszczyźnie z .experience-timeline-points
   (position: absolute + top dopasowany do środka kropek, które mają
   wysokość 8px / 13px dla wyróżnionego punktu) — linia przechodzi
   dokładnie przez środek wszystkich .experience-timeline-dot. */
.experience-timeline-line-wrap {
  position: relative;
  height: 2px;
  margin: 0 4px;
}

.experience-timeline-line {
  position: absolute;
  inset: 0;
  height: 2px;
  border-radius: var(--radius-lg);
  background: var(--accent);
  box-shadow: 0 0 8px rgba(255, 77, 31, 0.5);
  transform: scaleX(0);
  transform-origin: left center;
  /* Czas trwania (2s) jest CELOWO zsynchronizowany z globalną stałą
     DURATION = 2000ms liczników count-up (.stat-number, initStatCounters
     w js/script.js) — dzięki temu animacja odliczania liczby (np. "10 lat")
     i animacja rysowania tej linii kończą się w tym samym momencie, we
     wspólnym, spokojnym/niepospiesznym tempie. Nie zmieniać bez
     jednoczesnej zmiany DURATION w js/script.js. */
  transition: transform 2s var(--ease);
}

.experience-timeline.is-in-view .experience-timeline-line {
  transform: scaleX(1);
}

.experience-timeline-points {
  display: flex;
  align-items: flex-start;
  position: relative;
  margin-top: -5px;
}

/* WAŻNE: flex: 1 1 0 (+ min-width: 0) daje KAŻDEMU z 11 punktów dokładnie
   równą 1/11 szerokości paska. Bez tego (np. samo justify-content:
   space-between na punktach o różnej szerokości natywnej) punkty z
   etykietą (2016, 2020 — szersze przez .experience-timeline-label)
   "zabierały" więcej miejsca, a sąsiednie, węższe punkty (same lata bez
   etykiety) doklejały się do siebie niemal bez odstępu — lata typu
   "2017 2018 2019" czy "2021 2022 2023 2024 2025 2026" zlewały się w
   jeden nieczytelny ciąg, szczególnie w węższym wariancie --compact.
   Równy podział na kolumny eliminuje ten problem niezależnie od tego,
   które punkty mają etykiety. */
.experience-timeline-point {
  flex: 1 1 0;
  min-width: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 6px;
  position: relative;
  opacity: 0;
  transform: translateY(6px);
  transition: opacity 0.5s var(--ease), transform 0.5s var(--ease);
  transition-delay: calc(var(--i) * 0.12s + 0.3s);
}

.experience-timeline.is-in-view .experience-timeline-point {
  opacity: 1;
  transform: translateY(0);
}

.experience-timeline-dot {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--accent);
  box-shadow: 0 0 6px rgba(255, 77, 31, 0.6);
  flex-shrink: 0;
}

.experience-timeline-year {
  font-family: var(--font-display);
  font-size: 13px;
  font-weight: 500;
  color: var(--text-muted);
  white-space: nowrap;
}

/* Punkt 2020 — powstanie Mannaz Studio Tatuażu — najważniejszy moment na
   osi, wyróżniony mocniej niż pozostałe 10 punktów (większa kropka,
   podwójny glow, pogrubiony rok w kolorze akcentu). */
.experience-timeline-point--highlight .experience-timeline-dot {
  width: 13px;
  height: 13px;
  box-shadow: 0 0 10px rgba(255, 77, 31, 0.8), 0 0 22px rgba(255, 77, 31, 0.4);
}

.experience-timeline-point--highlight .experience-timeline-year {
  color: var(--accent);
  font-weight: 700;
}

.experience-timeline-label {
  font-family: var(--font-body);
  font-size: 11px;
  color: var(--text-muted);
  text-align: center;
  line-height: 1.3;
  max-width: 90px;
}

/* Etykieta 2020 ("Mannaz Studio Tatuażu") to najważniejsza informacja na
   całej osi czasu (moment powstania obecnego studia) — eksponujemy ją
   mocniej niż etykietę 2016 przez kolor akcentu i grubszą wagę fontu. */
.experience-timeline-point--highlight .experience-timeline-label {
  color: var(--accent);
  font-weight: 600;
}

/* --- Responsive --- */
@media (max-width: 768px) {
  .experience-timeline {
    margin-top: 36px;
  }

  .experience-timeline-point {
    gap: 4px;
  }

  .experience-timeline-dot {
    width: 6px;
    height: 6px;
  }

  .experience-timeline-point--highlight .experience-timeline-dot {
    width: 11px;
    height: 11px;
  }

  .experience-timeline-year {
    font-size: 11px;
  }

  .experience-timeline-label {
    font-size: 10px;
    max-width: 70px;
  }
}

/* Bardzo wąskie ekrany: 11 punktów rozłożonych na space-between zaczyna się
   ściskać do nieczytelności. Zamiast chować lata przez display:none (co
   desynchronizowałoby CSS z HTML/JS, które zakładają 11 widocznych
   punktów), pozwalamy na poziomy scroll — linia i wszystkie kropki/lata
   zostają w DOM i widoczne, tylko kontener przewija się w bok. */
@media (max-width: 480px) {
  .experience-timeline {
    overflow-x: auto;
    padding-bottom: 4px;
    -webkit-overflow-scrolling: touch;
  }

  .experience-timeline-line-wrap {
    min-width: 480px;
  }

  .experience-timeline-points {
    min-width: 480px;
  }

  .experience-timeline-label {
    font-size: 9px;
    max-width: 56px;
  }

  /* Etykiety 2016 i 2020 (jedyne obecne w HTML) muszą pozostać czytelne
     nawet na najmniejszych ekranach — nie zmniejszamy ich poniżej progu
     czytelności mimo ogólnego ścieśnienia powyżej. */
  .experience-timeline-point--highlight .experience-timeline-label {
    font-size: 10px;
  }
}

/* Progressive enhancement: gdyby .is-in-view było obecne od początku
   (np. JS zdążył je dodać zanim przeglądarka zdążyła zastosować CSS
   transitions), użytkownicy z prefers-reduced-motion i tak nie zobaczą
   żadnego ruchu — zgodnie z konwencją reszty strony (patrz
   .hero-gallery-track, .brand-node circle powyżej). */
@media (prefers-reduced-motion: reduce) {
  .experience-timeline-line,
  .experience-timeline-point {
    transition: none !important;
  }
}

/* Wyłączenie animacji "shine sweep" na .btn-accent-sm (guzik "Umów wizytę"
   w headerze) dla użytkowników z prefers-reduced-motion: reduce. */
@media (prefers-reduced-motion: reduce) {
  .btn-accent-sm::before {
    animation: none;
  }
}

/* Wariant --compact: używany w .gc-stat-section (szkolenia.html) — sekcja
   jest wyśrodkowana (.gc-stat-container: display:flex; flex-direction:column;
   align-items:center; text-align:center), więc pełna szerokość kontenera
   (1280px) rozciągnęłaby 11 punktów zbyt rzadko. Zawężamy i centrujemy
   komponent do szerokości zbliżonej do .gc-stat-desc (max-width: 560px),
   odrobinę szerzej, żeby 11 punktów miało wystarczająco miejsca. */
.experience-timeline--compact {
  max-width: 920px;
  margin-left: auto;
  margin-right: auto;
  margin-bottom: 32px;
}

.experience-timeline--compact .experience-timeline-label {
  max-width: 78px;
}

/* ==========================================================================
   === PORTFOLIO — PRZEBUDOWA PODSTRONY (portfolio.html) ===
   v2 (poprawki): sekcja wyboru stylu to teraz duże przyciski kategorii
   (.style-select-grid/.style-select-btn), a wszystkie 6 stylów jest
   opakowanych we WSPÓLNY .stage-timeline (dokładnie ten sam komponent co
   oś czasu etapów na szkolenia.html: .stage-rail/.stage-panels/.stage-panel/
   .stage-panel-header/.stage-panel-badge) — pełny recykling istniejącego
   JS (initStageTimeline w js/script.js) i CSS, zero nowej logiki animacji.
   Każdy styl to jeden .stage-panel — ta sama "premium karta" (patrz blok
   "STAGE PANEL — PREMIUM CARD UPGRADE" wyżej), więc zdjęcie/opis/odznaki/
   galeria/opinia danego stylu są fizycznie w jednej wspólnej ramce.
   ========================================================================== */
/* Nagłówek sekcji wyboru stylu odziedzicza wyśrodkowanie po tym samym
   wzorcu co #program .container na szkolenia.html (patrz ta reguła wyżej),
   ale treść WEWNĄTRZ poszczególnych .stage-panel (zdjęcie+opis, galeria,
   opinia, linki) musi zostać wyrównana do lewej — stąd jawny reset niżej. */
#wybierz-styl > .container {
  text-align: center;
}

#wybierz-styl > .container > .eyebrow {
  justify-content: center;
}

#wybierz-styl > .container > .section-sub {
  margin-left: auto;
  margin-right: auto;
}

/* Na szkolenia.html .stage-timeline sąsiaduje bezpośrednio z jednowierszowym
   .section-sub (0 marginesu wystarcza). Tutaj między siatką dużych, bordered
   przycisków kategorii (.style-select-grid) a pierwszą "premium kartą"
   (.stage-panel) potrzeba wyraźnego oddechu — bez tego dwa graniczące
   ze sobą bordered bloki stykałyby się krawędziami. */
#wybierz-styl .stage-timeline {
  margin-top: 72px;
}

.portfolio-style-top,
.style-testimonial,
.portfolio-style-links {
  text-align: left;
}

/* Duże, czytelne przyciski kategorii (zastępują dawne kafelki ze zdjęciem +
   osobnym CTA) — nazwa stylu, jedno zdanie wyjaśnienia i ikona, całość
   klikalna, kliknięcie płynnie przewija do #style-... niżej (natywny
   scroll-behavior:smooth + initSmoothAnchorScroll w js/script.js). */
.style-select-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 20px;
  margin-top: 48px;
  text-align: left;
}

.style-select-btn {
  display: flex;
  align-items: flex-start;
  gap: 18px;
  padding: 28px 26px;
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  color: var(--text);
  text-decoration: none;
  transition: border-color 0.3s var(--ease), transform 0.3s var(--ease), background 0.3s var(--ease);
}

.style-select-btn:hover {
  border-color: var(--accent);
  background: var(--bg-alt);
  transform: translateY(-4px);
}

.style-select-icon {
  flex-shrink: 0;
  width: 52px;
  height: 52px;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--accent-dim);
  color: var(--accent);
  transition: background 0.3s var(--ease), color 0.3s var(--ease), transform 0.3s var(--ease);
}

.style-select-icon svg {
  width: 24px;
  height: 24px;
}

.style-select-btn:hover .style-select-icon {
  background: var(--accent);
  color: #fff;
  transform: scale(1.08);
}

.style-select-body {
  display: flex;
  flex-direction: column;
  min-width: 0;
}

.style-select-name {
  font-family: var(--font-display);
  font-size: 19px;
  font-weight: 700;
  letter-spacing: 0.2px;
  color: var(--text);
  margin-bottom: 6px;
}

.style-select-desc {
  font-size: 14px;
  line-height: 1.55;
  color: var(--text-muted);
}

@media (max-width: 1024px) {
  .style-select-grid {
    grid-template-columns: repeat(2, 1fr);
  }
}

@media (max-width: 640px) {
  .style-select-grid {
    grid-template-columns: 1fr;
  }
}

.portfolio-style-top {
  display: grid;
  grid-template-columns: minmax(0, 0.85fr) minmax(0, 1fr);
  gap: 64px;
  align-items: center;
}

.portfolio-style-photo {
  position: relative;
  border-radius: 20px;
  overflow: hidden;
  aspect-ratio: 4 / 5;
  box-shadow:
    0 30px 70px -30px rgba(0, 0, 0, 0.6),
    0 0 0 1px var(--border);
}

.portfolio-style-photo img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  transition: transform 0.7s var(--ease);
}

.portfolio-style-photo:hover img {
  transform: scale(1.04);
}

.portfolio-style-content p {
  color: var(--text-muted);
  font-size: 17px;
  line-height: 1.75;
  max-width: 520px;
}

.portfolio-badges {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  margin-top: 28px;
}

.trait-chip {
  display: inline-flex;
  align-items: center;
  padding: 9px 18px;
  border-radius: var(--radius-lg);
  border: 1px solid var(--border);
  background: var(--bg-card);
  font-family: var(--font-display);
  font-size: 13px;
  font-weight: 600;
  letter-spacing: 0.3px;
  color: var(--text-muted);
}

/* Pasek autoprzewijanych zdjęć danego stylu — ta sama technika co
   .ig-follow-strip/.ig-follow-track (duplikat zestawu + translateX(-50%) w
   pętli), tylko większe kadry i bez przygaszenia filter (tu mają być w pełni
   żywe kolory, to główna prezentacja stylu, nie dyskretny pasek w tle). */
.style-marquee-wrap {
  position: relative;
  overflow: hidden;
  margin-top: 48px;
  border-radius: var(--radius-sm);
}

.style-marquee-track {
  display: flex;
  gap: 14px;
  width: max-content;
  animation-name: ig-follow-scroll;
  animation-timing-function: linear;
  animation-iteration-count: infinite;
}

.style-marquee-wrap:hover .style-marquee-track {
  animation-play-state: paused;
}

/* Warianty z bardzo małą liczbą realnych zdjęć (whip shading, concept
   tattoo) nie dostają animacji — pętla z 1-3 kadrami wyglądałaby na zepsutą,
   nie na "nieskończoną galerię". JS (initPortfolioStyleMarquees) dokłada tę
   klasę automatycznie, gdy liczba zdjęć w kategorii jest zbyt mała. */
.style-marquee-wrap.is-static .style-marquee-track {
  animation: none;
  flex-wrap: wrap;
  width: 100%;
}

.style-marquee-item {
  display: block;
  flex-shrink: 0;
  width: 220px;
  height: 220px;
  border-radius: var(--radius-sm);
  overflow: hidden;
  position: relative;
  transition: box-shadow 0.4s var(--ease);
}

.style-marquee-item img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  transition: transform 0.5s var(--ease);
}

.style-marquee-item:hover {
  box-shadow:
    0 20px 45px -18px rgba(0, 0, 0, 0.55),
    0 0 0 1px var(--border);
  z-index: 2;
}

.style-marquee-item:hover img {
  transform: scale(1.08);
}

.style-marquee-more {
  display: inline-block;
  margin-top: 20px;
  font-family: var(--font-display);
  font-size: 14px;
  font-weight: 600;
  color: var(--accent);
}

.style-marquee-more:hover {
  color: var(--accent-2);
}

/* Gotowy komponent opinii klienta pod galerią danego stylu — do podmiany na
   prawdziwe opinie, gdy będą dostępne per styl (na razie ilustracyjne,
   spójne tonalnie z resztą serwisu). */
/* Wiersz łączący opinię klienta z guzikiem "Zobacz całe portfolio na
   Instagramie" (ten sam styl guzika co .btn-accent.btn-premium używane gdzie
   indziej na stronie) — na wyraźną prośbę przeniesiony tu z osobnego linku
   tekstowego pod galerią, żeby stać "kolo opinii" w każdej sekcji stylu. */
.style-testimonial-row {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 20px;
  margin-top: 40px;
}

.style-testimonial {
  display: flex;
  align-items: center;
  gap: 18px;
  padding: 22px 26px;
  max-width: 620px;
  flex: 1 1 380px;
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
}

.style-testimonial-ig-cta {
  flex-shrink: 0;
}

.style-testimonial-avatar {
  flex-shrink: 0;
  width: 48px;
  height: 48px;
  border-radius: 50%;
  background: var(--accent-dim);
  color: var(--accent);
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 18px;
}

.style-testimonial-body p {
  font-size: 15px;
  line-height: 1.6;
  color: var(--text);
  margin-bottom: 8px;
}

.style-testimonial-meta {
  display: flex;
  align-items: center;
  gap: 8px;
  font-family: var(--font-display);
  font-size: 13px;
  font-weight: 600;
  color: var(--text-muted);
}

.style-testimonial-meta .stars {
  font-size: 13px;
  letter-spacing: 1px;
}

@media (max-width: 1024px) {
  .portfolio-style-top {
    gap: 44px;
  }

  .portfolio-style-content h2 {
    font-size: 32px;
  }
}

@media (max-width: 900px) {
  .portfolio-style-top {
    grid-template-columns: 1fr;
  }

  .portfolio-style-photo {
    aspect-ratio: 16 / 10;
    max-width: 520px;
  }

  .portfolio-style-content p {
    max-width: none;
  }
}

@media (max-width: 768px) {
  .style-marquee-item {
    width: 170px;
    height: 170px;
  }

  /* Na dotyku auto-przewijanie transformem CSS i ręczne przewijanie palcem
     gryzłyby się ze sobą (dwa niezależne mechanizmy ruchu na tym samym
     elemencie) — na mobile wyłączamy animację i oddajemy kontrolę w pełni
     dotykowi: naturalny, płynny scroll pozioméj listy. Duplikat zestawu
     (aria-hidden, dokładany przez JS dla pętli desktopowej) jest tu zbędny
     i tylko powielałby te same zdjęcia przy przewijaniu palcem, więc go
     ukrywamy — użytkownik mobilny widzi każde zdjęcie dokładnie raz. */
  .style-marquee-wrap {
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
    scroll-snap-type: x proximity;
  }

  .style-marquee-track {
    animation: none !important;
  }

  .style-marquee-item {
    scroll-snap-align: start;
  }

  .style-marquee-item[aria-hidden="true"] {
    display: none;
  }

  .style-testimonial-row {
    flex-direction: column;
    align-items: stretch;
  }

  .style-testimonial {
    flex-direction: column;
    align-items: flex-start;
    text-align: left;
    max-width: none;
  }

  .style-testimonial-ig-cta {
    justify-content: center;
  }
}

@media (max-width: 480px) {
  .portfolio-style-photo {
    aspect-ratio: 4 / 3;
  }
}

/* Wiersz z dwoma drobnymi linkami pod galerią stylu ("Zobacz więcej... na
   Instagramie" + "Umów konsultację w tym stylu") — ten sam .style-marquee-more
   dla obu, tylko obok siebie zamiast jednego pod drugim na desktopie. */
.portfolio-style-links {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px 28px;
}

.portfolio-style-links .style-marquee-more {
  margin-top: 20px;
}

@media (max-width: 480px) {
  .portfolio-style-links {
    flex-direction: column;
    align-items: flex-start;
    gap: 4px;
  }

  .portfolio-style-links .style-marquee-more:last-child {
    margin-top: 4px;
  }
}

/* ==========================================================================
   === PORTFOLIO LIGHTBOX (pf-lightbox) — podgląd zdjęcia w galerii stylu ===
   Klik na zdjęcie w .style-marquee-track NIE przekierowuje już na Instagram
   (patrz initPortfolioLightbox w js/script.js) — zamiast tego otwiera ten
   modal: tło strony zostaje WIDOCZNE, ale rozmyte (.pf-lightbox-backdrop,
   backdrop-filter: blur), a sam modal jest celowo NIE pełnoekranowy (~78vw/
   80vh), żeby czytać się jako elegancka, premium galeria, nie zwykły
   pełnoekranowy podgląd. Zoom = klik w zdjęcie przełącza .is-zoomed na
   .pf-lightbox-frame (scale + overflow:auto, żeby dało się doprzewijać do
   powiększonych krawędzi). Strzałki przełączają zdjęcia w obrębie TEGO
   SAMEGO stylu (JS trzyma osobną listę realnych zdjęć per kategoria).
   ========================================================================== */
.pf-lightbox {
  position: fixed;
  inset: 0;
  z-index: 300;
  display: flex;
  align-items: center;
  justify-content: center;
  opacity: 0;
  visibility: hidden;
  transition: opacity 0.3s var(--ease), visibility 0s linear 0.3s;
}

.pf-lightbox.is-open {
  opacity: 1;
  visibility: visible;
  transition: opacity 0.3s var(--ease), visibility 0s linear 0s;
}

.pf-lightbox-backdrop {
  position: absolute;
  inset: 0;
  background: rgba(12, 11, 10, 0.72);
  backdrop-filter: blur(9px);
  -webkit-backdrop-filter: blur(9px);
}

.pf-lightbox-modal {
  position: relative;
  z-index: 1;
  width: min(78vw, 1120px);
  height: 80vh;
  max-width: 94vw;
  max-height: 90vh;
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: 20px;
  box-shadow: 0 50px 110px -30px rgba(0, 0, 0, 0.7);
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
  transform: scale(0.92);
  opacity: 0;
  transition: transform 0.35s var(--ease), opacity 0.35s var(--ease);
}

.pf-lightbox.is-open .pf-lightbox-modal {
  transform: scale(1);
  opacity: 1;
}

.pf-lightbox-frame {
  width: 100%;
  height: 100%;
  overflow: auto;
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--bg);
}

.pf-lightbox-frame img {
  max-width: 100%;
  max-height: 100%;
  object-fit: contain;
  display: block;
  cursor: zoom-in;
  transition: transform 0.4s var(--ease);
}

.pf-lightbox-frame.is-zoomed {
  cursor: zoom-out;
}

.pf-lightbox-frame.is-zoomed img {
  max-width: none;
  max-height: none;
  width: auto;
  height: 190%;
  cursor: zoom-out;
}

.pf-lightbox-close,
.pf-lightbox-nav {
  position: absolute;
  z-index: 2;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  border: 1px solid rgba(246, 243, 238, 0.25);
  background: rgba(12, 11, 10, 0.55);
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
  color: #fff;
  cursor: pointer;
  transition: background 0.25s var(--ease), border-color 0.25s var(--ease), transform 0.25s var(--ease);
}

.pf-lightbox-close:hover,
.pf-lightbox-nav:hover {
  background: var(--accent);
  border-color: var(--accent);
}

.pf-lightbox-close {
  top: 16px;
  right: 16px;
  width: 40px;
  height: 40px;
}

.pf-lightbox-nav {
  top: 50%;
  transform: translateY(-50%);
  width: 46px;
  height: 46px;
}

.pf-lightbox-nav:hover {
  transform: translateY(-50%) scale(1.06);
}

.pf-lightbox-prev {
  left: 16px;
}

.pf-lightbox-next {
  right: 16px;
}

.pf-lightbox-counter {
  position: absolute;
  bottom: 16px;
  left: 50%;
  transform: translateX(-50%);
  z-index: 2;
  padding: 6px 14px;
  border-radius: var(--radius-lg);
  background: rgba(12, 11, 10, 0.55);
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
  color: var(--text);
  font-family: var(--font-display);
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.5px;
}

@media (max-width: 768px) {
  .pf-lightbox-modal {
    width: 92vw;
    height: 78vh;
  }

  .pf-lightbox-nav {
    width: 38px;
    height: 38px;
  }

  .pf-lightbox-close {
    width: 36px;
    height: 36px;
  }
}

/* Poszanowanie preferencji ograniczonego ruchu: pasek stylu przestaje się
   sam przewijać (użytkownik nadal może scrollować ręcznie na dotyku/myszą),
   a wejście/wyjście lightboxa traci animację skalowania. */
@media (prefers-reduced-motion: reduce) {
  .style-marquee-track {
    animation: none !important;
  }

  .pf-lightbox-modal,
  .pf-lightbox-frame img {
    transition: none;
  }
}

/* ==========================================================================
   === FORMULARZ WYCENY TATUAŻU (index.html, sekcja #kontakt) ===
   Nowy kafelek POD istniejącymi kartami kontaktowymi (.contact-channels) i
   podpowiedziami (.contact-prompts), w tej samej sekcji #kontakt. Karta w
   tym samym "premium" języku co reszta strony: var(--bg-card), border,
   promień, delikatny cień. Logika wysyłki: initQuoteForm() w js/script.js,
   backend: server/server.js (patrz README w tym folderze).
   ========================================================================== */
.quote-form-card {
  margin: 56px auto 0;
  max-width: 900px;
  padding: 48px;
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  box-shadow: 0 30px 70px -35px rgba(0, 0, 0, 0.55);
  text-align: left;
}

.quote-form-header {
  display: flex;
  align-items: flex-start;
  gap: 20px;
  margin-bottom: 36px;
}

.quote-form-icon {
  flex-shrink: 0;
  width: 52px;
  height: 52px;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--accent-dim);
  color: var(--accent);
}

.quote-form-icon svg {
  width: 26px;
  height: 26px;
}

.quote-form-title {
  font-family: var(--font-display);
  font-size: 22px;
  font-weight: 700;
  text-transform: none;
  letter-spacing: 0.2px;
  color: var(--text);
  margin-bottom: 8px;
}

.quote-form-sub {
  color: var(--text-muted);
  font-size: 15px;
  line-height: 1.7;
  max-width: 640px;
}

/* Honeypot: ukryty wizualnie i "poza tabulacją", ale nadal obecny w DOM/
   dostępny botom prostych skryptów, którym w praktyce zależy — celowo NIE
   display:none/visibility:hidden (część botów je respektuje i wtedy
   pomija pole), tylko przesunięcie poza ekran. */
.quote-form-honeypot {
  position: absolute;
  left: -9999px;
  width: 1px;
  height: 1px;
  overflow: hidden;
}

.quote-form-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 24px 28px;
}

.quote-form-field--full {
  grid-column: 1 / -1;
}

.quote-form-field label {
  display: block;
  font-family: var(--font-display);
  font-size: 13px;
  font-weight: 600;
  letter-spacing: 0.3px;
  color: var(--text);
  margin-bottom: 10px;
}

.quote-form-required {
  color: var(--accent);
}

.quote-form-optional {
  color: var(--text-muted);
  font-weight: 400;
  text-transform: none;
  letter-spacing: 0;
}

.quote-form-field input[type="text"],
.quote-form-field input[type="email"],
.quote-form-field input[type="tel"],
.quote-form-field input[type="date"],
.quote-form-field input[type="time"],
.quote-form-field select,
.quote-form-field textarea {
  width: 100%;
  padding: 14px 16px;
  background: var(--bg);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  color: var(--text);
  font-size: 15px;
  font-family: var(--font-body);
  transition: border-color 0.25s var(--ease), box-shadow 0.25s var(--ease);
}

.quote-form-field textarea {
  resize: vertical;
  min-height: 52px;
  line-height: 1.6;
}

.quote-form-field input::placeholder,
.quote-form-field textarea::placeholder {
  color: var(--text-muted);
}

.quote-form-field input:focus-visible,
.quote-form-field select:focus-visible,
.quote-form-field textarea:focus-visible {
  outline: none;
  border-color: var(--accent);
  box-shadow: 0 0 0 3px var(--accent-dim);
}

/* Strzałka selecta — natywny wygląd selectów bywa niespójny między
   przeglądarkami/systemami, więc dajemy własną, subtelną ikonę i chowamy
   domyślną (appearance:none) dla spójnego, premium wyglądu. */
.quote-form-field select {
  appearance: none;
  -webkit-appearance: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23a8a299' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 14px center;
  background-size: 18px;
  padding-right: 44px;
  cursor: pointer;
}

.quote-form-field select option {
  background: var(--bg-card);
  color: var(--text);
}

/* Podpowiedź pod polem "Wielkość tatuażu" — link do orientacyjnego cennika
   w blogu (kotwica cenowa; klient bez żadnego punktu odniesienia trudniej
   ocenia, czy w ogóle stać go na usługę, patrz analiza-skutecznosci-
   sprzedazowej.md). Celowo mały/muted, żeby nie konkurował wizualnie z
   właściwym polem formularza. */
.quote-form-hint {
  margin: 8px 0 0;
  font-size: 12.5px;
  color: var(--text-muted);
}

.quote-form-hint a {
  color: var(--accent);
  text-decoration: underline;
  text-underline-offset: 2px;
}

/* Strzałka selecta w SVG data-URI nie może korzystać z var(--text-muted)
   (przeglądarki nie podstawiają custom properties wewnątrz url()), więc
   kolor jest wpisany na sztywno jako hex #a8a299 = wartość --text-muted
   w trybie dark. W light mode --text-muted to #5b564c, więc dajemy
   analogiczne, ręcznie zsynchronizowane nadpisanie tej samej ikony. */
:root.light-mode .quote-form-field select {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%235b564c' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
}

/* Pola daty/godziny obok siebie (DateTime picker) — natywne <input
   type="date"> / type="time"> dają prawdziwy, dotykowo-przyjazny picker
   na telefonie (kółka/kalendarz systemowy) i na desktopie (kalendarz
   przeglądarki), bez dodatkowej biblioteki JS niespójnej z resztą strony
   (czysty JS/HTML, bez bundlera). */
.quote-form-datetime {
  display: flex;
  gap: 14px;
}

.quote-form-datetime input {
  flex: 1;
  min-width: 0;
  color-scheme: dark;
}

:root.light-mode .quote-form-datetime input {
  color-scheme: light;
}

.quote-form-submit {
  margin-top: 36px;
  width: 100%;
  justify-content: center;
}

/* Statyczna notka "co dalej po wysłaniu" tuż pod przyciskiem — redukuje
   niepewność dokładnie w momencie decyzji o kliknięciu (patrz analiza-
   skutecznosci-sprzedazowej.md, punkt 3.4). W odróżnieniu od
   .quote-form-status (podmienianej dynamicznie przez JS po submit) ta
   notka jest zawsze widoczna i się nie zmienia. */
.quote-form-reassurance {
  margin-top: 14px;
  font-size: 13px;
  color: var(--text-muted);
  text-align: center;
}

.quote-form-status {
  margin-top: 16px;
  min-height: 20px;
  font-size: 14px;
  color: var(--text-muted);
  text-align: center;
}

.quote-form-status.is-error {
  color: #ff8a6a;
}

.quote-form-success,
.quote-form-error {
  margin-top: 8px;
  padding: 32px;
  border-radius: var(--radius-sm);
  text-align: center;
}

.quote-form-success {
  background: var(--accent-dim);
  border: 1px solid rgba(255, 77, 31, 0.35);
}

.quote-form-success-icon {
  width: 44px;
  height: 44px;
  margin: 0 auto 16px;
  color: var(--accent);
}

.quote-form-success-text {
  font-size: 16px;
  color: var(--text);
  line-height: 1.6;
  max-width: 480px;
  margin: 0 auto 24px;
}

.quote-form-success-actions {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  gap: 14px;
}

.quote-form-error {
  background: var(--bg);
  border: 1px solid rgba(255, 77, 31, 0.4);
  color: var(--text-muted);
  font-size: 15px;
}

.quote-form-error a {
  color: var(--accent);
  text-decoration: underline;
  text-underline-offset: 3px;
}

@media (max-width: 900px) {
  .quote-form-card {
    padding: 36px 28px;
  }

  .quote-form-grid {
    grid-template-columns: 1fr;
  }

  .quote-form-header {
    flex-direction: column;
  }
}

@media (max-width: 480px) {
  .quote-form-card {
    padding: 28px 20px;
  }

  .quote-form-datetime {
    flex-direction: column;
  }
}

/* ==========================================================================
   === FORMULARZ WYCENY — WERSJA ROZWIJANA PO KLIKNIĘCIU ===
   Karta startuje zwinięta: [data-quote-collapse] pokazuje tylko skrócony
   podgląd pól (ograniczone max-height + overflow:hidden), który zanika w
   tło karty przez mask-image (dokładnie ta sama technika co .fb-feed-card
   — stopniowe gaśnięcie treści zamiast twardej krawędzi), a pod spodem
   miękka, rozmyta poświata akcentu (kopia .fb-feed-fade) wzmacnia wrażenie
   "gaśnięcia". Klik w przycisk "Wypełnij formularz wyceny" (JS:
   initQuoteFormCollapse() w js/script.js — ta sama logika co akordeon FAQ:
   inline max-height = scrollHeight, potem "none" po animacji) rozwija
   kartę do pełnej wysokości; maska/poświata/przycisk znikają razem z
   dodaniem klasy .is-open na .quote-form-card.
   ========================================================================== */
.quote-form-collapse {
  position: relative;
  max-height: 230px;
  overflow: hidden;
  transition: max-height 0.7s cubic-bezier(0.65, 0, 0.35, 1);
  -webkit-mask-image: linear-gradient(to bottom, #000 0%, #000 55%, transparent 96%);
  mask-image: linear-gradient(to bottom, #000 0%, #000 55%, transparent 96%);
}

.quote-form-card.is-open .quote-form-collapse {
  -webkit-mask-image: none;
  mask-image: none;
}

/* Poświata pod kartą, ta sama recepta co .fb-feed-fade (radial-gradient +
   blur), z szerokością proporcjonalnie dopasowaną do szerszej (900px)
   karty formularza wyceny. Ujemny margines podciąga ją częściowo pod
   dolną krawędź zwiniętej karty. */
.quote-form-collapse-glow {
  max-width: 680px;
  height: 110px;
  margin: -55px auto -20px;
  background: radial-gradient(ellipse at center, rgba(255, 77, 31, 0.5) 0%, rgba(255, 77, 31, 0.2) 45%, transparent 78%);
  filter: blur(32px);
  pointer-events: none;
  position: relative;
  z-index: 0;
  opacity: 1;
  transition: opacity 0.4s ease;
}

.quote-form-card.is-open .quote-form-collapse-glow {
  opacity: 0;
}

.quote-form-open-btn-wrap {
  position: relative;
  z-index: 1;
  display: flex;
  justify-content: center;
  margin-top: 24px;
  transition: opacity 0.3s ease, visibility 0.3s ease;
}

.quote-form-card.is-open .quote-form-open-btn-wrap {
  opacity: 0;
  visibility: hidden;
  height: 0;
  margin: 0;
  overflow: hidden;
  pointer-events: none;
}

.quote-form-open-btn {
  white-space: nowrap;
}

@media (prefers-reduced-motion: reduce) {
  .quote-form-collapse {
    transition: none;
  }

  .quote-form-collapse-glow,
  .quote-form-open-btn-wrap {
    transition: none;
  }
}

/* ==========================================================================
   === GC FINAL CTA — WERSJA DWUKOLUMNOWA (.gc-final-cta--split, portfolio.html) ===
   Modyfikator na .gc-final-cta: zamiast wyśrodkowanej treści, dwie równe
   kolumny — po lewej tekst/CTA wyrównane do lewej, po prawej kopia karty
   formularza wyceny (ten sam kod co w index.html #kontakt, sekcja
   "FORMULARZ WYCENY" wyżej, z tą samą rozwijaną wersją). Wszystkie
   nadpisania są zaskopowane do .gc-final-cta--split, więc bazowe reguły
   .gc-final-cta-title/-sub/-actions (wyśrodkowane) używane też przez
   szkolenia.html zostają całkowicie nietknięte. */
.gc-final-cta--split .gc-final-cta-inner {
  max-width: 1180px;
}

.gc-final-cta-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 64px;
  align-items: center;
}

.gc-final-cta-text {
  text-align: left;
}

.gc-final-cta--split .gc-final-cta-title {
  text-align: left;
  margin: 0 0 24px;
}

.gc-final-cta--split .gc-final-cta-sub {
  text-align: left;
  margin: 0 0 40px;
  max-width: none;
}

.gc-final-cta--split .gc-final-cta-actions {
  justify-content: flex-start;
}

.gc-final-cta-form {
  min-width: 0;
}

.gc-final-cta-form .quote-form-card {
  max-width: 100%;
  margin: 0;
}

/* Poprawka wąskiej kolumny: powyżej 980px .gc-final-cta--split jest już
   dwukolumnowy, a kolumna formularza to ok. (1180px - 64px gapu) / 2 ≈
   558px — mniej niż viewportowy próg 900px, przy którym .quote-form-grid
   (bazowa reguła) sama przełącza się na 1 kolumnę. Efekt: na szerokich
   ekranach (np. 1300-1400px) .quote-form-grid próbowałby renderować 2
   pod-kolumny pól wewnątrz ~558px karty (po padding 48px zostaje ~462px,
   czyli ~217px na pole) — ciasno dla selectów/dat. Wymuszamy 1 kolumnę
   pól wcześniej, tylko w kontekście tej wąskiej kolumny splitu, aż do
   punktu, w którym grid i tak się składa do jednej kolumny (980px). */
@media (min-width: 981px) and (max-width: 1300px) {
  .gc-final-cta-form .quote-form-grid {
    grid-template-columns: 1fr;
  }
}

@media (max-width: 980px) {
  .gc-final-cta-grid {
    grid-template-columns: 1fr;
    gap: 48px;
  }

  .gc-final-cta--split .gc-final-cta-text {
    text-align: center;
  }

  .gc-final-cta--split .gc-final-cta-title,
  .gc-final-cta--split .gc-final-cta-sub {
    text-align: center;
    margin-left: auto;
    margin-right: auto;
  }

  .gc-final-cta--split .gc-final-cta-sub {
    max-width: 640px;
  }

  .gc-final-cta--split .gc-final-cta-actions {
    justify-content: center;
  }
}
