/* ⛔⭐⭐ `hidden` JE ZAKON, ne prijedlog. MA 17.09: „pretraga tačno pogodi, ali
   ne prebaci". Izmjereno: poslije „pljes" kartice ćevapa imaju `hidden`, a i
   dalje se CRTAJU — `.vitrine__raster > .karte { display: grid }` (subgrid)
   ima istu specifičnost kao `.karte[hidden]` i stoji KASNIJE, pa pobjeđuje.
   Isti kvar je čekao svako `[hidden]` pravilo po komponenti. ⇒ jedno pravilo
   za cijelu klasu; kapija (`suche-probe`) sad mjeri PIKSELE, ne atribut. */
[hidden] { display: none !important; }

/* ── Prelaz s vatre na ponudu ────────────────────────────────────────
   ⛔ Ovdje je prije stajao GOL WORDMARK i to je bio najgori šav na stranici:
   gost stigne do žara, pročita „Martini" preko kadra — pa odmah ispod dobije
   „Martini" opet u krupnom. Isto ime dva puta zaredom nije zaglavlje.
   Sad je hijerarhija OBRNUTA: ime je tiha linija, krupno je ŠTA je ovo mjesto.
   ⛔ Ploha je PAPIR, ne nebo. Plan: „nebo se mijenja, papir ne" — u
   srednjetonskoj zoni oko 16h nijedna tinta ne daje 4,5:1 preko neba
   (mjereno 1,06:1), jer je problem pozadina a ne boja slova.               */
.uebergang {
  background: var(--papier);
  color: var(--tinte);
  padding: var(--raum-5) var(--raum-3) var(--raum-4);
  border-bottom: var(--kante);
}
.uebergang__titel { display: grid; gap: 2px; margin: 0 0 var(--raum-3); }
.uebergang__marke {
  font-family: var(--schrift-display);
  font-size: var(--t-text);
  font-variation-settings: 'wght' 700, 'wdth' 90;
  letter-spacing: .02em;
}
.uebergang__sub {
  font-size: var(--t-mini);
  letter-spacing: .1em; text-transform: uppercase;
  color: var(--tinte-leise);
}
/* Krupno je RECENICA, ne ime — to je jedina razlika izmedju prelaza i
   ponovljenog zaglavlja. */
.uebergang__satz {
  margin: 0;
  font-family: var(--schrift-display);
  font-size: clamp(2rem, 9vw, 4.2rem);
  font-variation-settings: 'opsz' 72, 'wght' 620, 'wdth' 90;
  letter-spacing: -0.03em;
  line-height: .98;
}
.uebergang__lead {
  margin: var(--raum-3) 0 0;
  max-width: 34rem;
  color: var(--tinte-leise);
}
.uebergang__weiter { margin: var(--raum-3) 0 0; }
.uebergang__weiter a {
  display: inline-flex; align-items: center; gap: .5em;
  color: var(--akzent-tinte); text-decoration: none;
  font-size: var(--t-klein);
  border-bottom: 1px solid currentColor; padding-bottom: 2px;
}
.uebergang__weiter a::after { content: '\2193'; }

/* ── ⭐⭐ DUBINA STRANICE — papir, a ne bijeli slajd ────────────────────
   Adi 16.09: *„mislio sam OPĆENITO pozadinu stranice… ovaj dio treba da bude
   mnogo bolje, ovako je nekako kao slop."* Zahtjev nije ukras nego TLO:
   cjenovnik je deset ekrana ISTE ravne plohe, a nijedan dobar sajt ne pusti
   oko dalje od dva ekrana bez promjene tla.
   ⛔ Bez ijednog zahtjeva na mrežu: zrno je inline SVG (feTurbulence, ~320 B),
      ne slika. Sajt ostaje na 0 vanjskih zahtjeva.
   ⛔ Kontrast se NE DIRA: zrno 3,5 %, tonski prelaz do 22 % neba koje je i
      dosad bilo u papiru. Tinta na papiru ostaje ~14:1 i a11y kapija to mjeri
      na svih pet stanja dana.
   ⭐ Zrno je `fixed` a tint `scroll`: papir stoji dok sadržaj putuje preko
      njega, pa se stranica čita kao ODŠTAMPANA, ne kao web-gradijent. */
/* ⛔⭐⭐ 17.09 — STRANICA SE NE SMIJE VUĆI USTRANU, NI KAD NEŠTO PROMAŠI.
   MA je s iPhonea vidio ono što sprava ne vidi: slovo izlazi iz ekrana i
   stranica se klati lijevo-desno. Uzrok je popravljen tamo gdje jeste
   (`.orte`, `min-width: 0`), ali ovo je POJAS: jedan promašen element više ne
   može pomjeriti cijelu stranicu.
   ⛔ `clip`, ne `hidden`: `hidden` na korijenu pravi klizni kontekst i ubija
      `position: sticky` (traka čipova, sat). `clip` samo odsijeca.
   ⛔ Samo vodoravno — okomiti skrol mora ostati netaknut.
   ⛔ Kapija `kein-ueberlauf` zbog ovoga mjeri i POJEDINE elemente, ne samo
      širinu dokumenta — inače bi pojas učinio kapiju zelenom u vakuumu. */
html { overflow-x: clip; }

body {
  background-image:
    radial-gradient(130% 55% at 50% 0%,
      color-mix(in oklab, var(--himmel-oben) 22%, transparent),
      transparent 72%),
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Cfilter id='z'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.82' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='180' height='180' filter='url(%23z)' opacity='0.035'/%3E%3C/svg%3E");
  background-repeat: no-repeat, repeat;
  background-attachment: scroll, fixed;
  background-size: 100% 46rem, 180px 180px;
}

/* ⭐ Šav trake i papira. Traka dana je nebo, vitrina je papir — bez prelaza
   je to bio rez. Sad papir „primi" boju neba i pusti je u dva ekrana.
   ⛔ `::before` sjedi IZNAD papira a ISPOD sadržaja (z-index 0 vs čipovi 20),
      pa ne otima nijedan klik. */
.vitrine { position: relative; isolation: isolate; }
/* ⭐ TINTA S PREGIBIMA. MA 16.09: prvo „izguzvan papir, ne bukvalno" na
   svijetlom — cital se i dalje kao bijelo. Grill na tinti mu je bio „super"
   ⇒ „sve tamno kao Grill". Plocica je besavna i izracunata
   (`scripts/papier-bauen.py`, 0 $): topli pregibi ±9 nivoa na tinti.
   ⛔ Skripta PADA ako najtamniji tekst na podlozi (`.gruppe__zahl`) na
      najsvjetlijem 1 % plocice ode ispod 4,5:1. */
.vitrine {
  background-color: var(--tinte);
  background-image: url('/static/bilder/papier-nacht.webp');
  background-size: 512px 512px;
}
/* Poglavlja su providna — tlo je JEDNO, pa se tekstura ne lomi na svakoj
   granici kategorije, a razmak izmedju poglavlja nije svijetla pukotina. */
.vitrine .gruppe--nacht { background: transparent; margin-bottom: 0; }
.vitrine .vitrine__leer { color: color-mix(in oklab, var(--papier) 72%, var(--tinte)); }
.vitrine::before {
  display: none;   /* nebo preko tinte bi je izbijelilo — tlo je sad tinta */
  content: '';
  position: absolute; inset: 0 0 auto 0; height: 18rem;
  z-index: -1;
  background: linear-gradient(to bottom,
    color-mix(in oklab, var(--himmel-unten) 42%, transparent),
    transparent);
  pointer-events: none;
}

/* ── Traka dana ─────────────────────────────────────────────────────── */
.tagesband {
  --band-rand: var(--raum-3);
  background: linear-gradient(170deg, var(--himmel-oben), var(--himmel-unten));
  color: var(--himmel-tinte);
  padding: var(--raum-4) var(--band-rand) var(--raum-4);
  overflow: hidden;
  min-height: 42vh;              /* v1 52vh je gurao vitrinu predaleko dolje */
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  gap: var(--raum-3);
}

/* ⛔ Bez mono. Bez letter-spacing .14em uppercase — to je AI-site tell. */
.tagesband__eyebrow {
  font-size: var(--t-mini);
  font-variation-settings: 'wght' 600;
  margin: 0 0 var(--raum-1);
  opacity: 0.75;
}
[data-modus="vorschau"] .tagesband__eyebrow { color: var(--akzent); opacity: 1; }

/* ⭐ Naslov odsjeka: wdth osa vezana za sat — jutro usko i hladno,
   večer široko i toplo. Osa sa značenjem, ne dekor koji se vidi jednom. */
.tagesband__titel {
  font-family: var(--schrift-display);
  font-size: var(--t-display);
  line-height: 1.02;
  letter-spacing: -0.03em;
  margin: 0;
  font-variation-settings: 'wght' 500, 'wdth' calc(80 + 20 * var(--tag-fortschritt));
}
/* Duga imena odsjeka („Nachmittagsjause") ne smiju izaći iz ekrana.
   ⛔ --zeichen postavlja server (i JS pri prevlačenju) — bez toga bi ovo
   pravilo uvijek računalo s fallbackom i ne bi radilo ništa. */
.tagesband__kopf { container-type: inline-size; }
@container (max-width: 420px) {
  .tagesband__titel { font-size: clamp(2rem, calc(160cqi / var(--zeichen, 10)), 3.4rem); }
}

.tagesband__rest {
  font-size: var(--t-klein);
  margin: var(--raum-1) 0 0;
  opacity: 0.9;
}

/* ⭐⭐ POZORNICA ODSJEKA — traka dobija subjekt.
   Cetiri kadra u istom studiju; prevlacenje ih PRETAPA, pa gost vidi kako
   dan prelazi iz jednog jela u drugo. To je razlika izmedju klizaca i
   instrumenta.
   ⛔ Slika NIKAD ne stoji ispod teksta — vidi obrazlozenje u sablonu. */
.tagesband__buehne {
  position: relative;
  /* ⛔⭐ BILO JE `width: 100%` UNUTAR PADINGA sekcije + `border-radius` ⇒ kadar
     je lebdio kao slicica u okviru, a ne nosio odsjek. Traka je POTPIS ovog
     sajta; njen subjekt mora biti PLOHA. Negativna margina mora tacno pratiti
     pading sekcije — zato je pading sad token `--band-rand`. */
  width: auto;
  margin-inline: calc(var(--band-rand) * -1);
  /* ⛔ Kapa na telefonu: bez nje 3:2 preko pune sirine gurne traku i sat
     ispod ruba ekrana, pa gost ne vidi ono cime upravlja.
     ⭐ 16.09: 32 → 30svh. Preporuka je dodala red ispod teksta, pa se visina
     vraća kadru samo onoliko koliko sat i šina mogu podnijeti. Mjereno na
     390×844: cijela traka staje bez skrola.
     ⛔⭐⭐ BEZ `aspect-ratio` + `max-height`. WebKit (Safari) kroz omjer iz
     visinske kape računa i ŠIRINU: na 390 px kadar je bio 380 (Adi: „fali
     komad sa desne strane"), na 768 px 405. Chromium je rastezao, pa je
     svaka kapija na njemu bila zelena. ⇒ Visina ZADANA (3:2 od širine, kapa
     30svh), širinu drži blok. Kapija: `scripts/rub-do-ruba.mjs`. */
  height: min(calc(100vw * 2 / 3), 30svh);
  overflow: hidden;
  background: color-mix(in oklab, var(--himmel-unten) 72%, var(--himmel-oben));
}
/* ⛔⭐ MA 16.09: „video gore nije dobro centriran, ima praznina izmedju".
   Pading sekcije je ostavljao 32 px neba iznad kadra ⇒ ploha je visila ispod
   stranice iznad. Ispod 900 px kadar dira i GORNJI rub trake (`rub-do-ruba`). */
@media (max-width: 899px) {
  .tagesband__buehne { margin-top: calc(var(--raum-4) * -1); }
}
.tagesband__kader {
  position: absolute; inset: 0;
  width: 100%; height: 100%;
  object-fit: cover;
  opacity: 0;
  transition: opacity 520ms var(--kurve);
}
.tagesband__kader.ist-jetzt { opacity: 1; }
/* ⛔⭐ Zatvoreno pokazuje kadar PRVOG odsjeka, ali pritamnjen: noć mora ostati
   noć. Bez ovoga bi svijetla fotografija doručka na tamnom nebu izgledala kao
   da je pekara otvorena. Obrazloženje stoji u šablonu i u `tagesband.js`. */
.tagesband[data-zu="ja"] .tagesband__kader.ist-jetzt {
  opacity: .82;
  filter: brightness(.58) saturate(.82);
}
@media (prefers-reduced-motion: reduce) {
  .tagesband__kader { transition: none; }
}

/* ⭐⭐ PREPORUKA DOBA DANA — traka kaže ŠTA je dobro sad, ne samo koji je sat.
   ⛔ Tekst i cijena stoje POD fotografijom, nikad preko nje: tekst na slici
      traži mjerenje kontrasta po kadru, a to je već jednom bila zelena kapija
      nad pogrešnim artefaktom.
   ⛔⭐ Adi 16.09: „ovaj dio treba da bude mnogo bolje, ovako je nekako kao
      slop." Tri stvari su to pravile: blok je visio bez ŠAVA prema tekstu,
      slike su bile 4:3 pa je red bio nemiran, i naslov je imao istu težinu kao
      rečenica iznad. ⇒ hairline kao šav, kvadratni kadrovi (isti oblik kao
      kartice u vitrini), naslov u tišem registru. */
.empfehlung {
  margin-top: var(--raum-4);
  padding-top: var(--raum-3);
  border-top: 1px solid color-mix(in oklab, currentColor 20%, transparent);
}
.empfehlung--leer { display: none; }
/* Tiši registar od rečenice iznad: ovo je LABELA, ne druga tvrdnja o satu. */
/* ⛔⭐ 16.09: VERZAL s razmakom (.06em uppercase) je isti AI-tell koji je
   ova traka vec izbacila iz eyebrowa (vidi gore). Rečenica ostaje rečenica. */
.empfehlung__titel {
  font-family: var(--schrift-display);
  font-size: var(--t-klein);
  font-variation-settings: 'opsz' 24, 'wght' 560;
  letter-spacing: -0.01em;
  margin: 0 0 var(--raum-2);
}
.empfehlung__liste {
  list-style: none; margin: 0; padding: 0;
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: var(--raum-2);
}
/* ⛔⭐ 16.09: ime je drzalo mjesto za DVA reda (`min-height`) da cijene stoje
   u istom redu — pa je ispod jednorednog imena zjapila rupa do cijene.
   ⇒ Cijena ide ODMAH ispod slike (uvijek jedan red, pa su sve tri u istoj
     liniji bez rezervisanog prostora), ime ispod nje se lomi slobodno.
   ⛔ DOM red ostaje ime → cijena (citac ekrana); mijenja se samo crtez. */
.empfehlung__link {
  display: grid; grid-template-rows: auto auto auto; row-gap: .3rem;
  color: inherit; text-decoration: none;
}
.empfehlung__link .empfehlung__bild { grid-row: 1; margin-bottom: .15rem; }
.empfehlung__link .empfehlung__preis { grid-row: 2; }
.empfehlung__link .empfehlung__name { grid-row: 3; }
/* ⛔ Kvadrat, ne 4:3 — isti oblik kao kartice u vitrini ispod. Dva različita
   odnosa stranica na istom ekranu su ono što oko čita kao „slop". */
.empfehlung__bild {
  width: 100%; height: auto;
  aspect-ratio: 1 / 1;
  object-fit: cover;
  background: color-mix(in oklab, var(--himmel-unten) 60%, var(--himmel-oben));
}
/* ⛔ CIJENE STOJE U ISTOM REDU — sad zato sto su iznad imena (vidi `.empfehlung__link`). */
.empfehlung__name { font-size: var(--t-mini); line-height: 1.25; }
.empfehlung__preis { font-size: var(--t-mini); }
.empfehlung__link:hover .empfehlung__name { text-decoration: underline; }
.empfehlung__link:focus-visible { outline: 2px solid var(--akzent); outline-offset: 3px; }

