/* =====================================================================
   VIDEO INTRO — izolovan modul, sve klase u `mmb-intro-*`.

   Sloj je PODRAZUMIJEVANO SAKRIVEN. Vidi se samo dok na `<html>` stoji
   klasa `mmb-intro-on`, koju dodaje JavaScript prije nego što se `<body>`
   iscrta — zato nema trzaja. Ako skripta ne odradi posao, klase nema i
   početna se ponaša kao da modul ne postoji: greška ne može zaključati
   sajt.

   Paleta prati identitet sajta: cijan i svijetloplava iz `tokens.css`,
   staklasti slojevi, vrlo tanke geometrijske linije. Bez sci-fi tona.
   ===================================================================== */

.mmb-intro {
  display: none;
  position: fixed; inset: 0; z-index: 9999;
  overflow: hidden;
  /* Sopstveni kontekst slaganja i izolovano crtanje. */
  isolation: isolate;
  contain: strict;
}

html.mmb-intro-on .mmb-intro { display: block; }

/* --------------------------------------------------------------- scena */

/*
 * OMOTAC KADRA.
 *
 * Nosi podlogu, poster, snimak i sve prekrivace — dakle sve sto u „portal“
 * izlazu treba da nestane. Pozdravni tekst, svjetlosni rub i dugme stoje
 * IZVAN njega, pa ih maska ne dodiruje.
 *
 * Podloga `#071A27` je namjerno ovdje, a ne na samom sloju: da ostane na
 * sloju, otvor bi otkrio nju umjesto pocetne strane.
 */
.mmb-intro__scene {
  position: absolute; inset: 0;
  background: #071A27;                 /* podloga prije nego video dekodira */
  isolation: isolate;
}

/* Dok je intro gore, stranica ispod se ne pomjera. */
html.mmb-intro-on, html.mmb-intro-on body { overflow: hidden; }

/* --------------------------------------------------------------- poster */

/*
 * PRVI VIDLJIVI KADAR.
 *
 * Ranije je poster stajao kao atribut na `<video>` elementu — a taj element
 * je do prvog frejma imao `opacity: 0`, pa se poster NIKAD nije vidio. Na
 * telefonu je zato nekoliko sekundi stajao samo tamni pravougaonik sa
 * mrežom, dok se snimak preuzimao.
 *
 * Sada je poster zaseban sloj ispod snimka, vidljiv od prvog trenutka, i
 * povlači se tek kad snimak stvarno krene.
 */
.mmb-intro__poster {
  position: absolute; inset: 0;
  background-color: #071A27;
  background-position: 50% 42%;
  background-size: cover;
  background-repeat: no-repeat;
  opacity: 1;
  transition: opacity 280ms var(--ease-out, cubic-bezier(.16, 1, .3, 1));
}

/*
 * Kad snimak krene, poster se povuče. Poster i prvi kadar snimka prikazuju
 * ISTI trenutak, pa je ovo pretapanje jednakih slika — 280 ms se ne vidi.
 * Ranije je poster bio kadar iz kasnijeg dijela snimka, pa se pri pokretanju
 * osjećao skok unazad.
 */
.mmb-intro.is-playing .mmb-intro__poster { opacity: 0; }

/* ---------------------------------------------------------------- video */
.mmb-intro__video {
  position: absolute; inset: 0;
  width: 100%; height: 100%;
  object-fit: cover;
  /* Kadar se drži malo iznad sredine — škola i ulaz ostaju u vidnom polju
     i na uskim ekranima, gdje `cover` najviše siječe po stranama. */
  object-position: 50% 42%;
  opacity: 0;
  /* Isto trajanje kao poster — dvije jednake slike se ukrštaju bez traga. */
  transition: opacity 280ms var(--ease-out, cubic-bezier(.16, 1, .3, 1));
  will-change: opacity;
}
.mmb-intro.is-playing .mmb-intro__video { opacity: 1; }

/* ------------------------------------------------------------- overlay */

