/* =========================================================================
   app.css — novi stilovi (CUBE CSS). Vrijedi za NOVE MVC komponente
   (katalog, detalj…). Legacy sloj (legacy.css) i dalje stilizira chrome i stare
   stranice. Obje datoteke učitava layouts/main.php, legacy.css prvi.
   Slojevi: TOKENS -> COMPOSITION -> UTILITY -> BLOCK -> EXCEPTION.
   ========================================================================= */

/* ---------- TOKENS (dizajn varijable) ---------- */
:root {
  color-scheme: light;

  --clr-bg: #f5f7fa;
  --clr-surface: #ffffff;
  --clr-ink: #141a1f;
  --clr-ink-soft: #475467; /* meta-tekst na kartici (čitljiviji od --clr-muted) */
  --clr-muted: #667085;
  --clr-heart: #e11d48;
  --clr-border: #e6e9ee;
  /* Nepopunjena pozicija u galeriji. NAMJERNO svjetlija od --clr-border: ta ista
     siva stoji ispod slike dok se učitava, pa je prazna pozicija u istoj nijansi
     izgledala kao fotografija koja se nije učitala. Vrijednost je birana da
     istovremeno ostane vidljiva na bijeloj stranici (kontrast 1.13) i da se
     odvoji od sive koja znači "učitavam" (1.07). Ne svjetlije od ovoga —
     iznad ~#f2f5f9 ploha se stopi s bijelim razmacima mozaika. */
  --clr-placeholder: #eef1f5;

  /* Akcent je BRENDOVA PLAVA, ne više teal. Paleta (--brand-*) živi u legacy.css
     jer legacy stranice učitavaju samo nju; fallback drži app.css upotrebljivim
     i sam za sebe, isti dogovor kao kod --content-width niže.
     NE upisivati hex ovdje — mijenja se --brand-500 u legacy.css. */
  --clr-accent: var(--brand-500, #044f87);
  --clr-accent-2: var(--brand-600, #08396a);
  --clr-accent-rgb: var(--brand-rgb, 4, 79, 135);
  /* Cijena je bila #0b3d2e (tamnozelena) — jedina zelena u sadržaju i glavni
     razlog zašto se činilo da se boje miješaju. Sad najtamnija brend plava. */
  --clr-price: var(--brand-700, #062a47);

  /* razmaci (modularna skala) */
  --space-2xs: 0.25rem;
  --space-xs: 0.5rem;
  --space-s: 0.75rem;
  --space-m: 1rem;
  --space-l: 1.5rem;
  --space-xl: 2.5rem;
  --space-2xl: 4rem;

  /* tipografija (fluid) */
  --step-0: 1rem;
  --step-05: 1.0625rem; /* naslov kartice — 1px iznad tijela teksta */
  --step-1: 1.15rem;
  --step-2: clamp(1.35rem, 1.15rem + 0.8vw, 1.75rem);
  --step-3: clamp(1.8rem, 1.4rem + 2vw, 2.6rem);

  --radius: 16px;
  --radius-l: 20px; /* kartica oglasa — mekši, "premium" kut */
  --radius-s: 10px;
  --shadow-sm: 0 1px 2px rgba(16, 24, 40, 0.06), 0 1px 3px rgba(16, 24, 40, 0.08);
  --shadow-md: 0 6px 16px rgba(16, 24, 40, 0.08), 0 14px 30px rgba(16, 24, 40, 0.06);
  --shadow-lg: 0 10px 24px rgba(16, 24, 40, 0.1), 0 22px 48px rgba(16, 24, 40, 0.1);

  --measure: 66ch;

  /* Širina bočnog stupca — JEDAN izvor za oba ekrana: filteri na listingu
     (lijevo) i forma za upit na detalju (desno). Da se ne raziđu.
     Donja granica je 18.75rem = 300px: ispod toga je panel tijesan (rasponi
     "od–do" i checkbox stupci su morali biti stisnuti da stanu u 238px).
     PAZI: 300px donja granica radi SAMO uz minimum kartice od 15rem u .grid.
     Sa 16rem bi na 960px stupac rezultata pao na 524px (2 kartice traže 536)
     → jedna kartica po redu, a na 1280px bi 3 kartice falile za 4px.
     Gornja granica 20rem = 320px, dosegne se od ~1455px. */
  --sidebar-width: clamp(18.75rem, 22vw, 20rem);
}

/* ---------- COMPOSITION (layout primitivi, bez dizajna) ---------- */
.wrapper {
  /* Isti token kao navigacija/footer u legacy.css — inače se main i nav razilaze
     do 40px sa svake strane iznad ~1333px. Fallback ako app.css ide sam. */
  width: var(--content-width, min(90%, 85rem));
  margin-inline: auto;
}

/* Legacy `main { margin: 64px auto }` (legacy.css) zbrajao se s padding-block
   blokova ispod → 104px od navigacije do breadcrumba. Vertikalni ritam nosi
   blok, ne main. Namjerno DVA pravila: `:has()` u istoj selektorskoj listi
   srušio bi i .catalog na preglednicima bez podrške (lista nije praštajuća). */
main.catalog {
  margin-block-start: 0;
}
main:has(> .property) {
  margin-block-start: 0;
} /* detalj: main.none > article.property */

/* vertikalni ritam: razmak samo IZMEĐU susjednih elemenata */
.flow > * + * {
  margin-block-start: var(--flow-space, var(--space-m));
}

/* Responsivna mreža kartica bez media queryja. Minimum je 15rem (240px) — spušten
   sa 16rem kad je panel dobio donju granicu od 300px; inače 3 kartice na 1280px
   fale za 4px, a na 960px se gubi i drugi stupac.
   4 stupca traže 4×240 + 3×24 = 1032px, a stupac rezultata nigdje ne dosegne
   toliko (najviše 1000px pri 1920) → mreža nikad ne pada na 4 preuske kartice.
   Ispod ~226px se cijena lomi u dva reda; najuža kartica ovdje je 250px.
   Uz --sidebar-width: clamp(18.75rem, 22vw, 20rem):
      960px → sadržaj  864, panel 300 → stupac  524 → 2×250
     1024px → sadržaj  922, panel 300 → stupac  582 → 2×279
     1280px → sadržaj 1152, panel 300 → stupac  812 → 3×255
     1440px → sadržaj 1296, panel 317 → stupac  939 → 3×297
     1920px → sadržaj 1360, panel 320 → stupac 1000 → 3×317
   Ako se ikad mijenja --content-width, --sidebar-width ili gap, PROVJERI ovaj
   račun — prag je izveden iz njih, ne proizvoljan. */
.grid {
  display: grid;
  gap: var(--space-l);
  grid-template-columns: repeat(auto-fill, minmax(min(100%, 15rem), 1fr));
}

/* horizontalna grupa s omatanjem */
.cluster {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-s);
  align-items: center;
}

/* ---------- UTILITY ---------- */
.text-muted {
  color: var(--clr-muted);
}
.measure {
  max-inline-size: var(--measure);
}
/* tekst samo za čitače ekrana (npr. label na ikonskom gumbu) */
.visually-hidden {
  position: absolute;
  inline-size: 1px;
  block-size: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

/* ---------- BLOCK: home-hero (naslovnica) ----------
   Nasljednik legacy `header.index`. Taj je bio visok 100vh (1035px na ekranu od
   1080), pa se do prvog oglasa moralo skrolati cijeli zaslon. Ovdje visinu
   diktira sadržaj uz razuman padding — hero završi oko 380–460px i prvi red
   kartica proviri iznad pregiba. */
/* KLJUČNO: bez ovoga naslovnica nije puna širina. Legacy `main` je 12-stupčani
   grid ograničen na --content-width, a `section { grid-column: 1 / 8 }` gura
   svaku sekciju u 7 od 12 stupaca — hero bi bio ~790px i bez pozadine do ruba.
   Širinu sadržaja nose .home-hero__inner i .featured.wrapper, ne main. */
main.home {
  display: block;
  width: 100%;
  margin: 0;
}

.home-hero {
  padding-block: var(--space-2xl);
  /* Fotografija je ostala iz legacy heroa (images/head.jpg). Zastor je NAGNUT:
     gore .62 (slika se vidi), dolje .90 — ondje su uvodna rečenica i polje za
     pretragu, a oni su na --clr-muted i trebaju mirniju podlogu. Ravnomjeran
     zastor bi ili sakrio sliku ili srušio čitljivost teksta. */
  background:
    radial-gradient(120% 140% at 12% 0%, rgba(13, 148, 136, 0.12), transparent 60%),
    linear-gradient(rgba(255, 255, 255, 0.62), rgba(255, 255, 255, 0.9)),
    url('/images/head.jpg') center / cover no-repeat;
  border-block-end: 1px solid var(--clr-border);
}
.home-hero__inner {
  width: var(--content-width, min(90%, 85rem));
  margin-inline: auto;
  text-align: center;
}
.home-hero__title {
  margin: 0;
  font-family: var(--font-header, 'Montserrat', sans-serif);
  font-size: var(--step-3);
  font-weight: 700;
  letter-spacing: -0.02em;
  line-height: 1.15;
  text-transform: none; /* legacy h1 je uppercase */
  color: var(--clr-ink);
  border: 0; /* legacy h1 ima border-bottom */
  padding-block-end: 0;
}
.home-hero__lead {
  margin: var(--space-s) auto 0;
  max-inline-size: 56ch;
  font-size: var(--step-0);
  line-height: 1.6;
  color: var(--clr-muted);
}
/* Klasična pretraga: vrsta · grad · cijena od–do · gumb. Polja su .field iz
   filter panela, pa im veličina i fokus dolaze odande — ovdje je samo raspored.
   Bijela ploha ispod: forma stoji na fotografiji i bez podloge se gubi. */
.home-hero__search {
  display: flex;
  flex-wrap: wrap;
  align-items: end;
  gap: var(--space-s);
  max-inline-size: 58rem;
  margin: var(--space-l) auto 0;
  padding: var(--space-m);
  background: rgba(255, 255, 255, 0.92);
  border: 1px solid var(--clr-border);
  border-radius: var(--radius);
  box-shadow: var(--shadow-md);
  backdrop-filter: blur(2px);
  text-align: start; /* hero je centriran, polja nisu */
}
.home-hero__field {
  flex: 1 1 11rem;
  min-inline-size: 0;
}
.home-hero__field--price {
  flex-basis: 14rem;
}
/* Gradovi trebaju više prostora: kontrola multi-selecta nosi chipove/sažetak. */
.home-hero__field--city {
  flex-basis: 14rem;
}
/* SVE kontrole u herou na istu visinu. 2.6rem nije proizvoljno — to je visina
   koju .multiselect__control već ima, pa se nadograđeni grad poklapa s ostalima
   umjesto da se visina pogađa paddingom (padding + line-height se razlikuju
   između <input>, <select> i <button>, pa ista vrijednost daje tri visine).
   [multiple] je izuzet: to je izvorni select sa size="6" koji JS ionako skriva. */
.home-hero__search .field__input:not([multiple]),
.home-hero__search .multiselect__control,
.home-hero__submit {
  min-block-size: 2.6rem;
}
.home-hero__submit {
  flex: 0 0 auto;
  padding-block: 0; /* visinu drži min-block-size, ne padding */
  padding-inline: var(--space-l);
}
.home-hero__submit:disabled {
  opacity: 0.5;
  cursor: not-allowed;
}
/* Uputa zašto je gumb onesposobljen — puna širina ispod polja. */
.home-hero__hint {
  flex: 1 1 100%;
  margin: 0;
  display: flex;
  align-items: center;
  gap: var(--space-2xs);
  font-size: 0.85rem;
  color: var(--clr-muted);
}
.home-hero__hint[hidden] {
  display: none;
}
.home-hero__hint::before {
  content: '';
  inline-size: 0.5rem;
  block-size: 0.5rem;
  flex: 0 0 auto;
  border-radius: 999px;
  background: var(--clr-accent);
}
@media (max-width: 45rem) {
  .home-hero__field,
  .home-hero__field--price {
    flex-basis: 100%;
  }
  .home-hero__submit {
    flex: 1 1 100%;
  }
}
/* Prečaci na kategorije — kategorija je dio putanje, pa ne može u GET formu. */
.home-hero__links {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: var(--space-xs);
  margin-block-start: var(--space-l);
}
@media (max-width: 45rem) {
  .home-hero__search {
    flex-wrap: wrap;
  }
  .home-hero__submit {
    flex: 1 1 100%;
  }
}

/* Hamburger je sada <button> (bio <div> — nefokusabilan i nenajavljen). Gasimo
   zadani izgled gumba; položaj, veličinu i animaciju crtica i dalje daje
   legacy.css (@media max-width: 900px, .burger-container / .bar). */
#ham .burger-container {
  appearance: none;
  padding: 0;
  border: 0;
  background: none;
  color: inherit;
  font: inherit;
  /* Centriranje preuzimamo flexom umjesto legacy trika `top: 50%; margin: -4px
     auto 0`. Taj trik je pretpostavljao <div>, čiji sadržaj kreće od vrha —
     <button> svoj sadržaj centrira SAM, pa su se dva centriranja zbrajala i
     crtice su padale ispod sredine. */
  display: flex;
  align-items: center;
  justify-content: center;
}
/* 2 ID-a + klasa (2,1,0) nadjačava legacy `.burger-container #burger` (1,1,0). */
#ham .burger-container #burger {
  top: auto;
  margin: 0;
}
#ham .burger-container:focus-visible {
  outline: 2px solid #fff;
  outline-offset: -4px;
}

/* ---------- BLOCK: featured (istaknuti oglasi na naslovnici) ----------
   Živi unutar legacy naslovnice (funkcije.php index()), ali je čisto novi dizajn.
   Legacy `section { grid-column: 1 / 8 }` ovdje ne škodi jer roditelj
   `section.full` nije grid, ali reset stoji za slučaj da to netko promijeni. */