/* ⭐⭐ INSTRUMENT DANA — MA 16.09: bez klizaca, bez sata; traka se puni od 6
   do 22. Cetiri DIONICE (sirina = trajanje odsjeka iz baze, `flex-grow`),
   svaka se puni do stvarne minute. Ispod: sat pocetka + ime odsjeka.
   ⭐ Punjenje ide kao JEDAN potez kroz dan: kasnjenje i trajanje svake dionice
      su proporcionalni njenom mjestu u danu (`--puni` ukupno).
   ⛔ Samo `transform: scaleX` — kompozitor, tece i na iOS-u. */
.tagesband__schiene {
  --puni: 1.9s;
  position: relative;
  margin: 0;
}
.tagesband__abschnitte {
  list-style: none; margin: 0; padding: 0;
  display: flex; gap: 3px;
}
.tagesband__streifen {
  --anteil: clamp(0, calc((var(--jetzt-min) - var(--von)) / (var(--bis) - var(--von))), 1);
  flex: calc(var(--bis) - var(--von)) 1 0;
  min-width: 0;
  display: flex; flex-direction: column; gap: .45rem;
}
.tagesband__dionica {
  position: relative; display: block;
  height: 3px; border-radius: 2px;
  background: color-mix(in oklab, currentColor 16%, transparent);
}
.tagesband__dionica i {
  position: absolute; inset: 0; border-radius: inherit;
  background: var(--akzent);
  transform-origin: left center;
  transform: scaleX(0);
  transition: transform
    calc((var(--bis) - var(--von)) / var(--band-spanne) * var(--puni) * var(--anteil)) linear
    calc((var(--von) - var(--band-von)) / var(--band-spanne) * var(--puni));
}
.tagesband.ist-sichtbar .tagesband__dionica i { transform: scaleX(var(--anteil)); }
/* Poslije prvog punjenja minuta se pomjera mirno, bez talasa kroz dan. */
.tagesband.ist-gefuellt .tagesband__dionica i { transition: transform .8s var(--kurve); }

/* „Sada" — tacka na kraju ispune tekuce dionice; dise tek kad dan stigne do nje. */
.tagesband__streifen.ist-jetzt .tagesband__dionica::after {
  content: ''; position: absolute; top: 50%;
  left: calc(var(--anteil) * 100%);
  width: 9px; height: 9px; border-radius: 50%;
  translate: -50% -50%;
  background: var(--akzent);
  opacity: 0; scale: .4;
  transition: opacity .35s var(--kurve), scale .35s var(--kurve), left .8s var(--kurve);
}
.tagesband.ist-sichtbar .tagesband__streifen.ist-jetzt .tagesband__dionica::after {
  opacity: 1; scale: 1;
  transition-delay: calc(var(--puni) * (var(--jetzt-min) - var(--band-von)) / var(--band-spanne));
  animation: tagesband-atem 2.8s ease-out calc(var(--puni) + .4s) infinite;
}
@keyframes tagesband-atem {
  0%   { box-shadow: 0 0 0 0 color-mix(in oklab, var(--akzent) 55%, transparent); }
  70%  { box-shadow: 0 0 0 9px color-mix(in oklab, var(--akzent) 0%, transparent); }
  100% { box-shadow: 0 0 0 9px transparent; }
}
.tagesband__stunde {
  font-family: var(--schrift-mono); font-variant-numeric: tabular-nums;
  font-size: .66rem; line-height: 1; opacity: .55;
}
.tagesband__name {
  font-size: var(--t-mini); line-height: 1.1;
  white-space: nowrap; overflow: hidden; text-overflow: clip;
  opacity: .62;
  transition: opacity var(--takt) var(--kurve);
}
.tagesband__streifen.ist-vorbei .tagesband__name { opacity: .42; }
.tagesband__streifen.ist-jetzt .tagesband__name { opacity: 1; font-variation-settings: 'wght' 650; }
.tagesband__streifen.ist-jetzt .tagesband__stunde { opacity: .9; }
.tagesband__ende {
  position: absolute; right: 0;
  top: calc(3px + .45rem);
  font-family: var(--schrift-mono); font-variant-numeric: tabular-nums;
  font-size: .66rem; line-height: 1; opacity: .55;
}
/* Zatvoreno: dan je prazan (prije 6) ili pun (poslije 22) — bez tacke „sada". */
.tagesband[data-zu="ja"] .tagesband__dionica::after { display: none; }
@media (prefers-reduced-motion: reduce) {
  .tagesband__dionica i { transition: none; }
  .tagesband__streifen.ist-jetzt .tagesband__dionica::after { animation: none; transition: none; }
}
/* ⭐ TELEFON: instrument stoji ODMAH ISPOD FILMA — sav na jednom mjestu:
   kadar odsjeka, pa gdje je dan, pa sta je dobro sad. */
@media (max-width: 899px) {
  .tagesband__buehne { order: 0; }
  .tagesband__schiene { order: 1; }
  .tagesband__kopf { order: 2; }
}

@media (min-width: 900px) {
  .tagesband {
    --band-rand: var(--raum-5);
    padding: var(--raum-6) var(--band-rand) var(--raum-5);
    min-height: 56vh;
    /* ⭐ Dvije kolone: rijec lijevo, kadar desno, staza preko cijele sirine.
       Staza mjeri CIJELI dan pa se ne smije stisnuti u pola table. */
    display: grid;
    grid-template-columns: minmax(0, 1.15fr) minmax(0, 1fr);
    grid-template-areas: "kopf buehne" "schiene schiene";
    align-content: end;
    align-items: end;
    column-gap: var(--raum-5);
  }
  .tagesband__kopf { grid-area: kopf; }
  /* ⛔⭐ Na desktopu je kadar bio VISINOM stegnut (`aspect-ratio` + `max-height`)
     pa je ispao 459 px u koloni od 640 — slicica u praznom polju umjesto plohe.
     ⇒ Visina je zadana, sirina puna, slika pokriva (`object-fit: cover` je vec
     na `<img>`). Bleed ide SAMO desno: lijevo je tekst i mora zadrzati mjeru. */
  .tagesband__buehne {
    grid-area: buehne;
    aspect-ratio: auto;
    /* ⛔⭐ ADI 15.09: „bolje centrirati sliku". Kadar je imao VLASTITU visinu
       (`clamp(12rem, 27svh, 17rem)`) pa je visio u gornjem desnom uglu dok je
       tekst sjedao na dno reda — izmjereno 243 px slike naspram 420 px teksta,
       s ~180 px praznog polja iznad naslova. Sad kadar PRATI visinu tekstualne
       kolone (`stretch`), pa dvije kolone stoje kao dvije jednake plohe.
       ⛔ Ne vraćati fiksnu visinu: ona se razilazi sa svakim redom teksta koji
          se doda (preporuka je upravo to i dodala). */
    align-self: stretch;
    height: auto;
    min-height: 14rem;
    max-height: none;
    margin-inline: 0 calc(var(--band-rand) * -1);
  }
  .tagesband__schiene { grid-area: schiene; margin-top: var(--raum-4); }
  /* ⛔ `min-height: 42vh` je na sirokom ekranu ostavljao prazno polje IZNAD
     teksta (sadrzaj sjeda na dno). Visinu sad daje sadrzaj + pading. */
  .tagesband { min-height: auto; }
  .uebergang { padding: var(--raum-6) var(--raum-5) var(--raum-5); }
}

/* ── Čipovi: tekst-tabovi, ne pilule ────────────────────────────────
   ⛔ Bez backdrop-filter (repaint na 40 redova + tell) i bez 999px pilula. */
.vitrine__chips {
  position: sticky; top: 0; z-index: 20;
  /* ⛔⭐⭐ 16.09: DVA REDA NA TELEFONU. U jednom klizaču su sat i pretraga
     bili „ljepljivi" preko čipova, pa je na 390 px od 18 kategorija bilo
     vidljivo samo presječeno „Kondi". Gost nije vidio da traka uopšte
     postoji. ⇒ gore sat + pretraga, ispod čipovi preko cijele širine. */
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
  grid-template-areas: "uhr suche" "reihe reihe";
  align-items: center;
  gap: var(--raum-1) var(--raum-3);
  padding: var(--raum-2) var(--raum-3) 0;
  background: color-mix(in oklab, var(--papier) 95%, var(--himmel-oben));
  border-bottom: var(--kante);
}
.chips__uhr { grid-area: uhr; }
#vitrine-suche { grid-area: suche; justify-self: end; }
.chips__reihe {
  grid-area: reihe;
  position: relative;   /* `chip.offsetLeft` se mjeri od klizača (vitrine.js) */
  display: flex; align-items: center; gap: var(--raum-3);
  overflow-x: auto;
  scrollbar-width: none;
  overscroll-behavior-x: contain;
  /* Čip na rubu klizača ne smije sjesti u masku. */
  scroll-padding-inline: 3rem;
  padding-bottom: 2px;
}
.chips__reihe::-webkit-scrollbar { display: none; }
@media (min-width: 900px) {
  .vitrine__chips {
    grid-template-columns: auto auto minmax(0, 1fr);
    grid-template-areas: "uhr suche reihe";
    padding: var(--raum-2) var(--raum-3);
    row-gap: 0;
  }
  #vitrine-suche { justify-self: start; }
}
/* ⛔⭐ RUB KOJI KAZE DA IMA JOS. Bez ovoga je zadnji cip bio presjecen rubom
   ekrana i to se citalo kao KVAR, ne kao klizac. Maska se pali tek kad stvarno
   ima prelijeva — `vitrine.js` postavlja `data-rand` na KLIZAČ čipova. */