/*
 * Tri sloja umjesto jedne crne prozirne ploče:
 *   1. plavo-cijan gradijent koji drži identitet,
 *   2. vinjeta koja smiruje ivice,
 *   3. fokus-maska koja se tokom introa steže prema sredini kadra.
 *
 * Sve mjere su u procentima, pa efekat ne zavisi ni od jednog piksela i
 * jednako radi na 21:9 i na 9:19.5 ekranu.
 */
/*
 * Zatamnjenje raste u tri koraka, umjesto da od prvog kadra bude puno:
 *   ~18 %  dok se prilazi skoli  — snimak se jasno vidi,
 *   ~26 %  dok se maska steze,
 *   ~36 %  pod pozdravnim tekstom, tek toliko da tekst bude citljiv.
 * Ranije je pocetak bio blizu 60 % i djelovao je kao prazan tamni ekran.
 */
.mmb-intro__wash {
  position: absolute; inset: 0;
  background:
    linear-gradient(180deg, rgba(7, 26, 39, .40) 0%, rgba(7, 26, 39, .04) 34%,
                            rgba(7, 26, 39, .08) 68%, rgba(7, 26, 39, .48) 100%),
    linear-gradient(118deg, rgba(18, 166, 172, .16) 0%, rgba(55, 133, 218, .10) 55%,
                            rgba(7, 26, 39, .14) 100%);
  mix-blend-mode: multiply;
  opacity: .58;
  transition: opacity 1100ms var(--ease-out, cubic-bezier(.16, 1, .3, 1));
}
.mmb-intro.is-focusing .mmb-intro__wash { opacity: .78; }
.mmb-intro.is-title    .mmb-intro__wash { opacity: 1; }

.mmb-intro__vignette {
  position: absolute; inset: 0;
  background: radial-gradient(124% 94% at 50% 46%,
    rgba(7, 26, 39, 0) 48%, rgba(7, 26, 39, .14) 80%, rgba(7, 26, 39, .34) 100%);
}

/*
 * Fokus prema školi. Sredina ostaje čista, periferija dobija plavi staklasti
 * ton. Prsten se tokom introa steže — pažnja se sama vodi ka ulazu, bez
 * ijedne fiksne koordinate.
 */
.mmb-intro__focus {
  position: absolute; inset: 0;
  background: radial-gradient(circle at 50% 45%,
    rgba(7, 26, 39, 0) 0%,
    rgba(7, 26, 39, 0) var(--mmb-intro-clear, 68%),
    rgba(12, 60, 84, .14) calc(var(--mmb-intro-clear, 68%) + 20%),
    rgba(7, 26, 39, .30) 100%);
  /*
   * Bez `backdrop-filter` — zamucivao je i sam snimak. Fokus se sada radi
   * iskljucivo gradijentom, pa skola ostaje ostra.
   */
  transition: background 1400ms var(--ease-out, cubic-bezier(.16, 1, .3, 1));
}
.mmb-intro.is-focusing .mmb-intro__focus { --mmb-intro-clear: 44%; }
.mmb-intro.is-title    .mmb-intro__focus { --mmb-intro-clear: 34%; }

/* Vrlo tiha mreža — geometrija, ne ekran mašine. */
.mmb-intro__grid {
  position: absolute; inset: -2px;
  background-image:
    repeating-linear-gradient(0deg,   rgba(200, 240, 248, .05) 0 1px, transparent 1px 76px),
    repeating-linear-gradient(90deg,  rgba(200, 240, 248, .05) 0 1px, transparent 1px 76px);
  opacity: 0;
  transition: opacity 900ms var(--ease-out, cubic-bezier(.16, 1, .3, 1));
}
html.mmb-intro-on .mmb-intro__grid { opacity: 1; }

/* --------------------------------------------------------------- tekst */
.mmb-intro__stage {
  position: absolute; inset: 0;
  display: grid; place-items: center;
  padding: 6vmin;
  text-align: center;
}

.mmb-intro__title,
.mmb-intro__school,
.mmb-intro__meta {
  opacity: 0;
  transform: translateY(14px) scale(.985);
  filter: blur(7px);
  transition: opacity 780ms var(--ease-out, cubic-bezier(.16, 1, .3, 1)),
              transform 780ms var(--ease-out, cubic-bezier(.16, 1, .3, 1)),
              filter 780ms var(--ease-out, cubic-bezier(.16, 1, .3, 1));
  will-change: opacity, transform, filter;
}

