/* =====================================================================
   Kominkowy Chill, redesign (etap 2: nowoczesny, edytorialny układ)
   Marka: terakota + krem. Nagłówki: Fraunces (serif). UI/tekst: Montserrat/Mukta
   ===================================================================== */

/* ---------- Tokeny ---------- */
:root {
  --accent: #b65c42;          /* terakota z logo, zostaje */
  --accent-2: #c9784f;
  --accent-dark: #8f4531;
  --accent-soft: #ecdccf;
  /* jasne, przewiewne tła (biel / kość słoniowa / piasek) */
  --cream: #fbf6ef;           /* główne jasne tło */
  --paper: #fffdfb;           /* najjaśniejsze / naprzemienne */
  --sand: #f0e7d8;            /* miękki piasek do sekcji */
  --sand-2: #b09a6f;          /* piaskowy z willi, detale / obramowania */
  /* drewno (ciepłe detale) */
  --wood: #a9764f;
  --wood-dark: #6b4a30;
  --espresso: #2a1d12;
  --espresso-2: #3a2a1c;
  /* tekst: ciepła grafitowa czerń na jasnym */
  --ink: #2b211a;
  --ink-soft: #574a3f;
  --muted: #7a6857;           /* WCAG AA: 4.95:1 na --cream, 5.32:1 na bieli */
  --line: rgba(60, 42, 28, 0.13);
  --line-light: rgba(255, 255, 255, 0.16);
  --white: #ffffff;

  --font-display: "Fraunces", Georgia, "Times New Roman", serif;
  --font-body: "Mukta", system-ui, Segoe UI, Helvetica, Arial, sans-serif;
  --font-ui: "Montserrat", system-ui, Segoe UI, Helvetica, Arial, sans-serif;
  --font-script: "Playball", "Segoe Script", "Brush Script MT", cursive;

  --maxw: 1240px;
  --radius: 18px;
  --radius-lg: 30px;
  --radius-sm: 10px;
  --radius-pill: 999px;

  --shadow-sm: 0 2px 12px rgba(60, 40, 30, 0.07);
  --shadow-md: 0 16px 40px rgba(60, 40, 30, 0.14);
  --shadow-lg: 0 30px 70px rgba(40, 25, 18, 0.22);

  --header-h: 78px;
  --ease: cubic-bezier(0.22, 0.61, 0.36, 1);
}

/* ---------- Reset ---------- */
*, *::before, *::after { box-sizing: border-box; }
* { margin: 0; padding: 0; }
/* overflow-x: CLIP, nie hidden. "hidden" robi z html i body kontenery przewijania,
   a wtedy position: sticky przestaje sie odnosic do okna i po prostu nie dziala
   (karty atrakcji odjezdzaly jak zwykle bloki). "clip" obcina tak samo,
   ale kontenera nie tworzy. */
html { scroll-behavior: smooth; -webkit-text-size-adjust: 100%; overflow-x: clip; }

body {
  font-family: var(--font-body);
  font-size: 17px;
  line-height: 1.75;
  color: var(--ink-soft);
  background: var(--cream);
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  overflow-x: clip;
}

img { max-width: 100%; height: auto; display: block; }
a { color: inherit; text-decoration: none; }
ul { list-style: none; }

/* ---------- Dostępność: widoczny focus dla klawiatury ----------
   Bazowy pierścień dla wszystkiego, co interaktywne. Komponenty, które mają
   własny :focus-visible (dock, apt-card, reveal-item), nadpisują go niżej. */
:where(a, button, input, select, textarea, summary, [tabindex]):focus-visible {
  outline: 3px solid var(--accent-2);
  outline-offset: 3px;
  border-radius: var(--radius-sm);
}
/* nad hero i na ciemnych tłach pierścień musi być jasny, żeby był widoczny */
.has-hero .site-header:not(.is-solid) :where(a, button):focus-visible,
.site-footer :where(a, button):focus-visible,
.section--sand :where(a, button):focus-visible {
  outline-color: #fff;
}

/* Pomiń nawigację, pierwszy przystanek Tab dla klawiatury */
.skip-link {
  position: absolute; left: 50%; top: 0; transform: translate(-50%, -120%);
  z-index: 2000; background: var(--accent); color: #fff;
  font-family: var(--font-ui); font-weight: 600; font-size: 0.9rem;
  padding: 0.85rem 1.6rem; border-radius: 0 0 var(--radius-sm) var(--radius-sm);
  transition: transform 0.2s var(--ease);
}
.skip-link:focus { transform: translate(-50%, 0); }

h1, h2, h3, h4 {
  font-family: var(--font-display);
  color: var(--ink);
  line-height: 1.05;
  font-weight: 500;
  letter-spacing: -0.01em;
  font-optical-sizing: auto;
}
h1 { font-size: clamp(2.6rem, 6vw, 4.6rem); }
h2 { font-size: clamp(2rem, 4.2vw, 3.2rem); }
h3 { font-size: clamp(1.3rem, 2.2vw, 1.7rem); }
p { color: var(--ink-soft); }
strong { font-weight: 700; color: var(--ink); }