.featured {
  grid-column: auto;
  padding-block: var(--space-2xl);
}
/* Ovo je <header> element, pa ga gađaju legacy pravila pisana za zaglavlje
   stranice: legacy.css:489 (`background: #fff`, flex-column, border-bottom) i —
   gore — legacy.css:3742 `@media (max-width: 900px) { header { height: 45px;
   overflow: hidden } }`, što je pravilo za mobilni hamburger. Posljedica je bila
   siva ploha i naslov odrezan na 45px ispod 900px. Sve gasimo eksplicitno;
   klasa (0-1-0) pobjeđuje element u media queryju bez !important.
   Isti razlog i isti popravak kao kod .property__header. */
.featured__head {
  display: block; /* ne flex-column s align-items: center */
  block-size: auto; /* ne 45px */
  overflow: visible; /* ne hidden */
  background: none;
  border-block-end: 0;
  margin-block-end: var(--space-xl);
  text-align: center;
}
.featured__title {
  /* Legacy `h2` je uppercase, weight 400 i centriran preko `.index h2` — ovdje
     nema klase .index, pa to pravilo ni ne matcha; ostatak gasimo eksplicitno. */
  margin: 0;
  font-family: var(--font-header, 'Montserrat', sans-serif);
  font-size: var(--step-3);
  font-weight: 700;
  letter-spacing: -0.02em;
  line-height: 1.15;
  text-transform: none;
  color: var(--clr-ink);
}
.featured__lead {
  margin: var(--space-s) auto 0;
  max-inline-size: 52ch;
  font-size: var(--step-0);
  line-height: 1.6;
  color: var(--clr-muted);
}
/* 4 KARTICE PO REDU pri punoj širini (1360px): 4×272 + 3×24 = 1160 ≤ 1360, a
   peti stupac bi tražio 1456 — dakle nikad 5. Niže se sam spušta na 3 / 2 / 1,
   bez ijednog media queryja. NIJE .grid (ondje je minimum 15rem zbog užeg
   stupca uz filter panel, što bi ovdje dalo 5 po redu). */
.featured__grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 17rem), 1fr));
  gap: var(--space-l);
}

/* ---------- BLOCK: catalog ---------- */
/* Gore zbijeno (breadcrumb pripada chrome-u iznad), dolje puni razmak do footera. */
.catalog {
  padding-block: var(--space-l) var(--space-xl);
}
.catalog__title {
  font-family: var(--font-header, 'Montserrat', sans-serif);
  font-size: var(--step-3);
  font-weight: 700;
  letter-spacing: -0.02em;
  color: var(--clr-ink);
}
.catalog__count {
  color: var(--clr-muted);
  font-size: 0.95rem;
}

/* Dvostupčani layout: filteri sticky (LIJEVO, konvencija portala) + oglasi (desno).
   <main> ima točno dva djeteta — aside i section. Aside je i u DOM-u prvi, pa je
   tab redoslijed isti kao vizualni. */
.catalog__layout {
  display: grid;
  gap: var(--space-xl);
  grid-template-columns: var(--sidebar-width) 1fr; /* filteri su uski — rezultati dobivaju širinu */
  align-items: start;
}
/* KLJUČNO: legacy legacy.css pina SVAKI <section> na `grid-column: 1 / 8` i SVAKI
   <aside> na `9 / 13` (njegov 12-stupčani main). Naš grid ima 2 stupca, pa linija
   13 ne postoji — preglednik izmisli 10 implicitnih trakova, gurne panel skroz
   desno i između svakog traka ubaci gap od 2.5rem. Ništa u app.css dosad nije
   diralo `grid-column`, pa je legacy pravilo prolazilo. Vraćamo auto-placement. */
.catalog__layout > .catalog__aside,
.catalog__layout > .catalog__main {
  grid-column: auto;
}

/* Grid ćelija se po defaultu NE smije stisnuti ispod min-content sadržaja. Chipovi
   su `flex-wrap: nowrap` pa im je min-content zbroj svih chipova (~1510px) — bez
   ovoga zaglavlje rastegne stupac i cijela stranica dobije horizontalni scroll.
   `min-inline-size: 0` vraća ćeliju na stvarnu širinu, a .chips onda skrola sam. */
.catalog__layout > * {
  min-inline-size: 0;
}

.catalog__aside {
  position: sticky;
  top: var(--space-l);
}
/* Legacy `legacy.css:3495` — `@media (max-width: 1050px) { aside { margin-top: 32px } }`.
   BEZ media queryja, namjerno: prije je ovaj reset stajao pod min-width 60.0625rem
   pa je gasio legacy marginu SAMO u pojasu 961–1050px. Ispod 960px, gdje layout
   pada na jedan stupac, margina se vraćala i ZBRAJALA s razmakom grida:
   40px (gap --space-xl) + 32px = 72px između naslova i panela.
   Razmak u oba smjera drži `gap` na .catalog__layout, pa aside ne treba vlastitu. */
.catalog__layout > .catalog__aside {
  margin-block-start: 0;
}

@media (min-width: 60.0625rem) {
  /* Panel je ~750px visok. Sticky element viši od viewporta pinne se na `top` i
     NIKAD se ne pomakne — donji dio (gumb "Traži") tad je trajno ispod ruba
     ekrana i ne može se doskrolati. Ograniči ga na visinu prozora i pusti da
     skrola iznutra. Ako sadržaj stane, ova dva svojstva ne rade ništa.
     SAMO na desktopu: ispod 60rem panel je `position: static` i u normalnom
     toku iznad rezultata — tamo bi ograničenje visine dalo ugniježđeni scroll. */
  .catalog__aside {
    max-block-size: calc(100dvh - var(--space-l) * 2);
    overflow-y: auto;
    /* Ista tanka traka kao kod .chips — 12px sivo-plava iz legacy.css je pregruba. */
    scrollbar-width: thin;
    scrollbar-color: rgba(102, 112, 133, 0.35) transparent;
  }
}

/* Zaglavlje preko OBA stupca: breadcrumb, naslov, pretraga po pojmu, lokacije.
   Zato filter panel i prva kartica kreću na istoj liniji — da naslov živi u
   desnom stupcu, panel bi visio uz njega i ništa se ne bi poklapalo. */
/* Selektor mora biti bar jednako specifičan kao reset iznad (0-2-0), inače
   zaglavlje dobije `grid-column: auto` i padne u uski prvi stupac. */
.catalog__layout > .catalog__head {
  grid-column: 1 / -1;
  /* 40px do naslova. Iznad breadcrumba je 24px (.catalog padding-block-start), pa
     bi na 24 stajao jednako udaljen od chromea i od naslova i ne bi pripadao
     nijednom — a breadcrumb JE navigacija i grupira se s gornjim. Uz to je h1 na
     desktopu uvijek 41.6px (--step-3 je iznad 960px na gornjoj granici), a 24px
     je tek 0.58 njegove visine. */
  --flow-space: var(--space-xl);
}

/* Zona oko naslova govorila je 32/72px, a ostatak stranice 16/24/40 — nijedna od
   te dvije vrijednosti nije na skali. Oba curka su iz legacy.css:
   1. #navTo margin-bottom 32px kolapsom pobijedi --flow-space iznad naslova;
   2. h1 margin-bottom 32px (--h1-margin-bottom) NE izlazi iz .catalog__head jer
      je grid stavka ne propušta, pa se ZBRAJA s grid gapom od 40 → 72px.
   Nakon reseta: breadcrumb → 24px → h1 → 40px (grid gap) → sadržaj. */
.catalog__head #navTo {
  margin-block-end: 0;
}

/* Legacy `h1 { border-bottom: 1px solid #eee; padding-bottom: 12px }` iz legacy.css
   crtao je crtu samo preko desnog stupca — ovdje nosimo vlastiti ritam. */
.catalog__head .catalog__title {
  /* SAMO dno. `margin: 0` ovdje je specifičnošću (0-2-0) tukao `.flow > * + *`
     (0-1-0) i gasio razmak iznad naslova — --flow-space tad nije radio ništa.
     Legacy h1 ionako ima `margin: 0 0 32px 0`, pa je vrh već nula. */
  margin-block-end: 0;
  border: 0;
  padding-block-end: 0;
  line-height: 1.15;
}

/* SVG sprite je prvo dijete sekcije i nema veličinu — .flow bi inače dodao
   razmak iznad prvog vidljivog bloka. */
.catalog__main > svg:first-child + * {
  margin-block-start: 0;
}

/* Pretraga po pojmu (.catalog__search*) je uklonjena — polje `q` je preseljeno
   u filter panel kao obično .field, pa nosi isti stil kao ostala polja. */

/* U uskom sticky stupcu polja idu jedno ispod drugog — zbij vertikalni ritam
   (inače je svaki razmak --space-m = 1rem, previše zračno). */
.catalog__aside .search {
  gap: var(--space-s);
}
/* Panel je uzak: polja idu jedno ispod drugog, svako punom širinom stupca.
   `flex-wrap: nowrap` NIJE kozmetika: bazni .search__row je vodoravna traka s
   `flex-wrap: wrap`, a mi mu ovdje okrećemo smjer u `column`. U stupcu je glavna
   os okomita, pa `wrap` znači "prelomi u novi STUPAC" i preostala okomita praznina
   linije završi na zadnjem polju — fieldset "Ausstattung" je zato bio 178px visok
   umjesto 112px, što je davalo rupu do gumba "Traži". (Izmjereno: 178 → 112.) */
.catalog__aside .search__row {
  flex-direction: column;
  flex-wrap: nowrap;
  align-items: stretch;
  gap: var(--space-s);
}
/* Na mobitelu 24px umjesto 12px. Razlog nije estetika nego dodir: mišem je 12px
   dovoljno jer kursor pogađa piksel, prstom se lako okrzne susjedno polje —
   pogotovo kod selecta, gdje krivi dodir odmah otvara padajući popis. */
@media (max-width: 60rem) {
  .catalog__aside .search__row {
    gap: var(--space-l);
  }
}
/* U stupcu je glavna os okomita, pa flex-basis:12rem (iz .field) postaje VISINA i
   rasteže polja — vrati ih na prirodnu visinu (basis auto, bez grow/shrink). */
.catalog__aside .field {
  flex: 0 0 auto;
  min-inline-size: 0;
}
/* Dva kratka polja (more, ID) dijele jedan red. align-items:end drži inpute
   poravnate i kad se jedna labela prelomi u dva reda. */
.field-pair {
  display: flex;
  align-items: end;
  gap: var(--space-s);
}
.catalog__aside .field-pair > .field {
  flex: 1 1 0;
  min-inline-size: 0;
}
/* U stupcu "Traži" nosi cijelu širinu (glavna akcija), "Poništi" ostaje uzak. */
.catalog__aside .search__actions {
  margin-inline-start: 0;
  gap: var(--space-xs);
}
.catalog__aside .search__actions .btn--primary {
  flex: 1 1 auto;
  padding-block: 0.8rem;
}
.catalog__aside .search__actions .btn--ghost {
  flex: 0 0 auto;
}
.catalog__bar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-m);
  flex-wrap: wrap;
  --flow-space: var(--space-l); /* više zraka IZNAD linije (od breadcrumba/naslova) */
}
/* Grupiranje: linija (broj rezultata + sort) i chipovi su OBOJE kontrole nad
   skupom rezultata, pa idu zbijeno — 16px. Prije je ovdje bilo 24px, a do mreže
   16px, što je chipove vizualno lijepilo za kartice umjesto za kontrole. */
.catalog__bar + * {
  --flow-space: var(--space-m);
}
/* Na mobitelu se bar UVIJEK prelomi: broj rezultata (~182px) i sort (~306px)
   traže ~504px, a najširi telefon daje 387px. Time nastaju tri uzastopna retka
   na istih 16px (count → sort → chipovi) i gornje grupiranje se raspada — sve
   čita kao jedan neizdiferenciran stog.
   Rješenje je ZBITI bar iznutra, a ne razmicati chipove: 16px prema chipovima
   tada je dvostruko od unutarnjih 8px, pa granicu nosi omjer, ne veličina.
   Stranica se usput skrati, umjesto da naraste. */
@media (max-width: 60rem) {
  .catalog__bar {
    flex-direction: column;
    align-items: stretch;
    gap: var(--space-xs);
  }
  /* Bez ovoga sort ostaje desno poravnat i u uskom stupcu izgleda odlutalo. */
  .catalog__sort {
    margin-inline-start: 0;
  }
}

/* Rezultati su druga cjelina: 40px prije mreže, koliko je i poslije nje (v.
   .pagination). Postavljeno na SAM blok rezultata, a ne na `.chips-rail + *` —
   chipovi se ne renderiraju kad kategorija nema gradova, pa bi mreža u tom
   slučaju naslijedila onih 16px od linije. */
.catalog__main > .grid,
.catalog__main > .text-muted {
  --flow-space: var(--space-xl);
}
.catalog__sort {
  display: flex;
  align-items: center;
  gap: var(--space-xs);
  margin-inline-start: auto;
}
.catalog__sort-label {
  color: var(--clr-muted);
  font-size: 0.95rem;
  white-space: nowrap; /* "Sortieren" se ne smije prelomiti od selecta */
}
.catalog__sort select {
  font: inherit;
  font-size: 0.95rem; /* isti kao .catalog__count */
  padding: 0.45rem 0.7rem;
  color: var(--clr-ink);
  background-color: var(--clr-surface);
  border: 1px solid var(--clr-border);
  border-radius: var(--radius-s);
  cursor: pointer;
  transition: border-color 0.15s ease;
}
.catalog__sort select:focus-visible {
  outline: 0;
  border-color: var(--clr-accent);
  box-shadow: 0 0 0 3px rgba(var(--clr-accent-rgb), 0.18);
}