.mmb-intro__title {
  font-family: var(--f-head, sans-serif);
  font-weight: 800; letter-spacing: .16em;
  font-size: clamp(2.1rem, 8.4vw, 5.6rem);
  line-height: 1.04; color: #F4FAFC;
  text-shadow: 0 2px 30px rgba(7, 26, 39, .55);
  margin: 0;
}

.mmb-intro__school {
  font-family: var(--f-head, sans-serif);
  font-weight: 600; letter-spacing: .01em;
  font-size: clamp(.95rem, 2.5vw, 1.45rem);
  color: rgba(228, 246, 250, .92);
  margin: clamp(.7rem, 1.6vw, 1.1rem) 0 0;
}

.mmb-intro__meta {
  font-family: var(--f-head, sans-serif);
  font-weight: 500; letter-spacing: .22em; text-transform: uppercase;
  font-size: clamp(.62rem, 1.5vw, .78rem);
  color: rgba(178, 226, 236, .74);
  margin: clamp(.9rem, 2vw, 1.4rem) 0 0;
}

.mmb-intro.is-title  .mmb-intro__title,
.mmb-intro.is-school .mmb-intro__school,
.mmb-intro.is-meta   .mmb-intro__meta {
  opacity: 1; transform: none; filter: blur(0);
}

/* ---------------------------------------------- geometrijske linije */

/*
 * Dvije vodoravne i dvije uspravne niti oko naslova. Na kraju se razlete
 * prema ivicama i „otvore“ kadar — otud osjećaj otvaranja, a ne gašenja.
 */
.mmb-intro__lines { position: absolute; inset: 0; pointer-events: none; }
.mmb-intro__line {
  position: absolute;
  background: linear-gradient(90deg, transparent, rgba(120, 226, 236, .72), transparent);
  opacity: 0;
  transition: opacity 520ms var(--ease-out, cubic-bezier(.16, 1, .3, 1)),
              transform 780ms var(--ease-standard, cubic-bezier(.4, 0, .2, 1));
}
.mmb-intro__line--t, .mmb-intro__line--b { left: 50%; width: min(46vw, 520px); height: 1px; transform: translateX(-50%) scaleX(.16); }
.mmb-intro__line--t { top: calc(50% - clamp(4.6rem, 13vw, 8.4rem)); }
.mmb-intro__line--b { top: calc(50% + clamp(4.6rem, 13vw, 8.4rem)); }
.mmb-intro__line--l, .mmb-intro__line--r {
  top: 50%; width: 1px; height: min(30vh, 240px);
  background: linear-gradient(180deg, transparent, rgba(120, 226, 236, .55), transparent);
  transform: translateY(-50%) scaleY(.16);
}
.mmb-intro__line--l { left: calc(50% - min(30vw, 420px)); }
.mmb-intro__line--r { left: calc(50% + min(30vw, 420px)); }

.mmb-intro.is-lines .mmb-intro__line { opacity: 1; }
.mmb-intro.is-lines .mmb-intro__line--t,
.mmb-intro.is-lines .mmb-intro__line--b { transform: translateX(-50%) scaleX(1); }
.mmb-intro.is-lines .mmb-intro__line--l,
.mmb-intro.is-lines .mmb-intro__line--r { transform: translateY(-50%) scaleY(1); }

