/*
 * Główny arkusz — ładowany asynchronicznie (preload + onload swap).
 * Zawiera wszystko poniżej pierwszego ekranu. Style krytyczne (reset, zmienne,
 * nawigacja, hero) siedzą inline w <head> — patrz assets/css/critical.css.
 *
 * Przypomnienie o Imagify: <img> bywa opakowany w <picture>, więc nigdzie
 * nie używamy selektora dziecka bezpośredniego dla obrazów, a proporcje
 * trzymamy na .ei-ratio.
 */

/* =========================================================================
   Sekcje i nagłówki
   ====================================================================== */

.ei-section {
  position: relative;
  padding-block: var(--ei-section-y);
}
.ei-section--tint { background: var(--ei-tint); }
.ei-section--flush { padding-block: clamp(1.75rem, 3.5vw, 2.75rem); }
.ei-section--deep {
  background: var(--ei-deep);
  color: #fff;
}
.ei-section--deep .ei-head__lead { color: rgba(255, 255, 255, .78); }

.ei-eyebrow {
  margin-bottom: .85rem;
  font-size: .72rem;
  font-weight: 700;
  letter-spacing: .16em;
  text-transform: uppercase;
  color: var(--ei-accent-ink);
}
/* Na ciemnym tle role się odwracają: tam czytelny jest mosiądz marki. */
.ei-section--deep .ei-eyebrow,
.ei-head--invert .ei-eyebrow,
.ei-hero .ei-eyebrow { color: var(--ei-accent); }

.ei-head { margin-bottom: clamp(2rem, 4vw, 3.25rem); max-width: 62ch; }
.ei-head--center { margin-inline: auto; text-align: center; }
.ei-head--invert { color: #fff; }

.ei-head__title {
  font-family: var(--ei-serif);
  font-size: clamp(1.95rem, 4vw, 3rem);
  line-height: 1.1;
  letter-spacing: -.018em;
  text-wrap: balance;
}
.ei-head__title .accent { color: var(--ei-accent-ink); }
.ei-head__lead {
  margin-top: 1rem;
  font-size: clamp(1rem, 1.4vw, 1.1rem);
  color: var(--ei-muted);
  text-wrap: pretty;
}

.ei-note-text {
  margin-top: 2rem;
  padding-top: 1.25rem;
  border-top: 1px solid var(--ei-line-soft);
  font-size: .8125rem;
  line-height: 1.6;
  color: var(--ei-muted);
}

.ei-empty { color: var(--ei-muted); }

.ei-link {
  display: inline-flex;
  align-items: center;
  gap: .4em;
  font-weight: 600;
  font-size: .9375rem;
  color: var(--ei-accent-ink);
}
.ei-link::after {
  content: '→';
  transition: transform .25s var(--ei-ease);
}

/* Treść redakcyjna */
.ei-prose { max-width: 68ch; }
.ei-prose p { margin-bottom: 1.1em; color: var(--ei-muted); text-wrap: pretty; }
.ei-prose p:last-child { margin-bottom: 0; }
.ei-prose h2 { font-family: var(--ei-serif); font-size: 1.8rem; margin: 2em 0 .6em; }
.ei-prose h3 { font-size: 1.2rem; font-weight: 700; margin: 1.8em 0 .5em; }
.ei-prose ul { margin: 0 0 1.1em; padding-left: 1.3em; list-style: disc; }
.ei-prose li { margin-bottom: .4em; color: var(--ei-muted); }
.ei-prose a { color: var(--ei-accent-ink); text-decoration: underline; text-underline-offset: 3px; }
.ei-prose strong { color: var(--ei-ink); }

/* =========================================================================
   Metryczka inwestycji
   ====================================================================== */

.ei-facts { border-bottom: 1px solid var(--ei-line-soft); }
.ei-facts__grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 210px), 1fr));
  gap: 1.5rem 2rem;
}
.ei-facts__item { display: flex; gap: .85rem; align-items: flex-start; }
.ei-facts__icon {
  flex-shrink: 0;
  display: grid;
  place-items: center;
  width: 38px; height: 38px;
  border-radius: 50%;
  color: var(--ei-accent);
  background: color-mix(in srgb, var(--ei-accent) 10%, transparent);
}
.ei-facts__label {
  font-size: .72rem;
  font-weight: 700;
  letter-spacing: .1em;
  text-transform: uppercase;
  color: var(--ei-muted);
}
.ei-facts__value { margin-top: .15rem; font-size: .975rem; font-weight: 600; line-height: 1.4; }

/* =========================================================================
   O inwestycji
   ====================================================================== */

.ei-about__grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: clamp(2rem, 5vw, 4.5rem);
  align-items: center;
}
.ei-about__grid--solo { grid-template-columns: 1fr; max-width: 68ch; }
.ei-about__lead {
  margin-top: 1.25rem;
  font-size: clamp(1.06rem, 1.6vw, 1.2rem);
  line-height: 1.6;
  color: var(--ei-ink);
  text-wrap: pretty;
}
.ei-about__lead + .ei-prose { margin-top: 1.25rem; }
.ei-about__media { position: relative; }
.ei-about__media .ei-ratio { border-radius: var(--ei-radius); box-shadow: var(--ei-shadow); }
/* Cienka linia akcentu wzdłuż zdjęcia — sygnał premium bez ozdobników. */
.ei-about__media::after {
  content: '';
  position: absolute;
  left: -14px; top: 24px; bottom: 24px;
  width: 2px;
  background: var(--ei-accent);
}
.ei-about__caption { margin-top: .75rem; font-size: .8125rem; color: var(--ei-muted); }

/*
 * Kolumna ze zdjęciem przykleja się przy przewijaniu.
 *
 * Opis inwestycji ma trzy akapity; bez tego obok tekstu zostawała pusta biała
 * kolumna, a telefon uciekał z ekranu. Odsunięcie od góry uwzględnia wysokość
 * przyklejonego paska nawigacji.
 */
.ei-about__side { display: grid; gap: 1rem; }
@media (min-width: 900px) {
  .ei-about__side {
    position: sticky;
    top: calc(var(--ei-nav-h) + 1.5rem);
    align-self: start;
  }
  /* Wyrównanie do góry — inaczej sklejenie nie ma czego złapać. */
  .ei-about__grid { align-items: start; }
}

.ei-about__card {
  padding: 1.25rem 1.35rem;
  border: 1px solid var(--ei-line);
  border-radius: var(--ei-radius);
  background: var(--ei-surface);
}
.ei-about__card-title { font-size: .9375rem; font-weight: 700; line-height: 1.4; }
.ei-about__contacts { display: grid; gap: .4rem; margin: .85rem 0 1.1rem; }
.ei-about__contacts a {
  display: inline-flex;
  align-items: center;
  gap: .5rem;
  min-height: 32px;
  font-size: .9375rem;
  font-weight: 600;
}
.ei-about__contacts a:hover { color: var(--ei-accent-ink); }
.ei-about__contacts svg { color: var(--ei-accent-ink); flex-shrink: 0; }
.ei-about__card-actions { display: flex; flex-wrap: wrap; align-items: center; gap: .75rem 1rem; }
.ei-link--sm { font-size: .8125rem; }

/* Odnośnik „zobacz dokumenty" pod sekcjami, z których wynika taki krok. */
.ei-section__more { margin-top: 1.75rem; }
.ei-section__more .ei-link { gap: .5rem; }

/* =========================================================================
   Atuty
   ====================================================================== */

.ei-highlights__grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 255px), 1fr));
  gap: 1px;
  background: var(--ei-line-soft);
  border: 1px solid var(--ei-line-soft);
  border-radius: var(--ei-radius);
  overflow: hidden;
}

/*
 * Liczba kolumn dobrana do liczby kafelków.
 *
 * `auto-fit` zwija wyłącznie kolumny puste we wszystkich rzędach. Przy sześciu
 * kafelkach i szerokości ponad 1000 px mieściły się cztery kolumny: pierwszy
 * rząd wypełniał je w całości, więc nic się nie zwijało, a w drugim rzędzie
 * zostawały dwa puste pola — na siatce z liniami wyglądały jak brakujące
 * kafelki. Stąd jawne liczby kolumn dla układów, które dzielą się równo.
 */
@media (min-width: 860px) {
  .ei-highlights__grid[data-count="2"],
  .ei-highlights__grid[data-count="4"] { grid-template-columns: repeat(2, 1fr); }

  .ei-highlights__grid[data-count="3"],
  .ei-highlights__grid[data-count="6"],
  .ei-highlights__grid[data-count="9"],
  .ei-highlights__grid[data-count="12"] { grid-template-columns: repeat(3, 1fr); }

  .ei-highlights__grid[data-count="8"] { grid-template-columns: repeat(4, 1fr); }
}

/*
 * Liczba, która nie dzieli się równo (5, 7, 11…). Zamiast walczyć o układ
 * bez sierot, rezygnujemy z linii siatki: kafelki dostają własne obramowanie,
 * więc niepełny ostatni rząd nie zostawia szarych prostokątów.
 */
.ei-highlights__grid--loose {
  gap: clamp(1rem, 2vw, 1.5rem);
  background: transparent;
  border: 0;
  overflow: visible;
}
.ei-highlights__grid--loose .ei-highlight {
  border: 1px solid var(--ei-line);
  border-radius: var(--ei-radius);
}
.ei-highlight {
  padding: clamp(1.5rem, 3vw, 2.25rem);
  background: var(--ei-surface);
  transition: background .3s var(--ei-ease);
}
.ei-highlight:hover { background: color-mix(in srgb, var(--ei-accent) 4%, var(--ei-surface)); }
.ei-highlight__icon {
  display: grid;
  place-items: center;
  width: 48px; height: 48px;
  margin-bottom: 1.15rem;
  border-radius: 50%;
  color: var(--ei-accent);
  background: color-mix(in srgb, var(--ei-accent) 10%, transparent);
}
.ei-highlight__title { font-size: 1.0625rem; font-weight: 700; line-height: 1.35; letter-spacing: 0; }
.ei-highlight__text { margin-top: .5rem; font-size: .9375rem; color: var(--ei-muted); text-wrap: pretty; }

/* =========================================================================
   Przekładka ze zdjęciem
   =========================================================================

   Pas pełnej szerokości między długimi blokami treści. Obraz jest wyższy niż
   pudełko i przesuwany transformacją, co daje głębię bez `background-attachment:
   fixed` — ta wymusza przemalowanie całego tła przy każdym przewinięciu
   i jest ignorowana na iOS.
   ====================================================================== */

/*
 * Paralaksa: zdjęcie stoi nieruchomo, a strona przesuwa się nad nim jak okno.
 *
 * Robi to `position: fixed` na obrazie, przycięty do pasa przez `clip-path`
 * na rodzicu. Clip-path przycina potomka przypiętego do okna, ale — inaczej
 * niż `transform`, `filter` czy `will-change` — nie staje się dla niego blokiem
 * zawierającym, więc obraz nadal liczy się względem okna przeglądarki.
 * Zmierzone w Chrome: przy przewijaniu 0 → 900 → 1300 px górna krawędź pasa
 * szła 1200 → 300 → −100, a obrazu stale 0.
 *
 * Poprzednia wersja przesuwała obraz transformacją o ±6% w rytm przewijania.
 * Wymagała pętli rAF, nie działała podczas bezwładnego przewijania na iOS
 * (zdarzenia scroll nie lecą tam w trakcie animacji), a przy 420-pikselowym
 * pasie dawała ruch rzędu 30 px — czyli praktycznie nic.
 *
 * UWAGA: żaden przodek .ei-divider nie może mieć transform, filter,
 * perspective, backdrop-filter, contain: paint ani will-change tych własności
 * — każda z nich przejmuje rolę bloku zawierającego i obraz przestanie stać.
 */
.ei-divider {
  position: relative;
  height: clamp(240px, 34vw, 440px);
  background: var(--ei-deep);
  clip-path: inset(0);
}
.ei-divider__media {
  position: fixed;
  inset: 0;
  width: 100%;
  height: 100vh;
}
.ei-divider__img,
.ei-divider__media img { width: 100%; height: 100%; object-fit: cover; }

/*
 * Bez clip-path (albo przy wyłączonych animacjach) obraz wraca do pasa
 * i przewija się razem ze stroną. Traci efekt, ale nadal jest przekładką.
 */
@supports not (clip-path: inset(0)) {
  .ei-divider { overflow: hidden; }
  .ei-divider__media { position: absolute; height: 100%; }
}
@media (prefers-reduced-motion: reduce) {
  .ei-divider { clip-path: none; overflow: hidden; }
  .ei-divider__media { position: absolute; height: 100%; }
}

/* =========================================================================
   Belka kontaktowa
   =========================================================================

   Między sekcją ofert a formularzem leży kilka tysięcy pikseli treści.
   Bez tej belki użytkownik, który podjął decyzję w połowie strony, musiał
   szukać kontaktu samodzielnie.
   ====================================================================== */