/* lokacijski quick-filteri (chips) iznad rezultata — JEDAN red s horizontalnim
   scrollom. Prelamanjem u više redova zadnji red je ostajao poluprazan, pa je
   desno zjapila praznina; ovako je desni rub uvijek pun. */
/* Legacy `@media (max-width:900px) nav { height: 0; overflow: hidden }` (legacy.css)
   je pravilo za mobilni hamburger, ali pogađa SVAKI <nav> — i traku lokacija i
   straničenje. Bez ovoga oboje nestane na mobitelu (visina 0). */
.chips,
.pagination {
  block-size: auto;
}

.chips {
  display: flex;
  flex-wrap: nowrap;
  gap: var(--space-xs);
  overflow-x: auto;
  /* Zrak za scrollbar da ne siječe donji rub pilula. */
  padding-block-end: var(--space-xs);
  /* Vodoravni scroll ne smije okinuti "natrag" gestu preglednika. */
  overscroll-behavior-inline: contain;
  /* Globalni ::-webkit-scrollbar iz legacy.css je 12px sivo-plavi — pregrub ispod
     pilula, pa ga ovdje gasimo i crtamo tanku, diskretnu traku. */
  scrollbar-width: thin;
  scrollbar-color: rgba(102, 112, 133, 0.35) transparent;
}
/* Tračnica: nositelj pozicije za strelice. Strelice NE smiju biti unutar .chips —
   to je scroll kontejner, pa bi otklizale zajedno sa sadržajem. */
.chips-rail {
  position: relative;
}

/* Scrollbar gasimo TEK kad ga je JS zamijenio strelicama (klasu dodaje
   chips-rail.js). Bez JS-a ostaje trakica — inače nema nikakvog traga da ima još. */
.chips-rail.is-enhanced .chips {
  padding-block-end: 0;
  scrollbar-width: none;
}
.chips-rail.is-enhanced .chips::-webkit-scrollbar {
  display: none;
}

.chips-rail__btn {
  position: absolute;
  inset-block-start: 50%;
  translate: 0 -50%;
  z-index: 2;
  inline-size: 32px;
  block-size: 32px;
  display: grid;
  place-items: center;
  padding: 0;
  border: 1px solid var(--clr-border);
  border-radius: 999px;
  background: var(--clr-surface);
  box-shadow: var(--shadow-sm);
  color: var(--clr-ink);
  font-size: 1.1rem;
  line-height: 1;
  cursor: pointer;
  transition:
    background 0.15s ease,
    border-color 0.15s ease;
}
.chips-rail__btn:hover:not(:disabled) {
  background: var(--clr-bg);
  border-color: var(--clr-accent);
}
/* Na kraju trake gumb OSTAJE na mjestu, samo se priguši. NAMJERNO bez
   `pointer-events: none` (za razliku od .card__nav): gumb mora i dalje biti meta
   hit-testa da proguta klik, inače bi propao na chip ispod i odveo korisnika na
   grad koji nije birao. */
.chips-rail__btn:disabled {
  opacity: 0.3;
  cursor: default;
}
.chips-rail__btn--prev {
  inset-inline-start: 0;
}
.chips-rail__btn--next {
  inset-inline-end: 0;
}
.chips-rail__btn[hidden] {
  display: none;
}
/* Žlijeb za gumbe: 2rem gumb + .5rem zraka. Bez ovoga prvi i zadnji chip stoje
   ISPOD gumba — polupokriveni i teški za klik. Samo kad gumbi stvarno postoje. */
.chips-rail.is-enhanced.is-scrollable .chips {
  padding-inline: 2.5rem;
}
/* Dodirni ekrani listaju prstom — strelice bi samo prekrivale chipove. */
@media (hover: none) {
  .chips-rail__btn {
    display: none;
  }
  .chips-rail.is-enhanced .chips {
    padding-block-end: var(--space-xs);
    scrollbar-width: thin;
  }
  /* Žlijeb iznad je rezerviran za strelice, a njih ovdje nema — bez ovoga s obje
     strane ostaje 40px praznine bez ikakve funkcije, prvi chip je uvučen, a desni
     rub nije pun (v. razlog za scroll u komentaru uz .chips).

     Selektor MORA biti pun: media query ne dodaje specifičnost, pa `padding-inline`
     na `.chips-rail.is-enhanced .chips` (0-2-1) ne bi pobijedio pravilo iznad
     (0-3-1) — pravilo bi izgledalo primijenjeno, a ne bi radilo ništa. */
  .chips-rail.is-enhanced.is-scrollable .chips {
    padding-inline: 0;
  }
}

.chips::-webkit-scrollbar {
  height: 6px;
  background: transparent;
}
.chips::-webkit-scrollbar-track {
  background: transparent;
}
.chips::-webkit-scrollbar-thumb,
.chips::-webkit-scrollbar-thumb:horizontal {
  background: rgba(102, 112, 133, 0.35);
  border-radius: 999px;
}
.chips::-webkit-scrollbar-thumb:hover {
  background: rgba(102, 112, 133, 0.6);
}
.chip {
  display: inline-flex;
  align-items: center;
  /* U nowrap redu bez ovoga bi se pilule stisnule i tekst bi se prelomio. */
  flex: 0 0 auto;
  white-space: nowrap;
  gap: 0.4rem;
  padding: 0.35rem 0.8rem;
  font-size: 0.9rem;
  color: var(--clr-ink);
  background: var(--clr-surface);
  border: 1px solid var(--clr-border);
  border-radius: 999px;
  text-decoration: none;
  transition:
    border-color 0.15s ease,
    color 0.15s ease,
    background 0.15s ease;
}
.chip:hover {
  border-color: var(--clr-accent);
  color: var(--clr-accent-2);
}
.chip.is-active {
  color: #fff;
  background: var(--clr-accent);
  border-color: var(--clr-accent);
}
.chip__count {
  font-size: 0.72rem;
  color: var(--clr-muted);
}
.chip.is-active .chip__count {
  color: rgba(255, 255, 255, 0.8);
}
/* mobitel: jedan stupac (DOM redoslijed filteri → rezultati je već točan) */
@media (max-width: 60rem) {
  .catalog__layout {
    grid-template-columns: 1fr;
  }
  .catalog__aside {
    position: static;
  }
}

/* ---------- BLOCK: search (filter-bar) ---------- */
.search {
  display: flex;
  flex-direction: column;
  gap: var(--space-m);
  padding: var(--space-l);
  background: var(--clr-surface);
  border: 1px solid var(--clr-border);
  border-radius: var(--radius);
  box-shadow: var(--shadow-sm);
}
/* Sklopivi panel: <summary> nosi naslov, pa je jedan element i naslov i okidač.
   Na DESKTOPU je otvoren i neinteraktivan — ondje nema što skrivati, a slučajan
   klik na naslov ne smije sakriti filtre. */
.search__collapse > summary {
  display: block; /* gasi list-item + trokutić */
  list-style: none;
  cursor: pointer;
}
.search__collapse > summary::-webkit-details-marker {
  display: none;
}
/* Razmak od crte ispod naslova do prvog polja. NE dolazi sam od sebe: `gap` s
   .search razmiče djecu SAMOG .search (dakle <details> i gumbe), a <summary> i
   <div> su djeca <details>-a — običnog bloka bez gapa. Bez ovoga polja kreću
   priljubljena uz crtu, dok naslov iznad nje ima 8px zraka. */
.search__collapse > summary + * {
  margin-block-start: var(--space-l);
}
@media (min-width: 60.0625rem) {
  .search__collapse > summary {
    cursor: default;
    pointer-events: none;
  }
}
/* Strelica samo ondje gdje se panel stvarno sklapa. */
@media (max-width: 60rem) {
  /* BEZ crte na mobitelu. Kad je panel sklopljen — a ovdje se sklapa — crta
     ostaje visjeti iznad prazne plohe i ne razdvaja ništa. Uz to <summary> ovdje
     ima strelicu i tapka se, pa redak s crtom ispod čita kao poluotvoren
     accordion umjesto kao naslov. Strelica već označava da je to zaglavlje.
     Padding pada na 0 jer mu je referenca (crta) nestala — razmak do polja
     ostaje onaj s `summary + *`. Tuče .search__heading specifičnošću (0-1-1). */
  /* FLEX, a ne apsolutno pozicioniranje. Strelica je prije visjela na
     `inset-block-start: .35rem` — pogođenoj vrijednosti koja ne prati visinu
     retka, pa je stajala niže od teksta. Ovako je poravnava `align-items: center`
     i vrijednost se nema gdje raspariti. */
  .search__collapse > summary {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--space-xs);
    padding-block-end: 0;
    border-block-end: 0;
  }
  .search__collapse > summary::after {
    content: '';
    flex: 0 0 auto;
    inline-size: 0.5rem;
    block-size: 0.5rem;
    border-inline-end: 2px solid currentColor;
    border-block-end: 2px solid currentColor;
    /* Optička korekcija MORA pratiti smjer rotacije. Iscrtana su samo dva ruba
       kvadrata, pa zatvoreno (45deg) daje "v" s masom u DONJOJ polovici okvira —
       diže se; otvoreno (-135deg) daje "^" s masom u GORNJOJ — spušta se.
       Ista vrijednost u oba stanja bila je vidljivo previsoka kad je otvoreno. */
    translate: 0 -25%;
    rotate: 45deg;
    transition:
      rotate 0.15s ease,
      translate 0.15s ease;
  }
  .search__collapse[open] > summary::after {
    rotate: -135deg;
    translate: 0 25%; /* obrnut predznak — "^" ima masu gore (v. gore) */
  }
}

/* Naslov filter-panela — mala verzalna oznaka s crtom, da se panel imenuje a ne
   natjecati s H1 iz heroa. */
.search__heading {
  margin: 0;
  /* 12px do crte. Na mobitelu se i padding i crta gase (v. media query niže) —
     ondje <summary> nije naslov nego okidač. */
  padding-block-end: var(--space-s);
  font-size: 0.78rem;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--clr-muted);
  border-block-end: 1px solid var(--clr-border);
}
.search__row {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-m);
  align-items: end;
}
.search__actions {
  display: flex;
  gap: var(--space-xs);
  margin-inline-start: auto;
}

/* polje (label + input) */
.field {
  display: flex;
  flex-direction: column;
  gap: var(--space-2xs);
  flex: 1 1 12rem;
  min-inline-size: 0;
  margin: 0;
  padding: 0;
  border: 0;
}
.field--sea {
  flex-basis: 8rem;
}
.field--features {
  flex-basis: 100%;
}

/* ---------- BLOCK: check (checkbox lista oznaka u filteru) ---------- */
.checks {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-2xs) var(--space-s);
  list-style: none;
  padding: 0;
  margin: 0;
}
.check {
  display: inline-flex;
  align-items: center;
  gap: 0.45rem;
  padding: 0.2rem 0;
  font-size: 0.92rem;
  color: var(--clr-ink-soft);
  cursor: pointer;
}
.check input {
  inline-size: 1.05rem;
  block-size: 1.05rem;
  accent-color: var(--clr-accent);
  cursor: pointer;
}
.check:hover {
  color: var(--clr-ink);
}
/* Označeno stanje već nose kvačica (accent-color) i boja teksta — debljina ga
   samo blago podigne s naslijeđenih 300 na 400. */
.check:has(input:checked) {
  color: var(--clr-accent-2);
  font-weight: 400;
}
/* DVA stupca u panelu. Unutarnja širina panela je 238px (288 − 2×24 padding − 2
   border), pa je 9rem (144px) bilo prekrupno: dva stupca traže 2×144 + 12 = 300px
   i uvijek je ispadao JEDAN po redu. 6.5rem (104px) → 2×104 + 12 = 220px stane
   s 18px rezerve, a tri stupca (336px) ne stanu — dakle točno dva.
   Ćelija ispadne 113px; najduža njemačka oznaka ("Meerblick") traži ~91px.
   Na mobitelu je panel širi pa auto-fit sam doda stupce. Bez media queryja. */
.catalog__aside .checks {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(6.5rem, 1fr));
  gap: var(--space-2xs) var(--space-s);
}
.field__label {
  font-size: 0.78rem;
  font-weight: 500;
  letter-spacing: 0.02em;
  color: var(--clr-muted);
}
.field__input {
  inline-size: 100%;
  padding: 0.6rem 0.7rem;
  /* `font: inherit` je shorthand i RESETIRA font-size na naslijeđeni — a to je
     10px iz `body { font-size: 62.5% }` (legacy.css:238). Zato font-size MORA doći
     nakon njega. .95rem je ista vrijednost koju već nosi .catalog__sort select. */
  font: inherit;
  font-size: 0.95rem;
  color: var(--clr-ink);
  background: var(--clr-bg);
  border: 1px solid var(--clr-border);
  border-radius: var(--radius-s);
  transition:
    border-color 0.15s ease,
    box-shadow 0.15s ease;
}
.field__input:focus-visible {
  outline: 0;
  border-color: var(--clr-accent);
  box-shadow: 0 0 0 3px rgba(var(--clr-accent-rgb), 0.18);
}
.field__input:disabled {
  opacity: 0.55;
  cursor: not-allowed;
}

/* ---------- ELEMENT: select (zajednički izgled) ----------
   Nativnu strelicu selecta crta OS i ne da se stilizirati — na Windowsu je siva
   kockasta i odskače od svega ostalog. `appearance: none` je gasi, a chevron
   crtamo sami kao pozadinski SVG (data URI → nula mrežnih zahtjeva).

   MORA stajati IZA .field__input: ono postavlja `background` skraćeno, što briše
   background-image. Zato ovdje ide background-COLOR odvojeno od background-IMAGE.

   [multiple] je izuzet — višestruki select (gradovi) je lista, nema padajuću
   strelicu, pa bi mu chevron bio ukras preko sadržaja. */
.catalog__sort select,
select.field__input:not([multiple]) {
  appearance: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23667085' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 0.7rem center;
  background-size: 1.05em;
  padding-inline-end: 2.2rem; /* mjesto za chevron, da tekst ne ide ispod */
  cursor: pointer;
}
.catalog__sort select:hover,
select.field__input:not([multiple]):hover {
  border-color: var(--clr-muted);
}