/* ------------------------------------------------------ dugme Preskoči */
.mmb-intro__skip {
  position: absolute; top: clamp(.8rem, 2.2vw, 1.5rem); right: clamp(.8rem, 2.2vw, 1.5rem);
  display: inline-flex; align-items: center; gap: .45rem;
  padding: .5rem .95rem; border-radius: 999px;
  font-family: var(--f-head, sans-serif); font-weight: 600; font-size: .82rem;
  letter-spacing: .04em; line-height: 1;
  color: #EAF7FA; cursor: pointer;
  background: rgba(233, 248, 252, .12);
  border: 1px solid rgba(198, 238, 246, .34);
  backdrop-filter: blur(9px) saturate(120%);
  transition: background var(--motion-fast, 220ms) var(--ease-standard, ease),
              border-color var(--motion-fast, 220ms) var(--ease-standard, ease),
              transform var(--motion-fast, 220ms) var(--ease-standard, ease);
}
.mmb-intro__skip:hover,
.mmb-intro__skip:focus-visible {
  background: rgba(233, 248, 252, .22);
  border-color: rgba(198, 238, 246, .62);
  transform: translateY(-1px);
}
/* Fokus mora biti vidljiv i na svijetlom i na tamnom kadru. */
.mmb-intro__skip:focus-visible {
  outline: 2px solid #C8F0F8;
  outline-offset: 3px;
}

/* ----------------------------------------------------- svjetlosni prelaz */

/*
 * Vrlo blag cijan/bijeli sjaj koji se siri iz sredine neposredno prije
 * pretapanja. Spaja tamniji snimak sa svijetlom pocetnom, pa se rez ne
 * osjeti. Nikad ne ide u bijelo — najvise 0,10 neprozirnosti.
 */
.mmb-intro__glow {
  position: absolute; inset: 0;
  background: radial-gradient(circle at 50% 46%,
    rgba(226, 250, 255, .10) 0%, rgba(150, 226, 240, .07) 38%, rgba(226, 250, 255, 0) 72%);
  opacity: 0;
  transform: scale(.72);
  transition: opacity 900ms var(--ease-out, cubic-bezier(.16, 1, .3, 1)),
              transform 1500ms var(--mmb-intro-ease, cubic-bezier(.22, 1, .36, 1));
  pointer-events: none;
}
.mmb-intro.is-glow .mmb-intro__glow { opacity: 1; transform: scale(1.25); }

/* ------------------------------------------------------------ izlazak */

/*
 * DVA IZLAZA, OBA JEDNOFAZNA.
 *
 *   PORTAL   (desktop, ako pretraživač zna masku i `@property`)
 *            U kadru se otvara rupa i kroz nju se ODMAH vidi stvarna
 *            početna strana — ona je već iscrtana ispod sloja. Rupa se
 *            širi dok ne pojede cijeli kadar. Nema međusloja u boji.
 *
 *   PRETAPANJE (telefon i svaki pretraživač bez podrške)
 *            Sloj tone u nulu, početna istovremeno ulazi iz nule. Čist
 *            crossfade, bez ijednog dodatnog efekta.
 *
 * Ranije je ovdje stajao dvostepeni izlaz sa bijelom kuglom u sredini. Ta
 * kugla je uklonjena u cijelosti: u živom testu se između snimka i sajta
 * osjećala kao poseban bijeli ekran. Sada nema nijednog trenutka u kojem je
 * ekran bijel.
 *
 * Trajanja su promjenljive na `<html>`, pa ih i sloj i početna čitaju iz
 * istog izvora.
 */
html.mmb-intro-on { --mmb-intro-b: 850ms; }
html.mmb-intro-on.mmb-intro-slow  { --mmb-intro-b: 800ms; }
html.mmb-intro-on.mmb-intro-quick { --mmb-intro-b: 520ms; }

.mmb-intro {
  opacity: 1;
  transform: scale(1);
  transition: opacity var(--mmb-intro-b, 850ms) var(--mmb-intro-ease, cubic-bezier(.22, 1, .36, 1)),
              transform var(--mmb-intro-b, 850ms) var(--mmb-intro-ease, cubic-bezier(.22, 1, .36, 1));
}

/* ---- zajedničko za oba izlaza ---- */

/*
 * Dugme odlazi ČIM izlazna tranzicija počne, da ne ostane da lebdi preko
 * početne. Poslije gašenja izlazi i iz reda za tabulator.
 */
.mmb-intro.is-opening .mmb-intro__skip,
.mmb-intro.is-portal .mmb-intro__skip {
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  transition: opacity 200ms var(--ease-out, cubic-bezier(.16, 1, .3, 1)),
              visibility 0s 200ms;
}