/* ---------- Layout ---------- */
.container { width: min(100% - 2.5rem, var(--maxw)); margin-inline: auto; }
.section { padding: clamp(4rem, 9vw, 8rem) 0; }
.section--cream { background: var(--cream); }
.section--cream-2 { background: var(--paper); }
.section--sand { background: var(--sand); }
.section--dark { background: var(--espresso); color: rgba(255, 255, 255, 0.82); }
.section--dark h1, .section--dark h2, .section--dark h3 { color: #fff; }

.eyebrow {
  display: inline-block;
  font-family: var(--font-ui); font-weight: 600; font-size: 0.78rem;
  letter-spacing: 0.22em; text-transform: uppercase; color: var(--accent);
  margin-bottom: 1.1rem;
}
.section--dark .eyebrow { color: var(--accent-2); }

.lead { font-size: 1.12rem; color: var(--ink-soft); }
.text-center { text-align: center; }
.measure { max-width: 60ch; }
.measure-center { max-width: 62ch; margin-inline: auto; }
.section-head { max-width: 720px; }
.section-head.text-center { margin-inline: auto; }
.section-head p { margin-top: 1rem; }

/* ---------- Przyciski ---------- */
.btn {
  --btn-bg: var(--accent); --btn-fg: #fff; --btn-bd: var(--accent);
  display: inline-flex; align-items: center; justify-content: center; gap: 0.55rem;
  font-family: var(--font-ui); font-weight: 600; font-size: 0.9rem; letter-spacing: 0.04em;
  text-transform: uppercase; padding: 0.9rem 1.8rem; border-radius: var(--radius-pill);
  border: 1.5px solid var(--btn-bd); background: var(--btn-bg); color: var(--btn-fg);
  cursor: pointer; transition: transform 0.25s var(--ease), background 0.25s var(--ease),
    color 0.25s var(--ease), box-shadow 0.25s var(--ease), border-color 0.25s var(--ease);
}
.btn:hover { transform: translateY(-2px); box-shadow: var(--shadow-md); background: var(--accent-dark); border-color: var(--accent-dark); }
.btn--ghost { --btn-bg: transparent; --btn-fg: #fff; --btn-bd: rgba(255,255,255,0.65); }
.btn--ghost:hover { background: rgba(255,255,255,0.14); border-color: #fff; }
.btn--outline { --btn-bg: transparent; --btn-fg: var(--accent); --btn-bd: var(--accent); }
.btn--outline:hover { background: var(--accent); color: #fff; --btn-fg: #fff; }
.btn--lg { padding: 1.05rem 2.2rem; font-size: 0.95rem; }
.btn svg { width: 18px; height: 18px; }

.link-arrow {
  display: inline-flex; align-items: center; gap: 0.5rem; font-family: var(--font-ui);
  font-weight: 600; font-size: 0.85rem; letter-spacing: 0.06em; text-transform: uppercase;
  color: var(--accent); transition: gap 0.25s var(--ease);
}
.link-arrow svg { width: 16px; height: 16px; transition: transform 0.25s var(--ease); }
.link-arrow:hover { gap: 0.85rem; }
.section--dark .link-arrow { color: var(--accent-2); }

/* ---------- Header ---------- */
.site-header {
  position: fixed; inset: 0 0 auto 0; z-index: 100; height: var(--header-h);
  display: flex; align-items: center;
  transition: background 0.3s var(--ease), box-shadow 0.3s var(--ease), height 0.3s var(--ease);
}
.site-header__inner {
  width: min(100% - 2.5rem, 1340px); margin-inline: auto;
  display: flex; align-items: center; gap: 1.5rem;
}
.site-header.is-solid,
body:not(.has-hero) .site-header {
  background: rgba(251, 248, 245, 0.9); backdrop-filter: blur(10px);
  box-shadow: 0 1px 0 var(--line), var(--shadow-sm);
}

.brand { display: flex; align-items: center; gap: 0.7rem; margin-right: auto; }
/* sygnet marki (płomień z logo Kominkowy Chill) */
.brand__mark { width: 48px; height: 48px; flex: none; display: grid; place-items: center; }
.brand__mark img { width: 100%; height: 100%; object-fit: contain; display: block; }
.brand__mark .brand__mark--white { display: none; }
/* nad hero nagłówek jest przezroczysty, więc pokazujemy biały sygnet */
.has-hero .site-header:not(.is-solid) .brand__mark .brand__mark--color { display: none; }
.has-hero .site-header:not(.is-solid) .brand__mark .brand__mark--white { display: block; }
.brand__name { font-family: var(--font-ui); font-weight: 700; font-size: 1.02rem; letter-spacing: 0.02em; color: var(--ink); line-height: 1.1; }
.brand__name span { display: block; font-weight: 500; font-size: 0.68rem; letter-spacing: 0.18em; text-transform: uppercase; color: var(--muted); }

.has-hero .site-header:not(.is-solid) .brand__name,
.has-hero .site-header:not(.is-solid) .brand__name span { color: #fff; }
.has-hero .site-header:not(.is-solid) .nav a { color: rgba(255,255,255,0.92); }
.has-hero .site-header:not(.is-solid) .header-tools > a { color: #fff; }

.nav { display: flex; align-items: center; gap: 0.15rem; }
.nav > li { position: relative; }
.nav a {
  display: inline-flex; align-items: center; gap: 0.35rem; font-family: var(--font-ui);
  font-weight: 600; font-size: 0.86rem; color: var(--ink); padding: 0.55rem 0.85rem;
  border-radius: var(--radius-sm); transition: color 0.2s var(--ease);
}
.nav a:hover, .nav .is-current > a { color: var(--accent); }
.nav .has-sub > a::after {
  content: ""; width: 6px; height: 6px; border-right: 2px solid currentColor;
  border-bottom: 2px solid currentColor; transform: rotate(45deg) translateY(-2px); opacity: 0.6;
}
.submenu {
  position: absolute; top: calc(100% + 8px); left: 0; min-width: 210px; background: #fff;
  border: 1px solid var(--line); border-radius: var(--radius-sm); box-shadow: var(--shadow-md);
  padding: 0.4rem; opacity: 0; visibility: hidden; transform: translateY(8px);
  transition: opacity 0.2s var(--ease), transform 0.2s var(--ease), visibility 0.2s;
}
.nav .has-sub:hover .submenu, .nav .has-sub:focus-within .submenu { opacity: 1; visibility: visible; transform: translateY(0); }
.submenu a { color: var(--ink-soft); width: 100%; }
.submenu a:hover { background: var(--cream); color: var(--accent); }

.header-tools { display: flex; align-items: center; gap: 0.2rem; }
.header-tools > a { width: 38px; height: 38px; display: grid; place-items: center; border-radius: 50%; color: var(--ink); transition: color 0.2s, background 0.2s; }
.header-tools > a:hover { color: var(--accent); background: rgba(182,92,66,0.1); }
.header-tools > a svg { width: 18px; height: 18px; }

.nav-toggle { display: none; width: 44px; height: 44px; flex: none; border: none; background: transparent; cursor: pointer; flex-direction: column; justify-content: center; gap: 5px; padding: 10px; }
.nav-toggle span { height: 2px; width: 100%; background: var(--ink); border-radius: 2px; transition: transform 0.3s var(--ease), opacity 0.2s; }
.has-hero .site-header:not(.is-solid) .nav-toggle span { background: #fff; }
body.nav-open .nav-toggle span:nth-child(1) { transform: translateY(7px) rotate(45deg); }
body.nav-open .nav-toggle span:nth-child(2) { opacity: 0; }
body.nav-open .nav-toggle span:nth-child(3) { transform: translateY(-7px) rotate(-45deg); }

/* ---------- HERO (zdjęcie z wtopionym logo) ---------- */
.hero {
  position: relative; min-height: 100vh; display: flex; align-items: center;
  overflow: hidden; color: #fff;
}
.hero__media, .hero__overlay { position: absolute; inset: 0; }

/* Plakat leży pod filmem, więc coś sensownego widać zanim film ruszy,
   a także gdy się nie odtworzy (oszczędzanie danych, blokada autoodtwarzania). */
.hero__media {
  background-image: url("../img/hero-tatry-poster-800.webp");
  background-size: cover; background-position: 50% 50%;
}
/* Prog musi liczyc TO SAMO co imagesrcset przy <link rel="preload"> w <head>:
   przegladarka wybiera tam plik po szerokosci okna PRZEMNOZONEJ przez gestosc
   ekranu, wiec sam warunek (min-resolution: 1.5dppx) kazalby telefonowi retina
   pobrac plakat 1280 px, choc wstepne pobranie sciagnelo juz wersje 800 px.
   Efekt byl taki, ze kazde wejscie z telefonu ciagnelo oba pliki, a wersja
   800 px szla do kosza. Dwa warunki nizej odtwarzaja prog 800 px z srcset. */
@media (min-width: 800px), (min-width: 400px) and (min-resolution: 1.5dppx) {
  .hero__media { background-image: url("../img/hero-tatry-poster.webp"); }
}
.hero__video {
  width: 100%; height: 100%; object-fit: cover; object-position: 50% 45%;
  display: block; border: 0;
}

/* Film jest ozdobą, nie treścią, więc przy wyłączonych animacjach zostaje sam plakat. */
@media (prefers-reduced-motion: reduce) {
  .hero__video { display: none; }
}

/* Przyciemnienie. Kadr jest jasny na dwóch wysokościach naraz: pas nieba o zachodzie
   i śnieg na dole, więc sam gradient od dołu tu nie wystarcza. Cztery warstwy:
   góra pod menu, dół pod pasek wyszukiwania, miękka plama pod godłem
   i cienki równy welon, żeby biel trzymała się na każdej klatce pętli. */
.hero__overlay {
  z-index: 1;
  background:
    linear-gradient(180deg, rgba(16,24,32,0.52) 0%, rgba(16,24,32,0.16) 24%, transparent 44%),
    linear-gradient(0deg, rgba(14,20,26,0.62) 0%, rgba(14,20,26,0.22) 28%, transparent 56%),
    radial-gradient(ellipse 70% 52% at 50% 44%, rgba(12,18,24,0.42) 0%, rgba(12,18,24,0.12) 55%, transparent 78%),
    linear-gradient(rgba(12,18,24,0.14), rgba(12,18,24,0.14));
}

.hero__inner { position: relative; z-index: 2; width: 100%; padding: calc(var(--header-h) + 2rem) 0 clamp(2.5rem, 8vh, 5rem); }
.hero__center { display: flex; flex-direction: column; align-items: center; text-align: center; gap: clamp(1.1rem, 2.2vw, 1.7rem); }

/* Godło. Na zdjęciu było wtopione, na filmie musi być osobnym elementem,
   inaczej znikłoby razem z podmienionym tłem. Cień rysuje krawędź na jasnym śniegu. */
.hero__logo {
  width: clamp(190px, 24vw, 330px); height: auto; margin-bottom: clamp(0.2rem, 1vw, 0.6rem);
  filter: drop-shadow(0 4px 26px rgba(10, 16, 22, 0.55)) drop-shadow(0 1px 3px rgba(10, 16, 22, 0.4));
}

/* Podpis pod godłem. Godło mówi już "Kominkowy Chill" i "Apartamenty",
   więc tu zostaje sama miejscowość, żeby te dwa napisy się nie powtarzały. */
.hero__tagline {
  font-family: var(--font-ui); font-weight: 400;
  text-transform: uppercase; letter-spacing: 0.32em;
  font-size: clamp(0.7rem, 1.4vw, 0.95rem);
  color: rgba(255, 255, 255, 0.95);
  text-indent: 0.32em; /* kompensuje odstęp po ostatniej literze */
  text-shadow: 0 2px 18px rgba(20, 28, 22, 0.75), 0 1px 3px rgba(20, 28, 22, 0.5);
}

/* nagłówek tylko dla Google / czytników ekranu (na ekranie widać godło) */
.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;
}

/* pasek wyszukiwania (jak Enjoy Montana) */
.searchbar { display: flex; flex-wrap: wrap; justify-content: center; align-items: stretch; gap: 0.6rem; width: 100%; max-width: 680px; }
/* Pasek rezerwacji leży na filmie, więc zamiast białych "pigułek", które zasłaniały
   kadr i wyglądały jak wklejony formularz, jest szkło: przyciemnione, rozmyte tło
   i biały tekst. Tło jest ciemne, a nie białe, bo hero bywa bardzo jasny (śnieg
   o wschodzie) i tylko na ciemnym szkle biel trzyma się w każdym ujęciu. */
.searchbar__field {
  display: flex; align-items: center; gap: 0.65rem;
  background: rgba(18, 14, 12, 0.34);
  -webkit-backdrop-filter: blur(16px) saturate(135%);
  backdrop-filter: blur(16px) saturate(135%);
  border: 1px solid rgba(255, 255, 255, 0.30);
  border-radius: var(--radius-pill); padding: 0 1.3rem; min-height: 58px;
  box-shadow: 0 6px 22px rgba(12, 9, 7, 0.28);
  color: #fff;
  transition: background 0.25s var(--ease), border-color 0.25s var(--ease);
}
.searchbar__field:hover { background: rgba(18, 14, 12, 0.44); border-color: rgba(255, 255, 255, 0.42); }
.searchbar__field > svg { width: 18px; height: 18px; color: rgba(255, 255, 255, 0.9); flex: none; }
.searchbar__field input { border: none; background: transparent; font-family: var(--font-body); font-size: 1rem; color: #fff; width: 100%; min-width: 96px; }
.searchbar__field input::placeholder { color: rgba(255, 255, 255, 0.72); }
.searchbar__field select { border: none; background: transparent; font-family: var(--font-body); font-size: 1rem; color: #fff; cursor: pointer; }
/* Rozwinięta lista rysuje się systemowo, na białym tle, więc same opcje muszą
   zostać ciemne, inaczej byłyby białe na białym. */
.searchbar__field select option { color: var(--ink); background: #fff; }
/* focus pokazujemy na całym polu, nie na gołym inpucie, żeby pierścień objął pigułkę */
.searchbar__field:focus-within { outline: 3px solid var(--accent-2); outline-offset: 2px; }
.searchbar__field :where(input, select):focus-visible { outline: none; }
.searchbar__field--dates { gap: 0.9rem; flex: 1 1 260px; justify-content: center; }
.searchbar__label { font-family: var(--font-body); font-size: 0.98rem; color: rgba(255, 255, 255, 0.82); white-space: nowrap; }
.searchbar__divider { width: 1px; height: 26px; background: rgba(255, 255, 255, 0.32); flex: none; }
.searchbar__btn { display: inline-flex; align-items: center; justify-content: center; gap: 0.5rem; background: var(--accent); color: #fff; border: none; border-radius: var(--radius-pill); padding: 0 2rem; min-height: 58px; font-family: var(--font-ui); font-weight: 600; text-transform: uppercase; letter-spacing: 0.04em; font-size: 0.9rem; cursor: pointer; box-shadow: var(--shadow-md); transition: background 0.2s var(--ease), transform 0.2s var(--ease); }
.searchbar__btn svg { width: 18px; height: 18px; }
.searchbar__btn:hover { background: var(--accent-dark); transform: translateY(-2px); }

/* Home: wyśrodkowane menu na górze (nad hero), desktop; logo/tools wracają po przewinięciu */
@media (min-width: 861px) {
  .has-hero .site-header:not(.is-solid) .site-header__inner { justify-content: center; }
  .has-hero .site-header:not(.is-solid) .brand,
  .has-hero .site-header:not(.is-solid) .header-tools { position: absolute; top: 50%; transform: translateY(-50%); opacity: 0; pointer-events: none; }
  .has-hero .site-header:not(.is-solid) .brand { left: 1.5rem; }
  .has-hero .site-header:not(.is-solid) .header-tools { right: 1.5rem; }
  .has-hero .site-header:not(.is-solid) .nav a { text-shadow: 0 1px 14px rgba(30,20,14,0.32); }
}

/* ---------- Pasek rezerwacji (wewnątrz hero) ---------- */
.hero__booking { position: relative; z-index: 20; margin-top: 2rem; }
.booking {
  display: grid; grid-template-columns: repeat(3, 1fr) auto; align-items: center;
  gap: 0.5rem; background: #fff; border-radius: var(--radius-lg); padding: 0.8rem 0.9rem;
  box-shadow: var(--shadow-lg); border: 1px solid var(--line);
}
.booking__field { display: flex; flex-direction: column; gap: 0.15rem; padding: 0.6rem 1.2rem; border-right: 1px solid var(--line); cursor: pointer; }
.booking__field:nth-child(3) { border-right: none; }
.booking__field label { font-family: var(--font-ui); font-weight: 600; font-size: 0.68rem; letter-spacing: 0.14em; text-transform: uppercase; color: var(--muted); }
.booking__value { font-family: var(--font-ui); font-weight: 600; font-size: 0.98rem; color: var(--ink); }
.booking__submit { white-space: nowrap; }

/* ---------- Intro „Witamy" (nagłówek + dwa duże zdjęcia) ---------- */
.intro-head { display: grid; grid-template-columns: 0.9fr 1.1fr; gap: clamp(2rem, 6vw, 5rem); align-items: start; }
.intro-head h2 { margin-top: 0.2rem; font-size: clamp(1.6rem, 2.6vw, 2.1rem); line-height: 1.15; }
.intro-head .eyebrow { margin-bottom: 0.7rem; }
.intro-head .lead { font-size: 1rem; margin-bottom: 1.4rem; }
.intro-photos { display: grid; grid-template-columns: 1fr 1fr; gap: clamp(1rem, 2vw, 1.5rem); margin-top: clamp(2.5rem, 5vw, 4rem); }
.intro-photos .ph { aspect-ratio: 4 / 5; border-radius: var(--radius-lg); }
/* duże karty-zdjęcia obok siebie (jak willa: Exterior/Interior) */
.feature-card {
  position: relative; display: block; aspect-ratio: 4 / 5; overflow: hidden;
  border-radius: var(--radius-lg); box-shadow: var(--shadow-md); color: #fff; isolation: isolate;
  background: linear-gradient(135deg, #e6d7c3, #cbb298);
}
.feature-card img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; transition: transform 0.6s var(--ease); }
.feature-card:hover img { transform: scale(1.05); }
.feature-card__overlay { position: absolute; inset: 0; z-index: 1; background: linear-gradient(to top, rgba(28,16,10,0.82) 0%, rgba(28,16,10,0.20) 46%, transparent 72%); }
.feature-card__tagfile { position: absolute; top: 14px; left: 14px; z-index: 2; background: rgba(255,255,255,0.78); color: var(--wood-dark); border-radius: var(--radius-pill); padding: 0.35rem 0.8rem; font-family: var(--font-ui); font-weight: 600; font-size: 0.72rem; }
.feature-card__content { position: absolute; left: clamp(1.3rem, 2.5vw, 2rem); right: clamp(1.3rem, 2.5vw, 2rem); bottom: clamp(1.3rem, 2.5vw, 1.8rem); z-index: 2; }
.feature-card__title { font-family: var(--font-display); font-weight: 500; color: #fff; font-size: clamp(1.3rem, 2.1vw, 1.7rem); line-height: 1.15; }
.feature-card__tags { display: flex; flex-wrap: wrap; gap: 0.5rem; margin-top: 1rem; }
.feature-card__tag { display: inline-flex; align-items: center; gap: 0.4rem; font-family: var(--font-ui); font-weight: 500; font-size: 0.76rem; color: rgba(255,255,255,0.92); border: 1px solid rgba(255,255,255,0.42); border-radius: var(--radius-pill); padding: 0.32rem 0.75rem; backdrop-filter: blur(3px); }
.feature-card__tag svg { width: 14px; height: 14px; }
.feature-card__more { display: inline-flex; align-items: center; gap: 0.5rem; margin-top: 1.2rem; font-family: var(--font-ui); font-weight: 600; font-size: 0.82rem; letter-spacing: 0.04em; text-transform: uppercase; color: #fff; }
.feature-card__more svg { width: 16px; height: 16px; transition: transform 0.25s var(--ease); }
.feature-card:hover .feature-card__more svg { transform: translateX(4px); }
.facts { display: flex; flex-wrap: wrap; gap: 0.6rem; margin-top: 0.4rem; }
.fact { display: inline-flex; align-items: center; gap: 0.5rem; background: var(--sand); border-radius: var(--radius-pill); padding: 0.55rem 1.05rem; font-family: var(--font-ui); font-weight: 600; font-size: 0.82rem; color: var(--accent-dark); }
.fact svg { width: 17px; height: 17px; color: var(--accent); }

/* ---------- Dock udogodnień (dillionverma-style, transform-based) ---------- */
.dock-wrap {
  margin-top: 2.5rem;
  display: flex;
  justify-content: center;
  padding: 3rem 0.5rem 1.4rem;
}
.dock {
  --dock-size: 44px;
  --dock-max-scale: 1.5;
  --dock-distance: 140;
  display: flex;
  align-items: flex-end;
  gap: 0.7rem;
  padding: 0.55rem 0.75rem;
  border-radius: 22px;
  background: rgba(255, 253, 251, 0.7);
  border: 1px solid var(--line);
  box-shadow: var(--shadow-sm);
  backdrop-filter: blur(12px) saturate(140%);
  -webkit-backdrop-filter: blur(12px) saturate(140%);
}
.dock__icon {
  --scale: 1;
  position: relative;
  flex: 0 0 auto;
  width: var(--dock-size);
  height: var(--dock-size);
  padding: 0;
  border: 0;
  background: transparent;
  cursor: pointer;
  outline: none;
}
.dock__face {
  display: grid;
  place-items: center;
  width: 100%;
  height: 100%;
  border: 1px solid rgba(182, 92, 66, 0.16);
  border-radius: 999px;
  background: rgba(255, 255, 255, 0.92);
  color: var(--accent);
  transform: scale(var(--scale));
  transform-origin: center bottom;
  transition: transform 0.18s cubic-bezier(0.22, 0.61, 0.36, 1),
              background 0.25s var(--ease),
              color 0.25s var(--ease),
              border-color 0.25s var(--ease),
              box-shadow 0.25s var(--ease);
  will-change: transform;
  backface-visibility: hidden;
}
.dock__face > svg {
  width: 52%;
  height: 52%;
}
.dock__icon:hover .dock__face,
.dock__icon:focus-visible .dock__face {
  background: var(--accent);
  color: #fff;
  border-color: var(--accent-dark);
  box-shadow: 0 10px 22px rgba(182, 92, 66, 0.28);
}
.dock__tip {
  position: absolute;
  left: 50%;
  bottom: 100%;
  padding: 0.4rem 0.75rem;
  border-radius: 10px;
  background: var(--ink);
  color: #fff;
  font-family: var(--font-ui);
  font-size: 0.78rem;
  font-weight: 600;
  letter-spacing: 0.01em;
  white-space: nowrap;
  opacity: 0;
  pointer-events: none;
  z-index: 4;
  transform: translate(-50%, calc(-14px - (var(--scale) - 1) * var(--dock-size)));
  transition: opacity 0.18s var(--ease),
              transform 0.18s cubic-bezier(0.22, 0.61, 0.36, 1);
}
.dock__tip::after {
  content: "";
  position: absolute;
  top: 100%;
  left: 50%;
  transform: translateX(-50%);
  border: 5px solid transparent;
  border-top-color: var(--ink);
}
.dock__icon:hover .dock__tip,
.dock__icon:focus-visible .dock__tip {
  opacity: 1;
  transform: translate(-50%, calc(-8px - (var(--scale) - 1) * var(--dock-size)));
}

/* ---------- Showcase (apartamenty) ---------- */
.showcase { display: grid; grid-template-columns: 1.15fr 0.85fr; align-items: center; gap: 0; }
.showcase__media { position: relative; }
.showcase__media .ph { aspect-ratio: 3 / 2; border-radius: var(--radius-lg); }
.showcase__card {
  position: relative; z-index: 3; background: var(--paper); border-radius: var(--radius-lg);
  padding: clamp(1.8rem, 3vw, 2.8rem); box-shadow: var(--shadow-lg); margin-left: -3rem;
}
.showcase__card h2 { margin-bottom: 1.2rem; }
.showcase__card .btn { margin-top: 1.6rem; }
.chips { display: flex; flex-wrap: wrap; gap: 0.5rem; margin-top: 1.4rem; }
.chip { font-family: var(--font-ui); font-weight: 600; font-size: 0.8rem; letter-spacing: 0.03em; color: var(--accent-dark); background: var(--sand); border-radius: var(--radius-pill); padding: 0.4rem 0.9rem; }

/* ---------- Sekcja lokalizacji (jasna, index list) ---------- */
.loc-grid { display: grid; grid-template-columns: 1fr 1fr; gap: clamp(2rem, 6vw, 5rem); align-items: start; }
.loc-copy p + p { margin-top: 1rem; color: var(--ink-soft); }
.loc-copy .btn { margin-top: 2rem; }
.attractions { border-top: 1px solid var(--line); }
.attraction {
  display: flex; align-items: center; gap: 1.2rem; padding: 1.15rem 0.4rem;
  border-bottom: 1px solid var(--line); transition: padding 0.25s var(--ease), background 0.25s;
}
.attraction:hover { padding-left: 1.1rem; background: rgba(60,42,28,0.03); }
.attraction__num { font-family: var(--font-ui); font-weight: 600; font-size: 0.72rem; letter-spacing: 0.1em; color: var(--accent); width: 28px; flex: none; }
.attraction__name { font-family: var(--font-display); font-weight: 500; font-size: clamp(1.2rem, 2.2vw, 1.7rem); color: var(--ink); flex: 1; }
.attraction__ico { color: var(--muted); transition: transform 0.25s var(--ease), color 0.25s; }
.attraction:hover .attraction__ico { transform: translate(4px, -4px); color: var(--accent); }
.attraction__ico svg { width: 22px; height: 22px; }

/* ---------- Karty nawigacyjne 3-kol z kadrem 3:2 (jak w willi: Rates/Story/Contact) ---------- */
.plan-cards { display: grid; grid-template-columns: repeat(3, 1fr); gap: clamp(1.5rem, 3vw, 2.4rem); margin-top: 3rem; }
.plan-card { display: flex; flex-direction: column; }
.plan-card .ph { aspect-ratio: 3 / 2; margin-bottom: 1.3rem; }
.plan-card__label { font-family: var(--font-ui); font-weight: 600; font-size: 0.72rem; letter-spacing: 0.16em; text-transform: uppercase; color: var(--muted); margin-bottom: 0.5rem; }
.plan-card h3 { margin-bottom: 0.6rem; }
.plan-card p { flex: 1; }
.plan-card .link-arrow { margin-top: 1.2rem; }

/* ---------- CTA (full-bleed) ---------- */
.cta { position: relative; overflow: hidden; text-align: center; color: var(--ink); padding: clamp(4.5rem, 10vw, 8rem) 0; }
.cta__bg { position: absolute; inset: 0; z-index: 0; background: radial-gradient(120% 100% at 50% 0%, rgba(182,92,66,0.13), transparent 62%), var(--paper); }
.cta__inner { position: relative; z-index: 1; }
.cta__logo { width: 120px; height: 120px; margin: 0 auto 1.8rem; border-radius: 50%; display: grid; place-items: center; border: 2px solid var(--accent); font-family: var(--font-display); font-weight: 600; font-size: 1.5rem; color: var(--accent); background: #fff; box-shadow: var(--shadow-sm); }
.cta__quote { font-family: var(--font-display); font-style: italic; font-weight: 400; font-size: clamp(1.25rem, 2.6vw, 1.9rem); line-height: 1.4; color: var(--ink); max-width: 24ch; margin: 0 auto 1.6rem; }
.cta h2 { color: var(--ink); margin-bottom: 2rem; text-transform: none; }
.cta__buttons { display: flex; flex-wrap: wrap; gap: 0.8rem; justify-content: center; }

/* ---------- Instagram / #KominkowyChill + wideo (jasna) ---------- */
.instahub { position: relative; overflow: hidden; background: var(--paper); color: var(--ink-soft); }
.instahub::before {
  content: ""; position: absolute; inset: 0; pointer-events: none; opacity: 0.8;
  background: radial-gradient(120% 110% at 100% 0%, rgba(182,92,66,0.09), transparent 58%);
}
.instahub .container { position: relative; z-index: 1; }
.instahub__grid { display: grid; grid-template-columns: 1fr 1fr; gap: clamp(2rem, 5vw, 4.5rem); align-items: center; }
.instahub h2 { color: var(--ink); }
.instahub p { color: var(--ink-soft); margin-top: 0.8rem; max-width: 44ch; }
.hashtag {
  font-family: var(--font-script); font-weight: 400; letter-spacing: 0.01em;
  font-size: clamp(3rem, 7vw, 5.5rem); line-height: 1; color: var(--accent);
  margin: 0.6rem 0 0.4rem;
}
.instahub__cta { display: flex; align-items: center; gap: 1rem; flex-wrap: wrap; margin-top: 1.8rem; }
.ig-icon { width: 52px; height: 52px; border-radius: 50%; display: grid; place-items: center; border: 1px solid var(--line); color: var(--accent); transition: background 0.2s, transform 0.2s; }
.ig-icon:hover { background: rgba(182,92,66,0.08); transform: translateY(-2px); }
.ig-icon svg { width: 24px; height: 24px; }

/* ramka wideo (4:5, jak post IG) */
.videoframe { position: relative; border-radius: var(--radius-lg); overflow: hidden; aspect-ratio: 4 / 5; box-shadow: var(--shadow-lg); background: #1a0f09; }
.videoframe__ph {
  position: absolute; inset: 0; z-index: 0; background-size: cover; background-position: center;
  background-image: linear-gradient(135deg, #3a2417, #8a5636 52%, #c2a07a);
  animation: kenburns-loop 16s ease-in-out infinite alternate;
}
@keyframes kenburns-loop { from { transform: scale(1.02) translate(0, 0); } to { transform: scale(1.14) translate(-2%, -2%); } }
.videoframe video { position: absolute; inset: 0; z-index: 1; width: 100%; height: 100%; object-fit: cover; display: block; }
.videoframe video:empty { display: none; } /* brak <source> → pokazuje animowany placeholder */

/* ---------- Kadry zdjęć (stałe proporcje, object-fit: cover) ---------- */
.ph {
  position: relative; display: grid; place-items: center; aspect-ratio: 3 / 2;
  border-radius: var(--radius); overflow: hidden; color: var(--muted);
  background: linear-gradient(135deg, #f1e8da 0%, #e6d7c3 100%);
  border: 1px solid var(--line);
}
.ph--tall { aspect-ratio: 3 / 4; }
.ph--wide { aspect-ratio: 16 / 9; }
.ph--square { aspect-ratio: 1 / 1; }
.ph--4x3 { aspect-ratio: 4 / 3; }
/* realne zdjęcie/wideo: element wewnątrz .ph wypełnia kadr */
.ph > img, .ph > video { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.ph__label { display: inline-flex; align-items: center; gap: 0.5rem; background: rgba(255,255,255,0.72); border-radius: var(--radius-pill); padding: 0.4rem 0.9rem; font-family: var(--font-ui); font-weight: 600; font-size: 0.76rem; color: var(--wood-dark); }
.ph__label svg { width: 16px; height: 16px; }




/* ---------- Mapa dojazdu ----------
   MapLibre GL rysuje mape na canvasie i dostarcza wlasny arkusz (assets/vendor).
   Tutaj tylko ramka w naszej stylistyce i wyglad pinezki oraz dymka, zeby mapa
   nie wygladala jak wklejona z innej strony.

   Wysokosc jest sztywna, nie z proporcji: mapa nie ma "kadru", ktory mozna
   przyciac, a przy proporcjach na waskim ekranie robila sie paskiem. */
.map {
  position: relative; width: 100%;
  height: clamp(320px, 46vw, 520px);
  border-radius: var(--radius-lg); overflow: hidden;
  background: var(--sand);
  box-shadow: var(--shadow-md);
}
.map__fallback { padding: 1.4rem; color: var(--ink-soft); }
.map__fallback a { color: var(--accent-dark); }

/* Zanim biblioteka sie wczyta, w ramce stoi spokojne tlo, a nie pustka. */
.map:not(.is-ready)::after {
  content: ""; position: absolute; inset: 0;
  background: repeating-linear-gradient(45deg, var(--sand) 0 12px, var(--cream) 12px 24px);
  opacity: 0.5;
}

/* Pinezka. Zwykly znacznik MapLibre to niebieska kropla, wiec podstawiamy wlasna. */
.map-pin {
  width: 44px; height: 44px; cursor: pointer;
  display: grid; place-items: center;
  background: var(--accent);
  border: 2px solid #fff; border-radius: 50% 50% 50% 4px;
  transform: rotate(-45deg);
  box-shadow: 0 6px 18px rgba(16, 12, 10, 0.35);
}
/* Godlo w srodku odkreca sie o te same 45 stopni, o ktore obrocona jest kropla,
   wiec stoi prosto. Bez tego znak lezalby na boku. */
.map-pin img { width: 22px; height: auto; transform: rotate(45deg); display: block; }

/* Dymek. Nadpisujemy domyslny wyglad MapLibre, zeby trzymal nasza typografie. */
.maplibregl-popup-content {
  padding: 0.95rem 1.1rem; border-radius: var(--radius);
  box-shadow: var(--shadow-lg); font-family: var(--font-body);
  max-width: 17rem;
}
.maplibregl-popup-content strong {
  display: block; font-family: var(--font-head, inherit);
  font-size: 1.02rem; margin-bottom: 0.25rem; color: var(--ink);
}
.maplibregl-popup-content .map-popup__addr { font-size: 0.9rem; color: var(--ink-soft); line-height: 1.5; }
.maplibregl-popup-content .map-popup__link {
  display: inline-block; margin-top: 0.6rem; font-family: var(--font-ui);
  font-weight: 600; font-size: 0.78rem; letter-spacing: 0.08em;
  text-transform: uppercase; color: var(--accent-dark);
}
.maplibregl-popup-close-button { font-size: 1.2rem; color: var(--muted); padding: 0.2rem 0.45rem; }

/* ---------- Strony dokumentow (polityka prywatnosci, regulamin) ----------
   Dokument prawny czyta sie inaczej niz strone sprzedazowa: wazniejsza jest
   dlugosc wiersza i oddech miedzy punktami niz efekt. Miara ok. 68 znakow,
   bo dluzsze wiersze gubi sie wzrokiem przy tak gestym tekscie.
   Numeracja jest wlasna, a nie z przegladarki, zeby numer stal w tej samej
   kolumnie takze przy punktach na kilka linijek. */
.legal { padding-top: calc(var(--header-h) + clamp(2rem, 5vw, 3.5rem)); }
/* .breadcrumb byl pisany pod ciemne naglowki podstron i ma bialy kolor.
   Tutaj tlo jest jasne, wiec bylby niewidoczny. */
.legal .breadcrumb { color: var(--muted); }
.legal .breadcrumb a { color: var(--accent-dark); }
.legal .container { max-width: 56rem; }
.legal h1 { font-size: clamp(1.9rem, 4.5vw, 2.8rem); margin-bottom: 0.9rem; }
.legal__lead { font-size: 1.08rem; color: var(--ink-soft); max-width: 44rem; }

.legal__list {
  list-style: none; counter-reset: punkt;
  margin: clamp(2rem, 4vw, 3rem) 0 0; padding: 0;
  display: flex; flex-direction: column; gap: 1.5rem;
}
.legal__list > li {
  counter-increment: punkt;
  display: grid; grid-template-columns: 2.4rem 1fr; gap: 0 0.6rem;
  max-width: 68ch;
}
.legal__list > li::before {
  content: counter(punkt) ".";
  font-family: var(--font-ui); font-weight: 600; font-size: 0.95rem;
  color: var(--accent); padding-top: 0.15rem; font-variant-numeric: tabular-nums;
}
.legal__list > li > p { margin: 0; line-height: 1.7; }
.legal__list > li > ul {
  grid-column: 2; margin: 0.7rem 0 0; padding-left: 1.2rem;
  display: flex; flex-direction: column; gap: 0.45rem;
  /* globalny reset zdejmuje znaki wypunktowania, a w dokumencie prawnym
     podpunkty musza byc widoczne jako podpunkty */
  list-style: disc;
}
.legal__list > li > ul li::marker { color: var(--accent); }
.legal__list > li > ul li { line-height: 1.65; }
.legal__list a { color: var(--accent-dark); text-underline-offset: 2px; }

.legal__sign {
  margin-top: clamp(2.5rem, 5vw, 3.5rem); padding-top: 1.4rem;
  border-top: 1px solid var(--line);
  font-family: var(--font-ui); font-weight: 600; font-size: 0.82rem;
  letter-spacing: 0.12em; text-transform: uppercase; color: var(--muted);
}

@media (max-width: 620px) {
  .legal__list > li { grid-template-columns: 1.9rem 1fr; }
}

/* ---------- Ekran ladowania ----------
   Godlo na kremowym tle, potem strona. Trzy zabezpieczenia, bo ekran ladowania
   z definicji stoi miedzy gosciem a trescia i nie wolno mu sie zaciac:

   1. Pokazuje sie RAZ NA WIZYTE. Strona jest wielostronicowa, wiec bez tego
      migalby przy kazdym klliknieciu w menu. Decyduje o tym maly skrypt
      w <head>, ktory dopisuje klase do <html>.
   2. Znika sam po 2,6 s nawet bez JavaScriptu. Animacja-bezpiecznik jest
      w CSS, wiec zepsuty albo zablokowany skrypt nie zatrzasnie strony.
   3. Przy wylaczonych animacjach nie ma wjazdu godla, tylko krotkie przenikniecie.

   USUNIECIE: skasuj <div class="loader"> z plikow HTML. Reszta zniknie sama,
   bo nic innego z tych regul nie korzysta. */
html.loader-off .loader { display: none; }

.loader {
  position: fixed; inset: 0; z-index: 9999;
  display: grid; place-items: center; align-content: center; gap: 1.6rem;
  background: var(--cream);
  animation: loader-out 0.5s var(--ease) 6s forwards;     /* bezpiecznik: dziala tylko, gdy skrypt sie nie wykona */
}
.loader.is-done { animation: loader-out 0.45s var(--ease) forwards; }
@keyframes loader-out { to { opacity: 0; visibility: hidden; } }

.loader__mark {
  width: clamp(200px, 26vw, 320px); height: auto; display: block;
  animation: loader-mark 0.9s var(--ease) both;
}
@keyframes loader-mark {
  from { opacity: 0; transform: translateY(14px) scale(0.96); }
  to   { opacity: 1; transform: none; }
}

/* Cienka kreska pod godlem. Nie udaje procentow, bo ich nie znamy;
   pokazuje tylko, ze cos sie dzieje. */
.loader__bar {
  width: clamp(150px, 20vw, 230px); height: 2px; border-radius: 2px;
  background: var(--accent-soft); overflow: hidden;
}
.loader__bar span {
  display: block; width: 40%; height: 100%; border-radius: 2px;
  background: var(--accent);
  animation: loader-bar 1.1s var(--ease) infinite;
}
@keyframes loader-bar {
  from { transform: translateX(-110%); }
  to   { transform: translateX(310%); }
}

@media (prefers-reduced-motion: reduce) {
  .loader__mark { animation: none; }
  .loader__bar span { animation: none; width: 100%; }
  .loader { animation-delay: 4s; }
}

/* ---------- Nagłówek podstrony ---------- */
/* Sekcja tytułowa podstron: to samo zdjęcie hero co na home page - wypełnia
   całą sekcję (cover), z wtopionym logiem Kominkowy Chill w centrum kadru.
   Tytuł strony (breadcrumb + H1 + akapit) siedzi NA DOLE sekcji, tak jak
   pasek rezerwacji na home hero. Gradient overlay - lekki na środku (logo
   świeci), ciemny na dole (czytelność tekstu). */
.page-hero {
  position: relative; color: #fff; text-align: center;
  min-height: 100vh;
  padding: calc(var(--header-h) + 2rem) 0 clamp(2rem, 5vh, 3rem);
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  background:
    linear-gradient(rgba(20,14,10,0.08) 0%, rgba(20,14,10,0.12) 45%, rgba(20,14,10,0.60) 78%, rgba(20,14,10,0.78) 100%),
    url("../img/hero-oko-1000.webp") center / cover no-repeat;
}
@media (min-width: 700px), (min-resolution: 1.5dppx) {
  .page-hero { background-image:
    linear-gradient(rgba(20,14,10,0.08) 0%, rgba(20,14,10,0.12) 45%, rgba(20,14,10,0.60) 78%, rgba(20,14,10,0.78) 100%),
    url("../img/hero-oko-1600.webp"); }
}
@media (max-width: 700px) {
  /* Na mobile cover wypełnia sekcję i logo w środku zajmuje ~40% pionu.
     Rozdzielam treść na dwie strefy jak na home mobile: breadcrumb tuż pod
     headerem, H1+p razem na dole - logo widoczne w środku między nimi.
     Grid + pusta środkowa strefa 1fr zamiast zmiany HTML. */
  .page-hero { min-height: 100vh; min-height: 100svh; padding-top: calc(var(--header-h) + 1rem); }
  .page-hero .container {
    display: grid;
    grid-template-rows: auto 1fr auto auto;
    height: 100%;
    min-height: calc(100vh - var(--header-h) - 4rem);
    min-height: calc(100svh - var(--header-h) - 4rem);
  }
  .page-hero .container > .breadcrumb { grid-row: 1; margin-bottom: 0; }
  .page-hero .container > h1 { grid-row: 3; }
  .page-hero .container > p { grid-row: 4; }
  .page-hero h1 { font-size: clamp(1.9rem, 7vw, 2.4rem); }
}
/* ---------- Nagłówek podstrony z filmem (Apartamenty, Wellness, Atrakcje) ----------
   Każda z tych stron podaje swój film i plakat. Plakat wskazuje zmienna
   --hero-poster, ustawiona niżej przy klasach poszczególnych stron, dzięki czemu
   sam mechanizm jest wspólny.

   Film wypełnia cały nagłówek ("cover"), tak samo jak hero na stronie głównej. */
.page-hero--video { background: #14100d; }

.page-hero--video .page-hero__media { position: absolute; inset: 0; overflow: hidden; z-index: 0; }

/* Plakat pod filmem. Zostaje sam, gdy film się nie odtworzy albo gość ma
   wyłączone animacje. */
.page-hero--video .page-hero__media::after {
  content: ""; position: absolute; inset: 0;
  background: var(--hero-poster) center / cover no-repeat;
}

.page-hero__video {
  position: absolute; inset: 0; width: 100%; height: 100%; display: block; border: 0;
  z-index: 2; object-fit: cover;
}

/* Godło na filmie, tak jak w hero na stronie głównej: breadcrumb pod menu,
   godło pośrodku, tytuł na dole. Pusty rząd 1fr trzyma godło w środku
   niezależnie od długości tytułu. */
.page-hero--video .container {
  display: grid;
  grid-template-rows: auto 1fr auto auto;
  min-height: calc(100vh - var(--header-h) - 6rem);
}
.page-hero--video .container > .breadcrumb { grid-row: 1; margin-bottom: 0; }
.page-hero--video .container > h1 { grid-row: 3; }
.page-hero--video .container > p { grid-row: 4; }
.page-hero__logo {
  grid-row: 2; align-self: center; justify-self: center;
  width: clamp(150px, 17vw, 250px); height: auto;
  filter: drop-shadow(0 4px 26px rgba(10, 16, 22, 0.55)) drop-shadow(0 1px 3px rgba(10, 16, 22, 0.4));
}

/* Film i plakat dla poszczególnych stron.
   PODMIANA FILMU: wgraj nowy plik pod tą samą nazwą do assets/video/,
   a plakat (pierwsza klatka filmu) do assets/img/. */
.page-hero--apartamenty { --hero-poster: url("../img/apartamenty-poster.webp"); }
.page-hero--wellness    { --hero-poster: url("../img/wellness-poster.webp"); }
.page-hero--atrakcje    { --hero-poster: url("../img/atrakcje-poster.webp"); }
.page-hero--kontakt     { --hero-poster: url("../img/kontakt-poster.webp"); }

/* Przyciemnienie osobnym elementem, bo tłem sekcji jest teraz film, a nie obrazek.
   Góra pod menu, dół pod tytuł, plus równy welon, żeby biel trzymała się
   także na jasnym, czerwonym wnętrzu sauny. */
.page-hero__scrim {
  position: absolute; inset: 0; z-index: 3;
  background:
    linear-gradient(180deg, rgba(16,12,10,0.50) 0%, rgba(16,12,10,0.14) 22%, transparent 40%),
    linear-gradient(0deg, rgba(16,12,10,0.86) 0%, rgba(16,12,10,0.50) 28%, transparent 60%),
    linear-gradient(rgba(16,12,10,0.16), rgba(16,12,10,0.16));
}
.page-hero--video .container { position: relative; z-index: 4; }

/* Godło jest białe, a kadr bywa bardzo jasny (śnieg, pościel), więc pod samym
   godłem dokładamy miękką plamę cienia. Punktowo, żeby nie przygaszać całego filmu. */
.page-hero--video .page-hero__scrim {
  background:
    radial-gradient(45% 26% at 50% 44%, rgba(16,12,10,0.42) 0%, rgba(16,12,10,0.18) 55%, transparent 100%),
    linear-gradient(180deg, rgba(16,12,10,0.50) 0%, rgba(16,12,10,0.14) 22%, transparent 40%),
    linear-gradient(0deg, rgba(16,12,10,0.86) 0%, rgba(16,12,10,0.50) 28%, transparent 60%),
    linear-gradient(rgba(16,12,10,0.16), rgba(16,12,10,0.16));
}

/* Film jest ozdobą, nie treścią, więc przy wyłączonych animacjach zostaje sam plakat. */
@media (prefers-reduced-motion: reduce) {
  .page-hero__video { display: none; }
}

.page-hero h1 { color: #fff; text-shadow: 0 2px 18px rgba(0,0,0,0.55); }
.page-hero p { color: rgba(255,255,255,0.95); margin-top: 0.8rem; font-size: 1.1rem; text-shadow: 0 1px 12px rgba(0,0,0,0.5); }
.breadcrumb { font-family: var(--font-ui); font-size: 0.78rem; letter-spacing: 0.06em; text-transform: uppercase; color: rgba(255,255,255,0.8); margin-bottom: 1rem; }
.breadcrumb a:hover { color: #fff; }
.stub { border: 1px dashed var(--accent-soft); border-radius: var(--radius); background: var(--paper); padding: 2rem; text-align: center; color: var(--muted); }

/* ---------- Grid kart (podstrony) ---------- */
.cards { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1.6rem; margin-top: 2.4rem; }
.card { background: #fff; border: 1px solid var(--line); border-radius: var(--radius); overflow: hidden; box-shadow: var(--shadow-sm); transition: transform 0.25s var(--ease), box-shadow 0.25s var(--ease); }
.card:hover { transform: translateY(-4px); box-shadow: var(--shadow-md); }
.card .ph { border-radius: 0; border: none; }
.card__body { padding: 1.4rem 1.5rem 1.7rem; }
.card__body h3 { margin-bottom: 0.5rem; }
.card__body .btn { margin-top: 1rem; }
/* split (kontakt) */
.split { display: grid; grid-template-columns: 1fr 1fr; gap: clamp(2rem, 5vw, 4.5rem); align-items: center; }
.split__body h2 { margin-bottom: 1.2rem; }

/* ---------- Footer ---------- */
.site-footer { background: var(--sand); color: var(--ink-soft); padding-top: clamp(3.5rem, 7vw, 5rem); border-top: 1px solid var(--line); }
.footer-grid { display: grid; grid-template-columns: 1.5fr 1fr 1fr 1fr; gap: 2.5rem; padding-bottom: 3rem; border-bottom: 1px solid var(--line); }
.site-footer h4 { font-family: var(--font-ui); color: var(--ink); font-size: 0.8rem; text-transform: uppercase; letter-spacing: 0.16em; margin-bottom: 1.2rem; font-weight: 700; }
.site-footer a:hover { color: var(--accent); }
.footer-links li + li { margin-top: 0.55rem; }
.footer-brand .brand__name { color: var(--ink); }
.footer-brand p { color: var(--muted); margin-top: 1rem; max-width: 36ch; }
.footer-contact li { display: flex; gap: 0.6rem; margin-bottom: 0.7rem; }
.footer-contact svg { width: 18px; height: 18px; color: var(--accent); flex: none; margin-top: 3px; }
.footer-social { display: flex; gap: 0.6rem; }
.footer-social a { width: 40px; height: 40px; border-radius: 50%; display: grid; place-items: center; background: rgba(60,42,28,0.06); color: var(--ink); transition: background 0.2s, transform 0.2s; }
.footer-social a:hover { background: var(--accent); color: #fff; transform: translateY(-2px); }
.footer-social svg { width: 18px; height: 18px; }
.footer-bottom { display: flex; flex-wrap: wrap; gap: 0.6rem 1.5rem; justify-content: space-between; padding: 1.5rem 0; font-size: 0.85rem; color: var(--muted); }

/* Wybór języka powtórzony w stopce: to drugie miejsce, w którym ludzie go
   szukają, gdy nie znajdą w nagłówku. Nazwy pełne, każda swoim alfabetem. */
.footer-lang { display: inline-flex; align-items: center; flex-wrap: wrap; gap: 0.5rem; }
.footer-lang__label {
  font-family: var(--font-ui); font-weight: 600; font-size: 0.68rem;
  letter-spacing: 0.12em; text-transform: uppercase; opacity: 0.75;
}
.footer-lang a { color: var(--ink-soft); font-family: var(--font-ui); font-size: 0.82rem; }
.footer-lang a:hover { color: var(--accent); text-decoration: underline; text-underline-offset: 3px; }
.footer-lang a.is-current { color: var(--accent); font-weight: 700; }
.footer-lang a + a::before {
  content: ""; display: inline-block; vertical-align: middle;
  width: 1px; height: 0.8em; background: currentColor; opacity: 0.4; margin-inline-end: 0.5rem;
}
.footer-lang a[lang="ar"] {
  font-family: "Tajawal", "Noto Sans Arabic", "Geeza Pro", "Segoe UI", Tahoma, sans-serif;
  font-size: 0.96rem; letter-spacing: normal; text-transform: none;
}
@media (max-width: 600px) { .footer-lang { width: 100%; } }

/* Najwezsze telefony (320 px): w naglowku nie miesci sie i pelna nazwa marki,
   i trzy skroty jezykow. Ustepuje nazwa: sygnet obok identyfikuje obiekt tak
   samo, a pelna nazwa stoi w hero tuz nizej. Wybor jezyka zostaje w calosci,
   bo to wlasnie na malym ekranie gosc najlatwiej go przeoczy. */
@media (max-width: 400px) {
  .brand__name { display: none; }
  .langpick__btn { padding: 0 0.5rem 0 0.42rem; }
  .langpick__codes { gap: 0.28rem; }
  .langpick__code + .langpick__code::before { margin-inline-end: 0.28rem; }
  .site-header__inner { width: calc(100% - 1.6rem); }
}

/* ---------- Pływające przyciski ---------- */
.floating { position: fixed; z-index: 90; left: 18px; top: 50%; transform: translateY(-50%); display: flex; flex-direction: column; gap: 0.6rem; opacity: 0; visibility: hidden; transition: opacity 0.3s var(--ease), visibility 0.3s; }
.floating.is-visible { opacity: 1; visibility: visible; }
.floating a { display: inline-flex; align-items: center; gap: 0.5rem; background: var(--accent); color: #fff; border: 1px solid rgba(255,255,255,0.35); border-radius: var(--radius-pill); padding: 0.75rem; box-shadow: var(--shadow-md); font-family: var(--font-ui); font-weight: 600; font-size: 0.85rem; transition: background 0.2s; overflow: hidden; }
.floating a svg { width: 20px; height: 20px; flex: none; }
.floating a .floating__text { max-width: 0; opacity: 0; white-space: nowrap; transition: max-width 0.35s var(--ease), opacity 0.25s var(--ease), margin 0.35s var(--ease); }
.floating a:hover { background: var(--accent-dark); }
.floating a:hover .floating__text { max-width: 170px; opacity: 1; margin-right: 0.3rem; }

/* =====================================================================
   PODSTRONY: apartamenty, galeria, atrakcje, kontakt
   ===================================================================== */

.gallery-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1rem; margin-top: 2.5rem; }
.gallery-grid .ph { aspect-ratio: 3 / 2; }
.gallery-cta { display: flex; justify-content: center; margin-top: 2.4rem; }

/* ---------- Galeria wellness: masonry + podgląd ze "wspólnym elementem" ----------
   Siatka kolumnowa (naturalne proporcje zdjęć, bez przycinania do 3:2).
   Kliknięcie: zdjęcie "leci" z miejsca w siatce na cały ekran i z powrotem
   (FLIP - main.js), z rozmytym tłem i zamknięciem przeciągnięciem w dół na
   dotyku. To osobny, prostszy komponent niż .lightbox przy apartamentach
   (tam jest nawigacja i miniaturki) - tu tylko szybki podgląd jednego zdjęcia. */
.zoom-gallery { column-count: 1; column-gap: 1.25rem; margin-top: 2.5rem; }
@media (min-width: 640px)  { .zoom-gallery { column-count: 2; } }
@media (min-width: 900px)  { .zoom-gallery { column-count: 3; } }
@media (min-width: 1280px) { .zoom-gallery { column-count: 4; } }

.zoom-gallery__item {
  display: block; width: 100%; margin: 0 0 1.25rem; padding: 0; border: 0;
  background: none; break-inside: avoid; border-radius: 16px; overflow: hidden;
  cursor: zoom-in; position: relative; isolation: isolate;
}
.zoom-gallery__item img { width: 100%; height: auto; display: block; transition: transform 0.5s var(--ease); }
.zoom-gallery__item:hover img { transform: scale(1.04); }
.zoom-gallery__item::after {
  content: ""; position: absolute; inset: 0; background: rgba(20,14,10,0);
  transition: background 0.25s var(--ease); pointer-events: none;
}
.zoom-gallery__item:hover::after { background: rgba(20,14,10,0.08); }
.zoom-gallery__item:focus-visible { outline: 3px solid var(--accent-2); outline-offset: 3px; }
/* zdjęcie w siatce chowa się na czas otwartego podglądu - widoczny jest tylko duży klon w .zoom-view */
.zoom-gallery__item.is-hidden img { opacity: 0; }

.zoom-view { position: fixed; inset: 0; z-index: 400; }
.zoom-view[hidden] { display: none; }
.zoom-view__backdrop {
  position: absolute; inset: 0; background: rgba(12, 9, 7, 0.82);
  backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px);
  opacity: 0; transition: opacity 0.3s var(--ease);
}
.zoom-view.is-open .zoom-view__backdrop { opacity: 1; }
.zoom-view__img {
  position: fixed; top: 0; left: 0; z-index: 1;
  border-radius: var(--radius-lg); box-shadow: var(--shadow-lg);
  object-fit: cover; cursor: zoom-out; will-change: transform; touch-action: none;
}
.zoom-view__close {
  position: absolute; top: 1.4rem; right: 1.4rem; z-index: 2;
  width: 44px; height: 44px; border-radius: 50%;
  background: rgba(255,255,255,0.12); border: 1px solid rgba(255,255,255,0.32); color: #fff;
  display: grid; place-items: center; cursor: pointer;
  backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px);
  opacity: 0; transform: translateY(-10px);
  transition: opacity 0.25s var(--ease), transform 0.25s var(--ease), background 0.2s var(--ease);
}
.zoom-view.is-open .zoom-view__close { opacity: 1; transform: translateY(0); }
.zoom-view__close:hover { background: rgba(255,255,255,0.24); }
.zoom-view__close svg { width: 20px; height: 20px; }
body.zoom-open { overflow: hidden; }
@media (prefers-reduced-motion: reduce) {
  .zoom-gallery__item img, .zoom-gallery__item::after,
  .zoom-view__backdrop, .zoom-view__close, .zoom-view__img { transition: none !important; }
}

/* ---------- Galeria wellness, mieszane kadry ----------
   Masonry ma sens tylko wtedy, gdy zdjęcia mają różne proporcje. Nasze mają
   wszystkie 1200x800, czyli 3:2 co do jednego, więc siatka wychodziła równa
   jak z linijki, bez tego przeplatania z wzoru.

   Ta warstwa nadaje części kafli inne proporcje, żeby kolumny przestały się
   równać. Cena jest uczciwa: te kafle są DOKADROWANE, czyli coś ze zdjęcia
   wypada. Docelowo lepiej dać różne zdjęcia niż przycinać jednakowe.

   Wzór ma okres 5, a kolumn są 4, więc te same proporcje nie lądują
   w tej samej kolumnie i układ nie wpada w regularność.

   WYŁĄCZENIE: usuń klasę zoom-gallery--mixed z siatki w galeria.html
   i en/gallery.html, wtedy wszystkie zdjęcia wracają do pełnego kadru. */
.zoom-gallery--mixed .zoom-gallery__item { aspect-ratio: 3 / 2; }
.zoom-gallery--mixed .zoom-gallery__item img { width: 100%; height: 100%; object-fit: cover; }
.zoom-gallery--mixed .zoom-gallery__item:nth-child(5n + 2) { aspect-ratio: 3 / 4; }   /* pion */
.zoom-gallery--mixed .zoom-gallery__item:nth-child(5n + 4) { aspect-ratio: 1 / 1; }   /* kwadrat */
.zoom-gallery--mixed .zoom-gallery__item:nth-child(5n + 5) { aspect-ratio: 4 / 5; }   /* lekki pion */


/* ---------- Atrakcje: siatka kafli ----------
   Kazda atrakcja to jeden kafel ze zdjeciem na calej powierzchni, tytulem
   przy dolnej krawedzi i malym przyciskiem "i" w rogu. Przycisk wysuwa opis
   na kafel, wiec siatka zostaje spokojna, a szczegoly sa pod reka.

   Zaokraglenia, cienie i typografia sa nasze, nie z wzoru: kafel ma ten sam
   promien co galeria wellness, tytul idzie naszym krojem naglowkowym,
   a przycisk bierze kolor z palety zamiast bezowego prostokata. */
.spot-grid {
  display: grid; grid-template-columns: 1fr; gap: 1.25rem;
  margin-top: clamp(2.2rem, 5vw, 3.5rem);
}
@media (min-width: 620px)  { .spot-grid { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1000px) { .spot-grid { grid-template-columns: repeat(3, 1fr); } }

.spot-card {
  position: relative; overflow: hidden;
  aspect-ratio: 4 / 3;
  border-radius: 16px;
  background: var(--espresso);
  box-shadow: 0 14px 34px -18px rgba(16, 12, 10, 0.5);
  isolation: isolate;
}
.spot-card__media { position: absolute; inset: 0; margin: 0; border: 0; border-radius: 0; }
.spot-card__media img {
  width: 100%; height: 100%; object-fit: cover; display: block;
  transition: transform 0.6s var(--ease);
}
.spot-card:hover .spot-card__media img { transform: scale(1.05); }

/* Przyciemnienie tylko u dolu, zeby zdjecie zostalo czytelne, a tytul mial tlo. */
.spot-card__scrim {
  position: absolute; inset: 0; z-index: 1;
  background: linear-gradient(0deg, rgba(16,12,10,0.78) 0%, rgba(16,12,10,0.30) 32%, transparent 62%);
}

.spot-card__title {
  position: absolute; z-index: 2; left: clamp(1rem, 2.5vw, 1.4rem); bottom: clamp(0.9rem, 2.4vw, 1.3rem);
  right: calc(clamp(1rem, 2.5vw, 1.4rem) + 62px);
  margin: 0; color: #fff; text-wrap: balance;
  font-size: clamp(1.15rem, 1.9vw, 1.5rem); line-height: 1.15;
  text-shadow: 0 2px 18px rgba(16,12,10,0.55);
}

/* Przycisk "i". Kwadrat z zaokraglonymi rogami, na szkle, w kolorze akcentu. */
.spot-card__info {
  position: absolute; z-index: 3;
  right: clamp(0.9rem, 2.2vw, 1.2rem); bottom: clamp(0.9rem, 2.2vw, 1.2rem);
  width: 46px; height: 46px; border-radius: 12px; cursor: pointer;
  display: grid; place-items: center;
  border: 1px solid rgba(255,255,255,0.34);
  background: rgba(182, 92, 66, 0.72);
  -webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px);
  color: #fff; font-family: var(--font-head, var(--font-ui)); font-style: italic;
  font-size: 1.15rem; line-height: 1;
  transition: background 0.2s var(--ease), transform 0.2s var(--ease);
}
.spot-card__info:hover { background: var(--accent); transform: translateY(-2px); }
.spot-card__info:focus-visible { outline: 3px solid var(--accent-2); outline-offset: 3px; }

/* Opis wysuwa sie na kafel od dolu. [hidden] zdejmuje go z ukladu calkiem,
   wiec bez JavaScriptu nie ma pustego pola, a czytnik ekranu go nie czyta. */
/* Panel zakrywa CALY kafel, nie tylko dol. Wersja przyklejona do dolu miala wade:
   przy waskim kaflu dluzszy opis rosl w gore i wychodzil poza karte, a ta ma
   overflow: hidden, wiec tekst bylby po prostu uciety. Tu miejsca starcza zawsze,
   a gdyby opis byl naprawde dlugi, panel da sie przewinac. */
.spot-card__desc {
  position: absolute; inset: 0; z-index: 2;
  padding: clamp(1.1rem, 2.6vw, 1.5rem);
  padding-bottom: calc(clamp(0.9rem, 2.2vw, 1.2rem) + 46px + 0.8rem);
  background: rgba(16, 12, 10, 0.9);
  -webkit-backdrop-filter: blur(6px); backdrop-filter: blur(6px);
  color: rgba(255,255,255,0.94);
  display: flex; flex-direction: column; justify-content: flex-end; gap: 0.6rem;
  overflow-y: auto; overscroll-behavior: contain;
}
.spot-card__desc[hidden] { display: none; }
.spot-card__desc p { margin: 0; font-size: 0.96rem; line-height: 1.55; }
.spot-card.is-open .spot-card__title { opacity: 0; }
.spot-card.is-open .spot-card__scrim { opacity: 0; }

.spot-card__dist {
  align-self: flex-start;
  font-family: var(--font-ui); font-weight: 600; font-size: 0.68rem;
  letter-spacing: 0.14em; text-transform: uppercase;
  padding: 0.34rem 0.8rem; border-radius: var(--radius-pill);
  background: rgba(255,255,255,0.14); border: 1px solid rgba(255,255,255,0.26);
}

/* Karty bez zdjecia dostaja jednolite tlo z naszej palety. Po wgraniu zdjecia
   zdejmij obie klasy z <article>. */
.spot-card--tone-a { background: var(--accent-dark); }
.spot-card--tone-b { background: var(--espresso); }
.spot-card--plain .spot-card__media { opacity: 0.16; }
.spot-card--plain .ph__label { display: none; }

@media (prefers-reduced-motion: reduce) {
  .spot-card__media img, .spot-card__info { transition: none; }
  .spot-card:hover .spot-card__media img { transform: none; }
}

/* ---------- Wiersz apartamentu (naprzemiennie) ---------- */
.apt { display: grid; grid-template-columns: 1.05fr 0.95fr; gap: clamp(1.6rem, 4vw, 3.5rem); align-items: center; }
.apt + .apt { margin-top: clamp(3rem, 6vw, 5rem); padding-top: clamp(3rem, 6vw, 5rem); border-top: 1px solid var(--line); }
.apt--reverse .apt__media { order: -1; }
.apt__media .ph { aspect-ratio: 3 / 2; border-radius: var(--radius-lg); }
.apt__thumbs { display: grid; grid-template-columns: repeat(3, 1fr); gap: 0.6rem; margin-top: 0.6rem; }
.apt__thumbs .ph { aspect-ratio: 3 / 2; border-radius: var(--radius-sm); }
.apt__badges { display: flex; flex-wrap: wrap; gap: 0.5rem; margin-bottom: 1rem; }
.badge { display: inline-flex; align-items: center; gap: 0.4rem; background: var(--sand); color: var(--accent-dark); border-radius: var(--radius-pill); padding: 0.4rem 0.85rem; font-family: var(--font-ui); font-weight: 600; font-size: 0.78rem; }
.badge svg { width: 15px; height: 15px; color: var(--accent); }
.apt h3 { font-size: clamp(1.5rem, 2.6vw, 2rem); margin-bottom: 0.7rem; }
.apt__list { display: grid; grid-template-columns: 1fr 1fr; gap: 0.4rem 1.2rem; margin-top: 1.2rem; list-style: none; padding: 0; }
.apt__list li { display: flex; align-items: flex-start; gap: 0.5rem; font-size: 0.92rem; line-height: 1.45; color: var(--ink-soft); }
.apt__list li::before { content: "✓"; color: var(--accent); font-weight: 700; flex: none; font-size: 0.85em; line-height: 1.7; }
.apt__list svg { width: 16px; height: 16px; color: var(--accent); flex: none; }
.apt__sub { font-family: var(--font-ui); font-weight: 600; font-size: 0.85rem; color: var(--accent); margin-bottom: 0.8rem; }
.apt__media .ph > img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.apt__price { display: flex; align-items: baseline; gap: 0.5rem; margin-top: 1.4rem; font-family: var(--font-display); }
.apt__price strong { font-size: 1.5rem; color: var(--ink); font-weight: 500; }
.apt__price span { font-family: var(--font-ui); font-size: 0.85rem; color: var(--muted); }
.apt__actions { display: flex; flex-wrap: wrap; gap: 0.7rem; margin-top: 1.4rem; }

/* ---------- Karty apartamentów (siatka z hover-reveal) ---------- */
.apt-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: clamp(1.1rem, 2.2vw, 1.8rem);
}
.apt-card {
  position: relative;
  isolation: isolate;
  overflow: hidden;
  border-radius: var(--radius-lg);
  border: 1px solid var(--line);
  background: var(--sand);
  box-shadow: var(--shadow-sm);
  aspect-ratio: 3 / 4;
  color: #fff;
  transition: transform 0.35s var(--ease), box-shadow 0.35s var(--ease);
}
.apt-card:hover,
.apt-card:focus-within { transform: translateY(-6px); box-shadow: var(--shadow-lg); }

.apt-card__media {
  position: absolute; inset: 0;
  margin: 0;
  border: none; border-radius: 0;
  aspect-ratio: auto;
  transition: transform 0.6s var(--ease);
  z-index: 0;
}
.apt-card__media > img,
.apt-card__media > video { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.apt-card:hover .apt-card__media,
.apt-card:focus-within .apt-card__media { transform: scale(1.08); }

.apt-card__scrim {
  position: absolute; inset: 0;
  background:
    linear-gradient(to top, rgba(20,12,8,0.88) 0%, rgba(20,12,8,0.55) 38%, rgba(20,12,8,0.05) 72%, rgba(20,12,8,0) 100%);
  z-index: 1;
  pointer-events: none;
  transition: background 0.4s var(--ease);
}
.apt-card:hover .apt-card__scrim,
.apt-card:focus-within .apt-card__scrim {
  background:
    linear-gradient(to top, rgba(20,12,8,0.92) 0%, rgba(20,12,8,0.72) 55%, rgba(20,12,8,0.25) 90%, rgba(20,12,8,0.1) 100%);
}

.apt-card__content {
  position: absolute; inset: 0;
  z-index: 2;
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  padding: clamp(1.1rem, 2vw, 1.6rem);
  pointer-events: none;
}
.apt-card__content > * { pointer-events: auto; }

.apt-card__top { display: flex; }
.apt-card__badge {
  display: inline-flex; align-items: center; gap: 0.4rem;
  background: rgba(255,255,255,0.14);
  color: #fff;
  border: 1px solid rgba(255,255,255,0.35);
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
  border-radius: var(--radius-pill);
  padding: 0.38rem 0.85rem;
  font-family: var(--font-ui); font-weight: 600; font-size: 0.76rem;
  letter-spacing: 0.02em;
}
.apt-card__badge svg { width: 14px; height: 14px; color: #fff; }

.apt-card__slide {
  display: flex;
  flex-direction: column;
  gap: 0.75rem;
  margin-top: auto;
  transform: translateY(0);
  transition: transform 0.5s var(--ease);
}
.apt-card:hover .apt-card__slide,
.apt-card:focus-within .apt-card__slide { transform: translateY(-4.6rem); }

.apt-card__heading h3 {
  color: #fff;
  font-family: var(--font-display);
  font-weight: 500;
  font-size: clamp(1.35rem, 1.6vw + 0.7rem, 1.75rem);
  line-height: 1.15;
  margin: 0;
}
.apt-card__loc {
  margin: 0.35rem 0 0;
  color: rgba(255,255,255,0.78);
  font-family: var(--font-ui);
  font-size: 0.78rem;
  letter-spacing: 0.06em;
  text-transform: uppercase;
}

.apt-card__overview { max-height: 0; opacity: 0; overflow: hidden; transition: max-height 0.5s var(--ease), opacity 0.35s var(--ease); }
.apt-card:hover .apt-card__overview,
.apt-card:focus-within .apt-card__overview { max-height: 200px; opacity: 1; }
.apt-card__overview h4 {
  color: rgba(255,255,255,0.9);
  font-family: var(--font-ui);
  font-size: 0.72rem;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  margin: 0 0 0.35rem;
}
.apt-card__overview p {
  color: rgba(255,255,255,0.82);
  font-size: 0.9rem;
  line-height: 1.5;
  margin: 0;
}

.apt-card__reveal {
  position: absolute;
  left: clamp(1.1rem, 2vw, 1.6rem);
  right: clamp(1.1rem, 2vw, 1.6rem);
  bottom: clamp(1.1rem, 2vw, 1.6rem);
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.75rem;
  transform: translateY(140%);
  opacity: 0;
  transition: transform 0.5s var(--ease), opacity 0.35s var(--ease);
}
.apt-card:hover .apt-card__reveal,
.apt-card:focus-within .apt-card__reveal { transform: translateY(0); opacity: 1; }
/* podpis "N osób" po lewej: ten sam krój/rytm co przycisk po prawej,
   tylko odwrócona hierarchia (biały tekst na tle, subtelniejszy) */
.apt-card__price {
  display: inline-flex; align-items: center;
  font-family: var(--font-ui);
  font-weight: 600;
  font-size: 0.78rem;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.88);
}
.apt-card__btn {
  padding: 0.7rem 1.1rem;
  font-size: 0.78rem;
  background: #fff;
  color: var(--ink);
  border-color: #fff;
  display: inline-flex; align-items: center; gap: 0.45rem;
  white-space: nowrap;
}
.apt-card__btn:hover { background: var(--accent); border-color: var(--accent); color: #fff; }
.apt-card__btn svg { width: 15px; height: 15px; }

.apt-card__link {
  position: absolute; inset: 0;
  z-index: 3;
  text-indent: -9999px;
  overflow: hidden;
}
.apt-card__link:focus-visible { outline: 3px solid var(--accent-2); outline-offset: -3px; border-radius: var(--radius-lg); }

/* placeholder <figure class="ph"> jako tło karty: usuwamy jego domyślne obramowanie i label pozycjonujemy nad scrim */
.apt-card__media.ph { background: linear-gradient(135deg, var(--sand-2) 0%, var(--wood) 100%); }
.apt-card__media .ph__label {
  position: absolute; top: 0.9rem; right: 0.9rem;
  z-index: 3;
}

/* ---------- Reveal-list: duże tytuły + odsłaniane miniaturki na hover ---------- */
.reveal-list {
  display: flex;
  flex-direction: column;
  gap: 0.25rem;
  padding: 1.4rem 1.6rem 1.8rem;
  border-radius: var(--radius-lg);
  background: rgba(255,255,255,0.55);
  border: 1px solid var(--line);
  backdrop-filter: blur(4px);
  -webkit-backdrop-filter: blur(4px);
}
.reveal-list__eyebrow {
  font-family: var(--font-ui);
  font-weight: 800;
  font-size: 0.72rem;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: var(--muted);
  margin: 0 0 0.4rem;
}

.reveal-item {
  position: relative;
  display: block;
  padding: 1.4rem 0;
  overflow: visible;
  color: var(--ink);
  isolation: isolate;
  border-bottom: 1px solid var(--line);
}
.reveal-item:last-of-type { border-bottom: 0; }

.reveal-item__text {
  display: inline-block;
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(2rem, 4.6vw, 3.6rem);
  line-height: 0.95;
  letter-spacing: -0.02em;
  color: var(--ink);
  transition: color 0.3s var(--ease), transform 0.35s var(--ease);
}
/* Bez miniaturek hover musi sam nieść informację "to jest link":
   kolor akcentu + delikatne przesunięcie w prawo, plus strzałka. */
.reveal-item:hover .reveal-item__text,
.reveal-item:focus-visible .reveal-item__text {
  color: var(--accent);
  transform: translateX(0.6rem);
}
.reveal-item__text::after {
  content: "";
  display: inline-block;
  width: 0.62em; height: 0.62em;
  margin-left: 0.5rem;
  border-right: 2px solid currentColor;
  border-top: 2px solid currentColor;
  transform: rotate(45deg) translateY(0.06em);
  opacity: 0;
  transition: opacity 0.3s var(--ease), transform 0.3s var(--ease);
}
.reveal-item:hover .reveal-item__text::after,
.reveal-item:focus-visible .reveal-item__text::after {
  opacity: 0.75;
  transform: rotate(45deg) translate(0.18em, -0.12em);
}

.reveal-item:focus-visible { outline: 2px solid var(--accent); outline-offset: 6px; border-radius: 6px; }

/* Urządzenia dotykowe: bez hoveru strzałka jest widoczna od razu */
@media (hover: none) {
  .reveal-item { padding: 1.2rem 0; }
  .reveal-item__text { font-size: clamp(1.6rem, 6vw, 2.4rem); }
  .reveal-item__text::after { opacity: 0.5; }
}

/* ---------- Lightbox: galeria pojedynczego apartamentu ---------- */
.lightbox { position: fixed; inset: 0; z-index: 1000; display: grid; place-items: center; padding: clamp(0.75rem, 3vw, 2rem); }
.lightbox[hidden] { display: none; }
.lightbox__backdrop {
  position: absolute; inset: 0;
  background: rgba(14, 9, 6, 0.86);   /* mocny scrim: tło nie konkuruje ze zdjęciem */
  -webkit-backdrop-filter: blur(3px); backdrop-filter: blur(3px);
  animation: lb-fade 0.22s var(--ease) both;
}
.lightbox__dialog {
  position: relative; z-index: 1;
  display: flex; flex-direction: column;
  width: min(1100px, 100%); max-height: 100%;
  background: var(--paper); color: var(--ink);
  border-radius: var(--radius-lg); overflow: hidden;
  box-shadow: var(--shadow-lg);
  animation: lb-in 0.26s var(--ease) both;
}
@keyframes lb-fade { from { opacity: 0; } to { opacity: 1; } }
@keyframes lb-in { from { opacity: 0; transform: translateY(12px) scale(0.985); } to { opacity: 1; transform: none; } }

.lightbox__bar { display: flex; align-items: center; gap: 1rem; padding: 1rem clamp(1rem, 3vw, 1.6rem); border-bottom: 1px solid var(--line); }
.lightbox__titles { flex: 1 1 auto; min-width: 0; }
.lightbox__title { font-family: var(--font-display); font-weight: 500; font-size: clamp(1.15rem, 2.6vw, 1.6rem); line-height: 1.2; }
.lightbox__sub { font-family: var(--font-ui); font-size: 0.82rem; color: var(--muted); margin-top: 0.15rem; }
.lightbox__close {
  flex: none; width: 44px; height: 44px;      /* min. cel dotykowy 44x44 */
  display: grid; place-items: center;
  border: 1px solid var(--line); border-radius: 50%;
  background: #fff; color: var(--ink); cursor: pointer;
  transition: background 0.2s var(--ease), color 0.2s var(--ease);
}
.lightbox__close:hover { background: var(--accent); border-color: var(--accent); color: #fff; }
.lightbox__close svg { width: 20px; height: 20px; }

.lightbox__stage { position: relative; display: flex; align-items: center; background: #150d08; }
.lightbox__figure { flex: 1 1 auto; aspect-ratio: 3 / 2; position: relative; }
.lightbox__img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: contain; }
.lightbox__nav {
  position: absolute; top: 50%; transform: translateY(-50%); z-index: 2;
  width: 48px; height: 48px; display: grid; place-items: center;
  border: 0; border-radius: 50%;
  background: rgba(255,255,255,0.9); color: var(--ink); cursor: pointer;
  box-shadow: var(--shadow-sm);
  transition: background 0.2s var(--ease), opacity 0.2s var(--ease);
}
.lightbox__nav:hover { background: #fff; }
.lightbox__nav--prev { left: clamp(0.5rem, 2vw, 1rem); }
.lightbox__nav--next { right: clamp(0.5rem, 2vw, 1rem); }
.lightbox__nav svg { width: 22px; height: 22px; }
.lightbox__nav:disabled { opacity: 0.35; cursor: default; }

.lightbox__foot { display: flex; align-items: center; gap: 1rem; padding: 0.85rem clamp(1rem, 3vw, 1.6rem); border-top: 1px solid var(--line); }
.lightbox__counter { flex: none; font-family: var(--font-ui); font-weight: 600; font-size: 0.82rem; color: var(--muted); font-variant-numeric: tabular-nums; }
.lightbox__thumbs { display: flex; gap: 0.5rem; overflow-x: auto; padding-bottom: 2px; }
.lightbox__thumb {
  flex: none; width: 72px; height: 52px; padding: 0;
  border: 2px solid transparent; border-radius: var(--radius-sm);
  overflow: hidden; cursor: pointer; background: var(--sand);
  opacity: 0.6; transition: opacity 0.2s var(--ease), border-color 0.2s var(--ease);
}
.lightbox__thumb img { width: 100%; height: 100%; object-fit: cover; }
.lightbox__thumb:hover { opacity: 1; }
.lightbox__thumb.is-active { opacity: 1; border-color: var(--accent); }

body.lightbox-open { overflow: hidden; }

@media (max-width: 620px) {
  .lightbox { padding: 0; }
  .lightbox__dialog { width: 100%; height: 100%; max-height: 100%; border-radius: 0; }
  .lightbox__stage { flex: 1 1 auto; }
  .lightbox__figure { aspect-ratio: auto; height: 100%; }
  .lightbox__nav { width: 44px; height: 44px; }
  .lightbox__thumbs { gap: 0.4rem; }
  .lightbox__thumb { width: 56px; height: 42px; }
}

/* ---------- Opinie: przewijane kolumny (marquee w pionie) ---------- */
.reviews-head { max-width: 620px; margin: 0 auto clamp(2.8rem, 6vw, 4rem); text-align: center; }
.reviews-head h2 {
  font-size: clamp(1.9rem, 4vw, 3rem);
  line-height: 1.05;
  text-wrap: balance;
}
.reviews-lead { color: var(--ink-soft); opacity: 0.85; margin-top: 0.9rem; }

/* ---------- Ocena ----------
   Bez pigułki i bez plakietki nad nagłówkiem. Sama liczba w kroju nagłówkowym,
   pięć gwiazdek nad nią i dyskretny odnośnik pod cienką kreską. Ocena ma robić
   za argument, a nie za guzik: im mniej ramek, tym drożej to wygląda.
   AKTUALIZACJA OCENY: liczba siedzi w trzech plikach (index.html,
   en/welcome.html, ar/welcome.html). Sprawdzaj ją raz na jakiś czas. */
.reviews-score {
  margin-top: clamp(1.9rem, 4.5vw, 2.8rem);
  display: grid; justify-items: center; gap: 0.5rem;
}
.reviews-score__stars { display: inline-flex; gap: 0.34rem; color: var(--accent); }
.reviews-score__stars svg { width: 15px; height: 15px; }

.reviews-score__rating {
  display: inline-flex; align-items: baseline; gap: 0.1em;
  /* Ocena to wyrażenie liczbowe, więc zostaje w kierunku od lewej także po
     arabsku. Bez tego "/10" przeskakuje przed liczbę i na ekranie czyta się
     "/10 9,9". Ta sama zasada co przy numerach telefonu. */
  direction: ltr;
  font-family: var(--font-display); font-weight: 500;
  font-size: clamp(2.9rem, 7vw, 4.2rem); line-height: 1;
  letter-spacing: -0.02em; color: var(--ink);
}
/* "/10" na tej samej linii pisma co duża liczba, nie w indeksie górnym:
   wyrównanie do baseline robi to samo, a nie trzeba dobierać przesunięcia. */
.reviews-score__scale {
  font-family: var(--font-ui); font-weight: 600;
  font-size: 0.22em; letter-spacing: 0.1em; color: var(--muted);
}

.reviews-score__link {
  position: relative; margin-top: 0.5rem; padding-top: 1.1rem;
  display: inline-flex; align-items: center; gap: 0.5rem;
  font-family: var(--font-ui); font-weight: 600; font-size: 0.7rem;
  letter-spacing: 0.16em; text-transform: uppercase; color: var(--muted);
  transition: color 0.2s var(--ease);
}
/* Cienka kreska nad odnośnikiem zamiast obramowania dookoła całości. */
.reviews-score__link::before {
  content: ""; position: absolute; top: 0; left: 50%; transform: translateX(-50%);
  width: 44px; height: 1px; background: var(--line);
}
.reviews-score__link:hover { color: var(--accent); }
.reviews-score__link svg { width: 14px; height: 14px; transition: transform 0.25s var(--ease); }
.reviews-score__link:hover svg { transform: translateX(3px); }
@media (max-width: 480px) {
  .reviews-score__link { font-size: 0.66rem; letter-spacing: 0.13em; }
}

.reviews-marquee {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 1.5rem;
  max-height: 740px;
  overflow: hidden;
  mask-image: linear-gradient(to bottom, transparent, black 18%, black 82%, transparent);
  -webkit-mask-image: linear-gradient(to bottom, transparent, black 18%, black 82%, transparent);
}
.reviews-column { position: relative; overflow: hidden; min-height: 0; }
.reviews-column__track {
  display: flex; flex-direction: column;
  gap: 1.4rem;
  will-change: transform;
  animation: reviews-scroll var(--reviews-dur, 34s) linear infinite;
}
.reviews-column--1 .reviews-column__track { --reviews-dur: 18s; }
.reviews-column--2 .reviews-column__track { --reviews-dur: 22s; }
.reviews-column--3 .reviews-column__track { --reviews-dur: 20s; }

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

.reviews-marquee:hover .reviews-column__track,
.reviews-marquee:focus-within .reviews-column__track {
  animation-play-state: paused;
}

.review {
  background: var(--paper);
  border: 1px solid var(--line);
  border-radius: var(--radius-lg);
  padding: 1.7rem 1.5rem;
  box-shadow: 0 4px 20px rgba(182, 92, 66, 0.06);
  display: flex; flex-direction: column; gap: 1rem;
}
.review__stars { display: flex; gap: 2px; color: var(--accent); }
.review__stars svg { width: 15px; height: 15px; }
.review__text {
  color: var(--ink);
  font-size: 0.98rem;
  line-height: 1.55;
  font-family: var(--font-body);
}
.review__list {
  color: var(--ink);
  font-size: 0.95rem;
  line-height: 1.55;
  font-family: var(--font-body);
  list-style: none;
  padding: 0;
  margin: 0;
}
.review__list li {
  padding-left: 0.9rem;
  position: relative;
}
.review__list li + li { margin-top: 0.15rem; }
.review__list li::before {
  content: "•";
  position: absolute;
  left: 0;
  color: var(--accent);
  font-weight: 700;
}
.review__author { display: flex; align-items: center; gap: 0.75rem; margin-top: auto; }
.review__avatar {
  width: 42px; height: 42px; border-radius: 50%;
  flex: none;
  display: grid; place-items: center;
  background: var(--accent);
  color: #fff;
  font-family: var(--font-ui); font-weight: 700; font-size: 0.82rem;
  letter-spacing: 0.02em;
  overflow: hidden;
}
.review__avatar img { width: 100%; height: 100%; object-fit: cover; display: block; }
.review__name { font-family: var(--font-ui); font-weight: 600; font-size: 0.9rem; color: var(--ink); line-height: 1.2; }
.review__role { font-family: var(--font-ui); font-size: 0.78rem; color: var(--muted); line-height: 1.2; margin-top: 0.15rem; }

.reviews-cta { display: flex; justify-content: center; margin-top: 2.4rem; }

@media (prefers-reduced-motion: reduce) {
  .reviews-column__track { animation: none; }
  .reviews-marquee { max-height: none; mask-image: none; -webkit-mask-image: none; }
}

.okolica-cta { margin-top: 1.6rem; }

/* ---------- Galeria atrakcji (index.html #okolica, en/welcome.html #area) ----------
   JAK TO DZIAŁA:
   - Panele leżą obok siebie i rozsuwają się pod kursorem: aktywny dostaje
     resztę szerokości, pozostałe kurczą się do paska z pionowym tytułem.
   - Bez myszki (telefon, tablet) panele układają się w pionie, a rozwijaniem
     steruje klasa .is-open: pierwsze dotknięcie rozwija, drugie wchodzi w link
     (obsługa w assets/js/main.js). Pierwszy panel ma .is-open w HTML, więc
     sekcja wygląda poprawnie także z wyłączonym JS.
   - Warstwy w panelu: .atrakcje-panel__media (zdjęcie) -> ::after (przyciemnienie)
     -> numer, pionowy tytuł i opis (z-index: 2). */
.atrakcje-gallery {
  display: flex;
  gap: 0.55rem;
  height: clamp(400px, 46vw, 540px);
  margin-top: clamp(2.2rem, 5vw, 3.5rem);
}

.atrakcje-panel {
  position: relative;
  flex: 1 1 0;
  min-width: 0;
  display: block;
  border-radius: var(--radius-lg);
  overflow: hidden;
  isolation: isolate;
  color: var(--white);
  text-decoration: none;
  border: 1px solid var(--line);
  transition: flex-grow 0.6s var(--ease), box-shadow 0.4s var(--ease);
}
/* zdjęcie wypełnia cały panel: nadpisujemy proporcje i zaokrąglenie z .ph */
.atrakcje-panel__media {
  position: absolute;
  inset: 0;
  aspect-ratio: auto;
  border: 0;
  border-radius: 0;
}
.atrakcje-panel__media img { transition: transform 0.8s var(--ease); }

/* przyciemnienie, żeby biały tekst był czytelny na każdym zdjęciu */
.atrakcje-panel::after {
  content: "";
  position: absolute; inset: 0; z-index: 1;
  pointer-events: none;
  background: linear-gradient(180deg, rgba(42, 29, 18, 0.44) 0%, rgba(42, 29, 18, 0.05) 36%, rgba(42, 29, 18, 0.74) 100%);
}

.atrakcje-panel__num,
.atrakcje-panel__vtitle,
.atrakcje-panel__body { position: absolute; z-index: 2; }

.atrakcje-panel__num {
  top: 1.1rem; left: 1.25rem;
  font-family: var(--font-ui);
  font-size: 0.72rem; font-weight: 600; letter-spacing: 0.14em;
  color: rgba(255, 255, 255, 0.85);
  text-shadow: 0 1px 6px rgba(0, 0, 0, 0.35);
}

/* stan zwinięty: sam tytuł, czytany od dołu do góry */
.atrakcje-panel__vtitle {
  left: 1.25rem; bottom: 1.4rem;
  writing-mode: vertical-rl;
  transform: rotate(180deg);
  transform-origin: center;
  font-family: var(--font-ui);
  font-size: 0.8rem; font-weight: 700; letter-spacing: 0.16em;
  text-transform: uppercase;
  white-space: nowrap;
  text-shadow: 0 1px 8px rgba(0, 0, 0, 0.45);
  transition: opacity 0.3s var(--ease);
}

/* stan rozwinięty: tytuł poziomo + opis + odnośnik */
.atrakcje-panel__body {
  left: 1.6rem; right: 1.6rem; bottom: 1.5rem;
  display: flex; flex-direction: column; gap: 0.4rem;
  opacity: 0;
  transform: translateY(14px);
  transition: opacity 0.4s var(--ease) 0.12s, transform 0.5s var(--ease) 0.12s;
}
.atrakcje-panel__title {
  font-family: var(--font-ui);
  font-size: 1.02rem; font-weight: 700; letter-spacing: 0.08em;
  text-transform: uppercase; line-height: 1.25;
  text-shadow: 0 1px 10px rgba(0, 0, 0, 0.4);
}
.atrakcje-panel__desc {
  font-family: var(--font-body);
  font-size: 0.95rem; line-height: 1.55;
  color: rgba(255, 255, 255, 0.92);
  max-width: 48ch;
  text-shadow: 0 1px 10px rgba(0, 0, 0, 0.4);
}
.atrakcje-panel__more {
  display: inline-flex; align-items: center; gap: 0.55rem;
  margin-top: 0.35rem;
  font-family: var(--font-ui);
  font-size: 0.74rem; font-weight: 600; letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--accent-soft);
}
.atrakcje-panel__more::after {
  content: ""; width: 22px; height: 1px; background: currentColor;
  transition: width 0.35s var(--ease);
}

/* rozsuwanie kursorem: tylko tam, gdzie jest prawdziwy wskaźnik */
@media (hover: hover) and (pointer: fine) {
  .atrakcje-gallery:hover .atrakcje-panel { flex-grow: 0.65; }
  .atrakcje-gallery .atrakcje-panel:hover { flex-grow: 3.6; box-shadow: var(--shadow-md); }
  .atrakcje-panel:hover .atrakcje-panel__media img { transform: scale(1.05); }
  .atrakcje-panel:hover .atrakcje-panel__vtitle { opacity: 0; }
  .atrakcje-panel:hover .atrakcje-panel__body { opacity: 1; transform: none; }
  .atrakcje-panel:hover .atrakcje-panel__more::after { width: 42px; }
}

/* klawiatura: Tab rozwija panel dokładnie tak jak kursor */
.atrakcje-panel:focus-visible {
  flex-grow: 3.6;
  outline: 3px solid var(--accent-2);
  outline-offset: 3px;
}
.atrakcje-panel:focus-visible .atrakcje-panel__vtitle { opacity: 0; }
.atrakcje-panel:focus-visible .atrakcje-panel__body { opacity: 1; transform: none; }

/* urządzenia dotykowe: hover nie istnieje, więc rozwinięcie niesie klasa
   .is-open (main.js). Poniżej 860px panele i tak układają się w pionie,
   ta reguła obsługuje szerokie tablety, gdzie zostaje układ poziomy. */
@media (hover: none), (pointer: coarse) {
  .atrakcje-panel.is-open { flex-grow: 3.6; }
  .atrakcje-panel.is-open .atrakcje-panel__vtitle { opacity: 0; }
  .atrakcje-panel.is-open .atrakcje-panel__body { opacity: 1; transform: none; }
}

/* telefon i tablet dotykowy: pionowa lista, rozwijana dotknięciem */
@media (max-width: 860px) {
  .atrakcje-gallery { flex-direction: column; height: auto; gap: 0.5rem; }
  .atrakcje-panel {
    flex: 0 0 auto;
    height: 96px;
    border-radius: var(--radius);
    transition: height 0.5s var(--ease);
  }
  .atrakcje-panel__vtitle { display: none; }
  .atrakcje-panel__body {
    left: 1.2rem; right: 1.2rem; bottom: 1.05rem;
    opacity: 1; transform: none;
    transition: opacity 0.35s var(--ease);
  }
  .atrakcje-panel__desc, .atrakcje-panel__more { display: none; }
  .atrakcje-panel.is-open { height: min(62vh, 380px); }
  .atrakcje-panel.is-open .atrakcje-panel__desc { display: block; }
  .atrakcje-panel.is-open .atrakcje-panel__more { display: inline-flex; }
}

@media (prefers-reduced-motion: reduce) {
  .atrakcje-panel,
  .atrakcje-panel__media img,
  .atrakcje-panel__body,
  .atrakcje-panel__vtitle,
  .atrakcje-panel__more::after { transition: none; }
  .atrakcje-panel:hover .atrakcje-panel__media img { transform: none; }
}

/* ---------- Formularz kontaktowy ---------- */
.form-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; margin-top: 2rem; }
.field { display: flex; flex-direction: column; gap: 0.45rem; }
.field--full { grid-column: 1 / -1; }
.field label { font-family: var(--font-ui); font-weight: 600; font-size: 0.74rem; letter-spacing: 0.1em; text-transform: uppercase; color: var(--muted); }
.field input, .field textarea, .field select {
  padding: 0.85rem 1rem; border: 1px solid var(--line); border-radius: var(--radius-sm);
  background: #fff; font-family: var(--font-body); font-size: 1rem; color: var(--ink); width: 100%;
}
/* Focus na polach formularza: sama zmiana koloru ramki to wskaźnik wyłącznie kolorem,
   więc dokładamy widoczny pierścień (WCAG 2.4.7 / 1.4.11). */
.field input:focus-visible, .field textarea:focus-visible, .field select:focus-visible {
  border-color: var(--accent);
  outline: 3px solid var(--accent-2);
  outline-offset: 2px;
}
.field textarea { min-height: 140px; resize: vertical; }
/* zgoda na politykę prywatności */
.field-consent label { display: flex; align-items: flex-start; gap: 0.6rem; text-transform: none; letter-spacing: 0; font-size: 0.92rem; font-weight: 400; color: var(--ink-soft); font-family: var(--font-body); cursor: pointer; }
.field-consent input { width: 18px; height: 18px; flex: none; margin-top: 2px; accent-color: var(--accent); }
.field-consent a { color: var(--accent); text-decoration: underline; }

/* ---------- Info-boxy (dojazd, zasady) ---------- */
.info-list { display: grid; gap: 1rem; margin-top: 2rem; }
.info-item { display: flex; gap: 1rem; background: #fff; border: 1px solid var(--line); border-radius: var(--radius); padding: 1.2rem 1.4rem; }
.info-item__ico { width: 42px; height: 42px; flex: none; display: grid; place-items: center; border-radius: 12px; background: rgba(182,92,66,0.10); color: var(--accent); }
.info-item__ico svg { width: 21px; height: 21px; }
.info-item h4 { font-family: var(--font-ui); font-size: 0.95rem; color: var(--ink); margin-bottom: 0.25rem; font-weight: 700; }
.info-item p { font-size: 0.93rem; }

/* ---------- Siatka udogodnień (atrakcje.html #udogodnienia) ----------
   Karty z ikoną zamiast płaskiej listy + osobnej galerii zdjęć: nie zależy
   od zdjęć wnętrza (nie trzeba pilnować, czy akurat są bez świątecznych
   dekoracji), a jednocześnie to inny wzorzec niż pasek atrakcji wyżej
   na tej samej stronie i inny niż karty w sekcji "Dla rodzin". */
.amenity-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1.2rem; margin-top: 2.2rem; }
.amenity-card {
  background: var(--paper);
  border: 1px solid var(--line);
  border-radius: var(--radius-lg);
  padding: clamp(1.5rem, 2.5vw, 1.9rem) clamp(1.3rem, 2.2vw, 1.6rem);
  box-shadow: var(--shadow-sm);
  transition: transform 0.3s var(--ease), box-shadow 0.3s var(--ease);
}
.amenity-card:hover { transform: translateY(-4px); box-shadow: var(--shadow-md); }
.amenity-card__ico {
  width: 54px; height: 54px; display: grid; place-items: center;
  border-radius: 15px; background: var(--sand); color: var(--accent); margin-bottom: 1.1rem;
}
.amenity-card__ico svg { width: 25px; height: 25px; }
.amenity-card h4 { font-family: var(--font-display); font-weight: 500; font-size: 1.12rem; line-height: 1.25; color: var(--ink); margin-bottom: 0.5rem; }
.amenity-card p { font-size: 0.92rem; line-height: 1.55; color: var(--ink-soft); }
@media (prefers-reduced-motion: reduce) {
  .amenity-card { transition: none; }
}

/* =====================================================================
   Responsywność
   ===================================================================== */
@media (max-width: 1080px) {
  .dock { --dock-size: 42px; --dock-max-scale: 1.4; --dock-distance: 120; gap: 0.55rem; padding: 0.5rem 0.65rem; }
}

@media (max-width: 980px) {
  .hero__grid { grid-template-columns: 1fr; }
  .hero__meta { flex-direction: row; align-items: center; justify-content: space-between; text-align: left; }
  .intro-head, .showcase, .loc-grid, .instahub__grid { grid-template-columns: 1fr; }
  .instahub__grid .videoframe { max-width: 460px; margin-inline: auto; }
  .showcase__card { margin-left: 0; margin-top: -3rem; margin-inline: 1.5rem 0; }
  .cards, .amenity-grid { grid-template-columns: repeat(2, 1fr); }
  .footer-grid { grid-template-columns: 1fr 1fr; gap: 2rem; }
  .gallery-grid { grid-template-columns: repeat(3, 1fr); }
  .apt { grid-template-columns: 1fr; }
  .apt--reverse .apt__media { order: 0; }
  .apt-grid { grid-template-columns: repeat(2, 1fr); }
  .reviews-marquee { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .reviews-column--3 { display: none; }
}

@media (max-width: 860px) {
  .nav-toggle { display: flex; order: 2; }
  .header-tools { margin-left: auto; gap: 0.3rem; }
  .header-tools > a { display: none; }
  .site-header__inner { gap: 0.5rem; flex-wrap: nowrap; }
  .nav {
    position: fixed; inset: var(--header-h) 0 auto 0; flex-direction: column; align-items: stretch;
    gap: 0; background: #fff; padding: 0.5rem 1.2rem 1.4rem; box-shadow: var(--shadow-md);
    max-height: calc(100vh - var(--header-h)); overflow-y: auto;
    transform: translateY(-120%); transition: transform 0.35s var(--ease);
  }
  body.nav-open .nav { transform: translateY(0); }
  .has-hero .site-header:not(.is-solid) .nav a { color: var(--ink); }
  .nav > li { border-bottom: 1px solid var(--line); }
  .nav a { padding: 0.95rem 0.4rem; font-size: 1rem; }
  .nav .has-sub > a::after { margin-left: auto; }
  .submenu { position: static; opacity: 1; visibility: visible; transform: none; box-shadow: none; border: none; padding: 0 0 0.4rem 0.9rem; min-width: 0; }
  .submenu a { padding: 0.5rem 0.4rem; }
}

/* ---------- Dock udogodnień na dotyku ---------- */
/* Warunek łączy szerokość ORAZ realny dotyk (hover:none), żeby złapać też
   tablety czy telefony w poziomie: tam, gdzie stary dok z dymkiem-na-hover
   potrafił wypychać podpis poza ekran, bo dotyk nie ma prawdziwego hovera. */
@media (max-width: 760px), (hover: none) and (pointer: coarse) {
  .dock-wrap { padding: 1.5rem 1rem 0.5rem; }
  .dock {
    --dock-size: 44px;
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    align-items: stretch;
    grid-auto-rows: 1fr;    /* wszystkie wiersze równe: dłuższy podpis nie rozpycha jednego rzędu */
    gap: 0.7rem 0.6rem;
    width: 100%;
    max-width: 440px;
    margin-inline: auto;
    padding: 0;
    border-radius: 0;
    background: none;
    border: none;
    box-shadow: none;
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
  }
  .dock__icon {
    flex: none;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: flex-start;
    width: auto;
    height: 100%;            /* wypełnia komórkę siatki -> wszystkie kafelki równe */
    gap: 0.5rem;
    padding: 0.85rem 0.4rem 0.75rem;
    border-radius: 16px;
    background: #fff;
    border: 1px solid var(--line);
    box-shadow: var(--shadow-sm);
  }
  /* ikona ma stały rozmiar i nie skaluje się od kursora (na dotyku nie ma hoveru). */
  .dock__face {
    order: 1; flex: none;
    width: var(--dock-size); height: var(--dock-size);
    transform: none;
    transition: background 0.12s var(--ease), color 0.12s var(--ease), border-color 0.12s var(--ease);
  }
  .dock__icon:hover .dock__face {
    background: rgba(255, 255, 255, 0.92);
    color: var(--accent);
    border-color: rgba(182, 92, 66, 0.16);
    box-shadow: none;
  }
  /* Podświetlenie tylko podczas dotyku (:active) - znika, gdy palec odpada,
     więc nie "migocze" ani nie zostaje przyklejone jak :hover na dotyku. */
  .dock__icon:active .dock__face {
    background: var(--accent);
    color: #fff;
    border-color: var(--accent-dark);
    box-shadow: 0 6px 16px rgba(182, 92, 66, 0.28);
  }
  /* wskaźnik dla klawiatury (rzadko na mobile, ale bez szkody) */
  .dock__icon:focus-visible .dock__face {
    background: var(--accent);
    color: #fff;
    border-color: var(--accent-dark);
  }
  .dock__tip,
  .dock__icon:hover .dock__tip,
  .dock__icon:focus-visible .dock__tip {
    order: 2;
    position: static;
    left: auto;
    bottom: auto;
    transform: none;
    opacity: 1;
    pointer-events: none;
    background: transparent;
    color: var(--ink-soft);
    padding: 0;
    font-size: 0.68rem;
    font-weight: 600;
    line-height: 1.25;
    white-space: normal;
    text-align: center;
  }
  .dock__tip::after { display: none; }
}

@media (max-width: 760px) {
  body { font-size: 16px; }
  .booking { grid-template-columns: 1fr 1fr; gap: 0.4rem; }
  .booking__field { border-right: none; border-bottom: 1px solid var(--line); }
  .booking__field:nth-child(3) { border-bottom: 1px solid var(--line); }
  .booking__submit { grid-column: span 2; margin-top: 0.3rem; }
  .hero__booking { margin-top: 1.8rem; }
  .gallery-grid { grid-template-columns: repeat(2, 1fr); }
  .form-grid { grid-template-columns: 1fr; }
  .apt__list { grid-template-columns: 1fr; }
  .apt-grid { grid-template-columns: 1fr; }
  .apt-card { aspect-ratio: 4 / 5; }
  .reviews-marquee { grid-template-columns: minmax(0, 1fr); max-height: 560px; }
  .reviews-column--2, .reviews-column--3 { display: none; }
  .review { padding: 1.4rem 1.2rem; }
  .plan-cards { grid-template-columns: 1fr; }
  /* Hero na wąskim ekranie wypełnia ekran w całości, tak samo jak nagłówki podstron.
     Wcześniej był niższy (620 px), bo poziomy film 1280x720 na wysokim telefonie
     przycina się do pionowego pasa. Świadomy wybór: spójne, pełnoekranowe wejście
     jest ważniejsze niż kilka procent szerokości kadru, a "cover" i tak trzyma
     środek ujęcia. Jednostka svh, nie vh: vh na telefonie liczy ekran BEZ paska
     adresu, więc pasek wyszukiwania chowałby się pod krawędzią przeglądarki. */
  .hero { min-height: 100vh; min-height: 100svh; align-items: stretch; }
  /* Skoro kadr jest teraz wąskim pionowym wycinkiem (widać ok. 26% szerokości
     filmu), przesuwamy okno w górę źródła. Przy 45% na ekran wchodził sam śnieg;
     przy 30% zostaje zachodzące niebo i dalekie granie, czyli to, po co ten kadr
     w ogóle jest. Plakat dostaje tę samą wartość, inaczej przy starcie filmu
     obraz by podskoczył. */
  .hero__video { object-position: 50% 30%; }
  .hero__media { background-position: 50% 30%; }
  /* Godło z podpisem stoją POŚRODKU ekranu, pasek wyszukiwania przy dolnej
     krawędzi. Robią to auto-marginesy, nie justify-content: wolny margines
     "auto" zjada całą wolną przestrzeń, więc gdy siedział tylko na pasku
     wyszukiwania, godło było dociśnięte do samej góry. Teraz margines jest
     nad godłem i pod podpisem, czyli przestrzeń dzieli się po równo na obie
     strony pary i para ląduje na środku. */
  .hero__inner {
    display: flex;
    /* Bez kierunku "column" .hero__center jest elementem w rzędzie i "flex: 1" poniżej
       rozciąga go na szerokość, kasując boczny margines z .container - pigułki
       wyszukiwania dotykały wtedy krawędzi ekranu. */
    flex-direction: column;
    padding-top: calc(var(--header-h) + 0.75rem);
    padding-bottom: 1.1rem;
  }
  .hero__center { flex: 1; justify-content: flex-start; gap: 0.7rem; }
  .hero__center .searchbar { margin-top: 0; }
  .hero__logo { width: min(58vw, 230px); margin-top: auto; margin-bottom: 0; }
  .hero__tagline { letter-spacing: 0.24em; text-indent: 0.24em; font-size: 0.66rem; margin-bottom: auto; }

  /* na wąskim ekranie: daty w pierwszym rzędzie, goście + przycisk w drugim.
     Niższe pola (50 px zamiast 58) zwalniają miejsce pod godłem,
     nadal z zapasem ponad minimalny cel dotykowy 44 px. */
  .searchbar { flex-wrap: wrap; gap: 0.45rem; }
  .searchbar__field--dates { flex: 1 1 100%; justify-content: center; }
  .searchbar__field:not(.searchbar__field--dates) { flex: 1 1 0; justify-content: center; }
  .searchbar__field { min-height: 50px; }
  .searchbar__btn { flex: 1 1 0; padding: 0 1rem; min-height: 50px; }
  /* Dolny pasek szybkiego kontaktu: ikona nad podpisem, trzy równe pola.
     W jednej linii długi numer ściskał sąsiadów, w kolumnie każdy ma pełną szerokość. */
  .floating {
    left: 0; right: 0; top: auto; bottom: 0; transform: none;
    flex-direction: row; gap: 0.3rem;
    padding: 0.4rem 0.5rem calc(0.4rem + env(safe-area-inset-bottom, 0px));
    background: rgba(36,24,18,0.94);
    -webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px);
    border-top: 1px solid rgba(255,255,255,0.10);
  }
  .floating a {
    flex: 1 1 0; min-width: 0;
    flex-direction: column; justify-content: center; gap: 0.28rem;
    min-height: 52px;                 /* cel dotykowy z zapasem */
    padding: 0.5rem 0.25rem;
    border-radius: 12px; border-color: transparent;
    background: transparent; box-shadow: none;
  }
  .floating a:active { background: rgba(255,255,255,0.12); }
  .floating a svg { width: 19px; height: 19px; }
  .floating a .floating__text {
    max-width: none; opacity: 1; margin: 0;
    font-size: 0.66rem; font-weight: 600; line-height: 1.1;
    letter-spacing: 0.01em;
    font-variant-numeric: tabular-nums;   /* numer nie "tańczy" szerokością */
  }
  /* treść nie może chować się pod przyklejonym paskiem */
  body { padding-bottom: calc(64px + env(safe-area-inset-bottom, 0px)); }
}

@media (max-width: 480px) {
  .cards, .footer-grid, .intro-photos, .amenity-grid { grid-template-columns: 1fr; }
  .hero__cta .btn { width: 100%; }
  .hero__meta { flex-direction: column; align-items: flex-start; gap: 1.2rem; }
}

/* Urządzenia dotykowe: karta startuje zwinięta, pierwsze dotknięcie ją rozwija
   (klasa .is-open z main.js). Drugie dotknięcie otwiera galerię apartamentu. */
@media (hover: none) {
  .apt-card.is-open .apt-card__slide { transform: translateY(-4.6rem); }
  .apt-card.is-open .apt-card__overview { max-height: 200px; opacity: 1; }
  .apt-card.is-open .apt-card__reveal { transform: translateY(0); opacity: 1; }
  .apt-card.is-open .apt-card__scrim {
    background:
      linear-gradient(to top, rgba(20,12,8,0.92) 0%, rgba(20,12,8,0.72) 55%, rgba(20,12,8,0.25) 90%, rgba(20,12,8,0.1) 100%);
  }

  /* Wskazówka, że kartę można dotknąć; znika po rozwinięciu */
  .apt-card__hint {
    position: absolute; right: 0.9rem; bottom: 0.9rem; z-index: 4;
    display: inline-flex; align-items: center; gap: 0.35rem;
    padding: 0.5rem 0.85rem; border-radius: var(--radius-pill);
    background: rgba(255,255,255,0.92); color: var(--ink);
    font-family: var(--font-ui); font-weight: 600; font-size: 0.72rem;
    box-shadow: var(--shadow-sm); pointer-events: none;
    transition: opacity 0.25s var(--ease), transform 0.25s var(--ease);
  }
  .apt-card__hint svg { width: 13px; height: 13px; }
  .apt-card.is-open .apt-card__hint { opacity: 0; transform: translateY(6px); }
}
/* na myszce podpowiedź jest zbędna, hover robi to samo */
@media (hover: hover) {
  .apt-card__hint { display: none; }
}

@media (prefers-reduced-motion: reduce) {
  * { animation-duration: 0.001ms !important; transition-duration: 0.001ms !important; scroll-behavior: auto !important; }
}


/* =====================================================================
   Wybór języka: PL / EN / AR
   Zasady: nazwa języka zawsze w jego własnym alfabecie (Polski, English,
   العربية), nigdy flagi (flaga to kraj, nie język: arabski to 20+ krajów),
   a każdy odnośnik prowadzi do TEJ SAMEJ podstrony w drugim języku,
   nie na stronę główną. Adresy siedzą w HTML, więc skrypt ich nie zgaduje.
   ===================================================================== */
.langpick { position: relative; }
.langpick__btn {
  display: inline-flex; align-items: center; gap: 0.34rem;
  height: 34px; padding: 0 0.62rem 0 0.52rem;
  border: 1px solid currentColor; border-radius: var(--radius-pill);
  background: transparent; color: var(--ink); cursor: pointer;
  font-family: var(--font-ui); font-weight: 700; font-size: 0.76rem; letter-spacing: 0.06em;
  transition: color 0.2s, background 0.2s;
}
.langpick__btn:hover { color: var(--accent); background: rgba(182, 92, 66, 0.1); }
.has-hero .site-header:not(.is-solid) .langpick__btn { color: #fff; }
/* Nad hero nagłówek chowa logo i ikony social, żeby wyśrodkowane menu nad
   filmem zostało czyste. Wybór języka jest wyjątkiem: gość z zagranicy szuka
   go w pierwszej sekundzie, a to właśnie szczyt strony głównej jest miejscem,
   w którym najczęściej ląduje. */
@media (min-width: 861px) {
  .has-hero .site-header:not(.is-solid) .header-tools { opacity: 1; pointer-events: auto; }
  .has-hero .site-header:not(.is-solid) .header-tools > a { opacity: 0; pointer-events: none; }
}
.langpick__globe { width: 16px; height: 16px; flex: none; }

/* Skróty języków na samym przycisku: bieżący pełnym kontrastem, pozostałe
   przygaszone. Gość widzi od razu, że są trzy, i nie musi zgadywać, czy pod
   globusem cokolwiek się kryje. */
/* Wyrownanie do LINII PISMA, nie do srodka pudelka: laciński skrot i arabski
   maja rozne wysokosci pudelek, wiec centrowanie ustawialo je na trzech
   roznych poziomach. Baseline sadza wszystkie trzy na jednej linii. */
.langpick__codes { display: inline-flex; align-items: baseline; gap: 0.34rem; line-height: 1; }
.langpick__code {
  display: inline-flex; align-items: baseline; line-height: 1;
  opacity: 0.55; font-weight: 600; transition: opacity 0.2s;
}
.langpick__code.is-current { opacity: 1; font-weight: 800; }
/* Separator jako kreska, nie kropka. Kropka jest znakiem neutralnym
   kierunkowo, wiec na styku lacinki z arabskim algorytm dwukierunkowy
   przerzucal ja na druga strone wyrazu. Pusty prostokat nie jest tekstem,
   wiec zaden algorytm go nie rusza. */
.langpick__code + .langpick__code::before {
  content: ""; width: 1px; height: 0.78em; align-self: center;
  background: currentColor; opacity: 0.4; margin-inline-end: 0.34rem;
}
.langpick__btn:hover .langpick__code { opacity: 0.85; }
.langpick__btn:hover .langpick__code.is-current { opacity: 1; }
/* arabski skrót własnym krojem i z zapasem w stopniu, bo bez tego ginie */
.langpick__code[lang="ar"] {
  font-family: "Tajawal", "Noto Sans Arabic", "Geeza Pro", "Segoe UI", Tahoma, sans-serif;
  font-size: 0.94rem; letter-spacing: normal; line-height: 1;
}
.langpick__caret { width: 11px; height: 11px; flex: none; opacity: 0.65; transition: transform 0.25s var(--ease); }
.langpick.is-open .langpick__caret { transform: rotate(180deg); }

/* Lista. Bez JS otwiera ją focus na przycisku (dotknięcie ekranu też daje focus),
   więc wybór języka działa nawet przy zablokowanym skrypcie. */
.langpick__menu {
  position: absolute; top: calc(100% + 10px); right: 0; z-index: 20;
  min-width: 216px; padding: 0.4rem;
  background: #fff; border: 1px solid var(--line);
  border-radius: var(--radius-sm); box-shadow: var(--shadow-md);
  opacity: 0; visibility: hidden; transform: translateY(8px);
  transition: opacity 0.2s var(--ease), transform 0.2s var(--ease), visibility 0.2s;
}
.langpick:focus-within .langpick__menu,
.langpick.is-open .langpick__menu { opacity: 1; visibility: visible; transform: translateY(0); }
@media (hover: hover) and (pointer: fine) {
  .langpick:hover .langpick__menu { opacity: 1; visibility: visible; transform: translateY(0); }
}

.langpick__title {
  font-family: var(--font-ui); font-weight: 600; font-size: 0.66rem;
  letter-spacing: 0.14em; text-transform: uppercase; color: var(--muted);
  padding: 0.45rem 0.7rem 0.5rem; line-height: 1.3;
}
.langpick__item {
  display: flex; align-items: center; gap: 0.6rem;
  padding: 0.6rem 0.7rem; border-radius: 7px;
  color: var(--ink); font-family: var(--font-ui); font-size: 0.9rem; font-weight: 500;
  transition: background 0.18s, color 0.18s;
}
.langpick__item:hover, .langpick__item:focus-visible { background: var(--cream); color: var(--accent); }
.langpick__name { flex: 1; }
.langpick__tag {
  font-size: 0.68rem; font-weight: 700; letter-spacing: 0.08em;
  color: var(--muted); font-family: var(--font-ui);
}
/* ptaszek przy języku, który jest właśnie oglądany */
.langpick__item.is-current { color: var(--accent); font-weight: 700; }
.langpick__item.is-current::after {
  content: ""; width: 0.42rem; height: 0.75rem; flex: none; margin-inline-start: 0.1rem;
  border-right: 2px solid currentColor; border-bottom: 2px solid currentColor;
  transform: rotate(45deg) translate(-1px, -2px);
}
.langpick__item.is-current .langpick__tag { color: inherit; opacity: 0.7; }
/* Nazwa arabska na stronach PL i EN. Fontu arabskiego tam nie ładujemy (jedno
   słowo nie jest warte osobnego pobrania), więc podajemy pełny zestaw krojów
   systemowych: macOS, Windows, Android. Arabski przy tym samym font-size czyta
   się mniejszy niż łacinka, stąd zapas w rozmiarze. */
.langpick__item[hreflang="ar"] .langpick__name,
.nav-lang__title [lang="ar"] {
  font-family: "Tajawal", "Noto Sans Arabic", "Geeza Pro", "Segoe UI", Tahoma, sans-serif;
  letter-spacing: normal; text-transform: none;
}
.langpick__item[hreflang="ar"] .langpick__name { font-size: 1.14rem; line-height: 1.5; }
.nav-lang__title [lang="ar"] { font-size: 1.25em; }

/* Ten sam wybór na dole menu mobilnego. Wiersze wstawia skrypt, klonując
   odnośniki z nagłówka, żeby adresy były opisane w jednym miejscu. */
/* na desktopie wybór języka jest w nagłówku, więc ten wiersz zostaje schowany;
   odsłania się dopiero tam, gdzie menu zamienia się w listę rozwijaną (860 px) */
.nav-lang { display: none; padding: 1rem 0.4rem 0.2rem; border-bottom: 0 !important; }
@media (max-width: 860px) { .nav-lang { display: block; } }
.nav-lang__title {
  display: block; font-family: var(--font-ui); font-weight: 600; font-size: 0.66rem;
  letter-spacing: 0.14em; text-transform: uppercase; color: var(--muted); margin-bottom: 0.6rem;
}
.nav-lang__row { display: flex; gap: 0.5rem; }
.nav-lang__row .langpick__item {
  flex: 1; justify-content: center; gap: 0.4rem;
  border: 1px solid var(--line); border-radius: var(--radius-pill); padding: 0.6rem 0.4rem;
}
.nav-lang__row .langpick__item.is-current { border-color: var(--accent); background: rgba(182, 92, 66, 0.08); }
.nav-lang__row .langpick__name { flex: none; }
.nav-lang__row .langpick__tag { display: none; }

/* ---------- Pasek podpowiedzi ----------
   Gość z przeglądarką po arabsku ląduje na wersji polskiej z Google?
   Dostaje jedno zdanie w SWOIM języku i odnośnik. Bez automatycznego
   przekierowania: to psuje indeksowanie i odbiera gościowi decyzję. */
/* Pozycja fixed tuż pod nagłówkiem, a nie w toku dokumentu: nagłówek jest
   fixed, a podstrony mają własne odsunięcie od góry, więc pasek wpięty
   w układ przesuwałby jedno albo drugie. Tak nie rusza niczego. */
.langhint {
  position: fixed; top: var(--header-h); inset-inline: 0; z-index: 95;
  background: var(--espresso); color: #fff;
  box-shadow: 0 6px 20px rgba(40, 25, 18, 0.25);
  animation: langhint-in 0.4s var(--ease) both;
}
@keyframes langhint-in { from { opacity: 0; transform: translateY(-8px); } to { opacity: 1; transform: none; } }
@media (prefers-reduced-motion: reduce) { .langhint { animation: none; } }
.langhint__inner {
  width: min(100% - 2.5rem, 1340px); margin-inline: auto;
  display: flex; align-items: center; gap: 0.9rem;
  padding: 0.7rem 0; font-family: var(--font-ui); font-size: 0.86rem;
}
.langhint__globe { width: 18px; height: 18px; flex: none; opacity: 0.8; }
.langhint__text { flex: 1; line-height: 1.4; }
.langhint__go {
  flex: none; color: #fff; font-weight: 700; text-decoration: underline;
  text-underline-offset: 3px; white-space: nowrap;
}
.langhint__go:hover { color: var(--accent-2); }
.langhint__close {
  flex: none; width: 30px; height: 30px; display: grid; place-items: center;
  border: 0; background: transparent; color: rgba(255,255,255,0.7);
  border-radius: 50%; cursor: pointer; font-size: 1.15rem; line-height: 1;
}
.langhint__close:hover { color: #fff; background: rgba(255,255,255,0.12); }
@media (max-width: 600px) {
  .langhint__inner { gap: 0.6rem; font-size: 0.8rem; }
}
/* Na waskim ekranie zdanie i przycisk walcza o te sama linie, wiec przycisk
   schodzi pod spod, na cala szerokosc. Latwiej tez w niego trafic palcem. */
@media (max-width: 480px) {
  .langhint__inner { flex-wrap: wrap; row-gap: 0.15rem; padding: 0.6rem 0 0.7rem; }
  .langhint__text { flex: 1 1 auto; min-width: 0; }
  .langhint__go { order: 1; flex: 1 0 100%; white-space: normal; }
}


/* =====================================================================
   Wersja arabska: typografia i kierunek pisma (RTL)
   ---------------------------------------------------------------------
   Dwie rzeczy, których nie widać, a psują arabski najbardziej:
   1) letter-spacing. Łacinka po rozstrzeleniu wygląda elegancko, arabski
      się ROZPADA: to pismo łączone, odstęp rozrywa wyrazy na osobne znaki.
      Dlatego niżej zerujemy je wszędzie, poza elementami jawnie opisanymi
      innym lang (marka, telefon, skróty PL/EN).
   2) rozmiar. Arabski przy tym samym font-size czyta się mniejszy niż
      łacinka, bo nie ma wersalików i ma niższy korpus. Stąd lekki zapas
      w font-size i interlinii.
   ===================================================================== */
html[lang="ar"] {
  /* Amiri: klasyczny naskh, ciepły jak Fraunces w nagłówkach.
     Tajawal: geometryczny bezszeryfowy, odpowiednik Montserrata w UI. */
  --font-display: "Amiri", "Noto Naskh Arabic", Georgia, serif;
  --font-body: "Tajawal", "Noto Sans Arabic", system-ui, sans-serif;
  --font-ui: "Tajawal", "Noto Sans Arabic", system-ui, sans-serif;
  --font-script: "Amiri", "Noto Naskh Arabic", Georgia, serif;
}
html[lang="ar"] body { font-size: 18px; line-height: 1.9; }
html[lang="ar"] :is(h1, h2, h3, h4) { line-height: 1.4; }
/* pismo łączone: zero rozstrzelenia na wszystkim, co nie jest jawnie łacinką */
html[lang="ar"] *:not([lang]) { letter-spacing: normal; }
/* liczby i adresy zostają w kierunku łacińskim, żeby "+48 606 384 065"
   nie zamienił się w "065 384 606 48+" */
html[lang="ar"] :is([href^="tel:"], [href^="mailto:"], .bdi-ltr) { direction: ltr; unicode-bidi: isolate; display: inline-block; }

/* ---------- Odbicie układu ---------- */
[dir="rtl"] .brand { margin-right: 0; margin-left: auto; }
[dir="rtl"] .header-tools { margin-left: 0; }
[dir="rtl"] .langpick__menu { right: auto; left: 0; }
[dir="rtl"] .langpick__btn { padding: 0 0.5rem 0 0.6rem; }
[dir="rtl"] .submenu { left: auto; right: 0; }
[dir="rtl"] .booking__field { border-right: 0; border-left: 1px solid var(--line); }
[dir="rtl"] .booking__field:nth-child(3) { border-left: none; }
[dir="rtl"] .feature-card__tagfile { left: auto; right: 14px; }
[dir="rtl"] .feature-card:hover .feature-card__more svg { transform: translateX(-4px); }
[dir="rtl"] .feature-card__more svg,
[dir="rtl"] .link-arrow svg { transform: scaleX(-1); }
[dir="rtl"] .feature-card:hover .feature-card__more svg { transform: scaleX(-1) translateX(4px); }
[dir="rtl"] .showcase__card { margin-left: 0; margin-right: -3rem; }
[dir="rtl"] .attraction:hover { padding-left: 0; padding-right: 1.1rem; }
/* Pływające przyciski mają DWIE postacie: pionowy słupek przy krawędzi na
   desktopie i poziomy pasek na całą szerokość na telefonie. Odbicie dotyczy
   tylko słupka, więc musi siedzieć za progiem 761 px. Bez tego "left: auto"
   zabierało paskowi na telefonie lewe zakotwiczenie, pasek kurczył się do
   szerokości treści i ucinał numer telefonu. */
@media (min-width: 761px) {
  [dir="rtl"] .floating { left: auto; right: 18px; }
  [dir="rtl"] .floating a:hover .floating__text { margin-right: 0; margin-left: 0.3rem; }
}
[dir="rtl"] .zoom-view__close { right: auto; left: 1.4rem; }
[dir="rtl"] .apt-card__media .ph__label { right: auto; left: 0.9rem; }
[dir="rtl"] .reveal-item:hover .reveal-item__text,
[dir="rtl"] .reveal-item:focus-visible .reveal-item__text { transform: translateX(-0.6rem); }
[dir="rtl"] .reveal-item__text::after {
  margin-left: 0; margin-right: 0.5rem;
  border-right: 0; border-top: 2px solid currentColor; border-left: 2px solid currentColor;
  transform: rotate(-45deg) translateY(0.06em);
}
/* strzałka "dalej" w RTL wskazuje w lewo, razem z kierunkiem czytania */
/* Strzałka przy odnośniku do Bookinga wskazuje kierunek czytania. */
[dir="rtl"] .reviews-score__link svg { transform: scaleX(-1); }
[dir="rtl"] .reviews-score__link:hover svg { transform: scaleX(-1) translateX(3px); }
[dir="rtl"] .review__list li { padding-left: 0; padding-right: 0.9rem; }
[dir="rtl"] .review__list li::before { left: auto; right: 0; }
[dir="rtl"] .lightbox__nav--prev { left: auto; right: clamp(0.5rem, 2vw, 1rem); }
[dir="rtl"] .lightbox__nav--next { right: auto; left: clamp(0.5rem, 2vw, 1rem); }
[dir="rtl"] :is(.lightbox__nav--prev, .lightbox__nav--next) svg { transform: scaleX(-1); }
/* Nowe karty atrakcji: tytul i przycisk "i" dziela sie dolem karty na dwie
   strony. W RTL musza sie zamienic miejscami, inaczej oba tloczą sie po
   prawej i arabski tytul wchodzi pod przycisk. */
[dir="rtl"] .spot-card__info { right: auto; left: clamp(0.9rem, 2.2vw, 1.2rem); }
[dir="rtl"] .spot-card__title {
  left: calc(clamp(1rem, 2.5vw, 1.4rem) + 62px);
  right: clamp(1rem, 2.5vw, 1.4rem);
}
[dir="rtl"] .atrakcje-panel__num { left: auto; right: 1.25rem; }
[dir="rtl"] .atrakcje-panel__vtitle { left: auto; right: 1.25rem; }
/* zapas na podswietlenie focusu przy przewijaniu: w RTL lezy po drugiej stronie */

@media (min-width: 861px) {
  [dir="rtl"] .has-hero .site-header:not(.is-solid) .brand { left: auto; right: 1.5rem; }
  [dir="rtl"] .has-hero .site-header:not(.is-solid) .header-tools { right: auto; left: 1.5rem; }
}
@media (max-width: 980px) {
  [dir="rtl"] .hero__meta { text-align: right; }
  [dir="rtl"] .showcase__card { margin-inline: 0 1.5rem; }
}
@media (max-width: 860px) {
  [dir="rtl"] .header-tools { margin-left: 0; margin-right: auto; }
  [dir="rtl"] .nav .has-sub > a::after { margin-left: 0; margin-right: auto; }
  [dir="rtl"] .submenu { padding: 0 0.9rem 0.4rem 0; }
  [dir="rtl"] .apt-card__hint { right: auto; left: 0.9rem; }
}

/* Formularz: etykiety i pola po prawej, ale e-mail i telefon wpisuje się
   od lewej, bo to ciągi łacińskie. */
[dir="rtl"] :is(.field input, .field textarea) { text-align: right; }
[dir="rtl"] .field input[type="email"],
[dir="rtl"] .field input[type="tel"] { direction: ltr; text-align: left; }

/* =====================================================================
   REZERWACJA: pola paska szukania i okno z silnikiem Roomadmina
   =====================================================================
   Samego okna nie ma w HTML: buduje je main.js przy pierwszym kliknięciu,
   więc tutaj czekają wyłącznie style na gotową strukturę. */

/* ---------- Pola paska szukania ----------
   Pasek leży na filmie w hero, więc pigułki są z ciemnego szkła (reguły wyżej),
   a wszystko w środku białe. Pole daty bierze te same reguły co reszta, plus
   dwie poprawki, których zwykły input nie potrzebuje. */
.searchbar__field input[type="date"] {
  -webkit-appearance: none; appearance: none;
  border: none; background: transparent; padding: 0;
  font-family: var(--font-body); font-size: 1rem; color: #fff;
  min-width: 8.2rem; cursor: pointer;
}
.searchbar__field input[type="date"]::-webkit-datetime-edit { color: #fff; }
/* Ikonka kalendarza od przeglądarki jest czarna, a tło pigułki ciemne:
   bez odwrócenia barw po prostu znika. */
.searchbar__field input[type="date"]::-webkit-calendar-picker-indicator {
  filter: invert(1) brightness(1.8); opacity: 0.8; cursor: pointer;
}
.searchbar__field input[type="date"]::-webkit-calendar-picker-indicator:hover { opacity: 1; }

/* Komunikat walidacji. Dokłada go skrypt jako ostatnie dziecko formularza,
   więc zajmuje całą szerokość pod pigułkami i nie rozpycha paska w bok. */
.searchbar__error {
  flex: 1 1 100%; margin: 0.15rem 0 0;
  padding: 0.55rem 1.2rem; text-align: center;
  background: var(--accent-dark); color: #fff;
  border-radius: var(--radius-pill); box-shadow: var(--shadow-sm);
  font-family: var(--font-ui); font-weight: 600; font-size: 0.86rem;
}

/* ---------- Okno z silnikiem ---------- */
.rezerwacja { position: fixed; inset: 0; z-index: 1100; display: grid; place-items: center; padding: clamp(0.5rem, 2.5vw, 1.75rem); }
.rezerwacja[hidden] { display: none; }
.rezerwacja__backdrop {
  position: absolute; inset: 0;
  background: rgba(14, 9, 6, 0.86);
  -webkit-backdrop-filter: blur(3px); backdrop-filter: blur(3px);
  animation: rez-fade 0.22s var(--ease) both;
}
.rezerwacja__dialog {
  position: relative; z-index: 1;
  display: flex; flex-direction: column;
  width: min(1080px, 100%); max-height: 100%;
  background: var(--paper); color: var(--ink);
  border-radius: var(--radius-lg); overflow: hidden;
  box-shadow: var(--shadow-lg);
  animation: rez-in 0.26s var(--ease) both;
}
/* Okno dostaje fokus programowo, żeby czytnik ekranu zaczął od jego nazwy.
   Pierścień należy się przyciskom, nie całej płachcie. */
.rezerwacja__dialog:focus { outline: none; }
@keyframes rez-fade { from { opacity: 0; } to { opacity: 1; } }
@keyframes rez-in { from { opacity: 0; transform: translateY(12px) scale(0.985); } to { opacity: 1; transform: none; } }

.rezerwacja__bar { flex: none; display: flex; align-items: center; gap: 1rem; padding: 0.9rem clamp(1rem, 3vw, 1.6rem); border-bottom: 1px solid var(--line); }
.rezerwacja__title { flex: 1 1 auto; min-width: 0; font-family: var(--font-display); font-weight: 500; font-size: clamp(1.15rem, 2.6vw, 1.5rem); line-height: 1.2; color: var(--ink); }
.rezerwacja__close {
  flex: none; width: 44px; height: 44px;      /* min. cel dotykowy 44x44 */
  display: grid; place-items: center;
  border: 1px solid var(--line); border-radius: 50%;
  background: #fff; color: var(--ink); cursor: pointer;
  transition: background 0.2s var(--ease), color 0.2s var(--ease);
}
.rezerwacja__close:hover { background: var(--accent); border-color: var(--accent); color: #fff; }
.rezerwacja__close svg { width: 20px; height: 20px; }

/* Notka nad ramką: tylko wersja arabska ją dostaje, bo tylko tam gość
   zobaczy za chwilę interfejs w innym języku niż cała strona. */
.rezerwacja__note {
  flex: none; margin: 0;
  padding: 0.75rem clamp(1rem, 3vw, 1.6rem);
  background: var(--accent-soft); color: var(--ink);
  border-bottom: 1px solid var(--line);
  font-size: 0.95rem; line-height: 1.7; text-align: start;
}
.rezerwacja__tel { font-weight: 700; color: var(--accent-dark); text-decoration: underline; text-underline-offset: 3px; white-space: nowrap; }

.rezerwacja__stage { position: relative; flex: 1 1 auto; display: flex; min-height: 600px; background: var(--paper); }
/* Napis czeka NA WIERZCHU ramki i znika dopiero, gdy silnik naprawdę stanie.
   Widget ma przezroczyste tło, więc bez tej zasłony gość patrzyłby przez pustą
   ramkę na to, co pod nią. */
.rezerwacja__loading {
  position: absolute; inset: 0; z-index: 2;
  display: grid; place-items: center; padding: 1.5rem;
  background: var(--paper); text-align: center;
  font-family: var(--font-ui); font-size: 0.92rem; color: var(--muted);
}
.rezerwacja__stage.is-ready .rezerwacja__loading { display: none; }
.rezerwacja__frame { flex: 1 1 auto; width: 100%; min-height: 600px; border: 0; display: block; }

body.rezerwacja-open { overflow: hidden; }

/* Poniżej 1200 px okno bierze prawie całą szerokość. Zostawiony margines 2%
   nadal mówi gościowi, że to warstwa nad stroną, a nie nowa strona. */
@media (max-width: 1199px) {
  .rezerwacja__dialog { width: 98%; }
}
/* Niskie okno (laptop 1366x768, telefon poziomo): 600 px ramki plus pasek
   nie mają się gdzie zmieścić, więc ramka bierze tyle, ile zostało. */
@media (max-height: 760px) {
  .rezerwacja__stage, .rezerwacja__frame { min-height: 0; }
}
/* Telefon: pełny ekran. Silnik ma własny układ na wąskim ekranie, więc każdy
   oddany mu piksel jest wart więcej niż ozdobna ramka dookoła. */
@media (max-width: 620px) {
  .rezerwacja { padding: 0; }
  .rezerwacja__dialog { width: 100%; height: 100%; max-height: 100%; border-radius: 0; }
  .rezerwacja__stage, .rezerwacja__frame { min-height: 0; }
  .rezerwacja__note { padding: 0.65rem 1rem; font-size: 0.9rem; }
}
@media (prefers-reduced-motion: reduce) {
  .rezerwacja__backdrop, .rezerwacja__dialog { animation: none; }
  .rezerwacja__close { transition: none; }
}

/* Wersja arabska: pasek, okno i notka idą za kierunkiem pisma same (flex
   i właściwości logiczne), więc odwracać trzeba tylko to, co zostaje
   łacińskie. Data ma czytać się "16.10.2026", a nie od tyłu. */
[dir="rtl"] .searchbar__field input[type="date"] { direction: ltr; text-align: right; }

/* Nakladka .apt-card__link (galeria zdjec, inset:0, z-index:3) lezy nad trescia
   karty, wiec przycisk "Rezerwuj" w srodku byl nieklikalny myszka i palcem.
   Tresc karty idzie nad nakladke; nakladka dalej lapie klikniecia wszedzie
   tam, gdzie nie ma przycisku, wiec galeria otwiera sie jak dotad. */
.apt-card__content { z-index: 4; }

/* Notka przy przycisku rezerwacji w wersji arabskiej: silnik jest po angielsku.
   Styl stal wczesniej dziewiec razy w kodzie strony, tutaj stoi raz. */
.apt-card__reveal--stacked { flex-wrap: wrap; }
.apt-card__note a { color: #fff; text-decoration: underline; }
.apt-card__note {
  flex: 0 0 100%; margin: 0.15rem 0 0;
  font-family: var(--font-ui); font-size: 0.72rem; line-height: 1.5;
  color: rgba(255, 255, 255, 0.78);
}
