/* ===========================================================
   WINKLA — global styles
   =========================================================== */

/* -----------------------------------------------------------
   Pisma s vlastitog poslužitelja.
   Prije su se učitavala s fonts.googleapis.com, čime se Googleu
   pri svakom posjetu slala IP adresa posjetitelja — jedini kontakt
   stranice s trećom stranom. Sada nema nijednog vanjskog zahtjeva.
   unicode-range je zadržan, pa preglednik dohvaća samo onaj podskup
   koji mu stvarno treba (latin-ext samo kad naiđe na č, ć, š, ž, đ).
   Permanent Marker nema latin-ext, zato Kalam preuzima dijakritike.
   ----------------------------------------------------------- */
/* Kalam 300 — latin-ext */
@font-face{
  font-family: 'Kalam';
  font-style: normal;
  font-weight: 300;
  font-display: swap;
  src: url('fontovi/kalam-300-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* Kalam 300 — latin */
@font-face{
  font-family: 'Kalam';
  font-style: normal;
  font-weight: 300;
  font-display: swap;
  src: url('fontovi/kalam-300-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* Kalam 400 — latin-ext */
@font-face{
  font-family: 'Kalam';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('fontovi/kalam-400-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* Kalam 400 — latin */
@font-face{
  font-family: 'Kalam';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('fontovi/kalam-400-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* Kalam 700 — latin-ext */
@font-face{
  font-family: 'Kalam';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('fontovi/kalam-700-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* Kalam 700 — latin */
@font-face{
  font-family: 'Kalam';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('fontovi/kalam-700-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* Permanent Marker 400 — latin */
@font-face{
  font-family: 'Permanent Marker';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('fontovi/permanent-marker-400-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

:root{
  --ink:        #0d1b2a;   /* near-black navy (naslovi) */
  --ink-soft:   #33414f;
  --paper:      #f7f7f4;   /* pozadina */
  --paper-2:    #ffffff;
  --line:       #e4e5df;   /* grid linije */
  --accent:     #2f7bff;   /* selekcija / handleovi */
  --accent-bg:  #cfe0ff;   /* highlight iza naslova */
  --muted:      #8a8f98;
  /* nijanse površina iznad kartice (naslovne trake, pilule, mjehurići) */
  --chrome:     #fafbfc;   /* naslovna traka prozora, pilula forme */
  --chrome-2:   #ececea;   /* jača nijansa: traka kartice, mjehurić FAQ-a */
  --chrome-3:   #e1e1e4;   /* hover mjehurića */
  --tint:       #eef4ff;   /* blagi plavi highlight (odabrano stanje) */
  --tint-2:     #dbe8ff;   /* jači plavi highlight */
  /* Boje mreže koju crta fluid. Zasebne su od --paper/--line/--ink jer ih
     fluid čita samo jednom pri pokretanju, pa mora biti sigurno da ih poslije
     nitko ne mijenja pod njim. */
  --fluid-papir:  #f7f7f4;
  --fluid-linija: #e4e5df;
  --fluid-tinta:  #0d1b2a;
  /* Zastor prijelaza među stranicama. Namjerno nije --ink: ink je boja
     teksta, pa se puni ekran u njoj čita kao da se stranica ugasila.
     Nijansa je točno ona s gumba Kontakt (218 stupnjeva), samo prigušena:
     gumb ima luminanciju 0.220, a zastor 0.037. Puna svjetlina accenta
     ovdje ne ide iz dva razloga — potrošila bi signal boje koja inače
     znači "ovo se klika", a kontrast prema papiru bi pao s 10:1 na 3.6:1,
     pa bi se rub raspadanja izgubio na stranici koja se probija ispod. */
  --prijelaz:   #183567;
  /* Razmak od vrha stranice do mrvica. Jedna vrijednost za sve
     podstranice — prije je svaka vrsta imala svoju, pa su mrvice
     stajale na različitim visinama.
     Donju granicu drži fiksni header: visok je 90px, ali mu sadržaj
     (pilula Kontakt) vizualno završava na 68, pa je 78 najniže na čemu
     mrvice stoje a da ne dođu pod njega. Prije je ovdje bilo
     clamp(104px, 13vh, 132px) i zbog toga je kartica na 1440x800
     izlazila 37-40px ispod pregiba. */
  --vrh:        clamp(78px, 9.6vh, 106px);
  /* Širina retka s mrvicama. Uzeta je po najužem kontejneru na stranici
     (.blog: 1120 - 2x30 pada = 1060). Svi su kontejneri centrirani na
     ekranu, pa centriranje ove iste mjere unutar bilo kojeg od njih
     daje isti položaj — mrvice tako stoje na istom mjestu na svakoj
     podstranici, bez obzira koliko je njezin kontejner širok. */
  --mrvice-w:   1060px;
  --font-brush: 'Permanent Marker', 'Kalam', cursive;   /* Kalam fallback za hrvatske dijakritike */
  --font-hand:  'Kalam', cursive;
  /* Sistemski sans za sve što se čita, a ne gleda: duži tekst, kontakt
     podaci, navigacija. Rukopisni fontovi ostaju naslovima i akcentima. */
  --font-ui:    -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;
  /* Sjaj po rubovima ekrana: uzak pojas uz sam rub, ne razlijevanje preko
     pola kadra. Zato je zasićenje visoko a doseg kratak — obrnuto od prve
     verzije, koja je bila blijeda i široka pa se čitala kao izblijedjeli
     render umjesto kao rub. */
  --sjaj-rub:   rgba(47, 123, 255, .62);
  --sjaj-siri:  rgba(47, 123, 255, .30);
  --radius:     18px;
  --maxw:       1200px;
}

*{ margin:0; padding:0; box-sizing:border-box; }
/* iOS Safari sam napuhuje pisma u nekim rasporedima ("text inflation") i tada
   sadrzaj naraste sire nego sto je izracunato — na telefonu to zna gurnuti
   karticu izvan kadra. 100% zadrzava velicine koje smo zadali. */
html{ -webkit-text-size-adjust: 100%; text-size-adjust: 100%; }

/* Sjaj po rubovima kadra. Stoji iznad cijelog sadržaja (koji ide do z-4) a
   ispod kroma (izbornik 60, zaglavlje 61, pokazivač 65, traka 70, prijelaz
   299, učitavanje 9999) — pa stranica dobije okvir, a sučelje ostane oštro.
   Dvije unutarnje sjene: tvrdi rub i kratko rasipanje iza njega; kutovi se
   pojačaju sami jer ondje doprinose dva ruba. */
body::after{
  content:'';
  position: fixed; inset: 0;
  /* Sjaj je okvir oko onoga sto se vidi, pa za razliku od mreze ide na
     DINAMICKI kadar: mora se pomicati zajedno s adresnom trakom, inace bi mu
     donji rub ostao skriven ispod nje. */
  bottom: auto; height: 100%; height: 100dvh;
  z-index: 50; pointer-events: none;
  /* Vidljivost vodi zastor učitavanja: dok se stranica otkriva kroz mrlje,
     rub se pali zajedno s njom. Zadano je 1 — bez JS-a ili kad zastora nema,
     sjaj naprosto stoji. */
  opacity: var(--sjaj-vidljivost, 1);
  box-shadow:
    inset 0 0 clamp(22px, 2.4vw, 54px) var(--sjaj-rub),
    inset 0 0 clamp(64px, 6.5vw, 150px) var(--sjaj-siri);
}

html,body{
  height:100%;
  /* onemogući rubber-band / overscroll iznad vrha i ispod dna */
  overscroll-behavior: none;
  /* nativna scrollbar skrivena — koristimo custom .scroll-progress traku */
  scrollbar-width: none;
  -ms-overflow-style: none;
}
html::-webkit-scrollbar, body::-webkit-scrollbar{ display: none; width:0; height:0; }

body{
  font-family: var(--font-hand);
  color: var(--ink);
  background: var(--paper);
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
  overflow-x: hidden;
}

/* suptilan blueprint grid + papir */
.bg-grid{
  position: fixed;
  inset: 0;
  /* Na mobilnom pregledniku `inset: 0` znaci MALI kadar — onaj s razvucenom
     adresnom trakom. Cim se traka skupi, otkrije se pojas koji ovaj sloj ne
     pokriva i mreza se odreze. lvh je najveci kadar, pa pokriva oba stanja;
     visak je skriven iza trake dok je razvucena. */
  bottom: auto; height: 100%; height: 100lvh;
  z-index: 0;
  pointer-events: none;
  background-image:
    linear-gradient(var(--line) 1px, transparent 1px),
    linear-gradient(90deg, var(--line) 1px, transparent 1px);
  background-size: 46px 46px;
  /* Ista vrijednost mora stajati i u js/fluid.js (uProzirnost), inače se
     CSS grid i onaj crtan u WebGL-u razilaze. */
  opacity:.85;
  -webkit-mask-image: radial-gradient(120% 120% at 50% 40%, #000 55%, transparent 100%);
          mask-image: radial-gradient(120% 120% at 50% 40%, #000 55%, transparent 100%);
}

/* Isti grid, ali crtan u WebGL-u da ga fluid može razvlačiti (js/fluid.js).
   Klasa ima-fluid dolazi tek kad simulacija stvarno proradi, pa je CSS
   verzija iznad i dalje ono što svi ostali vide. */
.bg-fluid{
  position: fixed; inset: 0;
  bottom: auto;
  width: 100%;
  height: 100%; height: 100lvh;   /* isti razlog kao kod .bg-grid */
  pointer-events: none;
}
.ima-fluid .bg-grid{ display: none; }

/* ===========================================================
   ZASLON UČITAVANJA
   Zastor je platno preko cijelog ekrana, obojeno u papir. Mrlje ga ne
   prekrivaju bojom nego ga BRIŠU (destination-out), pa se kroz njih vidi
   prava stranica ispod — mreža, fluid, hero — umjesto da se preko svega
   navuče još jedan sloj koji poslije nestane. Zato tu nema paleta: ono što
   se pojavljuje jest sama stranica.
   Crtanje je u JS-u jer CSS nema način da jedan element izbuši drugim.
   Bez JS-a platno ostane prazno i uklanja ga isti modul, a i da ne uspije,
   ovdje nema ničega što bi zaklonilo sadržaj.
   =========================================================== */
.ucitavanje{
  position: fixed; inset: 0; z-index: 9999;
  width: 100%; height: 100%;
  display: block; pointer-events: none;
}
.bez-ucitavanja .ucitavanje{ display: none; }
@media (prefers-reduced-motion: reduce){
  .ucitavanje{ display: none; }
}

a{ color: inherit; text-decoration: none; }
/* height:auto ide uz max-width jer slike u markupu nose width/height atribute.
   Ti atributi su prezentacijski nagovještaj — preglednik ih čita kao CSS width
   i height. Autorski `width` iz stylesheeta pregazi samo prvi; height ostaje na
   atributu, pa se slika razvuče na njegovu vrijednost (hero ikone su tako bile
   80x998 umjesto 80x80). S height:auto atributi rade ono zbog čega i postoje —
   rezerviraju omjer da se raspored ne trza dok se slika učitava — a veličinu
   dalje vodi CSS. */
img{ display:block; max-width:100%; height:auto; }

/* krug koji prati pokazivač; nestaje nad klikabilnim elementima */
.cursor{
  position: fixed; left: 0; top: 0; z-index: 65;
  width: 13px; height: 13px;
  border-radius: 50%;
  background: var(--accent);         /* solid točka, ista boja kao Kontakt gumb */
  border: 2px solid transparent;
  box-sizing: border-box;
  opacity: 1;
  pointer-events: none;
  will-change: transform, width, height;
  transition: width .28s cubic-bezier(.2,.8,.2,1), height .28s cubic-bezier(.2,.8,.2,1),
              border-radius .28s ease, background-color .22s ease, border-color .22s ease, opacity .2s ease;
}
.cursor.hide{ opacity: 0; }
/* prošireno: čist plavi obrub oko elementa (bez ispune) */
.cursor.wrap{ background: transparent; border-color: var(--accent); }
/* Treće stanje: točka se rastvori u ČETIRI KUTNA KVADRATIĆA — isti znak
   odabira kojim je označena tekuća stavka u ravnalu uz kartice usluga i kutovi
   okvira. Kvadratići se crtaju pozadinom, pa rastu zajedno s okvirom bez
   ijednog dodatnog elementa: na 13px izgledaju kao jedna točka, a kako se
   okvir širi, razmiču se u kutove. */
.cursor.kut{
  background-color: transparent;
  border-color: transparent;
  background-image:
    linear-gradient(var(--accent), var(--accent)),
    linear-gradient(var(--accent), var(--accent)),
    linear-gradient(var(--accent), var(--accent)),
    linear-gradient(var(--accent), var(--accent));
  background-size: 7px 7px;
  background-repeat: no-repeat;
  background-position: left top, right top, left bottom, right bottom;
}
@media (hover: none), (pointer: coarse){ .cursor{ display: none; } }
/* Uz smanjen pokret js modul ni ne starta, ali element ostaje u dokumentu na
   svih 40 stranica — pa se skriva i ovdje, da ne visi plava točka na sredini
   ekrana ako skripta ikad zakaže. */
@media (prefers-reduced-motion: reduce){
  .cursor{ display: none; }
  /* Ikone u heor sekciji naslovnice nemaju vlastito isticanje — komentar uz
     .nav-icon img kaže da ga je preuzeo prsten pokazivača. Bez prstena ostaju
     bez ijednog znaka da se klikaju, pa ga natpis nadoknađuje bojom. */
  .nav-icon:hover span{ color: var(--accent); }
}
/* Tipkovnicom se prsten pokazivača ne vidi nikad, bez obzira na postavku
   pokreta — zato fokus ima svoje isticanje uvijek. */
.nav-icon:focus-visible{ outline: none; }
.nav-icon:focus-visible span{ color: var(--accent); text-decoration: underline; text-underline-offset: 4px; }
.nav-icon:focus-visible img{ outline: 2px solid var(--accent); outline-offset: 8px; border-radius: 6px; }

/* custom scroll traka uz dno ekrana — crta se slijeva nadesno kako se skrola */
/* Pilula, a ne traka preko cijelog dna. Puna širina na bottom:0 sjedila je
   točno na najjačem dijelu sjaja i presijecala ga tvrdom crtom; uvučena
   pilula stoji unutar njega. Boja je accent, ne više fiksna tamna — ta je
   odabrana zbog tamnog dna footera kojeg više nema. */
.scroll-progress{
  position: fixed;
  left: 50%; translate: -50% 0;
  bottom: clamp(12px, 1.8vh, 22px);
  width: min(300px, 42vw); height: 5px;
  border-radius: 999px;
  background: rgba(13, 27, 42, .09);      /* staza, da se vidi dokle ima još */
  overflow: hidden;
  z-index: 70;
  pointer-events: none;
}
.scroll-progress__fill{
  position: absolute; top: 0; bottom: 0; left: 0;
  width: 0%;
  background: var(--accent);
  border-radius: 999px;
}
@media (hover: none), (pointer: coarse){ .scroll-progress{ display:none; } }

/* custom boja označavanja (selekcije) teksta — brend plava */
::selection{ background: var(--accent); color:#fff; }
::-moz-selection{ background: var(--accent); color:#fff; }

/* ===========================================================
   Top bar (MENU + CTA)
   =========================================================== */
.topbar{
  position: fixed;
  top: 0; left: 0; right: 0;
  /* iznad .nav-overlay (60) — isti gumb otvara i zatvara izbornik, pa mora
     ostati dohvatljiv i kad je izbornik otvoren */
  z-index: 61;
  display:flex; align-items:center; justify-content:space-between;
  padding: 22px 30px;
  pointer-events:none;
  transition: transform .3s cubic-bezier(.4,0,.2,1);
}
.topbar > *{ pointer-events:auto; }
/* skriva se pri skrolu prema dolje, vraća pri skrolu gore (vidi headerAutoHide) */
.topbar--skriven{ transform: translateY(-100%); }
@media (prefers-reduced-motion: reduce){ .topbar{ transition: none; } }

.menu-btn{
  position: relative;
  transition: color .35s ease;
  font-family: var(--font-brush);
  font-size: 1.125rem;
  letter-spacing:.5px;
  color: var(--nav-ink, var(--ink));
  background:none; border:none; cursor:pointer;
  padding: 2px 4px;
  transition: color .2s linear;
}
.menu-btn__tekst{ position: relative; z-index: 1; }
/* Rukom zaokružen natpis. Isti princip kao crta ispod "Vidi sve":
   pathLength="1" normalizira duljinu pa dashoffset ide 1 -> 0 bez obzira na
   stvarnu duljinu putanje. Putanja kreće od repa gore desno i ide ulijevo
   preko vrha, pa niz lijevu stranu, dnom udesno i uz desnu natrag pod rep. */
.menu-btn__krug{
  position: absolute; left: 50%; top: 50%;
  translate: -50% -50%;
  width: 152%; aspect-ratio: 122 / 56; height: auto;
  color: var(--nav-ink, var(--ink));
  overflow: visible; pointer-events: none;
}
.menu-btn__krug path{
  /* vidi komentar uz .see-all__crta path — "1 2" da se uzorak ne ponavlja */
  stroke-dasharray: 1 2;
  stroke-dashoffset: 1.02;
  transition: stroke-dashoffset .55s cubic-bezier(.45,0,.25,1);
}
.menu-btn:hover .menu-btn__krug path,
.menu-btn:focus-visible .menu-btn__krug path{ stroke-dashoffset: 0; }

@media (prefers-reduced-motion: reduce){
  .menu-btn__krug path{ transition: none; }
}
.cta{
  font-family: var(--font-brush);
  font-size: 1rem;
  background: var(--accent);
  color:#fff;
  padding: 11px 22px;
  border-radius: 30px;
  box-shadow: 0 8px 20px rgba(47,123,255,.35);
  transition: transform .2s ease, box-shadow .2s ease;
}
.cta:hover{ transform: translateY(-2px); box-shadow:0 12px 26px rgba(47,123,255,.45); }

/* ===========================================================
   Slide-out menu
   =========================================================== */
/* fullscreen svijetli menu overlay — stranica iza se zatamni u gotovo bijelo */
.nav-overlay{
  position: fixed; inset:0; z-index: 60;
  /* Tint je jači lijevo (iza gumba), slabiji desno. --nav-scrim i
     --nav-scrim-a nitko više ne postavlja, pa vrijede fallback vrijednosti. */
  background: linear-gradient(90deg,
    rgba(var(--nav-scrim, 248,248,245), .985) 0%,
    rgba(var(--nav-scrim, 248,248,245), .955) 28%,
    rgba(var(--nav-scrim, 248,248,245), var(--nav-scrim-a, .76)) 100%);
  opacity:0; visibility:hidden;
  transition: opacity .3s ease, visibility .3s ease;
}
/* blur samo na lijevom dijelu (iza gumba), naglo slabi desno */
.nav-overlay::before{
  content:""; position:absolute; inset:0; pointer-events:none;
  -webkit-backdrop-filter: blur(10px); backdrop-filter: blur(10px);
  -webkit-mask-image: linear-gradient(90deg, #000 0%, #000 24%, rgba(0,0,0,0) 60%);
          mask-image: linear-gradient(90deg, #000 0%, #000 24%, rgba(0,0,0,0) 60%);
}
.nav-overlay.open{ opacity:1; visibility:visible; }
.nav-panel{
  position:absolute; inset:0;
  padding: 24px 34px;
  display:flex; flex-direction:column; justify-content:center;
}

/* "Zatvori" više nije zaseban gumb: .menu-btn mijenja natpis i sam zatvara,
   pa je pozicija identična po definiciji, a ne po dogovorenim mjerama koje se
   s vremenom raziđu. Ostaje u markupu kao bezopasan fallback bez JS-a. */
.nav-close{ display: none; }

/* veliki brush linkovi (lijevo, vertikalno centrirani, u istoj ravnini) */
.nav-links{ display:flex; flex-direction:column; align-items:flex-start; gap: clamp(2px,.6vh,8px); }
.nav-links a{
  display:inline-flex; align-items:center; gap: clamp(8px,1.2vw,18px);
  font-family: var(--font-brush);
  font-size: clamp(2.125rem, 6vw, 4rem);
  line-height: 1.08; color: var(--ink);
  translate: -70px 0; opacity: 0;                 /* ulaze s lijeva */
  transition: translate .45s cubic-bezier(.6,.05,.2,1), opacity .4s ease, color .2s ease, transform .2s ease;
}
.nav-links a:hover{ color: var(--accent); transform: translateX(10px); }
/* Gooey natpis: dvije kopije riječi leže jedna preko druge u istoj ćeliji
   mreže, pa se u prolazu razliju u istu kap. Filtar postavlja JS i skida ga
   čim animacija stane. */
.nav-links a .goo{
  display: inline-flex; align-items: center;
  gap: clamp(8px,1.2vw,18px);            /* razmak je sada ovdje, ne na <a> */
}
.nav-links a .goo__par{ display: grid; }
.nav-links a .goo__t{ grid-area: 1 / 1; will-change: opacity, transform; }
.nav-links a .nav-arrow{
  width: clamp(30px,4.4vw,52px); height:auto;
  opacity:0; translate: -8px 0;
  transition: opacity .25s ease, translate .25s ease;
}
.nav-links a:hover .nav-arrow{ opacity:1; translate: 0 0; }
.nav-overlay.open .nav-links a{ translate: 0 0; opacity: 1; }
/* stagger (kaskada) — kasni samo translate/opacity, ne hover */
.nav-overlay.open .nav-links a:nth-child(1){ transition-delay: .05s, .05s, 0s, 0s; }
.nav-overlay.open .nav-links a:nth-child(2){ transition-delay: .10s, .10s, 0s, 0s; }
.nav-overlay.open .nav-links a:nth-child(3){ transition-delay: .15s, .15s, 0s, 0s; }
.nav-overlay.open .nav-links a:nth-child(4){ transition-delay: .20s, .20s, 0s, 0s; }
.nav-overlay.open .nav-links a:nth-child(5){ transition-delay: .25s, .25s, 0s, 0s; }
.nav-overlay.open .nav-links a:nth-child(6){ transition-delay: .30s, .30s, 0s, 0s; }
.nav-overlay.open .nav-links a:nth-child(7){ transition-delay: .35s, .35s, 0s, 0s; }

/* social dolje-lijevo, u istoj ravnini */
.nav-social{
  position:absolute; left: 34px; bottom: clamp(24px,4vh,44px);
  display:flex; gap: 18px;
  translate: -50px 0; opacity: 0;
  transition: translate .45s cubic-bezier(.6,.05,.2,1), opacity .4s ease;
}
.nav-overlay.open .nav-social{ translate: 0 0; opacity: 1; transition-delay: .34s; }
.nav-social a{ color: var(--muted); }
.nav-social .ikona{ width: clamp(22px, 2.4vw, 26px); }

/* Na mobitelu je izbornik jedina navigacija, pa linkovi moraju biti krupniji i
   razmaknutiji. Vertikalni padding širi dodirni cilj (>=48px) a da ne pomiče
   tekst — gap ostaje čist razmak između dva susjedna cilja. */
@media (max-width: 700px){
  .nav-panel{ padding: 24px 26px; }
  .nav-links{ gap: 8px; }
  .nav-links a{
    font-size: clamp(2.375rem, 10.5vw, 3.25rem);
    line-height: 1.1;
    padding: 6px 0;
  }
  .nav-social{ left: 26px; gap: 10px; }
  .nav-social a{ font-size: 1.0625rem; padding: 3px 0; }
}
/* Niski ekrani (stari SE, ili adresna traka koja jede visinu): sedam linkova
   u punoj veličini bi naletjelo na social blok, pa se korak stisne — dodirni
   cilj i dalje ostaje iznad 44px. */
@media (max-width: 700px) and (max-height: 640px){
  .nav-links{ gap: 6px; }
  .nav-links a{ font-size: 2rem; padding: 5px 0; }
}

/* ===========================================================
   MRVICE (breadcrumbs)
   Vidljiva putanja mora postojati da bi BreadcrumbList markup bio legitiman —
   Google traži da se strukturirani podaci poklapaju s onim što korisnik vidi.
   Stoji odmah ispod fiksnog headera, u prostoru koji je ionako bio prazan.
   =========================================================== */
.mrvice{
  position: relative; z-index: 6;
  /* Mrvice stoje u istom kontejneru kao sadržaj stranice ispod njih, pa se
     poravnavaju s naslovom. Kontejneri se po stranicama razlikuju u širini,
     zato mrvice nose vlastitu mjeru i tako svugdje počinju na istom mjestu. */
  box-sizing: border-box;
  width: 100%; max-width: var(--mrvice-w);
  display: flex; flex-wrap: wrap; align-items: center;
  gap: 4px 9px;
  font-family: var(--font-hand);
  font-size: clamp(0.8125rem, 1.4vw, 0.9375rem);
  line-height: 1.3;
  color: var(--muted);
  margin: 0 auto clamp(18px, 2.6vh, 28px);
}
/* Mrvice su novi redak iznad naslova, a header je fiksan i visok 90px, pa
   kontejner mora imati gornji razmak. Jedna te ista vrijednost (--vrh) za sve
   vrste podstranica: prije je svaka imala svoju (usluge 15vh, projekti 104px,
   kontakt 2vh + margina na mrvicama), pa su mrvice stajale na različitim
   visinama ovisno o tome gdje si. */
.usl:has(.mrvice),
.blog:has(.mrvice),
.blog-post:has(.mrvice),
.proj-post:has(.mrvice),
.kontakt:has(.mrvice){ padding-top: var(--vrh); }

/* Naslovi su nagnuti, pa im vrh strši iznad layout kutije — i to tim više
   što je riječ duža (podizanje je pola širine puta sinus kuta). Zato se
   izjednačava ono što se vidi, a ne layout kutija: svaki naslov dobiva
   pomak koliko mu vlastita rotacija oduzme ili doda u odnosu na Projekte.
   Uzor je /projekti: mrvice na 117, vidljivi vrh naslova na 122. */
.blog-post:has(.mrvice) .bp-title{ margin-top: 40px; }
/* "Blog" je upola kraća riječ od "Projekti" pri istoj rotaciji, pa je i
   podizanje upola manje — razliku vraćamo negativnim razmakom. Selektor mora
   isključiti i --auto: taj modifikator nose i Projekti i O nama, a samo
   popis bloga ima goli .blog. */
@media (min-width: 861px){
  /* Samo na desktopu: ispod 860px naslovi mijenjaju veličinu i raspored, pa
     bi ovaj pomak naslov uvukao pod mrvice. */
  .blog:not(.blog--auto) .blog__title{ margin-top: -16px; }
}
.proj-post:has(.mrvice) .pp-card{ margin-top: 18px; }
.proj-post:has(.mrvice) .pp-title--gallery{ margin-top: 18px; }

@media (max-width: 860px){
  .blog-post:has(.mrvice) .bp-title{ margin-top: clamp(26px, 4vw, 40px); }
  .proj-post:has(.mrvice) .pp-card{ margin-top: 26px; }
}
.mrvice a{ color: var(--muted); text-decoration: none; transition: color .2s linear; }
.mrvice a:hover{ color: var(--accent); }
.mrvice [aria-current="page"]{ color: var(--ink-soft); }
.mrvice__sep{ opacity: .5; }

/* ===========================================================
   HERO
   =========================================================== */
.hero{
  position: relative;
  z-index: 1;
  height: 100svh;
  min-height: 620px;
  display:flex; flex-direction:column;
  align-items:center; justify-content:center;
  text-align:center;
  overflow:hidden;
}

.hero-title{
  position:relative;
  font-family: var(--font-brush);
  font-weight: 400;
  color: var(--ink);
  font-size: clamp(3.5rem, 11vw, 11.375rem);
  line-height: 1;
  letter-spacing: .5px;
  padding: 2px 16px;
  z-index: 3;
}
/* highlight "selekcija" iza naslova — širina se animira pri ulasku */
.hero-title::before{
  content:"";
  position:absolute; left:0; top:16%; bottom:20%;
  width:100%;
  background: var(--accent-bg);
  z-index:-1;
  border-radius:2px;
}
.hero-title__text{ display:inline-block; }
/* text-cursor handleovi na krajevima — oba moraju izgledati identično */
.hero-title::after,
.hero-title .caret{
  content:"";
  position:absolute; top:2%; bottom:6%;
  width:3px; background: var(--accent);
  border-radius:2px;
  box-shadow: 0 0 0 2px rgba(47,123,255,.15);
}
.hero-title::after{ right:-2px; }
.hero-title .caret{ left:-2px; }

.hero-sub{
  margin-top: 22px;
  font-family: var(--font-brush);
  font-size: clamp(0.9375rem, 1.8vw, 1.3125rem);
  text-transform: uppercase;
  letter-spacing: .5px;
  color: var(--ink);
  max-width: 560px;
  line-height: 1.5;
  z-index: 3;
}

/* down arrow — ručno crtana, oblik se blago izobličuje (bez pomicanja) */
.scroll-cue{
  position:absolute; bottom: 22px; left:50%; transform:translateX(-50%);
  z-index:3; color:var(--ink);
  width: 34px; height: auto; line-height:0;
}
.scroll-cue svg{ display:block; width:100%; height:auto; }

/* --- HERO na manjim ekranima ---------------------------------------------
   Desktop postoci su računati za široki ekran: Galerija je virila 10px, a
   Usluge 16px izvan ekrana (.hero ima overflow:hidden, pa je dio ikone bio
   odrezan), dok je Kontakt upadao pod fiksni header.

   Granica je 860px, a ne 640: desktop postotak za Usluge (left:88%) traži
   barem 750px širine da ikona stane u ekran, pa bi između 640 i 750 i dalje
   bila odrezana. */
@media (max-width: 860px){
  .hero{ padding: 0 20px; }
  /* ".hero ..." zbog specifičnosti: bazna .nav-icon pravila dolaze kasnije u
     datoteci pa bi inače pobijedila po redoslijedu */
  /* Hijerarhija: na desktopu je naslov 182px prema ikoni od 98px (1,9x), a
     mobilni clamp je to okrenuo na 56px prema 66px (0,85x) — šest zasićenih
     ikona pojede crni tekst. Naslov zato raste do pune raspoložive širine,
     ikone se stišavaju (manje, sitnija labela, blaža sjena), a oko teksta
     ostaje prazan pojas. */
  /* 12vh je strop za niske a široke ekrane (860x640): tamo bi 17.4vw dalo 92px
     i pojas oko naslova bi pojeo prostor koji ikonama treba */
  .hero-title{ font-size: min(clamp(3.5rem, 17.4vw, 5.75rem), 12vh); }
  .hero-sub{ font-size: clamp(0.96875rem, 4.5vw, 1.1875rem); }

  .hero .nav-icon img{
    width: min(clamp(52px, 15vw, 80px), 11vh);
    filter: drop-shadow(0 8px 12px rgba(13,27,42,.13));
  }
  .hero .nav-icon span{ font-size: clamp(0.71875rem, 3.2vw, 0.9375rem); }

  /* Zadržavamo desktop kompoziciju, samo mijenjamo sidrenu točku.
     Inline left/top sidre LIJEVI RUB ikone. Ikona je ~7% širine na 1440px, ali
     ~22% na 375px, pa isti postotak na mobitelu odgurne ikonu daleko udesno —
     zato su Galerija i Usluge virile izvan ekrana. Ovdje se ikona sidri
     SREDIŠTEM (translate -50%), a postoci su desktop središta:
       Kontakt 51%, O nama 11%, Galerija 86%, Usluge 92%, Blog 23%, Projekti 69%
     clamp() ih drži unutar ekrana kad je pola ikone šire od preostalog ruba.

     Okomito ostaju desktop postoci, uz dvije zaštite: naslov s podnaslovom je
     centriran i visok ~130px bez obzira na ekran, dok postoci skaliraju — pa
     na niskom telefonu (667px) ono što radi na 812px ulijeće u naslov. Zato
     gornji pojas ima min(... , 50% - 182px), a donji max(... , 50% + 100px).
     Na visokim ekranima te granice ne dolaze do izražaja i vrijedi točno
     desktop postotak. */
  .nav-icon{ translate: -50% 0; }

  .nav-icon[href="kontakt.html"]  { top: max(9%, 100px);              left: clamp(54px, 51%, calc(100% - 54px)); }
  .nav-icon[href="galerija.html"] { top: min(23%, calc(50% - 182px - 4vh)); left: clamp(54px, 86%, calc(100% - 54px)); }
  .nav-icon[href="o-nama.html"]   { top: min(26%, calc(50% - 182px - 4vh)); left: clamp(54px, 11%, calc(100% - 54px)); }
  /* donja granica ovisi i o širini: naslov je clamp(56px, 11vw, 182px), pa je
     pojas oko njega na 860px širine za ~40px viši nego na 360px */
  .nav-icon[href="usluge.html"]   { top: max(61%, calc(50% + 78px + 5.5vw + 4vh)); left: clamp(54px, 92%, calc(100% - 54px)); }
  .nav-icon[href="blog.html"]     { top: 77%;                         left: clamp(54px, 23%, calc(100% - 54px)); }
  /* Najniža ikona. Vodoravno: 69% i 92% (Usluge) razmaknuti su 23%, što je na
     360px svega 83px — manje od same ikone, pa se na uskim ekranima Projekti
     dodatno pomiču ulijevo. Okomito: strop drži ikonu iznad strelice
     (strelica je 48px visoka, 22px od dna). Na širokim ekranima nijedna
     granica ne veže i vrijedi točno desktop 69% / 80%. */
  .nav-icon[href="projekti.html"] {
    top: min(80%, calc(100% - 172px));
    left: clamp(54px, min(69%, calc(100% - 165px)), calc(100% - 54px));
  }

  .hero-sub{ padding: 0 10px; font-size: 1rem; }
}

/* ===========================================================
   Floating layer (parallax)
   =========================================================== */
.float-layer{ position:absolute; inset:0; z-index:2; pointer-events:none; }
.float{ position:absolute; will-change: transform; transition: transform .15s ease-out; }

/* nav ikone (klikabilne) — pozicija dolazi iz --x/--y u markupu, a ne iz
   inline top/left, da je media query može pregaziti bez !important */
.nav-icon{
  top: var(--y); left: var(--x);
  pointer-events:auto; display:flex; flex-direction:column; align-items:center; gap:6px; cursor:pointer;
}
.nav-icon img{ width: clamp(60px, 6.2vw, 98px); filter: drop-shadow(0 12px 18px rgba(13,27,42,.18)); transition: transform .25s ease; }
/* podizanje ikona isključeno (highlight ring preuzima naglašavanje) */
.nav-icon span{
  font-family: var(--font-brush);
  font-size: clamp(0.8125rem, 1.3vw, 1.125rem);
  text-transform: uppercase; letter-spacing:.4px;
  color: var(--ink);
}

/* doodle svg */
.doodle{ opacity:.5; color:#c3c6cd; }
/* Ručno crtane ikone su pune plohe, ne tanki potezi kao prijašnje sitnice —
   na istih .5 nose puno više tinte i previše upadaju u oko. Zato im je
   prozirnost spuštena na .2, da im težina odgovara onome što je ovdje bilo.
   Ubačene su netaknute, s vlastitim fill="#000000"; ovo ga nadjačava jer CSS
   ima prednost pred prezentacijskim atributom u samoj ikoni. */
.doodle--rukom{ opacity: var(--tinta, .13); }
.doodle--rukom path{ fill: currentColor; stroke: none; }

/* Znakovi u sekciji Izjava — puknuti lanac i wifi, uz "Na terenu imate ugled.
   Na internetu?". Isti postupak: putanja netaknuta, boja iz CSS-a. */
.statement__znak path{ fill: currentColor; }
.statement__znak--lanac{ top: 14%; left: 7%;  width: clamp(70px, 8vw, 118px); rotate: -8deg; }
.statement__znak--wifi{  top: 58%; right: 9%; width: clamp(62px, 7vw, 100px); rotate: 6deg; }
/* Rukovanje uz Brojke. Položaj je u CSS-u, a ne inline kao ostali znakovi,
   jer ga uski kadar mora moći pregaziti — inline stil se ne da nadjačati. */
.brojke__znak--dogovor{ top: -48px; left: 43%; width: 96px; }

@media (max-width: 820px){
  /* Wifi ostaje UNUTAR Izjave. Prije je na uskom kadru bježao na spoj s
     Brojkama (bottom:-30px), gdje mu je s druge strane sjedalo rukovanje iz
     Brojki — dva znaka jedan uz drugi, oba bez svoje sekcije. Ispod teksta
     Izjave ima praznine napretek, pa stoji ondje.

     Selektor mora nositi i .bg-doodle: to pravilo dolazi kasnije u datoteci i
     s istom specifičnošću nadjačava sve što je ovdje zadano. */
  .bg-doodle.statement__znak--wifi{ top: 64%; bottom: auto; right: 7%; width: clamp(58px, 16vw, 84px); }
  .bg-doodle.statement__znak--lanac{ top: 16%; left: 6%; width: clamp(64px, 18vw, 96px); }
  /* Rukovanje silazi s ruba sekcije i staje desno od naslova "Brojke": ondje
     je prazan desni kraj retka, a znak se veže uz naslov umjesto da lebdi. */
  .bg-doodle.brojke__znak--dogovor{ top: 6.4%; bottom: auto; left: 52%; right: auto; width: clamp(66px, 19vw, 96px); }
}

/* ===========================================================
   HERO — ulazna animacija učitavanja
   Ikone se NE smiju animirati kroz transform: parallax() u js/main.js
   svaki kadar prepisuje inline transform. Zato koriste samostalna
   svojstva scale/translate, koja se s transformom kombiniraju.
   =========================================================== */

/* Gornja traka: ulazi prva i kratko — postavi okvir stranice, pa naslov
   preuzima pozornost. Svaki gumb klizi sa svoje strane ekrana.
   Ograničeno na naslovnu (:has(.hero)) jer traka stoji na svih 25 stranica,
   a ostale ionako ulaze kroz view transition. Koristi translate, a ne
   transform, da .cta:hover{transform:translateY(-2px)} ostane netaknut. */
body:has(.hero) .menu-btn{ animation: hero-slijeva .55s cubic-bezier(.16,1,.3,1) both; }
body:has(.hero) .cta     { animation: hero-zdesna  .55s cubic-bezier(.16,1,.3,1) .08s both; }

@keyframes hero-slijeva{
  from{ opacity:0; translate: -16px 0; }
  to  { opacity:1; translate: 0 0; }
}
@keyframes hero-zdesna{
  from{ opacity:0; translate: 16px 0; }
  to  { opacity:1; translate: 0 0; }
}

/* Naslov: oba careta kreću na istom mjestu (desni preko lijevog), pa desni
   putuje udesno i za sobom ostavlja plavu podlogu i ispisani tekst. */
.hero-title .caret{
  animation: hero-caret .28s ease-out both;
}
.hero-title::after{
  animation: hero-caret .28s ease-out both,
             hero-caret-hod .62s cubic-bezier(.55,0,.15,1) .2s both;
}
.hero-title::before{
  animation: hero-podloga .62s cubic-bezier(.55,0,.15,1) .2s both;
}
.hero-title__text{
  animation: hero-ispis .62s cubic-bezier(.55,0,.15,1) .2s both;
}

@keyframes hero-caret{ from{ opacity:0; } to{ opacity:1; } }
@keyframes hero-caret-hod{ from{ right: calc(100% - 1px); } to{ right:-2px; } }
@keyframes hero-podloga{ from{ width:0; } to{ width:100%; } }
@keyframes hero-ispis{
  /* Okomito nikad ne reže — brush font prelazi preko okvira retka.
     Desni odmak kreće od 100% + 16px: postotci se računaju od širine teksta,
     a podloga raste po širini naslova koji je zbog paddinga širi 32px. Bez
     te korekcije tekst bi izronio 16px prije nego plava stigne do njega. */
  from{ clip-path: inset(-30% calc(100% + 16px) -30% -30%); }
  to  { clip-path: inset(-30% -5% -30% -30%); }
}

/* Ikone: ulaze tek kad naslov odradi svoje, da mu ne odvlače pogled s centra.
   Rastu od jedva vidljivih (14%) do pune veličine, uz blagi prebačaj preko 1
   da rast djeluje fizički, a ne kao obično zumiranje.
   Redoslijed je po važnosti, ne po položaju na ekranu — vodi pogled na ono
   što najviše prodaje. Brojevi u selektorima su redoslijed u DOM-u. */
.nav-icon{ animation: hero-ikona .5s cubic-bezier(.22,1.25,.36,1) both; }
@keyframes hero-ikona{
  from{ opacity:0; scale:.14; }
  to  { opacity:1; scale:1; }
}
.float-layer > .nav-icon:nth-child(6){ animation-delay:0.80s; }  /* 1. Projekti — dokaz rada */
.float-layer > .nav-icon:nth-child(4){ animation-delay:0.86s; }  /* 2. Usluge   — što nudimo */
.float-layer > .nav-icon:nth-child(1){ animation-delay:0.92s; }  /* 3. Kontakt  — konverzija */
.float-layer > .nav-icon:nth-child(2){ animation-delay:0.98s; }  /* 4. O nama   — povjerenje */
.float-layer > .nav-icon:nth-child(5){ animation-delay:1.04s; }  /* 5. Blog     — sadržaj */
.float-layer > .nav-icon:nth-child(3){ animation-delay:1.10s; }  /* 6. Galerija — najmanje nosi */

/* Doodlei: samo blagi fade, da se ne pojave naglo dok sve ostalo ulazi */
.float-layer > .doodle{ animation: hero-doodle .62s ease-out both; }
/* Kraj je varijabla, ne fiksnih .5: animacija nadjačava obično pravilo, pa bi
   inače svaka sitnica završila na istoj težini bez obzira koliko tinte nosi.
   Kraj je --tinta samog znaka, da animacija ne pregazi izjednačenu tintu. */
@keyframes hero-doodle{ from{ opacity:0; } to{ opacity: var(--tinta, .13); } }
.float-layer > .doodle:nth-child(7){ animation-delay:1.02s; }
.float-layer > .doodle:nth-child(8){ animation-delay:1.08s; }
.float-layer > .doodle:nth-child(9){ animation-delay:1.14s; }

/* Podnaslov: fade in uz podizanje odozdo */
.hero-sub{ animation: hero-odozdo .6s cubic-bezier(.16,1,.3,1) .66s both; }
@keyframes hero-odozdo{
  from{ opacity:0; translate: 0 22px; }
  to  { opacity:1; translate: 0 0; }
}

/* Strelica: fade in uz spuštanje odozgo (translate se zbraja s
   translateX(-50%) iz transforma, pa centriranje ostaje netaknuto) */
.scroll-cue{ animation: hero-odozgo .6s cubic-bezier(.16,1,.3,1) 1.24s both; }
@keyframes hero-odozgo{
  from{ opacity:0; translate: 0 -18px; }
  to  { opacity:1; translate: 0 0; }
}

@media (prefers-reduced-motion: reduce){
  .hero-title .caret, .hero-title::before, .hero-title::after,
  .hero-title__text, .nav-icon, .float-layer > .doodle,
  .hero-sub, .scroll-cue,
  body:has(.hero) .menu-btn, body:has(.hero) .cta{ animation: none; }
}
/* blijede ikone raštrkane po sekcijama — skroluju sa sadržajem, sadržaj slobodno prolazi preko njih */
/* Jednaka izraženost svih pozadinskih znakova.

   Ista prozirnost ne daje istu vidljivost: znak koji pokriva 25 % svog okvira
   nosi dvostruko više tinte od onoga koji pokriva 12 %. Zato svaki znak nosi
   vlastitu vrijednost u --tinta, izmjerenu tako da umnožak pokrivenosti i
   prozirnosti svugdje bude isti — 0.024, koliko u prosjeku nose tri znaka u
   herou. Pokrivenost je svojstvo samog crteža i ne mijenja se s veličinom, pa
   vrijednost vrijedi i ako se znak poslije poveća ili smanji.

   Prije ovoga raspon je bio od 0.36× do 1.16× hero vrijednosti: ručno crtani
   znakovi u Brojkama bili su gotovo trostruko blijeđi od onih u herou. */
.bg-doodle{
  position: absolute; z-index:0; pointer-events:none;
  opacity: var(--tinta, .13);
  color:#c3c6cd; height:auto; display:block;
}
/* fill preko CSS-a, da same datoteke ikona ostanu netaknute */
.bg-doodle--rukom path{ fill: currentColor; stroke: none; }

/* pozicije (postavljene inline u HTML-u preko top/left) */

/* ===========================================================
   PROJEKTI (na naslovnici) — horizontalni carousel
   =========================================================== */
.projekti{
  position: relative; z-index:1;
  background: transparent;   /* ista pozadina (papir + grid) prolazi kroz cijelu stranicu */
  padding: 132px 0 100px;
}
.proj-head{
  max-width: var(--maxw); padding: 0 40px;
  /* Razmak naslov -> kartice = 2vh. Oduzimamo 34px gornjeg paddinga trake
     (ondje je zbog sjena kartica) i još korekciju jer nagnut naslov vizualno
     završava iznad svoje layout kutije — korekcija prati veličinu fonta. */
  margin: 0 auto calc(5vh - 34px - clamp(5px, 0.96vw, 12px));
  display:flex; align-items:flex-start; justify-content:space-between; gap:24px;
}
.proj-head h2{
  font-family: var(--font-brush);
  font-size: clamp(2.5rem, 7.4vw, 5.75rem);
  line-height:.95; letter-spacing:.5px;
  /* isti nagib kao naslov na podstranici Projekti; transform-origin lijevo
     da naslov ostane poravnat s lijevim rubom sekcije */
  transform: rotate(-8deg);
  transform-origin: left center;
}
.see-all{
  position: relative;
  display:inline-block;
  font-family: var(--font-brush);
  font-size: clamp(1.0625rem, 2vw, 1.4375rem);
  /* Crna, ne tinta: na punom accentu tinta (#0d1b2a) daje 4.1:1, ispod praga
     za obični tekst. Crna daje 5.4:1 i to je ujedno odnos s reference —
     crna slova na punoj plavoj. */
  color: #000;
  margin-top: clamp(16px, 1.8vw, 30px); white-space:nowrap;
  transition: color .2s;
}

/* ---- Plavi sjaj iza natpisa (hover) --------------------------------------
   Ista obitelj kao sjaj uz rubove ekrana, samo skupljen iza jednog natpisa:
   zamućena plava ploha koja izroni ispod teksta. Ide na ::before sa z-index:-1
   uz isolation:isolate na roditelju — tako sjaj ostaje IZA slova, ali iznad
   pozadine stranice, i ne može iscuriti iz vlastitog gumba.

   Ne dira postojeće poteze: rukom zaokruženi "Izbornik" i cik-cak ispod
   "Vidi sve" crtaju se i dalje, samo sada nad sjajem.

   Sve stoji pod (hover: hover) jer na dodir :hover ostaje zaglavljen nakon
   dodira — natpis bi svijetlio i kad prst odavno nije ondje.
   -------------------------------------------------------------------------- */
/* Plava podloga iza natpisa u sekcijama — na hover, ne kao zadano stanje.

   Gumb Izbornik/Zatvori ovo NEMA — ondje je ostao izvorni hover s rukom
   crtanim krugom. U zaglavlju uz plavu pilulu Kontakt druga plava ploha je
   bila jedna previše.

   z-index je 0, a natpis se diže na 1. Negativni z-index ovdje ne radi: ploha
   pri -1 propadne iza pozadine i ne nacrta se uopće. Zato se ne spušta podloga
   pod tekst, nego se tekst diže nad podlogu. */
.see-all > span{ position: relative; z-index: 1; }
.see-all::before{
  content: ""; position: absolute; z-index: 0;
  /* u em, da pojas oko slova ostane isti kad se natpis skalira clampom */
  inset: -.42em -.85em;
  border-radius: 999px;
  background: var(--accent);
  /* Zamućenje je u em, ne u px. Fiksnih 15px na dugom natpisu ("Idemo raditi
     i vašu", 181px) jedva zagrize, a na kratkom ("Vidi sve", 86px) pojede
     petinu kutije sa svake strane pa podloga izblijedi u ništa. Vezano uz
     pismo, svi natpisi dobiju jednako gustu plohu. */
  filter: blur(.5em);
  /* Prigušeni accent. Puna jačina (opacity 1) davala je istu plavu kao "+" uz
     brojke, ali ondje je to tanak potez u velikom praznom polju, a ovdje puna
     ploha iza natpisa — ista vrijednost u toj površini vrišti. */
  opacity: 0;
  transform: scale(.9);
  transition: opacity .28s ease, transform .28s cubic-bezier(.22, 1, .36, 1);
  pointer-events: none;
}
.see-all:focus-visible::before{ opacity: .72; transform: scale(1); }
@media (hover: hover){
  .see-all:hover::before{ opacity: .72; transform: scale(1); }
}
@media (prefers-reduced-motion: reduce){
  .see-all::before{ transition: opacity .2s ease; transform: scale(1); }
  .see-all:hover::before, .see-all:focus-visible::before{ transform: scale(1); }
}

/* Ručno crtana crta ispod natpisa. Na hover se iscrtava od početka poteza
   (gore lijevo) do kraja (dolje) — pathLength="1" normalizira duljinu, pa
   dashoffset ide 1 -> 0 bez obzira na stvarnu duljinu putanje.
   Stoji uz plavu plohu, ne umjesto nje: oba su hover, a crta se crta IZNAD
   plohe jer je pozicionirana i dolazi kasnije u dokumentu. */
.see-all__crta{
  /* Cik-cak koji se sužava prema dnu; oštri kutovi, zaobljeni vrhovi. */
  position:absolute; left: -1%; top: 92%;
  /* aspect-ratio umjesto fiksne visine: uz preserveAspectRatio="none" fiksna
     visina je kratki natpis ("Vidi sve") razvlačila po visini jače nego dugi
     ("Sve usluge"), pa cik-cak nije bio isti u svim sekcijama */
  width: 102%; aspect-ratio: 200 / 96; height: auto;
  color: var(--ink);
  overflow: visible; pointer-events:none;
}
.see-all__crta path{
  /* Debljina poteza NE smije se skalirati s crtežom. SVG je širok 102% natpisa,
     pa je isti stroke-width od 4.5 davao 1.39px na "Vidi sve" (61px), 2.05px na
     "Sve usluge" (89px) i 3.58px na "Idemo raditi i vašu" (156px) — svaki gumb
     druga debljina. non-scaling-stroke potez izuzima iz te transformacije, pa
     ga zadajemo jednom i vrijedi svugdje.

     .13em, a ne fiksni px: potez tako prati natpis kad ga clamp poveća na
     širokom kadru (17px -> 2.21px poteza, 23px -> 2.99px). Vrijednost je
     birana da odgovara težini samog pisma — cik-cak izgleda kao da je povučen
     istim markerom, a ne kao tanka vektorska linija ispod njega. */
  vector-effect: non-scaling-stroke;
  stroke-width: .13em;
  /* "1 2", a ne "1": s jednom vrijednošću uzorak je "1 crtica, 1 razmak" pa se
     ponavlja — pri odmaku 1.02 na kraj putanje upadne 2% sljedeće crtice i
     ostane vidljiva mrlja. Razmak dulji od putanje to sprječava.
     1.02 umjesto 1: pri punom odmaku zaobljena kapica inače viri kao točkica. */
  stroke-dasharray: 1 2;
  stroke-dashoffset: 1.02;
  transition: stroke-dashoffset .7s cubic-bezier(.45,0,.25,1);
}
.see-all:hover .see-all__crta path,
.see-all:focus-visible .see-all__crta path{ stroke-dashoffset: 0; }

@media (prefers-reduced-motion: reduce){
  .see-all__crta path{ transition: none; }
}


.proj-track{
  display:flex;
  overflow: hidden;                 /* beskonačni marquee — bez native scrolla */
  padding: 34px 0 70px;             /* prostor da sjene kartica ne budu odrezane */
}
.proj-lane{
  display:flex; gap: 18px;
  align-items: flex-start;          /* kartice zadrže prirodnu visinu */
  flex: 0 0 auto;
  will-change: transform;
}

.proj-win{
  flex: 0 0 auto;
  background: var(--paper-2);
  border: 1px solid var(--line);
  border-radius: 9px;
  box-shadow: 0 10px 24px -8px rgba(13,27,42,.14), 0 2px 6px rgba(13,27,42,.05);
  overflow: hidden;
  display:flex; flex-direction:column;
  color: inherit; text-decoration: none; cursor: pointer;
}
.proj-win.desktop{ width: min(620px, 80vw); }
.proj-win.mobile{  width: min(320px, 62vw); }

.win-bar{
  display:flex; align-items:center; gap:14px;
  padding: 12px 16px;
  border-bottom: 1px solid var(--line);
  background: var(--chrome);
}
.win-dots{ display:flex; gap:8px; flex:0 0 auto; }
.win-dots i{ width:16px; height:16px; border-radius:50%; border:1.5px solid #c5c7cc; background:transparent; display:block; position:relative; }
.win-dots i::before, .win-dots i::after{ content:""; position:absolute; left:50%; top:50%; background:#b4b6bb; border-radius:2px; }
/* prvi krug = X, drugi = kosa crta (zabrana) — realni window kontroli */
.win-dots i:first-child::before, .win-dots i:first-child::after{ width:7px; height:1.6px; transform:translate(-50%,-50%) rotate(45deg); }
.win-dots i:first-child::after{ transform:translate(-50%,-50%) rotate(-45deg); }
.win-dots i:last-child::before{ width:10px; height:1.6px; transform:translate(-50%,-50%) rotate(-45deg); }
/* margin:0 jer je ovo <h2>, a ne <span>: naslov nosi zadani razmak koji bi
   u flex traci .win-bar dodao praznu visinu. Font i težina su ionako
   postavljeni ovdje, pa se h2 vizualno ne razlikuje od prijašnjeg spana. */
.win-title{ margin:0; font-family: var(--font-ui); font-weight:600; font-size: 0.96875rem; color:var(--ink); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.open-btn{
  margin-left:auto; flex:0 0 auto;
  font-family: var(--font-ui); font-weight:500; font-size: 0.875rem;
  padding: 8px 16px; border-radius:9px;
  border: 1px solid var(--line); color: var(--ink-soft); background: transparent;
  transition: background .2s, color .2s, border-color .2s, transform .15s;
}
/* hover na cijeloj kartici odmah pali hover gumba */
.proj-win:hover .open-btn{ background: var(--accent); color:#fff; border-color: var(--accent); transform: translateY(-1px); }

/* slika inset u kartici, blago zaobljena (kao referenca) */
.win-shot{ position:relative; padding: 3px 7px 7px; background:var(--paper-2); }
.win-shot picture{ display:block; }
.win-shot img{ display:block; width:100%; height:auto; border-radius:6px; }
.win-shot .ph{
  position:absolute; inset:16px;
  border: 2px dashed #c7cbd2; border-radius:12px;
  display:flex; flex-direction:column; align-items:center; justify-content:center; text-align:center; gap:4px;
  font-family: var(--font-brush); color:#a7abb4; font-size: 1.0625rem; letter-spacing:.5px;
}
.win-shot .ph small{ font-family: var(--font-hand); font-size: 0.8125rem; letter-spacing:0; }

@media (max-width: 640px){
  .proj-head{ padding:0 24px; }
}

/* projekti.html — zid od proj-win kartica (isti dizajn kao naslovna).
   Fiksna ŠIRINA stupca, visina slijedi format slike (bez rezanja) — kao na referenci.
   Pravi masonry (JS): kartice idu u trenutno najkraći stupac, bez rupa. */
.proj-wall{
  display:flex; flex-wrap:wrap; align-items:flex-start; justify-content:center; gap: 16px;
  width: 100%; margin: 0 auto; padding: 20px 0 40px;
}
.proj-wall.js-masonry{ flex-wrap:nowrap; }
.proj-col{ display:flex; flex-direction:column; align-items:center; gap:16px; flex:1 1 0; min-width:0; }
.proj-wall .proj-win{
  width: 100%;
  height: auto;
}
/* mobilne kartice iste širine kao desktop (puna širina stupca) */
.proj-wall .proj-win.mobile{ width: 100%; }
.proj-wall .proj-win .win-shot img{
  width: 100%; height: auto; max-width:100%;
  display:block; border-radius:6px;
}
/* bar se ne smije širiti preko slike — naslov se skraćuje umjesto da razvlači karticu */
.proj-wall .win-title{ min-width: 0; flex: 1 1 auto; }

/* jače isticanje kartica + bez linije iznad slike, samo na projekti.html */
.proj-wall .proj-win{
  box-shadow: 0 30px 60px -22px rgba(13,27,42,.38), 0 10px 26px -10px rgba(13,27,42,.20);
}
.proj-wall .win-bar{ border-bottom: none; }

@media (max-width: 860px){
  /* Zid izlazi iz uskog blog kontejnera (82vw) — na mobitelu to je ostavljalo
     kartice na ~53% ekrana. Sada dobiju gotovo cijelu širinu, a visina slijedi
     format slike pa se ništa ne reže. */
  /* trostruka klasa: .blog i .blog.blog--auto dolaze kasnije u datoteci pa bi
     inače pobijedile po redoslijedu */
  .blog.blog--auto.blog--zid{ max-width: 100%; padding-left: 16px; padding-right: 16px; }
  /* naslov zadržava uvlaku topbara (30px) iako je kontejner sužen na 16px */
  .blog--zid .blog__title{ padding-left: 14px; }
  /* isto i za O nama: kartica je na 82vw padala na ~65% ekrana, pa je sadržaj
     unutra bio premalen da bi se išta vidjelo */
  .blog.blog--auto.blog--fit{ max-width: 100%; padding-left: 16px; padding-right: 16px; }
  .blog--fit .blog__title{ padding-left: 14px; }
  .proj-wall{
    flex-direction: column; align-items: center; justify-content: flex-start;
    gap: 20px; padding: 10px 0 30px;
  }
  /* Sve kartice su jednako široke; portretni snimci se ispod 860px preko
     <picture> zamjenjuju desktop snimkom istog projekta, pa nema kartica
     koje su tri puta više od ostalih. */
  .proj-wall .proj-win{ width: 100%; }
  .proj-wall .proj-win.mobile{ width: 100%; }
  /* Na 375px traka nema mjesta za točkice, puni naziv i gumb u punoj veličini —
     stisnut razmak i sitniji gumb oslobode dovoljno da se ni najduži naziv
     ("Graditeljstvo Lončar") ne skraćuje. */
  .proj-wall .win-bar{ gap: 8px; padding: 11px 12px; }
  .proj-wall .win-title{ font-size: 0.90625rem; }
  .proj-wall .open-btn{ font-size: 0.8125rem; padding: 7px 10px; }
}
/* Ispod 369px ni stisnuta traka nema 146px za najduži naziv ("Medvedgrad
   Gradnja"), pa naziv ima prednost pred ukrasnim točkicama. Na 375px — daleko
   najčešćoj širini — točkice ostaju. */
@media (max-width: 368px){
  .proj-wall .win-dots{ display: none; }
}

/* ===========================================================
   BRUTAL IZJAVA (hook)
   =========================================================== */
.statement{
  position: relative; z-index:1;
  padding: clamp(160px, 28vh, 320px) 30px;
  text-align:center;
}
.statement__eyebrow{ margin: 0 0 clamp(18px,3vh,30px); }
.statement__eyebrow span{
  display:inline-block;
  background: var(--accent); color:#fff;
  font-family: var(--font-hand);
  font-size: clamp(1.625rem, 3.8vw, 2.75rem);
  padding: 14px 30px;
  border-radius: 4px;
  transform: rotate(-2deg);
}
.statement__text{
  font-family: var(--font-brush);
  font-size: clamp(3rem, 10vw, 8.25rem);
  line-height: 1.1;
  color: var(--ink);
  max-width: 18ch; margin: 0 auto;
}
.statement__sub{
  font-size: clamp(0.9375rem, 1.7vw, 1.1875rem);
  color: var(--muted);
  margin: clamp(16px,2.6vh,26px) auto 0;
  max-width: 44ch;
}
/* --- ulaz pri skrolanju ---
   Prva rečenica je plavi highlight, pa se otkriva potezom slijeva udesno —
   isti jezik kao selekcija iza naslova u herou.
   Skriveno je samo ako JS radi (html.ima-js), inače je tekst normalno tu.

   Druga rečenica ("Na internetu?") ovdje namjerno nema ništa: nju vodi
   naslovniFiltri u js/main.js, isti modul koji radi na Brojkama, Uslugama i
   ostalim naslovima. Prije je imala i vlastito izranjanje odozdo, ali CSS
   animacija nadjačava inline opacity koji taj modul postavlja, pa bi se
   filtar borio s njom umjesto da se vidi. */
.ima-js .statement__eyebrow span{
  clip-path: inset(-20% 100% -20% -20%);
}
.statement.je-otkriveno .statement__eyebrow span{
  animation: izjava-potez .75s cubic-bezier(.55,0,.15,1) both;
}
@keyframes izjava-potez{
  /* desni kraj je tek -4%: da je -40%, pilula bi bila potpuno otkrivena
     već na dvije trećine trajanja, a ostatak animacije ne bi radio ništa */
  from{ clip-path: inset(-20% 100% -20% -20%); }
  to  { clip-path: inset(-20% -4% -20% -20%); }
}
@media (prefers-reduced-motion: reduce){
  .ima-js .statement__eyebrow span{ clip-path: none; }
}

.statement__text .u{ position:relative; white-space:nowrap; z-index:0; }
.statement__text .u::after{
  content:""; position:absolute; left:-4px; right:-4px; bottom:.05em; height:.36em;
  background: var(--accent-bg); z-index:-1; border-radius:2px;
}

/* ===========================================================
   DOKAZ (Kramarić) + poziv na akciju
   =========================================================== */
.dokaz{
  position: relative; z-index:1;
  padding: clamp(60px, 10vh, 110px) 30px;
  overflow: hidden;
}
/* Jedan dominantan izrez lijevo, argument desno. Prije su bila dva mobitela
   jednake težine pa se cijeli SERP stiskao u ~380px i tekst je bio nečitljiv;
   sada su slike izrezane na ono što je stvarno dokaz. */
.dokaz__grid{
  max-width: var(--maxw); margin: 0 auto;
  display:grid; align-items:start;
  grid-template-columns: minmax(0, 1.12fr) minmax(0, 1fr);
  gap: clamp(28px, 5vw, 72px);
}
.dokaz__shot{ margin:0; }

/* --- mobitel sa snimkom pretrage ---
   Mockup se ovdje jednom već bio pojavio pa je izrezan jer je tekst u njemu
   bio presitan da bi išta dokazivao. Zato uređaj ovdje dobiva širi stupac i
   ulazi zumiranjem — kamera koja prilazi. Zumira se tijelo, ne slika u
   ekranu: slika je široka točno koliko i ekran, pa bi svako povećanje sadržaja
   odrezalo retke s obje strane (pri 1,9× ostane 53% širine). Slika je
   nadopunjena bjelinom do omjera 9:19.5 da točno ispuni ekran. */
.mobitel__tijelo{
  position: relative;
  /* 540, ne manje: ekran tada nosi 514px za izvornih 1068, pa Googleov tekst
     izlazi na ~16px — točno ono što je davala i gola slika prije mockupa.
     Stupac je 596px, ostaje 28px zraka sa svake strane. */
  width: 100%; max-width: 540px; margin: 0 auto;
  background: var(--ink);
  transform-origin: 50% 60%;
  border-radius: 66px;
  padding: 15px;
  box-shadow:
    0 44px 88px -30px rgba(13,27,42,.48),
    0 4px 12px rgba(13,27,42,.10),
    inset 0 0 0 1px rgba(255,255,255,.10);
}
/* Bočne tipke — sitnica, ali bez njih tijelo izgleda kao pravokutnik, ne kao
   uređaj. Sjede na rubu i nemaju posla s kadrom unutra. */
.mobitel__tijelo::before,
.mobitel__tijelo::after{
  content:""; position:absolute; left:-2px; width:2px;
  background: var(--ink); border-radius: 2px;
}
.mobitel__tijelo::before{ top:19%; height:5%; }
.mobitel__tijelo::after{ top:27%; height:8%; }

.mobitel__otok{
  position:absolute; z-index:2;
  top: 2.1%; left:50%; translate:-50% 0;
  width: 27%; height: 2.4%;
  background: var(--ink); border-radius: 999px;
}
.mobitel__ekran{
  /* Omjer nosi ekran, ne tijelo: slika je nadopunjena točno na 9:19.5 pa
     ovako sjeda u piksel. Kad je omjer stajao na tijelu, ekran je nakon
     oduzimanja okvira ispao za 23px viši od slike i dolje je zjapila bjelina.
     Tijelo je zato za debljinu okvira više od ekrana — kao i pravi uređaj. */
  position:relative; overflow:hidden;
  width:100%; aspect-ratio: 9 / 19.5;
  border-radius: 51px;
  background:#fff;
}
/* Ishodište je sredina plavog prstena oko Kramarićevog rezultata (43,04%
   visine slike, izmjereno na samoj datoteci). Zato prsten pri zumiranju
   ostaje mirno na mjestu, a sve ostalo raste oko njega. */
.mobitel__snimka{ display:block; width:100%; height:auto; }

/* Prilaz kamere: uređaj uđe malen pa se smiri u punoj veličini. Namjerno
   prijelaz, a ne animacija s opacity:0 u polazištu — takva postavka jednom
   nam je već ostavila naslove trajno nevidljive kad se animacija nije
   pokrenula. Ovdje je najgori mogući ishod uređaj koji ostane malo manji;
   dokaz se vidi u svakom slučaju. */
.ima-js .dokaz .mobitel__tijelo{
  transform: scale(.86) translateY(14px);
  transition: transform 1.15s cubic-bezier(.22, 1, .36, 1);
}
.ima-js .dokaz.je-otkriveno .mobitel__tijelo{ transform: none; }
@media (prefers-reduced-motion: reduce){
  .ima-js .dokaz .mobitel__tijelo{ transform:none; transition:none; }
}
.dokaz__shot figcaption,
.dokaz__ai figcaption{
  margin-top: 14px;
  font-size: 0.84375rem; line-height:1.5; color: var(--muted);
  text-align:center;
}
.dokaz__cap-label{
  font-family: var(--font-hand); font-weight:700;
  font-size: 0.75rem; text-transform:uppercase; letter-spacing:.08em;
  color: var(--ink-soft); margin-right: 6px;
}
.dokaz__text{ align-self:center; }
.dokaz__eyebrow{
  font-family: var(--font-hand); font-weight:700;
  font-size: 0.8125rem; text-transform: uppercase; letter-spacing: .12em;
  color: var(--accent); margin: 0 0 14px;
}
.dokaz__title{
  font-family: var(--font-brush);
  font-size: clamp(2rem, 4vw, 3.375rem);
  line-height: 1.12; color: var(--ink);
  margin: 0 0 20px;
}
.dokaz__title em{ font-style: normal; color: var(--accent); }
.dokaz__lead{
  font-size: clamp(1rem, 1.7vw, 1.1875rem);
  line-height: 1.65; color: var(--ink-soft);
  margin: 0 0 22px;
}
.dokaz__lead strong{ color: var(--ink); }
.dokaz__quote{
  display:inline-block;
  background: var(--accent-bg); color: var(--ink);
  font-weight: 700; font-size: clamp(0.9375rem, 1.5vw, 1.0625rem);
  line-height: 1.5; padding: 12px 18px; border-radius: 6px;
  margin: 0 0 clamp(28px, 4vh, 40px);
}
/* AI dokaz je bonus, ne druga polovica priče — zato manji i podređen */
.dokaz__ai{ margin:0; }
.dokaz__ai img{
  display:block; width:100%; height:auto;
  border-radius: 12px;
  box-shadow: 0 24px 48px -20px rgba(13,27,42,.38);
}

@media (max-width: 900px){
  .dokaz__grid{ grid-template-columns: 1fr; }
  .dokaz__text{ order: -1; }
  .dokaz__shot{ max-width: 420px; margin: 0 auto; }
  .dokaz__ai{ margin-top: clamp(26px,4vh,36px); }
}

/* ===========================================================
   POZIV NA AKCIJU (nakon dokaza)
   Prije ovoga na cijeloj naslovnoj nije bilo nijednog CTA-a između
   heroa i footera — tko se uvjerio kod Dokaza nije imao gdje kliknuti.
   =========================================================== */
.poziv{
  position: relative; z-index:1;
  padding: clamp(20px, 4vh, 40px) 30px clamp(70px, 11vh, 120px);
}
.poziv__inner{
  max-width: 760px; margin: 0 auto;
  background: var(--paper-2);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  padding: clamp(34px, 5vw, 56px) clamp(24px, 4vw, 52px);
  text-align:center;
  box-shadow: 0 30px 60px -30px rgba(13,27,42,.28);
}
.poziv__title{
  font-family: var(--font-brush);
  font-size: clamp(1.75rem, 3.6vw, 2.75rem);
  line-height:1.12; color: var(--ink);
  margin: 0 0 14px;
}
.poziv__lead{
  font-size: clamp(0.9375rem, 1.6vw, 1.125rem); line-height:1.65;
  color: var(--ink-soft); max-width: 48ch; margin: 0 auto;
}
.poziv__akcije{
  display:flex; flex-wrap:wrap; justify-content:center; gap: 12px;
  margin: clamp(24px, 3.6vh, 34px) 0 16px;
}
.poziv__btn{
  font-family: var(--font-brush); font-size: 1rem;
  padding: 13px 28px; border-radius: 32px;
  background: var(--accent); color:#fff;
  box-shadow: 0 10px 24px rgba(47,123,255,.3);
  transition: transform .22s ease, background .22s ease;
}
.poziv__btn:hover{ transform: translateY(-3px); background:#2668e0; }
.poziv__mikro{
  font-family: var(--font-hand); font-size: 0.84375rem;
  color: var(--muted); margin:0;
}

/* ===========================================================
   ŠTO RADIMO — kompaktna lista (vodi na Usluge), oblačić na hover,
   ceduljica koja se vuče. Mjere su namjerno stisnute prema referenci:
   kartica ~340px, redak ~40px, sistemski font obične debljine — prije
   je bilo 418px sa 600 težinom pa je djelovalo dvostruko krupnije.
   =========================================================== */
.usl-traka{
  position: relative; z-index:1;
  padding: clamp(60px, 10vh, 110px) 30px;
}
.usl-traka__inner{ max-width: 1090px; margin: 0 auto; }
.usl-traka__head{
  display:flex; flex-wrap:wrap; align-items:flex-start; justify-content:space-between;
  gap: 14px 24px;
  /* nagib +8° spušta desni kraj naslova ispod njegove layout kutije,
     pa razmak mora biti veći nego kod sekcija s nagibom ulijevo */
  margin-bottom: clamp(56px, 8vh, 96px);
}
.usl-traka__title{
  font-family: var(--font-brush);
  font-size: clamp(2.5rem, 7.4vw, 5.75rem); line-height:.95;
  color: var(--ink); margin: 0;
  /* obrnuti nagib od Projekata i Bloga — spušta se udesno, kao na referenci */
  transform: rotate(8deg);
  transform-origin: left center;
}

.usl-scena{
  position: relative;
  display:flex; align-items:flex-start; justify-content:space-between;
  gap: clamp(24px, 4vw, 60px);
}

/* --- lista --- */
.usl-lista-omot{ position: relative; flex: 0 0 auto; width: 330px; max-width: 100%; }
/* lepeza od šest crtica koja izlazi iz gornjeg lijevog kuta kartice */
.usl-iskre{
  /* crtice zrače iz točke (78,78) u viewBoxu; pomak je tolik da ta točka
     padne točno na gornji lijevi kut kartice */
  /* dvije skupine po tri poteza — lijevo od kartice i iznad nje, pomaknuto
     udesno. Kut kartice je točka (60,60) u viewBoxu, otud pomak. */
  position:absolute; top:-60px; left:-60px; width: 160px; height:120px;
  pointer-events:none; overflow: visible;
}
.usl-lista{
  list-style:none; margin:0; padding: 7px;
  background: var(--chrome-2);
  border: 1px solid var(--line);
  border-radius: 10px;
  box-shadow: 0 34px 60px -26px rgba(13,27,42,.5), 0 6px 16px rgba(13,27,42,.1);
}
.usl-red{
  display:flex; align-items:center; gap: 10px;
  padding: 9px 12px;
  border-radius: 7px;
  color: var(--ink);
  font-family: var(--font-ui);
  transition: background .16s ease, color .16s ease;
}
.usl-red__broj{
  flex:0 0 auto; width: 26px;
  font-size: 1.0625rem; font-weight:550; font-variant-numeric: tabular-nums;
  color: var(--muted);
  transition: color .16s ease;
}
.usl-red__ime{
  flex:1 1 auto; min-width:0;
  font-size: 1.1875rem; font-weight:600; letter-spacing:-.014em;
}
.usl-red__strelica{
  flex:0 0 auto; width:8px; height:13px; color: var(--muted);
  transition: color .16s ease, transform .16s ease;
}
.usl-red:hover,
.usl-red:focus-visible{ background: var(--accent); color:#fff; }
.usl-red:hover .usl-red__broj,
.usl-red:focus-visible .usl-red__broj,
.usl-red:hover .usl-red__strelica,
.usl-red:focus-visible .usl-red__strelica{ color:#fff; opacity:.9; }
.usl-red:hover .usl-red__strelica{ transform: translateX(2px); }
.usl-red:focus-visible{ outline: 2px solid var(--accent); outline-offset: 2px; }

/* --- ceduljica koju se može odvući --- */
.usl-note{
  position: relative; z-index: 5;
  flex: 0 0 auto; width: 15vw; height: 20vh;
  margin-top: clamp(20px, 4vh, 54px);
  background: var(--chrome-2);
  border-radius: 3px;
  padding: 0 0 34px;
  box-shadow: 0 18px 40px -22px rgba(13,27,42,.45);
  transform: rotate(3deg);
  cursor: grab;
  touch-action: none;          /* da povlačenje ne skrola stranicu */
  user-select: none;
}
.usl-note.se-vuce{ cursor: grabbing; box-shadow: 0 30px 60px -20px rgba(13,27,42,.5); }
.usl-note__traka{
  display:block; height: 26px; border-radius: 3px 3px 0 0;
  background: #f5c518;
}
.usl-note p{
  /* isti font kao nazivi usluga u lijevoj kartici */
  font-family: var(--font-ui);
  font-size: 1.0625rem; font-weight: 550; line-height:1.28; color: var(--ink-soft);
  margin: 16px 16px 0;
}
.usl-note__podvlaka{
  position:absolute; left: 10px; right: 10px; bottom: -18px;
  width: auto; height: 22px; pointer-events:none;
}
.usl-note:focus-visible{ outline: 2px solid var(--accent); outline-offset: 4px; }

@media (max-width: 980px){
  .usl-scena{ flex-direction: column; align-items: stretch; }
  .usl-lista-omot{ width: 100%; }
  /* U stupcu je 20vh na niskim ekranima premalo za tekst, pa visina ovdje
     ide po sadržaju — fiksne mjere vrijede samo za raspored u dva stupca. */
  .usl-note{ width: min(260px, 78vw); height: auto; margin: clamp(34px,5vh,48px) auto 0; }
}

/* ===========================================================
   IZ BLOGA — zadnja sekcija prije footera
   Namjerno na kraju: posjetitelju s namjerom blog odvlači pažnju s
   konverzije, pa hvata tek onoga tko je sve pročitao i još odlučuje.
   Koristi isti .blog__row kao podstranica Blog — samo bez mjera
   vezanih uz cijeli ekran (75vw / 5vh).
   =========================================================== */
.blog-traka{
  position: relative; z-index:1;
  padding: clamp(50px, 8vh, 90px) 30px clamp(60px, 10vh, 110px);
}
/* Praznina Usluge -> Blog mora biti jednaka onoj Projekti -> Usluge. Obje su
   zbroj donjeg odmaka gornje sekcije i gornjeg odmaka donje:

     Projekti -> Usluge = 100px (fiksni padding .projekti) + U
     Usluge   -> Blog   = U + gornji odmak .blog-traka,   U = clamp(60px,10vh,110px)

   Dakle gornji odmak Bloga mora biti tih istih 100px, i onda su jednake na
   svakoj visini kadra. Ovdje je stajao clamp(50px, 8vh, 90px) — na 1440x900
   to je 72px, pa je razmak ispadao 162 naspram 190. Na uskom kadru ostaje
   izvorni clamp: ondje se za visinu bori svaki piksel. */
@media (min-width: 821px){
  .blog-traka{ padding-top: 100px; }
}
.blog-traka__inner{ max-width: var(--maxw); margin: 0 auto; }
.blog-traka__head{
  display:flex; flex-wrap:wrap; align-items:flex-end; justify-content:space-between;
  /* Škrabotina ispod "Svi savjeti" viri ~26px ispod linka; s manje razmaka
     zalazila je preko datuma u prvom retku bloga. */
  gap: 14px 24px; margin-bottom: clamp(46px, 6vh, 58px);
}
.blog-traka__title{
  font-family: var(--font-brush);
  font-size: clamp(2.5rem, 7.4vw, 5.75rem); line-height:.95;
  color: var(--ink); margin:0;
  transform: rotate(-8deg);
  transform-origin: left center;
}
.blog-traka .blog__row{
  width: 100%; height: auto;
  padding: 13px 18px;
}
.blog-traka .blog__thumb{ width: 38px; height: 38px; }

/* Stupac je ovdje bio dok je uz naslov stajao i lead odlomak. Sad su u glavi
   samo naslov i gumb, koji zajedno traže ~200px — stanu u redak i na 320px,
   pa gumb ostaje desno uz naslov kao i na širokim ekranima. */

/* ===========================================================
   BROJKE (društveni dokaz)
   =========================================================== */
.brojke{
  position: relative; z-index:1;
  padding: clamp(70px, 11vh, 130px) 30px clamp(100px, 16vh, 170px);
}
.brojke__inner{ max-width: var(--maxw); margin: 0 auto; }
/* isti tretman kao naslovi sekcija Projekti / Usluge / Blog */
.brojke__title{
  width: fit-content;
  font-family: var(--font-brush);
  font-size: clamp(2.5rem, 7.4vw, 5.75rem); line-height:.95; letter-spacing:.5px;
  color: var(--ink);
  margin: 0 0 clamp(30px, 4.5vh, 56px);
  transform: rotate(-8deg);
  transform-origin: left center;
}
.brojke__head{
  display:flex; flex-wrap:wrap; align-items:flex-end; justify-content:space-between; gap: 20px 40px;
  margin-bottom: clamp(80px, 12vh, 140px);
}
/* Sistemski sans kao kod naziva usluga; uvodni podebljani dio ostaje u
   rukopisnom fontu, pa se rečenica vidljivo lomi na dvoje. */
.brojke__lead{
  max-width: 660px;
  font-family: var(--font-ui);
  font-weight: 600; letter-spacing: -.014em;
  font-size: clamp(1.0625rem, 1.85vw, 1.375rem);
  line-height: 1.5; color: var(--ink-soft);
}
.brojke__lead strong{
  font-family: var(--font-hand);
  font-weight: 700; letter-spacing: normal;
  font-size: clamp(1.1875rem, 2.1vw, 1.5625rem);
  color: var(--ink);
}
.brojke__cta{ flex: 0 0 auto; white-space:nowrap; }
.brojke__grid{
  display:grid; gap: clamp(28px, 4vw, 52px);
  grid-template-columns: repeat(3, 1fr);
}
.stat{ text-align:center; }
.stat__num{
  display:block;
  font-family: var(--font-brush);
  font-size: clamp(3.625rem, 9.5vw, 7.5rem);
  line-height: 1; color: var(--ink);
}
.stat__num em{ color: var(--accent); font-style:normal; }
.stat__lbl{
  display:block; margin-top: 14px;
  font-family: var(--font-hand);
  font-size: clamp(1rem, 1.9vw, 1.3125rem);
  color: var(--ink-soft); line-height:1.4;
}
@media (max-width: 680px){
  .brojke__grid{ grid-template-columns: 1fr; gap: 36px; }
}

/* ===========================================================
   FAQ (chat / iMessage stil)
   =========================================================== */
.faq{
  position: relative; z-index:1;
  padding: clamp(60px,10vh,110px) 0 clamp(70px,11vh,120px);
  overflow: hidden;
}
.faq__inner{ max-width: var(--maxw); margin: 0 auto; padding: 0 clamp(24px,5vw,44px); position:relative; z-index:2; }
.faq__title{
  font-family: var(--font-brush);
  font-size: clamp(2.125rem, 6.5vw, 4.75rem);
  color: var(--ink);
  margin-bottom: clamp(30px, 5vh, 54px);
}
.faq__list{ list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap: clamp(10px, 1.6vh, 16px); max-width: 660px; }
.faq__item{ display:flex; flex-direction:column; }

.faq__q{
  display:inline-flex; align-items:center; gap:12px;
  align-self:flex-start; text-align:left;
  background:none; border:0; padding:0; cursor:pointer;
}
.faq__bubble{
  font-family: var(--font-ui);
  font-size: clamp(0.9375rem, 1.5vw, 1.125rem);
  color: var(--ink);
  background: var(--chrome-2);
  padding: 12px 20px;
  border-radius: 22px 22px 22px 6px;
  transition: background-color .2s ease, color .2s ease;
}
.faq__q:hover .faq__bubble{ background:var(--chrome-3); }
.faq__q[aria-expanded="true"] .faq__bubble{ background:var(--tint-2); color: var(--ink); }

.faq__toggle{
  position:relative; flex:0 0 auto;
  width:24px; height:24px; border-radius:50%;
  border:1.6px solid #c6c6c8;
  transition: border-color .2s ease;
}
.faq__toggle::before,
.faq__toggle::after{
  content:""; position:absolute; left:50%; top:50%;
  width:11px; height:1.7px; background:#9a9a9e; border-radius:2px;
  transform: translate(-50%,-50%);
}
.faq__toggle::after{ transform: translate(-50%,-50%) rotate(90deg); transition: opacity .2s ease; }
.faq__q[aria-expanded="true"] .faq__toggle{ border-color:#a9c4ff; }
.faq__q[aria-expanded="true"] .faq__toggle::after{ opacity:0; }

/* Zatvoreno stanje postoji samo dok JS može otvarati. Bez njega prekidač ne
   radi, pa bi svi odgovori osim prvog ostali nedostupni — ovako su otvoreni.
   Vrijedi i za naslovnu, koja je dosad bez JS-a imala isti problem. */
.ima-js .faq__a{
  display:grid; grid-template-rows: 0fr; opacity:0;
  transition: grid-template-rows .35s cubic-bezier(.6,.05,.2,1), opacity .3s ease;
}
.ima-js .faq__item.open .faq__a{ grid-template-rows: 1fr; opacity:1; }
.faq__a-inner{ overflow:hidden; }
.faq__abubble{
  font-family: var(--font-ui);
  font-size: clamp(0.9375rem, 1.5vw, 1.125rem); line-height:1.42;
  color:#fff; background: var(--accent);
  padding: 12px 20px;
  border-radius: 22px 22px 6px 22px;
  max-width: min(82%, 500px);
  margin: 10px 0 0 auto;   /* poravnato desno (poslana poruka) */
}

/* doodles */
/* Upitnici uz FAQ. Sekcija je i na naslovnoj i na Uslugama ista .faq —
   puna širina ekrana — pa postoci u right: padaju na isto mjesto. */
.faq{ position: relative; }
.faq__doodle{
  position:absolute; z-index:1; pointer-events:none;
  font-family: var(--font-brush); line-height:1;
}
.faq__doodle.q1{ color: var(--accent); font-size: clamp(3.125rem,7vw,5.625rem); top:40%; right:16%; opacity:.9; transform: rotate(8deg); }
.faq__doodle.q2{ color:#c3c6cd; font-size: clamp(2.375rem,5vw,4rem); top:50%; right:34%; opacity:.7; transform: rotate(-6deg); }
@media (max-width: 760px){
  .faq__doodle{ display:none; }
  .faq__abubble{ max-width: 88%; }
}

/* ===========================================================
   KONTAKT podstranica
   =========================================================== */
.kontakt{
  position: relative; z-index:1;
  padding: clamp(16px,2vh,36px) 20px clamp(60px,10vh,110px);
  overflow: hidden;
}
.kontakt__title{
  width: fit-content;
  font-family: var(--font-brush);
  /* Bio je 9vw / 9.25rem — najveći naslov na stranici, veći i od onog na
     naslovnici, pa je uz karticu od 580px odnosio previše praznine. Sada je
     u rangu ostalih naslova podstranica (Brojke 7.4vw, FAQ 6.5vw). */
  font-size: clamp(3.25rem, 7vw, 7rem);
  line-height:.9; text-align:center; color: var(--ink);
  /* Bez spuštanja po Y i s uskim razmakom ispod: naslov je povećan na 9vw,
     a gornji razmak stranice ujednačen s ostalima (--vrh), pa je dno forme
     inače izlazilo iz kadra. Naslov je rotiran i ionako vizualno prelazi
     preko kartice, tako da mu razmak ispod ne treba. */
  /* Jedini naslov kojem rotacija vrh spušta, a ne diže (-15° uz pomak
     ulijevo), pa mu gornji razmak to nadoknađuje. Vodoravno je odmaknut od
     mrvica, tako da ga podizanje ne dovodi pod njih. */
  /* Negativna margina diže naslov, a s njim i sve iza njega u toku — karticu
     i ukrase. Mrvice ostaju gdje jesu jer stoje prije njega. */
  margin: -76px auto clamp(2px,0.4vh,10px); position:relative; z-index:4;
  transform: rotate(-15deg) translate(-20vw, 0);
}

/* ručno pisane labele */
.kontakt__hand{
  position:absolute; z-index:4; pointer-events:none;
  font-family: var(--font-brush); text-transform:uppercase;
  color: var(--ink); font-size: clamp(0.875rem,1.5vw,1.25rem);
  line-height:1.15; letter-spacing:.5px;
}
/* Ispod naslova, ne uz njega: povećani naslov se pri rotaciji od -15° spušta
   ulijevo i na 33% bi ga prekrio. */
.kontakt__hand.hand-left{  top: 46%; left: 5%; transform: rotate(-8deg); max-width:160px; }
.kontakt__hand.hand-right{ bottom: 15%; right: 5%; transform: rotate(-6deg); text-align:right; max-width:180px; }

/* keycap slova (parallax) */
.kontakt .float-layer{ position:absolute; inset:0; z-index:2; pointer-events:none; }
.kontakt .keycap img{ width: clamp(60px,6.6vw,100px); filter: drop-shadow(0 16px 24px rgba(13,27,42,.30)); }

/* dodatno polje kad je rok "Da" */
.kc-rok-extra[hidden]{ display:none; }

/* stage: kartica + šareni doodleovi okolo */
.kc-stage{ position:relative; z-index:3; width: min(580px, 94vw); margin: clamp(-40px,-3vh,-14px) auto 0; }
.kc-deco{ position:absolute; inset:-70px -150px; z-index:1; pointer-events:none; }
.cd{ position:absolute; height:auto; display:block; }
/* Položaji su u CSS-u, a ne inline uz širinu i rotaciju, jer ih uski kadar
   mora moći premjestiti — inline stil se ne da nadjačati bez !important. */
.cd--1 { top: 16%;  left: 2%;  }
.cd--2 { top: 6%;   right: 3%; }
.cd--3 { bottom: 14%; left: 4%; }
.cd--4 { top: -2%;  right: 12%; }
.cd--5 { top: 40%;  right: -2%; }
.cd--6 { top: 52%;  right: 4%; }
.cd--7 { top: 28%;  right: -8%; }
.cd--8 { top: 44%;  left: -4%; }
.cd--9 { bottom: 24%; left: 12%; }
.cd--10{ bottom: 6%;  left: 30%; }
.cd--11{ bottom: 10%; right: 8%; }

/* Uvjetno polje (rok -> Da) otvara se glatko. Atribut hidden se ne da
   animirati jer je display:none, pa stanje nosi razred, a visina ide kroz
   grid-template-rows 0fr -> 1fr — jedini način da se animira do AUTO visine
   bez pogađanja max-heighta. visibility drži polje izvan reda tabanja dok je
   zatvoreno, i mijenja se tek na kraju prijelaza. */
.kc-rok-extra{
  display: grid;
  grid-template-rows: 0fr;
  opacity: 0; visibility: hidden;
  margin-top: 0; margin-bottom: 0;
  transition: grid-template-rows .38s cubic-bezier(.16,1,.3,1),
              opacity .26s ease,
              margin-top .38s cubic-bezier(.16,1,.3,1),
              margin-bottom .38s cubic-bezier(.16,1,.3,1),
              visibility 0s linear .38s;
}
/* overflow ide na omotač jer se on skuplja; input unutra ostaje netaknut */
.kc-rok-extra__unutra{ min-height: 0; overflow: hidden; }
.kc-rok-extra.je-otvoreno{
  grid-template-rows: 1fr;
  opacity: 1; visibility: visible;
  margin-top: clamp(14px, 2vh, 22px); margin-bottom: 28px;
  transition: grid-template-rows .38s cubic-bezier(.16,1,.3,1),
              opacity .3s ease .08s,
              margin-top .38s cubic-bezier(.16,1,.3,1),
              margin-bottom .38s cubic-bezier(.16,1,.3,1),
              visibility 0s;
}
@media (prefers-reduced-motion: reduce){
  .kc-rok-extra, .kc-rok-extra.je-otvoreno{ transition: none; }
}

/* form kartica */
.kc-card{
  position:relative; z-index:3;
  width:100%;
  background: var(--paper-2);
  border-radius: 26px;
  box-shadow: 0 36px 84px -26px rgba(13,27,42,.38);
  padding: clamp(30px,3.6vw,52px);
  font-family: var(--font-ui);
}
.kc-card__head{ text-align:center; margin-bottom: 36px; }
.kc-card__head img{ width:66px; height:66px; margin:0 auto 18px; border-radius:16px; display:block; }
.kc-title{ font-size: clamp(1.5625rem,2.9vw,2rem); font-weight:800; color: var(--ink); margin:0 0 12px; line-height:1.15; }
.kc-sub{ font-size: 1rem; color: var(--muted); line-height:1.55; margin:0; }

.kc-field{ margin-bottom: 28px; }
.kc-field > .kc-q, .kc-rok-extra__unutra > .kc-q, .kc-group > legend{
  display:block; font-size: 0.8125rem; font-weight:700; letter-spacing:.09em;
  text-transform:uppercase; color: var(--muted); margin-bottom: 12px; padding:0;
}
.kc-field .req{ color: var(--accent); }

/* Pravi <label> polja je sakriven: pitanje iznad polja ("Kako se zovete?") nosi
   .kc-q i sluzi oku, a ovaj label nosi cisto ime polja ("Ime i prezime") koje
   Netlify preuzima kao naziv u mailu, a citac ekrana kao ime polja. */
.kc-sr-only{
  position:absolute;
  width:1px; height:1px;
  margin:-1px; padding:0;
  overflow:hidden;
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  white-space:nowrap;
  border:0;
}
.kc-field input, .kc-field textarea{
  width:100%; font: inherit; font-size: 1.0625rem; color: var(--ink);
  padding: 16px 19px; border:1px solid var(--line); border-radius:14px; background:var(--paper-2);
  transition: border-color .2s;
}
.kc-field input::placeholder, .kc-field textarea::placeholder{ color:#b3b6bd; }
.kc-field input:focus, .kc-field textarea:focus{ outline:none; border-color: var(--accent); }
.kc-field textarea{ min-height:148px; resize:vertical; line-height:1.5; }

/* opcije (radio pills) */
.kc-group{ border:0; padding:0; margin:0 0 28px; }
.kc-pills{ display:flex; flex-wrap:wrap; gap:11px; }
.kc-pill{
  display:inline-flex; align-items:center; gap:11px; position:relative;
  font-size: 0.96875rem; color: var(--ink);
  padding: 12px 20px 12px 14px; border:1px solid var(--line); border-radius:34px;
  background:var(--chrome); cursor:pointer; transition: border-color .2s, background .2s;
}
.kc-pill input{ position:absolute; opacity:0; width:0; height:0; }
.kc-dot{ width:19px; height:19px; border-radius:50%; border:2px solid #c6c6c8; flex:0 0 auto; position:relative; transition:.2s; }
.kc-pill:hover{ border-color:#c9cbd0; }
.kc-pill input:checked ~ .kc-dot{ border-color: var(--accent); }
.kc-pill input:checked ~ .kc-dot::after{ content:""; position:absolute; inset:3.5px; border-radius:50%; background: var(--accent); }
.kc-pill:has(input:checked){ border-color: var(--accent); background:var(--tint); }
.kc-pill input:focus-visible ~ .kc-dot{ box-shadow:0 0 0 3px rgba(47,123,255,.25); }

.kc-submit{
  font-family: var(--font-brush); font-size: 1.25rem;
  background: var(--accent); color:#fff; border:0; cursor:pointer;
  padding: 16px 44px; border-radius: 34px; margin-top: 10px;
  box-shadow: 0 8px 20px rgba(47,123,255,.35);
  transition: transform .2s ease, background .2s ease;
}
.kc-submit:hover{ transform: translateY(-2px); background:#2668e0; }
.kc-note{ margin-top:22px; font-size: 0.9375rem; color:var(--muted); text-align:center; }
.kc-note a{ color: var(--accent); }

/* Zamka za botove. Netlify odbacuje svaki upit u kojem je ovo polje popunjeno,
   pa mora postojati u DOM-u, ali covjek do njega nikad ne smije doci. Nije
   display:none — dio botova preskace skrivena polja — nego je maknuto iz
   kadra na nacin koji citaci ekrana takoder preskacu. */
.kc-hp{
  position:absolute;
  width:1px; height:1px;
  margin:-1px; padding:0;
  overflow:hidden;
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  white-space:nowrap;
  border:0;
}

/* Poruka o neuspjelom slanju — vidi se samo kad POST ne prode. */
.kc-error{
  margin: 14px 0 0;
  font-size: 0.9375rem;
  text-align:center;
  color:#d92c20;
}
/* --- potvrda nakon slanja: preuzima cijelu karticu --- */
.kc-card.sent .kc-card__head,
.kc-card.sent .kc-progress,
.kc-card.sent .kc-steps,
.kc-card.sent .kc-nav,
.kc-card.sent .kc-note,
.kc-card.sent .kc-error{ display:none; }

.kc-done{
  text-align:center;
  padding: clamp(12px, 3vh, 30px) 0 clamp(4px, 1vh, 10px);
  outline: none;
}
.kc-done[hidden]{ display:none; }

.kc-done__mark{
  display:block; width: clamp(76px, 11vw, 100px); height:auto;
  margin: 0 auto clamp(22px, 3.5vh, 32px);
  color: #2e9b57; overflow: visible;
}
.kc-done__ring{
  transform-origin: 50% 50%;
  animation: kc-ring .5s cubic-bezier(.16,1,.3,1) both;
}
.kc-done__tick{
  stroke-dasharray: 74; stroke-dashoffset: 74;
  animation: kc-tick .45s cubic-bezier(.65,0,.35,1) .28s both;
}
@keyframes kc-ring{
  from{ opacity:0; transform: scale(.5) rotate(-12deg); }
  to  { opacity:1; transform: scale(1) rotate(0); }
}
@keyframes kc-tick{ to{ stroke-dashoffset: 0; } }

.kc-done__title{
  font-family: var(--font-brush);
  font-size: clamp(1.875rem, 4.4vw, 2.875rem); line-height:1.05;
  color: var(--ink); margin: 0 0 14px;
  animation: kc-up .5s cubic-bezier(.16,1,.3,1) .18s both;
}
.kc-done__lead{
  font-family: var(--font-hand);
  font-size: clamp(0.9375rem, 1.6vw, 1.0625rem); line-height:1.7;
  color: var(--ink-soft);
  max-width: 46ch; margin: 0 auto;
  animation: kc-up .5s cubic-bezier(.16,1,.3,1) .26s both;
}
.kc-done__actions{
  display:flex; flex-wrap:wrap; justify-content:center; gap: 12px;
  margin: clamp(26px, 4vh, 38px) 0 clamp(20px, 3vh, 28px);
  animation: kc-up .5s cubic-bezier(.16,1,.3,1) .34s both;
}
.kc-done__btn{
  font-family: var(--font-brush); font-size: 1rem;
  padding: 12px 26px; border-radius: 30px;
  background: var(--accent); color:#fff;
  box-shadow: 0 8px 20px rgba(47,123,255,.3);
  transition: transform .2s ease, background .2s ease;
}
.kc-done__btn:hover{ transform: translateY(-2px); background:#2668e0; }
.kc-done__btn--ghost{
  background: transparent; color: var(--ink);
  border: 1px solid var(--line); box-shadow:none;
}
.kc-done__btn--ghost:hover{ background: transparent; color: var(--accent); border-color: var(--accent); }
.kc-done__note{
  font-family: var(--font-hand); font-size: 0.875rem; line-height:1.6;
  color: var(--muted);
  animation: kc-up .5s cubic-bezier(.16,1,.3,1) .42s both;
}
.kc-done__note a{ color: var(--accent); font-weight:700; }

@keyframes kc-up{
  from{ opacity:0; transform: translateY(14px); }
  to  { opacity:1; transform: translateY(0); }
}
@media (prefers-reduced-motion: reduce){
  .kc-done__ring, .kc-done__tick, .kc-done__title,
  .kc-done__lead, .kc-done__actions, .kc-done__note{ animation: none; }
  .kc-done__tick{ stroke-dashoffset: 0; }
}

/* wizard: progress + koraci + navigacija */
.kc-progress{ height:6px; background:var(--chrome-2); border-radius:6px; overflow:hidden; margin:0 0 30px; }
.kc-progress__bar{ display:block; height:100%; width:16%; background:var(--accent); border-radius:6px; transition:width .4s cubic-bezier(.6,.05,.2,1); }
.kc-step[hidden]{ display:none; }
.kc-nav{ display:flex; align-items:center; gap:14px; margin-top:8px; }
.kc-count{ margin-right:auto; font-size: 0.8125rem; font-weight:600; color:var(--muted); letter-spacing:.02em; }
.kc-back{
  font-family:var(--font-brush); font-size: 1rem; color:var(--ink);
  background:none; border:0; cursor:pointer; padding:8px 4px; transition:color .2s;
}
.kc-back:hover{ color:var(--accent); }
.kc-back[hidden], .kc-next[hidden], .kc-submit[hidden]{ display:none; }
.kc-next{
  font-family:var(--font-brush); font-size: 1.1875rem;
  background:var(--accent); color:#fff; border:0; cursor:pointer;
  padding:14px 40px; border-radius:34px;
  box-shadow:0 8px 20px rgba(47,123,255,.35);
  transition:transform .2s ease, background .2s ease;
}
.kc-next:hover{ transform:translateY(-2px); background:#2668e0; }
.kc-nav .kc-submit{ margin-top:0; }

@media (max-width: 760px){
  .kontakt__hand{ display:none; }
  .kontakt .keycap{ display:none; }

  /* Kartica je prije ulazila pod fiksni header (vrh na 76px, header do 90px),
     a min(580px,94vw) je bilo šire od kontejnera pa je desna margina ispadala
     2px umjesto 20px. Sada širinu diktira kontejner. */
  /* Donji odmak mora nadvisiti donji rub okvira ukrasa (-86px), inače
     .kontakt{overflow:hidden} odsiječe oblačić i zvijezdu iz donje trake. */
  .kontakt{ padding: var(--vrh) 16px clamp(96px, 12vh, 130px); }
  .kc-stage{ width: 100%; margin-top: 0; }

  /* Naslov ostaje centriran (bez translate(-20vw)), ali manji nego prije.
     Osnovno pravilo ovdje pada na svoj donji rub od 3.25rem, a to je na 375px
     kadru 13.9vw — dvostruko krupnije nego na desktopu, gdje je 7vw. Uz šarene
     ukrase odmah iznad obrasca taj je pojas odnosio pogled prije nego što bi
     stigao do prvog polja. 10.5vw vraća odnos prema kartici na desktopski. */
  .kontakt__title{
    font-size: clamp(2.25rem, 10.5vw, 3rem);
    transform: rotate(-8deg);
    margin: 0 auto clamp(26px, 4vh, 40px);
  }

  /* Šareni doodleovi. Na širokom kadru stoje lijevo i desno od kartice, ali
     ondje je kartica 580px u 1440 — ovdje je 343 u 375 i sa strane ostaje
     16px, pa je od svakog crteža virila samo krhotina. Prsten se zato okreće
     za 90°: gore i dolje, gdje mjesta ima. Okvir se produžuje u pojas naslova
     i u donji odmak stranice, a sami crteži se premještaju u te dvije trake.
     Naslov je z-index 4 i crta se povrh njih, pa ostaje čitljiv. */
  .kc-deco{ display: block; inset: -168px -16px -86px; }
  /* Zasebno `scale` svojstvo se slaže s inline `transform: rotate(...)`. */
  .kc-deco .cd{ scale: .6; }

  /* Gornja traka — oko naslova. Dio crteža namjerno zalazi pod gornji rub
     kartice: tako se čitaju kao pozadina iza obrasca, a ne kao red sličica
     iznad njega. Kad su svi u cijelosti iznad kartice, pojas postane glasniji
     od samog obrasca. */
  .cd--1 { top: 8%;  left: 3%;  right: auto;  bottom: auto; }
  .cd--2 { top: 4.5%; right: 4%; left: auto;  bottom: auto; }  /* niže od pilule Kontakt u zaglavlju */
  .cd--4 { top: 12%; right: 2%; left: auto;   bottom: auto; }
  .cd--6 { top: 4%;  left: 42%; right: auto;  bottom: auto; }
  .cd--9 { top: 14%; left: 24%; right: auto;  bottom: auto; }

  /* donja traka — ispod kartice */
  .cd--3 { bottom: 1%;  left: 4%;  top: auto; right: auto; }
  .cd--10{ bottom: 5%;  left: 26%; top: auto; right: auto; }
  .cd--11{ bottom: 0.5%; right: 5%; top: auto; left: auto; }

  /* bočne krhotine — namjerno napola izvan kadra, kao na širokom ekranu */
  .cd--5 { top: 30%; right: -2%; left: auto; bottom: auto; }
  .cd--7 { top: 58%; right: -5%; left: auto; bottom: auto; }
  .cd--8 { top: 44%; left: -4%;  right: auto; bottom: auto; }
}

/* ===========================================================
   BLOG (popis objava)
   =========================================================== */
.blog{
  position: relative; z-index:1;
  height: 100vh;
  display:flex; flex-direction:column; justify-content:flex-start;
  max-width: 1120px; margin: 0 auto;
  padding: clamp(90px,14vh,150px) 30px clamp(70px,10vh,110px);
  box-sizing: border-box;
}
.blog.blog--auto{ height:auto; min-height:100vh; max-width:82vw; }
.blog__title{
  width: fit-content;
  font-family: var(--font-brush);
  font-weight: 400;
  font-size: clamp(4rem, 9vw, 9.25rem);
  line-height: .95;
  /* --d-* nitko više ne postavlja; retci stoje na svojim fallback bojama */
  color: var(--ink);
  margin: 0 0 clamp(36px,5vh,56px);
  transform: rotate(-8deg);
  transition: color .15s linear;
}
.blog__list{
  display:flex; flex-direction:column;
  font-family: var(--font-ui);
}
.blog__row{
  display:flex; align-items:center; gap:18px;
  width: 75vw; height: 5vh; margin: 0 auto;
  box-sizing: border-box;
  padding: 0 20px;
  border-radius: 8px;
  text-decoration:none; color: var(--d-row-ink, var(--ink));
  transition: background .12s ease, color .12s ease;
}
.blog__row:nth-child(odd){ background: var(--d-row-odd, var(--paper)); }
.blog__row:nth-child(even){ background: var(--d-row-even, #eeeeee); }
.blog__row:hover{ background: var(--accent); color:#fff; }
.blog__row:hover .blog__row-cat,
.blog__row:hover .blog__row-date{ color:#fff; opacity:.85; }
.blog__thumb{
  width:34px; height:34px; border-radius:8px; flex:0 0 auto;
  object-fit: cover; background: var(--d-row-thumb, var(--paper-2));
}
.blog__row-title{
  flex:1 1 auto; min-width:0;
  font-weight:600; font-size: 1rem;
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
}
.blog__row-cat{
  width:160px; flex:0 0 auto;
  color: var(--d-row-muted, var(--muted)); font-size: 0.875rem;
  transition: color .12s ease;
}
.blog__row-date{
  width:100px; flex:0 0 auto; text-align:right;
  color: var(--d-row-muted, var(--muted)); font-size: 0.875rem;
  transition: color .12s ease;
}
/* Na užim ekranima najduži naslov ("Izrada web stranica u Hrvatskoj — vodič za
   obrte i firme") traži 419px, pa u jedan redak uz sličicu i datum stane tek
   od ~620px viewporta. Zato redak ovdje postaje mreža: naslov se prelama preko
   pune širine i datum ide pod njega umjesto pokraj njega. Ništa se ne skraćuje
   i ne gubi, a redak usput naraste na ~80px — pristojan dodirni cilj (prije je
   fiksnih 5vh davalo 41px, ispod minimuma od 44px). */
@media (max-width: 640px){
  /* 94vw je bilo šire od kontejnera (koji ima 30px paddinga), pa se redak
     prelijevao udesno i lijeva margina je ispadala veća od desne. Sada širinu
     diktira kontejner, pa su margine jednake po konstrukciji.
     :not(.blog--auto) = samo blog.html; o-nama i projekti imaju svoje mjere. */
  .blog:not(.blog--auto){
    padding-left: 14px; padding-right: 14px;
    /* Popis od dvanaest objava ne stane u 100vh čim redak naraste na ~80px:
       sadržaj je sezao 276px preko dna, a .blog ima fiksnu visinu pa je taj
       višak ulazio ravno u footer. Ovdje stranica smije narasti. */
    height: auto; min-height: 100svh;
    padding-bottom: clamp(48px, 8vh, 90px);
  }
  .blog:not(.blog--auto) .blog__title{ padding-left: 16px; }  /* naslov ostaje u ravnini s topbarom */
  .blog__row{
    width: 100%; height: auto;
    display: grid;
    grid-template-columns: auto 1fr;
    grid-template-areas: "slicica naslov"
                         "slicica datum";
    column-gap: 12px; row-gap: 3px;
    align-items: center;
    padding: 11px 14px;
  }
  .blog__thumb{ grid-area: slicica; }
  .blog__row-title{
    grid-area: naslov;
    white-space: normal; overflow: visible; text-overflow: clip;
    font-size: 0.96875rem; line-height: 1.28;
  }
  .blog__row-cat{ display:none; }
  .blog__row-date{ grid-area: datum; width:auto; text-align:left; font-size: 0.78125rem; }
}

/* ===========================================================
   BLOG — pojedinačna objava
   =========================================================== */
.bp-nav-left{ display:flex; align-items:center; gap:12px; }
.bp-sep{ color: var(--muted); font-family: var(--font-brush); font-size: 1.125rem; }
.bp-back{
  font-family: var(--font-brush); font-size: 1.125rem; color: var(--ink);
  transition: color .2s;
}
.bp-back:hover{ color: var(--accent); }

.blog-post{
  position: relative; z-index:1;
  max-width: 1200px; margin: 0 auto;
  padding: 0 30px clamp(90px,12vh,150px);
}
.bp-scroll{ position:relative; }
.bp-title{
  position: sticky; top: 110px; z-index:1;
  width: fit-content;
  font-family: var(--font-brush);
  font-size: clamp(4rem, 9vw, 9.25rem);
  line-height: .95; color: var(--ink);
  margin: 110px 0 0;
  transform: rotate(-11deg);
}
.bp-title .bp-num{ color: var(--accent); }

.bp-card{
  position: relative; z-index:2;
  width: min(620px, 54vw); margin: 8px auto 0;
  background: var(--paper-2);
  border: 1px solid var(--line);
  border-radius: 10px;
  box-shadow:
    0 60px 110px -24px rgba(13,27,42,.55),
    0 24px 48px -16px rgba(13,27,42,.30),
    0 6px 16px -2px rgba(13,27,42,.16);
  overflow: hidden;
}
.bp-card__bar{
  display:flex; align-items:center; gap:16px;
  padding: 14px 20px;
  border-bottom: 1px solid var(--line);
  background: var(--chrome-2);
}
.bp-dots{ display:flex; gap:7px; flex:0 0 auto; }
.bp-dots i{ width:11px; height:11px; border-radius:50%; display:block; }
.bp-dots i:nth-child(1){ background:#ff5f57; }
.bp-dots i:nth-child(2){ background:#ffbd2e; }
.bp-dots i:nth-child(3){ background:#28c840; }
/* U traci prozora stoji adresa, pa se i sloguje kao adresa: tanje, prigušeno
   i manje od naslova ispod. Prije je ondje bio naslov istom težinom kao H1,
   pa su dva jednaka naslova stajala jedan iznad drugoga. */
.bp-card__name{
  font-family: var(--font-ui);
  font-weight:500; font-size: .9375rem; color: var(--muted);
  /* min-width:0 je uvjet da ellipsis uopce proradi. Kao flex-stavka element
     ima automatski minimum jednak min-content sirini, pa se odbijao stisnuti
     ispod pune duljine adrese — traka je rasla, s njom i grid traka kartice,
     i kartica je na telefonu izlazila desno izvan ekrana. */
  min-width: 0;
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
}
/* Kratko gašenje dok se ime u traci izmjenjuje, da promjena ne bude rez. */
.bp-card__bar .bp-card__name{ transition: opacity .18s ease; }
.bp-card__bar.bar-mijenja .bp-card__name{ opacity: 0; }

.bp-card__body{
  --card-pad: clamp(24px,4vw,48px);
  padding: var(--card-pad);
  font-family: var(--font-ui);
}
/* Naslov objave. Prije je H1 bio redni broj („Blog 01"), pa je pravi naslov
   živio samo u <title> — nevidljiv i tražilici i čitaču ekrana kao naslov. */
/* Naslov stranice projekta — vidljiv, ali podređen galeriji koja je ovdje
   glavni sadržaj. Prije je H1 bio redni broj projekta. */
/* Sadržaj samo za tražilice i čitače ekrana. Ne display:none — to bi ga
   sakrilo i od čitača; ovako ostaje u stablu pristupačnosti. */
.samo-citac{
  position: absolute; width: 1px; height: 1px;
  margin: -1px; padding: 0; overflow: hidden;
  clip-path: inset(50%); white-space: nowrap; border: 0;
}

/* H1 projektne stranice sjedi u retku KLIJENT same kartice, a ne kao zaseban
   naslov ispod broja projekta. Ondje je ime klijenta stajalo tri puta —
   u mrvicama, u naslovu i u ovom retku — i H1 se dao u cijelosti sloziti iz
   onoga sto je vec bilo na ekranu.
   font:inherit da naslov izgleda tocno kao svaka druga vrijednost u kartici:
   mijenja se sto je element, ne kako izgleda. */
.pp-row dd .pp-klijent{
  font: inherit; color: inherit; letter-spacing: inherit;
  margin: 0; display: inline;
}

.bp-naslov{
  font-family: var(--font-ui); font-weight: 800;
  font-size: clamp(1.5rem, 3.4vw, 2.375rem);
  line-height: 1.12; letter-spacing: -.02em;
  color: var(--ink); margin: 0 0 clamp(12px, 1.8vh, 20px);
}
.bp-meta{
  display:flex; align-items:center; flex-wrap: wrap;
  gap: 6px clamp(10px, 2vw, 20px);
  color: var(--muted); font-size: 0.875rem; margin-bottom:22px;
}
/* Datum gura potpis udesno, a kategorija ostaje uz lijevi rub — isti raspored
   kao prije, samo s trecim clanom u retku. */
.bp-date{ margin-right: auto; }
/* Vidljiv potpis. Nije uvjet — Googleova opca smjernica kaze da se ne
   oznacava nevidljiv sadrzaj, a upute za author PREPORUCUJU da se ime podudara
   s potpisom na stranici. Ime je ono sto tu radi posao, pa stoji na ekranu;
   titula ostaje samo u shemi jer je svojstvo osobe, a ne tvrdnja o stranici. */
.bp-autor{
  font-family: var(--font-ui); font-weight: 700;
  color: var(--ink-soft);
  white-space: nowrap;
}
@media (max-width: 560px){
  .bp-date{ margin-right: 0; }
  .bp-autor{ flex-basis: 100%; }
}
/* Kategorija kao nadnaslov: sitna, razmaknuta, u boji naglaska — najavljuje
   naslov umjesto da stoji uz datum s kojim nema veze. */

.bp-hero{
  width:100%; height:auto; aspect-ratio: 3/2; border-radius:8px;
  margin-bottom: 30px;
  object-fit: contain; display:block;
}
.bp-content{ font-size: 1.03125rem; line-height:1.75; color: var(--ink-soft); }
.bp-content p{ margin:0 0 18px; }
.bp-content h2{
  font-size: clamp(1.1875rem,2vw,1.375rem); font-weight:800; color: var(--ink);
  margin: 34px 0 12px;
}
.bp-content strong{ color: var(--ink); font-weight: 800; }
/* Isti dizajn internih linkova u blogovima i u "Povezano:" na projektima —
   dijele pravilo da ne mogu razići. */
.bp-content a,
.pp-related a{
  color: var(--ink); font-weight: 600;
  text-decoration: none;
  background-image: linear-gradient(var(--accent-bg), var(--accent-bg));
  background-repeat: no-repeat;
  background-position: 0 100%;
  background-size: 100% 0.5em;
  padding: 0.05em 0.15em;
  margin: 0 -0.15em;
  border-radius: 3px;
  /* Bez ovoga se pri prelomu retka podloga, padding i zaobljenje dijele po
     sredini pa drugi redak izgleda odsjeceno — vidljivo na mobitelu, gdje se
     duzi naslov uvijek lomi. "clone" svaki ulomak retka tretira kao zaseban. */
  -webkit-box-decoration-break: clone;
  box-decoration-break: clone;
  transition: background .18s ease, color .18s ease;
}
.bp-content a:hover,
.pp-related a:hover{
  color: #fff;
  background-image: linear-gradient(var(--accent), var(--accent));
  background-size: 100% 100%;
}

.bp-pagenav{
  display:flex; align-items:center; justify-content:center; gap:44px;
  margin-top: clamp(40px,6vh,64px);
}
.bp-pagenav a{
  font-family: var(--font-brush); font-size: clamp(1.625rem,3.4vw,2.375rem);
  color: var(--ink); transition: color .2s;
}
.bp-pagenav a:hover{ color: var(--accent); }

@media (max-width: 860px){
  /* Naslov ostaje sticky (kartica mu preko njega prelazi pri skrolu, kao na
     većim ekranima) — mijenjaju se samo razmaci, da u mirovanju stoji cijel
     iznad kartice umjesto da je skriven ispod nje. Nagib od -11° spušta lijevi
     kraj ~24px ispod layout kutije i diže desni jednako iznad nje, pa oba
     razmaka (od headera i do kartice) to uračunavaju. */
  .bp-title{ top: 96px; margin-top: clamp(130px, 16vw, 146px); }
  .bp-card{ margin-top: clamp(44px, 5.5vw, 54px); }
}
@media (max-width: 700px){
  .bp-card{ width: 100%; }
}

/* ===========================================================
   PROJEKTI — pojedinačni projekt (split layout)
   =========================================================== */
.proj-post{
  position: relative; z-index:1;
  max-width: 1320px; margin: 0 auto;
  padding: 0 30px clamp(90px,12vh,150px);
}
.pp-grid{
  display:grid;
  grid-template-columns: minmax(300px, 440px) 1fr;
  gap: clamp(24px, 4vw, 64px);
}
.pp-left{ align-self: stretch; }
.pp-left-inner{ position: sticky; top: 110px; align-self: start; }
.pp-doodle{ position:absolute; opacity:.4; color: var(--muted); pointer-events:none; z-index:0; }

.pp-title{
  position:relative; z-index:1;
  width: fit-content;
  font-family: var(--font-brush);
  font-size: clamp(3.25rem, 6.4vw, 6rem);
  line-height:.95; color: var(--ink);
  transform: rotate(-9deg);
}
.pp-title .bp-num{ color: var(--accent); }
.pp-title--gallery{
  position: sticky; top: 110px; z-index: 0;
  font-size: clamp(4rem, 9vw, 9.25rem);
  margin: 110px auto 56px;
}

.pp-card{
  position:relative; z-index:2;
  margin-top: 110px;
  background:var(--paper-2);
  border: 1px solid var(--line);
  border-radius: 10px;
  box-shadow:
    0 60px 110px -24px rgba(13,27,42,.55),
    0 24px 48px -16px rgba(13,27,42,.30),
    0 6px 16px -2px rgba(13,27,42,.16);
  overflow:hidden;
}
.pp-card__body{
  padding: clamp(22px,3vw,32px);
  font-family: var(--font-ui);
}
.pp-row{
  display:flex; justify-content:space-between; gap:18px;
  padding: 16px 0;
  border-top: 1px solid var(--line);
}
.pp-row:first-child{ border-top:none; padding-top:0; }
.pp-row dt{
  flex:0 0 auto; width:90px;
  font-size: 0.8125rem; text-transform:uppercase; letter-spacing:.5px;
  color: var(--muted); font-weight:600;
}
.pp-row dd{ margin:0; flex:1 1 auto; color: var(--ink); font-size: 0.96875rem; text-align:right; }
.pp-row--desc dd{ text-align:left; line-height:1.6; color: var(--ink-soft); }
.pp-row--desc{ flex-direction:column; }
.pp-row--desc dt{ width:auto; margin-bottom:8px; }
.pp-live{ color: var(--accent); font-weight:600; text-decoration:none; }
.pp-live:hover{ color: #2668e0; text-decoration:underline; }
.pp-tags{ display:flex; flex-wrap:wrap; gap:6px; justify-content:flex-end; }
.pp-tag{
  display:inline-block; font-size: 0.78125rem; font-weight:600;
  color: var(--accent); background: var(--accent-bg);
  padding: 4px 10px; border-radius: 20px; white-space:nowrap;
  text-decoration:none; transition: background .18s ease, color .18s ease;
}
a.pp-tag:hover{ background: var(--accent); color:#fff; }
.pp-cta{
  display:block; margin-top:22px;
  font-family: var(--font-brush); font-size: 1.1875rem; color: var(--ink);
  /* strelica je nerazdvojivim razmakom vezana uz "Javite se" (vidi generator),
     pa ne može ostati sama u drugom retku */
  text-wrap: pretty;
  transition: color .2s;
}
.pp-cta:hover{ color: var(--accent); }
.pp-related{
  margin-top:16px; padding-top:16px; border-top:1px solid var(--line);
  font-size: 0.875rem; color: var(--muted);
  line-height: 1.6;
}
@media (max-width: 620px){
  /* Dvije poveznice u jednom retku na 270px daju tri prelomljena retka
     nabijena jedan na drugi. Vise zraka izmedu redaka i malo manje slovo. */
  .pp-related{ font-size: 0.8125rem; line-height: 1.9; }
}
/* izgled linka dolazi iz zajedničkog pravila s .bp-content a */

.pp-right{ position:relative; min-height: max(92vh, 1220px); }
.pp-shot{
  position:relative; z-index:1;
  background:var(--paper-2);
  border: 1px solid var(--line);
  border-radius: 10px;
  box-shadow:
    0 50px 90px -20px rgba(13,27,42,.45),
    0 18px 40px -14px rgba(13,27,42,.25);
  overflow:hidden;
  transform: rotate(-1deg);
  margin: 0 0 30px;
}
.pp-shot .win-shot{ padding: 5px 9px 9px; }
.pp-shot .win-bar{ border-bottom: none; }
.pp-shot--mobile{ max-width: min(360px, 78vw); margin-left:auto; margin-right:auto; transform: rotate(1.2deg); }
.pp-shot:nth-child(2n){ transform: rotate(1deg); }

@media (max-width: 860px){
  /* minmax(0,1fr), ne 1fr: 1fr ima automatski minimum min-content, pa ga
     nelomljivi sadrzaj (duga adresa u traci kartice) gura sire od spremnika.
     Isti razlog kao kod .refwall__popis. */
  .pp-grid{ grid-template-columns: minmax(0, 1fr); }
  .pp-left-inner{ position:static; }
  /* topbar je fiksan i visok 90px — sa 60px kartica mu je ulazila pod nos */
  .pp-card{ margin-top: 130px; }
  .pp-title--gallery{ position:static; margin-top: 40px; }
}

/* ===========================================================
   PRAVNI DOKUMENTI (privatnost, uvjeti, kolačići)
   =========================================================== */
/* ===========================================================
   LOKALNE STRANICE — /izrada-web-stranica-<grad>
   Odredišne stranice s namjerom kupnje, ne članci. Slog je namjerno miran:
   naslov, dokaz iz tog kraja, usluge, poziv. Nema animacija jer ovdje
   posjetitelj dolazi s Googlea sa spremnim pitanjem i traži odgovor.
   =========================================================== */
.grad{
  position: relative; z-index: 1;
  max-width: 880px; margin: 0 auto;
  padding: clamp(96px, 15vh, 150px) 30px clamp(70px, 11vh, 120px);
}
.grad__putanja{
  font-family: var(--font-ui); font-size: .8125rem;
  color: var(--muted); margin-bottom: clamp(24px, 4vh, 44px);
}
.grad__putanja a{ color: var(--muted); }
.grad__putanja a:hover{ color: var(--accent); }
.grad__putanja span[aria-current]{ color: var(--ink-soft); }

.grad__naslov{
  font-family: var(--font-brush); font-weight: 400;
  font-size: clamp(2.25rem, 6vw, 4.5rem); line-height: 1.02;
  letter-spacing: .5px; color: var(--ink);
  margin: 0 0 clamp(18px, 2.6vh, 28px);
}
.grad__uvod{
  font-family: var(--font-ui);
  font-size: clamp(1.0625rem, 1.6vw, 1.3125rem);
  line-height: 1.62; color: var(--ink-soft);
  margin: 0 0 1em; max-width: 62ch;
}
.grad__akcija{
  display: inline-flex; align-items: center; gap: .5em;
  margin-top: clamp(10px, 1.6vh, 18px);
  padding: clamp(13px, 1.7vh, 17px) clamp(20px, 2.4vw, 28px);
  background: var(--accent); color: #fff;
  font-family: var(--font-ui); font-weight: 700;
  font-size: clamp(.9375rem, 1.4vw, 1.0625rem);
  transition: background .18s ease;
}
.grad__akcija:hover{ background: #1f63dd; }
.grad__veza{
  font-family: var(--font-ui); font-weight: 600;
  color: var(--accent);
}
.grad__veza:hover{ text-decoration: underline; }

.grad section{ margin-top: clamp(44px, 7vh, 78px); }
.grad h2{
  font-family: var(--font-ui); font-weight: 800;
  font-size: clamp(1.375rem, 2.6vw, 2rem);
  letter-spacing: -.02em; color: var(--ink);
  margin: 0 0 clamp(14px, 2vh, 22px);
}
.grad p{
  font-family: var(--font-ui);
  font-size: clamp(1rem, 1.4vw, 1.125rem);
  line-height: 1.68; color: var(--ink-soft);
  margin: 0 0 1em; max-width: 68ch;
}
.grad a:not(.grad__akcija){ color: var(--accent); }

/* Dokaz je jedini uokvireni blok na stranici — on je razlog zašto ova
   stranica postoji, a ne još jedan tekst s imenom grada. */
.grad__dokaz{
  border-left: 3px solid var(--accent);
  padding-left: clamp(18px, 2.4vw, 28px);
}
.grad__klijent{ color: var(--ink); font-size: clamp(1.0625rem, 1.6vw, 1.25rem); }

.grad__popis{ list-style: none; margin: 0; padding: 0;
  display: grid; gap: clamp(18px, 2.6vh, 28px);
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); }
.grad__usluga strong{
  font-family: var(--font-ui); font-weight: 700;
  font-size: clamp(1rem, 1.5vw, 1.1875rem); color: var(--ink);
}
.grad__usluga a{ color: inherit; }
.grad__usluga a:hover strong{ color: var(--accent); }
.grad__usluga p{ margin: .35em 0 0; font-size: clamp(.9375rem, 1.3vw, 1.0625rem); }

/* Cesta pitanja na gradskoj stranici. Bez harmonike i bez js-a: odgovori su
   odmah vidljivi jer ih tako citaju i covjek i odgovorni motori, a stranica
   ionako nema toliko pitanja da bi popis bio predugacak. */
/* Navigacija medju gradskim stranicama. Isti posao kao .bp-pagenav na blogu,
   ali s tri mjesta: natrag, popis svih, naprijed — jer se do ovih stranica
   najcesce dolazi izravno iz trazilice, bez ijednog koraka kroz sajt. */
/* FAQ je isti razgovor kao na naslovnoj. Mjehuric odgovora je <p>, pa bi ga
   `.grad p` (0,1,1) pregazio i odgovor bi ostao pune sirine, bez desnog
   poravnanja. Ovaj selektor je (0,2,0) i vraca mu ono sto ima na naslovnoj. */
.grad .faq__abubble{
  font-size: clamp(0.9375rem, 1.5vw, 1.125rem);
  line-height: 1.42;
  color: #fff;
  max-width: min(82%, 500px);
  margin: 10px 0 0 auto;
}
.grad .faq__list{ margin-top: clamp(6px, 1vh, 12px); }

.grad-nav{
  display: grid;
  grid-template-columns: 1fr auto 1fr;
  align-items: center;
  gap: clamp(14px, 2.4vw, 32px);
  margin-top: clamp(40px, 6vh, 72px);
  padding-top: clamp(20px, 3vh, 30px);
  border-top: 1px solid var(--line);
}
.grad-nav__strana{
  display: flex; flex-direction: column; gap: 4px;
  min-width: 0;
}
.grad-nav__strana--desno{ text-align: right; }
.grad-nav__oznaka{
  font-family: var(--font-ui); font-weight: 700;
  font-size: .625rem; letter-spacing: .16em; text-transform: uppercase;
  color: var(--muted);
}
.grad-nav__ime{
  font-family: var(--font-ui); font-weight: 800;
  font-size: clamp(1rem, 1.5vw, 1.1875rem);
  letter-spacing: -.02em; color: var(--ink);
  border-bottom: 2px solid transparent; padding-bottom: 1px;
  transition: border-color .2s ease;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.grad-nav__strana:hover .grad-nav__ime{ border-bottom-color: var(--accent); }
.grad-nav__sve{
  font-family: var(--font-ui); font-weight: 700;
  font-size: clamp(.8125rem, 1.1vw, .9375rem);
  color: var(--ink);
  border: 2px solid rgba(13,27,42,.24);
  border-radius: 30px; padding: 9px 18px;
  white-space: nowrap;
  transition: color .2s ease, border-color .2s ease;
}
.grad-nav__sve:hover{ color: var(--accent); border-color: var(--accent); }
.grad-nav a:focus-visible{ outline: 2px solid var(--accent); outline-offset: 4px; }

@media (max-width: 620px){
  /* Tri stupca na 390px ostavljaju imenu tridesetak piksela. Dva stupca su
     bila gore: "Sva mjesta" je zbog span 1/-1 lomilo redak, pa je sljedece
     mjesto zavrsilo u lijevom polustupcu i desno poravnato — izgledalo je
     kao greska. Na uskom ekranu ovo je popis, ne raspored lijevo-desno:
     jedan stupac, sve poravnato ulijevo, gumb na kraju preko cijele sirine. */
  .grad-nav{ grid-template-columns: 1fr; row-gap: 16px; }
  .grad-nav__strana{ order: 1; }
  .grad-nav__strana--desno{ order: 2; text-align: left; }
  .grad-nav__sve{
    order: 3;
    justify-self: stretch; text-align: center;
    margin-top: 6px;
  }
}

.grad__zavrsno{ display: flex; flex-wrap: wrap; align-items: center;
  gap: clamp(14px, 2vw, 24px); }

@media (max-width: 820px){
  .grad{ padding-left: 20px; padding-right: 20px; }
}

.pravno{
  position: relative; z-index:1;
  max-width: 780px; margin: 0 auto;
  padding: clamp(96px,15vh,150px) 30px clamp(70px,11vh,120px);
}
.pravno__head{ margin-bottom: clamp(38px,6vh,60px); }
.pravno h1{
  font-family: var(--font-brush); font-weight:400;
  font-size: clamp(2.25rem,5.4vw,4.25rem); line-height:1.04;
  color: var(--ink); margin: 0 0 20px;
}
.pravno__uvod{
  font-size: clamp(1rem,1.7vw,1.1875rem); line-height:1.7;
  color: var(--ink-soft); margin: 0 0 14px; max-width: 58ch;
}
.pravno__datum{
  font-family: var(--font-hand); font-size: 0.84375rem;
  color: var(--muted); margin:0;
}
.pravno__odjeljak{ margin-bottom: clamp(30px,4.5vh,44px); }
.pravno__odjeljak h2{
  font-family: var(--font-brush); font-weight:400;
  font-size: clamp(1.3125rem,2.4vw,1.75rem); line-height:1.2;
  color: var(--ink); margin: 0 0 14px;
}
.pravno__odjeljak p{
  font-size: 1rem; line-height:1.75; color: var(--ink-soft); margin: 0 0 14px;
}
.pravno__odjeljak p:last-child{ margin-bottom:0; }
.pravno__odjeljak strong{ color: var(--ink); }
.pravno__odjeljak a{ color: var(--accent); font-weight:600; }
.pravno__odjeljak a:hover{ text-decoration: underline; }
.pravno__lista{ list-style:none; margin: 0 0 14px; padding:0; display:grid; gap:11px; }
.pravno__lista li{
  position:relative; padding-left: 22px;
  font-size: 1rem; line-height:1.7; color: var(--ink-soft);
}
.pravno__lista li::before{
  content:""; position:absolute; left:2px; top:.62em;
  width:7px; height:7px; border-radius:50%; background: var(--accent);
}
.pravno__pomoc{
  margin-top: clamp(40px,6vh,60px);
  padding: clamp(22px,3vw,30px);
  background: var(--chrome-2);
  border-radius: var(--radius);
}
.pravno__pomoc p{
  font-family: var(--font-hand); font-size: 0.96875rem; line-height:1.65;
  color: var(--ink-soft); margin:0;
}
.pravno__pomoc a{ color: var(--accent); font-weight:700; }

/* ===========================================================
   FOOTER
   Dva stupca: navigacija i mreže lijevo, okvir s pozivom desno. Prije je
   sve išlo jedno ispod drugoga i podnožje je naraslo preko tisuću piksela.

   Tipografija: rukopisni font drži samo naslov i sitne oznake. Sve što
   se doista čita — uvod, kontakt, navigacija, pravni linkovi — ide u
   --font-ui, jer se e-mail i telefon u kistu teško čitaju.
   =========================================================== */
/* Točno jedan ekran visine: kad se doskrola do dna, u kadru nema ničega
   osim footera. min-height (a ne height) da sadržaj smije narasti preko toga
   na niskim ekranima umjesto da se obreže. svh, ne vh, jer na mobitelu vh
   računa i traku preglednika pa footer ispadne viši od vidljivog. */
.footer{
  position: relative; z-index:1;
  min-height: 100svh;
  padding: clamp(104px, 12vh, 130px) 30px clamp(22px, 3vh, 34px);
  display:flex; flex-direction:column;
  overflow:hidden;
  color: var(--ink);
  /* Odmak pravne trake od sadržaja iznad — ista mjera treba i desnom stupcu,
     koji se u nju spušta da bi se mreže centrirale do same linije. */
  --traka-odmak: clamp(28px, 4vh, 48px);
}

.footer__eyebrow{
  font-family: var(--font-ui); font-weight:600;
  font-size: clamp(0.6875rem, .95vw, .8125rem); letter-spacing: .16em; text-transform: uppercase;
  color: var(--muted);
  margin: 0 0 clamp(14px, 2.1vh, 22px);
}

/* Raste do pune visine i centrira svoj sadržaj — otud okvir na sredini
   ekrana, a traka s pravnim linkovima ostaje prilijepljena za dno. */
.footer__cta{
  /* Razmak koji okvir treba iznad sebe za jezičac. Dijele ga oba stupca —
     inače se centriranje desnog razilazi s okvirom za točno tu vrijednost. */
  --vrh-jezicac: clamp(24px, 3.2vh, 34px);
  width: 100%; max-width: var(--maxw); margin: 0 auto;
  flex: 1 1 auto;
  display:grid;
  /* Mapa uzima točno onoliko koliko joj treba, ne polovicu širine: uspravan
     popis je uzak, pa je udio u fr ostavljao 250px mrtve zone do okvira.
     Okvir onda dobiva sav ostatak i u njemu stoji centriran, čime se pomiče
     bliže sredini stranice. */
  grid-template-columns: max-content minmax(0, 1fr);
  gap: clamp(34px, 4vw, 70px);
  align-items: start;
  /* safe: centrira dok sadržaj stane, a kad preraste kadar vraća se na vrh —
     bez toga centriranje pri prelijevanju povuče okvir pod fiksno zaglavlje. */
  align-content: center;
  align-content: safe center;
}

/* --- desno: okvir s pozivom ---
   .okvir-mjesto je samo pozicijski okvir: znakovi u njemu leže apsolutno oko
   samog okvira i on ih preklapa, pa dio svakog ostaje pod njegovim
   zatamnjenjem, a dio viri na papir. */
/* Desni stupac: okvir, a pod njegovim donjim rubom mreže. Širinu i
   centriranje drži omotač, da .okvir-mjesto ostane točno velik kao okvir —
   postoci položaja triju znakova mjere se po njemu, pa bi ga svaki dodatni
   sadržaj u njemu razvukao i pomaknuo ikone. */
.footer__desno{
  width: 100%; max-width: min(620px, 66svh);
  margin-inline: auto;
  display: grid; justify-items: end;
}
.okvir-mjesto{
  position: relative;
  width: 100%;
  margin-top: var(--vrh-jezicac);
}
.okvir__znak path{ fill: currentColor; }
/* Položaji su zadani rubom okvira, ne kutom omotača: tako je udio koji ostaje
   pod okvirom stalan bez obzira na njegovu veličinu. translate pomiče ikonu
   za dio njene vlastite širine, pa je omjer unutra/vani zadan brojkom. */
.okvir__znak{ position: absolute; z-index: 0; }

/* Mail: sredina mu pada točno na gornji rub — pola pod okvirom, pola iznad —
   na 60% širine. */
.okvir__znak--mail{
  left: 60%; top: 0;
  translate: -50% -50%;
  width: clamp(76px, 9.5vw, 132px); rotate: 8deg;
}
/* Telefon: na polovici visine lijeve stranice, s manje od pola pod okvirom —
   35% unutra, 65% viri van. */
.okvir__znak--tel{
  left: 0; top: 50%;
  translate: -65% -50%;
  width: clamp(90px, 11.5vw, 158px); rotate: -10deg;
}
/* Avion: gotovo cijeli pod okvirom, tek mu vrh viri ispod donjeg ruba, i
   desnije od maila. */
.okvir__znak--avion{
  left: 74%; bottom: 0;
  translate: -50% 18%;
  width: clamp(84px, 10.5vw, 144px); rotate: -5deg;
}
/* U jednom stupcu okvir je malen i znakovi ga zaguše umjesto da ga okruže. */
@media (max-width: 820px){
  .okvir__znak{ display: none; }
}

/* --- desno: okvir s pozivom --- */
.okvir{
  --okvir-boja: var(--accent);
  --kvadratic: 11px;
  --rub: 2px;
  position: relative;
  /* Kvadrat: širina se veže na stupac, visina je prati. Sadržaj je jedan
     odlomak centriran po visini, pa prazan prostor ostaje ravnomjerno
     raspoređen bez obzira koliko se tekst prelomi. */
  /* Strop je i po širini i po visini: kvadrat od 600px na niskom kadru ne
     stane u jedan ekran zajedno s razmacima i trakom na dnu, pa bi footer
     prerastao svoju visinu za par piksela i propustio prethodnu sekciju. */
  /* Bez aspect-ratio: kvadrat je bio zadana mjera pa je tekst plivao u
     polupraznoj plohi. Sada visinu određuje sadržaj, a ispuna je velika i
     razmjerna — okvir uvijek stoji napet oko onoga što drži. */
  width: 100%; max-width: min(620px, 66svh);
  align-self: start;
  position: relative; z-index: 1;   /* iznad znakova koji ga presijecaju */
  display: block;
  border: var(--rub) solid var(--okvir-boja);
  /* Zatamnjenje kao na predlošku — tanki sloj tinte, ne bjeline. Prije je
     ovdje stajala bijela na .62 i radila obrnuto: posvijetlila je unutrašnjost
     i ugasila mrežu. Alfa je namjerno mala; posao je odvojiti sadržaj od
     podloge, ne napraviti karticu. */
  background-color: rgba(13, 27, 42, .07);
  padding: clamp(26px, 3.6vw, 46px) clamp(24px, 3.2vw, 42px) clamp(28px, 3.8vw, 48px);
}
/* Kvadratići u kutovima. Prije su bili pozadina samog okvira i zato odrezani:
   pozadina se reže na okvir elementa, pa je vanjska polovica svakog kvadratića
   jednostavno nestajala i izgledali su kao da su ugurani unutra.

   Ovaj sloj je za pola kvadratića veći od okvira na svaku stranu, pa kvadratić
   postavljen u njegov kut ima središte točno na spoju linija i viri na sve
   četiri strane — kao na predlošku. */
.okvir::before{
  content: ''; position: absolute;
  /* inset se mjeri od PADDING boxa, dakle s unutarnje strane ruba. Sredina
     linije je zato na -rub/2, a kvadratić joj se poklopi kad se sloj odmakne
     za pola kvadratića plus pola ruba. S cijelim rubom promašuje za 1px. */
  inset: calc(var(--kvadratic) / -2 - var(--rub) / 2);
  pointer-events: none;
  background-image:
    linear-gradient(var(--okvir-boja), var(--okvir-boja)),
    linear-gradient(var(--okvir-boja), var(--okvir-boja)),
    linear-gradient(var(--okvir-boja), var(--okvir-boja)),
    linear-gradient(var(--okvir-boja), var(--okvir-boja));
  background-size: var(--kvadratic) var(--kvadratic);
  background-repeat: no-repeat;
  background-position: left top, right top, left bottom, right bottom;
}
/* Jezičac je uvučen od lijevog kuta, kao na predlošku — kad sjedi točno na
   kutu, sudara se s kvadratićem koji ondje stoji. */
.okvir__oznaka{
  position: absolute;
  left: clamp(22px, 3vw, 38px); bottom: 100%;
  background: var(--okvir-boja); color: #fff;
  font-family: var(--font-ui); font-weight: 700;
  /* Razmjerno okviru, ne fiksnih 11px: na okviru od 594px takva je oznaka
     izgledala kao slučajna mrvica. Ispuna je u em pa raste s njom. */
  font-size: clamp(0.8125rem, 1.15vw, 1.0625rem);
  letter-spacing: .14em; text-transform: uppercase;
  padding: .42em .85em .36em;
}

/* Sadržaj okvira: stog, ne odlomak. Prije je ovdje stajala jedna rečenica s
   ubačenim velikim brojem i pilulom nasred retka — otud nered: istaknuti
   dijelovi su lomili prored, a poziv na akciju je visio usred rečenice.

   Sada svaki podatak ima svoj red i svoju težinu: broj je glavni potez,
   mail je drugi red, upit je puna traka, a objašnjenje ide na dno sitno.
   Redovi su odvojeni tankim crtama — isti jezik kao okvir oko njih. */
.okvir__stog{ display: grid; }

.okvir__vodi{
  margin: 0 0 .28em;
  font-family: var(--font-ui); font-weight: 700;
  font-size: clamp(.75rem, 1.05vw, .9375rem);
  letter-spacing: .16em; text-transform: uppercase;
  color: var(--muted);
}
/* Broj je najveći element u footeru i namjerno ide preko cijele širine
   okvira: to je jedini podatak zbog kojeg netko ovamo dođe. */
.okvir__broj{
  display: block;
  font-family: var(--font-ui); font-weight: 800;
  /* Donja granica je 1.5rem, ne 1.75: broj ne smije prelamati, a na 375px je
     pri 28px bio 279px širok u sadržajnom prostoru od 267px. */
  font-size: clamp(1.5rem, 4.6vw, 3.125rem);
  letter-spacing: -.03em; line-height: 1;
  color: var(--ink); white-space: nowrap;
  transition: color .18s ease;
}
.okvir__broj:hover{ color: var(--accent); }

.okvir__red{
  display: flex; align-items: baseline; gap: 1em;
  margin-top: clamp(18px, 2.6vh, 30px);
  padding-top: clamp(14px, 2vh, 22px);
  border-top: 1px solid var(--line);
  transition: color .18s ease;
}
.okvir__kljuc{
  font-family: var(--font-ui); font-weight: 700;
  font-size: clamp(.6875rem, .95vw, .8125rem);
  letter-spacing: .16em; text-transform: uppercase;
  color: var(--muted); flex: none;
}
.okvir__vrijednost{
  font-family: var(--font-ui); font-weight: 700;
  font-size: clamp(1.0625rem, 1.9vw, 1.375rem);
  color: var(--ink);
}
.okvir__red:hover .okvir__vrijednost{ color: var(--accent); }

/* Puna traka boje, jedina u okviru — nema dvojbe što je ovdje radnja. */
/* WhatsApp redak: isti slog kao mail, uz znak ispred vrijednosti. Broj je
   isti kao gore, pa se ne ponavlja — stoji poziv na radnju, ne podatak. */
.okvir__red--wa .okvir__vrijednost{ display: inline-flex; align-items: center; gap: .45em; }
.okvir__wa-znak{
  width: 1.05em; height: 1.05em; flex: 0 0 auto;
  color: var(--accent);
}

.okvir__akcija{
  display: flex; align-items: center; justify-content: space-between; gap: 1em;
  margin-top: clamp(16px, 2.2vh, 26px);
  padding: clamp(13px, 1.7vh, 18px) clamp(16px, 1.9vw, 22px);
  background: var(--accent); color: #fff;
  font-family: var(--font-ui); font-weight: 700;
  font-size: clamp(.9375rem, 1.5vw, 1.125rem);
  transition: background .18s ease;
}
.okvir__akcija:hover{ background: #2668e0; }
.okvir__strelica{ width: 1.25em; height: 1.25em; flex: none; transition: translate .18s ease; }
.okvir__akcija:hover .okvir__strelica{ translate: .18em 0; }

.okvir__nota{
  margin: clamp(16px, 2.2vh, 26px) 0 0;
  padding-top: clamp(14px, 2vh, 20px);
  border-top: 1px solid var(--line);
  font-family: var(--font-ui);
  font-size: clamp(.8125rem, 1.05vw, .9375rem);
  line-height: 1.6; color: var(--muted);
  text-wrap: pretty;
}
@media (prefers-reduced-motion: reduce){
  .okvir__strelica{ transition: none; }
}

/* --- lijevo: mapa stranice --- */
/* Vrh mape sjeda na gornji rub okvira: oba stupca dijele isti odmak za jezičac,
   pa im se gornji rubovi poklapaju i footerom prolazi jedna vodoravna linija.
   Centriranje je imalo smisla dok je stupac nosio i ime i mreže; sad je u njemu
   samo popis, pa je od sredine izgledao kao da lebdi. */
.footer__uz{
  align-self: start;
  margin-top: var(--vrh-jezicac);
  display:flex; flex-direction:column;
  gap: clamp(30px, 4.4vh, 48px);
}
.footer__map ul{
  list-style:none; margin:0; padding:0;
  /* Jedan stupac: sedam stavki u dva stupca čita se cik-cak, a uspravan popis
     ide odozgo nadolje i uz kvadratni okvir daje mirniju okomicu. */
  display:grid; grid-template-columns: 1fr;
  gap: clamp(10px, 1.7vh, 18px);
}
.footer__map a{
  font-family: var(--font-ui);
  /* Mjerilo sekcije, ne tijela teksta: na 16,5px popis je nasuprot broju od
     50px izgledao kao fusnota. */
  font-size: clamp(1.0625rem, 1.65vw, 1.5rem); font-weight: 600;
  color: var(--ink-soft);
  transition: color .18s ease;
}
.footer__map a:hover{ color: var(--accent); }

/* Mreže su ispod okvira, poravnate s njegovim desnim rubom. Prije su stajale
   na dnu lijevog stupca, gdje su ostajale sitne i nisu se ni na što vezale.
   Natpis stoji nad znakovima, kao i nad ostalim skupinama u footeru. */
.footer__mreze{
  display: grid; justify-items: center;
  margin-top: clamp(18px, 2.4vh, 28px);
}
.footer__mreze .footer__eyebrow{ margin: 0 0 clamp(10px, 1.4vh, 16px); }

.footer__social{
  --znak: clamp(30px, 2.6vw, 38px);
  display:flex; gap: clamp(16px, 1.8vw, 24px); align-items:center;
}
.footer__social a{ color: var(--ink); }

/* Samo mjerilo: znak je veći, a izgled ostaje izvorni — bez rama, boja tinte,
   plavi hover s podizanjem. */
.footer__social .ikona-veza{ margin: 0; }
.footer__social .ikona{ width: var(--znak); height: var(--znak); }

/* Poveznica je veća od znaka da dodirni cilj bude pristojan; negativna
   margina taj višak poništava u rasporedu. Znak nasljeđuje boju preko
   currentColor iz <symbol> u sprite-u. */
.ikona-veza{
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 44px; min-height: 44px; margin: -11px;
  color: inherit;
  transition: color .2s ease, transform .2s ease;
}
.ikona-veza:hover{ color: var(--accent); transform: translateY(-2px); }
.ikona-veza:focus-visible{ outline: 2px solid var(--accent); outline-offset: 2px; border-radius: 6px; }
.ikona{ display:block; width: clamp(21px, 1.7vw, 26px); height: clamp(21px, 1.7vw, 26px); }

/* --- traka na dnu --- */
.footer__bottom{
  width: 100%; max-width: var(--maxw);
  margin: var(--traka-odmak) auto 0;
  padding-top: clamp(16px, 2.4vh, 22px);
  border-top: 1px solid var(--line);
  display:flex; flex-wrap:wrap; align-items:center;
  justify-content:space-between; gap: 12px 22px;
}
.footer__credit{
  font-family: var(--font-ui); font-size: 0.8125rem;
  color: var(--muted); margin:0;
}
.footer__legal{ display:flex; flex-wrap:wrap; gap: 8px 20px; }
.footer__legal a{
  font-family: var(--font-ui); font-size: 0.8125rem;
  color: var(--muted); transition: color .18s ease;
}
.footer__legal a:hover{ color: var(--accent); }

/* Mreže stoje na sredini pojasa između donjeg ruba okvira i linije nad pravnom
   trakom. Iz toka su izvučene: visinu retka diktira lijevi stupac, pa okvir
   sjeda na njegov vrh — čim bi mreže ušle u tok desnog stupca, produžile bi ga
   i okvir bi se spustio. Apsolutno položene ne ulaze u visinu, pa okvir ostaje
   točno gdje je bio.

   Sam pomak ovisi o visini lijevog stupca, a nju desni stupac iz CSS-a ne može
   doznati — računa ga skripta i upisuje u --mreze-pomak. Bez skripte vrijedi
   zadana vrijednost i mreže stoje odmah ispod okvira. */
@media (min-width: 821px){
  /* Okvir se pomiče ulijevo za otprilike četvrtinu širine skupine mreža.
     Puna polovica — koliko ona viri desno od njega — držala je težište sklopa
     točno gdje je i bilo, ali je okvir odvela predaleko od sredine. Uspravno se diže jer je nad jezičcem zjapilo 131 px, a pod mrežama
     samo 48: skupina je sjedila prenisko u kadru. Podizaj je pravac kroz
     izmjerene ideale (kadar 700px -> 40, 900 -> 55, 1050 -> 72); čisti vh ne
     pristaje jer okvir ima stalnu visinu, a prostor oko njega raste s kadrom.

     Oboje ide kroz translate, ne kroz margine: raspored ostaje netaknut, a s
     okvirom se nose i tri znaka koja ga presijecaju te skupina s mrežama. */
  .footer__desno{
    position: relative;
    translate: calc(-1 * clamp(14px, 1.8vw, 28px)) calc(-1 * clamp(20px, 9.1vh - 24px, 84px));
  }
  /* right:0 stavlja desni rub skupine na desni rub okvira, a pomak za pola
     njene širine premješta ondje njeno središte. Odatle je --mreze-udesno
     odvede na okomicu pravne trake: skupina i pravni linkovi tako dijele
     istu sredinu i footer dobiva jednu okomicu na desnoj strani. Razmak
     između to dvoje ovisi o širini pravnog izbornika i o tome gdje stoji
     desni stupac, pa ga računa ista skripta koja računa i okomiti pomak. */
  .footer__mreze{
    position: absolute; right: 0;
    translate: calc(50% + var(--mreze-udesno, 0px)) 0;
    top: calc(100% + var(--mreze-pomak, clamp(18px, 2.4vh, 28px)));
    margin-top: 0;
  }
}

@media (max-width: 820px){
  /* U jednom stupcu sadržaj lako preraste kadar, a onda okvir ode pod fiksno
     zaglavlje. Razmaci su zato stisnuti taman toliko da cijeli footer stane
     u jedan ekran i na telefonu. */
  /* Odmak od vrha mora nadvisiti fiksno zaglavlje: otkad je okvir prvi, pod
     njim bi se našao njegov jezičac, a "KONTAKT" na plavom bi sjeo preko
     natpisa "Izbornik". Zaglavlje je 90px, ali mu vidljivi sadržaj završava
     na 65 — mjera cilja na to, jer bi puna visina na niskim telefonima
     pojela previše. */
  .footer{ padding-top: clamp(70px, 11.8vh, 104px); }
  .footer__cta{
    grid-template-columns: 1fr;
    gap: clamp(12px, 1.7vh, 20px);
    --vrh-jezicac: clamp(20px, 2.6vh, 28px);
  }

  /* Redoslijed na telefonu: okvir, pa mapa, pa mreže. Mreže moraju ostati u
     desnom stupcu jer ih ondje desktop apsolutno pozicionira; display:contents
     taj stupac na telefonu makne kao kutiju, pa okvir i mreže postanu izravne
     ćelije footera i sve troje se da poredati. Širina koju je stupac davao
     okviru seli na .okvir-mjesto, inače bi se okvir razvukao preko kadra. */
  .footer__desno{ display: contents; }
  .okvir-mjesto{
    order: -2;
    width: 100%; max-width: min(620px, 66svh); margin-inline: auto;
  }
  /* Odmak od okvira je vlastita margina, ne samo razmak mreže: kvadratići u
     donjim kutovima okvira vire ispod njegova ruba, pa je vidljivi razmak uvijek
     manji od zadanog. */
  .footer__uz{ order: -1; margin-top: clamp(16px, 2.6vh, 28px); padding-top: 0; gap: clamp(10px, 1.5vh, 16px); }
  .footer__mreze{ order: 0; margin-top: clamp(6px, 1.2vh, 14px); }

  /* Popis prelazi iz stupaca u centrirani red koji se prelama. Sedam stavki u
     dva stupca davalo je četiri retka i "Galerija" samu na zadnjem; ovako stanu
     u dva retka i sve u footeru — popis, znakovi, pravni linkovi i potpis —
     stoji na istoj okomici. */
  .footer__map ul{
    display: flex; flex-wrap: wrap; justify-content: center;
    gap: clamp(10px, 1.6vh, 16px) clamp(16px, 4.6vw, 26px);
  }
  .footer__map .footer__eyebrow{ text-align: center; }
  /* Uvećana mjerila iz desktopa prelaze jedan ekran na telefonu (izmjereno
     868px na kadru od 812). Ime i razmaci se ondje stišću taman toliko da
     footer opet stane u jedan kadar. */
  .footer__map a{ font-size: clamp(1rem, 4.2vw, 1.125rem); }
  .footer__eyebrow{ margin-bottom: clamp(9px, 1.4vh, 14px); }

  /* Potpis i pravni linkovi: u retku su se na 375px lomili u dva neporavnata
     bloka uz lijevi rub. Uspravno i centrirano drže istu okomicu kao mreže
     iznad; column-reverse stavlja linkove odmah pod znakove, a potpis kao
     najtiši redak ide na sam kraj. */
  .footer__bottom{
    margin-top: clamp(10px, 1.5vh, 16px);
    flex-direction: column-reverse; flex-wrap: nowrap;
    align-items: center; justify-content: center;
    gap: clamp(8px, 1.2vh, 12px);
    text-align: center;
  }
  .footer__legal{ justify-content: center; }

  /* Cijelo objašnjenje ne stane u jedan ekran (mjereno 905px na kadru od 812).
     Ostaje rečenica koja skida trvenje — bez obveze, odgovor isti dan — a
     postupak je ionako opisan na podstranici Kontakt. */
  .okvir__nota-duga{ display: none; }
}
@media (max-width: 520px){
  .okvir{ --kvadratic: 9px; padding: 18px 16px; }
}

@media (max-width: 820px) and (max-height: 740px){
  /* Niski kadrovi — iPhone SE (667) i stariji Android (640). Isti sadržaj,
     zbijeni razmaci. Pismo je ostalo kao na višim kadrovima — otkad je stupac
     s uslugama uklonjen, sadržaj ima dovoljno zraka i bez sitnjenja. Blok ide
     iza upita od 520px da mu padding okvira ne bude pregažen. */
  /* Gornji odmak ovdje NE dira — njega drži pravilo iznad jer mora ostati
     veći od zaglavlja. Stišće se samo ono ispod. */
  .footer{ padding-bottom: clamp(12px, 2vh, 20px); }
  .footer__cta{ --vrh-jezicac: clamp(10px, 1.6vh, 18px); gap: 8px; }
  .footer__uz{ gap: 6px; }
  .footer__eyebrow{ margin-bottom: 4px; }
  /* Uspravni odmak koji zaglavlje traži je u pikselima i ne smanjuje se s
     kadrom, pa se visina mora naći drugdje — ovdje u razmacima popisa. */
  .footer__map ul{ gap: 6px clamp(14px, 4vw, 22px); }
  .okvir{ padding: 12px 14px; }
  /* Traka je ovdje uspravna (linkovi pa potpis), pa joj se stišću i razmak
     iznad crte i onaj između dvaju redaka — inače na 667px kadru footer
     preraste ekran za tocno onoliko koliko gore treba zaglavlju. */
  .footer__bottom{ margin-top: 4px; padding-top: 10px; gap: 6px; }
  /* Mreže su se s lijevog stupca preselile pod okvir, pa sada troše visinu
     umjesto da popunjavaju prazan stupac — na niskom kadru ih zato drži uži
     razmak. */
  .footer__mreze{ margin-top: 4px; }
  .footer__mreze .footer__eyebrow{ margin-bottom: 4px; }
}

/* ===========================================================
   USLUGE — okvir odabira s naizmjenicnim poljima
   Zamijenio vodoravni spil kartica. Ram, kvadratici u kutovima i
   naziv na jezicu preuzeti su iz .okvir u footeru — ista mjera
   (--kvadratic, --rub) i ista boja, da stranica govori jednim jezikom.
   Boje polja su iskljucivo postojeci tokeni; nista novo nije uvedeno.
   =========================================================== */
/* Sekcija izlazi iz .usl (max-width 1200 + 30px pada), inace se 70vw nema o
   sto mjeriti — spremnik daje samo 1140px pa je okvir ostajao na 60vw.
   margin-inline: calc(50% - 50vw) je siguran nacin: siri element na punu
   sirinu kadra bez vodoravnog prelijevanja. */
.usl-mrez{
  /* Racuna se do jezicca "Sto radimo", koji visi iznad gornjeg ruba okvira i
     pojede dio ovog razmaka. Zato je vrijednost veca nego sto izgleda: cilj je
     da praznina IZNAD okvira bude usporediva s onom ISPOD njega, prema FAQ-u. */
  margin-top: clamp(104px, 17vh, 210px);
  width: 100vw;
  margin-inline: calc(50% - 50vw);
}

/* Ram + kvadratici: isti postupak kao .okvir::before — cetiri plohe u
   kutovima jednog apsolutnog sloja, odmaknutog za pola kvadratica plus
   pola ruba da sredina linije padne kroz njihovo srediste. */
/* Scena drzi navigaciju i okvir jedno uz drugo; okvir je centriran na
   stranici, a navigacija stoji lijevo od njega i ostaje prilijepljena. */
/* Sklop je sidren lijevo, ne centriran. Odmak od ruba i razmak do okvira su
   smanjeni pa cijela skupina — i navigacija i okvir — sjeda blize lijevoj
   strani kadra. */
.usl-mrez__scena{
  display: flex; align-items: flex-start;
  justify-content: flex-start;
  gap: 7vw;
  padding-left: 7vw; padding-right: clamp(16px, 3vw, 40px);
}
/* Navigacija nije kartica nego ravnalo nacrtano po papiru.
   Plocu smo maknuli: sve ostalo na ovoj stranici lezi izravno na mrezi, pa
   je lebdeca pilula bila jedini element koji se pravio da je iznad nje.
   Ostale su tri oznake, svaka s jednim poslom:
     · hairline uz lijevi rub sa sitnom podjelom = mjerilo sekcije,
     · plava dionica te crte = dokle je citatelj stigao,
     · cetiri kutna kvadratica oko tekuce stavke = isti znak odabira kojim je
       uokviren i sadrzaj desno, pa se navigacija i okvir citaju kao isti alat.
   Pravilo boje je strogo: tinta je sadrzaj, plava je mjera. Zato broj tekuce
   stavke ostaje crn — pocrni, ne poplavi. */
.usl-nav{
  position: sticky;
  /* pola kadra minus pola vlastite visine — stoji na sredini ekrana.
     Visinu upisuje js (--usl-nav-h) jer ovisi o broju stavki: /usluge ih ima
     sest, /o-nama dvije. Rucno upisana brojka bi jednu od te dvije stranice
     uvijek promasila za pola razlike. */
  top: calc(50vh - var(--usl-nav-h, 400px) / 2);
  flex: 0 0 auto;
  display: flex; flex-direction: column;
  gap: 26px;
  /* Lijeva ispuna je razmak izmedu ravnala i brojeva; crte se crtaju
     pozadinom pa ne trose ni jedan element vise. Ista mjera odmice i crtice
     natrag na ravnalo, pa se sirina rasporeda mijenja na jednom mjestu. */
  --uvlaka: 34px;
  padding: 6px 0 6px var(--uvlaka);
  background:
    /* glavna crta ravnala */
    linear-gradient(var(--line), var(--line)) left top / 1px 100% no-repeat,
    /* sitna podjela: crtica svakih 9px, duga 5px */
    repeating-linear-gradient(to bottom, var(--line) 0 1px, transparent 1px 9px)
      left top / 5px 100% no-repeat;
}
/* Predena dionica ravnala. Visinu i boju postavlja js: --usl-napredak na
   sredinu crtice tekuce stavke, --usl-napredak-boja na boju te usluge.
   Sirina 3px pokriva hairline pa se cita kao podebljani dio iste crte, a ne
   kao druga crta uz nju; 3px je i najmanja mjera na kojoj zuta i narancasta
   jos drze rub na papiru. */
.usl-nav::before{
  content: ''; position: absolute;
  left: 0; top: 0; width: 4px;
  height: var(--usl-napredak, 0px);
  background: var(--usl-napredak-boja, var(--accent));
  transition: height .42s cubic-bezier(.22,.61,.36,1),
              background-color .42s ease;
}
.usl-nav__stavka{
  position: relative;
  display: flex; flex-direction: column; align-items: flex-start;
  gap: 5px;
  /* Sirina po sadrzaju, ne fiksna: znak odabira tako pripije uz stavku kao
     sto se selekcija pripija uz objekt. Kod fiksnih 88px kratka imena
     ("SEO") ostavljala su desnu polovicu okvira praznu. */
  width: fit-content; padding: 2px 0;
  font-family: var(--font-ui);
  color: var(--muted);
  transition: color .2s ease, translate .28s cubic-bezier(.22,.61,.36,1);
}
/* Glavna crtica: izlazi iz ravnala u visini broja i staje 4px prije kutnih
   kvadratica, da se dvije oznake ne dodiruju. */
.usl-nav__stavka::before{
  content: ''; position: absolute;
  left: calc(var(--uvlaka) * -1); top: 11px;
  width: 12px; height: 1px;
  background: var(--ink); opacity: .3;
  transition: width .28s cubic-bezier(.22,.61,.36,1), opacity .2s ease,
              height .2s ease, background-color .2s ease;
}
.usl-nav__br{
  font-weight: 800; font-size: 1.5rem; line-height: 1; letter-spacing: -.04em;
  font-variant-numeric: tabular-nums;
}
.usl-nav__ime{
  font-size: .625rem; letter-spacing: .14em; text-transform: uppercase;
  font-weight: 700; line-height: 1;
}
.usl-nav__stavka:hover{ color: var(--ink-soft); translate: 2px 0; }
.usl-nav__stavka:hover::before{ width: 17px; opacity: .55; }
.usl-nav__stavka.je-tekuca{ color: var(--ink); }
/* Tocno one boje iz kojih su izvedene ispune kartica. Ispuna polja je ta ista
   boja umijesana u papir na 25% — provjereno: 0.25x25 + 0.75xF7 = C2 ~ C0,
   0.25xC0 + 0.75xF7 = E9, 0.25x5A + 0.75xF4 = CD ~ CC, sto je tocno
   #c0e9cc iz .polje--zelena. Ravnalo nosi izvornik, kartica njegovu razrijedenu
   inacicu; ton je isti, jacina razlicita jer plohu i vlas od 4px ne moze
   drzati ista vrijednost.
   Prije su ovdje stajale rucno potamnjene inacice (#16a34a, #c99400...) —
   citale su se dobro, ali su pomicale ton za nekoliko stupnjeva i plava je
   jedina bila tocna. Sada su sve tocne. */
.usl-nav__stavka:nth-of-type(1){ --usl-boja: #2f7bff; }   /* plava */
.usl-nav__stavka:nth-of-type(2){ --usl-boja: #ff2e9a; }   /* roza */
.usl-nav__stavka:nth-of-type(3){ --usl-boja: #25c05a; }   /* zelena */
.usl-nav__stavka:nth-of-type(4){ --usl-boja: #ffcc00; }   /* zuta */
.usl-nav__stavka:nth-of-type(5){ --usl-boja: #ff8a00; }   /* narancasta */
.usl-nav__stavka:nth-of-type(6){ --usl-boja: #ff3b30; }   /* crvena */
.usl-nav__stavka.je-tekuca::before{
  width: 20px; height: 4px; opacity: 1;
  background: var(--usl-boja, var(--accent));
}
/* Znak odabira — cetiri kvadratica u kutovima, isti postupak kao .okvir::before.
   inset je asimetrican jer lijevo mora ostati mjesta glavnoj crtici. */
.usl-nav__stavka.je-tekuca::after{
  content: ''; position: absolute;
  inset: -8px -12px -8px -3px;
  pointer-events: none;
  --k: var(--usl-boja, var(--accent));
  background-image:
    linear-gradient(var(--k), var(--k)),
    linear-gradient(var(--k), var(--k)),
    linear-gradient(var(--k), var(--k)),
    linear-gradient(var(--k), var(--k));
  background-size: 7px 7px;
  background-repeat: no-repeat;
  background-position: left top, right top, left bottom, right bottom;
}
@media (prefers-reduced-motion: reduce){
  .usl-nav::before, .usl-nav__stavka, .usl-nav__stavka::before{ transition: none; }
  .usl-nav__stavka:hover{ translate: none; }
}

.usl-mrez__okvir{
  --okvir-boja: var(--accent);
  --kvadratic: 11px;
  --rub: 2px;
  position: relative;
  /* 65vw uz 10vw+navigacija+8vw s lijeve strane. flex-shrink 0 jer bi ga inace
     redak stisnuo ispod zadane mjere cim navigacija i razmaci porastu. */
  flex: 0 0 auto;
  width: 65vw; max-width: 1180px; min-width: 0;
  margin: 0;
  border: var(--rub) solid var(--okvir-boja);
  padding: clamp(40px, 6vw, 84px) clamp(18px, 3vw, 46px);
  display: flex; flex-direction: column;
  gap: clamp(48px, 8vh, 104px);
}
.usl-mrez__okvir::before{
  content: ''; position: absolute;
  inset: calc(var(--kvadratic) / -2 - var(--rub) / 2);
  pointer-events: none;
  background-image:
    linear-gradient(var(--okvir-boja), var(--okvir-boja)),
    linear-gradient(var(--okvir-boja), var(--okvir-boja)),
    linear-gradient(var(--okvir-boja), var(--okvir-boja)),
    linear-gradient(var(--okvir-boja), var(--okvir-boja));
  background-size: var(--kvadratic) var(--kvadratic);
  background-repeat: no-repeat;
  background-position: left top, right top, left bottom, right bottom;
}
/* Naslov sekcije JEST jezicac. font/margin se resetiraju jer je element h2
   radi strukture dokumenta, a izgledati mora kao oznaka na okviru. */
.usl-mrez__oznaka{
  position: absolute;
  margin: 0; line-height: 1.2;
  left: clamp(22px, 3vw, 38px); bottom: 100%;
  background: var(--okvir-boja); color: #fff;
  font-family: var(--font-ui); font-weight: 700;
  font-size: clamp(0.8125rem, 1.15vw, 1.0625rem);
  letter-spacing: .14em; text-transform: uppercase;
  padding: .42em .85em .36em;
}

/* Blok: polje u jednom stupcu, biljeska u drugom. Parni se zrcale. */
.usl-blok{
  display: grid;
  /* Polje uzima vise od pola retka; biljeska treba samo toliko da stane
     rukopis i strelica. Pola-pola je karticu ostavljalo preuskom naspram
     okvira od 70vw. */
  grid-template-columns: minmax(0, 1.55fr) minmax(0, 1fr);
  align-items: center;
  gap: clamp(16px, 2.4vw, 40px);
}
.usl-blok:nth-of-type(even){ grid-template-columns: minmax(0, 1fr) minmax(0, 1.55fr); }
.usl-blok:nth-of-type(even) .usl-blok__polje{ grid-column: 2; grid-row: 1; }
.usl-blok:nth-of-type(even) .usl-blok__biljeska{ grid-column: 1; grid-row: 1; }

.usl-blok__polje{
  padding: clamp(26px, 3.4vw, 46px) clamp(24px, 3vw, 42px);
  color: var(--ink);
}
.usl-blok__naslov,
.on-blok__naslov{
  font-family: var(--font-ui); font-weight: 800;
  font-size: clamp(1.375rem, 2.6vw, 2.125rem);
  line-height: 1.12; letter-spacing: -.02em;
  margin: 0 0 clamp(12px, 1.6vh, 18px);
}
.usl-blok__tekst{
  font-size: clamp(0.9375rem, 1.15vw, 1.0625rem);
  line-height: 1.62; margin: 0 0 clamp(16px, 2.2vh, 24px);
}
.usl-blok__link{
  font-family: var(--font-ui); font-weight: 700;
  font-size: clamp(0.875rem, 1.05vw, 1rem);
  color: inherit; border-bottom: 2px solid currentColor;
  padding-bottom: 2px; transition: opacity .2s ease;
}
.usl-blok__link:hover{ opacity: .62; }

/* Polja nose iste tonove kao ukrasi na Kontaktu — ondje su puni
   (#2f7bff, #ff2e9a, #25c05a, #ffcc00, #ff8a00, #ff3b30), ovdje umijesani u
   papir na oko 25%. Puna zasicenost radi na sicusnom ukrasu, ali kao ploha
   iza odlomka pada citljivost: tinta na #ffcc00 ili #ff3b30 vise nije tekst
   nego upozorenje. Ovako ton ostaje prepoznatljiv, a kontrast svugdje ostaje
   preko 10:1. Redoslijed izbjegava dva topla susjeda. */
.polje--plava      { background: #cfe0ff; }   /* iz #2f7bff */
.polje--roza       { background: #f9c2dc; }   /* iz #ff2e9a */
.polje--zelena     { background: #c0e9cc; }   /* iz #25c05a */
.polje--zuta       { background: #f9eaab; }   /* iz #ffcc00 */
.polje--narancasta { background: #f9dab5; }   /* iz #ff8a00 */
.polje--crvena     { background: #f9cec9; }   /* iz #ff3b30 */

/* Biljeska: rukopis uz strelicu koja pokazuje na polje. */
.usl-blok__biljeska{
  display: flex; align-items: center; gap: clamp(10px, 1.3vw, 20px);
  margin: 0;
  font-family: var(--font-hand);
  /* Manje od 20px: na 20px se cetiri od sest natuknica lomilo u dva retka, jer
     stupcu nakon strelice ostaje oko 178px. Ovako je u rangu tijela kartice,
     kao na referenci, i stane u jedan redak. */
  font-size: clamp(0.9375rem, 1.1vw, 1rem);
  /* Puna tinta, ne prigusena: biljeska je rukom dopisan komentar, ne fusnota.
     Strelica crta currentColor pa uzima istu boju iz istog mjesta. */
  color: var(--ink);
}
/* Rijeci stoje nakoseno kao da su dopisane u hodu; blagi nagib je dovoljan,
   preko 8 stupnjeva se cita kao greska u prijelomu, ne kao rukopis. */
/* nowrap je jamstvo, ne ukras: prelomljena natuknica prestaje biti natuknica,
   a strelica onda pokazuje na prvi redak umjesto na cjelinu. */
.usl-blok__biljeska > span{ rotate: -5deg; white-space: nowrap; }
.usl-blok:nth-of-type(odd) .usl-blok__biljeska{ flex-direction: row; }
.usl-blok:nth-of-type(even) .usl-blok__biljeska{ flex-direction: row-reverse; }
.usl-blok__strelica{
  flex: 0 0 auto;
  width: clamp(50px, 6vw, 88px); height: auto;
}
/* Strelica pokazuje NA biljesku, ne na karticu — vrh zavrsava kod rijeci koje
   dopisuje. Osnovni crtez gleda udesno, pa se zrcali ondje gdje je biljeska
   lijevo od strelice, dakle u parnim blokovima. */
.usl-blok:nth-of-type(even) .usl-blok__strelica{ scale: -1 1; }

@media (max-width: 1100px){
  /* Ispod ove sirine navigacija i okvir od 60vw vise ne stanu jedno uz drugo
     bez da okvir postane preuzak za dva stupca. */
  .usl-nav{ display: none; }
  .usl-mrez__scena{ justify-content: center; padding-left: clamp(16px, 3vw, 40px); gap: 0; }
  .usl-mrez__okvir{ width: 100%; max-width: 1180px; margin: 0 auto; }
}
@media (max-width: 1040px){
  /* Mjereno prema referenci: ~30px kartica->natuknica, ~50px natuknica->kartica. */
  .usl-mrez__okvir{ gap: clamp(46px, 6.6vh, 68px); }
  /* OBA pravila, ne samo golo .usl-blok: selektor s :nth-of-type specificniji
     je od samog razreda, pa su parni blokovi ostajali u dva stupca i kartica
     im se stiskala na 1fr od 2.55 — tekst je padao na jednu rijec po retku. */
  .usl-blok,
  .usl-blok:nth-of-type(even){ grid-template-columns: minmax(0, 1fr); gap: clamp(30px, 5.2vw, 44px); }
  .usl-blok:nth-of-type(even) .usl-blok__polje,
  .usl-blok:nth-of-type(even) .usl-blok__biljeska{ grid-column: 1; grid-row: auto; }
  /* Smjer se NE dira: neparni blok drzi biljesku uz lijevi rub sa strelicom
     slijeva, parni uz desni sa strelicom zdesna — isto kao na sirokom kadru i
     kao na predlosku. Prije se ovdje sve poravnavalo desno i gasilo zrcaljenje,
     pa je pola strelica pokazivalo od rijeci umjesto na njih. */
  .usl-blok__strelica{ width: clamp(46px, 12vw, 72px); }
}

/* ---- O nama: sadrzaj istog okvira -------------------------------------
   Okvir, ravnalo i tipografija dijele se s /usluge; razlikuje se samo ono
   sto okvir drzi. Ovdje su dvije duge cjeline, ne sest kratkih kartica, pa
   blok nema obojeno polje — tekst i zid logotipa lezu izravno na papir kao
   i sve drugo na stranici. */
/* Mjera retka je u rem, ne u ch: ch se veze uz font ELEMENTA, pa bi naslov
   od 34px na istih 66ch ispao skoro dvostruko siri od odlomka od 18px i dva
   bi bloka stajala na razlicitim osima. */
.on-blok{ min-width: 0; --mjera: 48rem; }
/* Redak je omeden, ali sredinom okvira, ne lijevim rubom. Prigovor na prvu
   verziju bio je da tekst visi uz lijevu stranu — a ne da je uzak; sredina
   rjesava to, a duljinu retka drzi u granicama. Na punoj sirini okvira redak
   je na 1920px isao na 116 znakova, sto je oko dvostruko preko mjere na kojoj
   oko jos pouzdano nalazi pocetak iduceg retka.
   Font se ne mijenja: Kalam je glas stranice i na 65-75 znakova se cita
   dobro. Mijenja se stupanj — rukopisna slova imaju nizu x-visinu od
   sistemskog sansa, pa 16.5px izgleda kao tudjih 15. */
.on-blok__naslov,
.on-blok .bp-content{
  max-width: var(--mjera);
  margin-left: auto; margin-right: auto;
}
.on-blok__naslov{ margin-bottom: clamp(14px, 1.8vh, 20px); }
.on-blok .bp-content{ font-size: 1.125rem; line-height: 1.72; }
/* Koraci procesa: broj je sadrzaj, ne ukras, pa ostaje <ol>. Razmak medu
   stavkama je veci od proreda unutar stavke, inace se pet koraka cita kao
   jedan odlomak s brojevima. */
.on-koraci{
  margin: 0 0 22px; padding: 0 0 0 1.5em;
  display: grid; gap: clamp(10px, 1.4vh, 16px);
}
.on-koraci li{ padding-left: .3em; }
.on-koraci li::marker{ color: var(--muted); font-weight: 800; }
.on-koraci strong{ color: var(--ink); }
.on-blok .bp-content p:last-child{ margin-bottom: 0; }
/* Okvir s prozom trazi veci predah nego onaj s karticama: ondje razmak dijeli
   sest kratkih kartica koje se i bez njega vide kao zasebne, ovdje dvije duge
   cjeline koje bi se inace slile u jedan stupac teksta. */
.usl-mrez__okvir--proza{ gap: clamp(104px, 15vh, 180px); }

.strip { position: relative; z-index: 1; background: var(--paper-2); border-top: 1px solid var(--line); padding: 90px 30px; }
.strip .wrap { max-width: var(--maxw); margin: 0px auto; }
.strip h2 { font-family: var(--font-brush); font-size: clamp(1.875rem, 5vw, 3.5rem); margin-bottom: 34px; }
.pill-row { display: flex; flex-wrap: wrap; gap: 14px; }
.pill { font-family: var(--font-brush); font-size: 1.125rem; padding: 12px 22px; border: 2px solid var(--ink); border-radius: 40px; transition: background 0.2s, color 0.2s; }
.pill:hover { background: var(--ink); color: var(--paper-2); }
.page { position: relative; z-index: 1; padding: 130px 30px 90px; min-height: 100svh; }
.page .wrap { max-width: var(--maxw); margin: 0px auto; }
.page-title { font-family: var(--font-brush); font-size: clamp(3rem, 10vw, 8.125rem); line-height: 0.95; position: relative; display: inline-block; padding: 2px 16px; }
.page-title::before { content: ""; position: absolute; inset: 12% 0px 16%; background: var(--accent-bg); z-index: -1; }
.page-lead { font-family: var(--font-brush); text-transform: uppercase; letter-spacing: 1px; font-size: clamp(0.9375rem, 2vw, 1.25rem); margin-top: 18px; max-width: 640px; color: var(--ink-soft); }
.proj-grid { margin-top: 60px; display: grid; gap: 26px; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); }
.proj-card { background: var(--paper-2); border: 2px solid var(--ink); border-radius: var(--radius); overflow: hidden; transition: transform 0.25s, box-shadow 0.25s; }
.proj-card:hover { transform: translateY(-6px); box-shadow: 8px 8px 0 var(--ink); }
.proj-thumb { aspect-ratio: 16 / 10; background: var(--accent-bg); display: flex; align-items: center; justify-content: center; }
.proj-thumb span { font-family: var(--font-brush); font-size: 2.5rem; color: var(--ink); opacity: 0.4; }
.proj-body { padding: 20px 22px 24px; }
.proj-body h3 { font-family: var(--font-brush); font-size: 1.625rem; margin-bottom: 6px; }
.proj-body p { font-size: 1rem; color: var(--ink-soft); }
.proj-tag { display: inline-block; margin-top: 12px; font-family: var(--font-brush); font-size: 0.8125rem; text-transform: uppercase; letter-spacing: 1px; color: var(--accent); }
/* max-width 82vw, ne --maxw: isti kontejner kao .blog--auto na Projektima i
   O nama. S 1200px je naslov "Usluge" stajao 10px lijevo od naslova
   "Projekti" na svojoj podstranici, a moraju biti na istom mjestu.
   .usl-mrez je punokrvno siroka (100vw) pa je ova promjena ne dira. */
.usl { position: relative; z-index: 1; max-width: 82vw; margin: 0px auto; padding: clamp(96px, 15vh, 150px) 30px 0; }
/* Na uskom kadru 82vw jede 18% sirine, plus 2x30px ispune — na 375px je od
   sadrzaja ostajalo 248px, pa se gumb lomio u dva retka a uvod u pet.
   Projekti ondje koriste punu sirinu s ispunom od 16px (.blog--zid); isto. */
@media (max-width: 860px){
  .usl{ max-width: 100%; padding-left: 16px; padding-right: 16px; }
}

/* Prije je ovdje stajalo `padding-top: 0`, i to je imalo smisla dok je izmedju
   okvira s uslugama i FAQ-a stajala sekcija visoka cijeli kadar — ona je davala
   prazninu, pa je svaka dodatna bila visak. Ta sekcija je obrisana, pa je
   pravilo ostalo bez razloga i FAQ je zalijepio naslov uz donji rub okvira.
   Sada razmak crta sam FAQ, i to velik: okvir iznad je tezak objekt i treba
   zraka da se dvije stvari ne citaju kao jedna.
   FAQ se dijeli s naslovnom stranicom, pa je pravilo vezano na susjedstvo. */
.usl + .faq{ padding-top: clamp(120px, 18vh, 210px); }
/* Puna visina kadra: naslov i uvod sjede centrirani, a sekcija koja slijedi
   pocinje tek nakon pregiba. svh, ne vh — na mobilnom pregledniku vh racuna
   kadar bez trake s adresom, pa sadrzaj ispadne ispod ruba. Minimalna visina
   umjesto fiksne, da se na niskom kadru sekcija smije produljiti umjesto da
   se tekst prelije van. */
.usl-hero {
  /* Puni kadar. --hero-odmak upisuje js: visina zaglavlja i mrvica iznad
     heroa, bez cega bi hero zavrsio tocno toliko ispod pregiba.
     Slog stoji pri vrhu (naslov mora sjesti gdje i "Projekti"), pa praznina
     ispod njega nije propust nego jedino sto preostaje: sadrzaj je ~470px,
     kadar ~900px. Ta praznina je i prije bila namjerna. */
  min-height: calc(100svh - var(--hero-odmak, 130px));
  display: flex; flex-direction: column;
  /* Gornje ispune nema: naslov mora sjesti tocno ondje gdje sjeda "Projekti"
     na svojoj podstranici. Kontejner .usl vec nosi padding-top: var(--vrh),
     isti kao .blog — ovih 36px je bilo jedino sto je naslov spustalo nize. */
  padding-block: 0 clamp(18px, 3.4vh, 38px);
  margin: 0px 0px clamp(70px, 11vh, 130px);
}
/* Dva stupca: slog lijevo, tri mjere desno. Prije je sav sadrzaj stajao u
   lijevih 60% kadra, a desnih 430px bilo je prazno — ne komponirana praznina,
   nego samo margina. */
.usl-hero__vrh {
  /* margin-block: auto centrira ostatak sadrzaja u prostoru koji ostane ispod
     naslova — naslov i mrvice zadrzavaju svoje mjesto pri vrhu kadra. */
  margin-block: auto;
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 19rem);
  gap: clamp(32px, 5vw, 88px);
  /* Poravnato po DNU, ne po vrhu: slog ima masu nisko (uvod, gumbi), pa je
     spec pri vrhu visio sam u kutu. Ovako oba stupca zavrsavaju na istoj
     liniji i praznina iznad njih je zajednicka, a ne rupa desno. */
  align-items: end;
  max-width: 1180px;
}
.usl-hero__slog { max-width: 860px; min-width: 0; }

/* Mjere. Bez plohe i bez okvira — stranica ispod vec nosi jedan veliki okvir,
   a drugi bi ovdje bio ponavljanje. Nose ih samo vlas i tipografija. */
.usl-spec { margin: 0; padding: 0; border-top: 1px solid var(--line); }
.usl-spec__red {
  display: grid; gap: 4px;
  padding: clamp(12px, 1.6vh, 18px) 0;
  border-bottom: 1px solid var(--line);
}
.usl-spec dt {
  font-family: var(--font-ui); font-weight: 700;
  font-size: .625rem; letter-spacing: .2em; text-transform: uppercase;
  color: var(--muted);
}
.usl-spec dd {
  margin: 0;
  font-family: var(--font-ui); font-weight: 800;
  font-size: clamp(.9375rem, 1.15vw, 1.0625rem);
  letter-spacing: -.015em; line-height: 1.3; color: var(--ink);
}

@media (max-width: 900px){
  /* Nema mjesta sa strane: mjere idu ispod sloga, u tri stupca. */
  .usl-hero__vrh { grid-template-columns: minmax(0, 1fr); gap: clamp(26px, 4vh, 40px); }
  .usl-spec { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 0 clamp(14px, 3vw, 28px); }
  .usl-spec__red { border-bottom: 0; }
}
@media (max-width: 520px){
  .usl-spec { grid-template-columns: minmax(0, 1fr); }
  .usl-spec__red { border-bottom: 1px solid var(--line); }
}
/* Naslov preuzima .blog__title (pismo, mjera, nagib -8°) s Projekata; ovdje
   se mijenja samo razmak ispod, jer iza njega dolazi ključni redak, a ne
   odmah popis. Nagnuti blok se mjeri po neokrenutoj kutiji, pa mu donji kut
   viri niže nego što margina sluti — otud veći razmak nego na Projektima. */
/* Margina NIJE ono što se vidi: nagib od -8° spušta lijevi kraj riječi oko
   27px ispod layout kutije, pa toliko pojede razmak ispod. Vrijednost je
   zato podešena po stvarnom razmaku (mjereno getBoundingClientRect), ne po
   broju u kodu — vizualno ovdje ostaje ~45px. */
.usl-hero__naslov { margin: 0 0 clamp(12px, 1.8vh, 22px); }
/* Teški sans, ne kist: kist već nosi riječ "Usluge" iznad, pa bi drugi
   rukopisni redak odmah ispod njega bio ista boja glasa dvaput. Ovako jedno
   pismo daje karakter, drugo težinu. */
.usl-hero__kljuc {
  font-family: var(--font-ui); font-weight: 800;
  font-size: clamp(1.625rem, 3.6vw, 3rem);
  line-height: 1.08; letter-spacing: -.03em;
  color: var(--ink); margin: 0 0 clamp(14px, 1.8vh, 20px);
  text-wrap: balance;
}
/* Marker: gradijent pokriva samo donji dio retka, kao pravi highlighter.
   box-decoration-break drži potez neprekinutim kad se redak prelomi. */
.usl-hero__mark {
  background: linear-gradient(to bottom, transparent 24%, var(--accent-bg) 24%, var(--accent-bg) 92%, transparent 92%);
  -webkit-box-decoration-break: clone; box-decoration-break: clone;
  padding: 0 .08em;
}
.usl-hero__lead { font-size: clamp(1rem, 1.8vw, 1.25rem); line-height: 1.68; color: var(--ink-soft); max-width: 60ch; margin: 0px; }
.usl-hero__akcije { display: flex; flex-wrap: wrap; gap: 12px; margin: clamp(28px, 4vh, 38px) 0px 16px; }
/* Prozirni obrub iste debljine kao na --ghost inacici. Bez njega su gumbi
   jednako visoki samo dok stoje u istom retku (flex ih rasteze na visinu
   najviseg); cim se na uskom kadru prelome jedan pod drugi, svaki se mjeri
   sam i puni gumb ispadne 4px nizi od obrubljenog. */
.usl-hero__btn { font-family: var(--font-brush); font-size: 1rem; padding: 13px 28px; border: 2px solid transparent; border-radius: 32px; background: var(--accent); color: rgb(255, 255, 255); box-shadow: rgba(47, 123, 255, 0.3) 0px 10px 24px; transition: transform 0.22s, background 0.22s, border-color 0.22s; }
.usl-hero__btn:hover { transform: translateY(-3px); background: rgb(38, 104, 224); }
/* Obrub je bio 1px --line (#e4e5df) na papiru #f7f7f4 — kontrast 1.14:1,
   dakle prakticki nevidljiv, pa je gumb uz punu plavu pilulu izgledao kao
   nedovrseni tekst. box-sizing je globalno border-box, pa deblji obrub ne
   mijenja visinu i gumbi ostaju jednaki. */
.usl-hero__btn--ghost { background: transparent; color: var(--ink); border-color: rgba(13,27,42,.28); box-shadow: none; }
.usl-hero__btn--ghost:hover { background: transparent; color: var(--accent); border-color: var(--accent); transform: translateY(-3px); }


.usl-cijene, .usl-faq { margin-top: clamp(80px, 13vh, 150px); }
.usl-cijene__eyebrow { font-family: var(--font-hand); font-weight: 700; font-size: 0.8125rem; text-transform: uppercase; letter-spacing: 0.14em; color: var(--accent); margin: 0px 0px 14px; }
.usl-cijene__title { font-family: var(--font-brush); font-weight: 400; font-size: clamp(1.875rem, 4vw, 3.25rem); line-height: 1.1; color: var(--ink); margin: 0px 0px 16px; }
.usl-cijene__lead { font-size: clamp(0.9375rem, 1.6vw, 1.125rem); line-height: 1.68; color: var(--ink-soft); max-width: 62ch; margin: 0px 0px clamp(34px, 5vh, 48px); }
.usl-cijene__lead a { color: var(--accent); font-weight: 700; }
.usl-cijene__lead a:hover { text-decoration: underline; }
.price-grid { display: grid; gap: clamp(16px, 2.4vw, 26px); grid-template-columns: repeat(3, minmax(0px, 1fr)); align-items: stretch; }
.price-card { position: relative; display: flex; flex-direction: column; gap: 8px; background: var(--paper-2); border: 1px solid var(--line); border-radius: var(--radius); padding: clamp(26px, 3vw, 34px) clamp(22px, 2.6vw, 30px); transition: transform 0.25s, box-shadow 0.25s, border-color 0.2s linear; }
.price-card:hover { transform: translateY(-5px); box-shadow: rgba(13, 27, 42, 0.4) 0px 26px 50px -28px; }
.price-card--istaknuta { border-color: var(--accent); box-shadow: rgba(47, 123, 255, 0.5) 0px 26px 54px -28px; }
.price-znacka { position: absolute; top: -12px; left: clamp(22px, 2.6vw, 30px); font-family: var(--font-hand); font-weight: 700; font-size: 0.75rem; text-transform: uppercase; letter-spacing: 0.08em; background: var(--accent); color: rgb(255, 255, 255); padding: 5px 12px; border-radius: 20px; }
.price-tier { font-family: var(--font-hand); font-weight: 700; font-size: 0.8125rem; text-transform: uppercase; letter-spacing: 0.1em; color: var(--muted); }
.price-amount { font-family: var(--font-brush); font-weight: 400; font-size: clamp(1.625rem, 3vw, 2.25rem); line-height: 1.1; color: var(--ink); }
.price-card p { font-size: 0.90625rem; line-height: 1.6; color: var(--ink-soft); margin: 6px 0px 0px; }
.usl-cijene__fusnota { font-family: var(--font-hand); font-size: 0.90625rem; line-height: 1.65; color: var(--muted); margin: clamp(24px, 3.4vh, 32px) 0px 0px; max-width: 70ch; }
/* ===========================================================
   ZAVRŠNI POZIV NA AKCIJU
   Prije je ovdje stajala puna ploha u --ink preko papira: mreža je pod
   njom nestajala, a pravokutnik se čitao kao tuđi element zalijepljen na
   stranicu. Sada sekcija stoji na papiru kao i sve ostalo, a težinu joj
   daju mjerilo naslova, marker iza ključnih riječi i ručni potezi.
   =========================================================== */
/* Zavrsni poziv drzi cijeli kadar, sa sadrzajem na sredini visine — isto
   pravilo kao hero na vrhu iste podstranice. svh, ne vh: na mobilnom
   pregledniku vh racuna kadar bez trake s adresom, pa bi dno ispalo ispod
   ruba. Gornja margina je maknuta jer polovica praznog kadra iznad naslova
   sada radi isti posao; s njom bi sekcija bila visoka kadar i jos 130px. */


@media (max-width: 620px){
  /* Tri mjere ne stanu u redak; ravnalo ostaje samo nad prvom, pa se crtež
     seli na svaku mjeru zasebno. */
  /* Uz gumbe koji se slažu jedan pod drugi bilješka nema kamo, a strelica bi
     pokazivala u prazno. */
}

/* Gradske veze: mala utility sekcija za interno povezivanje, ne smije se
   natjecati s CTA-om iznad — zato mirna paleta i sitniji naslov. */
/* position/z-index NISU ukras: .bg-fluid je position:fixed i zato slika
   preko svega što je statično. Svaka sekcija na ovoj razini mora se dignuti
   iznad njega (isto rade .usl, .usl-traka, .blog-traka). Dok je ova sekcija
   stajala unutar <main>, dizao ju je .usl; nakon selidbe iznad footera
   ostala je bez toga i platno ju je prekrilo u cijelosti. */
.grad-veze {
  /* Sekcija ne smije premasiti jedan kadar. */
  position: relative; z-index: 1;
  height: 100svh;
  max-width: none; margin: 0 auto;
  padding: var(--vrh) clamp(18px, 4vw, 40px) var(--ispuna-d);
  display: grid; place-items: center;
  --ispuna-d: clamp(24px, 4vh, 48px);
  /* Visina koju karta smije zauzeti: kadar manje zaglavlja, ispune sekcije i
     ispune ploce. Sirina slijedi iz omjera stvarnih kilometara. */
  --ploca-ispuna: clamp(20px, 2.4vw, 40px);
  --karta-v: calc(100svh - var(--vrh) - var(--ispuna-d) - 2 * var(--ploca-ispuna) - 2.4rem);
  --karta: calc(var(--karta-v) * 1.057);
  /* Kutni kvadratici ploce vire izvan nje; sjecenje ide po granici sekcije. */
  overflow-x: clip;
}

/* ---- Ploca ----
   Isti instrument kao okvir uz kartice usluga: puna linija, cetiri kvadratica
   sa sredistem na spoju linija, jezicac s imenom dionice. Drzi i tekst i kartu
   u jednom listu — prije su bila dva odvojena objekta u praznini, pa je desno
   ostajala mrtva margina siroka koliko i sam tekst. */
.grad-ploca{
  --okvir-boja: var(--accent);
  --kvadratic: 11px;
  --rub: 2px;
  position: relative;
  width: min(100%, 82vw);
  border: var(--rub) solid var(--okvir-boja);
  background-color: rgba(13, 27, 42, .05);
  padding: var(--ploca-ispuna);
  display: grid;
  /* Drugi stupac nosi mjeru karte. Sa `auto` je karta imala width u postotku
     stupca cija je sirina ovisila o njoj — kruzna ovisnost, pa se srusila na
     nulu. */
  grid-template-columns: minmax(0, 1fr) var(--karta);
  gap: clamp(24px, 3.4vw, 60px);
  align-items: center;
}
.grad-ploca::before{
  content: ''; position: absolute; pointer-events: none;
  inset: calc(var(--kvadratic) / -2 - var(--rub) / 2);
  background-image:
    linear-gradient(var(--okvir-boja), var(--okvir-boja)),
    linear-gradient(var(--okvir-boja), var(--okvir-boja)),
    linear-gradient(var(--okvir-boja), var(--okvir-boja)),
    linear-gradient(var(--okvir-boja), var(--okvir-boja));
  background-size: var(--kvadratic) var(--kvadratic);
  background-repeat: no-repeat;
  background-position: left top, right top, left bottom, right bottom;
}
/* Jezicac je uvucen od lijevog kuta, da ne sjedne na kvadratic. */
.grad-ploca__oznaka{
  position: absolute;
  left: clamp(22px, 3vw, 38px); bottom: 100%;
  margin: 0; line-height: 1.2;
  background: var(--okvir-boja); color: #fff;
  font-family: var(--font-ui); font-weight: 700;
  font-size: clamp(0.8125rem, 1.15vw, 1.0625rem);
  letter-spacing: .14em; text-transform: uppercase;
  padding: .42em .85em .36em;
}

/* Tekst vise nema vlastiti okvir — ploca ga nosi. Dva okvira jedan u drugom
   citala bi se kao greska, ne kao sklad. */
.grad-veze__uvod{ min-width: 0; text-align: left; }
.grad-veze__title {
  font-family: var(--font-brush); font-weight: 400;
  font-size: clamp(1.375rem, 2.6vw, 2.5rem);
  line-height: 1.1; color: var(--ink); margin: 0 0 clamp(10px, 1.2vw, 16px);
}
.grad-veze__lead {
  font-size: clamp(.875rem, 1.05vw, 1.0625rem); line-height: 1.65;
  color: var(--ink-soft); margin: 0; max-width: 42ch;
}
/* Nota je nuspomena, ne nastavak uvoda — tanka crta to kaze bez ijedne rijeci. */
.grad-veze__nota {
  font-family: var(--font-hand);
  font-size: clamp(.8125rem, .98vw, 1rem); line-height: 1.55;
  color: var(--muted);
  margin: clamp(14px, 1.7vw, 22px) 0 0;
  padding-top: clamp(12px, 1.5vw, 18px);
  border-top: 1px solid var(--line);
  max-width: 42ch;
}

@media (max-width: 1150px){
  /* Pokraj karte vise nema mjesta za citljiv stupac: tekst ide iznad nje. */
  .grad-ploca{
    grid-template-columns: min(100%, var(--karta));
    gap: clamp(18px, 2.4vh, 30px);
    justify-items: center;
  }
  .grad-veze__uvod{ text-align: center; max-width: 52ch; }
  .grad-veze__lead, .grad-veze__nota{ max-width: none; }
  .grad-veze{
    --karta-v: calc(100svh - var(--vrh) - var(--ispuna-d) - 2 * var(--ploca-ispuna) - 13rem);
  }
}

/* Polje u koje su mjesta ucrtana po koordinatama. Omjer je omjer stvarnih
   kilometara (70.0 : 65.9), pa se sjever-jug i istok-zapad ne izobliče kad se
   polje suzi. Karte pod njim nema — mreža papira je dovoljna podloga.
   Sve unutra mjeri se u cqw, dakle u postotku sirine samog polja: karta se
   time smanjuje kao cjelina i ostaje karta i na mobitelu, umjesto da se
   raspadne u popis. */
/* Rub lista. Karta je bila jedini neuokvireni element na ekranu — devet
   krizica na praznom papiru — dok tekst pokraj nje ima puni okvir. Ovo je
   namjerno tisa linija od tog okvira: 1px u boji mreze, bez kvadratica, da
   dva okvira ne konkuriraju. Ujedno daje praznim kutovima znacenje: unutar
   ruba praznina je teritorij, izvan njega je samo neiskoristen prostor. */
.grad-polje {
  container-type: inline-size;
  position: relative;
  flex: 0 1 auto;
  width: 100%;
  aspect-ratio: 1.057;
  --znak: clamp(13px, 2.6cqw, 24px);
  /* Bez vlastitog ruba: ploca oko nje je okvir. Dvostruki rub bi bio suvisan. */
  --rub-lista: clamp(10px, 1.4vw, 18px);
}
.grad-polje__popis { list-style: none; margin: 0; padding: 0; }
/* Stavka je točka bez dimenzije — ishodište. Sve što se vidi visi o njoj, pa
   križić sjedne točno na izračunatu koordinatu bez ijednog ručnog odmaka. */
.grad-polje__popis > li {
  position: absolute;
  left: var(--x); top: var(--y);
  width: 0; height: 0;
  --dy: var(--dy-d, 0px);
}
.grad-tocka {
  position: absolute;
  left: calc(var(--znak) / -2); top: calc(var(--znak) / -2);
  display: flex; align-items: center;
  gap: clamp(5px, 1.1cqw, 10px);
  white-space: nowrap;
}
/* Mjesta uz desni rub nose natpis slijeva, inače bi ispao iz polja. Sidrenje
   se prebacuje na desni rub da križić i dalje stoji na koordinati. */
.grad-tocka--lijevo { flex-direction: row-reverse; left: auto; right: calc(var(--znak) / -2); }
/* Križić: dvije vlasi i puni kvadratić u sjecištu — isti znak kojim su
   označeni kutovi okvira gore na stranici. */
.grad-tocka__znak {
  position: relative; flex: 0 0 auto;
  width: var(--znak); height: var(--znak);
  background:
    linear-gradient(var(--accent), var(--accent)) center / 100% 1px no-repeat,
    linear-gradient(var(--accent), var(--accent)) center / 1px 100% no-repeat;
  transition: scale .22s cubic-bezier(.22, .61, .36, 1);
}
.grad-tocka__znak::after {
  content: ''; position: absolute; inset: calc(var(--znak) * .32);
  background: var(--accent);
  transition: inset .22s cubic-bezier(.22, .61, .36, 1);
}
/* --dy pomiče SAMO natpis kad dva mjesta padnu preblizu; križić ostaje na
   svojoj koordinati, kao na karti gdje se ime grada odmakne od susjednog. */
.grad-tocka__natpis { translate: 0 var(--dy, 0px); }
.grad-tocka__ime {
  display: block;
  font-family: var(--font-ui); font-weight: 800;
  font-size: clamp(0.8125rem, 2.6cqw, 1.3125rem);
  line-height: 1.2; letter-spacing: -.01em; color: var(--ink);
  border-bottom: 2px solid transparent; padding-bottom: 1px;
  transition: border-color .2s ease;
}
.grad-tocka:hover .grad-tocka__ime{ border-bottom-color: var(--accent); }
.grad-tocka:hover .grad-tocka__znak{ scale: 1.15; }
.grad-tocka:focus-visible{ outline: 2px solid var(--accent); outline-offset: 6px; }

/* ---- Oprema karte: sjever i mjerilo ----
   Mjerilo nije priblizno: polje je 70.0 km siroko (izvedeno iz koordinata
   samih mjesta), pa 20 km ispada tocno 28.58% njegove sirine. Sjever i
   mjerilo stoje zajedno u donjem desnom kutu, kako karte i drze opremu. */
.grad-oprema{
  position: absolute; right: var(--rub-lista); bottom: var(--rub-lista);
  display: flex; align-items: flex-end; gap: clamp(16px, 2.4cqw, 28px);
  font-family: var(--font-ui); font-weight: 700;
  font-size: clamp(.5rem, 1.25cqw, .6875rem);
  letter-spacing: .18em; text-transform: uppercase; color: var(--muted);
}
.grad-sjever{
  margin: 0; display: flex; flex-direction: column; align-items: center; gap: 4px;
}
.grad-sjever__strelica{
  width: 1px; height: clamp(14px, 2.4cqw, 22px);
  background: currentColor; position: relative;
}
.grad-sjever__strelica::before{
  content: ''; position: absolute; left: 50%; top: 0;
  width: 6px; height: 6px;
  border-left: 1px solid currentColor; border-top: 1px solid currentColor;
  transform: translateX(-50%) rotate(45deg);
}
.grad-mjerilo{
  margin: 0; display: flex; flex-direction: column; gap: 5px;
  width: 28.58cqw;                 /* 20 km od 70.0 km sirine polja */
}
/* Traka s krajnjim zarezima, kao na nacrtu: crta nosi mjeru, zarezi kazu
   gdje pocinje i gdje zavrsava. */
.grad-mjerilo__crta{
  display: block; height: 5px;
  border-left: 1px solid currentColor;
  border-right: 1px solid currentColor;
  border-bottom: 1px solid currentColor;
}
.grad-mjerilo__mjera{ display: flex; justify-content: space-between; }

/* Ispod ove sirine natpisi vise ne mogu stiskati — clamp im je dosegao donju
   granicu, a polje se i dalje smanjuje, pa se pocinju sudarati. Podnatpis s
   klijentom zato odlazi: karta ostaje karta, sto je i bila poanta, a imena
   tvrtki i dalje stoje na devet gradskih stranica i u uvodu iznad.
   Odmaci natpisa prelaze na uze vrijednosti. */
@media (max-width: 620px){
  .grad-polje__popis > li{ --dy: var(--dy-m, 0px); }
  .grad-tocka__ime{ font-size: clamp(0.75rem, 3.3cqw, 0.9375rem); }
}

.sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; }
@media (max-width: 900px) {
  .price-grid { grid-template-columns: 1fr; }
}
/* O nama je prije stalo u jedan kadar (kartica s dva taba, samo jedan
   vidljiv), pa je stranica bila visoka tocno 100vh. Otkad su studio i
   klijenti oba u okviru, visinu odreduje sadrzaj. */
.blog.blog--fit { height: auto; min-height: 100svh; padding: var(--vrh) 30px clamp(70px, 10vh, 110px); }
.blog--fit .blog__title { margin-bottom: clamp(12px, 2vh, 22px); }

@media (max-width: 700px){
  .blog.blog--fit{ padding-bottom: clamp(40px, 7vh, 72px); }
}
.pit__hint { font-size: 0.875rem; color: var(--muted); margin: 0px 0px 16px; font-family: var(--font-ui); }
.client-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px 28px; }
.client-group h3 { font-family: var(--font-brush); font-size: 0.84375rem; letter-spacing: 0.5px; text-transform: uppercase; color: var(--accent); margin: 0px 0px 4px; }
.client-cta { margin: 16px 0px 0px; padding-top: 12px; border-top: 1px solid var(--line); font-size: 0.875rem; color: var(--ink-soft); }
.client-cta a { color: var(--ink); font-weight: 600; }
.client-cta a:hover { color: var(--accent); }
.client-list { list-style: none; margin: 0px; padding: 0px; }
.client-list li { padding: 2px 0px; font-size: 0.875rem; line-height: 1.45; color: var(--muted); }
.client-list a { color: var(--ink); font-weight: 600; }
.client-list a:hover { color: var(--accent); }
@media (max-width: 640px) {
  .client-grid { grid-template-columns: 1fr; }
}
.tabs { position: relative; z-index: 6; display: flex; justify-content: center; gap: 4px; width: fit-content; margin: 0px auto 10px; padding: 4px; background: rgba(13, 27, 42, 0.07); border-radius: 12px; }
.tab {
  position: relative; z-index: 1;          /* iznad klizača */
  font-family: var(--font-ui); font-size: 0.9375rem; font-weight: 500;
  padding: 8px 18px; border: none; border-radius: 9px;
  background: transparent; color: var(--ink-soft);
  cursor: pointer; white-space: nowrap;
  transition: color .18s;
}
.tab:hover { color: var(--ink); }
.tab[aria-selected="true"] { color: var(--ink); }

/* Bijeli pravokutnik odabira. Prije je bio pozadina samog gumba pa je pri
   promjeni taba naprosto preskočio; sada je zaseban sloj koji klizne, a
   širinu i položaj mu postavlja js/main.js prema aktivnom tabu. */
.tabs__klizac {
  position: absolute; top: 4px; bottom: 4px; left: 0;
  width: 0; border-radius: 9px;
  background: var(--paper-2);
  box-shadow: 0 1px 3px rgba(13, 27, 42, .18);
  transform: translateX(0);
  transition: transform .38s cubic-bezier(.22, 1, .36, 1),
              width .38s cubic-bezier(.22, 1, .36, 1);
  pointer-events: none;
}
/* Prije prvog postavljanja klizač se ne smije vidjeti kako putuje s nule. */
.tabs__klizac:not(.je-postavljen) { transition: none; opacity: 0; }
@media (prefers-reduced-motion: reduce){
  .tabs__klizac { transition: none; }
}
.tab-panel[hidden] { display: none; }
.contact-wrap { margin-top: 56px; display: grid; gap: 40px; grid-template-columns: 1fr 1fr; align-items: start; }
.contact-info a { display: block; font-family: var(--font-brush); font-size: clamp(1.375rem, 3vw, 2.125rem); margin-bottom: 14px; }
.contact-info a:hover { color: var(--accent); }
.contact-form { display: flex; flex-direction: column; gap: 16px; }
.contact-form input, .contact-form textarea { font-family: var(--font-hand); font-size: 1.125rem; padding: 14px 18px; border: 2px solid var(--ink); border-radius: 12px; background: var(--paper-2); }
.contact-form textarea { min-height: 150px; resize: vertical; }
.contact-form button { align-self: flex-start; font-family: var(--font-brush); font-size: 1.125rem; color: rgb(255, 255, 255); background: var(--accent); border: none; padding: 14px 30px; border-radius: 30px; cursor: pointer; box-shadow: rgba(47, 123, 255, 0.35) 0px 8px 20px; transition: transform 0.2s; }
.contact-form button:hover { transform: translateY(-2px); }
::view-transition-group(root) { animation-duration: 1.1s; }
::view-transition-old(root) { animation: 0.85s cubic-bezier(0.4, 0, 0.2, 1) 0s 1 normal both running bp-vt-out; }
::view-transition-new(root) { animation: 1.1s cubic-bezier(0.16, 1, 0.3, 1) 0s 1 normal both running bp-vt-in; }
@keyframes bp-vt-out {
  0% { opacity: 1; transform: scale(1); }
  100% { opacity: 0; transform: scale(0.98); }
}
@keyframes bp-vt-in {
  0% { opacity: 0; transform: scale(1.015); }
  100% { opacity: 1; transform: scale(1); }
}
@media (prefers-reduced-motion: reduce) {
  ::view-transition-group(root), ::view-transition-old(root), ::view-transition-new(root) { animation: none !important; }
}

/* ===========================================================
   GALERIJA — HTML projiciran na 3D scenu (js/galerija.js)
   Sve što se vidi crta WebGL. Tekst živi u .gal-izvor izvan
   ekrana, rasterizira se u teksturu i projicira na model.
   =========================================================== */
.gal-tijelo { overflow: hidden; height: 100vh; }
.gal__platno { position: fixed; inset: 0px; z-index: 0; display: block; width: 100%; height: 100%; background: var(--paper); }
.gal-izvor { position: fixed; top: 0px; left: -200vw; width: 100vw; height: 100vh; pointer-events: none; z-index: -1; }
/* ---- Kompozicija ------------------------------------------------------
   Sedam velikih rijeci u tri skupine (2 + 2 + 3). Svaka je skupina uza od
   kadra i gurnuta na svoju stranu, pa reci unutar nje idu naizmjenicno uz
   lijevi i desni rub — stepenica nastaje iz sirine skupine, ne iz margina.
   Kartica stoji tocno na sredini i namjerno prekriva dio rijeci: taj
   preklop plohi daje dubinu jos prije nego je 3D zakrene.
   ---------------------------------------------------------------------- */
.gal-izvor__stranica{
  /* Sirina kartice je token jer se iz nje racunaju i gornje granice skupina:
     skupina koja lezi iza kartice mora zavrsiti prije njezina lijevog ruba. */
  --kartica: min(46vw, 34vh, 20rem);
  --strana: clamp(16px, 3vw, 40px);
  position: relative; box-sizing: border-box;
  width: 100vw; height: 100vh;
  padding: 0 var(--strana);
  display: flex; flex-direction: column;
  justify-content: center; align-items: center;
  background: transparent; color: var(--ink);
  font-family: var(--font-hand);
}

/* Slog: tri retka, svi na istoj lijevoj osi. Vlas uz njih nije ukras nego
   dokaz — stranica koja tvrdi da mali posao nije razlog za mali dizajn mora
   biti najtocnije posložena stranica na sajtu, i to se mora vidjeti. */
/* Kutni kvadratici po rubu plohe — isti znak odabira kojim su oznaceni okviri
   drugdje na stranici. U 2D drze kompoziciju unutar lista; kad 3D zakrene
   plohu, oni su ono po cemu se vidi gdje list zavrsava. */
.gal-izvor__stranica::before{
  content: ''; position: absolute;
  /* Okomiti odmak je veci od vodoravnog jer u mirovanju ploha stoji ravno pod
     fiksnim zaglavljem (90px) — s jednakim rubom gornja bi dva kvadratica
     zavrsila ispod natpisa Izbornik i gumba Kontakt. */
  inset: clamp(96px, 12vh, 132px) clamp(28px, 3.4vw, 64px);
  pointer-events: none;
  background-image:
    linear-gradient(var(--accent), var(--accent)),
    linear-gradient(var(--accent), var(--accent)),
    linear-gradient(var(--accent), var(--accent)),
    linear-gradient(var(--accent), var(--accent));
  background-size: clamp(10px, 1vw, 16px) clamp(10px, 1vw, 16px);
  background-repeat: no-repeat;
  background-position: left top, right top, left bottom, right bottom;
}
/* Jezicak, isti kao "STO RADIMO" na okviru s uslugama. Poravnat je s vlasi
   sloga, ne s rubom plohe — tako slog i jezicak stoje na istoj osi. */
.gal-oznaka{
  position: absolute;
  top: clamp(112px, 14vh, 156px);
  left: var(--strana);
  margin: 0; line-height: 1.2;
  background: var(--accent); color: #fff;
  font-family: var(--font-ui); font-weight: 700;
  font-size: clamp(.6875rem, 1vw, 1rem);
  letter-spacing: .16em; text-transform: uppercase;
  padding: .45em .9em .38em;
}

.gal-slog{
  width: 100%; max-width: 1120px;
  align-self: flex-start;
  display: flex; flex-direction: column; align-items: flex-start;
  /* Bez razmaka medu retcima: to su tri retka JEDNE recenice, drzi ih prored
     (.92), a ne gap. Prije je ovdje stajao razmak od stotinjak piksela jer su
     to bile tri odvojene skupine razbacanih rijeci. */
  gap: 0;
  border-left: 4px solid var(--accent);
  padding-left: clamp(18px, 2.6vw, 40px);
}
.gal-redak{
  margin: 0;
  font-family: var(--font-brush);
  /* Tri retka umjesto sedam znace da pismo smije biti dvostruko krupnije, a
     mora stati zajedno s karticom u jedan kadar: 3 x 0.92 x F + kartica. */
  font-size: clamp(2rem, min(8.4vw, 12.2vh), 7.5rem);
  line-height: .92;
  white-space: nowrap;
}

/* Kartica: kvadrat u accentu, kao i sve sto na stranici znaci "ovo je Winkla".
   Vise ne stoji na sredini preko rijeci nego u donjem desnom kutu — dubinu
   plohi daje dijagonala izmedu sloga i nje, ne zaklanjanje teksta.
   Visina je ispisana uz sirinu umjesto aspect-ratio jer se ploha rasterizira
   kroz foreignObject, a ondje je racunata visina sigurnija. */
.gal-kartica{
  align-self: flex-end;
  margin-top: clamp(24px, 4.5vh, 56px);
  box-sizing: border-box;
  /* min-height, ne height: tekst kartice je duzi od kvadrata na uskom kadru pa
     je zadnji redak ispadao ispod ruba. Kvadrat ostaje kad stane, a kad ne
     stane kartica naraste umjesto da odsijece recenicu. */
  width: var(--kartica); min-height: var(--kartica);
  padding: clamp(18px, 2.1vw, 32px);
  background: var(--accent); color: var(--paper);
  display: flex; flex-direction: column;
  align-items: flex-start; justify-content: flex-start;
  gap: clamp(12px, 1.5vw, 24px);
}
.gal-kartica__znak{
  font-family: var(--font-brush);
  font-size: clamp(1rem, 1.5vw, 1.5rem);
  line-height: 1;
}
.gal-kartica__udar{
  margin: 0; font-weight: 700;
  font-size: clamp(.875rem, 1.25vw, 1.25rem);
  line-height: 1.3; text-wrap: balance;
}

/* Znak "Okreni." stoji ondje gdje je u izvorniku stajao SCROLL DOWN: dno,
   sredina, izvan toka da ne pomakne slog s okomite sredine kadra. */
.gal-znak{
  position: absolute; bottom: clamp(14px, 3vh, 30px); left: 50%; translate: -50%;
  color: var(--ink); opacity: .5;
  display: flex; flex-direction: column; align-items: center; gap: 5px;
}
.gal-znak__rijec{
  font-family: var(--font-brush);
  font-size: clamp(.8125rem, 1.2vw, 1rem);
  letter-spacing: .02em; line-height: 1;
}
.gal-znak__strelica{ display: block; width: clamp(16px, 1.6vw, 22px); height: auto; }

/* Uski/uspravni kadar. Kartica ovdje lezi tocno preko sredine kompozicije,
   pa je rasporedu jedini izlaz okomiti: razmak je toliki da prva skupina
   stane IZNAD kartice a treca ISPOD nje. Srednja ostaje iza nje i rjesava se
   sirinom. Bez toga kartica proguta tri od sedam rijeci; na sirokom kadru
   dodiruje im samo rubove, kao u izvorniku. */
@media (max-width: 700px), (max-aspect-ratio: 3 / 4) {
  /* 47vw je gornja granica pri kojoj lijevi rub kartice na telefonu jos pada
     desno od "platio." — sire od toga i rijec se cita kao "plati". */
  .gal-izvor__stranica{ --kartica: min(47vw, 15rem); }
  /* Namjerno uze od vlastitog sadrzaja: min-content preuzme kontrolu i okvir
     se stisne uz lijevi rub. Srednja skupina time gubi unutarnju stepenicu,
     ali je jedina koja lezi tocno iza kartice pa je citljivost preca. */
  .gal-redak{ font-size: clamp(1.375rem, min(7.4vw, 7.2vh), 3.25rem); }
  .gal-kartica{ padding: clamp(11px, 2.8vw, 22px); gap: clamp(6px, 1.5vw, 14px); }
  .gal-kartica__znak{ font-size: clamp(.8125rem, 2.7vw, 1.125rem); }
  .gal-kartica__udar{ font-size: clamp(.6875rem, 2.3vw, .9375rem); }
}
/* Kratki kadar (pejzazni telefon). Ovdje ne vrijedi ni jedno ni drugo gore:
   kadar je sirok pa uski raspored ne uskace, a nizak je pa se retci stisnu
   dok kartica ostaje po sirini. Zato se i kartica ovdje veze uz visinu
   kadra, da slogu ostane dovoljno visine za sva tri retka. */
@media (max-height: 560px) {
  .gal-izvor__stranica{ --kartica: min(50vw, 56vh, 20rem); }
  .gal-redak{ font-size: clamp(1.375rem, 9.4vh, 3.5rem); }
  .gal-kartica{ padding: clamp(10px, 2vh, 20px); gap: clamp(6px, 1.4vh, 14px); }
  .gal-kartica__znak{ font-size: clamp(.75rem, 3.4vh, 1.125rem); }
  .gal-kartica__udar{ font-size: clamp(.6875rem, 2.9vh, .9375rem); }
}

/* ===========================================================
   ZID REFERENCI (O nama -> Klijenti)
   Preuzeto iz MDK projekta i prevedeno na svijetlu podlogu: ondje su
   logotipi bile svijetle siluete na tamnom, ovdje su tamne na papiru.
   Linije mreže i "+" na sjecištima crta canvas iz js/main.js — nisu
   rubovi ćelija, nego se pale uz pokazivač.
   =========================================================== */
.refwall{
  display: flex; flex-direction: column;
  gap: clamp(14px, 2.4vh, 24px);
  height: 100%;
}

/* Glava je u retku, ne u stupcu kao u izvorniku: unutar kartice je širina
   dragocjena i tablica je treba svu. */
.refwall__head{
  display: flex; align-items: center; gap: clamp(10px, 1.6vw, 18px);
  font-family: var(--font-ui);
  font-size: clamp(0.6875rem, 0.95vw, 0.8125rem);
  font-weight: 600; letter-spacing: .09em; text-transform: uppercase;
}
.refwall__eyebrow{ color: var(--muted); }
/* Naziv klijenta stoji u istom znaku odabira kojim je uokviren i sadrzaj oko
   njega: ravan rub i cetiri kvadratica u kutovima umjesto zaobljene pilule.
   Kvadratic je 5px jer ploha nije visa od jednog retka; na 6px bi kutovi
   pojeli rub. */
.refwall__ime{
  position: relative;
  color: var(--ink);
  white-space: nowrap;                       /* naziv uvijek u jednom retku */
  border: 1px solid var(--line);
  border-radius: 0;
  padding: .5em .85em;
  transition: opacity .25s ease;
}
.refwall__ime::before{
  content: ''; position: absolute;
  /* inset se mjeri od padding boxa, pa sredina ruba pada na -rub/2; kvadratic
     joj se poklopi na -kvadratic/2 - rub/2 = -3px. */
  inset: -3px;
  pointer-events: none;
  background-image:
    linear-gradient(var(--accent), var(--accent)),
    linear-gradient(var(--accent), var(--accent)),
    linear-gradient(var(--accent), var(--accent)),
    linear-gradient(var(--accent), var(--accent));
  background-size: 5px 5px;
  background-repeat: no-repeat;
  background-position: left top, right top, left bottom, right bottom;
}
.refwall__ime.se-mijenja{ opacity: 0; }

.refwall__tablica{ position: relative; flex: 1 1 auto; min-height: 0; }
/* Platno je za 2px veće od mreže na svaku stranu. Bez toga rubne linije
   padaju točno na granicu platna pa im pola debljine ostane izvan njega —
   desni i donji rub izgledaju odsječeno. Koordinate se u JS-u računaju
   prema pravokutniku platna, pa se sve samo pomakne i ništa ne treba mijenjati. */
.refwall__mreza{
  position: absolute; inset: -2px;
  width: calc(100% + 4px); height: calc(100% + 4px);
  pointer-events: none; z-index: 0;
}
.refwall__popis{
  position: relative; z-index: 1;
  list-style: none; margin: 0; padding: 0;
  /* minmax(0,1fr), ne 1fr: uz min-width:auto široki logotip gura svoj stupac
     šire od kartice, pa cijela mreža preraste platno i zadnji stupac ispadne
     izvan nacrtanih linija. */
  display: grid; grid-template-columns: repeat(5, minmax(0, 1fr));
}
.refcell{
  display: flex; align-items: center; justify-content: center;
  aspect-ratio: 16 / 10;
  /* min-height:0 iz istog razloga kao minmax(0,1fr) na stupcima, samo u drugoj
     osi. Automatski minimum grid ćelije je visina njenog sadržaja, pa je svaka
     ćelija čiji je logotip dosegao svoj strop (48.96 + 2×20 ispune = 88.96)
     narasla preko visine koju traži aspect-ratio (86.75) — a susjede u istom
     retku nisu, jer su njihovi logotipi niži. Otud nejednake kućice i
     dvostruke linije: platno crta svaku ćeliju po njenom stvarnom okviru.
     Ispuna je u postocima, dakle vezana uz samu ćeliju. Prije je bila u vw i
     nije pratila karticu: na 600px kartica je i dalje bila široka, ćelija
     visoka 108px, a logotip stisnut na 26px — četvrtinu visine. */
  min-height: 0;
  padding: 11% 9%;
}
.refcell a{ display: flex; align-items: center; justify-content: center; width: 100%; height: 100%; }
.refcell img{
  max-width: 100%; max-height: 100%;
  width: auto; height: auto; object-fit: contain;
  /* Zid mora izgledati kao jedan potez, a ne kao zbirka tuđih paleta.
     grayscale ujednačuje boje, a multiply gasi bijelu podlogu — četiri naša
     logotipa nemaju prozirnost nego zapečenu pozadinu, pa bi bez toga bili
     puni pravokutnici. Dva logotipa koja su bila bijeli natpis na crnoj ploči
     pretočena su u datoteke s prozirnom pozadinom (*-cist.webp). Lončar je
     ostao na izvorniku — vidi .refcell--obrni. */
  filter: grayscale(1) contrast(1.15);
  mix-blend-mode: multiply;
  opacity: .55;
  transform: scale(1);
  transition: opacity .35s ease, filter .35s ease,
              transform .35s cubic-bezier(.22, 1, .36, 1);
}
/* Dok je pokazivač nad zidom ostali se utišaju, a onaj pod njim oživi u
   svojim izvornim bojama — zato se skida i grayscale i multiply, ne samo
   prozirnost. Bez skidanja multiplyja bijele podloge bi i dalje jele boju. */
/* Lončarov je znak dvotonski: crveno i crno, a monogram postoji samo kao
   granica među njima. Ploča je dio znaka pa ostaje; invert je okrene u
   svijetlu da se uklopi u papir. Na hoveru se filtar skida kao i svima
   drugima, pa se vrati izvorna crveno-crna ploča. */
.refcell--obrni img{ filter: grayscale(1) invert(1) contrast(1.15); }

/* .je-hod / .je-istaknut su dodirna inačica hovera: postavlja ih skripta dok
   isticanje šeta zidom na uređaju bez pokazivača. Stanje je namjerno isto,
   da zid izgleda jednako bez obzira na to vodi li ga miš ili sat. */
.refwall__popis:hover .refcell img,
.refwall__popis.je-hod .refcell img{ opacity: .2; }
.refwall__popis .refcell:hover img,
.refwall__popis .refcell.je-istaknut img{
  filter: none;
  mix-blend-mode: normal;
  opacity: 1;
  /* Raste sam logotip, ne ćelija: canvas crta linije po rubovima ćelija, pa
     bi rastezanje ćelije razmaknulo mrežu. Ispuna ćelije daje dovoljno zraka
     da povećani logotip ne dotakne liniju. */
  transform: scale(1.14);
}
@media (prefers-reduced-motion: reduce){
  .refwall__popis .refcell:hover img,
  .refwall__popis .refcell.je-istaknut img{ transform: none; }
}

@media (max-width: 900px){
  .refwall__popis{ grid-template-columns: repeat(4, minmax(0, 1fr)); }
}
@media (max-width: 620px){
  .refwall__popis{ grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .refwall__head{ font-size: 0.6875rem; }
}

.usl-spil{ margin-top: clamp(40px, 7vh, 90px); }
/* Špil se proteže preko desnog pada kontejnera (.usl ima fiksnih 30px), pa
   kartice izlaze iz kadra umjesto da ih stisne. Namjerno bez 50vw računice —
   ona ovisi o tome kako preglednik mjeri viewport i zna prouzročiti
   vodoravno prelijevanje cijele stranice. */
.ima-js .usl-spil{ margin-right: -30px; }
/* lijevi stupac: naslov, jedna rečenica i gumb — kartice idu desno */
.usl-spil__uvod{ align-self: center; }
.usl-spil__naslov{
  font-family: var(--font-brush); font-weight: 400;
  font-size: clamp(2.5rem, 6vw, 5.5rem);
  line-height: .92; margin: 0 0 clamp(12px, 2vh, 22px);
}
.usl-spil__podnaslov{
  margin: 0 0 clamp(18px, 3vh, 30px);
  font-size: clamp(0.9375rem, 1.3vw, 1.125rem);
  line-height: 1.4; color: var(--ink-soft); max-width: 24ch;
}

/* Staza daje put za skrolanje; visinu joj postavlja JS prema tome koliko
   kartice moraju prijeći. Bez JS-a ostaje bez visine i ništa se ne pribija. */
.usl-spil__ljepilo{ position: relative; }
.ima-js .usl-spil__ljepilo{
  position: sticky; top: 0;
  min-height: 100vh;
  display: grid;
  /* minmax(0,1fr), ne 1fr: 1fr ima minimalnu širinu sadržaja pa bi se
     okvir raširio na cijelu traku i stranica bi dobila vodoravni skrol. */
  grid-template-columns: minmax(220px, 26%) minmax(0, 1fr);
  align-items: center;
  gap: clamp(20px, 3.5vw, 60px);
  padding: clamp(60px, 9vh, 96px) 0 clamp(24px, 5vh, 60px);
  box-sizing: border-box;
}

.usl-spil__okvir{
  position: relative;
  overflow-x: auto; overflow-y: hidden;
  scrollbar-width: none;
  outline-offset: 6px;
}
.usl-spil__okvir::-webkit-scrollbar{ display: none; }
/* Uz JS položaj vodi isključivo transform, pa okvir ne smije biti skrolabilan:
   clip, a ne hidden — hidden preglednik i dalje smije pomaknuti kad skače na
   sidro (/usluge#seo), i taj bi se pomak zbrojio s našim transformom.
   Klasa ima-js dolazi iz <head>, dakle prije nego skok na fragment uopće ide. */
.ima-js .usl-spil__okvir{ overflow: clip; }

.usl-spil__traka{
  display: flex; align-items: stretch;
  gap: clamp(16px, 2vw, 30px);
  padding-bottom: 4px;
  will-change: transform;
}
.usl-spil__okvir.je-ziv .usl-spil__traka{ gap: 0; }

.usl-kartica{
  flex: 0 0 auto;
  box-sizing: border-box;
  width: clamp(268px, 30vw, 400px);
  display: flex; flex-direction: column;
  padding: clamp(20px, 1.9vw, 30px);
  border: 2px solid var(--ink);
  border-radius: clamp(26px, 2.6vw, 44px);
  background: var(--paper-2);
  /* JS piše transform; origin je lijevi rub jer se tamo kartice slažu */
  transform-origin: left 80%;
}
.usl-spil__okvir.je-ziv .usl-kartica{ margin-right: clamp(16px, 2vw, 30px); }
.usl-spil__okvir.je-ziv .usl-kartica:last-child{ margin-right: 0; }

/* Zasićene boje u duhu ikona s Kontakta; tekst ostaje --ink i na svakoj
   od njih ima dovoljan kontrast. */
.usl-kartica:nth-child(6n+1){ background: #9CC7FF; }
.usl-kartica:nth-child(6n+2){ background: #D6C4FF; }
.usl-kartica:nth-child(6n+3){ background: #8FE3BE; }
.usl-kartica:nth-child(6n+4){ background: #FFDE6B; }
.usl-kartica:nth-child(6n+5){ background: #FFB08A; }
.usl-kartica:nth-child(6n+6){ background: var(--paper-2); }

.usl-kartica__naslov{
  font-family: var(--font-brush); font-weight: 400;
  font-size: clamp(1.375rem, 2.1vw, 1.875rem);
  line-height: 1.05; margin: 0 0 clamp(8px, 1.2vh, 14px);
}
.usl-kartica__tekst{
  margin: 0 0 clamp(12px, 1.6vh, 18px);
  font-size: clamp(0.875rem, 1.05vw, 1rem);
  line-height: 1.5; color: var(--ink);
}
.usl-kartica__lista{
  list-style: none; margin: 0 0 clamp(14px, 2vh, 22px); padding: 0;
  display: grid; gap: 7px;
}
.usl-kartica__lista li{
  position: relative; padding-left: 18px;
  font-size: clamp(0.8125rem, 0.95vw, 0.9375rem); line-height: 1.35;
}
.usl-kartica__lista li::before{
  content: "—"; position: absolute; left: 0; color: var(--accent);
}
.usl-kartica__link{
  margin-top: auto;
  font-weight: 700; font-size: clamp(0.8125rem, 1vw, 0.9375rem);
  color: var(--accent);
}
.usl-kartica__link:hover{ text-decoration: underline; }

@media (max-width: 900px){
  /* Na uskim ekranima nema mjesta za dva stupca — uvod ide iznad kartica. */
  .ima-js .usl-spil__ljepilo{
    /* minmax(0,…) i ovdje: goli 1fr se raširi na širinu trake */
    grid-template-columns: minmax(0, 1fr);
    align-content: center;
    gap: clamp(16px, 3vh, 32px);
  }
  .usl-spil__naslov br{ display: none; }
  .usl-spil__podnaslov{ max-width: none; }
}
@media (max-width: 700px){
  /* uža kartica da sljedeća viri i pokaže da ih ima još */
  .usl-kartica{ width: min(76vw, 320px); }
}

/* ===========================================================
   PRIJELAZ IZMEĐU STRANICA
   Šumni dissolve (Ironhill): rub s fbm šumom prelazi preko
   ekrana, pa se stranica raspline umjesto da je pokrije ploha.
   Sve crta jedan WebGL shader u js/main.js.
   =========================================================== */

/* Zastor koji stoji od prvog crtanja nove stranice, da se ne vidi bljesak
   dok platno ne nacrta prvi kadar. Klasu dodaje skripta u <head>. */
.prijelaz-ulaz::after{
  content: ""; position: fixed; inset: 0;
  /* Mora biti ista boja koju crta shader — inače na predaji platnu bljesne. */
  background: var(--prijelaz); z-index: 300; pointer-events: none;
}

canvas.prijelaz{
  position: fixed; inset: 0; z-index: 299;
  width: 100%; height: 100%;
  display: none; pointer-events: none;
}
canvas.prijelaz.je-aktivan{ display: block; }

@media (prefers-reduced-motion: reduce){
  canvas.prijelaz, .prijelaz-ulaz::after{ display: none; }
}

/* ---- Galerija: zastor dok se model ucitava ----
   Stranica povlaci oko 2,7 MB: model 1,1 MB, three.js 719 KB (module + core),
   draco dekoder 245 KB. Do sada je platno stajalo prazno dok sve to ne stigne,
   pa je na mobilnoj vezi nekoliko sekundi izgledalo kao da je stranica pukla.
   Klasa .gal-spremna postojala je u galerija.js od pocetka, ali je nista nije
   koristilo — ovo je njezina druga strana. */
.gal-ucitavanje{
  position: fixed; inset: 0; z-index: 60;
  display: grid; place-content: center; justify-items: center;
  gap: clamp(14px, 2.2vh, 22px);
  background: var(--paper);
  transition: opacity .55s ease, visibility .55s;
}
.gal-spremna .gal-ucitavanje{ opacity: 0; visibility: hidden; }

.gal-ucitavanje__ime{
  margin: 0;
  font-family: var(--font-brush);
  font-weight: 700; font-size: clamp(1.75rem, 6vw, 2.75rem);
  letter-spacing: .01em; color: var(--ink);
}
.gal-ucitavanje__traka{
  width: min(240px, 56vw); height: 2px;
  background: var(--line); overflow: hidden; border-radius: 2px;
}
.gal-ucitavanje__crta{
  display: block; height: 100%; width: 100%;
  background: var(--accent);
  transform: scaleX(var(--p, 0)); transform-origin: left center;
  transition: transform .2s linear;
}
.gal-ucitavanje__nota{
  margin: 0;
  font-family: var(--font-ui); font-weight: 600;
  font-size: .6875rem; letter-spacing: .16em; text-transform: uppercase;
  color: var(--muted);
}
@media (prefers-reduced-motion: reduce){
  .gal-ucitavanje{ transition: none; }
  .gal-ucitavanje__crta{ transition: none; }
}

/* Uski kadar: nema mjesta pokraj karte, pa uvod ide iznad nje. Sekcija i dalje
   staje u jedan kadar jer je karta ondje ionako niska. */
@media (max-width: 1200px){
  /* Ispod ove sirine pokraj centrirane karte vise nema mjesta za citljiv
     stupac — zapadni rub karte dolazi preblizu rubu kadra i okvir bi prekrio
     Krapinu, Sveti Kriz i Zabok. Uvod se zato vraca u tok iznad karte. */
  .grad-veze{
    display: flex; flex-direction: column;
    align-items: center; justify-content: center;
    gap: clamp(16px, 2.4vh, 28px);
  }
  .grad-veze__uvod{
    position: static; translate: none;
    width: min(46ch, 100%);
    text-align: left;
  }
}

@media (max-width: 860px){
  .grad-veze__nota{ border-top: 0; padding-top: 0; margin-top: clamp(12px, 1.8vh, 18px); }
}
