/* css/layout.css */

/* ==========================================================================
   🚀 HLAVNÝ KONFIGURÁTOR - PEVNÝ POMER STRÁN 16 : 9 (Absolute Overlays)
   ========================================================================== */
/*
 * Presne 16:9 - rovnaký pomer ako majú fasádne JPG obrázky (1920x1080) aj
 * biely orámovaný rám v host-demo.html (.configurator-frame-wrapper).
 * Vďaka zhode pomerov sa obrázok vždy vyplní presne, bez orezania a bez
 * medzier, žiadny prepočet crop-offsetu pre percentuálne súradnice pinov
 * nie je potrebný - fungujú priamo (Suradnica_X/Y ÷ 1920/1080 × 100%).
 *
 * Aspect ratio sa počíta voči SKUTOČNÉMU kontajneru (.app-padding, cez
 * cqw/cqh), nie voči window/browser viewportu. Šírka aj výška vychádzajú
 * z toho, čo sa reálne zmestí do iframu; pri zmene šírky iframu sa výška
 * automaticky prispôsobí (žiadna pevná desktopová hodnota, žiadny
 * hardcoded 1920x1080 layout).
 */
:root {
    /* Zdieľaná medzera medzi logo boxom a filter panelom (ľavá strana,
       16px top loga + ~38px výška loga + 18px = 72px top filtra) aj
       medzi 'Prémiová Rezidencia' a 'Dostupné byty' panelmi (pravá
       strana) - obe strany musia byť vizuálne konzistentné. */
    --panel-gap: 18px;
    /* Horizontálny padding tlačidiel spodného radu dimenzovaných podľa
       textu - .view-btn v režime .pohlady-viac a zdieľané tlačidlá
       (VÝBER BLOKU/MAPA, VR/GALÉRIE) pri K>1 (.ui-k-aktivne, nižšie).
       Jeden zdroj pravdy pre hodnotu. */
    --bottom-row-btn-padding-x: calc(12px * var(--ui-scale-kompenzacia, 1));
}

#app.configurator-ratio {
    position: relative; /* Kritické pre plávanie panelov nad celoobrazovkovým domom */
    aspect-ratio: 16 / 9;
    width: min(100cqw, 100cqh * 16 / 9);
    height: min(100cqh, 100cqw * 9 / 16);
    max-width: 100%;
    max-height: 100%;
    background: var(--app-background);
    overflow: hidden;
    font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
    -webkit-font-smoothing: antialiased;

    /* Vlastný query kontajner - vnútorné panely (filter, zoznam bytov,
       spodná lišta) tak môžu reagovať na SKUTOČNÚ šírku/výšku konfigurátora
       (napr. v úzkom iframe), nie iba na window viewport. */
    container-type: size;
    container-name: configurator;
}

/* ==========================================================================
   🎬 PRECHOD MEDZI HLAVNÝM KONFIGURÁTOROM A POHĽADOM OKOLIE
   #main-configurator-view zoskupuje fasádnu scénu + celé bežné UI (filter,
   pravý panel, spodná lišta, info/Okolie ikonky) do JEDNÉHO animovaného
   celku - kríženie s #okolie-overlay (css/okolie.css) riadi js/okolie.js
   pridaním/odobraním .mcv-hidden na tomto elemente. Logo (#app-logo) je
   ZÁMERNE MIMO tejto skupiny (index.html) - nemení sa, viditeľné vždy
   rovnako, nezávisle od prechodu (nezmenená požiadavka z predošlého
   zadania OKOLIE).
   ========================================================================== */
#main-configurator-view {
    position: absolute;
    inset: 0;
    transform-origin: center center;
    transition: transform 0.65s cubic-bezier(0.4, 0, 0.2, 1),
                opacity 0.65s cubic-bezier(0.4, 0, 0.2, 1),
                filter 0.65s cubic-bezier(0.4, 0, 0.2, 1);
}

/* Stav počas otvoreného OKOLIE (aj v priebehu prechodu do/z neho) -
   zväčšenie + vyblednutie + rozmazanie presne podľa zadania. */
#main-configurator-view.mcv-hidden {
    transform: scale(1.15);
    opacity: 0;
    filter: blur(6px);
    pointer-events: none;
}

/* ==========================================================================
   🖥️ "CHROME" appky (filter/pravý panel/lišta pohľadov) - SAMOSTATNÝ
   animovaný wrapper, ODDELENÝ od .center-visual-zone (fasádna scéna) v
   rámci #main-configurator-view. Virtuálne prehliadky/Galéria (js/vr-tours.js,
   otvorVrTours) skrývajú IBA TENTO chrome pri otvorení z hlavného módu -
   fasádna scéna (aktívny pohľad svetovej strany, obrázok aj video) ostáva
   VŽDY nedotknutá/viditeľná pod lightboxom (sekcia zadania "VR/Galéria
   nesmú meniť pozaďový pohľad svetovej strany"). Rovnaká vizuálna
   "receptúra" (scale/opacity/blur, 0.65s) ako #main-configurator-view.mcv-
   hidden vyššie - OKOLIE naďalej skrýva CELÉ #main-configurator-view
   (fasádu aj tento chrome naraz, bezo zmeny), tu ide o NEZÁVISLÝ, užší
   variant rovnakého efektu. position:absolute;inset:0 zachováva presne
   ten istý súradnicový systém pre position:absolute potomkov
   (#configurator-filters/#right-panel-stack/#facade-view-switcher), aký
   mali predtým priamo v #main-configurator-view. */
#main-configurator-chrome {
    position: absolute;
    inset: 0;
    transform-origin: center center;
    transition: transform 0.65s cubic-bezier(0.4, 0, 0.2, 1),
                opacity 0.65s cubic-bezier(0.4, 0, 0.2, 1),
                filter 0.65s cubic-bezier(0.4, 0, 0.2, 1);
}

#main-configurator-chrome.mcv-chrome-hidden {
    transform: scale(1.15);
    opacity: 0;
    filter: blur(6px);
    pointer-events: none;
}

/* ==========================================================================
   🏢 PANEL B: VIZUÁL BUDOVY (Podklad na úplnom spodku scény)
   ========================================================================== */
.center-visual-zone {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    z-index: 1; /* Podkladová vrstva */
    display: block;
}

#configurator-content {
    width: 100%;
    height: 100%;
    position: relative;
}

.facade-media-element {
    width: 100%;
    height: 100%;
    object-fit: cover; /* Dom pohltí 100% monitora bez bielych pásov */
    pointer-events: none;
}

/* ==========================================================================
   🏔️ LOGO (Hore vľavo, nad hlavným filtrom)
   ========================================================================== */
/*
 * Logo dostáva vlastné tmavé dymové sklo (rovnaký jazyk ako ostatné panely),
 * aby zostalo plne čitateľné bez ohľadu na to, čo je práve pod ním vo
 * fasádnej fotke (napr. svetlá obloha) - predtým bol text bez pozadia
 * miestami takmer nečitateľný ("orezané" logo).
 */
#app-logo {
    position: absolute;
    top: 16px;
    left: 16px;
    /* Rovnaká šírka ako filter panel pod ním (#configurator-filters) -
       logo box tak vizuálne lícuje s panelom, nie je len "hugnutý" na
       obsah. justify-content: center drží ikonu+text ako centrovanú
       skupinu na stred tohto širšieho rámika. */
    width: clamp(160px, 42cqw, 300px);
    z-index: 15;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 8px;
    color: var(--text-strong);
    /* Sekcia zadania "'BYTY RUŽINOV' logo/nadpis ako button..." - PREDTÝM
       pointer-events:none (logo bolo čisto dekoratívne, klik cezeň
       "prepadol" na fasádu pod ním). TERAZ klikateľné (otvára lightbox s
       popisom projektu, js/ui.js) - vizuálny vzhľad/rozmer/umiestnenie sa
       týmto NEMENÍ (zadanie explicitne), iba interaktivita + cursor. */
    pointer-events: auto;
    cursor: pointer;
    user-select: none;
    padding: 8px 16px;
    background: rgb(var(--surface-panel-rgb) / 0.6);
    border: 1px solid rgb(var(--hairline-rgb) / 0.06);
    border-radius: 12px;
    backdrop-filter: blur(16px);
    -webkit-backdrop-filter: blur(16px);
    /* Sekcia zadania "Zviditeľniť zlatý border na CTA AJ na #app-logo" -
       #app-logo a #compare-contact-cta (css/porovnanie.css) zdieľajú ten
       istý "glass" jazyk (--surface-panel-rgb pozadie, --hairline-rgb
       border, blur(16px), border-radius:12px) - TERAZ zdieľajú aj tento
       zlatý inset prstenec, rovnaká farba (--accent-strong-rgb, base.css)
       aj rovnaká alfa (0.85) ako CTA v jeho pokojovom (nehoverovom) stave.
       Pôvodný neutrálny hĺbkový tieň (0 10px 24px) ostáva bezo zmeny -
       gold vrstva je PRIDANÁ ako ďalšia box-shadow vrstva, nie náhrada. */
    box-shadow:
        inset 0 0 0 1px rgb(var(--accent-strong-rgb) / 0.85),
        0 10px 24px rgba(0, 0, 0, 0.35);
}

.logo-icon {
    width: 26px;
    height: 20px;
    color: rgb(var(--accent-rgb));
    flex-shrink: 0;
}

.logo-text {
    font-size: 0.82rem;
    letter-spacing: 1.5px;
    text-transform: uppercase;
    color: var(--text-body);
    white-space: nowrap;
}

.logo-text strong {
    color: var(--text-strong);
    font-weight: 700;
    margin-right: 3px;
}

/* ==========================================================================
   🌗🗺️🧱 DEŇ/NOC + MAPA + VÝBER BLOKU - ľavý dolný roh. Zrkadlový princíp k
   .vr-gallery-corner nižšie (pravý dolný roh): samostatné satelitné
   tlačidlo na VONKAJŠOM okraji (.mapa-blok-corner, #den-noc-blok-group) +
   rámčekový skupinový kontajner vedľa neho (#mapa-blok-group, .btn-group-box,
   zdieľaná trieda nižšie) - sekcia zadania "Nové poradie ľavej strany
   bottom row". VÝBER BLOKU (#blok-vyber-trigger, index.html, js/vyber-
   blokov.js) je TERAZ VŽDY viditeľný (sekcia zadania "'Výber blokov' je
   vždy úvodná obrazovka" - obrazovka, na ktorú sa vracia, je vždy
   dosiahnuteľná) - kontajner aj bez zmeny vlastnej šírky prirodzene
   prerozdelí priestor medzi 1 alebo 2 vnútornými buttons (flex:1 na oboch,
   rovnaký princíp ako #vr-tours-trigger/#gallery-trigger). MAPA otvára
   OKOLIE; text sa mení na "Vybrať byt" keď je OKOLIE otvorené (toggle, js/
   okolie.js). Celý kontajner je MIMO #main-configurator-view (index.html) -
   musí zostať funkčný aj počas OKOLIE prechodu (zatvára ho) AJ počas
   obrazovky Výber blokov.
   ========================================================================== */
.mapa-blok-corner {
    position: absolute;
    /* Výška/spodný okraj zhodné s #facade-view-switcher (40px/bottom:24px
       na desktope) - obe sedia v tom istom spodnom riadku appky (sekcia
       zadania "Finálny farebný štýl", bod 4 - zjednotená výška naprieč
       celým spodným riadkom/skupinami). */
    bottom: 24px;
    left: 16px;
    /* Rovnaká šírka ako logo/filter panel nad ním - konzistentné so
       zvyškom ľavého stĺpca. Šírka OSTÁVA rovnaká bez ohľadu na to, či
       #mapa-blok-group obsahuje 1 alebo 2 buttons (rovnaký princíp ako
       .vr-gallery-corner) - žiadna layout zmena potrebná pri budúcom
       zapnutí VÝBER BLOKU. */
    /* K rozšíri aj ŠÍRKU, nie iba výšku nižšie - ak by v budúcnosti pribudlo
       VÝBER BLOKU (2 buttons v tomto riadku, dnes display:none), zväčšený
       text by sa bez zväčšenia kontajnera navzájom zrážal (rovnaký dôvod
       ako #facade-view-switcher vyššie).
       Sekcia zadania "Rozšíriť šírku #okolie-trigger" - horný strop 300px->
       350px - dôvod: "Čo je nablízku?" (#okolie-trigger, 50/50 zdieľané s
       #blok-vyber-trigger cez #mapa-blok-group) pretekalo (scrollWidth>
       clientWidth, namerané priamo) - #blok-vyber-trigger ("Výber bloku")
       pritom malo takmer nulovú rezervu, takže čisté prerozdelenie POMERU
       flex-grow bez zväčšenia CELKOVÉHO priestoru by problém iba presunulo
       naň. Presná hodnota (350, nie okrúhlejšia menšia) bola dolaďovaná
       priamym opakovaným meraním scrollWidth/clientWidth OBOCH tlačidiel
       (nie jednorazovým výpočtom) - viacero pokusov s menším stropom
       (320/340) stále mierne pretekalo, teoretický odhad z Range.
       getBoundingClientRect() na samotnom texte (bez vplyvu boxu) dával
       nižšie číslo, než čo scrollWidth v praxi vyžadovalo (text-overflow:
       ellipsis pravdepodobne rezervuje navyše priestor pre "…", aj keď sa
       nikdy nezobrazí) - empirické meranie je tu spoľahlivejšie než
       teoretický výpočet z geometrie textu. Flex `gap:8px` medzi NOC a
       týmto kontajnerom (a jeho symetria s pravou stranou, potvrdená v
       predošlom tikete) sa týmto NEMENÍ - je to nezávislá konštanta, nie
       odvodená od tejto šírky (overené, gap ostáva 8px/6.667px nezmenený
       na touch-table/PC). */
    width: clamp(calc(160px * var(--ui-scale-kompenzacia, 1)), 42cqw, calc(350px * var(--ui-scale-kompenzacia, 1)));
    /* Kompenzačná podlaha (--ui-scale-kompenzacia, K) - rovnaká výška ako
       .vr-gallery-corner nižšie, oba riadky musia rásť spolu. */
    height: calc(40px * var(--ui-scale-kompenzacia, 1));
    z-index: 15;
    box-sizing: border-box;
    display: flex;
    align-items: stretch;
    gap: 8px;
}