/* raspon (od – do) */
.range {
  display: flex;
  align-items: center;
  gap: var(--space-xs);
}
.range .field__input {
  flex: 1 1 0;
}
/* Crtica živi u .field koji nema veličinu → bez ovoga je 10px između dva
   inputa od 15.2px. */
.range__sep {
  font-size: 0.95rem;
  color: var(--clr-muted);
}

/* ---------- BLOCK: multiselect (gradovi) — nadogradnja <select multiple> ---------- */
.multiselect {
  position: relative;
}
.multiselect__control {
  display: flex;
  align-items: center;
  gap: var(--space-xs);
  inline-size: 100%;
  min-block-size: 2.6rem;
  padding: 0.35rem 0.5rem;
  font: inherit;
  font-size: 0.95rem; /* v. .field__input — inače 10px */
  text-align: start;
  background: var(--clr-bg);
  border: 1px solid var(--clr-border);
  border-radius: var(--radius-s);
  cursor: pointer;
}
.multiselect__control[aria-expanded='true'] {
  border-color: var(--clr-accent);
  box-shadow: 0 0 0 3px rgba(var(--clr-accent-rgb), 0.18);
}
.multiselect__chips {
  display: flex;
  flex-wrap: wrap;
  gap: 0.3rem;
  flex: 1;
  min-inline-size: 0;
}
.multiselect__placeholder {
  color: var(--clr-muted);
}
.multiselect__summary {
  color: var(--clr-ink);
  font-weight: 300;
}
.multiselect__chip {
  display: inline-flex;
  align-items: center;
  gap: 0.2rem;
  padding: 0.1rem 0.2rem 0.1rem 0.55rem;
  font-size: 0.82rem;
  color: #fff;
  background: var(--clr-accent);
  border-radius: 999px;
}
.multiselect__chip-x {
  border: 0;
  background: none;
  color: #fff;
  font-size: 1.05rem;
  line-height: 1;
  padding: 0 0.2rem;
  cursor: pointer;
}
.multiselect__caret {
  color: var(--clr-muted);
}
.multiselect__panel {
  position: absolute;
  z-index: 5;
  inset-inline: 0;
  margin-block-start: 0.3rem;
  padding: 0.5rem;
  /* Panel je SIBLING kontrole, ne dijete — ne nasljeđuje njezinih .95rem nego
     10px s body-ja. Postavljeno na panel (ne na .multiselect__option) da i
     buduća djeca dobiju ispravnu veličinu. */
  font-size: 0.95rem;
  background: var(--clr-surface);
  border: 1px solid var(--clr-border);
  border-radius: var(--radius-s);
  box-shadow: var(--shadow-md);
}
.multiselect__search {
  inline-size: 100%;
  padding: 0.45rem 0.6rem;
  margin-block-end: 0.4rem;
  font: inherit;
  font-size: 0.95rem; /* v. .field__input — inače 10px */
  background: var(--clr-bg);
  border: 1px solid var(--clr-border);
  border-radius: var(--radius-s);
}
.multiselect__list {
  max-block-size: 14rem;
  overflow: auto;
  display: flex;
  flex-direction: column;
}
.multiselect__option {
  display: flex;
  align-items: center;
  gap: var(--space-xs);
  padding: 0.35rem 0.3rem;
  border-radius: 6px;
  cursor: pointer;
}
.multiselect__option:hover {
  background: var(--clr-bg);
}
.multiselect__option input {
  accent-color: var(--clr-accent);
}

/* ---------- BLOCK: btn ---------- */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--space-2xs);
  padding: 0.6rem 1.2rem;
  font: inherit;
  font-size: 0.95rem; /* v. .field__input — inače 10px */
  font-weight: 600;
  line-height: 1;
  white-space: nowrap;
  border: 1px solid transparent;
  border-radius: var(--radius-s);
  cursor: pointer;
  text-decoration: none;
  transition:
    background 0.15s ease,
    border-color 0.15s ease,
    color 0.15s ease;
}
.btn--primary {
  background: var(--clr-accent);
  color: #fff;
}
.btn--primary:hover {
  background: var(--clr-accent-2);
}
.btn--ghost {
  background: transparent;
  border-color: var(--clr-border);
  color: var(--clr-muted);
}
.btn--ghost:hover {
  color: var(--clr-ink);
  border-color: var(--clr-muted);
}

/* ---------- BLOCK: pagination ---------- */
.pagination {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  align-items: center;
  gap: var(--space-2xs);
  margin-block-start: var(--space-xl);
}
.pagination__link {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  /* 44px = minimalna dodirna meta (WCAG 2.5.5). Straničenje je na mobitelu
     najčešće dodirivan element na stranici. */
  min-inline-size: 2.75rem;
  min-block-size: 2.75rem;
  padding: 0.5rem 0.7rem;
  /* OBAVEZNO eksplicitno: legacy.css:238 ima `body { font-size: 62.5% }` (10px), a
     reset na div/section/nav je `font-size: 100%` = naslijedi. Bez ovoga broj
     stranice ispadne 10px. Vrijednost je ista kao .card__specs — straničenje je
     pomoćna navigacija, ne sadržaj, pa ne smije nadglasati brojke na karticama. */
  font-size: 0.9rem;
  /* 500, ne 600: aktivnu stranicu već nosi puna accent podloga u .is-current,
     pa debljina ne mora ponavljati istu informaciju. */
  font-weight: 500;
  color: var(--clr-ink);
  background: var(--clr-surface);
  border: 1px solid var(--clr-border);
  border-radius: var(--radius-s);
  text-decoration: none;
  transition:
    border-color 0.15s ease,
    background 0.15s ease,
    color 0.15s ease;
}
.pagination__link:hover {
  border-color: var(--clr-accent);
  color: var(--clr-accent);
}
.pagination__link.is-current {
  color: #fff;
  background: var(--clr-accent);
  border-color: var(--clr-accent);
  cursor: default;
}
/* Isti razlog kao gore — bez eksplicitne veličine "…" ostane na 10px. */
.pagination__gap {
  padding-inline: var(--space-2xs);
  font-size: 0.9rem;
  color: var(--clr-muted);
}