.ei-ctabar {
  padding-block: clamp(1.5rem, 3vw, 2.25rem);
  background: var(--ei-tint);
  border-block: 1px solid var(--ei-line-soft);
}
.ei-ctabar__inner {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 1rem 2rem;
}
.ei-ctabar__title {
  font-family: var(--ei-serif);
  font-size: clamp(1.25rem, 2.2vw, 1.6rem);
  line-height: 1.2;
}
.ei-ctabar__text { margin-top: .3rem; font-size: .9375rem; color: var(--ei-muted); }
.ei-ctabar__actions { display: flex; flex-wrap: wrap; align-items: center; gap: .75rem 1.25rem; }
.ei-ctabar__phone {
  display: inline-flex;
  align-items: center;
  gap: .5rem;
  min-height: 44px;
  font-size: 1.0625rem;
  font-weight: 700;
}
.ei-ctabar__phone svg { color: var(--ei-accent-ink); flex-shrink: 0; }
.ei-ctabar__phone:hover { color: var(--ei-accent-ink); }

/* Belka tuż po ciemnej sekcji — bez tintu wyglądałaby jak jej przedłużenie. */
.ei-section--deep + .ei-ctabar { background: var(--ei-surface); }

/* =========================================================================
   Sygnały zaufania
   ====================================================================== */

.ei-trust__stats {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 170px), 1fr));
  gap: 1px;
  margin-bottom: clamp(2rem, 4vw, 3rem);
  background: var(--ei-line-soft);
  border: 1px solid var(--ei-line-soft);
  border-radius: var(--ei-radius);
  overflow: hidden;
}
.ei-trust__stat { padding: clamp(1.25rem, 3vw, 1.9rem) 1.25rem; background: var(--ei-surface); text-align: center; }
.ei-trust__value {
  font-family: var(--ei-serif);
  font-size: clamp(1.9rem, 3.4vw, 2.6rem);
  line-height: 1;
  color: var(--ei-ink);
}
.ei-trust__label {
  margin-bottom: .5rem;
  font-size: .72rem;
  font-weight: 700;
  letter-spacing: .1em;
  text-transform: uppercase;
  color: var(--ei-muted);
}

.ei-trust__quotes {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 280px), 1fr));
  gap: clamp(1rem, 2vw, 1.5rem);
}
.ei-quote {
  display: flex;
  flex-direction: column;
  padding: clamp(1.35rem, 2.5vw, 1.85rem);
  border: 1px solid var(--ei-line);
  border-radius: var(--ei-radius);
  background: var(--ei-surface);
}
/* Cudzysłów jako znak graficzny — tania oprawa, bez dokładania grafiki. */
.ei-quote::before {
  content: '”';
  font-family: var(--ei-serif);
  font-size: 3.5rem;
  line-height: .6;
  color: var(--ei-accent);
  margin-bottom: .5rem;
}
.ei-quote__text {
  flex: 1;
  margin: 0;
  font-size: .9375rem;
  line-height: 1.65;
  color: var(--ei-muted);
  text-wrap: pretty;
}
.ei-quote__meta {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: .5rem;
  margin-top: 1.1rem;
  padding-top: 1rem;
  border-top: 1px solid var(--ei-line-soft);
}
.ei-quote__author { font-size: .9375rem; font-weight: 700; }
.ei-quote__date { font-size: .8125rem; color: var(--ei-muted); }
.ei-trust__more { margin-top: 1.75rem; text-align: center; }

/* =========================================================================
   Etapy
   ====================================================================== */

.ei-stages__grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 320px), 1fr));
  gap: clamp(1.5rem, 3vw, 2.5rem);
}
.ei-stage {
  display: flex;
  flex-direction: column;
  border: 1px solid var(--ei-line);
  border-radius: var(--ei-radius);
  overflow: hidden;
  background: var(--ei-surface);
  transition: box-shadow .3s var(--ei-ease), transform .3s var(--ei-ease);
}
.ei-stage:hover { box-shadow: var(--ei-shadow-lg); transform: translateY(-3px); }
.ei-stage__media img { transition: transform .6s var(--ei-ease); }
.ei-stage:hover .ei-stage__media img { transform: scale(1.03); }
.ei-stage__body { display: flex; flex-direction: column; flex: 1; padding: clamp(1.35rem, 2.5vw, 2rem); }
.ei-stage__head { display: flex; align-items: center; justify-content: space-between; gap: 1rem; }
.ei-stage__title { font-family: var(--ei-serif); font-size: 1.65rem; }
.ei-stage__lead { margin-top: .75rem; font-size: .9375rem; color: var(--ei-muted); text-wrap: pretty; }

.ei-stage__params {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: .9rem 1.25rem;
  margin: 1.5rem 0;
  padding-top: 1.35rem;
  border-top: 1px solid var(--ei-line-soft);
}
.ei-stage__params dt {
  font-size: .7rem;
  font-weight: 700;
  letter-spacing: .09em;
  text-transform: uppercase;
  color: var(--ei-muted);
}
.ei-stage__params dd { margin-top: .2rem; font-size: .9375rem; font-weight: 600; }
.ei-stage__actions { margin-top: auto; }

/* =========================================================================
   Oferty i filtry
   ====================================================================== */

.ei-filters {
  display: grid;
  gap: 1.35rem;
  padding: clamp(1.25rem, 2.5vw, 1.75rem);
  margin-bottom: 2rem;
  border: 1px solid var(--ei-line);
  border-radius: var(--ei-radius);
  background: var(--ei-surface);
}
.ei-filters__legend {
  margin-bottom: .6rem;
  font-size: .72rem;
  font-weight: 700;
  letter-spacing: .11em;
  text-transform: uppercase;
  color: var(--ei-muted);
}
.ei-chips { display: flex; flex-wrap: wrap; gap: .5rem; }
.ei-chip { position: relative; }
.ei-chip input {
  position: absolute;
  opacity: 0;
  width: 100%; height: 100%;
  margin: 0;
  cursor: pointer;
}
.ei-chip span {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  padding: .45rem 1rem;
  font-size: .875rem;
  font-weight: 600;
  border: 1px solid var(--ei-line);
  border-radius: var(--ei-radius);
  transition: background .2s var(--ei-ease), border-color .2s var(--ei-ease), color .2s var(--ei-ease);
}
.ei-chip:hover span { border-color: var(--ei-ink); }
.ei-chip input:checked + span { background: var(--ei-ink); border-color: var(--ei-ink); color: #fff; }
.ei-chip input:focus-visible + span { outline: 2px solid var(--ei-accent); outline-offset: 2px; }

.ei-filters__row {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 1.25rem;
  padding-top: 1.25rem;
  border-top: 1px solid var(--ei-line-soft);
}
.ei-filters__count { font-size: .875rem; color: var(--ei-muted); }
.ei-filters__reset {
  margin-left: auto;
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  padding-inline: .25rem;
  font-size: .875rem;
  font-weight: 600;
  color: var(--ei-muted);
  text-decoration: underline;
  text-underline-offset: 3px;
}
.ei-filters__reset:hover { color: var(--ei-ink); }

.ei-switch { display: inline-flex; align-items: center; gap: .6rem; cursor: pointer; min-height: 44px; }
.ei-switch input { position: absolute; opacity: 0; width: 1px; height: 1px; }
.ei-switch__track {
  position: relative;
  width: 42px; height: 24px;
  border-radius: 100px;
  background: var(--ei-line);
  transition: background .25s var(--ei-ease);
}
.ei-switch__track::after {
  content: '';
  position: absolute;
  top: 3px; left: 3px;
  width: 18px; height: 18px;
  border-radius: 50%;
  background: #fff;
  transition: transform .25s var(--ei-ease);
}
.ei-switch input:checked + .ei-switch__track { background: var(--ei-accent); }
.ei-switch input:checked + .ei-switch__track::after { transform: translateX(18px); }
.ei-switch input:focus-visible + .ei-switch__track { outline: 2px solid var(--ei-accent); outline-offset: 2px; }
.ei-switch__label { font-size: .9375rem; font-weight: 600; }

.ei-select { display: inline-flex; align-items: center; gap: .55rem; }
.ei-select__label { font-size: .875rem; color: var(--ei-muted); }
.ei-select select {
  min-height: 44px;
  padding: .4rem 2rem .4rem .8rem;
  font-size: .875rem;
  font-weight: 600;
  border: 1px solid var(--ei-line);
  border-radius: var(--ei-radius);
  background: var(--ei-surface) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1.5 6 6.5l5-5' fill='none' stroke='%23888' stroke-width='1.6' stroke-linecap='round'/%3E%3C/svg%3E") no-repeat right .7rem center;
  appearance: none;
}

/*
 * Osobne zestawienie dla każdego rodzaju.
 *
 * Mieszkanie, lokal usługowy i miejsce postojowe kupuje się w różnych
 * momentach, a wymieszane w jednej siatce kazały przewijać osiem miejsc
 * postojowych w drodze do czwartego mieszkania.
 */
.ei-offers__group + .ei-offers__group { margin-top: clamp(2.5rem, 5vw, 4rem); }
.ei-offers__group[hidden] { display: none; }
.ei-offers__group-title {
  display: flex;
  align-items: center;
  gap: .6rem;
  margin-bottom: 1.35rem;
  padding-bottom: .7rem;
  font-family: var(--ei-serif);
  font-size: clamp(1.35rem, 2.4vw, 1.75rem);
  border-bottom: 1px solid var(--ei-line);
}
.ei-offers__group-count {
  font-family: var(--ei-sans);
  font-size: .8125rem;
  font-weight: 700;
  padding: .1rem .45rem;
  border-radius: var(--ei-radius);
  background: var(--ei-line-soft);
  color: var(--ei-muted);
}

.ei-offers__grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(min(100%, 300px), 1fr));
  gap: clamp(1rem, 2vw, 1.5rem);
}
/* Rodzaj bez danych technicznych — w karcie jest tylko numer, cena i przycisk,
   więc 300 px szerokości byłoby w większości pustką. */
.ei-offers__grid--bare {
  grid-template-columns: repeat(auto-fill, minmax(min(100%, 216px), 1fr));
}
.ei-offer {
  --ei-offer-pad: clamp(1.25rem, 2.2vw, 1.6rem);
  display: flex;
  flex-direction: column;
  overflow: hidden;           /* stopka dobija do krawędzi, więc karta ją przycina */
  padding: var(--ei-offer-pad);
  border: 1px solid var(--ei-line);
  border-radius: var(--ei-radius);
  background: var(--ei-surface);
  transition: border-color .25s var(--ei-ease), box-shadow .25s var(--ei-ease), opacity .25s var(--ei-ease);
}
.ei-offer:hover { border-color: color-mix(in srgb, var(--ei-accent) 50%, transparent); box-shadow: var(--ei-shadow); }
.ei-offer[hidden] { display: none; }
/* Przezroczystość całej karty ściągała tekst do 2,3:1. Wygaszamy więc obraz,
   a treść tylko przygaszamy kolorem, który nadal przechodzi próg. */
.ei-offer--sold .ei-offer__plan img { opacity: .5; filter: grayscale(1); }
.ei-offer--sold .ei-offer__title,
.ei-offer--sold .ei-offer__specs dd { color: var(--ei-muted); }

/*
 * Odstęp pod nagłówkiem należy do nagłówka, nie do tego, co po nim następuje.
 *
 * Wcześniej niósł go górny margines tabelki danych — a miejsce postojowe nie ma
 * żadnych danych, więc szary pas ceny dobijał wprost do nazwy lokalu, bez
 * jednego piksela przerwy.
 */
.ei-offer__head {
  display: grid;
  grid-template-columns: 1fr auto;
  align-items: center;
  gap: .3rem .75rem;
  margin-bottom: 1.15rem;
}
/* Pozycje przypisane jawnie, żeby brak etapu nie wciągał odznaki do pierwszej
   kolumny — nazwa lokalu ma zawsze cały wiersz dla siebie. */
.ei-offer__head .ei-offer__stage { grid-column: 1; grid-row: 1; }
.ei-offer__head .ei-badge { grid-column: 2; grid-row: 1; justify-self: end; }
.ei-offer__head .ei-offer__title { grid-column: 1 / -1; grid-row: 2; }
.ei-offer__stage {
  font-size: .7rem;
  font-weight: 700;
  letter-spacing: .1em;
  text-transform: uppercase;
  color: var(--ei-accent-ink);
}
.ei-offer__title { font-family: var(--ei-serif); font-size: 1.5rem; margin-top: .15rem; }

.ei-offer__plan {
  display: block;
  margin: 0 0 1.15rem;
  border: 1px solid var(--ei-line-soft);
  border-radius: var(--ei-radius);
  background: #fff;
}
.ei-offer__zoom, .ei-grid__zoom {
  position: absolute;
  right: .6rem; bottom: .6rem;
  display: grid;
  place-items: center;
  width: 34px; height: 34px;
  border-radius: 50%;
  color: var(--ei-ink);
  background: rgba(255, 255, 255, .92);
  box-shadow: var(--ei-shadow);
  opacity: 0;
  transform: translateY(4px);
  transition: opacity .25s var(--ei-ease), transform .25s var(--ei-ease);
}
.ei-offer__plan:hover .ei-offer__zoom,
.ei-grid__link:hover .ei-grid__zoom,
.ei-offer__plan:focus-visible .ei-offer__zoom,
.ei-grid__link:focus-visible .ei-grid__zoom { opacity: 1; transform: translateY(0); }