/* Niti odlete prema ivicama — one najavljuju otvaranje. */
.mmb-intro.is-opening .mmb-intro__line--t,
.mmb-intro.is-opening .mmb-intro__line--b,
.mmb-intro.is-portal .mmb-intro__line--t,
.mmb-intro.is-portal .mmb-intro__line--b { transform: translateX(-50%) scaleX(9); opacity: 0; }

.mmb-intro.is-opening .mmb-intro__line--l,
.mmb-intro.is-opening .mmb-intro__line--r,
.mmb-intro.is-portal .mmb-intro__line--l,
.mmb-intro.is-portal .mmb-intro__line--r { transform: translateY(-50%) scaleY(9); opacity: 0; }

/* ---- PRETAPANJE: sloj odlazi, početna dolazi ---- */

/*
 * Maska, vinjeta i sjaj se povuku u prvoj polovini prelaza, pa kadar
 * posvijetli prije nego što nestane — bez toga bi se tamna ploča gasila
 * preko svijetle početne.
 */
.mmb-intro.is-opening .mmb-intro__focus,
.mmb-intro.is-opening .mmb-intro__vignette,
.mmb-intro.is-opening .mmb-intro__grid,
.mmb-intro.is-opening .mmb-intro__glow {
  opacity: 0;
  transition: opacity calc(var(--mmb-intro-b, 850ms) * .6) var(--mmb-intro-ease, cubic-bezier(.22, 1, .36, 1));
}

.mmb-intro.is-opening {
  opacity: 0;
  transform: scale(1.02);
}

/*
 * Pozdrav se NE gasi zasebno — nestaje zajedno sa slojem, pa se osjeća sve
 * do kraja pretapanja.
 */


/* --------------------------------------------- portal izlaz (desktop) */

/*
 * PORTAL PRAVO U POČETNU.
 *
 * Maska se stavlja na `.mmb-intro__scene` — omotač koji nosi podlogu,
 * poster, snimak i sve prekrivače. Unutrašnjost maske je PROZIRNA, pa se
 * kroz otvor vidi tačno ono što je ispod sloja: stvarna početna strana.
 * Nema bijelog, nema ijedne boje između.
 *
 * Zašto omotač, a ne sam `.mmb-intro`: pozdravni tekst i svjetlosni rub
 * moraju OSTATI iznad otvora dok se on širi, pa stoje van maske. Da maska
 * ide na sam sloj, otvor bi pojeo i tekst već u prvih sto milisekundi.
 *
 * Radijus je registrovana promjenljiva — bez `@property` ne bi tekao nego
 * skakao.
 */
@property --mmb-portal {
  syntax: '<percentage>';
  inherits: true;
  initial-value: 0%;
}

html.mmb-intro-portal { --mmb-intro-portal: 700ms; }

/*
 * ZAŠTO RADIJUS IMA SVOJU KRIVU.
 *
 * Tražena kriva `cubic-bezier(.22, 1, .36, 1)` je vrlo prednja: radijus
 * pređe 93 % puta već poslije 300 ms. A pošto otvor raste po POVRŠINI, koja
 * ide sa kvadratom radijusa, kadar tada praktično više i nema — ostaju samo
 * četiri ugla. Izmjereno na 1920×1080, sa tom krivom se otvaranje vidi
 * 270 ms od 700, dakle 39 % prozora; ostatak je nevidljiv rep.
 *
 * `cubic-bezier(.45, .05, .35, 1)` drži kretanje kroz 490 ms, odnosno 70 %
 * prozora, a i dalje kreće odlučno. Preostalih 210 ms nije prazno: tada se
 * gase pozdrav (480–700 ms) i rub (518–700 ms), pa kretanje nigdje ne staje.
 *
 * Tražena kriva ostaje na pretapanju, na ulasku početne i na tekstu.
 */
html.mmb-intro-portal .mmb-intro {
  --mmb-portal: 0%;
  transition: --mmb-portal var(--mmb-intro-portal, 700ms) cubic-bezier(.45, .05, .35, 1);
}