/* ---------- BLOCK: card (kartica oglasa) ---------- */
.card {
  display: flex; /* prije nosio .card__link; media je sad izvan njega */
  flex-direction: column;
  background: var(--clr-surface);
  border: 1px solid var(--clr-border);
  border-radius: var(--radius-l);
  overflow: clip;
  box-shadow: var(--shadow-sm);
  transition:
    transform 0.22s ease,
    box-shadow 0.22s ease,
    border-color 0.22s ease;
}
.card:hover,
.card:focus-within {
  transform: translateY(-4px);
  box-shadow: var(--shadow-lg);
  border-color: #dce1e8;
}
.card__link {
  display: flex;
  flex-direction: column;
  flex: 1;
  color: inherit;
  text-decoration: none;
}
.card__media {
  position: relative;
  aspect-ratio: 3 / 2;
  display: grid;
  place-items: center;
  /* Bio plavo→teal gradijent; teal je bio jedini trag zelene na kartici. */
  background: linear-gradient(135deg, var(--brand-100, #dce9f5), var(--brand-50, #f0f6fc));
  color: var(--clr-muted);
  font-size: 0.72rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
}
/* Placeholder "Foto" dijeli grid-ćeliju sa scrimom i trakom (inače bi ga
   auto-placement gurnuo u drugi red i stisnuo sadržaj). */
.card__media-empty {
  grid-area: 1 / 1;
  place-self: center;
  color: var(--clr-muted);
}

/* Scrim pri dnu slike: brojač i točkice ostaju čitljivi na svjetlim fotkama,
   a na hover potamni i daje dubinu. Grid-ćelija 1/1 kao i .card__track. */
.card__media::after {
  content: '';
  grid-area: 1 / 1;
  place-self: stretch;
  z-index: 1;
  pointer-events: none;
  background: linear-gradient(to top, rgba(11, 20, 26, 0.5), rgba(11, 20, 26, 0) 45%);
  opacity: 0.6;
  transition: opacity 0.25s ease;
}
.card:hover .card__media::after {
  opacity: 1;
}

/* badge preko slike (pogled na more / prvi red) — stack gore-lijevo */
.card__badges {
  position: absolute;
  inset-block-start: var(--space-xs);
  inset-inline-start: var(--space-xs);
  z-index: 3;
  display: flex;
  flex-direction: column;
  align-items: start;
  gap: 0.3rem;
  max-inline-size: calc(100% - 4.2rem); /* ne podlazi pod srce gore-desno */
}
.card__badge {
  padding: 0.28rem 0.6rem;
  font-size: 0.68rem;
  font-weight: 600;
  letter-spacing: 0.02em;
  text-transform: none;
  color: var(--clr-ink);
  background: rgba(255, 255, 255, 0.92);
  border-radius: 999px;
  box-shadow: var(--shadow-sm);
  backdrop-filter: blur(2px);
}
.card__badge--accent {
  color: #fff;
  background: var(--clr-accent);
}
/* "NOVO" — oglasi uneseni u zadnjih 14 dana */
.card__badge--new {
  color: #fff;
  background: var(--clr-highlight, #b45309);
  letter-spacing: 0.06em;
}
/* tip badge (Kuća/Stan…) — dolje-lijevo, odvojen od gornjih (more/prvi red) */
.card__badge--type {
  position: absolute;
  inset-block-end: var(--space-xs);
  inset-inline-start: var(--space-xs);
  z-index: 3;
  color: #fff;
  background: rgba(20, 26, 31, 0.82);
}

/* favorit (srce) — gore-desno; izvan .card__link je pa ne gnijezdimo interaktivne elemente */
.card__fav {
  position: absolute;
  inset-block-start: var(--space-xs);
  inset-inline-end: var(--space-xs);
  z-index: 3;
  inline-size: 2.2rem;
  block-size: 2.2rem;
  display: grid;
  place-items: center;
  padding: 0;
  border: 0;
  border-radius: 999px;
  color: var(--clr-ink-soft);
  background: rgba(255, 255, 255, 0.92);
  box-shadow: var(--shadow-sm);
  backdrop-filter: blur(2px);
  cursor: pointer;
  transition:
    color 0.15s ease,
    scale 0.15s ease,
    background 0.15s ease;
}
.card__fav:hover {
  color: var(--clr-heart);
  scale: 1.08;
}
.card__fav:focus-visible {
  outline: 0;
  box-shadow: 0 0 0 3px rgba(var(--clr-accent-rgb), 0.35);
}
.card__fav svg {
  inline-size: 1.15rem;
  block-size: 1.15rem;
}
.card__fav[aria-pressed='true'] {
  color: var(--clr-heart);
}
.card__fav[aria-pressed='true'] svg {
  fill: currentColor;
}

.card__media img {
  inline-size: 100%;
  block-size: 100%;
  object-fit: cover;
  display: block;
  transition: scale 0.5s cubic-bezier(0.2, 0.6, 0.2, 1);
}
/* lagani zoom slike na hover (premium osjećaj); .card ima overflow:clip */
.card:hover .card__media img {
  scale: 1.06;
}
@media (prefers-reduced-motion: reduce) {
  .card,
  .card__media img {
    transition: none;
  }
  .card:hover {
    transform: none;
  }
  .card:hover .card__media img {
    scale: 1;
  }
}

/* ---------- ELEMENT: carousel u kartici ----------
   Traka je običan scroll-snap kontejner: swipe na mobitelu radi nativno, bez JS-a.
   JS samo ubacuje ostale slajdove, strelice i točkice (progresivno poboljšanje). */
.card__track {
  grid-area: 1 / 1;
  place-self: stretch;
  display: flex;
  overflow-x: auto;
  overscroll-behavior-x: contain;
  scroll-snap-type: x mandatory;
  scrollbar-width: none;
}
.card__track::-webkit-scrollbar {
  display: none;
}
.card__slide {
  flex: 0 0 100%;
  inline-size: 100%;
  /* 'start', NE 'center': širina kartice dolazi iz 1fr grida pa je necijeli broj
     piksela. Centriranje taj ostatak razdijeli na obje strane, a na prvom slajdu
     lijevo nema ničega — pa se desno vidi rub sljedeće slike. */
  scroll-snap-align: start;
  scroll-snap-stop: always; /* brzi swipe ne preskače više slika odjednom */
  display: block;
  block-size: 100%;
  /* NUŽNO uz hover-zoom (.card:hover .card__media img { scale: 1.06 }): bez ovoga
     se uvećana slika prelije 3% izvan slajda, a sljedeći slajd je kasniji u DOM-u
     pa se crta iznad — na desnom rubu se vidi traka sljedeće slike. */
  overflow: clip;
}

/* strelice — samo na uređajima s hoverom, vidljive tek kad je kartica pod mišem */
.card__nav {
  position: absolute;
  inset-block-start: 50%;
  translate: 0 -50%;
  z-index: 2;
  inline-size: 30px;
  block-size: 30px;
  display: grid;
  place-items: center;
  padding: 0;
  border: 0;
  border-radius: 999px;
  background: rgba(255, 255, 255, 0.92);
  box-shadow: var(--shadow-sm);
  color: var(--clr-ink);
  font-size: 0.9rem;
  line-height: 1;
  cursor: pointer;
  /* Prigušeno vidljive i BEZ hovera — ciljana publika (stariji kupci) hover-only
     kontrole redovito ne otkrije. Na hover idu na punu vidljivost. */
  opacity: 0.5;
  transition: opacity 0.15s ease;
}
.card__nav--prev {
  inset-inline-start: var(--space-xs);
}
.card__nav--next {
  inset-inline-end: var(--space-xs);
}
.card:hover .card__nav,
.card__media:focus-within .card__nav {
  opacity: 1;
}
.card__nav:disabled {
  opacity: 0 !important;
  pointer-events: none;
}
@media (hover: none) {
  .card__nav {
    display: none;
  }
}

.card__dots {
  position: absolute;
  /* Odmaknuto od donjeg ruba slike; brojač niže ima ISTU vrijednost da im
     baseline ostane poravnat (bulleti su centrirani, brojač desno). */
  inset-block-end: var(--space-s);
  inset-inline: 0;
  z-index: 2;
  display: flex;
  justify-content: center;
  gap: 5px;
  pointer-events: none; /* ne smije presresti klik na sliku */
}
.card__dot {
  inline-size: 5px;
  block-size: 5px;
  border-radius: 999px;
  background: rgba(255, 255, 255, 0.55);
  box-shadow: 0 0 2px rgba(0, 0, 0, 0.45);
  transition:
    background 0.15s ease,
    scale 0.15s ease;
}
.card__dot--on {
  background: #fff;
  scale: 1.35;
}

/* brojač "1 / 14" — dolje-desno, nagovještaj da oglas ima još fotografija */
.card__counter {
  position: absolute;
  inset-block-end: var(--space-s); /* isto kao .card__dots — zajednički baseline */
  inset-inline-end: var(--space-xs);
  z-index: 2;
  padding: 0.18rem 0.45rem;
  font-size: 0.66rem;
  font-weight: 600;
  letter-spacing: 0.02em;
  text-transform: none;
  color: #fff;
  background: rgba(20, 26, 31, 0.7);
  border-radius: 999px;
  pointer-events: none;
}
.card__body {
  display: flex;
  flex-direction: column;
  /* 1rem, ne .5rem: na 8px su cijena, naslov, lokacija i oznake čitali kao jedan
     blok teksta. Ovih +8px po paru je najveća pojedinačna razlika na kartici. */
  gap: var(--space-m);
  padding: var(--space-m);
  flex: 1;
}
.card__title {
  font-size: var(--step-05); /* 1px iznad tijela teksta: naslov se čita prvi */
  font-weight: 600;
  line-height: 1.35;
  text-transform: none; /* nikad uppercase */
  color: var(--clr-ink);
  display: -webkit-box;
  -webkit-line-clamp: 2; /* dulji naslov se reže s "…" */
  -webkit-box-orient: vertical;
  overflow: hidden;
  min-block-size: 2.7em; /* 2 reda uvijek → specs su poravnani po karticama */
}
/* lokacija: ikona + grad */
.card__city {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  color: var(--clr-ink-soft);
  font-size: 0.9rem;
}
/* red specifikacija: površina · sobe · kupaonice (svaka s ikonom) */
.card__specs {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-s) var(--space-m); /* više zraka između podataka */
  list-style: none;
  padding: 0;
  color: var(--clr-ink-soft);
  font-size: 0.9rem;
  font-weight: 400;
}
.card__specs li {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
}
/* Dvije razine, ne tri: PODATAK (broj, --clr-ink) vs OZNAKA (jedinica i ikona,
   --clr-muted). Razliku nosi BOJA, ne debljina — kartica već ima 700 na cijeni i
   600 na naslovu, pa bi još i podebljani brojevi u nizu od 4 oznake razbili red
   u mrlje i natjecali se s cijenom. */
.card__spec-value {
  font-weight: 400;
  color: var(--clr-ink);
}
.card__spec-unit {
  font-weight: 400;
  color: var(--clr-muted);
}
.card__icon {
  /* 1.3em na .9rem tekstu = 18.7px. Uz stroke-width 2 na 24-jediničnom viewBoxu
     potez je 1.56px — prije je bio 1.23px (1.2em × 1.7) i djelovao isprano. */
  inline-size: 1.3em;
  block-size: 1.3em;
  flex-shrink: 0;
  /* Ista nijansa kao jedinica: ikona je oznaka, ne podatak. Jedan korak svjetlije
     od naslijeđenog --clr-ink-soft. Dalje ne idemo — stroke-width 2 je već bio
     podignut baš zato što su ikone djelovale isprano. */
  color: var(--clr-muted);
}

/* Agencija — dno kartice, odvojena tankom crtom. LIJEVO poravnata: crta odvaja
   podatke o nekretnini od atribucije, a lijevo poravnanje je drži u toku teksta
   (desno + crta se čitalo kao footer, tj. kao chrome a ne kao sadržaj).
   Ostaje prigušena — na listingu je atribucija, ne kriterij odluke. */
.card__agency {
  display: flex;
  align-items: center;
  margin-block-start: auto; /* gura je na dno kartice */
  padding-block-start: var(--space-s);
  border-block-start: 1px solid var(--clr-border);
}
.card__agency-name {
  color: var(--clr-muted);
  font-size: 0.78rem;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
/* cijena gore (prominentno) + €/m² */
.card__pricing {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: var(--space-xs);
}
.card__price {
  font-size: var(--step-2);
  font-weight: 700;
  color: var(--clr-price);
  /* Visina retka se veže na --step-2, NE na vlastiti font-size. Naslijeđeni
     množitelj računao bi se iz veličine svakog elementa, pa bi "Preis auf
     Anfrage" (step-05) dao niži kutijicu od iznosa (step-2) — i naslovi kartica
     u istom redu mreže ne bi krenuli s iste linije. Ovako obje varijante
     (obje nose .card__price) imaju identičnu visinu. */
  line-height: calc(var(--step-2) * 1.25);
}
/* "Preis auf Anfrage" na veličini iznosa (do 28px) ne stane u karticu od ~260px —
   manji font i mekša boja, jer ionako nije podatak nego izostanak podatka.
   line-height NAMJERNO ne diramo — nasljeđuje se s .card__price. */
.card__price--request {
  font-size: var(--step-05);
  font-weight: 600;
  color: var(--clr-ink-soft);
}
.card__ppm {
  font-size: 0.78rem;
  color: var(--clr-muted);
}

/* ---------- BLOCK: site-footer (moderni tamni footer) ---------- */
.site-footer {
  /* BEZ margin-block-start. Na naslovnici je `main.home` bez margine, pa se
     footerova 64px ZBRAJALA s 64px donjeg paddinga .featured — ukupno 128px.
     Na katalogu i detalju footerova margina se ionako NIJE zbrajala: `main` ima
     `margin: 64px auto` (legacy.css), a susjedne margine se poništavaju na veću —
     dakle 64, ne 128. Razmak ondje drži main, ovdje padding sekcije. */
  /* Bilo #10161c — neutralna crna koja se čitala kao komad druge stranice.
     Sada najtamniji član brend ljestvice: isti ton kao navigacija, samo dolje. */
  background: var(--brand-950, #08192a);
  color: #a9bdd0;
}
.site-footer__inner {
  padding-block: var(--space-xl);
}

/* Gornja traka. Trenutno je u njoj samo identitet, pa je jedan stupac; drugi se
   pojavi SAM kad se CTA vrati u markup — zato :has(), da povratak ne traži i
   izmjenu CSS-a. Ako preglednik ne podržava :has(), ostaje jedan stupac, što je
   za sadašnje stanje ionako točno. CTA je ograničen na 20rem da okvir ne postane
   pola footera kad je identitet kratak. */
.site-footer__top {
  display: grid;
  gap: var(--space-l) var(--space-xl);
  grid-template-columns: minmax(0, 1fr);
  align-items: start;
  margin-block-end: var(--space-xl);
}
/* Djeca su <section>, a legacy `section { grid-column: 1 / 8 }` (legacy.css) ih oba
   gurne u isti trak izmišljene 12-stupčane mreže → preklope se. Isti trap kao na
   .catalog__layout i staroj .site-footer__cols; reset MORA ostati.
   Specifičnost (0-1-0) nadjačava legacy (0-0-1). */
.site-footer__top > * {
  grid-column: auto;
  min-inline-size: 0;
}
/* Drugi stupac postoji SAMO ako je CTA u markupu i ako ima mjesta. Namjerno
   min-width, a ne max-width reset niže: `:has()` je (0-2-0), pa ga pravilo s
   golim `.site-footer__top` (0-1-0) ne bi nadjačalo i CTA bi na mobitelu ostao
   u dva stupca. Ovako je jedan stupac zadano stanje, a dva iznimka. */
@media (min-width: 48rem) {
  .site-footer__top:has(.site-footer__cta) {
    grid-template-columns: minmax(0, 1fr) minmax(0, 20rem);
  }
}

/* Legacy legacy.css stilizira goli <nav> (navigacija stranice) i to curi na naše
   popise u footeru — DVA odvojena pravila, oba nas ruše:
     nav { display: flex; align-items: center }        → h3 stane POKRAJ popisa,
                                                         okomito centriran
     @media (max-width:900px) { nav { height:0; overflow:hidden } }  → na mobitelu
                                                         footer ostane bez linkova
   Zato eksplicitno vraćamo blok-tok i visinu. */
.site-footer nav {
  display: block;
  block-size: auto;
  overflow: visible;
}

.site-footer h3 {
  font-size: 0.8rem;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  color: #fff;
  margin-block-end: var(--space-s);
}
.site-footer a {
  color: #a9bdd0;
  text-decoration: none;
  transition: color 0.15s ease;
}
.site-footer a:hover {
  color: #fff;
}

/* ---------- ELEMENT: vodoravni red linkova ----------
   Grupa po grupa preko cijele širine, umjesto stupaca. Razlog NIJE zbijenost —
   stupci su zapravo niži — nego to da se duge njemačke oznake ne lome nasred
   pojma: "Immobilien direkt am Meer (Erste Reihe)" ima 39 znakova i u stupcu od
   248px pada u dva retka. Ovdje svaka stavka ostaje na jednom retku. */
.site-footer__group + .site-footer__group {
  margin-block-start: var(--space-l);
}

.site-footer__row {
  display: flex;
  flex-wrap: wrap;
  list-style: none;
  padding: 0;
  margin: 0;
  row-gap: 0.15rem;
}
.site-footer__row li {
  white-space: nowrap;
}
/* Razmak nose separatori, ne `gap`. Namjerno ::after, a ne ::before: pri prelomu
   točka ostaje na KRAJU retka i čita se kao nastavak, dok bi vodeća točka na
   početku novog retka izgledala kao greška. CSS ne može detektirati prelom, pa
   je ovo najbliže čistom rješenju. */
.site-footer__row li:not(:last-child)::after {
  content: '·';
  margin-inline: 0.7rem;
  color: rgba(255, 255, 255, 0.3);
}
/* Vertikalni padding umjesto gapa: dodirni cilj je ~34px, a ne 20px kao prije. */
.site-footer__row a {
  display: inline-block;
  padding-block: 0.3rem;
  font-size: 0.92rem;
  line-height: 1.45;
}

/* Uski ekran: jedna stavka po retku (isto što legacy #pre_footer radi s
   `flex: 0 0 100%`), pa duge oznake smiju prelomiti i unutar sebe. Bez ovoga
   "Immobilien direkt am Meer (Erste Reihe)" uz nowrap izlazi iz ekrana. */
@media (max-width: 40rem) {
  .site-footer__row {
    display: block;
  }
  .site-footer__row li {
    white-space: normal;
  }
  .site-footer__row li:not(:last-child)::after {
    content: none;
  }
}

/* ---------- ELEMENT: brand blok ---------- */
.site-footer__brand {
  font-family: var(--font-header, 'Montserrat', sans-serif);
  font-size: 1.3rem;
  font-weight: 600;
  color: #fff;
  margin: 0;
}
.site-footer__brand span {
  color: var(--clr-accent);
}
.site-footer__tagline {
  margin-block: var(--space-xs) var(--space-m);
  max-inline-size: 34ch;
  font-size: 0.9rem;
  line-height: 1.65;
}
.site-footer__mail {
  display: inline-flex;
  align-items: center;
  gap: 0.45rem;
  font-size: 0.92rem;
}
.site-footer__icon {
  inline-size: 1.05rem;
  block-size: 1.05rem;
  flex-shrink: 0;
  color: var(--clr-accent);
}

/* ---------- ELEMENT: CTA za oglašavanje ---------- */
.site-footer__cta {
  padding: var(--space-m);
  background: rgba(255, 255, 255, 0.04);
  border: 1px solid rgba(255, 255, 255, 0.1);
  border-radius: var(--radius);
}
.site-footer__cta-text {
  margin-block: 0 var(--space-m);
  font-size: 0.88rem;
  line-height: 1.6;
}
.site-footer__cta-btn {
  inline-size: 100%;
  color: #fff;
}

/* ---------- ELEMENT: donja traka ---------- */
.site-footer__bottom {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-s) var(--space-l);
  margin-block-start: var(--space-xl);
  padding-block-start: var(--space-m);
  border-block-start: 1px solid rgba(255, 255, 255, 0.1);
  font-size: 0.85rem;
  color: #7d92a6;
}
.site-footer__copy {
  margin: 0;
}
.site-footer__legal {
  display: flex;
  flex-wrap: wrap;
  gap: 0.3rem var(--space-m);
  list-style: none;
  padding: 0;
  margin: 0;
}
.site-footer__legal a {
  font-size: 0.85rem;
}

/* ---------- BLOCK: page (statične tekstualne stranice) ----------
   Impressum, AGB, Datenschutz, FAQ, Kroatien. Nemaju layout kao katalog —
   nose ih samo tri stvari: duljina retka, veličina slova i vertikalni ritam.

   POZICIJA: stupac je poravnat LIJEVO, ne centriran. Prije je bio
   `margin-inline: auto` unutar main-a od 85rem, pa je tekst kretao ~430px
   udesno dok breadcrumb iznad njega i logo u headeru kreću na rubu sadržaja —
   dokument je izgledao odvojeno od stranice. Lijevi rub sad je isti za
   header → breadcrumb → naslov → tekst, jedna vertikala kroz cijelu stranicu. */
.page {
  /* Tijelo teksta. MORA biti eksplicitno i u rem: legacy.css:238 ima
     `body { font-size: 62.5% }` (10px), a reset (legacy.css:75) gasi font-size na
     blokovima, pa <p> bez ovoga nasljeđuje TIH 10px — zato je tekst na ovim
     stranicama bio nečitljiv. Legacy je to rješavao klasom na svakom odlomku
     (`p.text` = 15.3px); ovdje token nosi cijeli blok pa se klasa ne piše.

     16px je NAMJERNO blizu ostatka sitea, ne "veliko za čitanje": listing vozi
     na 14.4–15.2px (.card__body .9rem, .catalog__count .95rem). Jedan korak
     iznad toga čita se kao dokument; dva koraka (18–19px) izgledaju kao da su
     statične stranice iz drugog dizajna. */
  --page-text: 1rem; /* 16px */

  padding-block: 0 var(--space-xl);
  /* 66ch ≈ 520px ≈ 11 riječi po retku. Preko toga oko gubi početak sljedećeg
     retka, a to je na pravnom tekstu jedini razlog čitanja. */
  max-inline-size: var(--measure);
  font-size: var(--page-text);
  line-height: 1.7;
  color: #33404a;
}

/* Legacy `main { margin: 64px auto }` — isti račun kao za katalog gore:
   64px + 32px ispod breadcrumba + padding bloka = 136px praznine do naslova.
   Ritam nosi blok, pa main daje samo 24px kao i .catalog. */
main:has(> .page) {
  margin-block-start: var(--space-l);
}
main:has(> .page) > #navTo {
  margin-block-end: var(--space-l);
}

/* Susjedni odlomci stoje BLIŽE jedan drugome nego naslov svojem tekstu — svjesna
   odluka, suprotna uobičajenoj tipografskoj konvenciji (naslov uz tekst ispod).
   Obrazloženje: naslov se ovdje čita kao izdvojena logička jedinica s razmakom
   s obje strane, a odlomci istog odsjeka kao neprekinut niz.

   12px je DONJA granica: prored UNUTAR odlomka je pri 16px/1.7 već ~11,2px, pa
   margina jedva nadmašuje razmak između redaka (1,07×). Mjereno po ukupnom
   bijelom prostoru odnos je 23,2 : 11,2 = 2,07× — odlomci se još razdvajaju, ali
   NE ići niže od ovoga jer se počinju stapati u jedan blok. */
.page > * + * {
  margin-block-start: var(--space-s);
}

.page h1 {
  font-family: var(--font-header, 'Montserrat', sans-serif);
  font-size: var(--step-3);
  font-weight: 700;
  line-height: 1.15;
  letter-spacing: -0.02em;
  color: var(--clr-ink);
  /* Legacy `h1 { border-bottom: 1px solid #eee; padding-bottom: 12px }` — crta
     bi sjekla samo 66ch stupac i visjela nasred main-a. Isto kao na detalju. */
  border: 0;
  padding-block-end: 0;
  margin-block: 0 var(--space-l);
}

.page h2 {
  font-family: var(--font-header, 'Montserrat', sans-serif);
  font-size: var(--step-2);
  font-weight: 600;
  line-height: 1.3;
  letter-spacing: -0.01em;
  color: var(--clr-ink);
  /* Legacy `h2 { text-transform: uppercase }` — na 9 naslova AGB-a versal
     usporava čitanje i briše razliku između broja točke i teksta naslova. */
  text-transform: none;
  /* Razmak gore ostaje najveći na stranici (40px) — on odvaja odsjek od odsjeka.
     Razmak dolje NIJE 0 nego dolazi iz `.page h2 + *` (24px), pa naslov stoji
     odvojen s obje strane. V. komentar uz to pravilo. */
  margin-block: var(--space-xl) 0;
  scroll-margin-block-start: var(--space-xl); /* za sidra (#punkt-3) */
}
.page h3 {
  font-family: var(--font-header, 'Montserrat', sans-serif);
  font-size: var(--step-1);
  font-weight: 600;
  color: var(--clr-ink);
  margin-block: var(--space-l) 0;
}
/* Specifičnost 0-1-1 tuče `.page > * + *` (0-1-0). Naslov dobiva VEĆI razmak do
   svog teksta nego što odlomci imaju međusobno, pa se čita kao izdvojen blok:
   h2  40px gore / 24px dolje   (ukupni bijeli prostor 50 : 34)
   h3  24px gore / 16px dolje   (isti odnos, jedna razina niže)
   Vrijednosti moraju ostati IZNAD `.page > * + *` (12px) — ako padnu na nju ili
   ispod, naslov se opet slijepi uz tekst i cijela odluka se poništi. */
.page h2 + * {
  margin-block-start: var(--space-l);
}
.page h3 + * {
  margin-block-start: var(--space-m);
}

.page ul,
.page ol {
  /* Reset u legacy.css:75 gasi padding na listama — bez ovoga oznake vise izvan
     stupca teksta. */
  padding-inline-start: 1.4em;
}
.page li + li {
  margin-block-start: var(--space-2xs);
}

.page a {
  color: var(--clr-accent-2);
  text-decoration: underline;
  text-underline-offset: 0.2em;
  /* WKO poveznica je jedan niz od ~90 znakova bez razmaka — bez ovoga probije
     66ch stupac i vodoravno razvuče stranicu na mobitelu. */
  overflow-wrap: anywhere;
}
.page a:hover {
  color: var(--clr-accent);
}
.page strong {
  font-weight: 600;
  color: var(--clr-ink);
}

/* Uvodni odlomak — jedina razina iznad tijela teksta. Daje stranici ulaz da
   h1 ne pada odmah u sitan tekst. */
.page__lead {
  /* Jedan korak iznad tijela (18 vs 16px), koliko i --step-05 na kartici.
     Razliku nosi i boja, pa font ne mora raditi sav posao. */
  font-size: 1.125rem;
  line-height: 1.6;
  color: var(--clr-ink-soft);
}

/* Popis podataka (Impressum: UID, GISA, kontakti). Kao niz <br> unutar <p> to
   je bio blok redaka bez veze naziv↔vrijednost i bez ijedne točke za skeniranje;
   dva stupca daju oboje i istovremeno razbijaju zid teksta. */
.page__facts {
  display: grid;
  grid-template-columns: max-content minmax(0, 1fr);
  gap: var(--space-xs) var(--space-l);
  padding: var(--space-l);
  background: #f7f9fb;
  border: 1px solid var(--clr-border);
  border-radius: var(--radius-s);
}
/* Panel je uokviren blok s obrubom i podlogom, dakle izdvojena cjelina — dobiva
   isti razmak kao naslov (24px), ne 12px koji `.page > * + *` daje susjedima u
   toku teksta. Bez ovoga na Impressumu jedan panel slijedi odlomak i sjedi mu
   praktički na vratu.
   NAMJERNO `* + .page__facts`, a ne `.page > .page__facts`: ovo je pravilo o
   razmaku IZMEĐU susjeda: panel kao prvo dijete ne smije dobiti razmak odozgo,
   jer .page nema gornji padding pa bi ga odgurnuo od vrha stranice.
   Specifičnost (0-2-0) tuče i `.page > * + *` (0-1-0). */
.page > * + .page__facts {
  margin-block-start: var(--space-l);
}

.page__facts dt {
  color: var(--clr-muted);
}
.page__facts dd {
  margin: 0;
}
/* Ispod ~480px `max-content` stupac pojede pola širine i vrijednosti se lome
   po slovu — naziv ide u vlastiti redak iznad vrijednosti. */
@media (max-width: 30rem) {
  .page__facts {
    grid-template-columns: 1fr;
    gap: 0;
  }
  .page__facts dd + dt {
    margin-block-start: var(--space-s);
  }
}

/* Zaglavlje ispred bloka PODATAKA (agencije, sitemap): naslov i uvod zadržavaju
   66ch stupac, a popis ispod ide punom širinom. Donji razmak nosi blok. */
.page--head {
  padding-block-end: var(--space-l);
}

/* ---------- BLOCK: faq (akordeon) ----------
   <details> bez JS-a: radi i kad skripta ne dođe, a Ctrl+F u pregledniku sam
   otvara zatvoreni odgovor u kojem je pojam. */
.faq {
  margin-block-start: var(--space-l);
  border-block-start: 1px solid var(--clr-border);
}
.faq__item {
  border-block-end: 1px solid var(--clr-border);
}
.faq__question {
  /* Reset u legacy.css:75 gasi font-size na blokovima; summary bi inače pao na
     naslijeđenih 10px kao i sve ostalo unutar .page. */
  font-size: 1.0625rem;
  font-weight: 600;
  line-height: 1.4;
  color: var(--clr-ink);
  cursor: pointer;
  list-style: none; /* zadani trokutić — zamjenjuje ga ::after */
  display: flex;
  align-items: start;
  justify-content: space-between;
  gap: var(--space-m);
  padding-block: var(--space-m);
}
.faq__question::-webkit-details-marker {
  display: none;
}
.faq__question:hover {
  color: var(--clr-accent);
}
.faq__question:focus-visible {
  outline: 2px solid rgba(var(--clr-accent-rgb), 0.5);
  outline-offset: 2px;
}
/* Znak stanja je + / −, ne strelica: bez rotacije nema ovisnosti o tome podržava
   li preglednik animaciju markera. */
.faq__question::after {
  content: '+';
  flex: none;
  font-size: 1.4rem;
  font-weight: 400;
  line-height: 1;
  color: var(--clr-accent);
}
.faq__item[open] .faq__question::after {
  content: '−';
}
.faq__answer {
  padding-block-end: var(--space-m);
}
.faq__answer p {
  margin: 0;
}

/* ---------- BLOCK: sitemap (popis za ljude) ---------- */
.sitemap {
  display: grid;
  gap: var(--space-xl);
  padding-block-end: var(--space-xl);
}
.sitemap__group h2 {
  font-family: var(--font-header, 'Montserrat', sans-serif);
  font-size: 1.05rem;
  font-weight: 600;
  text-transform: none; /* legacy h2 { text-transform: uppercase } */
  letter-spacing: 0.01em;
  color: var(--clr-muted);
  margin: 0 0 var(--space-s);
  padding-block-end: var(--space-xs);
  border-block-end: 1px solid var(--clr-border);
}
/* Stupci, ne jedan dugi popis: 13 tematskih linkova u jednom stupcu tjera
   korisnika da skrola kroz cijelu grupu da vidi ima li još grupa. */
.sitemap__links {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(min(100%, 16rem), 1fr));
  gap: var(--space-2xs) var(--space-l);
  list-style: none;
  padding: 0;
  margin: 0;
}
.sitemap__links a {
  display: inline-block;
  font-size: 1rem;
  line-height: 1.7;
  color: var(--clr-accent-2);
  text-decoration: none;
}
.sitemap__links a:hover {
  text-decoration: underline;
  text-underline-offset: 0.2em;
}

/* ---------- BLOCK: agencies (popis partnerskih agencija) ---------- */
.agencies {
  display: grid;
  /* 20rem, ne 16rem kao mreža oglasa: kartica nosi logo (4.5rem) POKRAJ teksta,
     a mail agencije zna biti 30+ znakova — uže bi ga lomilo na svaku riječ. */
  grid-template-columns: repeat(auto-fill, minmax(min(100%, 20rem), 1fr));
  gap: var(--space-l);
  list-style: none;
  padding: 0;
  margin: 0;
  padding-block-end: var(--space-xl);
}
.agency-card {
  display: grid;
  grid-template-columns: 4.5rem minmax(0, 1fr);
  gap: var(--space-m);
  align-items: start;
  padding: var(--space-l);
  background: var(--clr-surface);
  border: 1px solid var(--clr-border);
  border-radius: var(--radius);
  box-shadow: var(--shadow-sm);
}
.agency-card__logo {
  display: grid;
  place-items: center;
  inline-size: 4.5rem;
  block-size: 4.5rem;
  overflow: hidden;
  background: #fff;
  border: 1px solid var(--clr-border);
  border-radius: var(--radius-s);
}
/* `contain`, ne `cover`: logotipi su različitih omjera i cover bi im odsjekao
   rubove — a logo odsječen na pola je gori od praznine oko njega. */
.agency-card__logo img {
  max-inline-size: 100%;
  max-block-size: 100%;
  object-fit: contain;
}
/* 4 od 26 agencija nemaju logo — inicijal umjesto slomljene sličice. */
.agency-card__initial {
  font-family: var(--font-header, 'Montserrat', sans-serif);
  font-size: 1.6rem;
  font-weight: 600;
  color: var(--clr-accent);
}
.agency-card__name {
  font-family: var(--font-header, 'Montserrat', sans-serif);
  font-size: var(--step-05);
  font-weight: 600;
  line-height: 1.3;
  text-transform: none;
  color: var(--clr-ink);
  margin: 0;
}
.agency-card__name a {
  color: inherit;
  text-decoration: none;
}
/* Cijela kartica je klikabilna, ali fokus i dalje ide na sam link. */
.agency-card__name a::after {
  content: '';
  position: absolute;
  inset: 0;
}
.agency-card {
  position: relative;
}
.agency-card:hover {
  border-color: var(--brand-200, #b3cee6);
  box-shadow: var(--shadow-md);
}
.agency-card__name a:hover {
  color: var(--clr-accent);
}
.agency-card__place {
  font-size: 0.9rem;
  line-height: 1.5;
  color: var(--clr-ink-soft);
  margin: var(--space-2xs) 0 0;
}
/* Preko OBA stupca kartice: u desnom (uz logo od 4.5rem) mail od 30+ znakova
   lomio se na svaku riječ. Naziv i adresa ostaju uz logo. */
.agency-card__contact {
  grid-column: 1 / -1;
  list-style: none;
  padding: 0;
  margin: var(--space-s) 0 0;
  font-size: 0.9rem;
  line-height: 1.6;
}
/* Ikona + vrijednost. `align-items: start` (ne center): dug mail se prelomi u
   dva reda, a ikona tad mora ostati uz PRVI, ne otploviti na sredinu bloka. */
.agency-card__contact li {
  display: flex;
  align-items: start;
  gap: var(--space-xs);
}
.agency-card__icon {
  inline-size: 1.05rem;
  block-size: 1.05rem;
  flex-shrink: 0;
  /* Poravnanje s prvim retkom teksta: line-height je 1.6, ikona 1.05em. */
  margin-block-start: 0.28em;
  color: var(--clr-muted);
}
.agency-card__contact a {
  /* Iznad pokrivača iz .agency-card__name a::after — inače bi klik na mail
     otvorio detalj agencije umjesto poštanskog klijenta. */
  position: relative;
  z-index: 1;
  color: var(--clr-accent-2);
  text-decoration: none;
  overflow-wrap: anywhere;
}
.agency-card__contact a:hover {
  text-decoration: underline;
  text-underline-offset: 0.2em;
}

/* ---------- BLOCK: agency (detalj) ---------- */
.agency__head {
  display: flex;
  align-items: center;
  gap: var(--space-l);
  flex-wrap: wrap;
}
.agency__head h1 {
  margin: 0;
}
.agency__logo {
  display: grid;
  place-items: center;
  flex: none;
  inline-size: 6rem;
  block-size: 6rem;
  overflow: hidden;
  background: #fff;
  border: 1px solid var(--clr-border);
  border-radius: var(--radius-s);
}
.agency__logo img {
  max-inline-size: 100%;
  max-block-size: 100%;
  object-fit: contain;
}

/* ---------- BLOCK: auth (prijava) ----------
   Uski centrirani okvir, jedina iznimka od lijevog poravnanja na statičnim
   stranicama: forma nije tekst za čitanje nego jedan zadatak, pa se ne veže na
   lijevi rub sadržaja nego na sredinu praznog prostora. */
.auth {
  max-inline-size: 26rem;
  margin-inline: auto;
  padding-block-end: var(--space-2xl);
}
.auth__form {
  display: grid;
  gap: var(--space-m);
  padding: var(--space-xl);
  background: var(--clr-surface);
  border: 1px solid var(--clr-border);
  border-radius: var(--radius);
  box-shadow: var(--shadow-sm);
}
.auth__form .field {
  display: grid;
  gap: var(--space-2xs);
}
/* Poruka je uvijek u DOM-u (aria-live), pa je skrivena praznina — ne display:none,
   inače promjena teksta ne bi bila najavljena čitaču ekrana. */
.auth__error {
  margin: 0;
  font-size: 0.9rem;
  line-height: 1.5;
  color: var(--clr-danger-ink, #9f1239);
  background: var(--clr-danger-bg, #fff1f2);
  border: 1px solid var(--clr-danger-border, #fecdd3);
  border-radius: var(--radius-s);
  padding: 0;
  max-block-size: 0;
  overflow: hidden;
  opacity: 0;
  border-width: 0;
}
.auth__error.is-visible {
  padding: var(--space-xs) var(--space-s);
  max-block-size: 8rem;
  opacity: 1;
  border-width: 1px;
}
.auth__submit {
  inline-size: 100%;
  margin-block-start: var(--space-2xs);
}
.auth__aside {
  margin: 0;
  text-align: center;
  font-size: 0.9rem;
}
.auth__aside a {
  color: var(--clr-muted);
  text-decoration: none;
}
.auth__aside a:hover {
  color: var(--clr-accent);
  text-decoration: underline;
  text-underline-offset: 0.2em;
}

/* ---------- BLOCK: property (detalj) ---------- */
.property {
  padding-block: var(--space-l) var(--space-xl);
}
.property__title {
  /* NIJE --step-3 kao naslov kataloga. Ondje je naslov kratka fraza ("Häuser
     Kroatien zum Kaufen"), ovdje je cijela rečenica iz uvoza — prosječno bitno
     duža, pa se na 41.6px lomi u 2–3 retka i gura sadržaj ispod pregiba.
     24–33.6px umjesto 28.8–41.6px: ~20% manje na vrhu skale. */
  font-size: clamp(1.5rem, 1.2rem + 1.2vw, 2.1rem);
  font-weight: 700;
  letter-spacing: -0.02em;
  color: var(--clr-ink);
  line-height: 1.15;
  /* Legacy `h1 { border-bottom: 1px solid #eee; padding-bottom: 12px }` — crta
     između naslova i cijene ovdje nije dio dizajna (isto kao na listingu). */
  border: 0;
  padding-block-end: 0;
}
/* Šifra oglasa — desni rub reda s cijenom. `margin-inline-start: auto` je gura
   do kraja; kad red zbog uskog ekrana prelomi, sama padne u novi red. */
.property__code {
  margin-inline-start: auto;
  font-size: 0.85rem;
  font-weight: 400;
  color: var(--clr-muted);
  white-space: nowrap;
}
/* ---------- BLOCK: gallery (mozaik na detalju oglasa) ----------
   FIKSNIH 5 pozicija: naslovna lijevo + 4 sličice desno (2×2), sve u omjeru 3:2.
   Raspored NE ovisi o broju slika — prazne pozicije ispisuje view kao prozirne
   držače mjesta (.gallery__item--empty). Zato je i naslovna uvijek pola širine
   (716px pri 1440), a izvori su 800–1200px → smanjuju se, ne razvlače. */
.gallery {
  /* Namjerno šire od --content-width (1360). 1560 daje 100px proboja po strani —
     dovoljno da se čita kao odluka. Na 1440 je proboj bio samo 40px, što je
     izgledalo kao krivo poravnanje. */
  --gallery-width: 1560px;
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--space-xs);
  /* 3/1 na spremniku daje 3:2 i naslovnoj i svim sličicama: pri 1440px je
     spremnik visok 480, hero 716×480 (1,49), sličice 354×236 (1,50).
     Fotografije nekretnina su 3:2 — kvadratni hero bi im rezao ~33% širine. */
  aspect-ratio: 3 / 1;
}
/* Proboj iz --content-width: galerija je jedini element stranice koji ide šire.
   Uvjetovan na široke ekrane — ispod ~1422px je wrapper ionako 90% pa proboja
   nema odakle biti, a na mobitelu bi galerija samo virila par piksela.
   Postotak u margin-inline se računa od širine wrappera, pa ovo drži centar. */
@media (min-width: 90rem) {
  .gallery {
    inline-size: min(94vw, var(--gallery-width));
    margin-inline: calc(50% - min(94vw, var(--gallery-width)) / 2);
  }
}
/* Uvijek 2×2 — broj slika ne mijenja raspored. */
.gallery__thumbs {
  display: grid;
  grid-template: repeat(2, 1fr) / repeat(2, 1fr);
  gap: var(--space-xs);
}

.gallery__item {
  position: relative;
  display: block;
  padding: 0;
  border: 0;
  overflow: clip;
  border-radius: var(--radius-s);
  background: var(--clr-border);
  cursor: pointer;
}
.gallery__item img {
  inline-size: 100%;
  block-size: 100%;
  object-fit: cover;
  display: block;
  transition: scale 0.25s ease;
}
.gallery__item:hover img {
  scale: 1.04;
}
.gallery__item:focus-visible {
  outline: 0;
  box-shadow: 0 0 0 3px var(--clr-accent);
}
/* Nepopunjena pozicija: blaga ploha koja popuni prostor, pa se mozaik čita kao
   cjelina umjesto da desno zjapi praznina. Nije klikabilna (view je ispisuje kao
   <span aria-hidden>), pa je čitači ekrana ne vide ni ne mogu fokusirati.

   Svjetlija je od .gallery__item (--clr-border): dok je bila u istoj nijansi,
   prazna pozicija se nije razlikovala od fotografije koja se još učitava.
   Mjereno na konekciji `import` (CATALOG_CONNECTION) uz filtre koje detalj
   stvarno servira: 1829 od 12419 oglasa (14,7%) ima manje od 5 slika, a 500
   oglasa (4,0%) ima točno jednu i pokaže čak četiri takve plohe — zato ne
   smiju vući pažnju. */
.gallery__item--empty {
  background: var(--clr-placeholder);
  cursor: default;
}

/* "12 Fotos" preko zadnje sličice — javlja da ih ima više nego što se vidi */
.gallery__more {
  position: absolute;
  inset: 0;
  display: grid;
  place-items: center;
  padding: var(--space-2xs);
  font-size: 1.05rem;
  font-weight: 600;
  letter-spacing: 0.01em;
  text-align: center;
  color: #fff;
  /* Zadnja kockica NIJE fotografija nego gumb — zamućenje je degradira iz sadržaja
     u akciju i doslovno sugerira dubinu ("iza ovoga ima još"). blur(1px) je bio
     premali da se pročita kao namjera; 3px je odluka, a zastor je zato svjetliji
     pa se ispod još razaznaje da je riječ o slici. */
  background: rgba(20, 26, 31, 0.42);
  backdrop-filter: blur(3px);
}
/* Bez backdrop-filtera (stariji Firefox) zastor mora sam nositi kontrast. */
@supports not (backdrop-filter: blur(3px)) {
  .gallery__more {
    background: rgba(20, 26, 31, 0.58);
  }
}

/* Uski ekran: naslovna preko cijele širine, sličice u red ispod. */
@media (max-width: 45rem) {
  .gallery {
    grid-template-columns: 1fr;
    aspect-ratio: auto;
  }
  .gallery__hero {
    aspect-ratio: 3 / 2;
  }
  /* Sve četiri pozicije u jedan red — prazne i dalje drže svoje mjesto. */
  .gallery__thumbs {
    grid-template: 1fr / repeat(4, 1fr);
  }
  .gallery__thumbs .gallery__item {
    aspect-ratio: 1 / 1;
  }
}

@media (prefers-reduced-motion: reduce) {
  .gallery__item img {
    transition: none;
  }
  .gallery__item:hover img {
    scale: 1;
  }
}

/* ---------- BLOCK: lightbox (gradi ga js/gallery-lightbox.js) ---------- */
.has-lightbox {
  overflow: hidden;
} /* pozadina se ne smije skrolati */
.lightbox {
  position: fixed;
  inset: 0;
  z-index: 999;
  display: grid;
  grid-template-columns: auto 1fr auto;
  align-items: center;
  gap: var(--space-s);
  padding: var(--space-m);
  background: rgba(10, 14, 18, 0.93);
}
.lightbox[hidden] {
  display: none;
}
.lightbox__stage {
  grid-column: 2;
  display: grid;
  place-items: center;
  block-size: 100%;
  min-inline-size: 0;
}
.lightbox__img {
  max-inline-size: 100%;
  max-block-size: 100%;
  object-fit: contain;
  border-radius: var(--radius-s);
}
.lightbox__close,
.lightbox__nav {
  display: grid;
  place-items: center;
  padding: 0;
  border: 0;
  border-radius: 999px;
  background: rgba(255, 255, 255, 0.12);
  color: #fff;
  cursor: pointer;
  transition: background 0.15s ease;
}
.lightbox__close:hover,
.lightbox__nav:hover {
  background: rgba(255, 255, 255, 0.28);
}
.lightbox__close:focus-visible,
.lightbox__nav:focus-visible {
  outline: 0;
  box-shadow: 0 0 0 3px var(--clr-accent);
}
.lightbox__nav {
  inline-size: 3rem;
  block-size: 3rem;
  font-size: 1.8rem;
  line-height: 1;
}
.lightbox__nav--prev {
  grid-column: 1;
}
.lightbox__nav--next {
  grid-column: 3;
}
.lightbox__nav[hidden] {
  visibility: hidden;
  display: grid;
} /* zadrži stupac */
.lightbox__close {
  position: absolute;
  inset-block-start: var(--space-m);
  inset-inline-end: var(--space-m);
  inline-size: 2.5rem;
  block-size: 2.5rem;
  font-size: 1.6rem;
  line-height: 1;
}
.lightbox__counter {
  grid-column: 2;
  margin: 0;
  text-align: center;
  font-size: 0.9rem;
  color: rgba(255, 255, 255, 0.75);
}

@media (max-width: 45rem) {
  /* Na mobitelu se lista swipeom — strelice bi samo jele prostor slike. */
  .lightbox {
    grid-template-columns: 1fr;
    padding: var(--space-xs);
  }
  .lightbox__nav {
    display: none;
  }
  .lightbox__stage,
  .lightbox__counter {
    grid-column: 1;
  }
}
/* zaglavlje oglasa — naslov + cijena, ODMAH ISPOD galerije */
/* Legacy legacy.css stilizira goli <header> (chrome stranice) i sve to curi na naš
   <header class="property__header">:
     header { align-items: center; justify-content: space-between;
              background: #fff; border-bottom: 1px solid #eee }
     @media (max-width: 900px) { header { height: 45px; overflow: hidden } }
   Posljedica je bila: cijena centrirana na desktopu, a na mobitelu zaglavlje
   odrezano na 45px — naslov presječen, CIJENA I GRAD NEVIDLJIVI. Sve gasimo. */
.property__header {
  display: flex;
  flex-direction: column;
  align-items: stretch;
  justify-content: flex-start;
  /* 24px naslov → cijena. Cijena je najvažniji broj na stranici i mora imati
     zraka s obje strane da je oko uhvati prije naslova. */
  gap: var(--space-l);
  block-size: auto;
  overflow: visible;
  background: none;
  border-block-end: 0;
}
.property__header .property__title {
  margin: 0;
}

/* Prečac do forme za upit — SAMO ispod 60rem. Iznad toga je forma u desnom
   stupcu, vidljiva bez skrolanja, pa bi gumb koji vodi na nju bio šum.
   Ispod 60rem layout je jedan stupac i forma padne iza opisa, specifikacija i
   opreme — bez prečaca do nje treba proskrolati cijeli oglas. */
.property__cta {
  display: none;
}
@media (max-width: 60rem) {
  .property__cta {
    display: block;
    margin: 0;
  }
  .property__cta .btn {
    inline-size: 100%;
    padding-block: 0.8rem;
  }
  /* Meta odredišta ne smije biti zalijepljena uz gornji rub nakon skoka. */
  .property__side {
    scroll-margin-block-start: var(--space-l);
  }
}

/* ---------- ELEMENT: highlights (4 ključne oznake ispod cijene) ----------
   auto-fit s minimumom od 9rem: 4 u red kad ima mjesta, 2×2 na užem, 1 stupac
   na mobitelu — bez ijednog media queryja. */
.highlights {
  display: grid;
  /* 16rem (256px) NIJE proizvoljno: na stupcu od 1000px stanu točno 3 trake
     (3×256 + 2×8 = 784 ≤ 1000; četvrta bi tražila 1048), pa 6 stavki daje
     traženih 2×3. Ispod ~790px pada na 2, na mobitelu na 1 — bez media queryja.
     min(100%) da ćelija ne prelije uski ekran. */
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 16rem), 1fr));
  gap: var(--space-xs);
  margin: 0;
  padding: 0;
  list-style: none;
}
/* Strip je jedini uokvireni element u zaglavlju, pa mu treba više zraka nego što
   ga ima između naslova i cijene. Margina se u flex spremniku ZBRAJA s gapom →
   24 + 16 = 40px. Cijena time ima 24px iznad i 40px ispod i stoji sama u praznini,
   što je i razlog zašto se prva uhvati. */
.property__headline + .highlights {
  margin-block-start: var(--space-m);
}
/* Vodoravno: ikona lijevo, uz nju vrijednost pa labela. Ćelija je ~64px visoka
   naspram ~112px koliko bi tražila okomita — strip sjedi između cijene i opisa,
   pa svaki red visine gura opis niže. */
.highlights__item {
  display: flex;
  align-items: center;
  gap: var(--space-s);
  min-inline-size: 0;
  padding: var(--space-s) var(--space-m);
  background: var(--clr-surface);
  border: 1px solid var(--clr-border);
  border-radius: var(--radius-s);
}
.highlights__icon {
  flex: 0 0 auto;
  inline-size: 1.75rem;
  block-size: 1.75rem;
  color: var(--clr-accent); /* jedino mjesto gdje ikona nosi boju — ovo je istaknuto */
}
.highlights__body {
  display: flex;
  flex-direction: column;
  min-inline-size: 0; /* bez ovoga dug grad rastegne ćeliju */
}
.highlights__value {
  font-size: var(--step-1);
  font-weight: 600;
  color: var(--clr-ink);
  line-height: 1.25;
  /* Ime grada zna biti dugo ("Sveti Petar u Šumi") — lomi se, ne prelijeva. */
  overflow-wrap: anywhere;
}
.highlights__label {
  font-size: 0.75rem;
  color: var(--clr-muted);
  line-height: 1.3;
}
/* Jedinica prati broj, ne vodi ga — isto pravilo kao na kartici. */
.highlights__unit {
  font-size: 0.78em;
  font-weight: 400;
  color: var(--clr-muted);
}

.property__headline {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: var(--space-s) var(--space-m);
  margin: 0;
}
.property__price {
  /* MORA biti veća od naslova. Na step-2 je bila 28px naspram naslovnih 33.6px,
     pa je oko prvo hvatalo naslov — a na stranici oglasa cijena je razlog dolaska.
     25.6–35.2px: na svakoj širini par piksela iznad .property__title. */
  font-size: clamp(1.6rem, 1.3rem + 1.1vw, 2.2rem);
  font-weight: 700;
  line-height: 1.15;
  color: var(--clr-price);
}
/* "Preis auf Anfrage" je 17 znakova — na veličini iznosa razbija red. */
.property__price--request {
  font-size: var(--step-1);
  color: var(--clr-ink-soft);
}
.property__ppm,
.property__city {
  color: var(--clr-muted);
  font-size: 0.95rem;
}

/* ---------- BLOCK: property layout (ispod galerije) ----------
   Lijevo sadržaj (opis, specifikacije, oprema), desno sticky forma za upit. */
/* VERTIKALNI RITAM DETALJA — tri razine, ne jedna.
   Sve je dosad bilo na .flow defaultu (16px), pa je rez između galerije i
   naslova bio jednak razmaku između dva susjedna panela — a to su potpuno
   različite težine. Sada:
     breadcrumb → galerija   16px  (chrome, drži se uz ono što slijedi)
     galerija   → naslov     40px  (najveći rez na stranici)
     naslov     → panel      24px
     panel      → panel      24px                                        */
.property > .property__layout {
  --flow-space: var(--space-xl);
}
.property__main > .panel {
  --flow-space: var(--space-l);
}
/* Zaglavlje (naslov + cijena) NIJE panel — rez prema prvom panelu mora biti veći
   od razmaka između dva susjedna panela, inače naslov izgleda kao da pripada
   opisu. 40px naspram 24px. */
.property__main > .property__header + .panel {
  --flow-space: var(--space-xl);
}

.property__layout {
  display: grid;
  gap: var(--space-xl);
  grid-template-columns: 1fr var(--sidebar-width); /* isti token kao filteri na listingu */
  align-items: start;
}
/* ISTA legacy zamka kao na listingu: legacy.css:947 pina SVAKI <section> na
   `grid-column: 1 / 8`, a legacy.css:953 SVAKI <aside> na `9 / 13`. Naš grid ima
   2 stupca pa linija 13 ne postoji — preglednik izmisli implicitne trakove i
   razbaca stupce. Vraćamo auto-placement. */
.property__layout > .property__main,
.property__layout > .property__side {
  grid-column: auto;
}

/* Legacy `legacy.css:3495` — `@media (max-width: 1050px) { aside { margin-top: 32px } }`.
   BEZ media queryja, iz istog razloga kao kod .catalog__aside: pod min-width
   60.0625rem reset je vrijedio samo u pojasu 961–1050px, a ispod 960px se legacy
   margina zbrajala s razmakom grida (40 + 32 = 72px). */
.property__layout > .property__side {
  margin-block-start: 0;
}

/* Grid-djeca imaju min-width:auto — dug naslov ili URL bez razmaka inače
   rastegne stupac i razbije omjer 1fr : sidebar. */
.property__main,
.property__side {
  min-inline-size: 0;
}
.property__side {
  position: sticky;
  top: var(--space-l);
}

/* ---------- BLOCK: panel (bijela kartica sa sadržajem) ---------- */
.panel {
  padding: var(--space-l);
  background: var(--clr-surface);
  border: 1px solid var(--clr-border);
  border-radius: var(--radius);
  box-shadow: var(--shadow-sm);
  /* BAZA za sav sadržaj panela. Bez ovoga sve unutra (opis, specifikacije,
     oprema) nasljeđuje 10px s `body { font-size: 62.5% }` (legacy.css:238), jer
     nijedan od tih elemenata nema vlastitu veličinu. Postavljeno na panel, ne
     na svaki element posebno, da i budući sadržaj dobije ispravnu veličinu. */
  font-size: 0.95rem;
}
.panel__title {
  /* 24px — mora biti VEĆE od razmaka među odlomcima (16px, v. .prose p + p),
     inače se naslov čita kao dio prvog odlomka. */
  margin: 0 0 var(--space-l);
  /* Hijerarhiju sada nosi i težina (700 naspram 300 u tijelu), pa naslov ne mora
     biti krupan. step-2 (do 28px) je djelovao preveliko samo zato što je sadržaj
     ispod bio na 10px — kad je sadržaj na 15.2px, step-1 je dovoljan. */
  font-size: var(--step-1);
  font-weight: 700;
  color: var(--clr-ink);
}
/* NAPOMENA: forma za upit je u stupcu od 18rem (~240px unutarnje širine). Ako se
   .panel__title ikad vrati na step-2 (do 28px), "Anfrage senden" će se ondje
   prelomiti u dva reda i trebat će vratiti izuzetak `.inquiry .panel__title`. */
.prose {
  /* Jedini blok na stranici namijenjen ČITANJU, ne skeniranju — korak iznad
     baze panela. */
  font-size: var(--step-0);
  line-height: 1.7;
  color: var(--clr-ink-soft);
  /* 75ch je GORNJA granica udobnog raspona (45–75 znakova po retku). Puna širina
     stupca dala bi ~110 znakova — predugo. Dva stupca NE dolaze u obzir: opisi su
     u prosjeku 1348 znakova, ali 1145 oglasa prelazi 2500, a najduži ima 9248 —
     to bi bilo ~2600px po stupcu, dakle skrolaj dolje pa se vrati gore. */
  max-inline-size: 75ch;
}
/* Odlomci: 16px između njih, naspram 24px ispod naslova panela. Razmak ispod
   naslova MORA biti veći od razmaka među odlomcima — inače naslov izgleda
   zalijepljen za prvi odlomak, a odlomci međusobno razdvojeniji od naslova. */
.prose p {
  margin: 0;
}
.prose p + p {
  margin-block-start: var(--space-m);
}

/* ---------- ELEMENT: facts (tablica specifikacija) ----------
   Dva stupca kad ima mjesta; svaki redak je labela lijevo, vrijednost desno. */
.facts {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr));
  gap: 0 var(--space-xl);
  margin: 0;
}
.facts__item {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--space-s);
  padding-block: 0.55rem;
  border-block-end: 1px solid var(--clr-border);
}
.facts__label {
  color: var(--clr-muted);
}
.facts__value {
  margin: 0; /* <dd> ima default margin-inline-start: 40px */
  font-weight: 600;
  color: var(--clr-ink);
  text-align: end;
}