/*
 * Dane lokalu jako tabelka, nie jako siatka kafelków.
 *
 * Wcześniej etykiety stały nad wartościami w dwóch kolumnach. Przy trzech
 * pozycjach — a to typowy lokal usługowy: powierzchnia, piętro i nic więcej —
 * trzecia zostawała sama w rzędzie i pół karty świeciło pustką. Do tego
 * etykiety szły wersalikami po 0,7 rem, więc „POWIERZCHNIA" krzyczało głośniej
 * niż „105,09 m²", czyli niż jedyna rzecz, której ktoś tu szuka.
 *
 * Rzędy etykieta–wartość działają dla dowolnej ich liczby, nie zostawiają
 * dziur i czytają się jak karta lokalu, bo nią są.
 */
.ei-offer__specs {
  display: grid;
  margin: 0;
  border-top: 1px solid var(--ei-line);
}
.ei-offer__specs > div {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 1rem;
  padding: .58rem 0;
  border-bottom: 1px solid var(--ei-line-soft);
}
.ei-offer__specs > div:last-child { border-bottom: 0; }
.ei-offer__specs dt {
  font-size: .875rem;
  font-weight: 500;
  letter-spacing: 0;
  text-transform: none;
  color: var(--ei-muted);
}
.ei-offer__specs dd {
  margin: 0;
  font-size: .9375rem;
  font-weight: 700;
  color: var(--ei-ink);
  text-align: right;
}

.ei-offer__note {
  display: flex;
  align-items: flex-start;
  gap: .45rem;
  margin-top: .9rem;
  font-size: .875rem;
  font-weight: 600;
  line-height: 1.45;
  color: var(--ei-accent-ink);
}
.ei-offer__note svg { flex-shrink: 0; margin-top: .15rem; }

/*
 * Cena siedzi we własnym, przyciemnionym pasie dobitym do krawędzi karty.
 *
 * Karty w rzędzie mają równą wysokość, więc krótsza z nich zostawiała nad ceną
 * pustkę wyglądającą na błąd. Pas zamienia tę pustkę w tło: cena ma teraz swoje
 * miejsce w karcie, a wzrok skacze po rzędzie z jednej do drugiej, bo wszystkie
 * leżą na tej samej wysokości.
 */
.ei-offer__foot {
  margin: auto calc(var(--ei-offer-pad) * -1) calc(var(--ei-offer-pad) * -1);
  padding: 1rem var(--ei-offer-pad) var(--ei-offer-pad);
  background: var(--ei-tint);
  border-top: 1px solid var(--ei-line);
}
.ei-offer__price { display: flex; flex-direction: column; }
.ei-offer__amount {
  font-family: var(--ei-serif);
  font-size: 1.75rem;
  line-height: 1.1;
  color: var(--ei-ink);
}
.ei-offer__sold { font-size: 1.25rem; font-weight: 700; line-height: 1.4; color: var(--ei-muted); }

/*
 * Wiersz uzupełniający: cena za metr po lewej, karta lokalu po prawej.
 * Renderuje się zawsze, także pusty — stała wysokość trzyma przycisk
 * i dolną krawędź pasa na wspólnej linii we wszystkich kartach rzędu.
 */
.ei-offer__meta {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: .75rem;
  min-height: 1.65rem;
  margin: .2rem 0 0;
}
.ei-offer__unit { font-size: .8125rem; color: var(--ei-muted); }
.ei-offer__doc { margin-left: auto; }
.ei-link--sm { display: inline-flex; align-items: center; gap: .35rem; font-size: .8125rem; }

/*
 * Jeden przycisk, zawsze na całą szerokość karty. Wcześniej „Zapytaj" raz
 * zajmowało cały rząd, a raz jego prawą połowę — zależnie od tego, czy lokal
 * ma PDF. Ten sam przycisk w dwóch rozmiarach w sąsiadujących kartach czyta się
 * jak usterka, więc karta lokalu zeszła do wiersza uzupełniającego.
 */
.ei-offer__actions {
  display: grid;
  align-items: center;
  min-height: 42px;
  margin-top: .85rem;
}
.ei-offer__actions .ei-btn { justify-content: center; }
.ei-offer__gone {
  font-size: .875rem;
  font-weight: 600;
  color: var(--ei-muted);
  text-align: center;
}

/* =========================================================================
   Oferty — przełącznik widoku i widok listy
   ====================================================================== */

.ei-offers__toolbar { display: flex; justify-content: flex-end; margin-bottom: 1.25rem; }
.ei-viewswitch {
  display: inline-flex;
  padding: 3px;
  gap: 3px;
  background: var(--ei-line-soft);
  border-radius: var(--ei-radius);
}
.ei-viewswitch__btn {
  display: inline-flex;
  align-items: center;
  gap: .45rem;
  min-height: 38px;
  padding: .4rem .85rem;
  font-size: .875rem;
  font-weight: 600;
  color: var(--ei-muted);
  background: transparent;
  border: 0;
  border-radius: var(--ei-radius);
  cursor: pointer;
  transition: background .2s var(--ei-ease), color .2s var(--ei-ease);
}
.ei-viewswitch__btn svg { flex-shrink: 0; }
.ei-viewswitch__btn:hover { color: var(--ei-ink); }
.ei-viewswitch__btn.is-active {
  color: var(--ei-ink);
  background: var(--ei-surface);
  box-shadow: 0 1px 2px rgba(0, 0, 0, .09);
}
.ei-viewswitch__btn:focus-visible { outline: 2px solid var(--ei-focus); outline-offset: 2px; }

/*
 * Widok listy: jedna oferta na rząd, dane w kolumnach.
 *
 * Do porównania czternastu lokali potrzeba metraży jeden pod drugim — w siatce
 * kafelków ta sama liczba leży za każdym razem w innym miejscu ekranu.
 *
 * Rzędy budujemy gridem o ścieżkach wyłącznie ułamkowych, a nie flexem.
 * Flex mierzy każdy rząd osobno, więc „Powierzchnia" wypadała raz na 352 px,
 * raz na 388 px i lista przestawała być listą. Ścieżki `fr` mają w każdym
 * rzędzie tę samą geometrię niezależnie od treści, więc kolumny stoją w pionie.
 * Z tego samego powodu nie ma tu `auto` ani `min-content`.
 *
 * `display: contents` na stopce rozpuszcza ją w siatce karty — cena i przyciski
 * stają się osobnymi kolumnami rzędu, zamiast siedzieć razem w jednej komórce
 * o zmiennej szerokości.
 */
.ei-offers__grid.is-list { grid-template-columns: 1fr; gap: .6rem; }
.is-list .ei-offer {
  display: grid;
  grid-template-columns:
    minmax(0, 1.55fr)   /* oznaczenie i status */
    minmax(0, 1.45fr)   /* dane lokalu */
    minmax(0, 2.4fr);   /* cena i przycisk */
  align-items: center;
  gap: .7rem 1.75rem;
}
/*
 * Wiersze przypisane jawnie. Bez tego notatka rozpięta na całą szerokość
 * lądowała w siatce przed stopką — ta spływała niżej, a rząd rósł
 * do trzykrotności swojej wysokości.
 */
.is-list .ei-offer__head,
.is-list .ei-offer__specs,
.is-list .ei-offer__foot { grid-row: 1; }
.is-list .ei-offer__note { grid-row: 2; }
/* Miniatura rzutu jest opcjonalna, a kolumna, która raz jest a raz jej nie ma,
   rozjechałaby cały pion. W liście rzut zostaje pod kliknięciem w kafelkach. */
.is-list .ei-offer__plan { display: none; }

/* Ten sam dwuwierszowy nagłówek co w kafelkach — odznaka trzyma się prawej
   krawędzi kolumny, więc w każdym rzędzie stoi w tym samym miejscu. */
.is-list .ei-offer__head { grid-column: 1; margin: 0; }
.is-list .ei-offer__title { font-size: 1.25rem; margin: 0; }

.is-list .ei-offer__specs {
  grid-column: 2;
  display: grid;
  grid-template-columns: repeat(var(--ei-spec-cols, 3), minmax(0, 1fr));
  gap: .2rem 1rem;
  margin: 0;
  border: 0;
}
.is-list .ei-offer__specs > div {
  flex-direction: column;
  align-items: flex-start;
  gap: 0;
  padding: 0;
  border: 0;
}
.is-list .ei-offer__specs dd { text-align: left; }

.is-list .ei-offer__note { grid-column: 1 / -1; margin: 0; }

/* Stopka trzyma własną, też ułamkową siatkę: cena z wierszem uzupełniającym
   po lewej, przycisk po prawej przez całą wysokość. */
.is-list .ei-offer__foot {
  grid-column: 3;
  display: grid;
  grid-template-columns: minmax(0, 1.25fr) minmax(0, 1fr);
  align-items: center;
  gap: .2rem 1.25rem;
  margin: 0;
  padding: 0;
  background: none;
  border: 0;
}
/* Cena za metr i odnośnik do karty muszą zmieścić się w jednej linii —
   złamane na dwie rozpychały rząd i psuły wspólną linię kolumn. */
.is-list .ei-offer__unit,
.is-list .ei-offer__doc a { white-space: nowrap; }
.is-list .ei-offer__price { grid-column: 1; grid-row: 1; }
.is-list .ei-offer__meta { grid-column: 1; grid-row: 2; min-height: 0; margin: 0; }
.is-list .ei-offer__doc { margin-left: 0; }
.is-list .ei-offer__amount { font-size: 1.375rem; }
.is-list .ei-offer__actions { grid-column: 2; grid-row: 1 / 3; margin: 0; min-height: 0; }

/* Rząd wymaga szerokości. Niżej lista wraca do kart — inaczej każda oferta
   rozsypałaby się na siedem zawijających się kawałków. */
@media (max-width: 899.98px) {
  .is-list .ei-offer {
    display: flex;
    flex-direction: column;
    align-items: stretch;
  }
  .is-list .ei-offer__plan { display: block; flex: none; margin: 1.15rem 0; }
  .is-list .ei-offer__head { margin-bottom: 1.15rem; }
  .is-list .ei-offer__title { font-size: 1.5rem; }
  .is-list .ei-offer__specs {
    display: grid;
    grid-template-columns: 1fr;
    gap: 0;
    margin: 1.15rem 0 0;
    border-top: 1px solid var(--ei-line);
  }
  .is-list .ei-offer__specs > div {
    flex-direction: row;
    align-items: baseline;
    justify-content: space-between;
    gap: 1rem;
    padding: .58rem 0;
    border-bottom: 1px solid var(--ei-line-soft);
  }
  .is-list .ei-offer__specs > div:last-child { border-bottom: 0; }
  .is-list .ei-offer__specs dd { text-align: right; }
  .is-list .ei-offer__note { margin-top: .9rem; }
  .is-list .ei-offer__foot {
    display: block;
    margin: auto calc(var(--ei-offer-pad) * -1) calc(var(--ei-offer-pad) * -1);
    padding: 1rem var(--ei-offer-pad) var(--ei-offer-pad);
    background: var(--ei-tint);
    border-top: 1px solid var(--ei-line);
  }
  .is-list .ei-offer__meta { min-height: 1.65rem; margin: .2rem 0 0; }
  .is-list .ei-offer__doc { margin-left: auto; }
  .is-list .ei-offer__actions { margin-top: .85rem; min-height: 42px; }
}

.ei-offers__empty {
  padding: clamp(2rem, 5vw, 3rem) 1.5rem;
  text-align: center;
  color: var(--ei-muted);
  border: 1px dashed var(--ei-line);
  border-radius: var(--ei-radius);
}
.ei-offers__empty p { margin: 0 auto; max-width: 46ch; }
.ei-offers__empty p.ei-offers__empty-actions {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: .6rem;
  margin: 1.5rem auto 0;
  max-width: none;
}

/*
 * Statusy mają własne, ciemne tła, więc wracają do białego tekstu.
 * Bursztyn podciągnięty z #b4740c (3,86:1) do #9c6408 (4,95:1) — kolor
 * pozostaje bursztynowy, ale przechodzi próg dla drobnych wersalików.
 */