/*
 * ZAŠTO TAČNO 100 %, I ZAŠTO TU NEMA ČEKANJA.
 *
 * `radial-gradient(circle at …)` bez zadate veličine koristi
 * `farthest-corner`: poluprečnik završnog oblika JESTE rastojanje do
 * najdaljeg ugla, a procenti u color-stopovima mjere se po toj dužini.
 * Ugao je zato uvijek tačno na 100 % — na 16:9, 21:9, 5:4, na uspravnom
 * tabletu, svejedno.
 *
 * Ovdje je unutrašnjost PROZIRNA, pa ugao treba da dostigne PRVI stop, a ne
 * drugi. Zbog toga je 100 % tačno dovoljno — ni piksel manje, ni više.
 *
 * A pošto se 100 % dostiže tek na samom kraju tranzicije, kretanje traje
 * punih 700 ms i nigdje ne staje. Kod bijele kugle je bilo obrnuto: ona je
 * morala preći 100 %, pa je pokrivenost padala prije kraja i ostajao je
 * nepomičan kadar. Tog kadra više nema.
 */
html.mmb-intro-portal .mmb-intro.is-portal .mmb-intro__scene {
  -webkit-mask-image: radial-gradient(circle at 50% 47%,
    transparent var(--mmb-portal), #000 calc(var(--mmb-portal) + 1.6%));
  mask-image: radial-gradient(circle at 50% 47%,
    transparent var(--mmb-portal), #000 calc(var(--mmb-portal) + 1.6%));
}

html.mmb-intro-portal .mmb-intro.is-portal { --mmb-portal: 100%; }

/* ---- pozdrav ---- */

/*
 * Tekst lebdi iznad otvora i tone tek u posljednjih 220 ms, tako da se
 * ugasi tačno kad otvor dođe do ivica.
 */
html.mmb-intro-portal .mmb-intro.is-portal .mmb-intro__stage {
  opacity: 0;
  transition: opacity 220ms var(--ease-out, cubic-bezier(.16, 1, .3, 1)) 480ms;
}

/* ---- svjetlosni rub otvora ---- */

/*
 * Rub prati isti radijus, pa uvijek stoji tačno na granici otvora. Boje su
 * iz palete sajta — cijan `#12A6AC`, svijetloplava `#3785DA` i vrlo
 * diskretna plavo-ljubičasta `#7E6CDE`, sve posvijetljeno. BIJELE NEMA.
 *
 * Jezgro ruba je široko 0,28 % poluprečnika: na 1920×1080 to je oko 3 px.
 * Oko njega ide vrlo mek sjaj, bez oštre ivice — staklo, ne neon.
 */
.mmb-intro__edge {
  position: absolute; inset: 0;
  pointer-events: none;
  opacity: 0;
}

html.mmb-intro-portal .mmb-intro__edge {
  background: radial-gradient(circle at 50% 47%,
    transparent calc(var(--mmb-portal) - 1.4%),
    rgba(96, 220, 228, .09) calc(var(--mmb-portal) - .55%),
    rgba(122, 226, 240, .32) calc(var(--mmb-portal) - .14%),
    rgba(120, 176, 236, .28) calc(var(--mmb-portal) + .14%),
    rgba(140, 124, 226, .11) calc(var(--mmb-portal) + .8%),
    transparent calc(var(--mmb-portal) + 2.2%));
}

/*
 * Rub se pojavi brzo, drži se dok se otvor širi, pa nestane do samog kraja
 * — čim početna izađe u cijelosti, ruba više nema.
 */
html.mmb-intro-portal .mmb-intro.is-portal .mmb-intro__edge {
  animation: mmb-intro-rub var(--mmb-intro-portal, 700ms) linear both;
}

@keyframes mmb-intro-rub {
  0%   { opacity: 0; }
  14%  { opacity: 1; }
  74%  { opacity: 1; }
  100% { opacity: 0; }
}

/* ------------------------------------------------- pocetna ispod sloja */

/*
 * Početna kreće iz NULE, ne iz .88. Prije je bila skoro potpuno vidljiva već
 * na prvom frejmu prelaza, pa se preklapala sa snimkom.
 *
 * Zašto se pomjeraju djeca `body`, a ne `body`: `transform` na `body` napravio
 * bi od njega blok-kontejner za `position: fixed`, pa bi i sam sloj upao u tu
 * transformaciju i pretapanje bi se poništilo. `transform-origin` na vrhu
 * drži gornju ivicu na mjestu — nema pomaka rasporeda.
 */
html.mmb-intro-out body > *:not(.mmb-intro) {
  transform-origin: 50% 0;
  animation: mmb-intro-smiraj var(--mmb-intro-b, 850ms)
             var(--mmb-intro-ease, cubic-bezier(.22, 1, .36, 1)) both;
}

@keyframes mmb-intro-smiraj {
  from { opacity: 0; transform: scale(.995); }
  to   { opacity: 1; transform: none; }
}

/*
 * Dok je sloj gore, mjesto za traku za pomjeranje se rezerviše. Bez toga bi
 * se pri otključavanju stranica suzila za širinu trake — vidljiv trzaj tačno
 * u trenutku prelaza.
 */
html.mmb-intro-on { scrollbar-gutter: stable; }

/* ----------------------------------------------------------- telefoni */
@media (max-width: 640px) {
  .mmb-intro__video { object-position: 50% 40%; }
  .mmb-intro__poster { background-position: 50% 40%; }
  .mmb-intro__grid { background-size: 54px 54px; }

  /*
   * Naslov je bio pretezak za uski kadar i sjekao je fasadu. Smanjen je oko
   * 13 % (11vw -> 9.6vw), a naziv skole je podignut, pa je razlika izmedju
   * njih pala sa ~2,8x na ~2,3x. Tekst sada djeluje kao dio kadra, a ne kao
   * ploca preko njega.
   */
  .mmb-intro__title { letter-spacing: .12em; font-size: clamp(1.75rem, 9.6vw, 2.6rem); }
  .mmb-intro__school { font-size: clamp(1.02rem, 4.2vw, 1.22rem); }
  .mmb-intro__meta { font-size: clamp(.6rem, 2.6vw, .72rem); }

  /*
   * Kompozicija se spusta nize u kadar — iznad nje ostaje skola, ispod
   * prilaz. Sigurna margina sa strane je 7vw, pa naslov nikad ne dodiruje
   * ivicu ekrana.
   */
  .mmb-intro__stage { padding-inline: 7vw; }
  .mmb-intro__stage > div { transform: translateY(7vh); }

  /* Linije prate tekst, da ne uokviruju prazan dio kadra. */
  .mmb-intro__lines { transform: translateY(7vh); }

  .mmb-intro__line--t, .mmb-intro__line--b { width: min(72vw, 340px); }
  .mmb-intro__line--l { left: calc(50% - min(42vw, 200px)); }
  .mmb-intro__line--r { left: calc(50% + min(42vw, 200px)); }
  .mmb-intro__line--l, .mmb-intro__line--r { height: min(24vh, 170px); }

  /* Svjetlosni prelaz se na telefonu ne crta — davao je mliječnu sliku. */
  .mmb-intro__glow { display: none; }
}

/* Vrlo uski telefoni — naslov ne smije prelaziti u dva neuredna reda. */
@media (max-width: 380px) {
  .mmb-intro__title { font-size: clamp(1.58rem, 8.9vw, 2.1rem); letter-spacing: .08em; }
  .mmb-intro__school { font-size: clamp(.96rem, 4vw, 1.1rem); }
  .mmb-intro__stage > div, .mmb-intro__lines { transform: translateY(6vh); }
}

/*
 * Korisnik koji traži manje kretanja intro uopšte ne dobija — o tome
 * odlučuje JavaScript prije nego što išta prikaže. Ovo je samo zaštitni
 * sloj ako sistemska postavka stigne kasnije.
 */
@media (prefers-reduced-motion: reduce) {
  .mmb-intro { display: none !important; }
  html.mmb-intro-on, html.mmb-intro-on body { overflow: auto; }
}