/* ---------- ELEMENT: amenities (oprema s kvačicama) ---------- */
.amenities {
  display: grid;
  /* ISTI trakovi i isti stupčani razmak kao .facts — oprema i specifikacije su
     dva popisa jedan ispod drugog, pa im se stupci moraju poklapati. S 11rem je
     oprema imala 5 stupaca naspram 3 u specifikacijama i panel se raspadao. */
  grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr));
  gap: var(--space-xs) var(--space-xl);
  margin: 0;
  padding: 0;
  list-style: none;
}
.amenities__item {
  display: flex;
  align-items: center;
  gap: var(--space-xs);
  color: var(--clr-ink);
}
.amenities__check {
  flex: 0 0 auto;
  inline-size: 1.05rem;
  block-size: 1.05rem;
  color: var(--clr-accent);
}

/* ---------- BLOCK: inquiry (upit agenciji) ---------- */
.inquiry {
  display: flex;
  flex-direction: column;
  gap: var(--space-s);
}
.inquiry__intro {
  margin: calc(var(--space-m) * -1) 0 0; /* naslov već nosi razmak ispod */
  color: var(--clr-muted);
  font-size: 0.9rem;
}
/* .field je u filter panelu flex-item s basis 12rem — ovdje mora biti prirodne visine. */
.inquiry .field {
  flex: 0 0 auto;
}
.inquiry__message {
  resize: vertical;
  min-block-size: 5.5rem;
}