.ei-badge--available { background: #14713a; color: #fff; }
.ei-badge--reserved  { background: #9c6408; color: #fff; }
.ei-badge--sold      { background: #5f6062; color: #fff; }
.ei-badge--muted     { background: var(--ei-line); color: var(--ei-ink); }

/* =========================================================================
   Informacje wymagane ustawą o jawności cen
   -------------------------------------------------------------------------
   Drobny druk na samym dole strony. Treść pod przepis, nie pod kupującego —
   postawiona wyżej i w rozmiarze zwykłej sekcji odciągała uwagę od ofert
   i kontaktu. Tutaj spełnia wymóg udostępnienia i z niczym nie konkuruje.

   Kontrast pozostaje pełny: --ei-muted to 4,79:1 na tincie, czyli powyżej
   progu WCAG AA. „Małe" znaczy drobne, nie nieczytelne — nieczytelne byłoby
   argumentem, że informacji nie udostępniono.
   ====================================================================== */

.ei-legal {
  padding-block: clamp(1.75rem, 3vw, 2.5rem);
  background: var(--ei-tint);
  border-top: 1px solid var(--ei-line);
  font-size: .75rem;
  line-height: 1.6;
  color: var(--ei-muted);
}
.ei-legal__title {
  margin-bottom: 1rem;
  font-family: var(--ei-sans);
  font-size: .6875rem;
  font-weight: 700;
  letter-spacing: .1em;
  text-transform: uppercase;
  color: var(--ei-ink);
}
.ei-legal__list {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 280px), 1fr));
  gap: .85rem 2rem;
  margin: 0;
}
/* Opłaty to kilka linijek prawniczego zdania — własny wiersz na całą szerokość
   zamiast wąskiej kolumny, w której zawijałoby się osiem razy. */
.ei-legal__item--wide { grid-column: 1 / -1; }
.ei-legal__item dt {
  margin-bottom: .15rem;
  font-weight: 700;
  color: var(--ei-ink);
}
.ei-legal__item dd { margin: 0; }
.ei-legal a { text-decoration: underline; text-underline-offset: 2px; }
.ei-legal a:hover { color: var(--ei-accent-ink); }
.ei-legal__more { margin: 1rem 0 0; }

/* =========================================================================
   Galeria i siatki zdjęć
   ====================================================================== */

.ei-tabs__bar {
  display: flex;
  flex-wrap: wrap;
  gap: .4rem;
  margin-bottom: 1.75rem;
  border-bottom: 1px solid var(--ei-line);
}
.ei-tabs__btn {
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: .5rem;
  min-height: 46px;
  padding: .6rem 1.1rem;
  font-size: .9375rem;
  font-weight: 600;
  color: var(--ei-muted);
  transition: color .2s var(--ei-ease);
}
.ei-tabs__btn::after {
  content: '';
  position: absolute;
  left: 0; bottom: -1px;
  width: 100%; height: 2px;
  background: var(--ei-accent);
  transform: scaleX(0);
  transition: transform .3s var(--ei-ease);
}
.ei-tabs__btn:hover { color: var(--ei-ink); }
.ei-tabs__btn[aria-selected="true"] { color: var(--ei-ink); }
.ei-tabs__btn[aria-selected="true"]::after { transform: scaleX(1); }
.ei-tabs__count {
  font-size: .75rem;
  font-weight: 700;
  padding: .1rem .4rem;
  border-radius: var(--ei-radius);
  background: var(--ei-line-soft);
  color: var(--ei-muted);
}

/*
 * Nota nad zakładką „Budowa". Data sesji dronowej odróżnia stan faktyczny od
 * wizualizacji stojącej w sąsiedniej zakładce — bez niej obie grupy wyglądają
 * jak ten sam materiał marketingowy.
 */
.ei-tabs__note {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: .5rem 1rem;
  margin: 0 0 1.5rem;
  padding: .8rem 1rem;
  font-size: .9375rem;
  color: var(--ei-muted);
  background: var(--ei-tint);
  border: 1px solid var(--ei-line-soft);
  border-radius: var(--ei-radius);
}
.ei-tabs__stamp {
  display: inline-flex;
  align-items: center;
  gap: .4rem;
  font-weight: 700;
  color: var(--ei-ink);
}
.ei-tabs__stamp svg { color: var(--ei-accent-ink); flex-shrink: 0; }
/* Sekcja galerii stoi na tincie, więc nota potrzebuje własnego, jaśniejszego tła. */
.ei-section--tint .ei-tabs__note { background: var(--ei-surface); }

/*
 * Siatki galerii.
 *
 * Wcześniej obie używały `auto-fill` z niskim progiem, przez co przy szerokim
 * ekranie powstawało pięć kolumn po ~220 px. Dla zdjęć to jeszcze uchodziło,
 * ale rzuty i plany zawierają tekst i przy tej szerokości były nieczytelne.
 *
 * Teraz liczba kolumn jest ograniczona z góry i dobierana do liczby pozycji:
 * mało zdjęć oznacza większe kafelki, nie ciaśniejsze.
 */
.ei-grid { display: grid; gap: clamp(.6rem, 1.4vw, 1rem); align-items: start; }
.ei-grid--photos { grid-template-columns: 1fr; }
.ei-grid--plans  { grid-template-columns: repeat(2, 1fr); }

@media (min-width: 700px) {
  .ei-grid--photos { grid-template-columns: repeat(2, 1fr); }
  .ei-grid--plans  { grid-template-columns: repeat(3, 1fr); }
}

@media (min-width: 1060px) {
  /* Trzy kolumny to sufit — powyżej kafelki zaczynają być za małe,
     żeby cokolwiek na nich rozpoznać przed kliknięciem. */
  .ei-grid--photos { grid-template-columns: repeat(3, 1fr); }

  /* Przy małej liczbie pozycji wolimy mniej kolumn i większe kafelki. */
  .ei-grid--photos[data-count="1"],
  .ei-grid--plans[data-count="1"] { grid-template-columns: minmax(0, 620px); }
  .ei-grid--photos[data-count="2"],
  .ei-grid--photos[data-count="4"],
  .ei-grid--plans[data-count="2"],
  .ei-grid--plans[data-count="4"] { grid-template-columns: repeat(2, 1fr); }
}

.ei-grid__link {
  display: block;
  border-radius: var(--ei-radius);
  background: var(--ei-line-soft);
}
.ei-grid__link img { transition: transform .6s var(--ei-ease); }
.ei-grid__link:hover img { transform: scale(1.04); }
.ei-grid--plans .ei-grid__link { border: 1px solid var(--ei-line-soft); background: #fff; }
.ei-grid--plans .ei-grid__link:hover img { transform: none; }
.ei-grid__caption { margin-top: .5rem; font-size: .8125rem; color: var(--ei-muted); }

/*
 * Wyróżnienie pierwszego kafelka zostało usunięte.
 *
 * Rozciągnięty na dwa pola zajmował trzy komórki razem z pozostałymi, więc
 * ostatni rząd wypadał równo tylko przy 2, 5, 8 lub 11 zdjęciach. Przy każdej
 * innej liczbie zostawała dziura, a liczba zdjęć zależy od tego, co klient
 * wgra dla danej inwestycji — czyli w praktyce była nieprzewidywalna.
 * Równa siatka jest tu warta więcej niż ozdobnik.
 */

/* =========================================================================
   Wideo
   ====================================================================== */

.ei-video__grid {
  display: grid;
  gap: clamp(1.25rem, 3vw, 2rem);
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 420px), 1fr));
}
.ei-video__grid[data-count="1"] { max-width: 960px; margin-inline: auto; }
.ei-video__frame {
  border-radius: var(--ei-radius);
  background: #0d0f12;
  cursor: pointer;
}
.ei-video__frame.is-empty { cursor: default; border: 1px dashed rgba(255, 255, 255, .28); }
.ei-video__frame img { transition: transform .7s var(--ei-ease), filter .4s var(--ei-ease); filter: brightness(.82); }
.ei-video__frame:hover img { transform: scale(1.03); filter: brightness(.95); }
/* Odtwarzacz wypełnia ramkę niezależnie od tego, czy to obca ramka osadzona,
   czy własny <video> z pliku w Mediach. */
.ei-video__frame iframe,
.ei-video__frame video {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  border: 0;
  background: #000;
  object-fit: contain;
}

.ei-video__play {
  position: absolute;
  inset: 0;
  display: grid;
  place-items: center;
}
.ei-video__play-icon {
  display: grid;
  place-items: center;
  width: 74px; height: 74px;
  padding-left: 5px;
  border-radius: 50%;
  color: var(--ei-ink);
  background: rgba(255, 255, 255, .94);
  box-shadow: 0 10px 40px -8px rgba(0, 0, 0, .5);
  transition: transform .3s var(--ei-ease), background .3s var(--ei-ease);
}
.ei-video__play:hover .ei-video__play-icon { transform: scale(1.08); background: #fff; }
.ei-video__play-icon svg { fill: currentColor; stroke: none; }

.ei-video__placeholder {
  position: absolute;
  inset: 0;
  display: grid;
  place-content: center;
  gap: .5rem;
  padding: 2rem;
  text-align: center;
  font-weight: 700;
  color: rgba(255, 255, 255, .9);
}
.ei-video__placeholder span {
  max-width: 34ch;
  font-size: .8125rem;
  font-weight: 400;
  color: rgba(255, 255, 255, .6);
}
.ei-video__caption { margin-top: .85rem; display: grid; gap: .2rem; }
.ei-video__caption strong { font-size: 1rem; }
.ei-video__caption span { font-size: .875rem; color: rgba(255, 255, 255, .65); }

/* =========================================================================
   Standard wykończenia
   ====================================================================== */

.ei-standard__grid {
  border: 1px solid var(--ei-line);
  border-radius: var(--ei-radius);
  overflow: hidden;
}
.ei-standard__group + .ei-standard__group { border-top: 1px solid var(--ei-line-soft); }
.ei-standard__summary {
  display: flex;
  align-items: center;
  gap: 1rem;
  padding: 1.15rem clamp(1rem, 2.2vw, 1.6rem);
  cursor: pointer;
  list-style: none;
  transition: background .2s var(--ei-ease);
}
.ei-standard__summary:hover { background: var(--ei-tint); }
.ei-standard__icon { display: grid; place-items: center; color: var(--ei-accent); flex-shrink: 0; }
.ei-standard__title { flex: 1; font-size: 1.05rem; font-weight: 700; letter-spacing: 0; }
.ei-standard__count {
  font-size: .75rem;
  font-weight: 700;
  padding: .12rem .5rem;
  border-radius: var(--ei-radius);
  background: var(--ei-line-soft);
  color: var(--ei-muted);
}
.ei-standard__chevron { color: var(--ei-muted); transition: transform .3s var(--ei-ease); }
.ei-standard__group[open] .ei-standard__chevron { transform: rotate(90deg); }

.ei-standard__list {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 280px), 1fr));
  gap: .55rem 2rem;
  padding: 0 clamp(1rem, 2.2vw, 1.6rem) 1.6rem clamp(3.4rem, 5vw, 4rem);
}
.ei-standard__list li {
  position: relative;
  padding-left: 1.1rem;
  font-size: .9375rem;
  color: var(--ei-muted);
  text-wrap: pretty;
}
.ei-standard__list li::before {
  content: '';
  position: absolute;
  left: 0; top: .68em;
  width: 5px; height: 5px;
  border-radius: 50%;
  background: var(--ei-accent);
}

/* =========================================================================
   Lokalizacja
   ====================================================================== */

.ei-location__grid {
  display: grid;
  grid-template-columns: 1fr 1.05fr;
  gap: clamp(2rem, 4vw, 3.5rem);
  align-items: start;
}
.ei-location__address {
  display: flex;
  align-items: center;
  gap: .6rem;
  margin-bottom: 1.35rem;
  font-size: 1.05rem;
  font-weight: 700;
}
.ei-location__address svg { color: var(--ei-accent); flex-shrink: 0; }

.ei-poi { margin: 1.75rem 0; border-top: 1px solid var(--ei-line-soft); }
.ei-poi__item {
  display: flex;
  align-items: center;
  gap: .75rem;
  padding: .8rem 0;
  border-bottom: 1px solid var(--ei-line-soft);
}
.ei-poi__icon { color: var(--ei-accent); flex-shrink: 0; display: grid; place-items: center; }
.ei-poi__name { flex: 1; font-size: .9375rem; }
.ei-poi__distance {
  font-size: .8125rem;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  color: var(--ei-muted);
  white-space: nowrap;
}

/*
 * Mapa trzyma się kadru, dopóki czyta się listę okolicy.
 *
 * Kolumna z opisem i punktami bywa dwa razy wyższa od mapy, więc przy dolnych
 * pozycjach („szkoła 900 m") mapa była już dawno za górną krawędzią ekranu
 * i odległości nie miały do czego się odnosić. Sticky działa, bo grid ma
 * align-items: start — element jest niższy od swojego obszaru w siatce i ma
 * w nim gdzie jechać. Odsunięcie od góry uwzględnia przyklejony pasek.
 *
 * Poniżej 1024 px siatka spada do jednej kolumny i przyklejanie nie ma sensu:
 * mapa nie stoi wtedy obok listy, tylko nad nią.
 */
@media (min-width: 1025px) {
  .ei-location__map {
    position: sticky;
    top: calc(var(--ei-nav-h) + 1.5rem);
  }
}