/* DEŇ/NOC dvojvrstvová štruktúra - vonkajší rámček (.btn-group-box dáva
   pozadie/rám/radius/padding) auto-šírky (nie pevný štvorec ako
   FULLSCREEN, obsahuje text "Noc"/"Deň", nie iba ikonku). display:none
   natvrdo na TOMTO vonkajšom kontajneri (index.html), NIE na vnútornom
   tlačidle - js/den-noc.js prepína práve TENTO element, aby sa pri
   skrytom stave nezobrazoval prázdny osamotený rámček (rovnaký princíp
   ako #fullscreen-blok-group nižšie). */
#den-noc-blok-group {
    flex: 0 0 auto;
}

/* Vnútorný chip DEŇ/NOC - rovnaký princíp ako #fullscreen-trigger
   (zmenšený vnútri vonkajšieho 40px rámčeka), tu ale auto-šírka s
   paddingom namiesto pevného štvorca (krátky text "Noc"/"Deň"),
   min-width proti "poskakovaniu" layoutu pri prepnutí medzi oboma
   textami rôznej dĺžky. */
#den-noc-trigger {
    flex: 0 0 auto;
    /* --ui-scale-kompenzacia (K, js/scale.js) - sekcia zadania "Minimálna
       'podlaha' veľkosti pre text/UI prvky na mobile/tablete... +
       Doplnenie". Na PC/touch-table je K vždy 1 (calc(...*1) = pôvodná
       hodnota, bezo zmeny); na mobile/tablete pri nízkom scale narastie
       spolu s (rem-based) font-size, aby tlačidlo ostalo úchytné aj
       čitateľné. */
    min-width: calc(56px * var(--ui-scale-kompenzacia, 1));
    height: calc(32px * var(--ui-scale-kompenzacia, 1));
    box-sizing: border-box;
    padding: 0 calc(14px * var(--ui-scale-kompenzacia, 1));
    /* 6px -> 12px, sekcia zadania "Oprava artefaktu na zaoblených rohoch"
       - viď identický komentár pri .mode-tab (css/filters.css). */
    border-radius: 12px;
    display: flex;
    align-items: center;
    justify-content: center;
    font-family: inherit;
    font-size: 0.75rem;
    font-weight: 600;
    letter-spacing: 0.6px;
    text-transform: uppercase;
    /* Sekcia zadania "Zvýšiť čitateľnosť textu a viditeľnosť borderu na
       tlačidlách spodného riadku" -> "Zvážiť globálnu zmenu tokenu" -
       PREDTÝM lokálny scoped override priamym literálom (biely text/
       viditeľnejší border), keďže --btn-secondary-text/border boli vtedy
       nezmenené univerzálne tokeny (~25 miest naprieč 9 súbormi). Po
       diagnostike (žiadny z týchto ~25 spotrebiteľov nepoužíva token ako
       signál "disabled" - ten má vlastný, samostatný --btn-disabled-* pár)
       bola zmena POTVRDENÁ ako globálna (project.config.js/css/base.css) -
       tento scoped literál je teraz redundantný duplicit, VRÁTENÝ späť na
       zdieľanú premennú (jeden zdroj pravdy). */
    color: var(--btn-secondary-text);
    background: var(--btn-secondary-bg-nested);
    border: 1px solid var(--btn-secondary-border);
    cursor: pointer;
    transition: background 200ms ease, border-color 200ms ease, color 200ms ease;
}

#den-noc-trigger:hover,
#den-noc-trigger:focus-visible {
    background: var(--btn-secondary-bg-hover);
    border-color: var(--btn-secondary-border-hover);
    color: var(--btn-secondary-text-hover);
}

#mapa-blok-group {
    /* Už nie je samostatne pozicovaný - .mapa-blok-corner vyššie prevzal
       position/bottom/left/width/z-index, tento kontajner teraz iba
       vyplní ZVYŠNÝ priestor vedľa DEŇ/NOC (rovnaký princíp ako
       #vr-gallery-group vedľa #fullscreen-blok-group). Výška sa dedí cez
       align-items:stretch rodiča (.mapa-blok-corner), rovnako ako
       #vr-gallery-group nemá vlastnú výšku. */
    flex: 1 1 0;
    min-width: 0;
}

#okolie-trigger,
#blok-vyber-trigger {
    flex: 1 1 0;
    /* 6px -> 12px, sekcia zadania "Oprava artefaktu na zaoblených rohoch"
       - viď identický komentár pri .mode-tab (css/filters.css). */
    border-radius: 12px;
    padding: 0 calc(10px * var(--ui-scale-kompenzacia, 1));
    display: flex;
    align-items: center;
    justify-content: center;
    text-align: center;
    font-family: inherit;
    font-size: 0.75rem;
    font-weight: 600;
    letter-spacing: 0.6px;
    text-transform: uppercase;
    line-height: 1.3;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    /* SECONDARY, "nested" variant (bod 4 zadania "Finálny farebný štýl" -
       tlačidlá VNÚTRI skupinových kontajnerov). Token teraz globálne biely/
       viditeľnejší (pozri #den-noc-trigger vyššie) - žiadny scoped override
       tu už netreba. */
    color: var(--btn-secondary-text);
    background: var(--btn-secondary-bg-nested);
    border: 1px solid var(--btn-secondary-border);
    cursor: pointer;
    transition: background 200ms ease, border-color 200ms ease, color 200ms ease, box-shadow 200ms ease;
}

/* Sekcia zadania "Rozšíriť šírku #okolie-trigger" - PREDTÝM zdieľané
   min-width:0 na oboch (žiadna podlaha, 50/50 flex delilo priestor rovným
   dielom bez ohľadu na obsah). TERAZ VLASTNÝ min-width na KAŽDOM, dolaďovaný
   priamym opakovaným meraním scrollWidth<=clientWidth (nie jednorazovým
   výpočtom z textovej geometrie - pozri komentár pri .mapa-blok-corner
   width vyššie) - hodnoty dávajú OBOM tlačidlám bezpečnú rezervu nad ich
   nameraný obsahový nárok, K=1 na PC/touch-table (odtiaľ referenčné px).
   flex:1 1 0 (base pravidlo vyššie) OSTÁVA - nad týmito podlahami sa
   prípadný ĎALŠÍ voľný priestor stále delí rovným dielom, min-width iba
   garantuje, že ANI JEDNO tlačidlo nikdy nespadne pod svoj vlastný
   obsahový nárok, nezávisle od presnej šírky rodiča. */
#okolie-trigger {
    min-width: calc(138px * var(--ui-scale-kompenzacia, 1));
}

#blok-vyber-trigger {
    min-width: calc(126px * var(--ui-scale-kompenzacia, 1));
}

#okolie-trigger:hover,
#okolie-trigger:focus-visible,
#blok-vyber-trigger:hover,
#blok-vyber-trigger:focus-visible {
    background: var(--btn-secondary-bg-hover);
    border-color: var(--btn-secondary-border-hover);
    color: var(--btn-secondary-text-hover);
}

/* Mobilný skrátený text "Mapa" (sekcia zadania "Mobilný text pre 'Čo je
   nablízku?'") - dva <span>, tu default (PC/touch-table aj bezo zmeny stavu)
   plný text. Skutočný prepínač na "Mapa" je NIŽŠIE v tomto súbore (@media
   (hover:none) and (pointer:coarse) blok, zdieľaný s #fullscreen-blok-group
   skrytím) - PÔVODNE (mŕtvy) @container v css/responsive.css, opravené
   sekciou zadania "Dynamická šírka + MAPA text spodného riadku", pozri
   komentár pri tom pravidle. Aktívne IBA v ne-CTA stave (js/okolie.js,
   aktualizujTextOkolieTlacidla) - "Vybrať byt" nemá skrátený variant. */
#okolie-trigger .text-desktop {
    display: inline;
}
#okolie-trigger .text-mobile {
    display: none;
}

/* "Vybrať byt" (OKOLIE otvorené) je silnejšia výzva na akciu (návrat k
   výberu bytu) - PRIMARY štýl namiesto bežného NAVIGATION vzhľadu vyššie
   ("Mapa"). Trieda sa prepína v js/okolie.js (aktualizujTextOkolieTlacidla)
   spolu s textom. IBA #okolie-trigger - VÝBER BLOKU nemá CTA stav. */
#okolie-trigger.okolie-trigger-cta {
    background: var(--btn-primary-bg);
    color: var(--btn-primary-text);
    border-color: transparent;
}

#okolie-trigger.okolie-trigger-cta:hover,
#okolie-trigger.okolie-trigger-cta:focus-visible {
    background: var(--btn-primary-bg-hover);
    color: var(--btn-primary-text);
    border-color: transparent;
    box-shadow: var(--btn-primary-shadow-hover);
}

#okolie-trigger.okolie-trigger-cta:active {
    background: var(--btn-primary-bg-active);
    color: var(--btn-primary-text);
    border-color: transparent;
}

#okolie-trigger:disabled,
#okolie-trigger.okolie-trigger-cta:disabled,
#blok-vyber-trigger:disabled {
    background: var(--btn-disabled-bg);
    color: var(--btn-disabled-text);
    border-color: var(--btn-disabled-border);
    opacity: 1;
    cursor: default;
    box-shadow: none;
}

/* ==========================================================================
   🧭 PANEL A: PLÁVAJÚCI HLAVNÝ FILTER (Hore vľavo, pod logom)
   ========================================================================== */
#configurator-filters {
    position: absolute;
    top: 72px; /* Miesto pre logo (s vlastným pozadím) nad panelom */
    left: 16px;
    /* Horná hranica (pôvodne pevných 300px) teraz rastie s --ui-scale-
       kompenzacia (K) - sekcia zadania "Rozšíriť šírku ľavého a pravého
       panela na mobile... podľa K-kompenzácie" - text vnútri (najmä
       .filter-tile mriežka Podlažie/Počet izieb) zdedil väčší font-size
       (K, css/base.css) ako predtým, ale samotná šírka panelu (a teda aj
       jeho vnútorných grid buniek) rástla len s cqw kontajnerom, nie s K -
       na malých mobiloch (S8+, S20 FE) preto text v úzkych dlaždiciach
       zalamoval/prekrýval. min(300px * K, 460px) - rastie proporčne s K,
       ale NIKDY nad 460px (empiricky overené na S8+/S20 FE/MediaPad T5,
       ponecháva bezpečný odstup od fasády v strede appky, sekcia zadania).
       Na PC/touch-table je K vždy 1 -> min(300,460)=300px, presne
       nezmenené. */
    width: clamp(160px, 42cqw, min(calc(300px * var(--ui-scale-kompenzacia, 1)), 460px));
    height: auto; /* Výška presne podľa obsahu filtrov */
    /* Miesto pre logo hore a spodnú lištu dole. Pôvodné "94px" dole =
       24px (bottom-anchor spodného radu) + 40px (jeho PÔVODNÁ, pevná
       výška) + 30px rezerva - sekcia zadania "Filter panel na mobile
       stráca obsah... + nekonzistentný rámčekový štýl" zistila, že
       spodný rad (.mapa-blok-corner/.vr-gallery-corner/#facade-view-
       switcher, css/layout.css) dnes rastie s --ui-scale-kompenzacia (K,
       sekcia zadania "Minimálna 'podlaha' veľkosti...") - jeho VÝŠKA je
       teraz calc(40px * K), NIE pevných 40px. Táto rezerva tu MUSÍ
       rovnaký K zohľadniť, inak (potvrdené meraním na Galaxy S8+ 740×360,
       K≈1.8) panel v Rozšírenom filter móde reálne PREKRYL spodný rad o
       ~0.7px - nešlo o "miznúci obsah" (vnútorný scroll funguje správne),
       ale o vizuálnu kolíziu dvoch prvkov. Iba GROWABLE časť (40px) sa
       násobí K - pevný bottom-anchor (24px) a bezpečnostná rezerva (30px)
       zostávajú nezmenené. */
    max-height: calc(100cqh - 72px - 24px - 30px - (40px * var(--ui-scale-kompenzacia, 1)));
    z-index: 10;
    background: rgb(var(--surface-panel-rgb) / 0.55); /* Polopriehľadné dymové sklo */
    border: 1px solid rgb(var(--hairline-rgb) / 0.04); /* Ultra tenká linka */
    border-radius: 14px; /* Zaoblené rohy presne podľa predlohy */
    padding: calc(24px * var(--ui-scale-kompenzacia, 1));
    display: flex;
    flex-direction: column;
    overflow-y: auto;
    backdrop-filter: blur(20px);
    -webkit-backdrop-filter: blur(20px);
    box-shadow: 0 20px 40px rgba(0, 0, 0, 0.5);
}

/* ==========================================================================
   📄 PRAVÝ STĹPEC: INFORMÁCIE O PROJEKTE + ZOZNAM BYTOV
   ========================================================================== */