/* HONEYPOT — mora ostati u DOM-u i submitati se, pa NE smije biti display:none
   ni visibility:hidden (dio botova preskače takva polja, a i neki preglednici
   ih izostave iz FormData). Miče se iz toka i s ekrana. */
.inquiry__hp {
  position: absolute;
  inline-size: 1px;
  block-size: 1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  opacity: 0;
  pointer-events: none;
}

/* Prihvaćanje uvjeta — .check dolazi iz filter panela (ista kvačica i veličina). */
.inquiry__agb {
  align-items: start; /* dugi tekst se lomi u više redova */
  gap: var(--space-xs);
  line-height: 1.45;
}
.inquiry__agb input {
  margin-block-start: 0.15rem;
} /* poravnaj s prvim retkom */
.inquiry__agb-link {
  color: var(--clr-accent-2);
  text-decoration: underline;
}
.inquiry__submit {
  margin-block-start: var(--space-2xs);
  padding-block: 0.8rem;
}
.inquiry__submit:disabled {
  opacity: 0.6;
  cursor: progress;
}

/* Polje koje je endpoint odbio (data.field = 'mail' | 'kod'). */
.field--error .field__input {
  border-color: var(--clr-heart);
}
.field--error .field__label {
  color: var(--clr-heart);
}

.inquiry__result {
  margin: 0;
  padding: var(--space-xs) var(--space-s);
  border-radius: var(--radius-s);
  font-size: 0.9rem;
}
/* Zelena/crvena su ovdje NAMJERNE — poruka o uspjehu/grešci, ne dekoracija.
   To je jedina zelena koja smije ostati na stranici. */