.ei-location__map .ei-ratio {
  border-radius: var(--ei-radius);
  box-shadow: var(--ei-shadow);
}
.ei-location__map iframe { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; }
.ei-location__placeholder {
  position: absolute;
  inset: 0;
  display: grid;
  place-items: center;
  color: var(--ei-line);
  background: var(--ei-tint);
}
.ei-location__load {
  position: absolute;
  inset: 0;
  display: grid;
  place-content: center;
  gap: .5rem;
  text-align: center;
  /* 35% krycia nie wystarczało nad jasnym podkładem mapy — napis schodził
     do 2,04:1. */
  background: rgba(16, 18, 22, .64);
  transition: background .3s var(--ei-ease);
}
.ei-location__load:hover { background: rgba(16, 18, 22, .74); }
.ei-location__load-inner {
  display: inline-flex;
  align-items: center;
  gap: .5rem;
  padding: .8rem 1.5rem;
  font-weight: 600;
  color: var(--ei-ink);
  background: #fff;
  border-radius: var(--ei-radius);
  box-shadow: var(--ei-shadow);
}
.ei-location__consent { font-size: .75rem; color: #fff; }

/* =========================================================================
   Postęp budowy
   ====================================================================== */

.ei-progress__headline {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: space-between;
  gap: 1rem;
}
.ei-progress__date {
  display: inline-flex;
  align-items: center;
  gap: .4rem;
  font-size: .8125rem;
  font-weight: 600;
  color: var(--ei-muted);
}

.ei-timeline {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 150px), 1fr));
  gap: 1.5rem;
  margin-top: clamp(2rem, 4vw, 3rem);
  padding-top: 2rem;
  border-top: 1px solid var(--ei-line-soft);
}
.ei-timeline__item { position: relative; padding-top: 1.5rem; }
.ei-timeline__item::before {
  content: '';
  position: absolute;
  top: 6px; left: 0; right: 0;
  height: 1px;
  background: var(--ei-line);
}
.ei-timeline__item.is-done::before { background: var(--ei-accent); }
.ei-timeline__dot {
  position: absolute;
  top: 0; left: 0;
  width: 13px; height: 13px;
  border-radius: 50%;
  border: 2px solid var(--ei-line);
  background: var(--ei-surface);
}
.ei-timeline__item.is-done .ei-timeline__dot { border-color: var(--ei-accent); background: var(--ei-accent); }
.ei-timeline__label { font-size: .9375rem; font-weight: 600; text-wrap: pretty; }
.ei-timeline__date { margin-top: .2rem; font-size: .8125rem; color: var(--ei-muted); }

/* =========================================================================
   Dokumenty
   ====================================================================== */

.ei-docs__grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(min(100%, 330px), 1fr));
  gap: 1rem;
}
.ei-doc__link {
  display: flex;
  align-items: center;
  gap: 1rem;
  height: 100%;
  padding: 1.25rem 1.35rem;
  border: 1px solid var(--ei-line);
  border-radius: var(--ei-radius);
  background: var(--ei-surface);
  transition: border-color .25s var(--ei-ease), box-shadow .25s var(--ei-ease), transform .25s var(--ei-ease);
}
.ei-doc__link:hover {
  border-color: color-mix(in srgb, var(--ei-accent) 55%, transparent);
  box-shadow: var(--ei-shadow);
  transform: translateY(-2px);
}
.ei-doc__icon {
  display: grid;
  place-items: center;
  width: 46px; height: 46px;
  flex-shrink: 0;
  border-radius: var(--ei-radius);
  color: var(--ei-accent);
  background: color-mix(in srgb, var(--ei-accent) 10%, transparent);
}
.ei-doc__body { flex: 1; display: grid; gap: .15rem; }
.ei-doc__title { font-size: .975rem; font-weight: 700; }
.ei-doc__desc { font-size: .8125rem; color: var(--ei-muted); }
.ei-doc__meta {
  font-size: .7rem;
  font-weight: 700;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--ei-muted);
}
.ei-doc__arrow { color: var(--ei-muted); flex-shrink: 0; transition: transform .25s var(--ei-ease), color .25s var(--ei-ease); }
.ei-doc__link:hover .ei-doc__arrow { color: var(--ei-accent-ink); transform: translateY(2px); }

/* =========================================================================
   FAQ
   ====================================================================== */

.ei-faq__list { border-top: 1px solid var(--ei-line); }
.ei-faq__item { border-bottom: 1px solid var(--ei-line); }
.ei-faq__question {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1.5rem;
  padding: 1.35rem 0;
  cursor: pointer;
  list-style: none;
}
.ei-faq__question h3 {
  font-size: clamp(1rem, 1.6vw, 1.125rem);
  font-weight: 700;
  line-height: 1.4;
  letter-spacing: 0;
  text-wrap: pretty;
}
.ei-faq__question:hover h3 { color: var(--ei-accent-ink); }
.ei-faq__marker {
  flex-shrink: 0;
  display: grid;
  place-items: center;
  width: 32px; height: 32px;
  border: 1px solid var(--ei-line);
  border-radius: 50%;
  color: var(--ei-muted);
  transition: transform .3s var(--ei-ease), background .3s var(--ei-ease), color .3s var(--ei-ease), border-color .3s var(--ei-ease);
}
.ei-faq__item[open] .ei-faq__marker {
  transform: rotate(45deg);
  background: var(--ei-accent);
  border-color: var(--ei-accent);
  color: #fff;
}
.ei-faq__answer { padding-bottom: 1.6rem; max-width: 70ch; }

/* =========================================================================
   Kontakt
   ====================================================================== */

.ei-contact__grid {
  display: grid;
  grid-template-columns: 1fr 1.1fr;
  gap: clamp(2rem, 5vw, 4.5rem);
  align-items: start;
}
.ei-agent {
  display: flex;
  /* Do góry, nie do środka: przy wyższym zdjęciu wyśrodkowanie zostawiało
     nazwisko w połowie sylwetki, a nad nim pas pustego tła. */
  align-items: flex-start;
  gap: 1.15rem;
  padding: 1.35rem;
  margin-bottom: 1.5rem;
  border: 1px solid rgba(255, 255, 255, .16);
  border-radius: var(--ei-radius);
  background: rgba(255, 255, 255, .05);
}
/*
 * Prostokąt 4:5, nie kółko.
 *
 * Kółko o średnicy 84 px pokazywało z całego zdjęcia mniej więcej twarz
 * i strzępek ramion - przy zdjęciu sylwetkowym to strata materiału.
 * Pionowy prostokąt mieści postać i czyta się jak zdjęcie z wizytówki,
 * a nie jak awatar z komunikatora.
 *
 * Rozmiar trzyma się kontenera, nigdy klasy na <img>: Imagify owija obraz
 * w <picture>, przenosząc na nie klasy, a picture ma display: contents
 * i nie tworzy własnego pudełka.
 */
.ei-agent__photo {
  width: 132px;
  aspect-ratio: 4 / 5;
  flex-shrink: 0;
  border-radius: var(--ei-radius);
  overflow: hidden;
  position: relative;
}
/*
 * Selektor potomka, nie dziecka bezpośredniego - po opakowaniu w <picture>
 * reguła na dziecko przestałaby działać.
 *
 * object-position: głowa jest u góry kadru, więc przy przycinaniu obcinamy
 * od dołu. Wyśrodkowanie ucinałoby czubek głowy.
 */
.ei-agent__photo img {
  position: absolute; inset: 0;
  width: 100%; height: 100%;
  object-fit: cover;
  object-position: center 22%;
}
.ei-agent__name { font-size: 1.0625rem; font-weight: 700; }
.ei-agent__role { font-size: .8125rem; color: rgba(255, 255, 255, .62); }
.ei-agent__contacts { display: grid; gap: .35rem; margin-top: .7rem; }
.ei-agent__contacts a {
  display: inline-flex;
  align-items: center;
  gap: .5rem;
  font-size: .9375rem;
  font-weight: 600;
}
.ei-agent__contacts a:hover { color: var(--ei-accent-soft); }
.ei-agent__contacts svg { color: var(--ei-accent); flex-shrink: 0; }

.ei-contact__meta { display: grid; gap: .6rem; }
.ei-contact__meta li {
  display: flex;
  align-items: center;
  gap: .6rem;
  font-size: .9375rem;
  color: rgba(255, 255, 255, .72);
}
.ei-contact__meta svg { color: var(--ei-accent); flex-shrink: 0; }

.ei-contact__form {
  padding: clamp(1.5rem, 3vw, 2.5rem);
  border-radius: var(--ei-radius);
  background: var(--ei-surface);
  color: var(--ei-ink);
  box-shadow: var(--ei-shadow-lg);
}

.ei-form { display: grid; gap: 1.1rem; }
.ei-form__row { display: grid; grid-template-columns: repeat(2, 1fr); gap: 1.1rem; }
.ei-form__trap { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; }

.ei-field { display: grid; gap: .4rem; }
.ei-field__label { font-size: .8125rem; font-weight: 700; letter-spacing: .02em; }
.ei-field__label span { color: var(--ei-accent-ink); }
.ei-field__input {
  width: 100%;
  min-height: 48px;
  padding: .7rem .9rem;
  font-size: 1rem;
  border: 1px solid var(--ei-line-control);
  border-radius: var(--ei-radius);
  background: var(--ei-surface);
  transition: border-color .2s var(--ei-ease), box-shadow .2s var(--ei-ease);
}
/* outline: none kasowało jedyny wskaźnik fokusu klawiaturowego na polach
   formularza — reguła globalna ma niższą specyficzność i przegrywała. */