/* Čisto layoutový kontajner - ŽIADNE vlastné pozadie/rám/blur/tieň tu.
   Predošlá verzia mala na tomto stacku vlastnú "základnú" sklenú vrstvu
   siahajúcu aj cez gap medzi panelmi nižšie, čo v gape vytváralo tmavý
   poloprie hľadný nádych navyše nad fotkou (nekonzistentné s ľavou
   stranou, kde je gap medzi logo boxom a filter panelom úplne čistý -
   iba fasádna fotka, žiadne prekrytie). Panely nižšie majú vlastné
   pozadie/blur/rám/tieň - medzera medzi nimi (--panel-gap, rovnaká
   hodnota ako medzera logo↔filter na ľavej strane) tak ukazuje priamo
   fotku, bez akéhokoľvek tmavého prekrytia. */
#right-panel-stack {
    position: absolute;
    top: 16px;
    right: 16px;
    /* Rovnaký K-aware princíp ako #configurator-filters vyššie (sekcia
       zadania "Rozšíriť šírku ľavého a pravého panela..."). Ceiling 480px
       (o 20px vyšší než ľavý panel - zachováva pôvodný 20px rozdiel medzi
       300px/320px). */
    width: clamp(160px, 44cqw, min(calc(320px * var(--ui-scale-kompenzacia, 1)), 480px));
    /* NIŽŠIE (@media (hover:none) and (pointer:coarse) na konci súboru)
       túto šírku na dotykových zariadeniach ĎALEJ zužuje - sekcia zadania
       "Skryť ikonky fasády/pôdorysu... zúžiť a zjednotiť šírku pravého
       panela" (fotky/ikonky v .apartment-card sú tam skryté, uvoľnená
       šírka sa už nemusí rezervovať). */
    /* Rovnaký K-aware rozklad "94px" ako #configurator-filters vyššie
       (sekcia zadania "Filter panel na mobile stráca obsah..." - platí
       identicky aj pre tento pravý stĺpec, rovnaký spodný rad pod ním). */
    max-height: calc(100cqh - 32px - 24px - 30px - (40px * var(--ui-scale-kompenzacia, 1))); /* Miesto pre spodnú lištu dole */
    z-index: 100; /* Vysoká vrstva v popredí */
    display: flex;
    flex-direction: column;
    gap: var(--panel-gap);
}

/* Statický panel s informáciami o projekte - vlastné dymové sklo (nad
   základnou vrstvou #right-panel-stack vyššie), vždy viditeľný bez
   ohľadu na stav filtrov. Trieda (nie IBA #project-info-panel ID) - sekcia
   zadania "Doladenie viditeľnosti prvkov v menu 'Výber blokov'", bod 1:
   ZDIEĽANÁ so samostatnou kópiou tohto panela na obrazovke Výber blokov
   (#vyber-blokov-project-info-panel, css/vyber-blokov.css - tá si dopĺňa
   VLASTNÚ position/top/right/width, keďže nie je (na rozdiel od tejto)
   flex dieťaťom #right-panel-stack). */
.project-info-panel {
    flex-shrink: 0;
    /* Sekcia zadania "Stacky, výplň Prémiovej, banner" (Časť D) - K-only
       alfa 0,55->0,75 (predošlé zadanie) VRÁTENÁ na pôvodnú flat 0,55,
       zhodnú s referenčnými panelmi (#configurator-filters,
       #apartments-list-panel - rovnaký token --surface-panel-rgb, tá istá
       0,55, nikdy K-škálovaná). Táto trieda má TROCH konzumentov
       (#project-info-panel, #vyber-blokov-project-info-panel, .blok-badge
       - js/vyber-blokov.js:213) - zmena zámerne zasiahne VŠETKÝCH TROCH
       (schválené používateľom). */
    background: rgb(var(--surface-panel-rgb) / 0.55);
    border: 1px solid rgb(var(--hairline-rgb) / 0.04);
    border-radius: 14px;
    padding: calc(20px * var(--ui-scale-kompenzacia, 1));
    backdrop-filter: blur(20px);
    -webkit-backdrop-filter: blur(20px);
    box-shadow: 0 20px 40px rgba(0, 0, 0, 0.5);
}

.project-info-title {
    font-size: 1.02rem;
    font-weight: 600;
    color: var(--text-strong);
    margin-bottom: 10px;
}

.project-info-features {
    list-style: none;
    display: flex;
    flex-direction: column;
    gap: 8px;
    margin-bottom: 16px;
}

.project-info-features li {
    display: flex;
    align-items: center;
    gap: 8px;
    font-size: 0.76rem;
    color: var(--text-body);
}

/* SVG ikonky namiesto emoji (💎/🍃) - emoji majú vlastnú pevnú farbu
   (modrá/zelená) a nedajú sa prefarbiť, čo rozbíjalo zlatú/medenú paletu
   UI (bod 6). SVG s stroke="currentColor" preberá farbu z .feature-icon. */
.project-info-features .feature-icon {
    display: inline-flex;
    width: 15px;
    height: 15px;
    color: rgb(var(--accent-rgb));
    flex-shrink: 0;
}

.project-info-features .feature-icon svg {
    width: 100%;
    height: 100%;
}

/* Sekcia zadania "Zmena čitateľnosti panelov a odstup (iba mobil/tablet,
   K-only)", Časť B - zväčšenie textu/ikoniek panela "Prémiová
   Rezidencia" VÝHRADNE na dotyku. ID-scoped na OBE kópie (NIE
   .project-info-panel querySelector) - tá trieda zdieľa .blok-badge
   (karta bloku, viď komentár vyššie), preto by bare `.project-info-panel
   .project-info-title` selektor OMYLOM zasiahol aj kartu bloku (tá má
   VLASTNÉ, nezávislé Časť A pravidlá, css/vyber-blokov.css) - rovnaký
   princíp, aký appka už používa pri skrývaní tohto panela počas
   Porovnania (js/main.js, getElementById namiesto querySelector). */
#project-info-panel .project-info-title,
#vyber-blokov-project-info-panel .project-info-title {
    font-size: clamp(1.02rem,
                     calc(1.02rem + 100 * (var(--ui-scale-kompenzacia, 1) - 1) * 1rem),
                     1.3rem);
}

#project-info-panel .project-info-features .feature-icon,
#vyber-blokov-project-info-panel .project-info-features .feature-icon {
    width: calc(15px * var(--ui-scale-kompenzacia, 1));
    height: calc(15px * var(--ui-scale-kompenzacia, 1));
}

/* Sekcia zadania "Zjednotenie veľkosti popiskov a odstup Prémiovej", Časť
   A-B (c) - texty `li` ("Exkluzívna lokalita"/"Panoramatické okná"),
   rovnaký K-only vzor/horná hranica 0,92rem ako vyššie. ID-scoped na OBE
   kópie z rovnakého dôvodu ako titulok. Základ 0,76rem nezmenený. */
#project-info-panel .project-info-features li,
#vyber-blokov-project-info-panel .project-info-features li {
    font-size: clamp(0.76rem,
                     calc(0.76rem + 100 * (var(--ui-scale-kompenzacia, 1) - 1) * 1rem),
                     0.92rem);
}

/* Časť C zadania "Zjednotenie veľkosti popiskov a odstup Prémiovej" -
   NEIMPLEMENTOVANÉ, po vyčerpávajúcom priamom testovaní (NIE hypotéze o
   časovaní - report tiketu má presné namerané hodnoty z 3 nezávislých
   čerstvých načítaní na variantu).

   Zistenie: panel "Prémiová Rezidencia" (`.project-info-panel`, bez
   vlastného `width`) a jeho rodičovský stack (`#right-panel-stack`/
   `#vyber-blokov-right-stack`, `width:clamp(160px,44cqw,min(calc(320px*
   K),480px))`) sa DNES zhodujú na kópii fasády, ale NIE na kópii Výber
   blokov (o 20-22,5 referenčných px). PRIAMO OTESTOVANÉ A ZAMIETNUTÉ (3
   nezávislé CSS-nasadené varianty, každý overený 3 čerstvými
   načítaniami, nie jedným behom):
   1) `width:100%` na paneli - facade zostáva správne, vyber zostáva
      nesprávne (bez zmeny oproti pôvodnému stavu).
   2) Duplikovanie PRESNÉHO vzorca rodiča (`clamp(160px,44cqw,min(
      calc(320px*K),480px))`) priamo na paneli - facade sa NOVO POKAZÍ
      (panel > stack), vyber zostáva nesprávne.
   3) Matematicky ROVNAKÝ vzorec BEZ `cqw` (`min(calc(320px*K),480px)`,
      keďže `44cqw` je vždy ≈845 referenčných px - ĎALEKO nad hornou
      hranicou 480px vo VŠETKÝCH reálnych K, teda v praxi nikdy nič
      neurčuje) - DÁVA IDENTICKÝ zlý vzor ako (2), čím sa `cqw` VYLUČUJE
      ako príčina.
   Vylúčené AJ (samostatné priame testy, viď história repozitára): `gap`
   stacku, dočasné odobratie súrodenca (`#vyber-blokov-favorites-panel`,
   display:none), box-sizing/border panela, opakovaný `updateScale()`/
   `resize` event/re-set CSS premennej/detach+reattach panela zo stromu.

   Záver: nejde o `cqw`, gap, súrodenca, box-sizing ani o jednoduché
   "zastarané K" (priamy test to vyvrátil). Presná príčina zostáva
   NEZISTENÁ aj po tomto rozsiahlom testovaní - zdá sa byť hlbšia
   Chromium špecifickosť vo vyhodnocovaní `calc()`/`min()` výrazov nad
   custom property (`--ui-scale-kompenzacia`) naprieč viacerými prvkami
   PRI PRVOM vykreslení, ktorú CSS-only prostriedkami dostupnými v tomto
   tikete nebolo možné spoľahlivo obísť bez rizika NOVEJ regresie (viď
   pokus 2/3, kde predtým správna fasádna kópia prestala sedieť). Panel
   width preto ostáva na PÔVODNOM stave (implicitný flex stretch, žiadne
   vlastné `width`) - jediný z testovaných stavov, ktorý nezaviedol NOVÚ
   chybu, čaká sa na ďalšie rozhodnutie používateľa. */

#apartments-list-panel {
    position: relative;
    flex: 1 1 auto;
    min-height: 0; /* umožní vnútorné scrollovanie namiesto pretečenia stacku */
    width: 100%;
    padding: calc(24px * var(--ui-scale-kompenzacia, 1));
    display: flex;
    flex-direction: column;
    overflow: hidden;
    /* Vlastné dymové sklo (nad základnou vrstvou #right-panel-stack) -
       rovnaký jazyk ako #project-info-panel vyššie. */
    background: rgb(var(--surface-panel-rgb) / 0.55);
    border: 1px solid rgb(var(--hairline-rgb) / 0.04);
    border-radius: 14px;
    backdrop-filter: blur(20px);
    -webkit-backdrop-filter: blur(20px);
    box-shadow: 0 20px 40px rgba(0, 0, 0, 0.5);
}

/* 🧡 "ZAVRIEŤ MÔJ VÝBER" tlačidlo (predtým "ZAVRIEŤ OBĽÚBENÉ" hneď pod
   hlavičkou - sekcia zadania "Premenovanie 'Obľúbené byty' na 'Môj
   výber'...", bod 2 - "presúva sa POD zoznam bytov") - priamo v obsahu
   panela "Môj výber" (js/favorites.js, vykresliObsahOblubenych), rovnaká
   sekundárna paleta ako iné textové CTA v appke (.apartments-summary-cta/
   .detail-action-btn). flex-shrink:0 - panel je flex-column s
   .panel-foreground-scroller rastúcim nad ním (flex:1 1 auto,
   overflow-y:auto) - tlačidlo tak VŽDY ostáva pod scrollovateľným
   zoznamom, nikdy sa nescrolluje preč z dohľadu, nezávisle od dĺžky
   zoznamu. */
.favorites-close-btn {
    flex-shrink: 0;
    width: 100%;
    padding: calc(10px * var(--ui-scale-kompenzacia, 1)) 0;
    margin-top: calc(12px * var(--ui-scale-kompenzacia, 1));
    /* 8px -> 12px, sekcia zadania "Rozšírenie opravy artefaktu na
       zaoblených rohoch na ďalšie miesta appky" (nadväzuje na commit
       6743e54). */
    border-radius: 12px;
    font-size: 0.78rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.5px;
    color: var(--btn-secondary-text);
    background: var(--btn-secondary-bg-nested);
    border: 1px solid var(--btn-secondary-border);
    cursor: pointer;
    transition: background 200ms ease, border-color 200ms ease, color 200ms ease;
}

.favorites-close-btn:hover,
.favorites-close-btn:focus-visible {
    background: var(--btn-secondary-bg-hover);
    border-color: var(--btn-secondary-border-hover);
    color: var(--btn-secondary-text-hover);
}

/* 🚀 VRSTVA PRE KARTY BYTOV (Absolútne popredie) */
.panel-foreground-scroller {
    width: 100%;
    height: 100%;
    display: flex;
    flex-direction: column;
    gap: 16px;
    overflow-y: auto;
    padding-right: 8px;
}

/* Zjemnenie a skrytie hrubého systémového scrolleru - UNIVERZÁLNE pre
   ĽUBOVOĽNÝ scrollovateľný prvok v celej appke (nie iba .panel-foreground-
   scroller), vo VŠETKÝCH breakpointoch (žiadny samostatný mobilný variant
   nižšie). `*` namiesto konkrétnej triedy = jeden zdroj pravdy pre štýl
   scrollbaru, automaticky platný aj pre budúce scrollovateľné panely. */
*::-webkit-scrollbar {
    width: 4px;
}
*::-webkit-scrollbar-thumb {
    background: rgb(var(--accent-rgb) / 0.3);
    border-radius: 4px;
}


