/* Touch feel (05.10.2026, Moti approved): Emil Kowalski's interaction principles, shared by every page.
   1. press feedback: interactive elements dip to 97% the moment they are pressed
   2. hover lifts only on devices that really hover (no "stuck" cards on phones)
   3. pop-ups toggled with [hidden] enter from 95% + fade, fast, with a sharp ease-out (sheets that slide by transform keep their own motion) */
:root{--ease-out:cubic-bezier(.23,1,.32,1)}
.btn,.ac__it,.ac__tab,.ac__all,.ac__vid,.vault__l,.q,.kh__c,.shield,.type,.chip,.nav__c,.mbar a,.m-sheet a,
#botFallback,.bf__btn,.lsug button,.lsug a,.cgs-tog,.sfx a,button,[role=button]{
  -webkit-tap-highlight-color:transparent}
.btn:active,.ac__it:active,.ac__tab:active,.ac__all:active,.ac__vid:active,.q:active,.kh__c:active,.type:active,.chip:active,
.nav__c:active,.mbar a:active,.m-sheet a:active,#botFallback:active,.lsug button:active,.cgs-tog:active,
.lead__send:active,.bk__go:active,.th__btn:active,.top__talk:active,.top__cta:active,.pv__tabs button:active,.lead__x:active,.bk__x:active,.pv__x:active,.tv__x:active,.a11y-c:active,.cc__row button:active,#cgcc button:active,.lead__m input:active+span,.bk__m input:active+span,.faq summary:active,.film__play:active span,.film__again:active,.c-bar a:active,.ix .q:active,.kh__c:active{transform:scale(.97)!important;transition:transform .12s var(--ease-out)!important}
/* hover lifts belong to mice: on touch screens they are cancelled */
@media (hover:none){
  .btn:hover,.ac__it:hover,.kh__c:hover,.q:hover,.type:hover,#botFallback:hover{transform:none}
  .ac__vid:hover img,.q:hover img,.kh__c:hover img{transform:none}
}
/* sheets and dialogs: from 95% with a fade, never from nothing */
@keyframes feelIn{from{opacity:0;transform:scale(.95)}to{opacity:1;transform:none}}
@keyframes feelUp{from{opacity:0;transform:translateY(16px) scale(.98)}to{opacity:1;transform:none}}
#askp:not([hidden]){animation:feelIn .22s var(--ease-out) both;transform-origin:50% 100%}
#sheet:not([hidden])>*{animation:feelUp .24s var(--ease-out) both}
@media (prefers-reduced-motion:reduce){
  .btn:active,.ac__it:active,.ac__tab:active,.ac__all:active,.ac__vid:active,.q:active,.kh__c:active,.type:active,.chip:active,
  .lead__send:active,.bk__go:active,.th__btn:active,.top__talk:active,.top__cta:active,.pv__tabs button:active,.lead__x:active,.bk__x:active,.pv__x:active,.tv__x:active,.a11y-c:active,.cc__row button:active,#cgcc button:active,.lead__m input:active+span,.bk__m input:active+span,.faq summary:active,.film__play:active span,.film__again:active,.c-bar a:active,.nav__c:active,.mbar a:active,.m-sheet a:active,#botFallback:active,.lsug button:active,.cgs-tog:active{transform:none!important}
  #askp,#sheet>*{animation:none!important}
}

/* 05.10 (Emil Kowalski audit) · touch: hover effects never stick after a tap, no blue tap flash, no double-tap zoom on
   controls, and a long press on a button does not select its label. Desktop is untouched. */
@media (hover:none){
  .u:hover:not(:focus-visible) b,.gcard:hover,.gcard:hover .gcard__img img,.school:hover,a.card:hover,.toc li a:hover,.nav__c:hover,
  .fin figure:hover img,.dayc:hover img,.wb__c:hover img,.press2__img:hover img,.film__play:hover span,.btn--blue:hover,.btn--ghost:hover,
  .btn--blue:hover i,.type:hover,.kh__c:hover,.q:hover,.navbtn:hover{transform:none!important}
}
html{-webkit-tap-highlight-color:transparent;-webkit-text-size-adjust:100%;text-size-adjust:100%}
a,button,summary,label,[role=button],.u{touch-action:manipulation}
.btn,.mbar a,.c-bar a,.bk__m span,.lead__m span,.bk__go,.lead__send,.sh,.film__play,.navbtn,.u{-webkit-user-select:none;user-select:none;-webkit-touch-callout:none}