.ei-field__input:focus-visible {
  outline: 2px solid var(--ei-focus);
  outline-offset: 2px;
}
.ei-field__input:focus {
  border-color: var(--ei-accent-ink);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--ei-accent-ink) 18%, transparent);
}
textarea.ei-field__input { min-height: 110px; resize: vertical; }
.ei-field.has-error .ei-field__input { border-color: #b3261e; }
.ei-field__error:empty { display: none; }
.ei-field__error { font-size: .8125rem; color: #b3261e; }
.ei-field--offer .ei-field__input { background: var(--ei-tint); font-weight: 600; }

.ei-check { display: flex; align-items: flex-start; gap: .7rem; cursor: pointer; }
.ei-check input { position: absolute; opacity: 0; width: 1px; height: 1px; }
.ei-check__box {
  flex-shrink: 0;
  display: grid;
  place-items: center;
  width: 22px; height: 22px;
  margin-top: 1px;
  border: 1px solid var(--ei-line);
  border-radius: var(--ei-radius);
  color: transparent;
  transition: background .2s var(--ei-ease), border-color .2s var(--ei-ease), color .2s var(--ei-ease);
}
.ei-check input:checked + .ei-check__box {
  background: var(--ei-accent);
  border-color: var(--ei-accent);
  color: #fff;
}
.ei-check input:focus-visible + .ei-check__box { outline: 2px solid var(--ei-accent); outline-offset: 2px; }
.ei-check__text { font-size: .8125rem; line-height: 1.55; color: var(--ei-muted); }
.ei-check__text a { color: var(--ei-accent-ink); text-decoration: underline; text-underline-offset: 2px; }

.ei-field__optional { font-weight: 500; color: var(--ei-muted); }

.ei-form__submit { width: 100%; }
.ei-form__promise {
  display: grid;
  gap: .3rem;
  margin-top: -.35rem;
  font-size: .8125rem;
  line-height: 1.5;
  text-align: center;
  color: var(--ei-muted);
}
.ei-form__required-note { font-size: .75rem; }
.ei-form__submit[disabled] { opacity: .6; cursor: progress; }
.ei-form__status:empty { display: none; }
.ei-form__status {
  padding: .8rem 1rem;
  font-size: .875rem;
  border-radius: var(--ei-radius);
  background: var(--ei-tint);
}
.ei-form__status.is-success { background: color-mix(in srgb, #14713a 12%, transparent); color: #0f5c2e; }
.ei-form__status.is-error { background: color-mix(in srgb, #b3261e 10%, transparent); color: #8c1d18; }

/* =========================================================================
   Stopka
   ====================================================================== */

.ei-footer {
  padding-block: clamp(3rem, 6vw, 4.5rem) 2rem;
  background: var(--ei-deep);
  color: rgba(255, 255, 255, .72);
  font-size: .9375rem;
}
.ei-footer__top {
  display: grid;
  /* auto-repeat dopuszcza obok siebie wyłącznie ścieżki o rozmiarze ustalonym.
     Samo `1.4fr` unieważniało całą deklarację, przez co stopka na desktopie
     spadała do jednej kolumny. minmax(<długość>, 1.4fr) jest już poprawne. */
  grid-template-columns: minmax(min(100%, 260px), 1.4fr) repeat(auto-fit, minmax(min(100%, 160px), 1fr));
  gap: clamp(1.75rem, 4vw, 3rem);
  padding-bottom: 2.5rem;
  border-bottom: 1px solid rgba(255, 255, 255, .12);
}
.ei-footer__name { font-family: var(--ei-serif); font-size: 1.5rem; color: #fff; }
/* Logo w stopce: ta sama zasada co w pasku — plik ciemny wybielamy filtrem,
   plik wgrany już w wersji jasnej zostawiamy w spokoju. */
.ei-logo__img--footer,
.ei-footer__name img { width: auto; height: 54px; object-fit: contain; }
.ei-logo__img--footer:not(.has-light) { filter: brightness(0) invert(1); }
.ei-logo__text--footer { color: #fff; text-shadow: none; }
.ei-footer__tagline { margin-top: .5rem; max-width: 34ch; font-size: .875rem; }
.ei-footer__social { display: flex; flex-wrap: wrap; gap: 1rem; margin-top: 1.25rem; }
.ei-footer__social a { font-size: .875rem; font-weight: 600; color: rgba(255, 255, 255, .8); }
.ei-footer__social a:hover { color: var(--ei-accent-soft); }

.ei-footer__heading {
  margin-bottom: .9rem;
  font-size: .72rem;
  font-weight: 700;
  letter-spacing: .13em;
  text-transform: uppercase;
  color: #fff;
}
.ei-footer__list { display: grid; gap: .5rem; }
.ei-footer__list a:hover { color: var(--ei-accent-soft); }

.ei-footer__bottom {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  padding-top: 1.75rem;
  font-size: .8125rem;
  color: rgba(255, 255, 255, .5);
}
.ei-footer__links {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: .4rem 1.1rem;
}
.ei-footer__links a { text-decoration: underline; text-underline-offset: 3px; }
.ei-footer__links a:hover { color: var(--ei-accent-soft); }
/* Podpis wykonawcy stoi obok polityki prywatności, ale nie udaje jej rangi. */
.ei-footer__credit { color: rgba(255, 255, 255, .45); }
.ei-footer__credit a { color: rgba(255, 255, 255, .7); }
/* 38% krycia dawało 3,55:1 — dla zastrzeżeń prawnych, które muszą być
   czytelne, podniesione do 60% (5,9:1). */
.ei-footer__disclaimer { flex-basis: 100%; font-size: .75rem; line-height: 1.55; color: rgba(255, 255, 255, .6); }

/* =========================================================================
   Strona główna — przegląd inwestycji
   ====================================================================== */

.ei-hub { padding-top: calc(var(--ei-nav-h) + var(--ei-section-y)); }
.ei-hub__grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(min(100%, 320px), 1fr));
  gap: clamp(1.25rem, 2.5vw, 2rem);
}
.ei-hub__card {
  display: flex;
  flex-direction: column;
  border: 1px solid var(--ei-line);
  border-radius: var(--ei-radius);
  overflow: hidden;
  background: var(--ei-surface);
  transition: box-shadow .3s var(--ei-ease), transform .3s var(--ei-ease);
}
.ei-hub__card:hover { box-shadow: var(--ei-shadow-lg); transform: translateY(-3px); }
.ei-hub__media img { transition: transform .6s var(--ei-ease); }
.ei-hub__card:hover .ei-hub__media img { transform: scale(1.04); }
.ei-hub__body { padding: 1.5rem; display: grid; gap: .4rem; justify-items: start; }
.ei-hub__title { font-family: var(--ei-serif); font-size: 1.5rem; }
.ei-hub__place { font-size: .875rem; color: var(--ei-muted); }
.ei-hub__card .ei-link { margin-top: .6rem; }
.ei-hub__card:hover .ei-link::after { transform: translateX(4px); }

.ei-linklist { display: grid; gap: .5rem; margin: 1.5rem 0; }
.ei-linklist a { font-weight: 600; }
.ei-linklist a:hover { color: var(--ei-accent-ink); }
.ei-linklist__meta { font-weight: 400; color: var(--ei-muted); }

.ei-posts { display: grid; gap: 2rem; }
.ei-posts__title { font-family: var(--ei-serif); font-size: 1.5rem; }
.ei-posts__meta { font-size: .8125rem; color: var(--ei-muted); margin: .25rem 0 .5rem; }

/* =========================================================================
   Podgląd zdjęć (lightbox)
   ====================================================================== */

.ei-lightbox {
  position: fixed;
  inset: 0;
  z-index: 300;
  display: grid;
  grid-template-rows: auto 1fr auto;
  background: rgba(10, 11, 13, .96);
  opacity: 0;
  visibility: hidden;
  transition: opacity .25s var(--ei-ease), visibility .25s;
}
.ei-lightbox.is-open { opacity: 1; visibility: visible; }
.ei-lightbox__bar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  padding: 1rem var(--ei-gutter);
  color: rgba(255, 255, 255, .7);
  font-size: .875rem;
}
/* Grid z wierszem 1fr nie stanowi dla obrazu określonego bloku zawierającego,
   więc max-height: 100% było ignorowane i rzuty wychodziły poza ekran —
   bez możliwości przewinięcia, bo tło ma zablokowane przewijanie. */
.ei-lightbox__stage {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 0 clamp(.5rem, 4vw, 4rem);
  min-height: 0;
  overflow: hidden;
}
.ei-lightbox__stage img {
  max-width: 100%;
  max-height: 100%;
  width: auto; height: auto;
  object-fit: contain;
}
.ei-lightbox__caption {
  padding: 1rem var(--ei-gutter) 1.5rem;
  text-align: center;
  font-size: .875rem;
  color: rgba(255, 255, 255, .72);
}
.ei-lightbox__btn {
  display: grid;
  place-items: center;
  width: 46px; height: 46px;
  border-radius: 50%;
  color: #fff;
  background: rgba(255, 255, 255, .1);
  transition: background .2s var(--ei-ease);
}
.ei-lightbox__btn:hover { background: rgba(255, 255, 255, .22); }
.ei-lightbox__nav {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
}
.ei-lightbox__nav--prev { left: clamp(.25rem, 2vw, 1.5rem); }
.ei-lightbox__nav--next { right: clamp(.25rem, 2vw, 1.5rem); }
body.ei-locked { overflow: hidden; }

/* =========================================================================
   Pasek akcji na mobile
   =========================================================================

   Przywraca klikalny telefon i przycisk kontaktu, które w pasku nawigacji
   chowają się poniżej 980 px. Checklista Landing Page Experience wymaga
   telefonu widocznego bez dodatkowych kliknięć — schowany w hamburgerze
   ten warunek nie jest spełniony.

   Pasek pojawia się dopiero po minięciu hero (klasa nadawana z JS), więc
   nie zasłania pierwszego ekranu ani nie działa jak wyskakujące okno.
   ====================================================================== */

.ei-actionbar { display: none; }

/* Próg zgodny z hamburgerem w critical.css — patrz komentarz tam. */
@media (max-width: 1024px) {
  .ei-actionbar {
    position: fixed;
    inset: auto 0 0;
    z-index: 95;
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: .5rem;
    padding: .5rem var(--ei-gutter) calc(.5rem + env(safe-area-inset-bottom, 0px));
    background: rgba(255, 255, 255, .94);
    backdrop-filter: saturate(160%) blur(14px);
    box-shadow: 0 -1px 0 var(--ei-line-soft), 0 -8px 24px -16px rgba(16, 18, 22, .35);
    transform: translateY(110%);
    transition: transform .3s var(--ei-ease);
  }
  .ei-actionbar.is-visible { transform: translateY(0); }

  .ei-actionbar__call,
  .ei-actionbar__cta {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: .5rem;
    min-height: 48px;
    padding: .5rem .75rem;
    font-size: .9375rem;
    font-weight: 600;
    border-radius: var(--ei-radius);
  }
  .ei-actionbar__call { color: var(--ei-ink); border: 1px solid var(--ei-line); }
  .ei-actionbar__call svg { color: var(--ei-accent-ink); flex-shrink: 0; }
  .ei-actionbar__call span { display: grid; line-height: 1.15; text-align: left; }
  .ei-actionbar__call small { font-size: .75rem; color: var(--ei-muted); font-weight: 500; }
  .ei-actionbar__cta { color: #fff; background: var(--ei-ink); border: 1px solid var(--ei-ink); }

  /* Miejsce na pasek, żeby nie przykrywał końca stopki. */
  .ei-footer { padding-bottom: calc(5.5rem + env(safe-area-inset-bottom, 0px)); }

  /* Przy otwartym menu pasek tylko przeszkadza. */
  body.ei-locked .ei-actionbar { transform: translateY(110%); }
}

/* =========================================================================
   Warianty inwestycji
   =========================================================================

   Jeden szablon obsługuje wszystkie inwestycje, ale każda ma dostać własny
   charakter — inaczej trzy landingi tej samej firmy wyglądają jak kopie
   i Google traktuje je jak duplikaty.

   Co się zmienia: paleta (kolor „deep" i tło przeplatanych sekcji), rytm
   siatek, kierunek układu w sekcji „o inwestycji", akcenty typograficzne.
   Co zostaje wspólne: mosiądz 3City jako kolor akcentu, ta sama typografia,
   te same komponenty. Dzięki temu landingi są rozpoznawalnie z jednej stajni,
   ale nie są swoimi klonami.

   Kolejność sekcji jest sterowana z configu (klucz "sections"), nie stąd.
   ====================================================================== */

/* --- Wariant „urban": apartamentowiec, Pruszcz Gdański -------------------
   Miejski, grafitowy, uporządkowany. Równa siatka bez wyróżnionego kafelka —
   mieszkania porównuje się parametrami, więc rytm ma być przewidywalny. */

.ei-variant--urban .ei-grid--photos .ei-grid__item:first-child { grid-column: auto; }
.ei-variant--urban .ei-grid--photos .ei-grid__item:first-child .ei-ratio::before { padding-top: 75%; }

/* Zdjęcie po lewej — odwrotnie niż w pozostałych. */
.ei-variant--urban .ei-about__grid { direction: rtl; }
.ei-variant--urban .ei-about__grid > * { direction: ltr; }
.ei-variant--urban .ei-about__media::after { left: auto; right: -14px; }

.ei-variant--urban .ei-hero__facts {
  border-radius: 0;
  border-inline: 0;
  border-bottom: 0;
}
.ei-variant--urban .ei-highlight__icon { border-radius: var(--ei-radius); }
.ei-variant--urban .ei-facts { background: var(--ei-tint); }

/* --- Wariant „estate": osiedle domów, dwa etapy --------------------------
   Cieplejszy i bardziej „ogrodowy". Etapy są sercem tego landinga, więc
   dostają mocniejszą oprawę: numerowane karty i wyraźniejszy podział. */

.ei-variant--estate .ei-stages__grid { gap: clamp(1.5rem, 3vw, 3rem); }
.ei-variant--estate .ei-stage { border-width: 1px; }
.ei-variant--estate .ei-stage__body { position: relative; }
.ei-variant--estate .ei-stage__title { font-size: 1.85rem; }

/* Delikatny numer etapu w tle karty — porządkuje czytanie bez dodatkowego
   tekstu do przetłumaczenia czy utrzymania. */
.ei-variant--estate .ei-stages__grid .ei-stage:nth-child(1) .ei-stage__body::before { content: 'I'; }
.ei-variant--estate .ei-stages__grid .ei-stage:nth-child(2) .ei-stage__body::before { content: 'II'; }
.ei-variant--estate .ei-stage__body::before {
  position: absolute;
  top: .35rem; right: 1.2rem;
  font-family: var(--ei-serif);
  font-size: 4.5rem;
  line-height: 1;
  color: color-mix(in srgb, var(--ei-accent) 16%, transparent);
  pointer-events: none;
}

.ei-variant--estate .ei-highlights__grid {
  background: transparent;
  border: 0;
  gap: clamp(1rem, 2vw, 1.75rem);
}
.ei-variant--estate .ei-highlight {
  border: 1px solid var(--ei-line);
  border-radius: var(--ei-radius);
}

/* --- Wariant „villa": jeden dom wolnostojący ----------------------------
   Butikowy. Jedna oferta nie potrzebuje tabeli ani filtrów, więc karta
   rozkłada się na całą szerokość i czyta się jak podsumowanie domu. */

.ei-variant--villa .ei-hero__copy { max-width: 40rem; }
.ei-variant--villa .ei-hero__title { font-size: clamp(2.6rem, 6.8vw, 5rem); }

/*
 * Reguły sprzed przebudowy kart. Zostaje tylko szersza karta - reszta
 * kolidowała z nowym układem: dane lokalu są dziś rzędami etykieta-wartość,
 * a ustawienie ich w dwie kolumny nakładało tekst na siebie. Rozmiary tytułu
 * i ceny przejął wariant „solo", bo zależą od liczby ofert, nie od typu
 * zabudowy.
 */
.ei-variant--villa .ei-offers__grid { grid-template-columns: 1fr; }

.ei-variant--villa .ei-about__grid { direction: rtl; }
.ei-variant--villa .ei-about__grid > * { direction: ltr; }
.ei-variant--villa .ei-about__media::after { left: auto; right: -14px; }

/* Atuty w jednym pasie — sześć krótkich haseł czyta się lepiej w rzędzie
   niż w kafelkach z opisami. */
.ei-variant--villa .ei-highlights__grid {
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 165px), 1fr));
  background: transparent;
  border: 0;
  gap: 1px;
  box-shadow: 0 0 0 1px var(--ei-line-soft);
  border-radius: var(--ei-radius);
  overflow: hidden;
}
.ei-variant--villa .ei-highlight { padding: 1.6rem 1.25rem; text-align: center; }
.ei-variant--villa .ei-highlight__icon { margin-inline: auto; }

/* 899.98 zamiast 900 — przy równych 900 px nakładała się z regułą
   @media (min-width: 900px) dla wyróżnionego kafelka galerii. */
@media (max-width: 899.98px) {
  /* Odwrócony układ „o inwestycji" na mobile ma dawać ten sam porządek
     co warianty domyślne: najpierw tekst, potem zdjęcie. */
  .ei-variant--urban .ei-about__grid,
  .ei-variant--villa .ei-about__grid { direction: ltr; }
}

/* =========================================================================
   Kontrast elementów sterujących
   =========================================================================

   Mosiądz marki (#cfa355) ma na bieli 2,33:1. Jako tło odznaki czy ikona
   w kółku jest w porządku — ale tam, gdzie kolor niesie informację o stanie
   kontrolki albo rysuje obrys fokusu, WCAG 1.4.11 i 2.4.11 wymagają 3:1.
   W tych miejscach wchodzi przyciemniony wariant o tym samym odcieniu.
   ====================================================================== */

.ei-chip span,
.ei-check__box,
.ei-switch__track,
.ei-timeline__dot,
.ei-actionbar__call { border-color: var(--ei-line-control); }
.ei-switch__track { background: var(--ei-line-control); }

.ei-switch input:checked + .ei-switch__track,
.ei-check input:checked + .ei-check__box,
.ei-faq__item[open] .ei-faq__marker,
.ei-timeline__item.is-done .ei-timeline__dot {
  background: var(--ei-accent-ink);
  border-color: var(--ei-accent-ink);
}
.ei-timeline__item.is-done::before { background: var(--ei-accent-ink); }
.ei-tabs__btn::after { background: var(--ei-accent-ink); }

/* Obrys fokusu zawsze przez zmienną — inaczej ciemne sekcje dostają
   wariant nieczytelny na swoim tle. */
.ei-chip input:focus-visible + span,
.ei-switch input:focus-visible + .ei-switch__track,
.ei-check input:focus-visible + .ei-check__box { outline: 2px solid var(--ei-focus); }

/* Pole wyboru zgody było 22 px — poniżej progu 24 px z WCAG 2.5.8. */
.ei-check__box { width: 24px; height: 24px; }

/* Obramowania na ciemnym tle: przy 16–45% bieli granica była niewidoczna. */
.ei-btn--glass { border-color: rgba(255, 255, 255, .72); }
.ei-agent { border-color: rgba(255, 255, 255, .34); }

/* Odnośnik tekstowy na sekcjach ciemnych — wariant przyciemniony ma tam
   3,28:1. Dziś .ei-link występuje tylko na jasnych kartach, ale reguła
   chroni przed regresem przy przenoszeniu sekcji. */
.ei-section--deep .ei-link,
.ei-footer .ei-link { color: var(--ei-accent); }

/* Cele dotykowe w stopce miały 18–21 px wysokości. */
.ei-footer__list { gap: .75rem; }
.ei-footer__list a,
.ei-footer__social a,
.ei-footer__links a { display: inline-block; padding-block: .25rem; }

/* =========================================================================
   Punkty łamania
   ====================================================================== */

@media (max-width: 1024px) {
  .ei-location__grid { grid-template-columns: 1fr; }
  .ei-contact__grid { grid-template-columns: 1fr; }
}

/* 899.98 zamiast 900 — przy równych 900 px nakładała się z regułą
   @media (min-width: 900px) dla wyróżnionego kafelka galerii. */
@media (max-width: 899.98px) {
  .ei-about__grid { grid-template-columns: 1fr; }
  /* Akcent przy zdjęciu wystaje o 14px poza kontener — na wąskim ekranie
     wypycha stronę w bok i tworzy poziomy pasek (fix z 06-TROUBLESHOOTING.md).
     Chowamy go zamiast walczyć z overflow na body. */
  .ei-about__media::after { display: none; }
  .ei-about__grid { display: flex; flex-direction: column-reverse; }
  .ei-footer__top { grid-template-columns: repeat(auto-fit, minmax(min(100%, 200px), 1fr)); }
}

@media (max-width: 640px) {
  .ei-form__row { grid-template-columns: 1fr; }
  .ei-filters__row { flex-direction: column; align-items: stretch; }
  .ei-filters__reset { margin-left: 0; text-align: left; }
  .ei-progress__headline { flex-direction: column; gap: .35rem; }
  .ei-agent { flex-direction: column; align-items: flex-start; text-align: left; }
  .ei-standard__list { padding-left: clamp(1rem, 4vw, 1.6rem); }
}

@media print {
  .ei-nav, .ei-hero__actions, .ei-filters, .ei-video, .ei-contact__form, .ei-lightbox { display: none !important; }
  .ei-section { padding-block: 1rem; }
  body { color: #000; background: #fff; }
}

/* =========================================================================
   Poziom wykończenia „premium"
   -------------------------------------------------------------------------
   Włączany kluczem theme.tier w pliku inwestycji, niezależnie od wariantu
   układu. Powstał dla Piastowskiej, której metraż kosztuje wyraźnie więcej
   niż reszta Pruszcza — landing musi to udźwignąć, zamiast wyglądać jak
   pozostałe pozycje w portfelu.

   Zestaw jest celowo krótki. „Drożej” w typografii bierze się z powietrza
   i proporcji, nie z dokładania ozdobników: więcej światła między sekcjami,
   większa skala pisma szeryfowego, ciaśniejszy trekking w nagłówkach,
   szerszy rozstrzelony nadtytuł i jedna włoskowata kreska w kolorze marki.
   ====================================================================== */

/* Więcej powietrza. Najmocniej działający element z całego zestawu. */
.ei-tier--premium { --ei-section-y: clamp(4.25rem, 9vw, 8.5rem); }

/* Nadtytuł: drobniejszy, ale mocniej rozstrzelony — typografia katalogowa. */
.ei-tier--premium .ei-eyebrow {
  font-size: .6875rem;
  letter-spacing: .2em;
}

/*
 * Włoskowata kreska w kolorze marki nad nadtytułem sekcji.
 * Jeden detal powtórzony konsekwentnie czyta się jak decyzja projektowa;
 * kilka różnych — jak przypadek.
 */
.ei-tier--premium .ei-head .ei-eyebrow::before {
  content: '';
  display: block;
  width: 42px;
  height: 1px;
  margin-bottom: .85rem;
  background: var(--ei-accent);
}
.ei-tier--premium .ei-head--center .ei-eyebrow::before { margin-inline: auto; }

/* Większa skala pisma szeryfowego przy ciaśniejszym trekkingu. */
.ei-tier--premium .ei-head__title {
  font-size: clamp(2.1rem, 4.3vw, 3.35rem);
  letter-spacing: -.022em;
}
.ei-tier--premium .ei-hero__title {
  font-size: clamp(2.55rem, 5.9vw, 4.35rem);
  letter-spacing: -.028em;
}

/* Cieńszy, głębszy cień kart — bliżej druku niż interfejsu. */
.ei-tier--premium .ei-offer:hover {
  box-shadow: 0 1px 2px rgba(16, 18, 22, .05), 0 22px 45px -25px rgba(16, 18, 22, .35);
}

/* Cena to główna liczba na tej stronie — dostaje pół stopnia więcej. */
.ei-tier--premium .ei-offer__amount { font-size: 1.9rem; }

/* =========================================================================
   Układy hero per wariant
   -------------------------------------------------------------------------
   Trzy landingi tego samego dewelopera nie mogą czytać się jak trzy kopie
   jednego szablonu. Różnicujemy je układem, a nie kolorem — kolorystyka jest
   wspólna, bo to marka.

   urban  (Piastowska)   treść po lewej, karta formularza po prawej, liczby
                         pasem pod spodem. Domyślny układ .ei-hero--split.
   estate (Łapalicka)    formularz po LEWEJ, treść po prawej. Osiedle domów
                         sprzedaje się dłuższą opowieścią, a odwrócenie kolumn
                         zmienia rytm strony od pierwszego ekranu.
   villa  (Jaśminowy)    jedna kolumna wyśrodkowana, formularz pod treścią,
                         liczby w rzędzie. Przy jednym domu na sprzedaż układ
                         dwukolumnowy wygląda na pusty.
   ====================================================================== */

/* --- estate: kolumny zamienione miejscami --- */
@media (min-width: 1025px) {
  /* Ta sama węższa karta co w pozostałych landingach - po dołożeniu zgody
     i widgetu Turnstile szeroka karta zaczynała dominować nad nagłówkiem. */
  .ei-variant--estate .ei-hero--split .ei-hero__inner {
    grid-template-columns: minmax(300px, 350px) minmax(0, 1fr);
  }
  .ei-variant--estate .ei-hero__copy  { grid-column: 2; grid-row: 1; }
  .ei-variant--estate .ei-hero__form  { grid-column: 1; grid-row: 1; }
  /* Zasłona jest kierunkowa — przy odwróconych kolumnach musi iść w drugą
     stronę, inaczej tekst wylądowałby na najjaśniejszej części zdjęcia. */
  .ei-variant--estate .ei-hero__veil {
    background: linear-gradient(264deg,
      rgba(10, 12, 15, .78)  0%,
      rgba(10, 12, 15, .74) 40%,
      rgba(10, 12, 15, .66) 56%,
      rgba(10, 12, 15, .20) 74%,
      rgba(10, 12, 15, 0)   88%);
  }
}

/* --- villa: dom po prawej, treść i formularz po lewej stronie kadru --- */
/*
 * Jaśminowy Stok to JEDEN dom wolnostojący, więc hero ma go pokazać - ale
 * formularz zostaje, bo to nadal główny punkt kontaktu nad zagięciem.
 *
 * Poprzednia wersja stawiała wyśrodkowaną kartę formularza na środku kadru,
 * dokładnie na budynku. Teraz treść i formularz trzymają się lewej i prawej
 * krawędzi, a dom zostaje widoczny między nimi i po prawej stronie zdjęcia.
 *
 * Od wariantu miejskiego odróżnia go skala pisma i kierunkowa zasłona, która
 * rozjaśnia prawą część kadru zamiast ją przyciemniać.
 */
@media (min-width: 1025px) {
  .ei-variant--villa .ei-hero { min-height: min(92svh, 880px); }

  /* Węższa kolumna tekstu i węższa karta formularza - między nimi zostaje
     pas, w którym widać bryłę domu. */
  .ei-variant--villa .ei-hero--split .ei-hero__inner {
    grid-template-columns: minmax(0, 1fr) minmax(300px, 350px);
  }
  .ei-variant--villa .ei-hero__copy { max-width: 32rem; }

  /* Zasłona kierunkowa od lewej: tekst dostaje kontrast, prawa część kadru
     z domem zostaje jaśniejsza niż w pozostałych landingach. */
  .ei-variant--villa .ei-hero__veil {
    background: linear-gradient(96deg,
      rgba(10, 12, 15, .80)  0%,
      rgba(10, 12, 15, .70) 32%,
      rgba(10, 12, 15, .44) 50%,
      rgba(10, 12, 15, .18) 70%,
      rgba(10, 12, 15, .06) 88%);
  }

  /* Liczby jako lekki pas, bez pudełek - przy jednym domu cztery kafelki
     wyglądały jak zestawienie z arkusza. */
  .ei-variant--villa .ei-hero__facts {
    border-top: 1px solid rgba(255, 255, 255, .22);
    padding-top: 1.4rem;
  }
}

/* =========================================================================
   Poziom wykończenia „premium"
   -------------------------------------------------------------------------
   Włączany kluczem theme.tier w pliku inwestycji, niezależnie od wariantu
   układu. Powstał dla Piastowskiej, której metraż kosztuje wyraźnie więcej
   niż reszta Pruszcza — landing musi to udźwignąć, zamiast wyglądać jak
   pozostałe pozycje w portfelu.

   Zestaw jest celowo krótki. „Drożej” w typografii bierze się z powietrza
   i proporcji, nie z dokładania ozdobników: więcej światła między sekcjami,
   większa skala pisma szeryfowego, ciaśniejszy trekking w nagłówkach,
   szerszy rozstrzelony nadtytuł i jedna włoskowata kreska w kolorze marki.
   ====================================================================== */

/* Więcej powietrza. Najmocniej działający element z całego zestawu. */
.ei-tier--premium { --ei-section-y: clamp(4.25rem, 9vw, 8.5rem); }

/* Nadtytuł: drobniejszy, ale mocniej rozstrzelony — typografia katalogowa. */
.ei-tier--premium .ei-eyebrow {
  font-size: .6875rem;
  letter-spacing: .2em;
}

/*
 * Włoskowata kreska w kolorze marki nad nadtytułem sekcji.
 * Jeden detal powtórzony konsekwentnie czyta się jak decyzja projektowa;
 * kilka różnych — jak przypadek.
 */
.ei-tier--premium .ei-head .ei-eyebrow::before {
  content: '';
  display: block;
  width: 42px;
  height: 1px;
  margin-bottom: .85rem;
  background: var(--ei-accent);
}
.ei-tier--premium .ei-head--center .ei-eyebrow::before { margin-inline: auto; }

/* Większa skala pisma szeryfowego przy ciaśniejszym trekkingu. */
.ei-tier--premium .ei-head__title {
  font-size: clamp(2.1rem, 4.3vw, 3.35rem);
  letter-spacing: -.022em;
}
.ei-tier--premium .ei-hero__title {
  font-size: clamp(2.55rem, 5.9vw, 4.35rem);
  letter-spacing: -.028em;
}

/* Cieńszy, głębszy cień kart — bliżej druku niż interfejsu. */
.ei-tier--premium .ei-offer:hover {
  box-shadow: 0 1px 2px rgba(16, 18, 22, .05), 0 22px 45px -25px rgba(16, 18, 22, .35);
}

/* Cena to główna liczba na tej stronie — dostaje pół stopnia więcej. */
.ei-tier--premium .ei-offer__amount { font-size: 1.9rem; }

/* =========================================================================
   Układy hero per wariant
   -------------------------------------------------------------------------
   Trzy landingi tego samego dewelopera nie mogą czytać się jak trzy kopie
   jednego szablonu. Różnicujemy je układem, a nie kolorem — kolorystyka jest
   wspólna, bo to marka.

   urban  (Piastowska)   treść po lewej, karta formularza po prawej, liczby
                         pasem pod spodem. Domyślny układ .ei-hero--split.
   estate (Łapalicka)    formularz po LEWEJ, treść po prawej. Osiedle domów
                         sprzedaje się dłuższą opowieścią, a odwrócenie kolumn
                         zmienia rytm strony od pierwszego ekranu.
   villa  (Jaśminowy)    jedna kolumna wyśrodkowana, formularz pod treścią,
                         liczby w rzędzie. Przy jednym domu na sprzedaż układ
                         dwukolumnowy wygląda na pusty.
   ====================================================================== */


/* =========================================================================
   Jedna oferta w inwestycji - prezentacja zamiast kafelka
   -------------------------------------------------------------------------
   Jaśminowy Stok III ma na sprzedaż jeden dom. Zestawienie z filtrami,
   przełącznikiem widoku i siatką kafelków było tam interfejsem bez zadania,
   a sam kafelek na środku pustej sekcji czytał się jak resztka po filtrowaniu.

   Solo rozkłada ofertę na dwie kolumny: rzut w pełnym rozmiarze po lewej,
   dane i cena po prawej. Filtry i przełącznik i tak się nie renderują,
   bo wymagają co najmniej trzech pozycji.
   ====================================================================== */

.ei-offers__grid--solo { grid-template-columns: 1fr; max-width: none; }

@media (min-width: 900px) {
  .ei-offers__grid--solo .ei-offer {
    display: grid;
    grid-template-columns: minmax(0, 1.15fr) minmax(0, 1fr);
    align-items: stretch;
    gap: 0;
    padding: 0;
    overflow: hidden;
  }

  /* Rzut wypełnia lewą kolumnę na całą wysokość karty. */
  .ei-offers__grid--solo .ei-offer__plan {
    grid-column: 1;
    grid-row: 1 / span 5;
    margin: 0;
    border: 0;
    border-right: 1px solid var(--ei-line);
    border-radius: 0;
  }
  .ei-offers__grid--solo .ei-offer__plan.ei-ratio::before { padding-top: 0; }
  .ei-offers__grid--solo .ei-offer__plan { position: relative; min-height: 100%; }

  .ei-offers__grid--solo .ei-offer__head,
  .ei-offers__grid--solo .ei-offer__specs,
  .ei-offers__grid--solo .ei-offer__note { grid-column: 2; margin-inline: var(--ei-offer-pad); }
  .ei-offers__grid--solo .ei-offer__head  { margin-top: var(--ei-offer-pad); }
  .ei-offers__grid--solo .ei-offer__note  { margin-bottom: var(--ei-offer-pad); }

  .ei-offers__grid--solo .ei-offer__foot {
    grid-column: 2;
    margin: auto 0 0;
    padding: 1.25rem var(--ei-offer-pad) var(--ei-offer-pad);
  }

  /* Przy jednej ofercie cena jest bohaterem sekcji, nie przypisem. */
  .ei-offers__grid--solo .ei-offer__title  { font-size: clamp(1.6rem, 2.4vw, 2.1rem); }
  .ei-offers__grid--solo .ei-offer__amount { font-size: clamp(2rem, 3vw, 2.6rem); }
  .ei-offers__grid--solo .ei-offer__specs dt,
  .ei-offers__grid--solo .ei-offer__specs dd { font-size: 1rem; }
  .ei-offers__grid--solo .ei-offer__specs > div { padding-block: .75rem; }
}

/* =========================================================================
   Oferty wariantu estate - osiedle domów
   -------------------------------------------------------------------------
   Łapalicka ma osiem domów, które różnią się właściwie tylko ogrodem i ceną:
   metraż przyjmuje dwie wartości, pokoi wszędzie cztery. Przy takim zestawie
   kupujący nie przegląda, tylko PORÓWNUJE - a produktem jest rzut.

   Karty lokali są tu PIONOWE (1131x1600). Wciśnięte w poziome pudełko 4:3
   zostawały znaczkiem wielkości paznokcia. Karta idzie więc w poziomie:
   rzut w pełnej wysokości po lewej, dane i cena po prawej. Dwie takie karty
   mieszczą się w rzędzie i nadal da się je porównać.
   ====================================================================== */

@media (min-width: 900px) {
  .ei-variant--estate .ei-offers__grid:not(.is-list):not(.ei-offers__grid--solo) {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: clamp(1.25rem, 2.5vw, 2rem);
  }

  .ei-variant--estate .ei-offers__grid:not(.is-list) .ei-offer {
    display: grid;
    grid-template-columns: minmax(0, .78fr) minmax(0, 1fr);
    align-items: stretch;
    gap: 0;
    padding: 0;
    overflow: hidden;
  }

  /* Rzut wypełnia lewą kolumnę na całą wysokość karty, bez przycinania
     - proporcje pliku niesie ei-ratio--auto, więc nic z niego nie ginie. */
  /*
   * Pudełko rzutu zachowuje proporcje PLIKU i nie rozciąga się na wysokość
   * karty. Rozciągnięte, z obrazem pływającym w środku przez object-fit,
   * zostawiało szerokie białe marginesy po bokach rzutu - a przy karcie bez
   * notatki rzut robił się przy tym mniejszy niż u sąsiada.
   *
   * Skoro pudełko ma proporcje obrazu, obraz wypełnia je co do piksela
   * i marginesy znikają. Wysokość karty wyznacza teraz rzut, a nie tekst.
   */
  .ei-variant--estate .ei-offers__grid:not(.is-list) .ei-offer__plan {
    grid-column: 1;
    grid-row: 1 / span 5;
    align-self: start;
    margin: 0;
    border: 0;
    border-right: 1px solid var(--ei-line);
    border-radius: 0;
    background: #fff;
  }
  .ei-variant--estate .ei-offers__grid:not(.is-list) .ei-offer__plan img { object-fit: cover; padding: 0; }

  .ei-variant--estate .ei-offers__grid:not(.is-list) .ei-offer__head,
  .ei-variant--estate .ei-offers__grid:not(.is-list) .ei-offer__specs,
  .ei-variant--estate .ei-offers__grid:not(.is-list) .ei-offer__note {
    grid-column: 2;
    margin-inline: var(--ei-offer-pad);
  }
  .ei-variant--estate .ei-offers__grid:not(.is-list) .ei-offer__head { margin-top: var(--ei-offer-pad); }
  .ei-variant--estate .ei-offers__grid:not(.is-list) .ei-offer__note { margin-bottom: var(--ei-offer-pad); }
  .ei-variant--estate .ei-offers__grid:not(.is-list) .ei-offer__foot {
    grid-column: 2;
    margin: auto 0 0;
    padding: 1.1rem var(--ei-offer-pad) var(--ei-offer-pad);
  }

  .ei-variant--estate .ei-offer__title  { font-size: 1.5rem; }
  .ei-variant--estate .ei-offer__amount { font-size: 1.85rem; }
}

/* Poniżej 1240 px dwie takie karty robią się za ciasne - wracamy do jednej
   w rzędzie, nadal w układzie poziomym. */
@media (min-width: 900px) and (max-width: 1240px) {
  .ei-variant--estate .ei-offers__grid:not(.is-list):not(.ei-offers__grid--solo) {
    grid-template-columns: 1fr;
  }
}

/* =========================================================================
   Nagłówek ofert z filtrami w jednym rzędzie
   -------------------------------------------------------------------------
   Nadtytuł, H2, akapit i ramka filtrów na pełną szerokość zjadały pół ekranu,
   zanim pokazała się pierwsza oferta. Opis trzyma teraz lewą kolumnę,
   sterowanie prawą.

   Prawa kolumna mieści też znak inwestycji, jeśli jest - stoi nad filtrami,
   bo marka przedstawia, a filtry obsługują.
   ====================================================================== */

.ei-offers__top { margin-bottom: clamp(1.75rem, 3.5vw, 2.75rem); }

/*
 * Większe znaczniki tylko w układzie split. Obok nagłówka w skali 3 rem
 * wyglądały jak przypis, a nie jak sterowanie - ale to argument o TYM układzie,
 * nie o całym motywie, więc reszta landingów zostaje bez zmian.
 */
.ei-offers__top--split .ei-chip span {
  min-height: 48px;
  padding: .55rem 1.25rem;
  font-size: .9375rem;
  border-color: var(--ei-line-control);
}
.ei-offers__top--split .ei-filters__legend { font-size: .8125rem; }

/*
 * Ciasna ramka filtrów.
 *
 * W kolumnie obok nagłówka trzy osobne rzędy - znaczniki, przełącznik z listą,
 * a pod nimi „Wyczyść filtry" i licznik, każde w swojej linii - zostawiały
 * w środku tyle powietrza, że ramka była wyższa niż cały tekst obok.
 * Dolne sterowanie mieści się w jednym rzędzie: przełącznik, sortowanie,
 * licznik, a czyszczenie dosunięte do prawej krawędzi.
 */
.ei-offers__top--split .ei-filters {
  gap: 1rem;
  padding: 1.15rem 1.25rem;
  margin-bottom: 0;
}
.ei-offers__top--split .ei-filters__row {
  gap: .6rem .85rem;
  padding-top: 1rem;
}
/* Lista sortowania nie potrzebuje w tej kolumnie własnej szerokości minimalnej
   - bez tego cały rząd nie mieścił się i „Wyczyść filtry" spadało do drugiej
   linii, czyli wracała ta sama pustka, którą usuwamy. */
.ei-offers__top--split .ei-select select { min-width: 0; }

/*
 * Etykieta „Sortuj" znika wzrokowo, ale nie z dostępności: pole zostaje
 * wewnątrz <label>, więc czytnik ekranu nadal ją odczyta. Rząd potrzebował
 * 539 px przy 503 dostępnych i to ona była najtańszą rzeczą do oddania -
 * lista i tak zaczyna się od słowa „Domyślnie", a alternatywą było łamanie
 * rzędu, czyli powrót do pustki, którą tu usuwamy.
 */
.ei-offers__top--split .ei-select__label {
  position: absolute;
  width: 1px; height: 1px;
  margin: -1px; padding: 0; border: 0;
  overflow: hidden; clip-path: inset(50%); white-space: nowrap;
}
.ei-offers__top--split .ei-filters__count { margin: 0; white-space: nowrap; }
.ei-offers__top--split .ei-filters__reset { margin-left: auto; }
.ei-offers__top--split .ei-switch { min-height: 36px; }
.ei-offers__top .ei-head { margin-bottom: 0; }

@media (min-width: 1025px) {
  .ei-offers__top--split {
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(360px, 47%);
    align-items: start;
    gap: clamp(2rem, 4vw, 3.5rem);
  }
  .ei-offers__aside { display: grid; justify-items: end; gap: 1.25rem; }
  .ei-offers__aside .ei-filters { width: 100%; margin: 0; }
}

/* Poniżej progu wracają pod siebie - dwie kolumny na tablecie zostawiłyby
   filtrom szerokość, w której znaczniki łamałyby się po jednym w rzędzie. */
@media (max-width: 1024px) {
  .ei-offers__aside { margin-top: 1.75rem; }
  .ei-offers__aside .ei-invlogo { margin-bottom: 1.25rem; }
}