/* ==========================================================================
   🔴 LIŠTA PRE PREPÍNANIE POHĽADOV (DOKONALE VYCENTROVANÁ V STREDE DOLE).
   DEŇ/NOC sa presunul do ľavého dolného rohu (.mapa-blok-corner vyššie,
   sekcia zadania "Nové poradie ľavej strany bottom row") - #facade-view-
   switcher je teraz opäť sám osebe priamo pozicovaný, žiadny spoločný
   obaľovací riadok netreba.
   ========================================================================== */
#facade-view-switcher {
    position: absolute;
    bottom: 24px; /* Fixne v dolnej časti */
    left: 50%;    /* Posun na stredovú os */
    transform: translateX(-50%); /* Vyváženie presného stredu */
    z-index: 10;
    /* Horný strop UŽ NIE JE fixných 300px - počíta ho js/config-apply.js
       (aplikujRozmeryPrepinacaPohladov) z počtu pohľadov v configu a
       zapisuje ho sem ako --view-switcher-max-width. Pri dnešných 4
       pohľadoch je to presne 300px, takže vzhľad ostáva nezmenený.
       Fallback 300px platí, kým sa premenná nenastaví. */
    /* --ui-scale-kompenzacia (K) MUSÍ tu rozšíriť aj ŠÍRKU, nie iba výšku/
       padding nižšie - viacero tlačidiel SEVER/JUH/ZÁPAD/VÝCHOD si rovným
       dielom delí TENTO kontajner (flex:1 na .view-btn nižšie); keby sa
       zväčšil iba ich font-size (automaticky, koreňový rem, css/base.css)
       bez zväčšenia spoločného kontajnera, susedné popisy by sa navzájom
       prekrývali/zrážali (zistené vizuálnou kontrolou na simulovanom S20
       FE - "ZÁPADVÝCHOD" bez medzery, sekcia zadania "Minimálna 'podlaha'
       veľkosti..."). Zväčšením ŠÍRKY spolu s textom si každé tlačidlo
       zachová PÔVODNÝ POMER medzi svojou šírkou a veľkosťou textu. */
    width: clamp(calc(180px * var(--ui-scale-kompenzacia, 1)), 78cqw, calc(var(--view-switcher-max-width, 300px) * var(--ui-scale-kompenzacia, 1)));
    /* Skupinový kontajner (bod 3 zadania "Finálny farebný štýl") - rovnaká
       výška (40px) ako ostatné skupiny/samostatné tlačidlá spodného radu.
       min-height namiesto fixnej výšky: pri veľkom počte pohľadov sa
       tlačidlá zalomia do viacerých riadkov a skupina musí vedieť narásť.
       Je ukotvená spodkom (bottom: 24px), takže rastie NAHOR - do voľnej
       fasádnej plochy, nič pod ňou nekoliduje. */
    min-height: calc(40px * var(--ui-scale-kompenzacia, 1));
    box-sizing: border-box;
    background: var(--group-container-bg);
    /* Farba borderu PREPÍSANÁ z --group-container-border (zdieľaný token
       ostatných skupín bottom row, nedotknutý) na existujúci
       --accent-strong-rgb (rovnaký token ako #app-logo/.view-btn.active,
       css/base.css:91) s vlastnou, nižšou alfou 0.35 - sekcia zadania
       "Zlatý border pozadia #facade-view-switcher". Iba TÁTO jedna
       vlastnosť sa prepisuje priamo na tomto pravidle (rovnaká
       špecificita, jeden ID selektor), --group-container-border token
       samotný zostáva nezmenený pre NOC/VÝBER BLOKU/VR+GALÉRIE. */
    border: 1px solid rgb(var(--accent-strong-rgb) / 0.35);
    /* 8px -> 12px, sekcia zadania "border-radius 16 -> 12, zjednotiť s
       .view-btn a ostatnými skupinami bottom row" (nadväzuje na predošlý
       medzikrok 8px->16px, ktorý sa touto zmenou NAHRÁDZA - koncentrický
       16px vzorec bol zámerne opustený v prospech vizuálnej zhody so
       zvyškom bottom row, kde skupinový kontajner aj vnútorné tlačidlá
       majú rovnaký 12px polomer). */
    border-radius: 12px;
    display: inline-flex;
    /* Vnútorné buttons majú teraz flex:1 (rovnomerne vyplnia CELÚ šírku
       kontajnera) - nahrádza pôvodné justify-content:space-around, keďže
       tlačidlá už NIE SÚ len "hugnuté" na text, ale rovnako široké medzi
       sebou (zadanie, bod 3). */
    justify-content: center;
    align-items: stretch;
    /* Zalomenie do ďalšieho riadku je zámerne zvolené namiesto
       horizontálneho scrollu: spodný rad je vizuálne jazyk "pilulkových
       skupín" (rovnaká logika ako .vr-gallery-corner / #mapa-blok-group) a
       skrytý scroll v 40px vysokej pilulke nemá na dotykovom stole žiadnu
       viditeľnú indikáciu. Pri <= baseViewCount pohľadoch sa nikdy
       neuplatní (tlačidlá sa zmestia do jedného riadku). */
    flex-wrap: wrap;
    align-content: stretch;
    padding: calc(3px * var(--ui-scale-kompenzacia, 1));
    gap: 6px;
    backdrop-filter: blur(20px);
    -webkit-backdrop-filter: blur(20px);
    box-shadow: 0 10px 30px rgba(0, 0, 0, 0.5);
}

.view-btn {
    flex: 1 1 0;
    min-width: 0;
    /* Vertikálne centrovanie cez flex (nie padding) - výška presne sedí s
       okolitými skupinami/samostatnými tlačidlami (zadanie, bod 3). */
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--btn-secondary-bg-nested);
    /* Token teraz globálne biely/viditeľnejší (pozri #den-noc-trigger
       vyššie) - žiadny scoped override tu už netreba. */
    color: var(--btn-secondary-text);
    border: 1px solid var(--btn-secondary-border);
    /* .view-btn je <button> a PREDTÝM tu chýbalo font-family:inherit, ktoré
       majú VŠETKY ostatné tlačidlá bottom row (#den-noc-trigger, css/
       layout.css riadok ~301; #okolie-trigger/#blok-vyber-trigger, riadok
       ~352; #vr-tours-trigger/#gallery-trigger, riadok ~885) - <button> má
       vlastný UA (prehliadačový) predvolený font, ktorý sa NEDEDÍ
       automaticky z body, takže .view-btn sa bez tejto deklarácie
       renderoval iným fontom (Arial) než zvyšok bottom row (Segoe UI
       Semibold, sekcia zadania "Diagnostika strednej skupiny bottom row").
       letter-spacing 1px -> 0.6px, zjednotené s rovnakými tlačidlami. */
    font-family: inherit;
    font-size: 0.75rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.6px;
    /* 6px -> 12px, sekcia zadania "Oprava artefaktu na zaoblených rohoch"
       - .view-btn doplnené do rozsahu (rovnaká CSS/artefakt ako ostatné
       bottom row tlačidlá, nemenované v pôvodnom zozname, potvrdené). */
    border-radius: 12px;
    cursor: pointer;
    transition: background 200ms ease, border-color 200ms ease, color 200ms ease, box-shadow 200ms ease;
}

/* ==========================================================================
   VIAC POHĽADOV, NEŽ SA ZMESTÍ DO JEDNÉHO RIADKU
   Triedu .pohlady-viac pridáva js/config-apply.js, keď počet pohľadov v
   PROJECT_CONFIG.data.views presiahne layout.viewSwitcher.baseViewCount.
   Do tohto počtu (dnes 4) sa nižšie uvedené pravidlá NEUPLATNIA vôbec a
   prepínač vyzerá presne ako doteraz.

   Rozdiel oproti základnému správaniu:
   - tlačidlá sa už NEdelia o fixnú šírku rovným dielom (flex: 1 1 0), ale
     sa dimenzujú PODĽA TEXTU (flex: 0 1 auto + padding) - preto sa žiadny
     popis nemôže orezať, nech je akokoľvek dlhý,
   - kontajner rastie podľa obsahu až po maxWidth z configu; za ním sa
     tlačidlá zalomia do ďalšieho riadku,
   - bez flex-grow sa posledný (neúplný) riadok NEROZŤAHUJE cez celú šírku,
     ale ostáva vycentrovaný - inak by osamotené tlačidlo v druhom riadku
     vyzeralo ako široký pruh.
   ========================================================================== */
#facade-view-switcher.pohlady-viac {
    width: fit-content;
    max-width: calc(var(--view-switcher-max-width, 880px) * var(--ui-scale-kompenzacia, 1));
}

#facade-view-switcher.pohlady-viac .view-btn {
    flex: 0 1 auto;
    min-width: var(--view-btn-min-width, 72px);
    padding: 0 var(--bottom-row-btn-padding-x);
}

.view-btn:hover {
    background: var(--btn-secondary-bg-hover);
    border-color: var(--btn-secondary-border-hover);
    color: var(--btn-secondary-text-hover);
}

/* Aktívne tlačidlo pohľadu - rovnaký teplý zlatý akcent ako ostatné
   "zvolené" stavy appky (zadanie, bod 3). */
.view-btn.active {
    background: var(--btn-secondary-bg-active);
    border-color: var(--btn-secondary-border-active);
    color: var(--btn-secondary-text-active);
    font-weight: 600;
}

/* ==========================================================================
   🎥 VR + GALÉRIE (+ FULLSCREEN) (pravý dolný roh) - preberá formát/riadok,
   aký predtým mala samostatná VIRTUÁLNE PREHLIADKY (teraz rozdelená na 2
   samostatné tlačidlá - zdieľajú JEDEN spoločný takeover, js/vr-tours.js,
   iba iný "typ" parameter) - celá šírka #right-panel-stack nad ním, rovnaký
   spodný riadok ako #facade-view-switcher/#okolie-trigger. Dátovo skryté v
   JS (js/main.js), ak žiaden byt nemá Vzorovy_byt="Ano". Klik je TOGGLE
   (js/vr-tours.js) - .active štýl nižšie ukazuje otvorený stav. FULLSCREEN
   je tretia, ŠTVORCOVÁ ikonka (šírka=výška riadku) na kraji - na mobile
   úplne skrytá (css/responsive.css), VR a GALÉRIE tam zaberú celú šírku
   50/50 automaticky (flex, žiadna extra CSS logika potrebná).
   ========================================================================== */
/* Čisto layoutový riadok - VR+GALÉRIE skupina (vlastný kontajner nižšie,
   #vr-gallery-group) a samostatné FULLSCREEN tlačidlo VEDĽA seba (zadanie
   "Finálny farebný štýl": bod 3 pre skupinu, bod 4 pre FULLSCREEN ako
   samostatné tlačidlo) - žiadne vlastné pozadie/rám tu, tie majú oba
   priami potomkovia zvlášť. */
.vr-gallery-corner {
    position: absolute;
    bottom: 24px;
    right: 16px;
    /* K rozšíri aj ŠÍRKU, nie iba výšku - VR a GALÉRIE tlačidlá si rovným
       dielom delia #vr-gallery-group (rovnaký dôvod ako #facade-view-
       switcher vyššie). */
    width: clamp(calc(160px * var(--ui-scale-kompenzacia, 1)), 44cqw, calc(320px * var(--ui-scale-kompenzacia, 1)));
    height: calc(40px * var(--ui-scale-kompenzacia, 1));
    box-sizing: border-box;
    z-index: 10;
    display: flex;
    align-items: stretch;
    /* justify-content:flex-end (nie predvolené flex-start) - bez vplyvu, KÝM
       je #vr-gallery-group viditeľný (flex:1 1 0 zaberie CELÝ voľný priestor,
       niet čo zarovnávať). Keď je ale skrytý (sekcia zadania "Skrytie 'ČO JE
       NABLÍZKU?', VR a Galéria buttonov v menu 'Výber blokov'", js/vyber-
       blokov.js) - #fullscreen-blok-group (pevná 40px*K šírka) by BEZ tohto
       "vypadol" na ĽAVÝ okraj tohto (samo o sebe neviditeľného, bezo
       štýlu) širokého kontajnera namiesto toho, aby zostal na svojom
       zaužívanom mieste pri PRAVOM okraji obrazovky. */
    justify-content: flex-end;
    gap: 8px;
}

/* Zdieľaný vzhľad rámčekového skupinového kontajnera (bod 3 zadania
   "Finálny farebný štýl") - trieda namiesto duplicity na každom
   jednotlivom ID, aby budúce ďalšie skupiny (napr. #mapa-blok-group
   vyššie) mohli rovnaký vzhľad jednoducho ZDIEĽAŤ, nie kopírovať (sekcia
   zadania "Príprava zdieľaného kontajnera MAPA + budúci VÝBER BLOKU").
   Rovnaký vizuálny jazyk ako lišta svetových strán/tab-selector/POI
   kategórie/ID-byt lišta. */
.btn-group-box {
    display: flex;
    background: var(--group-container-bg);
    border: 1px solid var(--group-container-border);
    /* 8px -> 12px, sekcia zadania "Rozšírenie opravy artefaktu na
       zaoblených rohoch na ďalšie miesta appky" (nadväzuje na commit
       6743e54). */
    border-radius: 12px;
    padding: calc(3px * var(--ui-scale-kompenzacia, 1));
    gap: 6px;
    box-sizing: border-box;
}

/* VR + GALÉRIE tlačidlá spolu - .btn-group-box vyššie dáva vzhľad, tu iba
   flex:1 (rastie na zvyšný priestor vedľa samostatného FULLSCREEN
   tlačidla v .vr-gallery-corner, index.html). */
#vr-gallery-group {
    flex: 1 1 0;
    min-width: 0;
}