.inquiry__result.is-ok {
  color: var(--clr-success-ink, #065f46);
  background: var(--clr-success-bg, #ecfdf5);
  border: 1px solid var(--clr-success-border, #a7f3d0);
}
.inquiry__result.is-error {
  color: var(--clr-danger-ink, #9f1239);
  background: var(--clr-danger-bg, #fff1f2);
  border: 1px solid var(--clr-danger-border, #fecdd3);
}
/* Poslano — polja više ne trebaju, ostaje naslov i potvrda. */
.inquiry.is-sent .field,
.inquiry.is-sent .inquiry__intro,
.inquiry.is-sent .inquiry__submit {
  display: none;
}

@media (max-width: 60rem) {
  /* row-gap: 40px iz .property__layout je razmak MEĐU STUPCIMA — ispravan dok su
     sadržaj i upit jedan pored drugog. U jednom stupcu ista vrijednost postaje
     okomiti rez, a forma je `.inquiry.panel` s `.panel__title`, dakle ista
     kartica kao tri iznad nje. Na 40px ispada kao slučajna rupa u nizu koji je
     inače na 24px (v. `.property__main > .panel` --flow-space). */
  .property__layout {
    grid-template-columns: 1fr;
    row-gap: var(--space-l);
  }
  .property__side {
    position: static;
  }
}