.chips__reihe[data-rand="rechts"] {
  -webkit-mask-image: linear-gradient(to right, #000 calc(100% - 3rem), transparent);
          mask-image: linear-gradient(to right, #000 calc(100% - 3rem), transparent);
}
.chips__reihe[data-rand="links"] {
  -webkit-mask-image: linear-gradient(to right, transparent, #000 3rem);
          mask-image: linear-gradient(to right, transparent, #000 3rem);
}
.chips__reihe[data-rand="oba"] {
  -webkit-mask-image: linear-gradient(to right, transparent, #000 3rem, #000 calc(100% - 3rem), transparent);
          mask-image: linear-gradient(to right, transparent, #000 3rem, #000 calc(100% - 3rem), transparent);
}

/* Vrijeme preživljava skrol. */
.chips__uhr {
  flex: 0 0 auto;
  font-family: var(--schrift-mono);
  font-variant-numeric: tabular-nums;
  font-size: var(--t-mini);
  color: var(--akzent-tinte);
  font-weight: 600;
}

/* ⛔⭐ ADI 15.09: „izgleda jeftino."
   Ovdje je stajao SISTEMSKI `<input type=search>` — sivi okvir iz pregledaca
   pored Bricolagea i tabularnih cijena. Jedan takav element obori utisak
   cijele trake, jer je jedini piksel na stranici koji nismo mi nacrtali.
   ⇒ Podvucen red, ne kutija. Lupa je inline SVG u `data:` URI — ⛔ i dalje
     NULA vanjskih zahtjeva, sto je prodajni argument ovog sajta. */
#vitrine-suche {
  width: 7.5rem;
  border: 0; border-bottom: 1px solid var(--linie);
  border-radius: 0;
  padding: var(--raum-1) var(--raum-1) var(--raum-1) 1.15rem;
  font: inherit; font-size: var(--t-mini);
  background: transparent no-repeat left center / .8rem;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%235f584e' stroke-width='1.6'%3E%3Ccircle cx='7' cy='7' r='4.6'/%3E%3Cpath d='M10.4 10.4 14 14'/%3E%3C/svg%3E");
  color: var(--tinte);
  transition: width var(--takt) var(--kurve), border-color var(--takt) var(--kurve);
  min-height: 34px;
}
#vitrine-suche::placeholder { color: var(--tinte-leise); }
#vitrine-suche:focus {
  outline: none;
  width: 11rem;
  border-bottom-color: var(--akzent);
}
/* ⛔⭐⭐ iOS ZUMIRA svako polje sa slovima ispod 16 px (MA 17.09: „ekran se
   zumira samo u search"). 12,5 px je bilo dovoljno da Safari uveća stranicu
   pri fokusu i ostavi gosta u uvećanom polju bez hrane u kadru.
   ⛔ `pointer: coarse`, ne širina: iPad u pejzažu je širok, a zumira isto. */
@media (pointer: coarse) {
  #vitrine-suche { font-size: 16px; width: 8.5rem; }
  #vitrine-suche:focus { width: min(100%, 15rem); }
}

/* ── Pogoci pretrage ────────────────────────────────────────────────
   Lista visi ispod ljepljive trake, preko cjenovnika — traka je `sticky`,
   pa je lista uvijek odmah ispod polja u koje gost kuca. */
.suche__treffer {
  position: absolute; left: 0; right: 0; top: 100%;
  margin: 0; padding: var(--raum-1) 0;
  list-style: none;
  max-height: min(24rem, 52svh);
  overflow-y: auto; overscroll-behavior: contain;
  background: var(--papier);
  border-bottom: var(--kante);
  box-shadow: 0 18px 32px -18px color-mix(in oklab, var(--tinte) 45%, transparent);
}
.suche__treffer[hidden] { display: none; }
.suche__treffer a {
  display: grid;
  grid-template-columns: 2.75rem minmax(0, 1fr) auto;
  align-items: center; gap: var(--raum-3);
  min-height: 3.25rem;
  padding: var(--raum-1) var(--raum-3);
  color: var(--tinte); text-decoration: none;
}
.suche__treffer a:hover,
.suche__treffer [aria-selected="true"] a { background: color-mix(in oklab, var(--akzent) 12%, var(--papier)); }
.suche__bild {
  width: 2.75rem; height: 2.75rem; border-radius: 3px;
  object-fit: cover; display: block;
  background: color-mix(in oklab, var(--tinte) 8%, var(--papier));
}
.suche__name { line-height: 1.25; }
.suche__preis { font-size: var(--t-klein); color: var(--tinte-leise); white-space: nowrap; }
@media (min-width: 900px) {
  .suche__treffer { left: auto; right: auto; width: 26rem; margin-left: var(--raum-3); }
}
/* Jelo na koje je pretraga dovela — kratko, pa nestaje. */
.ist-gesucht { animation: gesucht 1.8s var(--kurve) 1; }
@keyframes gesucht {
  0%, 35% { box-shadow: 0 0 0 3px var(--akzent); }
  100%    { box-shadow: 0 0 0 3px transparent; }
}
@media (prefers-reduced-motion: reduce) {
  .ist-gesucht { animation: none; box-shadow: 0 0 0 3px var(--akzent); }
}

/* ⛔ Sistemski „x" u Chromeu je jedini preostali tudji piksel — sklanja se,
   jer pretraga se prazni brisanjem i `Esc`-om kao svako polje. */
#vitrine-suche::-webkit-search-cancel-button { -webkit-appearance: none; }

.chip {
  flex: 0 0 auto;
  font-size: var(--t-mini);
  text-decoration: none; color: var(--tinte-leise);
  padding: var(--raum-1) 0;
  border-bottom: 2px solid transparent;
  white-space: nowrap;
  transition: color var(--takt) var(--kurve), border-color var(--takt) var(--kurve);
}
/* ⛔ META ZA PRST. „Eis" je bio 17 px širok — ispod WCAG 2.2 minimuma (24 px).
   Nevidljivi pading proširi metu, a negativna margina vrati izgled: razmak
   među čipovima (--raum-3) je veći od dva padinga, pa se mete ne preklapaju.
   Kapija: `scripts/pregled.mjs`. */
.chip {
  padding-inline: .55rem; margin-inline: -.55rem;   /* 2 × .55 < razmak 1,15rem */
  min-height: 2.25rem; display: inline-flex; align-items: center;
}
.chip:hover, .chip:focus-visible { color: var(--tinte); }
/* Podvlaka je širine RIJEČI, ne mete: crta se u `content-box`, pa nevidljivi
   pading ispod ne produžava liniju. */
.chip[aria-current="true"] {
  color: var(--tinte);
  background: linear-gradient(var(--akzent), var(--akzent)) no-repeat left bottom / 100% 2px;
  background-origin: content-box; background-clip: content-box;
}

.hinweis {
  margin: 0;
  padding: var(--raum-2) var(--raum-3);
  font-size: var(--t-mini);
  color: var(--tinte-leise);
  border-bottom: var(--kante);
}

/* ── ⭐⭐ OSA VARIJABILNOG FONTA VEZANA ZA SKROL ────────────────────────
   Prva tehnika ove vrste na bilo kom nasem sajtu. Bricolage je varijabilan
   (`wght` 200–800, `wdth` 75–100) i do sada su te ose stajale ZAKUCANE —
   platili smo varijabilni fajl a vozili ga kao obican font.
   Naslov odsjeka se OTVARA dok ulazi u ekran: uzak i lagan dok je na rubu,
   pun i sirok kad sjedne. Oko to cita kao da se stranica sklapa pod prstom.

   ⛔ NULA JavaScripta i nula biblioteka: `animation-timeline: view()` vozi
      brauzer, pa nema ni scroll-slusaca ni `requestAnimationFrame` petlje uz
      40 naslova. Gdje `view()` ne postoji (starije verzije), naslov jednostavno
      stoji na svojoj zavrsnoj vrijednosti — nista se ne kvari.
   ⛔ `prefers-reduced-motion` gasi cijelu stvar.
   ⛔ Interpolacija `font-variation-settings` radi SAMO ako obje strane nabroje
      ISTE ose ISTIM redom. Inace brauzer skoci umjesto da klizi.
   Kapija: `scripts/achse-probe.mjs` — mjeri STVARNU SIRINU iscrtanog naslova
   prije i poslije ulaska. ⛔ Ne `getComputedStyle`: on vrati deklaraciju,
   a ne ono sto je font zaista uradio. [[reference_font_face_tech_variations_kills_src]] */
@keyframes titel-oeffnen {
  from { font-variation-settings: 'wght' 540, 'wdth' 86; }
  to   { font-variation-settings: 'wght' 690, 'wdth' 100; }
}
@supports (animation-timeline: view()) {
  @media (prefers-reduced-motion: no-preference) {
    .gruppe__titel, .handwerk__titel {
      animation: titel-oeffnen linear both;
      animation-timeline: view();
      animation-range: entry 8% cover 30%;
    }
  }
}

/* ── Vitrina ────────────────────────────────────────────────────────── */
/* ⛔ Rub vitrine je TOKEN jer ga noćno poglavlje poništava negativnom
   marginom. Dvije odvojene brojke bi tiho otišle u drift i poglavlje bi
   virilo iz stranice ili ne bi doseglo rub. */
.vitrine { --vitrine-rand: var(--raum-3); padding: var(--raum-4) var(--vitrine-rand) 0; }

/* ── Grupa (kategorija) ─────────────────────────────────────────────────
   Broj + ime + brojac. Broj nije ukras: daje ritam koji obicna mreza nema,
   pa oko zna gdje je u dokumentu duzem od cetiri ekrana.                 */
/* ⛔ Sidro mora sjesti ISPOD ljepljive trake čipova — na telefonu je ona sad
   u dva reda. Vrijedi i za skok iz preporuke na karticu jela. */
:root { --chips-hoehe: 6.5rem; }
@media (min-width: 900px) { :root { --chips-hoehe: 4rem; } }
.gruppe { margin-bottom: var(--raum-5); scroll-margin-top: var(--chips-hoehe); }
.karte, .zeile { scroll-margin-top: calc(var(--chips-hoehe) + var(--raum-2)); }
.gruppe[hidden] { display: none; }

.gruppe__kopf {
  display: flex; align-items: baseline; gap: var(--raum-2);
  padding-bottom: var(--raum-2);
  border-bottom: 2px solid var(--tinte);
  margin-bottom: var(--raum-3);
}
.gruppe__nr {
  font-family: var(--schrift-mono); font-variant-numeric: tabular-nums;
  font-size: var(--t-mini); font-weight: 600;
  color: var(--akzent-tinte); flex: 0 0 auto;
}
.gruppe__titel {                          /* ⛔ nikad centrirano */
  flex: 1 1 auto; text-align: left;
  font-size: var(--t-gross);
  font-variation-settings: 'wght' 680, 'wdth' 88;
}
.gruppe__zahl {
  font-family: var(--schrift-mono); font-size: var(--t-mini);
  color: var(--tinte-leise); flex: 0 0 auto;
}

/* ── ⭐ IZLOG — mreza fotografija, ne odstampan cjenovnik ───────────────
   Kvadrat je nosilac. Cijena sjeda ISPOD slike u mono koloni.
   ⛔ Bez sjenke i bez jakog radiusa: registar je „precizno", ne „app store".
   ⭐ Prva kartica u grupi drzi DVA polja — bez toga je mreza ravna traka
     od 40 identicnih kvadrata, sto je tabela s fotkama, ne izlog.        */
.vitrine__raster {
  list-style: none; margin: 0; padding: 0;
  display: grid; grid-template-columns: repeat(2, 1fr);
  gap: var(--raum-3) var(--raum-2);
}
/* ⛔⭐ ADI 15.09: „izgleda jeftino."
   Kartica je bila GOLA FOTOGRAFIJA na istom papiru kao pozadina, s imenom i
   cijenom ispod. To je default raster svakog buildera — nema plohe, nema ruba,
   nema nicega sto bi reklo da je ovo PREDMET a ne slika u dokumentu.
   ⇒ Kartica dobija svoju plohu i svoj rub, a cijena svoj red ispod linije —
     tacno kao stavka na dobro odstampanom cjenovniku.
   ⛔ I dalje bez sjenke i bez jakog radiusa: registar je „precizno", ne
     „app store". Ploha se razlikuje od papira za 3 %, ne za sjenku. */
/* ⛔⭐ MALE KATEGORIJE NE SMIJU OSTAVLJATI PRAZAN RED.
   Mjereno na /api/vitrine: Menü, Kapsalon, Pommes i Salat imaju po JEDAN
   artikal, Teller dva. U mrezi od cetiri kolone takav red je tri cetvrtine
   prazan papir — pet takvih redova kroz cjenovnik i stranica „izgleda prazno"
   iako je puna. ⇒ Kad ima malo artikala, kartica postaje SIRA, a fotografija
   dobija filmski odnos stranica umjesto kvadrata. Red je pun, bez ijednog
   izmisljenog artikla. ⛔ Veliko polje (`--hervor`) server vise i ne dodjeljuje
   grupama manjim od cetiri — vidi `store_routes.py`. */
.gruppe[data-anzahl="1"] .vitrine__raster { grid-template-columns: 1fr; }
/* ⛔ Na telefonu 16:9, na desktopu 32:9 — bez ovoga je jedan artikal dobijao
   banner visok ~570 px za jelo od 6 €, sto je druga krajnost iste greske. */
.gruppe[data-anzahl="1"] .karte__rahmen { aspect-ratio: 16 / 9; }
@media (min-width: 900px) {
  .gruppe[data-anzahl="1"] .karte__rahmen { aspect-ratio: 32 / 9; }
}
.gruppe[data-anzahl="2"] .karte__rahmen { aspect-ratio: 16 / 10; }
@media (max-width: 619px) {
  .gruppe[data-anzahl="2"] .vitrine__raster { grid-template-columns: 1fr; }
  /* Neparan broj u dvije kolone ostavlja zadnju karticu samu uz pola praznog
     reda. Neka zauzme cijeli red — ista logika kao za male kategorije. */
  /* ⛔⭐⭐ 16.09: NE širi je u 16:9. WebKit (Safari) u `subgrid` redu
     pogrešno dijeli visinu slike koja se proteže preko dvije kolone:
     izmjereno na Pizzi — gornje kartice dobiju 31 px rupe iznad imena, a
     široka kartica ime i cijenu ISPOD slike (nevidljivo). Chromium tačno.
     ⇒ Zadnja neparna kartica ostaje ISTE veličine kao ostale i stoji u
       SREDINI svog reda — isto pravilo kao u najavi. Kapija: `ime-uz-sliku`. */
  /* ⛔⭐⭐ 17.09 FINALNI PREGLED: centrirana kartica sama u redu (Nussplunder,
     Pizza 50 cm, Spaghetti ai Funghi, Vegetarische Suppe, Paprika scharf,
     zadnji sladoled — 6 mjesta) čitala se kao ZABORAVLJENA, s dvije prazne
     tinte pored sebe. ⇒ VODORAVNA PLOČA: slika lijevo tačno širine kartica
     iznad (padding 0 + razmak = razmak mreže), tekst desno, centriran po visini.
     ⛔ BEZ subgrida i bez raspona redova — to je bio WebKit kvar od 16.09
        (široka 16:9 kartica sakrila ime ispod slike). Ploča ima SVOJE redove
        i stoji u svom redu mreže. Kapija `ime-uz-sliku` je sudi kao ploču. */
  .vitrine__raster > .karte:last-child:nth-child(odd) {
    grid-column: 1 / -1; justify-self: stretch;
    grid-row: auto;
    display: grid;
    grid-template-columns: 1fr 1fr;
    grid-template-rows: 1fr auto auto auto 1fr;
    column-gap: var(--raum-2); row-gap: 0;
    padding: 0;
  }
  .vitrine__raster > .karte:last-child:nth-child(odd) .karte__rahmen {
    grid-column: 1; grid-row: 1 / -1;
    margin: 0; aspect-ratio: 1 / 1;
    border-radius: 2px 0 0 2px;
  }
  .vitrine__raster > .karte:last-child:nth-child(odd) > :not(.karte__rahmen) {
    grid-column: 2; margin-inline-end: var(--raum-2);
  }
  .vitrine__raster > .karte:last-child:nth-child(odd) .karte__name  { grid-row: 2; }
  .vitrine__raster > .karte:last-child:nth-child(odd) .karte__kasse { grid-row: 3; }
  .vitrine__raster > .karte:last-child:nth-child(odd) .karte__fuss  { grid-row: 4; }
}
/* ⛔⭐ 17.09: od „sve tamno kao Grill" (16.09) poglavlja stoje jedno uz drugo na
   istoj tinti, a svako i dalje nosi pading SAMOSTALNOG tamnog pojasa (52 gore +
   52 dole). Na telefonu je to 104 px mrtve tinte prije svakog naslova — u
   šetnji stranicom čitalo se kao rupa. Razmak poglavlja nosi linija naslova. */
@media (max-width: 899px) {
  .vitrine .gruppe--nacht { padding-block: var(--raum-4); }
}
@media (min-width: 620px) {
  .gruppe[data-anzahl="2"] .vitrine__raster { grid-template-columns: repeat(2, 1fr); }
}

/* ⛔⭐⭐ 17.09: fotografija ide preko ivice kartice negativnim marginama
   (`.karte__rahmen`). Pri uvećanom tekstu (Safari „Page Zoom", 320 px) taj
   ispust naraste ŠIRE od same kartice i vuče stranicu ustranu — mjereno:
   320 px/20 px = kadar 155 px u koloni od 130 px, dokument 326. Kartica
   od sada drži svoju sliku u sebi; u normalnom stanju se ništa ne mijenja
   (piksel-diff 0), a ispust više ne može pobjeći iz kartice.
   ⛔⭐⭐ NE `hidden`: on od kartice pravi klizni kontekst, a takav element po
      specifikaciji GUBI `subgrid` — WebKit je odmah spustio ime 36 px ispod
      slike na svim širinama ≥768 (uhvatila kapija `ime-uz-sliku`). `clip`
      odsijeca bez kliznog konteksta, pa poravnanje redova ostaje. */
.karte {
  display: flex; flex-direction: column; min-width: 0; overflow: clip;
  background: color-mix(in oklab, var(--papier) 97%, var(--tinte));
  border: var(--kante);
  border-radius: 3px;
  padding: var(--raum-2);
  transition: background var(--takt) var(--kurve), border-color var(--takt) var(--kurve);
}
.karte[hidden] { display: none; }        /* ⛔ hidden gubi od display:flex */

/* ⛔⭐⭐ HORIZONTALNI PRELIJEV NA UŽEM TELEFONU — Adijev „desno je ostavljen
   prostor" (16.09, snimak s telefona). Izmjereno na produkciji: na 320 px
   dokument je 346 px, na 360 px 366 px, na 375+ čisto. Izolacijom (gašenje
   elemenata jedan po jedan) uzrok je `ul.vitrine__raster`: scrollWidth 327
   pri clientWidth 283. Grid-dijete ima `min-width: auto` pa se NE MOŽE
   stisnuti ispod min-content, a njemačke složenice („Putenleberkäsesemmel")
   su duže od trake. Posljedica: cijela stranica se vuče ustranu — i onda
   slika u traci dana ne dođe do desnog ruba. Nije bila kriva slika.
   ⛔ Ne `overflow-wrap: anywhere` (već nam je jednom kolabirao kolone) i ne
      `overflow-x: hidden` na body — to skriva kvar, ne rješava ga.
   ⇒ Traka diktira širinu (`min-width: 0`), a duga riječ se lomi s crticom;
      `lang="de"` je postavljen pa `hyphens: auto` zna njemačka pravila. */
.vitrine__raster > .karte, .zeile { min-width: 0; }
.karte__name, .zeile__name { overflow-wrap: break-word; hyphens: auto; }
@media (hover: hover) {
  .karte:hover {
    background: var(--papier);
    border-color: color-mix(in oklab, var(--tinte) 34%, var(--linie));
  }
}

.karte__rahmen {
  /* Fotografija ide do ruba plohe — kartica je okvir, slika je sadrzaj. */
  margin: calc(var(--raum-2) * -1) calc(var(--raum-2) * -1) var(--raum-2);
  aspect-ratio: 1 / 1;
  overflow: hidden;
  border-radius: 2px 2px 0 0;
  background: color-mix(in oklab, var(--papier) 88%, var(--tinte) 12%);
  position: relative;
}
.karte__bild {
  width: 100%; height: 100%; object-fit: cover; display: block;
  transition: transform 520ms var(--kurve);
}
@media (hover: hover) {
  .karte:hover .karte__bild { transform: scale(1.04); }
}
/* ⭐ LUPA — dodir na fotografiju je otvara, ne nudi „Save".
   ⛔ POSTENO: ovo ne sprecava snimanje slike. Mijenja ZADANU GESTU na
      telefonu (dugi pritisak vise nije jedina stvar koju slika radi), a
      `touch-callout`/`user-select` samo sklanjaju sistemski meni.
   ⛔ Dugme je providno i puni okvir — kartica izgleda isto kao prije. */
.karte__lupe {
  display: block; position: absolute; inset: 0;
  padding: 0; border: 0; background: none;
  cursor: zoom-in;
  -webkit-touch-callout: none;
  -webkit-user-select: none; user-select: none;
}
.karte__lupe:focus-visible {
  outline: 2px solid var(--akzent-tinte);
  outline-offset: -3px;
}
/* ⛔ Mjesto za „+" iz Plana 2 mora ostati IZNAD lupe — dvije mete se ne svadjaju. */
.karte__aktion { z-index: 2; }

.lupe {
  position: fixed; inset: 0; z-index: 90;
  display: grid; place-items: center;
  padding: var(--raum-3);
  background: color-mix(in oklab, #0b0906 88%, transparent);
  -webkit-backdrop-filter: blur(10px); backdrop-filter: blur(10px);
  border: 0;
  opacity: 0; transition: opacity 180ms var(--kurve);
  -webkit-touch-callout: none;
  -webkit-user-select: none; user-select: none;
  cursor: zoom-out;
}
.lupe[open] { opacity: 1; }
/* ⛔⭐⭐ ZATVORENA LUPA MORA NESTATI, ne samo biti providna. `display: grid`
   gore gazi pravilo preglednika `dialog:not([open]) { display: none }` ⇒
   zatvoren <dialog> je stajao kao NEVIDLJIVA traka 37 px po sredini ekrana
   (WebKit: cijela visina, `z-index: 90`) i gutao dodire — tap po sredini
   slike pica, cipa ili dugmeta nije radio nista. Nasla ga kapija klika 16.09. */
.lupe:not([open]) { display: none; }
/* Ulaz i dalje blijedi: pocetno stanje otvaranja je providno. */
@starting-style { .lupe[open] { opacity: 0; } .lupe[open] img { transform: scale(.97); } }
/* ⛔ Safari je crtao plavi okvir oko CIJELOG ekrana lupe (fokus na <dialog>).
   Fokus je na prozoru, ne na kontroli — prsten tu ne kaže ništa. */
.lupe:focus { outline: none; }
.lupe::backdrop { background: transparent; }
.lupe img {
  max-width: min(94vw, 40rem); max-height: 84svh;
  width: auto; height: auto;
  object-fit: contain; display: block;
  border-radius: 3px;
  -webkit-user-drag: none;
  transform: scale(.97); transition: transform 220ms var(--kurve);
}
.lupe[open] img { transform: none; }
.lupe__name {
  position: absolute; left: 0; right: 0; bottom: var(--raum-2);
  text-align: center;
  color: var(--papier);
  font-size: var(--t-klein);
  letter-spacing: .06em;
}
@media (prefers-reduced-motion: reduce) {
  .lupe, .lupe img { transition: none; }
  .lupe img { transform: none; }
}

/* Artikal bez fotke: inicijal na papiru. Mjesto je zauzeto, ne pokvareno. */
.karte__monogramm {
  position: absolute; inset: 0;
  display: grid; place-items: center;
  font-family: var(--schrift-display);
  font-size: clamp(2rem, 9vw, 3.5rem);
  font-variation-settings: 'wght' 300, 'wdth' 80;
  color: color-mix(in oklab, var(--tinte) 22%, transparent);
}

/* ⛔ Bilo je flex + space-between: kad ime prelomi u dva reda, cijena je
   ostajala gore desno i sudarala se s drugim redom. Ime sad drzi svoj red,
   cijena sjeda ISPOD njega — to je i cjenovnicki ispravno citanje. */
/* ⭐ Cijena ima SVOJ red ispod tanke linije. To je jedini potez koji pretvara
   „slika s natpisom" u „stavka cjenovnika" — i radi na svakoj sirini.
   ⛔⭐⭐ 16.09: linija je na BLOKU cijene, ne na svakoj cijeni, i blok više
   nije gurnut na dno (`margin-top: auto`) — vidi `subgrid` ispod. */
.karte__kasse {
  display: flex; flex-direction: column; gap: 2px;
  margin-top: var(--raum-1);
  padding-top: var(--raum-1);
  border-top: var(--kante);
}
/* ⛔⭐⭐ ADI 16.09: „gdje ima ne organizacije." Izmjereno na snimku cijele
   stranice: imena u istom redu na različitim visinama (Pljeskavica niže od
   Gefüllte Pljeskavica, Bohnensuppe niže od Rindsgulasch), a linija cijene
   skače od kartice do kartice. ⇒ Kartica dijeli REDOVE mreže sa susjedima:
   slika · ime · cijena · podnožje. Najviše ime u redu određuje visinu reda
   imena za sve, pa ime počinje odmah ispod slike, a linija cijene je ravna
   kroz cijeli red. Stari pregledači (bez subgrid) padaju na flex kolonu —
   isti sadržaj, samo neporavnat. */
@supports (grid-template-rows: subgrid) {
  .vitrine__raster > .karte {
    display: grid;
    grid-row: span 4;
    grid-template-rows: subgrid;
    row-gap: 0;
    align-content: start;
  }
  .karte__fuss { align-self: start; }
}
.karte__name {
  font-size: var(--t-text);
  font-variation-settings: 'wght' 450;
  letter-spacing: -0.01em;
  min-width: 0;
}
.karte[data-jetzt="ja"] .karte__name { font-variation-settings: 'wght' 700; }
/* ⛔⭐ PROBANO I ODBACENO ISTOG KRUGA: topla PLOHA za „sada".
   Izmjereno na API-ju: u podne je 24/34 artikla „jetzt" (70 %), popodne 67 %,
   a u 07:00 nijedan (dorucak je u najavljenoj pekari). Oznaka koja pokriva dvije
   trecine mreze ne oznacava nista — samo obojí cijelu stranicu — a ujutro se
   ugasi bas kad bi gostu najvise znacila. Ostaje TIHA oznaka: tackica uz ime,
   podebljano ime i rub. Ploha se ne dira. */
.karte[data-jetzt="ja"] {
  border-color: color-mix(in oklab, var(--akzent) 26%, var(--linie));
}
.karte[data-jetzt="ja"] .karte__name::before {
  content: ''; display: inline-block;
  width: .4em; height: .4em; margin-right: .45em;
  border-radius: 50%; background: var(--akzent);
  vertical-align: .08em;
}
.karte__preis { font-size: var(--t-preis); flex: 0 0 auto; }

.karte__text {
  margin: var(--raum-1) 0 0; font-size: var(--t-klein); color: var(--tinte-leise);
}
.karte__varianten { list-style: none; margin: var(--raum-1) 0 0; padding: 0; }
.karte__varianten li {
  display: flex; justify-content: space-between; align-items: baseline; gap: var(--raum-2);
  font-size: var(--t-klein); color: var(--tinte-leise);
  padding-top: 2px;
}
/* ⛔ Cijena je JEDAN znak za oko: „0,50" i „€" se nikad ne razdvajaju u dva reda. */
.preis { white-space: nowrap; }
.karte__allergene {
  margin: var(--raum-1) 0 0; font-size: var(--t-mini); color: var(--tinte-leise);
}

/* ── ⭐ NAJAVA — poglavlje na tinti, ne kutija s isprekidanom linijom ────
   ⛔⭐ ADI 15.09: „i dalje izgleda prazno i jeftino."
   Izmjereno na zivom sajtu: tri najavljene kategorije su stajale kao TRI
   odvojene kutije `border: 1px dashed` PRIJE ijedne cijene. Isprekidana
   linija je jezik wireframea — gost cita „nedovrseno", ne „stize".
   Uz to je stranica bila 16 ekrana ISTE bijele podloge: nijedno poglavlje,
   nigdje da oko stane. To je bilo ono „prazno".
   ⇒ Jedan tamni pojas pune sirine rjesava oboje: rupa u podacima postaje
     namjeran odlomak, a bijeli svitak dobija prvi kontrast.
   ⛔ I dalje nijedna cijena. Iskrena nota stoji JEDNOM, na dnu.            */
.najava {
  background: var(--tinte);
  color: color-mix(in oklab, var(--papier) 92%, var(--tinte));
  padding: var(--raum-5) var(--raum-3);
  /* ⛔ Akcent kao TEKST na tinti je predtaman (isti kvar kao `--akzent-tinte`
     na papiru, samo obrnut). Ovo je njegova svijetla varijanta — ista toplina,
     kontrast mjeren a11y kapijom kroz svih pet paleta. */
  --akzent-hell: color-mix(in oklab, var(--akzent) 45%, var(--papier));
}
.najava__kopf {
  display: flex; align-items: baseline; gap: var(--raum-2);
  padding-bottom: var(--raum-2);
  border-bottom: 2px solid color-mix(in oklab, var(--papier) 30%, var(--tinte));
  margin-bottom: var(--raum-3);
}
.najava__kopf .gruppe__nr   { color: var(--akzent-hell); }
.najava__kopf .gruppe__zahl { color: color-mix(in oklab, var(--papier) 58%, var(--tinte)); }
.najava__kopf .gruppe__titel { color: var(--papier); }

.najava__lead {
  margin: 0 0 var(--raum-4);
  max-width: 38ch;
  color: color-mix(in oklab, var(--papier) 82%, var(--tinte));
}
.najava__teil { margin-bottom: var(--raum-4); scroll-margin-top: var(--chips-hoehe); }
.najava__name {
  margin: 0 0 var(--raum-2);
  font-family: var(--schrift-display);
  font-size: var(--t-text);
  font-variation-settings: 'wght' 600, 'wdth' 92;
  letter-spacing: .1em; text-transform: uppercase;
  color: var(--akzent-hell);
}

/* ⛔⭐ KVAR KOJI JE SNIMAK NASAO, NE OKO: `repeat(auto-fit, minmax(6.5rem,1fr))`
   sa JEDNIM djetetom razvuce kolonu na PUNU sirinu ⇒ Getranke su na desktopu
   davali bocu visoku 900 px preko cijelog ekrana. Kategorija s jednim
   primjerom mora izgledati isto kao ona s pet.
   ⇒ Polje ima FIKSNU sirinu i red se pomjera, pa broj primjera vise ne moze
     promijeniti velicinu nijedne slike. Cuvar: `scripts/raster-probe.mjs`.  */
/* ⛔⭐⭐ BEZ VODORAVNOG SKROLA. Na telefonu je treća pločica stajala
   presječena desnim rubom — Adi je to čitao kao „fali komad", ne kao „ima
   još". ⇒ Pločice se PRELAMAJU u redove, sve iste širine, a zadnja neparna
   stoji u sredini reda, ne uz lijevi rub s pola praznog reda. */
.najava__vitrine {
  width: 100%; height: auto; aspect-ratio: 1/1; object-fit: cover;
  display: block; border-radius: 3px;
  -webkit-user-drag: none;
}
.najava__streifen {
  --stueck-luft: var(--raum-2);
  list-style: none; margin: 0; padding: 0;
  display: flex; flex-wrap: wrap; justify-content: center;
  gap: var(--raum-3) var(--stueck-luft);
}
.najava__stueck {
  flex: 0 0 calc((100% - var(--stueck-luft)) / 2);
  min-width: 0;
}
@media (min-width: 620px) {
  .najava__stueck { flex-basis: calc((100% - 3 * var(--stueck-luft)) / 4); }
}
/* ⭐ Filmovi na telefonu (`filme.js`) leze TACNO preko svoje slike. Prvi i
   zadnji kadar filma su ta slika, pa <video> nikad ne treba skrivati. */
.najava__stueck[data-film] { position: relative; }
.film--karte {
  position: absolute; left: 0; top: 0;
  width: 100%; aspect-ratio: 1/1; height: auto;
  object-fit: cover; display: block; border-radius: 3px;
  pointer-events: none;
}
/* Film istaknute kartice lezi tacno preko njene slike (isti `object-fit`). */
.karte__rahmen[data-film] { position: relative; }
.karte__rahmen > .film--karte {
  inset: 0; width: 100%; height: 100%; aspect-ratio: auto; border-radius: inherit;
}
.film--band {
  position: absolute; inset: 0; width: 100%; height: 100%;
  object-fit: cover; pointer-events: none;
}
.tagesband[data-zu="ja"] .film--band { display: none; }
.film::-webkit-media-controls-start-playback-button { display: none !important; -webkit-appearance: none; }
.film::-webkit-media-controls { display: none !important; }
.standorte__lokal {
  position: relative; margin: 0 0 var(--raum-4);
  aspect-ratio: 4/5; overflow: hidden; border-radius: 3px;
}
.standorte__lokal img, .standorte__lokal .film--karte {
  position: absolute; inset: 0; width: 100%; height: 100%;
  aspect-ratio: auto; object-fit: cover;
}
/* Desktop dobija lokal kasnije, s vlastitim materijalom (MA 16.09). */
@media (min-width: 701px) { .standorte__lokal { display: none; } }
.najava__stueck img {
  width: 100%; height: auto; aspect-ratio: 1/1; object-fit: cover;
  display: block; border-radius: 3px;
  -webkit-user-drag: none;
}
.najava__stueck span {
  display: block; margin-top: var(--raum-1);
  font-size: var(--t-mini);
  color: color-mix(in oklab, var(--papier) 70%, var(--tinte));
}
.najava__satz {
  margin: 0 0 var(--raum-2); font-size: var(--t-klein); max-width: 46ch;
  color: color-mix(in oklab, var(--papier) 76%, var(--tinte));
}
.najava__beispiele {
  margin: 0; font-size: var(--t-klein);
  color: color-mix(in oklab, var(--papier) 70%, var(--tinte));
}

/* Iskrena nota — jednom, na dnu poglavlja. ⛔ Bez isprekidane linije. */
.angekuendigt {
  margin-top: var(--raum-4);
  padding-top: var(--raum-3);
  border-top: 1px solid color-mix(in oklab, var(--papier) 22%, var(--tinte));
}
.angekuendigt__titel {
  margin: 0; font-size: var(--t-text);
  font-variation-settings: 'wght' 600;
  color: var(--akzent-hell);
}
.angekuendigt__beispiele {
  margin: var(--raum-1) 0 0; font-size: var(--t-klein);
  max-width: 44ch;
  color: color-mix(in oklab, var(--papier) 72%, var(--tinte));
}

@media (min-width: 900px) {
  .gruppe--nacht { padding: var(--raum-6) var(--vitrine-rand); }
  .najava { padding: var(--raum-6) var(--raum-5); }
  .najava__lead { font-size: 1.1rem; max-width: 46ch; }
  /* ⭐ Grupe JEDNA UZ DRUGU, jedan red izloga preko cijele table.
     ⛔ Širina grupe = n pločica + (n−1) razmaka. Zato `flex-grow: n` i
        `flex-basis: (n−1)·razmak`: slobodni prostor se dijeli po broju
        pločica, pa je svaka pločica u OBJE grupe tačno iste širine
        (Konditorei 4 i Getränke 3 ⇒ 7 jednakih polja). */
  .najava__teile { display: flex; gap: var(--raum-5); align-items: start; }
  .najava__teil {
    flex: var(--anzahl) 1 calc((var(--anzahl) - 1) * var(--raum-2));
    min-width: 0; margin-bottom: 0;
  }
  .najava__streifen { flex-wrap: nowrap; justify-content: start; }
  .najava__stueck { flex: 1 1 0; }
}

/* ── ⭐⭐ NOĆNO POGLAVLJE U CJENOVNIKU ──────────────────────────────────
   Iskren nalaz iz poredjenja s `enerblock.net`: cjenovnik je bio ~10 ekrana
   ISTE podloge, a peer nikad ne pusti oko dalje od dva ekrana bez promjene
   tla. Ovo nije traka radi trake — `grill` je DOSLOVNO vatra iz heroja, pa se
   film vraca u meniju tacno tamo gdje mu je mjesto.
   ⛔ Puna sirina se dobija negativnom marginom koja MORA odgovarati padingu
      vitrine — zato je paading vitrine sad token `--vitrine-rand`, a ne dvije
      razlicite brojke koje tiho odu u drift.
   ⛔ Kartice unutra nisu „ista kartica na tamnom": svaka boja se preracunava
      prema TINTI, inace hairline nestane a cijena izgori. Kontrast mjeri
      `a11y-gate` kroz svih pet paleta.                                     */
.gruppe--nacht {
  background: var(--tinte);
  color: color-mix(in oklab, var(--papier) 92%, var(--tinte));
  margin-inline: calc(var(--vitrine-rand) * -1);
  padding: var(--raum-5) var(--vitrine-rand);
  --akzent-hell: color-mix(in oklab, var(--akzent) 45%, var(--papier));
}
.gruppe--nacht .gruppe__kopf {
  border-bottom-color: color-mix(in oklab, var(--papier) 30%, var(--tinte));
}
.gruppe--nacht .gruppe__titel { color: var(--papier); }
.gruppe--nacht .gruppe__nr    { color: var(--akzent-hell); }
.gruppe--nacht .gruppe__zahl  { color: color-mix(in oklab, var(--papier) 58%, var(--tinte)); }

.gruppe--nacht .karte {
  background: color-mix(in oklab, var(--tinte) 88%, var(--papier));
  border-color: color-mix(in oklab, var(--papier) 20%, var(--tinte));
}
@media (hover: hover) {
  .gruppe--nacht .karte:hover {
    background: color-mix(in oklab, var(--tinte) 80%, var(--papier));
    border-color: color-mix(in oklab, var(--papier) 40%, var(--tinte));
  }
}
.gruppe--nacht .karte[data-jetzt="ja"] {
  border-color: color-mix(in oklab, var(--akzent) 50%, var(--papier));
}
.gruppe--nacht .karte__name,
.gruppe--nacht .karte__preis,
.gruppe--nacht .groesse .preis { color: var(--papier); }
.gruppe--nacht .karte__kasse {
  border-top-color: color-mix(in oklab, var(--papier) 22%, var(--tinte));
}
/* ⛔ Akcent kao tekst na tinti je predtaman — ista svijetla varijanta kao u najavi. */
.gruppe--nacht .vitrine__raster > .karte--hervor::before {
  color: color-mix(in oklab, var(--akzent) 45%, var(--papier));
}
.gruppe--nacht .karte__text,
.gruppe--nacht .karte__varianten li,
.gruppe--nacht .karte__allergene,
.gruppe--nacht .groesse {
  color: color-mix(in oklab, var(--papier) 72%, var(--tinte));
}
.gruppe--nacht .karte__rahmen {
  background: color-mix(in oklab, var(--tinte) 80%, var(--papier));
}
.gruppe--nacht .karte__monogramm {
  color: color-mix(in oklab, var(--papier) 26%, var(--tinte));
}

/* ── ⭐⭐ DRUGI REGISTAR: ODŠTAMPAN CJENOVNIK ──────────────────────────
   S menija od 122 artikla (klijentove ploče, 15.09) fotografija postoji samo
   za dio jela. Mreza u kojoj vecina kartica nosi sivi kvadrat s inicijalom je
   ZID PRAZNINE — bas ono „prazno i jeftino" koje smo taman rijesili, samo kroz
   podatke umjesto kroz dizajn.
   ⇒ Kategorija u kojoj manje od pola artikala ima fotku crta se kao odstampan
     cjenovnik. To NIJE fallback nego drugi legitiman registar iste stranice:
     referenca ovog projekta je od pocetka „dobro odstampan dnevni cjenovnik".
   ⛔ Tackasta vodilja je CSS (`border-bottom: dotted`), ne znakovi u tekstu —
      inace je citac ekrana izgovara.                                        */
.vitrine__liste { list-style: none; margin: 0; padding: 0; }
.zeile {
  display: grid;
  grid-template-columns: minmax(0, auto) minmax(1.5rem, 1fr) auto;
  align-items: baseline;
  gap: 0 var(--raum-2);
  padding: var(--raum-2) 0;
  border-bottom: var(--kante);
}
.zeile[hidden] { display: none; }
.zeile__text { min-width: 0; }
.zeile__name {
  display: block;
  font-size: var(--t-text);
  font-variation-settings: 'wght' 500;
  letter-spacing: -0.01em;
}
.zeile[data-jetzt="ja"] .zeile__name { font-variation-settings: 'wght' 700; }
.zeile[data-jetzt="ja"] .zeile__name::before {
  content: ''; display: inline-block;
  width: .4em; height: .4em; margin-right: .45em;
  border-radius: 50%; background: var(--akzent);
  vertical-align: .08em;
}
.zeile__satz {
  display: block; margin-top: 2px;
  font-size: var(--t-klein); color: var(--tinte-leise);
  max-width: 52ch;
}
.zeile__allergene {
  display: block; margin-top: 2px;
  font-size: var(--t-mini); color: var(--tinte-leise);
}
/* Vodilja povezuje ime i cijenu preko praznog prostora — potez koji ploce u
   lokalu vec koriste. Sjeda na osnovnu liniju prvog reda, ne na sredinu bloka. */
.zeile__fuehrung {
  border-bottom: 1px dotted var(--linie);
  transform: translateY(-.28em);
  min-width: 1.5rem;
}
.zeile__werte {
  display: flex; align-items: baseline; gap: var(--raum-2);
  flex: 0 0 auto; white-space: nowrap;
}
.zeile__preis { font-size: var(--t-preis); }
.zeile__groessen, .zeile__varianten {
  display: flex; gap: var(--raum-2);
  font-size: var(--t-klein); color: var(--tinte-leise);
}
.zeile__varianten { font-size: var(--t-mini); }
/* ⛔⭐ MJERA REDA. Na desktopu je red isao preko CIJELE sirine: ime lijevo,
   cijena desno, izmedju METAR TACKICA (1336 px). To nije cjenovnik nego tabela,
   i tjera oko da putuje preko prazne stranice za svaku stavku.
   ⇒ Dvije kolone od ~34 rem, s linijom izmedju kao na odstampanoj ploci.
   ⛔ `break-inside: avoid` je OBAVEZAN: bez njega se opis i alergeni odvoje od
      imena i padnu u drugu kolonu — stavka se raspolovi.                     */
@media (min-width: 900px) {
  .vitrine__liste {
    columns: 2;
    column-gap: var(--raum-6);
    column-rule: var(--kante);
  }
  .zeile { break-inside: avoid; page-break-inside: avoid; }
  /* Prvi red u koloni ne smije nositi gornji razmak koji ga odvoji od vrha. */
  .vitrine__liste > .zeile:first-child { padding-top: 0; }
}
.gruppe--nacht .vitrine__liste {
  column-rule-color: color-mix(in oklab, var(--papier) 18%, var(--tinte));
}

/* Na uskom ekranu opis i alergeni idu ispod, a cijena ostaje uz ime. */
@media (max-width: 560px) {
  .zeile { grid-template-columns: minmax(0, 1fr) auto; }
  .zeile__fuehrung { display: none; }
  .zeile__text { grid-column: 1; }
  .zeile__werte { grid-column: 2; align-self: start; }
  /* ⛔⭐ Tri i više cijena: ime preko cijele širine, cijene u svom redu
     ispod imena, pa opis i alergeni. Redoslijed čitanja ostaje ime → cijena.
     ⛔ Ako spisak ima ijedan takav red, ISTI raspored dobija svaki red s
        dvije i više cijena — jedan spisak, jedno pravilo (Coffee to go). */
  .zeile--mehr .zeile__text,
  .vitrine__liste:has(.zeile--mehr) .zeile--mehrere .zeile__text { display: contents; }
  .zeile--mehr .zeile__name,
  .vitrine__liste:has(.zeile--mehr) .zeile--mehrere .zeile__name { grid-column: 1 / -1; grid-row: 1; }
  .zeile--mehr .zeile__werte,
  .vitrine__liste:has(.zeile--mehr) .zeile--mehrere .zeile__werte {
    grid-column: 1 / -1; grid-row: 2; justify-self: start;
    margin-top: var(--raum-1); flex-wrap: wrap; row-gap: 2px;
  }
  .zeile--mehr .zeile__satz,
  .vitrine__liste:has(.zeile--mehr) .zeile--mehrere .zeile__satz { grid-column: 1 / -1; grid-row: 3; }
  .zeile--mehr .zeile__allergene,
  .vitrine__liste:has(.zeile--mehr) .zeile--mehrere .zeile__allergene { grid-column: 1 / -1; grid-row: 4; }
}

/* Noćno poglavlje mora raditi i u ovom registru. */
.gruppe--nacht .zeile { border-bottom-color: color-mix(in oklab, var(--papier) 18%, var(--tinte)); }
.gruppe--nacht .zeile__name, .gruppe--nacht .zeile__preis,
.gruppe--nacht .groesse .preis { color: var(--papier); }
.gruppe--nacht .zeile__satz, .gruppe--nacht .zeile__allergene,
.gruppe--nacht .zeile__groessen, .gruppe--nacht .zeile__varianten {
  color: color-mix(in oklab, var(--papier) 72%, var(--tinte));
}
.gruppe--nacht .zeile__fuehrung {
  border-bottom-color: color-mix(in oklab, var(--papier) 24%, var(--tinte));
}

/* ⭐ Pica bez cijene: isti red, na mjestu cijene tiha „Preis folgt".
   ⛔ Kontrast: 72 % papira na tinti (isti ton kao `zeile__satz`) — a11y ga mjeri. */
.zeile__folgt {
  font-size: var(--t-mini); font-style: italic; white-space: nowrap;
  color: color-mix(in oklab, var(--papier) 72%, var(--tinte));
}
.gruppe__notiz {
  margin: var(--raum-2) 0 0;
  font-size: var(--t-mini);
  color: color-mix(in oklab, var(--papier) 72%, var(--tinte));
}
/* ⭐ Stranica pica: zaglavlje je poglavlje najave (tinta), cjenovnik ispod
   ista vitrina kao na naslovnici — gost ne osjeti da je presao na drugu stranu. */
.getraenke__kopf { padding-top: var(--raum-4); }
.getraenke__zurueck {
  color: var(--akzent-hell); text-decoration: none; font-size: var(--t-klein);
}
.getraenke__zurueck:hover { text-decoration: underline; }
.getraenke__zurueck:focus-visible { outline: 2px solid var(--messing); outline-offset: 3px; }
.getraenke__titel {
  font-family: var(--schrift-display);
  font-size: var(--t-display); line-height: 1.02; letter-spacing: -0.03em;
  font-variation-settings: 'wght' 560;
  margin: var(--raum-3) 0 var(--raum-2);
  color: var(--papier);
}
.getraenke .vitrine { padding-bottom: var(--raum-5); }
/* ⭐ Ulaz na stranicu pica — ista velicina kao slike u redu (kvadrat), tinta
   s tankim mesinganim rubom, tekst dole lijevo kao natpis na polici. */
/* ⛔ `.najava__link` (display: block) stoji niže u fajlu ⇒ dvije klase, inace ga gazi. */
.najava__link.najava__mehr {
  aspect-ratio: 1 / 1;
  display: flex; flex-direction: row; align-items: flex-end; justify-content: space-between; gap: .4rem;
  padding: var(--raum-2);
  border: 1px solid color-mix(in oklab, var(--messing) 55%, transparent);
  border-radius: 3px;
  background: color-mix(in oklab, var(--tinte) 80%, var(--messing) 6%);
  transition: background var(--takt) var(--kurve);
}
.najava__stueck--mehr .najava__mehr span { margin-top: 0; }
.najava__stueck--mehr .najava__mehr-text {
  font-family: var(--schrift-display);
  font-size: 1.15rem; line-height: 1.1;
  font-variation-settings: 'wght' 560;
  color: var(--papier);
}
.najava__stueck--mehr .najava__mehr-pfeil { font-size: 1.3rem; line-height: 1; color: var(--messing); }
/* ⛔ 17.09: pri uvećanom tekstu na 320 px strelica je virila 1 px iz pločice. */
.najava__stueck--mehr .najava__mehr { min-width: 0; overflow: clip; }
@media (hover: hover) {
  .najava__link.najava__mehr:hover { background: color-mix(in oklab, var(--tinte) 70%, var(--messing) 14%); }
}
/* Slika pica je link — bez podvlake, bez plavog; ime pod slikom ostaje kakvo je. */
.najava__link { display: block; color: inherit; text-decoration: none; -webkit-tap-highlight-color: transparent; }
.najava__link:focus-visible { outline: 2px solid var(--messing); outline-offset: 3px; border-radius: 3px; }

.vitrine__leer { color: var(--tinte-leise); font-size: var(--t-klein); }

/* Gustina raste s ekranom; prva kartica drzi dva polja i mreza dobije ritam. */
@media (min-width: 620px) {
  .vitrine__raster { grid-template-columns: repeat(3, 1fr); gap: var(--raum-4) var(--raum-3); }
  /* ⛔ NE `:first-child`: meni je kebab-tezak pa bi prvi artikal skoro uvijek
     bio kebab, a Adi ga izricito ne zeli u highlightu. Veliko polje nosi
     kartica koju je server OZNACIO, a `order` je dovede naprijed bez diranja
     redoslijeda u DOM-u — vremensko sortiranje i Plan 2 ostaju netaknuti. */
  /* ⛔⭐ `grid-row: span 2` + kvadratni kadar ostavljao je ~150 px PRAZNE plohe
     između slike i naslova (vidljivo na desktopu) — to je rupa, ne disanje.
     ⇒ Veliko polje je ŠIRE, ne više: dvije kolone × jedan red. */
  /* ⛔⭐⭐ 16.09: veliko polje od DVIJE kolone razvlačilo je dvije susjedne
     kartice na svoju visinu (4:3 slika ≈ 1,5× viša od kvadrata) ⇒ kod
     Kebap Sandwich, Dürüm, Spiegeleier ~170 px prazne plohe između slike i
     imena. ⇒ Istaknuto jelo je PLOČA PUNOG REDA: slika preko dvije kolone
     lijevo, tekst u preostalim kolonama desno, poravnat s mrežom ispod
     (`grid-template-columns: subgrid`). Nijedna obična kartica više ne dijeli
     red s njim, pa se nijedna ne razvlači. */
  .vitrine__raster > .karte--hervor {
    grid-column: 1 / -1; order: -1;
    grid-row: auto;
    display: grid;
    grid-template-columns: subgrid;
    grid-template-rows: 1fr auto auto auto auto 1fr;
    column-gap: inherit;
    row-gap: 0;
    padding: 0;
  }
  .vitrine__raster > .karte--hervor .karte__rahmen {
    grid-column: 1 / 3; grid-row: 1 / -1;
    margin: 0;
    border-radius: 2px 0 0 2px;
  }
  .vitrine__raster > .karte--hervor > :not(.karte__rahmen),
  .vitrine__raster > .karte--hervor::before {
    grid-column: 3 / -1;
    margin-inline-end: var(--raum-4);
    max-width: 34rem;
  }
  /* ⭐ Ploča mora reći ZAŠTO je ovo jelo veće od ostalih — inače je samo
     veća kartica. Pseudo-element je stavka mreže, pa ne kvari pravilo
     „četiri djeteta"; čitač ekrana ga pročita prije imena, što i treba. */
  .vitrine__raster > .karte--hervor::before {
    content: 'Empfehlung des Hauses';
    grid-row: 2;
    font-size: var(--t-mini);
    font-variation-settings: 'wght' 600;
    color: var(--akzent-tinte);
    margin-bottom: var(--raum-1);
  }
  .vitrine__raster > .karte--hervor .karte__name { grid-row: 3; font-size: var(--t-gross); line-height: 1.1; }
  .vitrine__raster > .karte--hervor .karte__kasse { grid-row: 4; margin-top: var(--raum-2); }
  .vitrine__raster > .karte--hervor .karte__fuss { grid-row: 5; }
  /* ⛔ Bez ovoga fotografija u velikom polju ostaje 1:1 na DVOSTRUKOJ sirini,
     pa kartica naraste vise od dva reda koja pokriva — mreza se razvuce i
     tekst odluta daleko ispod slike. Slika mora POPUNITI polje, ne diktirati
     ga: okvir raste s karticom, odnos stranica ide na `auto`. */
  /* ⛔⭐⭐ `aspect-ratio: auto` je pravio PORTRETNO polje (657×809 izmjereno na
     desktopu), a fotografije su KVADRATNE i crtaju se s `cover` ⇒ lijevi i
     desni rub jela se odrežu. Tako je „nestao" peti ćevap na kartici
     „5 Stück Cevapcici": kadar ih ima pet, a polje je odrezalo krajnji.
     ⛔ Ime artikla nosi BROJ — ono što gost prebroji na slici mora se poklopiti
        s tim brojem, pa polje ne smije rezati sadržaj.
     ⇒ Veliko polje ostaje KVADRAT (isti oblik kao izvor), a kartica preko dva
       reda time dobija mjesta za tekst ispod slike. */
  /* ⭐ 4:3, ne kvadrat: polje je ŠIROKO jedan red, pa široki rez siječe papir
     gore i dolje — a ne jelo. Jela su u ovoj seriji centrirana vodoravno
     (ćevapi zauzimaju ~20–75 % širine, ~35–70 % visine), pa 4:3 zadržava
     cijeli tanjir. ⛔ Nikad `contain`: letterbox trake su gore od reza. */
  .vitrine__raster > .karte--hervor .karte__rahmen {
    aspect-ratio: 4 / 3; min-height: 12rem;
  }
  .vitrine__raster > .karte--hervor .karte__bild { height: 100%; }
}
@media (min-width: 900px) {
  .vitrine { --vitrine-rand: var(--raum-5); padding: var(--raum-5) var(--vitrine-rand) 0; }
  .vitrine__raster { grid-template-columns: repeat(4, 1fr); }
  .gruppe { margin-bottom: var(--raum-6); }
}

/* ── ⭐ HANDWERK — tri zanata, tri kadra ───────────────────────────────
   Drugi tamni pojas na stranici. Ritam poglavlja je sad:
   najava (tinta) → cjenovnik (papir) → zanat (tinta) → lokacije (papir) →
   podnozje (tinta). Prije ovoga je stranica bila 16 ekrana ISTE bijele
   podloge s jednom tamnom trakom na kraju — to je bilo ono „prazno".
   ⛔ Kadrovi su izrezani iz naseg vlastitog filma, ne nova generacija.  */
.handwerk {
  background: var(--tinte);
  color: color-mix(in oklab, var(--papier) 92%, var(--tinte));
  padding: var(--raum-5) var(--raum-3) var(--raum-6);
  --akzent-hell: color-mix(in oklab, var(--akzent) 45%, var(--papier));
}
.handwerk .najava__kopf { margin-bottom: var(--raum-3); }
.handwerk__raster {
  list-style: none; margin: var(--raum-4) 0 0; padding: 0;
  display: grid; gap: var(--raum-5);
}
.handwerk__stueck { min-width: 0; }
.handwerk__bild {
  width: 100%; height: auto; aspect-ratio: 1/1; object-fit: cover;
  display: block; border-radius: 3px;
  margin-bottom: var(--raum-3);
  -webkit-user-drag: none;
}
.handwerk__titel {
  margin: 0 0 var(--raum-1);
  font-size: var(--t-gross);
  font-variation-settings: 'wght' 640, 'wdth' 88;
  color: var(--papier);
}
.handwerk__satz {
  margin: 0; max-width: 34ch;
  color: color-mix(in oklab, var(--papier) 78%, var(--tinte));
}

@media (min-width: 620px) {
  .handwerk__raster { grid-template-columns: repeat(2, 1fr); gap: var(--raum-3); }
  .handwerk__satz { font-size: var(--t-klein); }
}
@media (min-width: 900px) {
  .handwerk { padding: var(--raum-6) var(--raum-5); }
  .handwerk__raster { gap: var(--raum-4); }
  .handwerk__satz { font-size: var(--t-text); }
}

/* ── ⭐⭐ ORTE — adrese odmah ispod sata ────────────────────────────────
   MA 17.09 (tuđe oko): „lokacije su na dnu, puno se lista". Traka je tanka i
   tiha (mini pismo, papir), ali nosi ono što gost traži prvo: koji kvart,
   koja ulica, je li SADA otvoreno. Dodir vodi na kartice filijala dole —
   dugmad Anrufen/Route ostaju na JEDNOM mjestu.                            */
.orte {
  display: flex; align-items: baseline; gap: var(--raum-3);
  padding: var(--raum-2) var(--raum-3);
  border-bottom: var(--kante);
  background: color-mix(in oklab, var(--papier) 96%, var(--tinte));
  font-size: var(--t-mini);
}
.orte__marke {
  flex: 0 0 auto; text-transform: uppercase; letter-spacing: .08em;
  color: var(--tinte-leise);
  font-size: calc(var(--t-mini) - 0.06rem);
}
.orte__liste {
  list-style: none; margin: 0; padding: 0; flex: 1 1 auto; min-width: 0;
  display: grid; grid-template-columns: minmax(0, 1fr); gap: .15rem;
}
/* ⛔⭐⭐ 17.09 (MA s iPhonea: „slovo izlazi, stranica se klati lijevo-desno"):
   grid/flex dijete ima `min-width: auto` i NE MOŽE ispod min-content — njemačka
   adresa („Breitenfurter Str. 82A") uz dugo stanje („schließt in 40 Min.")
   naraste preko ekrana umjesto da se skrati. Ista klasa kvara kao
   `vitrine__raster` 16.09. ⇒ svaki nivo dobija `min-width: 0`, a traka klipa. */
.orte, .orte__ort, .orte__link { min-width: 0; }
.orte { overflow: hidden; }
.orte__link {
  display: flex; align-items: baseline; gap: .5em;
  color: inherit; text-decoration: none; padding-block: .12rem;
  -webkit-tap-highlight-color: transparent;
}
.orte__plz { flex: 0 0 auto; font-size: var(--t-mini); }
.orte__adresse {
  flex: 1 1 auto; min-width: 0; color: var(--tinte-leise);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.orte__status {
  flex: 0 0 auto; display: flex; align-items: center; gap: .4em;
  color: var(--akzent-tinte);
}
.orte__status .punkt {
  width: .5em; height: .5em; border-radius: 50%; flex: 0 0 auto;
  background: var(--tinte-leise);
}
.orte__ort[data-offen="ja"] .punkt { background: #2f7d4f; }
.orte__link:focus-visible { outline: 2px solid var(--akzent); outline-offset: 2px; border-radius: 3px; }
@media (hover: hover) { .orte__link:hover .orte__adresse { color: var(--tinte); } }
/* ⛔⭐ Prvi pokušaj je statusom prelamao u drugi red ⇒ traka 179 px na telefonu,
   petina ekrana za „malim slovima". Zato server šalje KRATAK status („bis 22:30"),
   a red ostaje jedan: PLZ · ulica · stanje. */
@media (max-width: 519px) {
  .orte { flex-direction: column; gap: .2rem; align-items: stretch; }
  .orte__liste { gap: .28rem; width: 100%; }
}
@media (min-width: 620px) {
  .orte__liste { grid-template-columns: repeat(3, 1fr); gap: var(--raum-3); }
  /* ⛔ Bez ovoga adresa razvuče kolonu pa „bis 22:30" odleti na njen desni rub,
     daleko od filijale kojoj pripada (izmjereno na snimku 1440 px). */
  .orte__adresse { flex: 0 1 auto; }
  .orte__link { justify-content: flex-start; }
}
@media (min-width: 900px) {
  .orte { padding: var(--raum-2) var(--raum-5); }
}

/* ── ⭐ ALERGENI — ključ slova s kartica ─────────────────────────────────
   ⛔⭐ 17.09: kartice pišu „Allergene: A, G", a ključa nije bilo nigdje, dok je
   podnožje tvrdilo „Angaben folgen". Stoji odmah ispod cjenovnika, na ISTOM
   tlu (tinta s pregibima), pa se čita kao zadnja strana karte, ne kao nov pojas.
   ⛔ Slovo u mono koloni — isto pismo kao cijena, oko ga veže za karticu. */
.allergene {
  background-color: var(--tinte);
  background-image: url('/static/bilder/papier-nacht.webp');
  background-size: 512px 512px;
  color: color-mix(in oklab, var(--papier) 92%, var(--tinte));
  padding: var(--raum-4) var(--raum-3) var(--raum-5);
  --akzent-hell: color-mix(in oklab, var(--akzent) 45%, var(--papier));
  scroll-margin-top: 7rem;
}
.allergene .gruppe__kopf { border-bottom-color: color-mix(in oklab, var(--papier) 30%, var(--tinte)); }
.allergene .gruppe__titel { color: var(--papier); }
.allergene .gruppe__nr    { color: var(--akzent-hell); }
.allergene__lead {
  margin: var(--raum-3) 0 var(--raum-3); max-width: 46ch;
  font-size: var(--t-klein);
  color: color-mix(in oklab, var(--papier) 78%, var(--tinte));
}
.allergene__liste {
  margin: 0; display: grid; grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--raum-1) var(--raum-3);
}
.allergene__eintrag {
  display: grid; grid-template-columns: 1.6em 1fr; align-items: baseline;
  padding-block: var(--raum-1);
  border-top: 1px solid color-mix(in oklab, var(--papier) 14%, var(--tinte));
  font-size: var(--t-klein);
}
.allergene__eintrag dt {
  font-family: var(--schrift-mono); font-weight: 600;
  color: var(--akzent-hell);
}
.allergene__eintrag dd { margin: 0; min-width: 0; }
@media (min-width: 620px) {
  .allergene__liste { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}
@media (min-width: 900px) {
  .allergene { padding: var(--raum-4) var(--raum-5) var(--raum-6); }
  .allergene__liste { grid-template-columns: repeat(4, minmax(0, 1fr)); }
}

/* ⛔⭐ DESKTOP SIROČE (17.09, snimak 1440 px): zadnja kartica sama u redu od 3/4
   kolone ostavljala je 2–3 prazna polja tinte (Grillplatte, Kapsalon, Slusheis…).
   Telefon je to već riješio vodoravnom pločom — ista klasa kvara, isti lijek.
   ⛔ Ne serverska oznaka: `tagesband.js` PREMJEŠTA kartice po satu, pa bi
      „zadnja" iz HTML-a prestala biti zadnja. `nth-child(… of S)` broji UŽIVO,
      bez istaknute ploče (`order: -1`, puni red) i bez kartica koje je
      pretraga sakrila (`[hidden]`).
   ⛔ Kolone preko `subgrid` kao istaknuta ploča (prošla `ime-uz-sliku` u
      WebKitu); redovi su VLASTITI — raspon redova u subgridu je WebKit kvar 16.09. */
@media (min-width: 620px) and (max-width: 899px) {
  .gruppe:not([data-anzahl="1"], [data-anzahl="2"]) .vitrine__raster > .karte:nth-last-child(1 of :not(.karte--hervor, [hidden])):nth-child(3n+1 of :not(.karte--hervor, [hidden])) {
    grid-column: 1 / -1; grid-row: auto;
    display: grid;
    grid-template-columns: subgrid;
    grid-template-rows: 1fr auto auto auto 1fr;
    row-gap: 0; padding: 0;
  }
  .gruppe:not([data-anzahl="1"], [data-anzahl="2"]) .vitrine__raster > .karte:nth-last-child(1 of :not(.karte--hervor, [hidden])):nth-child(3n+1 of :not(.karte--hervor, [hidden])) .karte__rahmen {
    grid-column: 1; grid-row: 1 / -1;
    margin: 0; aspect-ratio: 1 / 1;
    border-radius: 2px 0 0 2px;
  }
  .gruppe:not([data-anzahl="1"], [data-anzahl="2"]) .vitrine__raster > .karte:nth-last-child(1 of :not(.karte--hervor, [hidden])):nth-child(3n+1 of :not(.karte--hervor, [hidden])) > :not(.karte__rahmen) {
    grid-column: 2 / -1; max-width: 34rem;
    margin-inline-end: var(--raum-4);
  }
  .gruppe:not([data-anzahl="1"], [data-anzahl="2"]) .vitrine__raster > .karte:nth-last-child(1 of :not(.karte--hervor, [hidden])):nth-child(3n+1 of :not(.karte--hervor, [hidden])) .karte__name  { grid-row: 2; }
  .gruppe:not([data-anzahl="1"], [data-anzahl="2"]) .vitrine__raster > .karte:nth-last-child(1 of :not(.karte--hervor, [hidden])):nth-child(3n+1 of :not(.karte--hervor, [hidden])) .karte__kasse { grid-row: 3; }
  .gruppe:not([data-anzahl="1"], [data-anzahl="2"]) .vitrine__raster > .karte:nth-last-child(1 of :not(.karte--hervor, [hidden])):nth-child(3n+1 of :not(.karte--hervor, [hidden])) .karte__fuss  { grid-row: 4; }
}
@media (min-width: 900px) {
  .gruppe:not([data-anzahl="1"], [data-anzahl="2"]) .vitrine__raster > .karte:nth-last-child(1 of :not(.karte--hervor, [hidden])):nth-child(4n+1 of :not(.karte--hervor, [hidden])) {
    grid-column: 1 / -1; grid-row: auto;
    display: grid;
    grid-template-columns: subgrid;
    grid-template-rows: 1fr auto auto auto 1fr;
    row-gap: 0; padding: 0;
  }
  .gruppe:not([data-anzahl="1"], [data-anzahl="2"]) .vitrine__raster > .karte:nth-last-child(1 of :not(.karte--hervor, [hidden])):nth-child(4n+1 of :not(.karte--hervor, [hidden])) .karte__rahmen {
    grid-column: 1; grid-row: 1 / -1;
    margin: 0; aspect-ratio: 1 / 1;
    border-radius: 2px 0 0 2px;
  }
  .gruppe:not([data-anzahl="1"], [data-anzahl="2"]) .vitrine__raster > .karte:nth-last-child(1 of :not(.karte--hervor, [hidden])):nth-child(4n+1 of :not(.karte--hervor, [hidden])) > :not(.karte__rahmen) {
    grid-column: 2 / -1; max-width: 34rem;
    margin-inline-end: var(--raum-4);
  }
  .gruppe:not([data-anzahl="1"], [data-anzahl="2"]) .vitrine__raster > .karte:nth-last-child(1 of :not(.karte--hervor, [hidden])):nth-child(4n+1 of :not(.karte--hervor, [hidden])) .karte__name  { grid-row: 2; }
  .gruppe:not([data-anzahl="1"], [data-anzahl="2"]) .vitrine__raster > .karte:nth-last-child(1 of :not(.karte--hervor, [hidden])):nth-child(4n+1 of :not(.karte--hervor, [hidden])) .karte__kasse { grid-row: 3; }
  .gruppe:not([data-anzahl="1"], [data-anzahl="2"]) .vitrine__raster > .karte:nth-last-child(1 of :not(.karte--hervor, [hidden])):nth-child(4n+1 of :not(.karte--hervor, [hidden])) .karte__fuss  { grid-row: 4; }
}

/* ── Standorte ──────────────────────────────────────────────────────── */
.standorte { padding: var(--raum-5) var(--raum-3) var(--raum-6); }
.standorte__raster {
  list-style: none; padding: 0; margin: 0;
  display: grid; gap: var(--raum-3);
}
/* ⛔⭐ Za pekaru koja se nalazi preko „Bäckerei in der Nähe" je OVO
   najvrednija sekcija na stranici — a stajala je kao tri reda sitnog teksta,
   sitnija od bilo koje kartice s kebabom. ⇒ PLZ je krupna cifra kao cijena,
   ulica je naslov, sat je ziv. Ista gustina kao cjenovnik, ne fusnota. */
.standort {
  border: var(--kante); border-radius: 3px;
  padding: var(--raum-3);
  background: color-mix(in oklab, var(--papier) 96%, var(--tinte) 4%);
  display: flex; flex-direction: column;
}
.standort__plz {
  display: block;
  font-size: clamp(1.9rem, 8vw, 2.6rem);
  line-height: 1;
  color: color-mix(in oklab, var(--tinte) 78%, var(--papier));
}
.standort__adresse {
  margin: var(--raum-2) 0 var(--raum-3);
  font-family: var(--schrift-display);
  font-size: var(--t-text);
  font-variation-settings: 'wght' 620, 'wdth' 92;
  letter-spacing: -0.01em;
  padding-bottom: var(--raum-2);
  border-bottom: var(--kante);
}
.standort__status {
  margin: 0; font-size: var(--t-mini); color: var(--akzent-tinte);
  display: flex; align-items: center; gap: .45em;
}
.standort__status .punkt {
  width: .5em; height: .5em; border-radius: 50%; flex: 0 0 auto;
  background: var(--tinte-leise);
}
.standort[data-offen="ja"] .punkt { background: #2f7d4f; }
.standort__zeit {
  margin: var(--raum-1) 0 var(--raum-3); font-size: var(--t-mini);
  color: var(--tinte-leise);
}
/* Dugmad sjedaju na DNO kartice, pa su u redu poravnata i kad adrese
   prelome na razlicit broj redova. */
.standort__tasten { margin-top: auto; }
.standort__tasten { display: flex; gap: var(--raum-2); }
.taste {
  flex: 1 1 auto; text-align: center;
  padding: .62rem var(--raum-2);
  border: 1px solid var(--tinte); border-radius: 2px;
  background: var(--tinte); color: var(--papier);
  text-decoration: none; font-size: var(--t-klein);
  transition: opacity var(--takt) var(--kurve);
}
.taste:hover { opacity: .82; }
.taste--leise { background: transparent; color: var(--tinte); }

@media (min-width: 620px) {
  .uebergang__lead { font-size: 1.1rem; }
  .standorte__raster { grid-template-columns: repeat(3, 1fr); }
}
@media (min-width: 900px) {
  .standorte { padding: var(--raum-6) var(--raum-5); }
}

/* ── Pravna stranica ───────────────────────────────────────────────────
   Jedna kolona, mjera reda kao u prelazu. ⛔ Bez heroja i bez trake: gost je
   tu zbog teksta. Registar ostaje isti — papir i tinta, bez novog jezika.  */
.seite {
  padding: var(--raum-5) var(--raum-3) var(--raum-6);
  max-width: 44rem;
}
.seite .gruppe__kopf { margin-bottom: var(--raum-4); }
.seite__zurueck {
  flex: 0 0 auto;
  font-family: var(--schrift-mono); font-size: var(--t-mini);
  color: var(--akzent-tinte); text-decoration: none;
}
.seite__zurueck:hover { text-decoration: underline; }
.seite__zurueck:focus-visible { outline: 2px solid var(--akzent); outline-offset: 3px; }
.seite__lead { margin: 0 0 var(--raum-4); font-size: 1.05rem; max-width: 40ch; }
/* Ono sto nedostaje NE izgleda kao greska nego kao stavka koja se rjesava. */
.seite__hinweis {
  margin: 0 0 var(--raum-4);
  padding: var(--raum-3);
  border-left: 3px solid var(--akzent);
  background: color-mix(in oklab, var(--papier) 94%, var(--akzent));
  font-size: var(--t-klein);
}
.seite__titel {
  margin: var(--raum-5) 0 var(--raum-2);
  font-size: var(--t-gross);
  font-variation-settings: 'wght' 640, 'wdth' 90;
}
.seite p { max-width: 62ch; }
/* ⛔ 17.09: pravne stranice do sad nisu imale NIJEDAN link u tekstu, pa ni stil —
   prvi mailto i 404 linkovi izašli su u zadanoj plavoj pregledača. */
.seite__text a, .seite__liste a {
  color: inherit; text-decoration: underline;
  text-decoration-color: color-mix(in oklab, var(--akzent) 70%, transparent);
  text-decoration-thickness: 1px; text-underline-offset: 3px;
}
.seite__text a:hover, .seite__liste a:hover { text-decoration-color: currentColor; }
.seite__text a:focus-visible, .seite__liste a:focus-visible { outline: 2px solid var(--akzent); outline-offset: 3px; }
.seite__liste { margin: 0; padding: 0; }
.seite__liste > div {
  display: grid; gap: 2px var(--raum-3);
  padding: var(--raum-2) 0;
  border-bottom: var(--kante);
}
.seite__liste dt {
  font-size: var(--t-mini);
  letter-spacing: .1em; text-transform: uppercase;
  color: var(--tinte-leise);
}
.seite__liste dd { margin: 0; }
@media (min-width: 620px) {
  .seite__liste > div { grid-template-columns: 14rem 1fr; align-items: baseline; }
}
@media (min-width: 900px) {
  .seite { padding: var(--raum-6) var(--raum-5); }
}

/* ── Podnožje ──────────────────────────────────────────────────────────
   ⛔ Zaglavlje je tinta na papiru — Plan 1 je izmjerio 1,06:1 preko neba i
   vratio wordmark na papir. Podnožje je jedina obrnuta ploha na sajtu: puna
   tamna traka, papir kao tekst. Stranica se mora NEGDJE zatvoriti, i to
   mjesto nosi sav tvrd podatak (adrese, vrijeme, pravno).
   ⛔ Boja je TINTA, ne nebo: nebo se mijenja s vremenom i u srednjetonskoj
   zoni ne daje kontrast nijednom slovu.                                  */
.fusszeile {
  background: var(--tinte);
  color: color-mix(in oklab, var(--papier) 88%, var(--tinte));
  padding: var(--raum-5) var(--raum-3) var(--raum-4);
  font-size: var(--t-klein);
}
.fusszeile__kopf { margin-bottom: var(--raum-4); }
.fusszeile__marke { margin: 0; line-height: 0; color: var(--messing); }
.fusszeile__marke .logo { display: block; width: clamp(10rem, 44vw, 17rem); height: auto; }
/* Tekst samo za čitač ekrana — vidljivo mjesto nosi znak. */
.nur-vorleser {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}
.fusszeile__zeile {
  margin: var(--raum-1) 0 0;
  font-size: var(--t-mini);
  letter-spacing: .14em; text-transform: uppercase;
  color: color-mix(in oklab, var(--papier) 62%, var(--tinte));
}
.fusszeile__spalten { display: grid; gap: var(--raum-4); }
.fusszeile__titel {
  margin: 0 0 var(--raum-2);
  font-size: var(--t-mini);
  letter-spacing: .14em; text-transform: uppercase;
  font-family: var(--schrift-text);
  font-weight: 600;
  color: color-mix(in oklab, var(--papier) 60%, var(--tinte));
}
.fusszeile__liste { list-style: none; margin: 0; padding: 0; }
.fusszeile__liste li { padding: .3rem 0; }
.fusszeile__liste a { color: inherit; text-decoration: none; border-bottom: 1px solid transparent; }
.fusszeile__liste a:hover { border-bottom-color: currentColor; }
/* ⛔ 18 kategorija u jednoj koloni = najduži blok u podnožju (na telefonu
   ~2 ekrana samo spiska). Dvije kolone, red ostaje isti kao u čipovima. */
.fusszeile__liste--sortiment { columns: 2; column-gap: var(--raum-3); }
.fusszeile__liste--sortiment li { break-inside: avoid; }
/* ⛔ Ne `opacity` — opacity obara izmjereni kontrast (Plan 1: 5,95 -> 4,27).
   Boja se mijesa eksplicitno pa ostaje mjerljiva. */
.fusszeile__leise { color: color-mix(in oklab, var(--papier) 58%, var(--tinte)); }
/* ⛔ Pravni linkovi u podnozju su bili SISTEMSKI PLAVI — jedini plavi piksel
   na cijelom sajtu, i to bas na stranici koja treba da djeluje ozbiljno. */
.fusszeile__leise a { color: inherit; text-decoration: none; border-bottom: 1px solid currentColor; }
.fusszeile__leise a:hover { color: var(--papier); }
.fusszeile__fuss {
  margin-top: var(--raum-4); padding-top: var(--raum-3);
  border-top: 1px solid color-mix(in oklab, var(--papier) 18%, var(--tinte));
  display: flex; flex-wrap: wrap; gap: var(--raum-2) var(--raum-4);
  justify-content: space-between;
  font-size: var(--t-mini);
}
.fusszeile__fuss p { margin: 0; }

@media (min-width: 620px) {
  .fusszeile__spalten { grid-template-columns: 1.2fr 1.6fr 1fr; gap: var(--raum-4); }
}
@media (min-width: 900px) {
  .fusszeile { padding: var(--raum-6) var(--raum-5) var(--raum-4); }
}

/* ── Held (hero) ───────────────────────────────────────────────────────
   Puna širina, medij gore, papir dolje. ⛔ Tekst NIKAD preko srednjetonskog
   neba — Plan 1 je to izmjerio na 1,06:1 i vratio zaglavlje na papir.
   Slika se stapa u papir, wordmark sjeda na papir: puna širina slike i
   puna čitljivost, bez kompromisa ni na jednu stranu.                     */
.held {
  position: relative;
  width: 100%;
  /* Visok kontejner NOSI SKROL koji premotava video; kadar je zalijepljen
     unutra i ostaje pripet CIJELOM duzinom.
     ⛔ Bilo je 168svh uz kadar od 82svh ⇒ poslije odlijepljenja ostajalo je
     ~86svh GOLOG PAPIRA prije wordmarka. To je bila ona prazna bijela rupa.
     Sad je kadar 100svh, pa kontejner minus ekran = tacno skrol putovanja.
     ⭐ Adi 15.09: na desktopu je 260svh bilo PREBRZO i put do zara je bio
     prazan. Oboje je isti problem — premalo skrola i nijedan dogadjaj usput.
     Sad 380svh (telefon) / 480svh (desktop) + tri tekstualna ritma.
     ⛔⭐ 15.09 (arc 5): drugi cin je produzen 5 s -> 10 s (Adi: „treba malo
     duzi video"). Da je visina ostala ista, PRVI cin bi dobio 25 % manje
     skrola i ubrzao se — a Adi je desktop hero vec jednom zvao PREBRZIM.
     Visina raste tacno toliko da prvi cin zadrzi svoj tempo (~140svh telefon,
     ~190svh desktop), a drugi cin DUPLIRA svoj (73 -> 140, 100 -> 190).
     ⇒ produzenje se osjeti tamo gdje je Adi trazio, a nista se ne ubrzava. */
  height: 380svh;
  /* ⛔ NE --himmel-oben: dok zalijepljeni kadar visi na vrhu, ispod njega se
     vidi OVA pozadina. S bojom neba to je bilo golo plavo polje; s papirom
     izgleda kao list koji se penje ka slici — i spaja se s donjim krajem vela. */
  background: var(--papier);
}
.held__medium {
  position: sticky; top: 0;
  /* ⛔ NE max-height: kapa od 44rem je na desktopu ostavljala kadar visok
     704px u kontejneru od 168svh — ostatak je bio prazan papir. */
  height: 100svh; min-height: 17rem;
  overflow: hidden;
}
.held__bild,
.held__canvas,
.held__video {
  width: 100%; height: 100%;
  object-fit: cover; object-position: center 58%;
  display: block;
}
/* Svjetlo preko medija dolazi iz ISTE palete koju vozi --tag-fortschritt:
   u 9 ujutro hladno plavo, u 19h toplo smeđe. Nebo se mijenja, papir ne. */
.held__schleier {
  position: absolute; inset: 0;
  /* ⛔⭐⭐ MORA imati z-index. Bio je `auto`, a canvas/video su zbog LCP-a
     dobili `z-index: 1` ⇒ pozicioniran element bez z-indeksa pada ISPOD njih.
     Posljedica: CIJELI veo je bio nevidljiv — i nebo, i pretapanje u papir na
     dnu, i pojas koji nosi kontrast teksta. Kapija kontrasta ga je nasla
     (1,30:1 tamo gdje je racunato ~7:1), oko nije.
     ⛔ Isti kvar je ranije uhvacen za `.held__takte` i popravljen SAMO tamo.
        Popravka na jednom mjestu nije popravka klase kvara — slojevi hero-a
        se od sad drze na jednoj ljestvici, ovdje:
          0 rezervna slika · 1 medij · 2 veo · 3 ritmovi · 4 pretapanje */
  z-index: 2;
  /* ⛔ Veo je bio na 55% i isprao sliku u mlijeko — plamen je izgubio zar.
     Gore samo naznaka neba, sredina ciste, dolje prelaz u papir za wordmark. */
  /* ⛔⭐ POJAS ZA TEKST — prvi sloj, ispod nebeskog.
     Ritmovi vise ne nose crni okvir (Adi: „dovoljno samo tekst"), pa kontrast
     ne smije zavisiti od toga sta je bas tad na kadru: Plan 1 je izmjerio
     1,06:1 za tintu preko srednjetonske slike. Rjesenje je SIRA, NEVIDLJIVA
     zavjesa — pojas u gradaciji SLIKE, ne kutija oko teksta. Elipsa je
     mekana i bez ruba, pa se cita kao dubina kadra a ne kao ploca.
     ⛔ Jacina je mjerena na NAJSVJETLIJEM kadru putovanja (scripts/takt-kontrast.mjs),
        ne na prosjecnom. */
  background:
    linear-gradient(to bottom,
      color-mix(in oklab, var(--himmel-oben) 26%, transparent) 0%,
      transparent 30%,
      transparent 72%,
      color-mix(in oklab, var(--papier) 55%, transparent) 92%,
      var(--papier) 100%),
    radial-gradient(150% 70% at 50% 50%,
      color-mix(in oklab, #0b0906 68%, transparent) 0%,
      color-mix(in oklab, #0b0906 57%, transparent) 40%,
      color-mix(in oklab, #0b0906 29%, transparent) 66%,
      color-mix(in oklab, #0b0906 9%, transparent) 82%,
      transparent 92%);
}

/* Wordmark sad ima prostor — i težinu. Bricolage ose se otvaraju. */
/* ⛔ Bez negativne margine: kadar sad zavrsava tacno na dnu ekrana, pa
   wordmark pocinje cist list ispod njega. Negativna margina bi ga uvukla
   u srednjetonsku zonu slike — tamo nijedna tinta ne daje kontrast. */
.held + .uebergang { position: relative; z-index: 1; }

/* Slika ispod videa: sigurnosna mreza ako video ne krene (stara iOS verzija,
   ustedjeni podaci). ⛔ Nikad prazan hero. */
/* ⛔⭐ Rezervna slika je BILA na z-index:-1 i potpuno zaklonjena ⇒ stranica
   nije imala NIJEDAN element koji se priznaje kao LCP (`<canvas>` nikad nije
   LCP kandidat) i Lighthouse je vracao `NO_LCP` — perf se nije mogao ni
   izracunati. To nije bilo samo mjerenje: prvi ekran je do ucitavanja
   canvasa/videa bio prazan.
   Sad je slika OSNOVNI sloj koji se odmah vidi, a medij lijeze preko nje. */
.held__medium picture { position: absolute; inset: 0; z-index: 0; }
.held__canvas, .held__video {
  position: relative; z-index: 1;
  /* Otkriva se tek kad stvarno nosi kadar — do tada gost gleda rezervnu
     sliku, koja je i mjereni LCP element. */
  opacity: 0; transition: opacity 260ms var(--kurve);
}
/* ⛔⭐⭐ iOS compositor IGNORIŠE opacity na <video>. Sloj na z-index:1
   slika zadnji dekodirani kadar čak i kad CSS kaže opacity:0 — to je
   „stari video pri refreshu". Dok kapija nije paljena, medij stoji
   VAN viewporta. Rezervna slika ostaje LCP. Film, put, skrol: nedirnuto. */
.held:not([data-medium="ja"]) .held__video,
.held:not([data-medium="ja"]) .held__canvas {
  position: fixed;
  left: -120vw;
  top: 0;
  width: 100vw;
  height: 100svh;
  z-index: -1;
  pointer-events: none;
}
.held[data-medium="ja"] .held__canvas,
.held[data-medium="ja"] .held__video { opacity: 1; }
/* Samo jedan put crta. Drugi se ne skida iz DOM-a (resize moze promijeniti
   prag) nego se sakriva — ⛔ `display:none` na <video> bi ponistio `preload`. */
.held[data-pfad="bilder"] .held__video { display: none; }
.held[data-pfad="video"]  .held__canvas { display: none; }
.held__bild--ersatz { width: 100%; height: 100%; object-fit: cover; }

/* Gost koji je trazio manje kretanja dobija miran kadar i nikakav dodatni skrol. */
@media (prefers-reduced-motion: reduce) {
  .held { height: clamp(13rem, 46svh, 26rem); }
  .held__medium { position: absolute; inset: 0; height: auto; max-height: none; }
}

/* Mjesto za dugme „+" iz Plana 2 — ugao slike, rezervisano od danas. */
.karte__aktion { position: absolute; right: 0; bottom: 0; width: 0; height: 0; }

/* Dvije velicine na jednoj kartici. */
.karte__groessen { display: flex; flex-wrap: wrap; gap: var(--raum-1) var(--raum-2); }
.groesse {
  display: inline-flex; align-items: baseline; gap: .4em;
  font-size: var(--t-klein); color: var(--tinte-leise);
}
.groesse .preis { font-size: var(--t-text); color: var(--tinte); }


/* ── ⭐ Ritmovi putovanja ───────────────────────────────────────────────
   Tri rijeci izranjaju i blijede dok kamera ulazi, pa wordmark sjeda i ostaje.
   ⛔ Jacinu vozi JS kroz --takt-staerke (0..1). CSS ne zna za skrol.
   ⛔ Nijedan ritam ne ovisi o tome sta je bas tad na kadru — svaki nosi
      vlastitu tamnu podlogu. Plan 1 je izmjerio 1,06:1 za tekst preko
      srednjetonske slike; to se ne smije ponoviti.                        */
/* ⛔⭐⭐ LJESTVICA SLOJEVA HEROJA — 0 rezervna · 1 medij · 2 nebo ·
   3 PRETAPANJE · 4 ritmovi.
   Pretapanje je bilo `z-index: 4`, IZNAD ritmova ⇒ bijelo je na kraju padalo
   PREKO IMENA MARTINI i ime se pretvaralo u mrlju. Adi: „umjesto tranzit
   imamo samo bijeli odsjaj kao glitch." Nasao SNIMAK, ne racun.
   ⇒ Papir stize IZA teksta. Ime ostaje ostro i samo mijenja boju. */
.held__ausblende {
  position: absolute; inset: 0; z-index: 3;
  background: var(--papier);
  opacity: 0;
  pointer-events: none;
}

.held__takte {
  position: absolute; inset: 0;
  /* ⛔ MORA biti iznad medija. Canvas/video su dobili `z-index: 1` zbog LCP-a,
     a ritmovi su bili `z-index: auto` ⇒ pozicioniran element bez z-indeksa
     pada ISPOD onog sa `z-index: 1`, pa se tekst uopste nije vidio.
     Popravak jednog problema je tiho pokvario drugi — uhvaceno snimkom.
     ⛔⭐ 15.09: podignuto 3 -> 4, jer je pretapanje u papir bilo IZNAD teksta. */
  z-index: 4;
  display: grid; place-items: center;
  padding: var(--raum-4) var(--raum-3);
  pointer-events: none;
}
.takt {
  grid-area: 1 / 1;
  margin: 0; text-align: center; min-width: 0;
  opacity: var(--takt-staerke, 0);
  transform: translateY(calc((1 - var(--takt-staerke, 0)) * 1.4rem));
  will-change: opacity, transform;
}
.takt > span {
  display: inline-block;
  color: var(--papier);
}
/* ⭐ Adi 15.09: „bolje bi bilo bez ovog crnog okvira oko teksta, dovoljno samo
   tekst; crni okvir sjeda samo na kraju gdje izlazi ime Martini."
   ⇒ Podloga OSTAJE SAMO na `.takt--marke`. Ritmovi na putanji su cist tekst;
   nosi ih pojas u `.held__schleier` + uski `text-shadow` stack.
   ⛔ `text-shadow` NIJE zamjena za kontrast — on samo odvaja slovo od ruba
      ispod sebe. Mjereni kontrast dolazi od zavjese. */
.takt[data-takt="wort"] > span {
  text-shadow:
    0 1px 2px rgba(11, 9, 6, .78),
    0 2px 10px rgba(11, 9, 6, .62),
    0 0 28px rgba(11, 9, 6, .45);
}
/* ⛔⭐⭐ PLOCA JE JEDNA, NE DVIJE — nasla KAPIJA, ne oko.
   Podloga je stajala na `.takt--marke > span`, dakle na SVAKOM redu zasebno:
   ime je imalo svoju plocu, podnaslov svoju. Izmedju njih je isla svijetla
   crta kroz sred wordmarka. Na desktopu je ploca siroka 490 px pa je ta crta
   nosila dovoljno zone da `takt-kontrast` za podnaslov javi 1,49:1 umjesto
   ~10:1; na telefonu (253 px) se ista greska jedva vidjela — pa bi kapija
   samo na telefonu prosla i kvar bi ostao na velikom ekranu.
   ⇒ Jedna ploca oko OBA reda.
   ⛔ Podloga je TINTA, ne nebo: nebo se mijenja s vremenom i u srednjetonskoj
      zoni ne daje kontrast nijednom slovu.
   ⛔ Ploca se NE povlaci s dolaskom papira — pretapanje imena je probano i
      oboreno istom kapijom (vidi komentar uz wordmark u index.html). */
.takt--marke {
  padding: .32em .6em;
  border-radius: 2px;
  background: color-mix(in oklab, var(--tinte) 86%, transparent);
  -webkit-backdrop-filter: blur(6px);
  backdrop-filter: blur(6px);
}
/* ⭐ Ritam vise nije jedna rijec nego TVRDNJA: krupan naslov + red koji
   kaze sta se tu stvarno dobija. Adi: „do vatre se moze dosta toga reci".
   ⛔ Potporni red ostaje kratak — preko pokretnog kadra se duga recenica
   ne cita, nego se gleda. */
.takt[data-takt="wort"] > span {
  display: grid; gap: .3em;
  /* ⛔⭐ BILO `min(22ch, 90vw)`. `ch` se racuna na fontu ELEMENTA na kojem
     stoji — a to je span od 15 px, dok naslov u njemu ima 37 px (telefon) i
     70 px (desktop). Okvir je zato ispadao 220/242 px za slova od 70 px:
     na desktopu se „Bis 22 Uhr" lomilo u „Bis 22 / Uhr", a naslov je
     izlazio iz vlastite kutije. Mjera ne smije zavisiti od fonta koji je
     nosi — nosi je red koji se cita, a to je naslov. */
  /* ⛔⭐⭐ 17.09: bilo `min(19rem, 86vw)` — mjera od ŠIRINE EKRANA, a kutija
     (`.held__takte`) ima svoj padding. Pri uvećanom tekstu na 320 px natpis je
     bio 300 px u ćeliji od 265 i izlazio iz ekrana. Granica se veže za STVARNU
     širinu kutije (`100%`), ne za ekran. */
  max-width: min(19rem, 86vw, 100%);
  text-align: left;
}
@media (min-width: 701px) {
  .takt[data-takt="wort"] > span { max-width: min(30rem, 46vw, 100%); }
}
.takt[data-takt="wort"] b {
  font-family: var(--schrift-display);
  /* ⛔⭐ 17.09: donja granica je bila u `rem`. Kad gost uveća tekst (Safari
     „Page Zoom"), na 320 px ekrana je 2rem = 48 px, pa riječ („Backstube.")
     izađe iz ekrana. ⛔ Prelom ne pomaže: špica crta SVAKO SLOVO kao vlastiti
     span, pa red nema gdje da se prelomi. ⇒ Veličina se dodatno ograničava
     ŠIRINOM EKRANA. Na normalnom tekstu ovo ne mijenja ništa (9,5vw < 12vw),
     okida se samo pri uvećanju. */
  font-size: min(clamp(2rem, 9.5vw, 4.4rem), 12vw);
  max-width: 100%;
  font-variation-settings: 'opsz' 72, 'wght' 620, 'wdth' 86;
  letter-spacing: -0.03em;
  line-height: 1.0;
  font-weight: 400;
}
.takt[data-takt="wort"] i {
  font-style: normal;
  font-size: clamp(.86rem, 3.4vw, 1.05rem);
  line-height: 1.35;
  /* ⛔ Bilo 82%: to je radilo PREKO tamne podloge. Bez podloge potporni red
     je IZMJEREN kao najslabija karika (2,4:1 dok je naslov drzao 4,6:1) —
     prigusen tekst preko slike je prvi koji pada. Razlika s naslovom se nosi
     velicinom i tezinom, ne prigusenjem. */
  color: var(--papier);
}
.takt--marke > span { display: block; max-width: 100%; }
/* ⛔ Isti zakon kao za riječi: mjera se veže za kutiju, ne za ekran. */
.takt--marke { max-width: 100%; }
.takt--marke { z-index: 1; }

.takt__marke { padding-bottom: .12em; }
.takt--marke .takt__zeile { margin-top: 2px; }
/* ⭐⭐ ZNAK, NE SLOVA. Na kraju puta sjeda rukopisni „Martini" — isti duh kao
   mesingani natpis na zidovima lokala kroz koji je kamera upravo prošla.
   Boja je mesing (`--messing`), kontrast na tintanoj ploči ~8:1.
   ⛔ `takt-kontrast` gasi SLOVA bojom (`color: transparent`) — SVG crta
      `currentColor`, pa kapija i dalje mjeri ono što je IZA znaka. */
.takt--marke .takt__marke { color: var(--messing); line-height: 0; }
.takt__marke .logo { display: block; width: clamp(13rem, 64vw, 30rem); height: auto; }
.takt__zeile {
  font-size: var(--t-mini);
  letter-spacing: .16em; text-transform: uppercase;
}

/* ⛔ Gost koji je trazio manje kretanja dobija SVE ritmove odjednom i mirno —
   nista ne pulsira, a poruka se ne gubi. */
@media (prefers-reduced-motion: reduce) {
  .takt { opacity: 1; transform: none; }
  .takt[data-takt="wort"] { display: none; }   /* ostaje samo wordmark */
}

@media (min-width: 701px) {
  .held { height: 480svh; }
}
/* ⛔⭐⭐ TELEFON v4 (16.09): film se PUSTA, ne premotava — nema sta da nosi
   dodatni skrol. Hero je JEDAN ekran i skrola se kao obicna slika, dok se
   pretapa u papir (opacity = kompozitor, tece i na iOS-u).
   ⛔ Probano 165svh sa zalijepljenim kadrom: kad se kadar odlijepi, cijeli
      ekran blijedog papira prodje prije prvog teksta — na telefonu je to RUPA.
   ⛔ `no-preference`: reduced-motion pravilo iznad ima vlastitu visinu. */
@media (max-width: 700px) and (prefers-reduced-motion: no-preference) {
  .held { height: 100svh; }
}
.held[data-pfad="film"] .held__video,
.held[data-pfad="ruhe"] .held__video { object-position: center center; }
/* ⛔⭐⭐ FILM SE NE PARKIRA VAN EKRANA. Adi 16.09 na iPhoneu: „samo prva slika
   stoji, nista se ne pomjera". iOS nijemi video van ekrana NE PUSTA — a
   parkiranje je cekalo da video dokaze da svira ⇒ zakljucano zauvijek.
   Ovdje parkiranje ne treba: prvi kadar filma JE rezervna slika, pa i
   „stari kadar kroz opacity" izgleda isto. Kapija: held-film `ios-vidljiv`. */
.held[data-pfad="film"]:not([data-medium="ja"]) .held__video {
  position: relative; left: auto; top: auto;
  width: 100%; height: 100%; z-index: 1; opacity: 1;
}
/* ⭐⭐ TELEFON: RIJECI SU SPICA, RUKOPIS JE SAMO IME.
   ⛔⭐⭐ MA 16.09 (vece): rukopisne rijeci sa sjenkom = „slop, tranzicija
   prosta". Isti rukopis tri puta prije imena mu je uzimao dogadjaj.
   ⇒ Tanak slog sajta (Bricolage wght 300), bez teske sjenke — nosi ga tama
     peci. Slovo po slovo izranja: prozirnost + zamucenje + kratak uspon.
     Odlazi CIJELI red odjednom (izdah), da se ne cita unazad.
   ⛔ Tezina (`wght`) se NE animira po slovu: mijenja sirinu slova ⇒ red
      bi drhtao svaki kadar. Pomjeraju se samo transform/opacity/filter.
   ⭐ Napredak slova: `--p = (ein · (1 + F) − i/n) / F`, F = sirina talasa. */
.takt__spur { display: none; }
.held[data-pfad="film"] .takt__text { display: none; }
.held[data-pfad="film"] .takt[data-takt="wort"] {
  /* Ulaz nose slova; `--takt-staerke` ostaje za kapije, ali ne crta. */
  opacity: calc(1 - var(--takt-aus, 0));
  transform: translateY(calc(var(--takt-aus, 0) * -.35em));
  filter: blur(calc(var(--takt-aus, 0) * 7px));
}
.held[data-pfad="film"] .takt[data-takt="wort"] > span {
  text-align: center; max-width: 12.5rem;
  text-shadow: 0 1px 14px rgba(11, 9, 6, .55);
}
.held[data-pfad="film"] .takt__spur {
  display: block;
  font-family: var(--schrift-display);
  font-size: clamp(2.4rem, 11.5vw, 3.4rem);
  font-variation-settings: 'opsz' 96, 'wght' 260, 'wdth' 88;
  letter-spacing: -0.04em;
  line-height: 1.02;
  text-wrap: balance;
}
.takt__wort { display: inline-block; white-space: nowrap; }
.takt__zeichen {
  --f: .55;
  --p: clamp(0, calc((var(--takt-ein, 0) * (1 + var(--f)) - var(--i) / var(--n)) / var(--f)), 1);
  display: inline-block;
  opacity: var(--p);
  transform: translateY(calc((1 - var(--p)) * .42em));
  filter: blur(calc((1 - var(--p)) * 9px));
}
/* ⛔⭐ BEZ KOCKE. MA 16.09: „na Martini natpisu imamo unutar kocke — ne sjeda,
   bolje bez kocke samo Martini i ispod malim." Kontrast vise ne nosi ploca
   nego NOC: kad ime sjeda, gornja trecina studija se zatamni (isti mrak kao
   pec na pocetku), a mesing stoji na njoj kao natpis na zidu lokala.
   Jacinu vozi `--marke-staerke` iz held.js. Izmjereno na zadnjem kadru bez
   ploce: mesing na golom zidu 1,18:1 ⇒ s noci 4,7:1, podnaslov 12,9:1. */
.held[data-pfad="film"] .takt--marke,
.held[data-pfad="ruhe"] .takt--marke {
  background: none;
  -webkit-backdrop-filter: none; backdrop-filter: none;
}
/* ⭐⭐ TELEFON — ime ulazi iz zamućenja i odlazi s rezom scene (MA 17.09).
   Isti jezik kao spica riječi: pomjeraju se samo opacity/transform/filter.
   `--marke-ein`/`--marke-aus` vozi held.js; `--takt-staerke` ostaje za kapije. */
.held[data-pfad="film"] .takt--marke {
  opacity: var(--takt-staerke, 0);
  transform:
    translateY(calc(var(--marke-aus, 0) * -.45em))
    scale(calc(.965 + var(--marke-ein, 0) * .035));
  filter: blur(calc((1 - var(--marke-ein, 0)) * 12px + var(--marke-aus, 0) * 9px));
}
.held[data-pfad="film"] .held__schleier::after {
  content: ""; position: absolute; inset: 0;
  background: linear-gradient(to bottom,
    rgba(11, 9, 6, .80) 0%, rgba(11, 9, 6, .70) 32%,
    rgba(11, 9, 6, .40) 50%, transparent 68%);
  opacity: var(--marke-staerke, 0);
}
/* iOS u stedi baterije crta dugme „play" preko videa koji ne smije svirati. */
.held__video::-webkit-media-controls-start-playback-button { display: none !important; -webkit-appearance: none; }
.held__video::-webkit-media-controls { display: none !important; }
.held[data-pfad="film"] .held__canvas,
.held[data-pfad="ruhe"] .held__canvas { display: none; }
/* ⭐ Ritmovi stoje u GORNJOJ TRECINI: tamo je u peci tama, a na kraju goli
   zid studija — sredina kadra pripada kroasanu i niti cokolade. */
.held[data-pfad="film"] .held__takte,
.held[data-pfad="ruhe"] .held__takte {
  place-items: start center;
  padding-top: max(13svh, 5.5rem);
}
/* ⛔ Radijalni veo desktopa (68 % tinte u sredini) bi ugasio zar peci i
   zamutio svijetli studio. Telefon nosi samo gornji pojas za rijeci i
   prelaz u papir na dnu. Kontrast mjeri `takt-kontrast` na pikselima. */
.held[data-pfad="film"] .held__schleier,
.held[data-pfad="ruhe"] .held__schleier {
  background: linear-gradient(to bottom,
    color-mix(in oklab, #0b0906 46%, transparent) 0%,
    color-mix(in oklab, #0b0906 22%, transparent) 30%,
    transparent 46%,
    transparent 76%,
    color-mix(in oklab, var(--papier) 45%, transparent) 93%,
    var(--papier) 100%);
}