#vr-tours-trigger,
#gallery-trigger {
    flex: 1 1 0;
    min-width: 0;
    /* 6px -> 12px, sekcia zadania "Oprava artefaktu na zaoblených rohoch"
       - viď identický komentár pri .mode-tab (css/filters.css). */
    border-radius: 12px;
    padding: 0 calc(10px * var(--ui-scale-kompenzacia, 1));
    display: flex;
    align-items: center;
    justify-content: center;
    text-align: center;
    font-family: inherit;
    font-size: 0.75rem;
    font-weight: 600;
    letter-spacing: 0.6px;
    text-transform: uppercase;
    line-height: 1.3;
    /* Token teraz globálne biely/viditeľnejší (pozri #den-noc-trigger
       vyššie) - žiadny scoped override tu už netreba. */
    color: var(--btn-secondary-text);
    background: var(--btn-secondary-bg-nested);
    border: 1px solid var(--btn-secondary-border);
    cursor: pointer;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    transition: background 200ms ease, border-color 200ms ease, color 200ms ease;
}

#vr-tours-trigger:hover,
#vr-tours-trigger:focus-visible,
#gallery-trigger:hover,
#gallery-trigger:focus-visible {
    background: var(--btn-secondary-bg-hover);
    border-color: var(--btn-secondary-border-hover);
    color: var(--btn-secondary-text-hover);
}

#vr-tours-trigger.active,
#gallery-trigger.active {
    background: var(--btn-secondary-bg-active);
    border-color: var(--btn-secondary-border-active);
    color: var(--btn-secondary-text-active);
}

#vr-tours-trigger:disabled,
#gallery-trigger:disabled {
    background: var(--btn-disabled-bg);
    color: var(--btn-disabled-text);
    border-color: var(--btn-disabled-border);
    opacity: 1;
    cursor: default;
}

/* FULLSCREEN - rovnaká DVOJVRSTVOVÁ štruktúra ako MAPA (#mapa-blok-group +
   #okolie-trigger) - vonkajší rámček (#fullscreen-blok-group, .btn-group-box
   zdieľaná trieda dáva pozadie/rám/radius/padding) + vnútorný klikateľný
   chip (#fullscreen-trigger, zmenšený na 32px). Kompaktná štvorcová ikonka,
   NIE široké textové tlačidlo ako VR/GALÉRIE - iba symbol (mení sa podľa
   stavu, js/fullscreen.js). Sekcia zadania "FULLSCREEN dostane rovnakú
   dvojvrstvovú štruktúru ako MAPA". */
#fullscreen-blok-group {
    flex: 0 0 calc(40px * var(--ui-scale-kompenzacia, 1));
    width: calc(40px * var(--ui-scale-kompenzacia, 1));
    height: calc(40px * var(--ui-scale-kompenzacia, 1));
}

#fullscreen-trigger {
    width: calc(32px * var(--ui-scale-kompenzacia, 1));
    height: calc(32px * var(--ui-scale-kompenzacia, 1));
    /* 6px -> 12px, sekcia zadania "Oprava artefaktu na zaoblených rohoch"
       - viď identický komentár pri .mode-tab (css/filters.css). */
    border-radius: 12px;
    display: flex;
    align-items: center;
    justify-content: center;
    color: var(--btn-secondary-text);
    background: var(--btn-secondary-bg-nested);
    border: 1px solid var(--btn-secondary-border);
    cursor: pointer;
    transition: background 0.2s ease-in-out, border-color 0.2s ease-in-out, color 0.2s ease-in-out;
}

#fullscreen-trigger:hover,
#fullscreen-trigger:focus-visible {
    background: var(--btn-secondary-bg-hover);
    border-color: var(--btn-secondary-border-hover);
    color: var(--btn-secondary-text-hover);
}

#fullscreen-trigger:disabled {
    background: var(--btn-disabled-bg);
    color: var(--btn-disabled-text);
    border-color: var(--btn-disabled-border);
    opacity: 1;
    cursor: default;
}

.fullscreen-icon {
    width: 20px;
    height: 20px;
}

/* ==========================================================================
   ℹ️🔗 INFO + ZDIEĽAŤ (vedľa loga, ľavý horný roh) - JEDEN spoločný okrúhly/
   pilulkový rámček (#header-icon-group, sekcia zadania "Nová skupina 'I' +
   'ZDIEĽAŤ' v headeri") - rovnaký princíp DVOJVRSTVOVEJ štruktúry ako
   VR+GALÉRIE/MAPA/FULLSCREEN (vonkajší rámček + vnútorné chipy), iba PLNE
   OKRÚHLY tvar (border-radius: 999px vonkajší, 50% vnútorné kruhy) namiesto
   obdĺžnikového. Výška vonkajšieho kontajnera (38px) PRESNE zodpovedá
   nameranej výške #app-logo na desktope (bez zmeny loga samotného) - obe
   pôsobia ako jedna vizuálna línia v headeri (zadanie, bod 3). left
   duplikuje presne rovnaký vzorec ako šírka #app-logo (clamp(160px,42cqw,
   300px)), aby sedelo hneď za ním s malou medzerou - rovnaký princíp ako
   inde v appke (napr. #configurator-filters duplikuje šírku loga). INFO
   funkcia (popover) bezo zmeny, js/ui.js - iba pozícia/tvar/vzhľad. ZDIEĽAŤ
   je nové (js/ui.js, zdielajAplikaciu) - zdieľa CELÚ appku, nie konkrétny
   byt (na rozdiel od "Zdieľať" v detaile bytu, js/detail.js).
   ========================================================================== */
.header-icon-group {
    position: absolute;
    top: 16px;
    /* Sekcia zadania "Zarovnanie skupiny 'I'/zdieľať s panelom módov" -
       PREDTÝM "left" odvodený z ŠÍRKY LOGA (clamp(160px,42cqw,300px),
       nezávislé od K) - odkedy #configurator-filters (panel "ZÁKLADNÝ/
       ROZŠÍRENÝ MÓD" nižšie) rastie s K (min(calc(300px*K),460px), sekcia
       zadania "Rozšíriť šírku ľavého a pravého panela..."), táto skupina
       (šírka sa nemení s K) prestala siahať až po jeho pravý okraj -
       vizuálne "nedoťahovala" na šírku panela pod ňou na dotykových
       zariadeniach. "right" (nie "left") - jej VLASTNÁ (intrinzická,
       content-hugging) šírka je tak irelevantná, "right" priamo určuje
       polohu jej PRAVÉHO okraja = PRESNE rovnaký vzorec ako ľavý okraj
       (16px) + šírka #configurator-filters (css/layout.css) - DUPLICITA
       šírkového vzorca je zámerná (rovnaký vzor ako #right-panel-stack
       vyššie, ktorý tiež duplikuje vlastný K-vzorec namiesto zdieľanej
       premennej - CSS custom properties tu nevedia niesť celé clamp()/
       min() výrazy naprieč pravidlami bez ich zopakovania).

       DOPLNENÉ (sekcia zadania "Zosúladiť vzhľad 'BYTY RUŽINOV' a 'I'/
       zdieľať na PC s mobil/tablet verziou") - vyššie uvedený vzorec
       zarovnáva PRAVÝ okraj tejto skupiny s PRAVÝM okrajom panela pod ňou,
       ale NIKDY negarantoval odstup od #app-logo VĽAVO - na K=1 (PC, touch
       table) je táto zarovnávacia šírka (min(300px*1,460)=300px) PRESNE
       rovnaká ako šírka #app-logo (clamp(...,300px)), takže PRAVÝ okraj
       tejto skupiny dopadol PRESNE na pravý okraj #app-logo - keďže táto
       skupina má vlastnú (menšiu) šírku, VIZUÁLNE SA CELÁ SCVRKLA DOVNÚTRA
       #app-logo (prekrytie/zlúčenie, bug zo zadania). Na dostatočne vysokom
       K (napr. Galaxy S20 FE) zarovnávacia šírka prekročí súčet (šírka loga
       + šírka tejto skupiny), čo NÁHODOU dá viditeľný odstup - ale nie
       spoľahlivo na každom K (napr. Huawei MediaPad T5 mala rovnaký bug ako
       PC, iba miernejší, zmerané).

       min() nižšie preto DOPĹŇA (nenahrádza) pôvodný zarovnávací vzorec o
       DRUHÚ, nezávislú hornú hranicu pre "right": najväčšiu hodnotu, pri
       ktorej ĽAVÝ okraj tejto skupiny (100% - right - VLASTNÁ šírka) ostáva
       aspoň 8px napravo od PRAVÉHO okraja #app-logo (16px + jeho šírka).
       VLASTNÁ šírka skupiny je súčet jej obsahu (box-sizing:border-box
       nižšie): 2× padding (2×calc(3px*K)) + 2× kruhový chip (2×calc(30px*K))
       + 1× gap (6px, NIE K-škálovaný) + 2× vlastný 1px border = 66px*K + 8px
       (odvodené priamo z pravidiel .header-icon-group/#app-info-trigger
       nižšie, nie odhad). min() vyberie VŽDY tesnejšiu (menšiu = viac
       vpravo posúvajúcu) z oboch hodnôt - na K=1 (PC/touch table) teraz
       vyhráva TÁTO nová horná hranica (garantovaný 8px odstup), na
       dostatočne vysokom K (S20 FE) naďalej vyhráva PÔVODNÝ zarovnávací
       vzorec bezo zmeny (odstup tam bol už predtým väčší než 8px, žiadna
       regresia). */
    right: min(
        calc(100% - 16px - clamp(160px, 42cqw, min(calc(300px * var(--ui-scale-kompenzacia, 1)), 460px))),
        calc(100% - 32px - clamp(160px, 42cqw, 300px) - 66px * var(--ui-scale-kompenzacia, 1))
    );
    /* --header-row-height (js/scale.js, aktualizujVyskuHeaderRiadku) je
       #app-logo výška ODMERANÁ za behu, nie nezávisle odhadnutý vzorec -
       #app-logo rastie s K NEPRIAMO (cez text.line-height presahujúci
       fixnú výšku ikony), zatiaľ čo predošlý vlastný vzorec (calc(38px*K))
       rástol PRIAMO/lineárne s K - na vyššom K sa tak rozišli natoľko, že
       táto skupina reálne PREKRÝVALA panel pod sebou (zmerané, sekcia
       zadania "Zarovnanie skupiny 'I'/zdieľať s panelom módov"). Fallback
       calc(38px*K) platí iba kým JS ešte nestihol premennú nastaviť (prvé
       vykreslenie pred prvým updateScale()). */
    height: var(--header-row-height, calc(38px * var(--ui-scale-kompenzacia, 1)));
    /* POZNÁMKA: vnútorné kruhové chipy (#app-info-trigger/#share-app-
       trigger, každý calc(30px*K) + padding + rámik) sú na vysokom K o
       necelý 1px vyššie, než --header-row-height (odmerané #app-logo) v
       tomto konkrétnom okrajovom prípade dovoľuje - ZÁMERNE bez min-height
       podlahy tu: taká podlaha by pri vysokom K prebila --header-row-height
       naspäť na výšku, ktorá tento kontajner PREKRÝVA s panelom pod ním
       (presne bug, ktorý táto sekcia zadania rieši) - sub-pixelové
       pretečenie zaobleného chipu cez zaoblený okraj pilulky je vizuálne
       zanedbateľné, skutočné prekrytie panela pod ňou nie je. */
    z-index: 15;
    box-sizing: border-box;
    display: inline-flex;
    align-items: center;
    background: var(--group-container-bg);
    border: 1px solid var(--group-container-border);
    border-radius: 999px;
    padding: calc(3px * var(--ui-scale-kompenzacia, 1));
    gap: 6px;
    backdrop-filter: blur(16px);
    -webkit-backdrop-filter: blur(16px);
    box-shadow: 0 10px 24px rgba(0, 0, 0, 0.35);
}

/* Vnútorné kruhové chipy - rovnaký princíp zmenšenia oproti vonkajšku ako
   #fullscreen-trigger v #fullscreen-blok-group (outer - 2×(padding+border)),
   tu ale KRUH (width=height), nie štvorec so zaobleným rohom. */
#app-info-trigger,
#share-app-trigger,
#favorites-trigger,
#favorites-clear-trigger {
    flex: 0 0 auto;
    width: calc(30px * var(--ui-scale-kompenzacia, 1));
    height: calc(30px * var(--ui-scale-kompenzacia, 1));
    border-radius: 50%;
    box-sizing: border-box;
    display: flex;
    align-items: center;
    justify-content: center;
    color: var(--btn-secondary-text);
    background: var(--btn-secondary-bg-nested);
    border: 1px solid var(--btn-secondary-border);
    cursor: pointer;
    transition: background 200ms ease, border-color 200ms ease, color 200ms ease;
}

#app-info-trigger {
    font-family: Georgia, 'Times New Roman', serif;
    font-style: italic;
    font-weight: 700;
    font-size: 0.95rem;
}

#share-app-trigger {
    font-size: 0.85rem;
    line-height: 1;
}

#app-info-trigger:hover,
#app-info-trigger:focus-visible,
#share-app-trigger:hover,
#share-app-trigger:focus-visible,
#favorites-trigger:hover,
#favorites-trigger:focus-visible,
#favorites-clear-trigger:hover,
#favorites-clear-trigger:focus-visible {
    background: var(--btn-secondary-bg-hover);
    border-color: var(--btn-secondary-border-hover);
    color: var(--btn-secondary-text-hover);
}

#app-info-trigger:active,
#share-app-trigger:active,
#favorites-trigger:active,
#favorites-clear-trigger:active {
    background: var(--surface-pressed);
}