/* Package C, unify + polish (05.10.2026, Emil Kowalski review). One system across the site:
   one primary button (blue gradient, white, 800), one close button (44px outlined circle), one error colour,
   one focus ring, and the field at fault is marked, not only the message. */
:root{--cg-err:#FF8A8A;--cg-ring:#8EC0EA}
::selection{background:rgba(70,138,199,.55);color:#fff}
input,textarea{caret-color:#468AC7}
:focus-visible{outline:2px solid var(--cg-ring);outline-offset:3px}
/* primary buttons that were still flat (thank-you page, day page, Knowledge Hub top button) */
.th__btn:not(.th__btn--g),.btn--blue,.mbar a.main,.top__talk{background:linear-gradient(180deg,#5598D2,#3B7AB3);color:#fff;font-weight:800}
.th__btn:not(.th__btn--g){box-shadow:0 12px 34px rgba(70,138,199,.32)}
.top__talk{border-radius:14px}
/* close buttons: the same 44px outlined circle everywhere */
.lead__x,.pv__x{display:grid;place-items:center;width:44px;height:44px;border-radius:50%;border:1px solid rgba(255,255,255,.18);background:transparent;color:#fff;font-size:24px;line-height:1;font-family:inherit;font-weight:400}
@media (hover:hover){.lead__x:hover,.pv__x:hover,.bk__x:hover{background:rgba(255,255,255,.08)}}
/* field-level errors */
.lead__f:has([aria-invalid=true]){border-color:var(--cg-err)}
.bk__f input[aria-invalid=true]{border-color:var(--cg-err);box-shadow:0 0 0 3px rgba(255,138,138,.18)}
.lead__err,.bk__err{color:var(--cg-err)}

/* Desktop review (05.10.2026, Emil Kowalski, desktop pass). Shared by every page, all languages. */
/* 1 · the hidden language suggestion leaves the Tab order (it was focusable while invisible) */
.lsug:not(.on){visibility:hidden;transition:opacity .5s,transform .5s,visibility 0s .5s}
.lsug.on{visibility:visible}
/* 5 · while a cookie banner is open, the accessibility button moves up and never touches it */
@media (min-width:768px){html:has(#cc:not([hidden])) .a11y-b,html:has(#cgcc) .a11y-b{top:28%}}
/* 6 · desktop: the chat bubble is a 56px circle; its label slides out on hover / keyboard focus */
@media (min-width:1024px) and (hover:hover){
  html #botFallback{gap:0!important;padding:6px!important}
  html #botFallback .bf__t{max-width:0;opacity:0;overflow:hidden;white-space:nowrap;margin:0;transition:max-width .25s var(--ease-out),opacity .18s,margin .25s var(--ease-out)}
  html #botFallback:hover .bf__t,html #botFallback:focus-visible .bf__t{max-width:380px;opacity:1;margin-inline:12px 16px}
}
/* 8 · the menu and accessibility buttons answer the press like every other button */
.navbtn__l{transition:background-color .18s,border-color .18s,transform .3s var(--ease-out),scale .12s var(--ease-out)}
.navbtn:active .navbtn__l{scale:.94}
.a11y-b{transition:background-color .18s,scale .12s var(--ease-out)}
@media (hover:hover){.a11y-b:hover{background:#5598D2}}
.a11y-b:active{scale:.94}
/* 10 · one shape for the main buttons: 14px corners everywhere (no pills, no 6px) */
.btn,.top__cta,.top__talk,.th__btn,.mbar a.main,.bk__go{border-radius:14px}
/* 11 · chapter captions: the old one leaves fast, the new one comes in a beat later (no double text) */
.ch:not(.on){transition:opacity .22s var(--ease-out),transform .22s var(--ease-out)}
.ch.on{transition-delay:.12s}
/* 12 · exits ease out, fast: the menu closes in 260ms, the meeting form in 200ms */
.nav:not(.is-open){transition:clip-path .26s var(--ease-out)}
.lead:not(.open){transition:opacity .2s var(--ease-out)}
.lead:not(.open) .lead__box{transition:transform .2s var(--ease-out)}
.lead.open{transition:opacity .25s var(--ease-out)}
.lead.open .lead__box{transition:transform .32s cubic-bezier(.32,.72,0,1)}
/* 13 · hovers say "you can click this", and only that */
.faq summary,.dl,.step .tag,.sfx a,.foot a,a.num{transition:color .15s,border-color .15s}
@media (hover:hover){
  .faq summary:hover{color:#7DB4E6}
  .dl:hover{border-bottom-color:currentColor}
  a.step .tag:hover,.step a.tag:hover{border-color:#468AC7;color:#fff}
  .sfx a:hover,.foot a:hover,a.num:hover{color:#7DB4E6}
}
.u.sold:hover .num,.u.sold:hover b{transform:none!important}
.press2__img img,.ac__vid img{transition-duration:.5s}
.dayc img{transition-duration:.6s}
/* 15 · balanced headline in the meeting form */
.lead__pitch h2,.lead__form h3{text-wrap:balance}
/* 7 · the homepage meeting form matches the meeting sheet: filled fields, rounded box (the white send button with the C stays) */
.lead__f{border:0!important;margin-bottom:10px}
.lead__f input{min-height:52px;padding:0 16px;border-radius:12px;border:1px solid rgba(255,255,255,.2);background:rgba(255,255,255,.06);transition:border-color .15s}
.lead__f:focus-within input{border-color:#468AC7}
.lead__f:has([aria-invalid=true]) input{border-color:var(--cg-err);box-shadow:0 0 0 3px rgba(255,138,138,.18)}
@media (min-width:768px){.lead__box{border-radius:24px}}
/* 14b · glows, the composited way (05.10, desktop review): pulses move only opacity and transform on a pre-drawn halo,
   never box-shadow / filter / a custom property per frame. Same look, nothing repainted every frame. */
@keyframes cgOut{50%{opacity:0}}
@keyframes cgDim{50%{opacity:.35}}
@keyframes cgPing{0%{opacity:.85;transform:scale(1)}70%,100%{opacity:0;transform:scale(2.1)}}
@keyframes cgShine{0%,40%{background-position:100% 0}90%,100%{background-position:0 0}}
@keyframes cgTurn{to{transform:rotate(360deg)}}
/* the amber location dot in the opening pill: the same breathing dot + ring as every other pill */
.hero-ch .pill i{animation:pillDot 2.2s ease-in-out infinite!important}
/* the blinking map dot: the dot dims (opacity), its glow is a halo that fades (opacity) */
.bm__dot{animation:cgDim 1.6s ease-in-out infinite!important;box-shadow:0 0 6px rgba(70,138,199,.3)!important}
.bm__dot::after{content:"";position:absolute;inset:-4px;border-radius:50%;box-shadow:0 0 24px rgba(70,138,199,.9);animation:cgOut 1.6s ease-in-out infinite;pointer-events:none}
/* the green "online" dot on the chat bubble: a ring that grows and fades (transform + opacity) */
html #botFallback .bf__ava i{animation:none!important;box-shadow:none!important}
html #botFallback .bf__ava i::after{content:"";position:absolute;inset:-2px;border-radius:50%;background:rgba(59,165,92,.55);animation:cgPing 2.4s ease-out infinite;pointer-events:none}
/* the footer credit shine: the light still crosses the letters, without a drop-shadow animating with it */
.foot__cr b{animation-name:cgShine!important;filter:none!important}
/* the turning light around the closing card: a conic layer that rotates (transform) inside a fixed ring mask */
.close2__card::before{display:none!important}
.c2ring{position:absolute;inset:0;border-radius:24px;padding:1.5px;pointer-events:none;overflow:hidden;
  -webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);-webkit-mask-composite:xor;mask-composite:exclude}
.c2ring::before{content:"";position:absolute;left:50%;top:50%;width:2400px;height:2400px;margin:-1200px 0 0 -1200px;
  background:conic-gradient(rgba(70,138,199,.15),rgba(70,138,199,.95) 12%,rgba(70,138,199,.15) 26%,rgba(70,138,199,.15) 60%,rgba(255,255,255,.7) 72%,rgba(70,138,199,.15) 84%);
  animation:cgTurn 6s linear infinite;will-change:transform}
@media (prefers-reduced-motion:reduce){.bm__dot,.bm__dot::after,html #botFallback .bf__ava i::after,.foot__cr b,.c2ring::before,.hero-ch .pill i{animation:none!important}}
/* 10b · one height for buttons in the page body: 58px (the top bar's are 44px). Label + icon centred, no padding-made heights. */
.btn,.th__btn,.tz__go,.tz__ask,.ty-hero__cta,.ty-lx__cta,.bk__go,.lead__send{min-height:58px!important;padding-block:0!important;box-sizing:border-box}
.btn,.th__btn,.tz__go,.tz__ask,.ty-hero__cta,.ty-lx__cta{display:inline-flex;align-items:center;justify-content:center}
.tz__go,.tz__ask,.ty-lx__cta{border-radius:14px!important}
.btn>i{flex:none}
/* filter chips and tags: at least a finger's 44px */
.chip,.pr-chip,.tag{min-height:44px}
/* 15 · 05.10 full scan, tablets (touch, 768px and up) */
/* the chat bubble is a 56px circle, so it never sits on a villa card's price */
@media (min-width:768px){
  html #botFallback{gap:0!important;padding:6px!important}
  html #botFallback .bf__t{max-width:0;opacity:0;overflow:hidden;white-space:nowrap;margin:0}
}
/* the chapter rail is a mouse aid: on touch its invisible labels caught taps meant for the page */
@media (hover:none){.srail{display:none!important}}
/* touch targets: 44px on every touch screen, not only under 767px */
@media (hover:none){
  .sfx__l a,#ccReopen,.foot__l a,a.dl{display:inline-flex;align-items:center;min-height:44px}
  #map .u::before{inset:-14px -6px}
}
/* 16 · 05.10 full scan: the opening's place label wraps on phones instead of running off the screen (en/de/fr/ru) */
@media (max-width:767px){.hero-ch .pill{white-space:normal!important;max-width:100%;border-radius:18px;line-height:1.3}}
/* 17 · 05.10 full scan: the location map on tablets (768-1180px). The card grows by a band at the bottom and the map
   moves up into the rest, so the three facts sit in one row in that band, under the map, and cover no chip.
   In portrait, chips on the right open inward (as on phones) and drop their second line, so they stay inside the card.
   No font is made smaller. */
@media (min-width:768px) and (max-width:1180px){
  .bm{height:calc(min(92svh,1000px) + 140px)}
  .bm__in{top:calc(50% - 70px)}
  .bm__facts{bottom:50px;left:18px;right:18px;flex-direction:row;flex-wrap:wrap;gap:8px}
  .bm__fh{flex-basis:100%}
}
@media (min-width:1024px) and (max-width:1180px){.bm__facts{left:max(24px,calc(50vw - 590px))}}
@media (min-width:768px) and (max-width:1023px){
  /* the map is a square as wide as the card (the script sizes it to the card's height, which cut its sides),
     and the card continues below it with the facts in one row and the legend */
  .bm{height:auto;padding-bottom:52px}
  .bm__in{position:relative;left:auto;top:auto;transform:none;width:100%!important;height:auto!important;aspect-ratio:1/1}
  .bm__facts{position:relative;inset:auto;margin:6px 18px 8px;flex-wrap:wrap}
  .bm__facts>div{flex:1 1 0;min-width:0}
  .bm__poi--R:not([data-i="1"]) .bm__lab{left:auto;right:20px}
  .bm__lab span{display:none}.bm__lab b{white-space:normal;max-width:19ch}
}
/* 18 · 05.10 full scan: About, tablets in landscape - the partners' photo stays next to the headline instead of
   sinking to the bottom of a hero taller than the screen */
@media (min-width:900px) and (max-width:1180px) and (orientation:landscape){
  .hero > .hero__ph{top:0;bottom:auto;max-height:100svh}
}
/* at 1024 the photo is narrower, so it stays clear of the paragraph and the founders' caption */
@media (min-width:900px) and (max-width:1099px) and (orientation:landscape){.hero > .hero__ph{width:40%}}
/* 19 · 05.10 full scan, polish */
/* every pressable thing answers the press the same way */
.c-pill,.sh,.ask,.sfx__ck,.foot__ck,.ty-hero__cta,.ty-lx__cta,.ty-card,.ty-quiz__opt,.tz__go{transition:transform .12s var(--ease-out)}
.c-pill:active,.sh:active,.ask:active,.sfx__ck:active,.foot__ck:active,.ty-hero__cta:active,.ty-lx__cta:active,.ty-card:active,.ty-quiz__opt:active,.tz__go:active{transform:scale(.97)}
@media (hover:hover){.tz__go:hover{filter:brightness(1.08)}}
/* the round menu button: hover and the icon's morph under 250ms; a round focus ring around the circle */
.navbtn__l{transition:background-color .2s,border-color .2s,transform .2s var(--ease-out)!important}
.navbtn__l i{transition:transform .22s var(--ease-out),width .22s var(--ease-out),top .22s var(--ease-out)!important}
#navBtn:focus-visible{outline:none}
#navBtn:focus-visible .navbtn__l{outline:3px solid #FFBC7D;outline-offset:3px}
/* About: once a card has appeared, its hover lift is quick (it used to inherit the 0.9s reveal) */
.card.rv.in{transition:opacity .9s cubic-bezier(.2,.7,.2,1),transform .2s var(--ease-out),border-color .2s}
/* keyboard: Tab never waits on a smooth scroll, and a focused card is shown at once */
html:has(:focus-visible){scroll-behavior:auto!important}
.rv:focus-within{opacity:1!important;transform:none!important}
/* small labels that carry meaning are 15px at least (sizes only go up) */
.close2__who small{font-size:15.5px}
.nav__qk h3{font-size:15px}
.kick{font-size:15px}
/* touch targets */
.shd__lg{min-height:44px;justify-content:center}
.sh{min-height:44px}
.lead a[href^="tel:"]{display:inline-flex;align-items:center;min-height:44px}
.ty-dot{position:relative}.ty-dot::after{content:"";position:absolute;inset:-18px -8px}
/* touch screens: no keyboard hint, and the play mark on course cards is always shown */
@media (hover:none){.cgs__box kbd{display:none}.ty-card__play{opacity:1;transform:none}}
/* 20 · 05.10 full scan: the three villa types on tablets in portrait - one card across, two under it,
   so buttons and prices stay on one line (three columns of ~214px broke them) */
@media (min-width:768px) and (max-width:899px){
  .types{grid-template-columns:1fr 1fr!important}
  .types>:first-child{grid-column:1/-1}
}
/* 21 · 05.10 rescan: the page name in the top bar is a link on the hub pages; on touch it gets a 44px target */
@media (hover:none){a.shd__ctx{padding-top:9px;padding-bottom:16px}}
/* 22 · 05.10: About card pictures zoom on hover in 0.3s (was 1.2s); the footer credit's small line is at least 12.5px */
.card__img img{transition:transform .3s var(--ease-out)!important}
.sfx__cr3,.foot__cr3{font-size:max(.9em,12.5px)}
/* 23 · 05.10 full scan: the last layout animations move to transform (Emil: animate only transform and opacity) */
.bars i{width:var(--w)!important;transform:scaleX(0);transform-origin:left center;transition:transform 1.2s cubic-bezier(.2,.7,.2,1)!important}
[dir=rtl] .bars i{transform-origin:right center}
.why__cmp.in .bars i{transform:none}
.ac__rail i{width:100%!important;transform:scaleX(0);transform-origin:left center;transition:transform 1s cubic-bezier(.2,.7,.2,1)!important}
[dir=rtl] .ac__rail i,.ac[dir=rtl] .ac__rail i{transform-origin:right center}
.hero--show .glint::before{animation-name:glintT!important}
@keyframes glintT{0%{transform:translateX(0)}22%,100%{transform:translateX(500%)}}
.ty-voices__who i::after{width:100%!important;transform:scaleX(0);transform-origin:left center}
[dir=rtl] .ty-voices__who i::after{transform-origin:right center}
.ty-voices__who.is-run i::after{animation-name:voiceBarT!important}
@keyframes voiceBarT{to{transform:scaleX(1)}}
/* 24 · 05.10 full scan: the lead form on tablets in landscape - a narrower title column and less padding,
   so the fields and "or call us" fit the screen height (no font gets smaller) */
@media (min-width:900px) and (max-width:1180px) and (orientation:landscape) and (max-height:860px){
  .lead__box{grid-template-columns:4fr 7fr!important;gap:32px!important;padding:30px 36px 22px!important;max-height:calc(100svh - 24px)}
}

/* 25 · 06.10 audit package A (Moti approved) */
/* A1 · on touch, the press wins over the hover reset above (same specificity, later in file, it was cancelling .btn--blue/.btn--ghost/.type press) */
@media (hover:none){
  html .btn:active,html .btn--blue:active,html .btn--ghost:active,html .type:active,html .kh__c:active,html .q:active,html .nav__c:active,html .ac__it:active,html .ac__tab:active{transform:scale(.97)!important}
  html .btn--blue:active i{transform:none!important}
}
/* A4 · the hovers that still lifted / slid after a tap on phones */
@media (hover:none){
  .wb__c:hover,.wb__c:not(.has-img):hover,.ac__all:hover i,.navbtn:hover .navbtn__l i,#botMini .bm2__qs button:hover,.vault__l:hover,.ac__vid:hover img,.press2__img:hover img,.card:hover,.card__img:hover img{transform:none!important}
  .navbtn:hover .navbtn__l i:last-child{width:auto}
  .ac__it:hover{border-color:var(--line-soft,rgba(255,255,255,.09));background:var(--bg2,#121212)}
  .btn--blue:hover{box-shadow:none}
}
/* A5 · a list that reaches its end inside a sheet / chat / form stops there instead of scrolling the page behind */
.m-sheet,.c-sheet,.lead__box,.lead__form,#botMini .bm2__body,#askp,.nav__panel{overscroll-behavior:contain}
/* A6 · the menu opens in 0.4s and its shortcuts are readable at once (was 0.62s + 0.6s wait) */
.nav.is-open{transition:clip-path .4s cubic-bezier(.32,.72,0,1)!important}
.nav__c,.nav__human,.nav__qk{transition-duration:.3s,.3s,.3s,.3s}
.nav.is-open .nav__c,.nav.is-open .nav__human{transition-delay:calc(.08s + var(--d,0) * .04s),calc(.08s + var(--d,0) * .04s),0s,0s}
.nav.is-open .nav__qk{transition-delay:.25s}
/* A7 · bars that hide / return on every change of scroll direction: a quarter second */
.mbar,.c-bar,.m-pill{transition-duration:.24s!important;transition-timing-function:var(--ease-out)!important}
@media (prefers-reduced-motion:reduce){html .btn:active,html .btn--blue:active,html .btn--ghost:active,html .type:active,html .kh__c:active,html .q:active,html .nav__c:active,html .ac__it:active,html .ac__tab:active{transform:none!important}}

/* 26 · 06.10 audit B2 (Moti approved): the two-line white/blue headline is kept for the key moments only
   (protection, price, closing - ro: protection, buying, closing). Every other section headline reads as one flowing line,
   the blue phrase continuing on the same line. No font size changes. */
#hInside .hl,#hFilm .hl,#hTypes .hl,#hTour .hl,#hPlace .hl,#hWhy .hl,#hJourney .hl,#hAvail .hl,#hTeam .hl,#hPress .hl,
#hAcademy .hl,#hHub .hl,#hFaq .hl,#hCasa .hl,#hViata .hl{display:inline!important}
#hInside .hl::before,#hFilm .hl::before,#hTypes .hl::before,#hTour .hl::before,#hPlace .hl::before,#hWhy .hl::before,#hJourney .hl::before,
#hAvail .hl::before,#hTeam .hl::before,#hPress .hl::before,#hAcademy .hl::before,#hHub .hl::before,#hFaq .hl::before,#hCasa .hl::before,#hViata .hl::before{content:" "}

/* 27 · 06.10 audit B4 (Moti approved): a calmer opening frame on desktop.
   No scroll cue, no stat block in the corner, the price sits on its own line under the button,
   and the language suggestion waits until the cookie banner is answered (never two notices at once). */
.hint,.hstat{display:none!important}
.hero-ch .hero-row{flex-direction:column;align-items:flex-start;gap:14px}
.hero-ch .hero-row .btn{order:-1}
html:has(#cc:not([hidden])) .lsug,html:has(#cgcc) .lsug{display:none!important}
a.foot__geo,a.sfx__geo{text-decoration:none;border-bottom:1px solid rgba(155,162,170,.45);display:inline-flex;align-items:center;min-height:44px} @media (hover:hover){a.foot__geo:hover,a.sfx__geo:hover{color:#7DB4E6}}

/* 28 · 06.10 phone speed check: until the script builds the opening reel, its section holds one screen,
   so the rest of the page never flashes on top for the first second and then jumps away (layout shift 1.0 on phones) */
.reel:empty{min-height:100svh}