/* ==========================================================================
   🧡 OBĽÚBENÉ BYTY - headerové tlačidlo (sekcia zadania "Prepísať logiku
   'Obľúbené byty'...", bod 1) - TRETIA vizuálna skupina v headeri, napravo
   od #header-icon-group vyššie. "Zdieľaný kruhový kontajner s existujúcim
   buttonom srdiečka, rovnaký vizuálny vzor ako dvojica 'I'/zdieľať"
   (zadanie) - ZDIEĽANÁ trieda .header-icon-group (rovnaká pilulka, rovnaké
   2 kruhové chipy 30px*K), IBA vlastná pozícia (id-špecifické "right"
   nižšie). Srdiečko (#favorites-trigger) a metla (#favorites-clear-trigger)
   preto dostávajú ROVNAKÚ chip veľkosť/farby ako #app-info-trigger/
   #share-app-trigger vyššie (zdieľané selektory).

   POZÍCIA ("right") - "medzera medzi 'BYTY RUŽINOV'↔'I'/zdieľať a medzi
   'I'/zdieľať↔'OBĽÚBENÉ' musí byť rovnaká" (zadanie). Keďže OBE skupiny
   majú TERAZ identickú vlastnú šírku (66px*K + 8px, 2 chipy + padding + gap
   + border - odvodené v #header-icon-group komentári vyššie), táto skupina
   jednoducho odčíta (vlastná šírka + rovnaký 8px odstup) = 66px*K + 16px od
   OBOCH vetiev #header-icon-group vzorca (min(A,B)-c = min(A-c,B-c), platná
   úprava) - výsledný pravý okraj sedí PRESNE o vlastnú šírku + 8px bližšie
   k pravému okraju než #header-icon-group, na KAŽDOM K zhodne s tým, ako sa
   aktuálne správa #header-icon-group. */
/* Sekcia zadania "Pilulka s obľúbenými... pilulka musí rásť DOPRAVA" -
   prekotvené z right: na left:, aby rozšírené zlaté tlačidlo (nižšie)
   rástlo smerom OD pilulky "I"/odkaz preč (doprava, do voľného
   priestoru pred kartou "Prémiová Rezidencia", zmerané 277-1472px na
   všetkých testovaných rozlíšeniach - viď report tiketu), nie DO nej.
   Hodnota je algebraicky odvodená z PÔVODNÉHO right: vzorca vyššie
   (#header-icon-group), nie odhadnutá - "right: min(A,B)" na kontajneri
   je ekvivalentné "jeho pravý okraj od ĽAVA = 100% - min(A,B) =
   max(100%-A, 100%-B)" (De Morgan pre min/max cez doplnok do 100%).
   Táto pilulka sedí 8px NAPRAVO od toho okraja (rovnaká medzera, akú
   PREDTÝM implicitne dávala odčítacia konštanta v pôvodnom right:
   vzorci, --header-icon-group komentár vyššie) - odtiaľ "max(24px+W1,
   40px+W2+66px*K)" nižšie (16px+8px=24px, 32px+8px=40px). W1/W2 sú
   DOSLOVNE tie isté dva výrazy, aké používa #header-icon-group vyššie
   pre svoju vlastnú šírku - žiadna nová/duplicitná logika, iba
   preusporiadané rovnaké stavebné bloky. Overené priamo (CDP): reálna
   obrazovková pozícia ľavého okraja pri N=0 je na všetkých 6 testovaných
   rozlíšeniach identická s hodnotou PRED touto zmenou (report tiketu,
   KROK 0c vs KROK 2.2). Zásah IBA na #favorites-trigger-group (nie na
   zdieľanú .header-icon-group triedu ani na #header-icon-group samotné). */
#favorites-trigger-group {
    /* KRITICKÉ: zdieľaná .header-icon-group (base trieda) nastavuje
       right: min(...) - CSS "left" a "right" na position:absolute
       prvku pôsobia SÚČASNE, ak sú OBIDVA nastavené (nezávisle od
       cascade/specificity, sú to DVE nezávislé vlastnosti) - bez
       explicitného zrušenia by "right" zdedené z .header-icon-group
       spolu s NOVÝM "left" tu vynútili width = container - left -
       right (namiesto shrink-to-fit podľa obsahu), čo pri týchto
       konkrétnych hodnotách dávalo width iba niekoľko px (overené
       priamo - 8px namiesto správnych ~146px, colorsnap diff tento
       tiket). "right: auto" toto ruší - iba "left" určuje pozíciu,
       šírka sa vracia na shrink-to-fit (auto), presne ako .header-
       icon-group vyššie robí VŽDY (má iba "right", žiadny "left"). */
    right: auto;
    left: max(
        calc(24px + clamp(160px, 42cqw, min(calc(300px * var(--ui-scale-kompenzacia, 1)), 460px))),
        calc(40px + clamp(160px, 42cqw, 300px) + 66px * var(--ui-scale-kompenzacia, 1))
    );
}

#favorites-trigger,
#favorites-clear-trigger {
    font-size: 0.85rem;
    line-height: 1;
}

/* Vyplnené červené srdiečko - aspoň 1 obľúbený byt existuje (bod 2 zadania,
   js/favorites.js, .is-active prepínaná pri KAŽDEJ zmene). Farba je
   samostatná (nie odvodená od STATUS_COLORS.predany) - srdiečko je globálny
   indikátor obľúbenosti, nie stavu bytu, preto vlastná nezávislá hodnota. */
#favorites-trigger.is-active {
    color: #e0473e;
    border-color: rgba(224, 71, 62, 0.4);
    /* Sekcia zadania "Pilulka s obľúbenými... zlaté tlačidlo 'MÔJ VÝBER -
       N'" - ID+class selektor (rovnaký hák appka už používa pre farbu
       vyššie, specificita 1,1,0), explicitne vyššia než zdieľaná #app-
       info-trigger/#share-app-trigger/#favorites-trigger/#favorites-
       clear-trigger základná sadzba (1,0,0) - žiadny !important (KROK
       1.12). Iba TENTO stav (aspoň 1 obľúbený byt) mení tvar z kruhu na
       pilulku - stav 0 bytov (bez tejto triedy) je preto bit-presne
       nedotknutý, dedí VŠETKY vlastnosti zo zdieľanej základnej sadzby
       bez zmeny.
       max-width prechod (0.78rem text + kruh 30px*K) - CSS nevie
       animovať width:auto priamo, preto sa mení max-width (animovateľná
       vlastnosť) zo šírky pokojového kruhu (`calc(30px*K)`, ZHODNÉ s
       hodnotou v základnej sadzbe vyššie) na dostatočne veľký strop
       (`calc(220px*K)`, s rezervou nad reálne nameranou max. šírkou
       ~150-201px pri N=10 na najväčšom testovanom rozlíšení, report
       tiketu KROK 0g) - `width:auto` + rastúci strop dáva vizuálne
       plynulé "vysúvanie" textu (overflow:hidden na základnej sadzbe
       nižšie skrýva pretekajúci text počas prechodu), no FINÁLNA
       veľkosť je vždy presne obsahová (content-hugging), nie strop
       samotný, keďže width:auto rešpektuje max-width iba ako HORNÚ
       hranicu. `grid-template-columns` s fr-jednotkami by bolo
       alternatívou, ale max-width prechod je appke known-compatible
       vzor (jednoduchá CSS transition, žiadny nový animačný systém,
       KROK 1.7) bez závislosti na novšej CSS grid-animácii. */
    max-width: calc(220px * var(--ui-scale-kompenzacia, 1));
    width: auto;
    border-radius: 999px;
    background: var(--btn-primary-bg);
    padding: 0 calc(10px * var(--ui-scale-kompenzacia, 1)) 0 0;
    gap: calc(6px * var(--ui-scale-kompenzacia, 1));
    justify-content: flex-start;
    /* Sekcia zadania "Na dotykových zariadeniach (K>1) zväčšiť viditeľný
       lem okolo zlatého tlačidla" - PRÍČINA (KROK 0d): #favorites-
       trigger-group (.header-icon-group, riadok ~1077) má height:
       var(--header-row-height, ...) - JS-odmeranú z #app-logo (js/
       scale.js), ktorá rastie s K NEPRIAMO (logo rastie iba cez
       line-height textu, nie lineárne) - zatiaľ čo predtým nezmenená
       výška tlačidla (calc(30px*K), zdieľaná báza) rastie PRIAMO/
       lineárne s K. Pri nízkom K (1024×768, K≈1,125) --header-row-height
       ešte "vyhráva" (kladný lem +1,13px reálne), ale pri vyššom K
       (915×412 K≈1,57, 800×360 K≈1,8) lineárny rast tlačidla PREDBEHNE
       sub-lineárny rast pilulky - tlačidlo je reálne VYŠŠIE než
       dostupný priestor (reálne skupinové výšky namerané priamo: 17,17px
       @915×412, 16,33px @800×360, oproti nezmenenej výške tlačidla
       17,995/18px) - odtiaľ záporný lem (-0,41/-0,83px). TOTO ISTÉ
       sub/lineárne rozchádzanie sa už appka má zdokumentované pri
       samotnom #header-icon-group (komentár vyššie, "sub-pixelové
       pretečenie... vizuálne zanedbateľné") - tam sa NERIEŠI (mimo
       rozsahu, "I"/odkaz pilulka sa nemení), tu SA rieši, keďže ide o
       NOVÝ, nápadnejší (celé tlačidlo, nie iba kruh) prípad.
       (a) Prečo K-only (rovnaký clamp-rampa mechanizmus ako .apartments-
       summary-cta font-size/padding) a nie @media (pointer:coarse) -
       touch-desktop (K=1) MÁ pointer:coarse rovnako ako mobil, ale
       desktop sa NESMIE zmeniť (zadanie) - K je jediný mechanizmus,
       ktorý correctne rozlíši "desktop vrátane touch-desktopu" (VŽDY
       K=1) od skutočne stlačených viewportov (VŽDY K>1).
       (b) Cieľ: pri K=1 clamp() vráti presne 30px (horná hranica,
       nezmenené, KROK 1.3). Pri K>1 saturuje na 20px (dolnú hranicu,
       K=1-ekvivalentná hodnota) - keďže K·scale=uiMinScaleFactor(0,6)
       KONŠTANTNE kým je K aktívne (CLAUDE.md sekcia 3, rovnaká identita
       ako pri .apartments-summary-cta), reálna výška tlačidla je
       KONŠTANTNÝCH 20×0,6=12px na VŠETKÝCH troch dotykových
       zariadeniach (overené priamo, KROK 2). Keďže dostupná výška
       pilulky (--header-row-height) NIE JE konštantná (viď vyššie -
       independentná od K·scale identity, JS-meraná z loga), výsledný
       LEM (dostupná výška − 12px, /2) NIE JE bit-identický naprieč
       zariadeniami (4,13px @1024×768, 2,58px @915×412, 2,17px
       @800×360) - je to DÔSLEDOK premennej dostupnej výšky, ktorú
       zadanie explicitne zakazuje meniť (--header-row-height/js/
       scale.js), nie chyba tohto mechanizmu. Všetky tri spĺňajú
       požadovaných "aspoň ~2px". */
    height: calc(clamp(20px,
                       calc(30px - 1000px * (var(--ui-scale-kompenzacia, 1) - 1)),
                       30px) * var(--ui-scale-kompenzacia, 1));
}

#favorites-trigger.is-active:hover,
#favorites-trigger.is-active:focus-visible {
    background: var(--btn-primary-bg-hover);
    box-shadow: var(--btn-primary-shadow-hover);
    border-color: rgba(224, 71, 62, 0.4);
    color: #e0473e;
}

#favorites-trigger.is-active:active {
    background: var(--btn-primary-bg-active);
}

#favorites-trigger.is-active .favorites-heart-icon path {
    fill: currentColor;
}

/* Textová časť zlatého tlačidla ("MÔJ VÝBER - N") - VLASTNÁ farba
   (tmavá, --btn-primary-text, rovnaký token ako .compare-apartments-btn/
   .apartments-summary-cta), NIE zdedená z #favorites-trigger.is-active
   (tá je červená #e0473e - určená pre ikonu srdiečka cez currentColor,
   viď pravidlo vyššie) - bez tohto by text zdedil červenú namiesto
   tmavej. */
#favorites-trigger .favorites-trigger-label {
    font-size: 0.78rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--btn-primary-text);
    white-space: nowrap;
    line-height: 1;
}

/* Vnútorný tmavý kruh so srdiečkom vnútri zlatého tlačidla - PRESNE
   rovnaké rozmery/pozadie ako pokojový (neaktívny) kruh #favorites-
   trigger samotné (calc(30px*K), var(--btn-secondary-bg-nested)) -
   "kruh zachováva dnešný vzhľad" (zadanie) doslovne, žiadny nový odtieň/
   rozmer. Vypĺňa CELÚ výšku tlačidla (žiadny vertikálny padding na
   #favorites-trigger.is-active vyššie), takže vizuálne pôsobí ako
   zaoblená "čiapočka" na ľavom konci pilulky.
   Sekcia zadania "Zväčšiť lem okolo zlatého tlačidla" - width/height TU
   je DOSLOVNE ROVNAKÝ clamp() výraz ako height na #favorites-trigger.
   is-active vyššie (nie nová/nezávislá hodnota) - kruh tak ostáva VŽDY
   presne 1:1 flush s výškou svojho rodičovského tlačidla, na KAŽDOM K,
   rovnako ako predtým (pri 30px*K). Keď sa tlačidlo pri K>1 zníži na
   20px*K layout (12px reálne), kruh sa zníži identicky - nikdy
   nepretečie cez okraj tlačidla (KROK 1.5), bez potreby samostatného
   vnútorného odsadenia - kruhov vlastný border-radius:50% pri
   width=height=výška tlačidla sa VŽDY presne prekrýva so zaobleným
   ľavým koncom tlačidla (border-radius:999px), rovnaký princíp ako pri
   pôvodnom 30px*K stave. */
#favorites-trigger .favorites-trigger-circle {
    width: calc(clamp(20px,
                      calc(30px - 1000px * (var(--ui-scale-kompenzacia, 1) - 1)),
                      30px) * var(--ui-scale-kompenzacia, 1));
    height: calc(clamp(20px,
                       calc(30px - 1000px * (var(--ui-scale-kompenzacia, 1) - 1)),
                       30px) * var(--ui-scale-kompenzacia, 1));
    border-radius: 50%;
    background: var(--btn-secondary-bg-nested);
    display: flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
}

/* Pokojový stav (N=0, bez .is-active) - max-width/overflow/transition
   pridané TU (nie do zdieľanej základnej sadzby) - iba na #favorites-
   trigger, nemení #app-info-trigger/#share-app-trigger/#favorites-
   clear-trigger. max-width v pokoji == presne dnešná šírka kruhu
   (žiadna vizuálna zmena v stave 0), transition zoznam rozširuje (nie
   nahrádza) zdieľaný "background/border-color/color" prechod zo
   základnej sadzby o max-width/padding/gap (KROK 1.7 - jedna
   transition, žiadny nový animačný systém). Appka nemá inde
   prefers-reduced-motion (overené grepom) - nepridáva sa ani tu. */
#favorites-trigger {
    max-width: calc(30px * var(--ui-scale-kompenzacia, 1));
    overflow: hidden;
    transition: background 200ms ease, border-color 200ms ease, color 200ms ease,
                max-width 220ms ease, padding 220ms ease, gap 220ms ease;
}

.favorites-heart-icon,
.favorites-trash-icon {
    width: calc(16px * var(--ui-scale-kompenzacia, 1));
    height: calc(16px * var(--ui-scale-kompenzacia, 1));
    flex-shrink: 0;
}

/* ==========================================================================
   🏷️ TRVALÝ ŠTÍTOK "TESTOVACIA VERZIA" (sekcia zadania "Pridať do hornej
   lišty trvalý štítok...") - samostatná, absolútne pozicovaná pilulka
   (rovnaký princíp ako #app-logo/#header-icon-group/#favorites-trigger-
   group - top:16px, žiadny spoločný kontajner, KAŽDÁ vlastný position:
   absolute).

   KOTVENIE ("right:", KROK 0d/KROK 1.5 - pozícia nesmie závisieť od N):
   namerané voľné miesto medzi #favorites-trigger-group (pri N=10,
   najširší stav) a #right-panel-stack (karta "Prémiová Rezidencia") je
   210-1472px na VŠETKÝCH 6 testovaných rozlíšeniach (report tiketu) -
   kotvenie OD #favorites-trigger-group by vyžadovalo duplikovať jeho
   CELÚ (zložitú, viacvetvovú) šírkovú/pozičnú formulu VRÁTANE
   worst-case šírky (220px*K max-width tlačidla + kôš + gap + padding),
   krehké a náchylné na rozídenie pri budúcej zmene. Namiesto toho
   kotvené OD #right-panel-stack (karta "Prémiová Rezidencia") - JEHO
   vlastný "right:16px; width:clamp(...)" vzorec (css/layout.css
   riadok ~511) je jednoduchý A 100% NEZÁVISLÝ od obľúbených, takže
   pozícia štítku sa pri zmene N nikdy nehýbe (spĺňa KROK 1.5 triviálne,
   nie iba "v praxi sa nezmestí"). "right" tu je odvodené PRESNE ako
   #favorites-trigger-group odvodzuje svoje "left" od #header-icon-group
   vyššie - duplikuje EXISTUJÚCI vzorec (#right-panel-stack šírka), nie
   nová hodnota: 16px (medzera štítok<->karta, rovnaká ako karta<->okraj
   obrazovky) + šírka karty + 16px (jej vlastný "right"). Overené priamo
   (KROK 2) - žiadny prekryv s kartou ani s #favorites-trigger-group pri
   N=10 na žiadnom zo 6 rozlíšení.
   Žiadny "left" - width ostáva auto/shrink-to-fit (KRITICKÉ poznanie z
   predošlého tiketu: position:absolute prvok s OBOMA left AJ right by
   namiesto shrink-to-fit vynútil width=container-left-right). */
#test-version-badge {
    position: absolute;
    top: 16px;
    right: calc(32px + clamp(160px, 44cqw, min(calc(320px * var(--ui-scale-kompenzacia, 1)), 480px)));
    /* Rovnaká --header-row-height ako #header-icon-group/#favorites-
       trigger-group (KROK 1.1 - "výška zhodná s ostatnými pilulkami"),
       ZDIEĽANÁ CSS premenná (js/scale.js ju už nastavuje pre existujúce
       pilulky) - žiadna nová logika, --ui-scale-kompenzacia/js/scale.js
       nedotknuté (mimo rozsahu). */
    height: var(--header-row-height, calc(38px * var(--ui-scale-kompenzacia, 1)));
    z-index: 15;
    box-sizing: border-box;
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 0 calc(12px * var(--ui-scale-kompenzacia, 1));
    /* Sekcia zadania "Stacky, výplň Prémiovej, banner" (Časť E) - farba
       zmenená z "varovnej" --status-warning-light (žltá, zdieľaná s
       .filter-tile.tile-akcia - tá sa touto zmenou NEDOTÝKA) na NOVÝ
       token --status-danger-strong (#c0392b, project.config.js/css/
       base.css) - tmavšia červená než existujúca --status-danger-light
       (#f87171, tá je určená pre text/ikonu NA TMAVOM skle, na plnej
       bielej dáva iba 2,77:1 - pod AA), --status-danger-strong dáva na
       bielej 5,44:1 (nad AA 4,5:1, priamo spočítané). Výplň TERAZ plná
       nepriehľadná biela (predtým tónovaná žltá `rgba(241,196,15,0.12)`)
       - `rgb(var(...)/alfa)` syntax tu už netreba (žiadny hex-string
       problém, farba sa nemieša s pozadím). E1 diagnostika: pôvodná
       `background` deklarácia sa NIKDY neaplikovala (computed vracalo
       plne priehľadné rgba(0,0,0,0)) - príčina bola preklep v komentári
       PRIAMO NAD touto deklaráciou (odstránené, viď git history) - text
       obsahoval "--accent" a "--btn-primary" oddelené hviezdičkou a
       lomkou BEZ medzery, čím vznikla doslovná dvojznaková sekvencia
       hviezdička-lomka, čo predčasne UKONČILO CSS komentár uprostred vety
       (POZOR pri budúcich editáciách tohto komentára - tú istú sekvenciu
       NEPÍSAŤ znova bez medzery navôkol, ani v tomto vysvetlení); zvyšok
       zamýšľaného komentárového textu sa stal neplatným "CSS", ktorého
       parser error-recovery pohltil aj nasledujúcu `background`
       deklaráciu (priamo overené `document.styleSheets` - cssText
       pravidla `background` vôbec neobsahoval; po oprave medzery sa
       objavil a computed hodnota sa opravila). */
    background: #ffffff;
    border: 1px solid var(--status-danger-strong);
    border-radius: 999px;
    backdrop-filter: blur(16px);
    -webkit-backdrop-filter: blur(16px);
    box-shadow: 0 10px 24px rgba(0, 0, 0, 0.35);
    /* KROK 1.3 - trvalý, neklikateľný: nesmie zachytávať kliky ani
       blokovať scénu pod sebou (žiadny <button>/role/tabindex v markupe
       - iba obyčajný <div>, žiadne "zbytočné ARIA hacky"). */
    pointer-events: none;
}

.test-version-badge-icon {
    width: calc(16px * var(--ui-scale-kompenzacia, 1));
    height: calc(16px * var(--ui-scale-kompenzacia, 1));
    color: var(--status-danger-strong);
    flex-shrink: 0;
}

.test-version-badge-label {
    font-size: 0.78rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--status-danger-strong);
    white-space: nowrap;
    line-height: 1;
}

/* Celoplošná centrovacia vrstva (rovnaký princíp ako #apartment-detail-
   panel, css/detail.css) - okno je teraz VŽDY v strede fasády, na
   VŠETKÝCH veľkostiach obrazovky (predtým ukotvené nad ikonkou, iba malý
   anchored popover). pointer-events:none tu prepúšťa klik na pozadie
   (fasádu) - "klik mimo zatvára" logika v js/ui.js (popover.contains)
   funguje bezo zmeny, keďže klik na pozadie vôbec nezasiahne tento prvok. */
#app-info-popover {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    z-index: 200;
    display: flex;
    align-items: center;
    justify-content: center;
    pointer-events: none;
}

.info-popover-hidden {
    display: none !important;
}

/* Samotná viditeľná karta - ZVÄČŠENÁ oproti pôvodnému malému popoveru
   (min-width 220→320px, max-width 280→480px, padding ~1.7×) - font-size
   textu vnútri (#app-info-popover-text nižšie) sa NEMENÍ, rastie iba
   kontajner samotný. */
.app-info-popover-card {
    position: relative;
    pointer-events: auto;
    min-width: calc(320px * var(--ui-scale-kompenzacia, 1));
    max-width: min(480px, 90cqw);
    background: rgb(var(--surface-panel-rgb) / 0.9);
    border: 1px solid rgb(var(--hairline-rgb) / 0.08);
    border-radius: 16px;
    padding: calc(28px * var(--ui-scale-kompenzacia, 1)) calc(36px * var(--ui-scale-kompenzacia, 1)) calc(28px * var(--ui-scale-kompenzacia, 1)) calc(28px * var(--ui-scale-kompenzacia, 1));
    backdrop-filter: blur(20px);
    -webkit-backdrop-filter: blur(20px);
    box-shadow: 0 20px 40px rgba(0, 0, 0, 0.5);
}

#app-info-popover-text {
    margin: 0;
    font-size: 0.8rem;
    line-height: 1.5;
    color: var(--text-body);
}

#app-info-popover-text a {
    color: rgb(var(--accent-rgb));
    text-decoration: underline;
    text-underline-offset: 2px;
}

#app-info-popover-text a:hover {
    color: var(--accent-light);
}

#app-info-close {
    position: absolute;
    top: 6px;
    right: 6px;
    width: calc(22px * var(--ui-scale-kompenzacia, 1));
    height: calc(22px * var(--ui-scale-kompenzacia, 1));
    display: flex;
    align-items: center;
    justify-content: center;
    border: none;
    background: transparent;
    color: var(--text-faint);
    font-size: 1.1rem;
    line-height: 1;
    cursor: pointer;
    transition: color 200ms ease;
}

#app-info-close:hover {
    color: var(--text-bright);
}

/* ==========================================================================
   🎬 EFEKT 3D PRELETU A ROZMAZANIA (PANO2VR MOTION BLUR KOORDINÁCIA)
   ========================================================================== */
.facade-media-element {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
    transition: opacity 0.4s ease-in-out, transform 0.4s cubic-bezier(0.25, 1, 0.5, 1), filter 0.4s ease-in-out;
    opacity: 0;
    filter: blur(12px);
    transform: scale(1.06);
    z-index: 1;
    will-change: transform, opacity, filter;
}

.facade-media-element.visible {
    opacity: 1;
    filter: blur(0px);
    transform: scale(1);
    z-index: 3;
}

.facade-media-element.preparing {
    opacity: 0;
    filter: blur(10px);
    transform: scale(0.95);
    z-index: 2;
}

/* ==========================================================================
   ⏳ ČAKANIE NA PRIPRAVENOSŤ POHĽADU (js/apartments.js, zacniCakanieFasady)
   Vrstvy v .center-visual-zone: médium (3), snímok a stlmenie (4), badge (5,
   css/apartments.css), spinner a správa (7). Všetko mimo čakania je úplne
   vypnuté (opacity:0, pointer-events:none). Chrome appky je mimo zóny a ostáva
   nad ňou. (Pozor: v komentári nepísať hviezdička-lomka.)
   ========================================================================== */
#facade-snapshot-canvas {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    object-fit: cover; /* rovnako ako .facade-media-element - bez skoku pri výmene */
    z-index: 4;
    opacity: 0;
    pointer-events: none;
    transition: opacity 300ms ease;
}

#facade-snapshot-canvas.facade-snapshot-visible {
    opacity: 1;
    transition: none; /* objaví sa okamžite (pod ním médium po výmene zdroja zčernie), dohasína plynulo */
}

#facade-loading-overlay {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    z-index: 4; /* v DOM za canvasom, teda nad snímkom */
    background: rgba(0, 0, 0, 0.45);
    opacity: 0;
    pointer-events: none;
    transition: opacity 250ms ease;
}

#facade-loading-overlay.facade-loading-overlay-visible {
    opacity: 1;
}

/* Modifikátor spinnera (základ .media-loading-spinner, css/base.css) - dve
   triedy v selektore, takže sa nedotkne spinnerov galérie/VR/POI. */
.media-loading-spinner.media-loading-spinner--fasada {
    width: calc(48px * var(--ui-scale-kompenzacia, 1));
    height: calc(48px * var(--ui-scale-kompenzacia, 1));
    margin: calc(-24px * var(--ui-scale-kompenzacia, 1)) 0 0 calc(-24px * var(--ui-scale-kompenzacia, 1));
    border-width: calc(6px * var(--ui-scale-kompenzacia, 1));
    box-sizing: border-box;
    z-index: 7;
    /* Kontrast na stlmenom pozadí (svetlý aj nočný pohľad): svetlejší oblúk
       (--accent-strong-rgb), biela stopa, tmavý kruhový podklad a tieň. Iba
       tento modifikátor - spinnery galérie/VR/POI ostávajú na základe z base.css. */
    border-color: rgb(var(--hairline-rgb) / 0.35);
    border-top-color: rgb(var(--accent-strong-rgb));
    background: rgb(var(--surface-panel-rgb) / 0.6);
    box-shadow: 0 0 calc(10px * var(--ui-scale-kompenzacia, 1)) rgb(0 0 0 / 0.55);
}

.facade-loading-message {
    position: absolute;
    top: calc(50% + 24px * var(--ui-scale-kompenzacia, 1) + 16px * var(--ui-scale-kompenzacia, 1));
    left: 50%;
    transform: translateX(-50%);
    width: max-content;
    max-width: min(80%, calc(560px * var(--ui-scale-kompenzacia, 1)));
    box-sizing: border-box;
    padding: calc(10px * var(--ui-scale-kompenzacia, 1)) calc(18px * var(--ui-scale-kompenzacia, 1));
    border-radius: 12px;
    background: rgb(var(--surface-panel-rgb) / 0.82);
    color: var(--text-strong);
    font-size: 1.05rem;
    line-height: 1.4;
    text-align: center;
    z-index: 7;
    opacity: 0;
    visibility: hidden;
    pointer-events: none;
    transition: opacity 200ms ease;
}

.facade-loading-message.facade-loading-message-visible {
    opacity: 1;
    visibility: visible;
}

/* Badge počas čakania na pripravenosť pohľadu (stav riadi modul, nie DOM). */
.facade-overlay-container.facade-badges-pending {
    opacity: 0;
    visibility: hidden;
}

.facade-overlay-container.facade-badges-reveal {
    animation: facade-badges-reveal 400ms ease-in-out;
}

@keyframes facade-badges-reveal {
    from { opacity: 0; }
    to { opacity: 1; }
}

/* ==========================================================================
   🎬 PRECHODOVÉ VIDEÁ MEDZI POHĽADMI (sekcia zadania "Dátovo riadená
   detekcia a použitie video prechodov medzi pohľadmi") - js/facade-
   transition.js. JEDEN zdieľaný <video> element, priamy potomok .center-
   visual-zone - vyšší z-index než .facade-media-element.visible (3) AJ
   .facade-overlay-container (odznaky bytov, css/apartments.css, 5), aby
   počas prehrávania prekryl CELÚ scénu (zámerne - "kamera sa presúva"
   efekt, nie iba výmena obrázka pod odznakmi). Skryté (opacity:0,
   pointer-events:none) mimo aktívneho prechodu - appka ho vytvorí raz a
   znovupoužíva, medzi prechodmi teda existuje v DOM, ale je neviditeľné a
   neprekáža žiadnej interakcii s fasádou pod ním. ========================================================================== */
#facade-transition-video {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
    z-index: 6;
    opacity: 0;
    pointer-events: none;
}

#facade-transition-video.facade-transition-video-visible {
    opacity: 1;
    pointer-events: auto;
    /* 🎥 Dynamická "whip pan" blur krivka (sekcia zadania "Dynamický blur
       efekt") - 2s je iba fallback pre prípad, že by JS (js/facade-transition.js,
       naMetadata) z nejakého dôvodu nestihol prepísať skutočnú dĺžku videa cez
       inline animation-duration skôr, než prehliadač animáciu spustí. Keyframe
       PERCENTÁ (nie časy) zabezpečujú, že krivka zostáva proporčne rovnaká
       nezávisle od skutočnej dĺžky konkrétneho prechodového videa. */
    animation: facade-transition-blur 2s linear forwards;
}

@keyframes facade-transition-blur {
    0% { filter: blur(0); }
    15% { filter: blur(9px); }
    75% { filter: blur(9px); }
    100% { filter: blur(0); }
}

/* Krátky crossfade na konci prechodu (sekcia zadania "Plynulý crossfade na
   konci") - pridáva sa AŽ tesne pred koncom prehrávania (js/facade-transition.js),
   keď je cieľový pohľad pod videom už zaručene .visible (pripravený vopred
   bodom 2 zadania) - video sa preto môže bezpečne "rozpustiť", odhaľujúc už
   hotový cieľový pohľad, namiesto tvrdého okamžitého zmiznutia. Deklarované
   AŽ PO .facade-transition-video-visible, aby v prípade rovnakej špecifickosti
   (obe iba jedna trieda) vyhrala táto - opacity:0 s tranzíciou - nad
   opacity:1 bez tranzície pri počiatočnom zobrazení videa (to zostáva
   zámerne okamžité, bez fade-in, zadanie sa fade-inu netýka). */
.facade-transition-video-fadeout {
    transition: opacity 180ms ease-out;
    opacity: 0;
}

/* ==========================================================================
   📱 PRAVÝ PANEL - ZÚŽENIE NA DOTYKOVÝCH ZARIADENIACH (sekcia zadania
   "Skryť ikonky fasády/pôdorysu v zozname 'Dostupné byty' na mobile/
   tablete, zúžiť a zjednotiť šírku pravého panela")

   Rovnaký (hover:none) and (pointer:coarse) gate ako js/gate.js,
   jeDotykoveZariadenie() - IDENTICKÝ mechanizmus, aký appka už používa pre
   K-kompenzáciu (css/apartments.css, .card-thumb skrytie nižšie) a pre
   vynútenie buttonu "SPUSTIŤ KONFIGURÁTOR". PC aj "touch table" (veľká
   dotykové obrazovka) ostávajú NEDOTKNUTÉ z ROVNAKÉHO dôvodu, aký platí aj
   pre K-kompenzáciu naprieč celou appkou - "touch table" má v praxi vždy
   dosť veľkú obrazovku, aby jej scale prirodzene dosahoval/presahoval
   uiMinScaleFactor (K=1), a mimo tejto @media podmienky ostáva úplne
   pôvodná (320px/480px) šírka nedotknutá.

   .apartment-card na dotykových zariadeniach už nezobrazuje .card-thumb
   (css/apartments.css) - fotka/ikonka zaberala 52px*K + 12px medzery
   (reference px) na KAŽDOM riadku zoznamu "Dostupné byty", tento priestor
   sa už nemusí rezervovať. Šírka sa tu zužuje na PRESNE rovnaký vzorec
   ako ľavý filter panel (#configurator-filters) - "zjednotenie" v zadaní
   platí nielen medzi Základným/Rozšíreným módom (ten bol identický už
   predtým, jeden spoločný #right-panel-stack), ale aj vizuálne medzi
   ľavým a pravým panelom (rovnaká medzera od fasády na oboch stranách). */
@media (hover: none) and (pointer: coarse) {
    /* Sekcia zadania "Stacky, výplň Prémiovej, banner" (Časť C) - PREDTÝM
       tu bol `#vyber-blokov-project-info-panel` (PANEL Výberu blokov)
       namiesto `#vyber-blokov-right-stack` (jeho STACK) - asymetria voči
       fasáde, kde sa zužuje VÝHRADNE stack (`#right-panel-stack`), nikdy
       priamo panel (`#project-info-panel` naň iba flex-stretchne). Táto
       asymetria bola PRIAMO POTVRDENÁ príčinou (Krok C1 diagnostiky, nie
       hypotéza) toho, prečo `#vyber-blokov-project-info-panel` bol užší
       než VLASTNÝ stack (`#vyber-blokov-right-stack` zostával na
       320px/480px, nikdy sem zaradený) - panel dostával 300/460 priamo,
       stack nie, takže sa nikdy nezhodovali.

       PRIAMO OTESTOVANÉ (nie predpoklad) - jednoduché nahradenie
       `#vyber-blokov-project-info-panel` za `#vyber-blokov-right-stack`
       PRIAMO TU nestačí: `#vyber-blokov-right-stack` má SVOJU VLASTNÚ base
       `width` (`css/vyber-blokov.css:78`, žiadny @media) - a `css/
       vyber-blokov.css` je v `index.html` LINKOVANÝ AŽ PO `css/layout.css`
       (riadok 18 vs. 10). Pri ROVNAKEJ špecificite (jeden ID selektor na
       oboch stranách) vyhráva pravidlo NESKÔR V CELKOVEJ KASKÁDE NAPRIEČ
       SÚBORMI (`@media` špecificitu nezvyšuje) - teda base pravidlo vo
       vyber-blokov.css by aj TAK vyhralo nad týmto touch override v
       layout.css, bez ohľadu na @media. Overené `CSS.getMatchedStylesForNode`:
       obe pravidlá sa matchujú, ale na dotyku VYHRÁVA vyber-blokov.css-ovská
       base hodnota (320/480), tento touch override sa NIKDY neuplatní.
       Preto zostáva TU už IBA `#right-panel-stack` (jeho vlastná base
       je TIEŽ v layout.css, skôr v súbore - tam poradie v súbore funguje
       spoľahlivo, nezmenené) - zodpovedajúci touch override pre
       `#vyber-blokov-right-stack` (identický vzorec) je TERAZ v `css/
       vyber-blokov.css`, hneď za jeho base pravidlom, kde spoľahlivo
       vyhráva. `#vyber-blokov-project-info-panel` už vlastné `width`
       pravidlo nemá nikde, flex-stretchne na šírku svojho (teraz tiež
       zúženého) stacku, presne ako `#project-info-panel` na fasáde. */
    #right-panel-stack {
        width: clamp(160px, 42cqw, min(calc(300px * var(--ui-scale-kompenzacia, 1)), 460px));
    }

    /* FULLSCREEN button (#fullscreen-blok-group vyššie) - sekcia zadania
       "Automatické obnovenie fullscreen okamžite pri otočení na landscape
       (mobil/tablet), s fallbackom na najbližší klik". Manuálne tlačidlo tu
       stráca zmysel - appka sa na dotykových zariadeniach TERAZ snaží
       fullscreen obnoviť sama (js/gate.js, pokusOObnovenieFullscreenPri
       Aktivacii + fallback na najbližšiu interakciu), button by bol
       nadbytočný/mätúci vedľa neho. PC/touch table (mimo tejto @media
       podmienky) ostávajú nedotknuté - tam manuálne tlačidlo zostáva jediný
       spôsob, appka sa tam fullscreen NIKDY sama nesnaží obnoviť.
       comment v js/fullscreen.js ("Tlačidlo je na mobile úplne skryté...")
       predtým odkazoval na TRVALE MŔTVY @container (max-height:450px, css/
       responsive.css) - tento nový, ŽIVÝ selektor ho nahrádza skutočným
       skrytím. */
    #fullscreen-blok-group {
        display: none;
    }

    /* Mobilný skrátený text "Mapa" (sekcia zadania "Mobilný text pre 'Čo je
       nablízku?'") - PRESUNUTÉ SEM z css/responsive.css, kde bol zabalený v
       TRVALE MŔTVOM @container (max-height:450px) - ten sa od zavedenia
       transform:scale() (js/scale.js, #app je VŽDY presne 1920×1080) už
       nikdy nesplní, "Mapa" sa preto v praxi nikdy nezobrazila (potvrdené
       priamym meraním - text aj scrollWidth/clientWidth pretečenie zostávalo
       identické na PC AJ mobile/tablete). Rovnaký ŽIVÝ (hover:none) and
       (pointer:coarse) gate ako zvyšok tohto bloku (#fullscreen-blok-group
       vyššie) - jediný breakpoint, na ktorom sa "Čo je nablízku?" skracuje na
       "Mapa" (css/layout.css base pravidlo vyššie definuje default desktop/
       tablet-touch stav plného textu, tu sa iba prehodí viditeľnosť oboch
       <span>). Platí na CELÝ dotykový rozsah (mobil AJ tablet), bez
       dodatočného max-height filtra - pretečenie bolo namerané na oboch. */
    #okolie-trigger .text-desktop {
        display: none;
    }
    #okolie-trigger .text-mobile {
        display: inline;
    }
}

/* ==========================================================================
   SPODNÝ RAD NA MOBILE/TABLETE (K>1, trieda ui-k-aktivne z js/scale.js) -
   zdieľané tlačidlá VÝBER BLOKU/MAPA (#mapa-blok-group) a VR/GALÉRIE
   (#vr-gallery-group) majú šírku z OBSAHU: text + 2x horizontálny padding
   (--bottom-row-btn-padding-x, rovnaká hodnota ako .view-btn v
   .pohlady-viac) + rámik. Skupina je grid s rovnako širokými stĺpcami
   (1fr pri max-content šírke), takže OBE tlačidlá v dvojici majú šírku
   dlhšieho textu. Kontajnery (.mapa-blok-corner/.vr-gallery-corner) sa
   zmršťujú na obsah a zostávajú ukotvené k okraju (left/right 16px), NOC
   ani svetové strany sa nehýbu, uvoľnené miesto ostáva prázdne. min-width
   podlahy 126K/138K (vznikli pre PC text "Čo je nablízku?") sa tu rušia,
   inak by držali pôvodné šírky. K=1 (PC/touch-table) bez zmeny - všetko
   je za .ui-k-aktivne. Vyššia špecificita namiesto !important. */
.ui-k-aktivne .mapa-blok-corner,
.ui-k-aktivne .vr-gallery-corner {
    width: auto;
}

.ui-k-aktivne #mapa-blok-group,
.ui-k-aktivne #vr-gallery-group {
    display: grid;
    grid-auto-flow: column;
    grid-auto-columns: 1fr;
    flex: 0 0 auto;
    min-width: 0;
}

.ui-k-aktivne #blok-vyber-trigger,
.ui-k-aktivne #okolie-trigger,
.ui-k-aktivne #vr-tours-trigger,
.ui-k-aktivne #gallery-trigger {
    min-width: 0;
    padding: 0 var(--bottom-row-btn-padding-x);
}
