/**
 * chatbot-2026.css -- offsety bubliny chatbot widgetu (`.zw-fab`).
 *
 * ROZHODNUTI ORCHESTRATORA 11. 9. 2026 po design review widgetu
 * (`~/Downloads/TH-redesign-2026-09-11/chatbot/REPORT.md`, nalezy 1 a 5).
 *
 * PROC VLASTNI SOUBOR A NE `components.css`. Tohle nejsou pravidla motivu,
 * ale OPRAVY CIZIHO WIDGETU, ktery na produkci vklada GTM
 * (`bot.z-agency.cz/widget-th.js?bot=terrahunt-cz|-en`, defer). Az se widget
 * zmeni, musi jit najit jedno misto podle jmena; v knihovne komponent by se
 * ztratily. `components.css` je navic sdileny soubor, do ktereho v soubehu
 * zapisuji dalsi agenti.
 *
 * PROC TO JDE PREPSAT Z MOTIVU. Widget si svuj `<style>` vklada JS do
 * `<head>` az po nacteni stranky (zadny Shadow DOM, zadny externi CSS),
 * takze pri STEJNE specificite by vyhral on. Vsechna pravidla nize maji
 * proto specificitu VYSSI nez jeho `.zw-fab` (0,1,0) -- `!important` neni
 * potreba a v tomhle projektu je zakazany (stylelint `declaration-no-important`).
 * Overeno ve zdroji widgetu: `!important` nepouziva nikde.
 *
 * CO Z MOTIVU PREPSAT NELZE: panel `#zw-widget` si widget prepina inline
 * (`w.style.display = 'none' | 'flex'`), takze `display` na nem ze
 * stylesheetu neprebijeme bez `!important`. Barva bubliny je rovnez inline
 * (z konfigurace bota v Marketing Hubu), meni se tam, ne tady.
 */

/**
 * (a) MOBILNI DOCK. `.mdock` je fixni lista u spodni hrany (zmereno 56 px
 * vysky, vyjizdi po scrollu pres 0,7 vysky viewportu). Bublina ma ve svem
 * vlastnim media dotazu `bottom: 12px`, takze na dock dosedne a prekryje
 * tlacitko „Ziskat navrh a cenu" (zmereno 52x44 px na vsech 8 strankach,
 * CZ i EN). 88 px = 56 px dock + 32 px odstup.
 *
 * OFFSET PLATI I KDYZ DOCK PRAVE NENI VIDET. Dock se objevuje a mizi podle
 * scrollu; kdyby se s nim bublina posouvala, poskakovala by pri kazdem
 * scrollu nahoru a dolu.
 */
@media (max-width: 440px) {
	body .zw-fab {
		bottom: 88px;
	}
}

/**
 * (b) OTEVRENA COOKIE LISTA. Lista `.th-cc` je fixni u spodni hrany
 * (`z-index: 9998`), bublina ma `z-index: 99999`, takze bez tohohle bloku
 * sedi bublina NA liste.
 *
 * VAZBA JE SOUROZENECKA, NE `:has()`. Skript listy ji vklada jako PRVNI
 * prvek `<body>` a widget pripoji `.zw-fab` na konec `<body>` -- obe jsou
 * prime deti `<body>`, takze obecny sourozenecky kombinator staci.
 * `:has()` je Safari 15.4+ / Chrome 105+, tedy MIMO matici `.browserslistrc`
 * (Safari 14.1, iOS 14.5, Chrome 90). Body tridu by musel nastavit skript
 * listy, a ten je bajtove shodny se zivou verzi a nesmi se menit.
 *
 * HODNOTY JSOU ZMERENE, NE ODHADNUTE (11. 9. na DEV, CZ i EN, sirky
 * 320-1920 px). Lista je o hodne vyssi, nez cekal REPORT (predpokladal
 * 120 px):
 *
 *   sirka        nejvyssi namerena lista    offset bubliny
 *   <= 440 px    504 px (CZ @320)           lista se skryva, viz nize
 *   441-899 px   417 px (CZ @441)           437 px
 *   >= 900 px    373 px (CZ @900)           393 px
 *
 * Hodnota pro >= 900 px se 11. 9. vecer ZVEDLA z 306 na 393 px: restyl
 * listy do designu 2026 (majitel 20:35, R2) ji na 900 px prodlouzil
 * z 286 na 373 px. Presne ten druh posunu, kvuli kteremu tady stoji
 * veta o premereni.
 *
 * POD 441 px SE BUBLINA SKRYVA MISTO POSUNU. Neni to design volba, ale
 * aritmetika: 504 px lista + 52 px bublina + odstup se na telefon s vyskou
 * 568 px (iPhone SE na sirku 320) nevejde -- jakykoli offset by bublinu
 * vystrcil nad horni hranu viewportu. Souhlas ma na telefonu prednost pred
 * chatem a po volbe se bublina vraci sama (lista zmizi z DOM).
 *
 * PRI ZMENE TEXTU SOUHLASU SE MUSI VYSKY PREMERIT -- lista roste s delkou
 * textu a offsety nize jsou z konkretniho zneni z 11. 9.
 */
@media (max-width: 440px) {
	.th-cc ~ .zw-fab {
		display: none;
	}
}

@media (min-width: 441px) and (max-width: 899px) {
	.th-cc ~ .zw-fab {
		bottom: 437px;
	}
}

@media (min-width: 900px) {
	.th-cc ~ .zw-fab {
		bottom: 393px;
	}
}

/**
 * (c) OTEVRENY PANEL POD LISTOU I DIALOGEM. Panel `#zw-widget` ma
 * `z-index: 99999`, tedy nad listou `.th-cc` (9998) i nad jejim dialogem
 * `.th-cc-modal` (9999). Zmereno 11. 9. probe skriptem (Playwright,
 * `elementFromPoint`): na 390 px prekryva panel listu ze 100 % (cela
 * plocha listy pod panelem), klik na odkaz "Nastavit podrobne" v liste
 * selhal timeoutem ve 3 ze 4 kombinaci sirka x jazyk -- misto tlacitka
 * dostaval klik panel.
 *
 * ROZHODNUTI MAJITELE 11. 9. 22:09 (`.planning/OWNER-DECISIONS.md`):
 * souhlas s cookies ma prednost pred panelem chatbotu. 9990 staci --
 * je pod listou (9998) i pod dialogem (9999), ale porad nad zbytkem
 * stranky.
 *
 * PO VOLBE SOUHLASU SKRIPT LISTY ODSTRANI `.th-cc` Z DOM (nekonci jen
 * schovanim), takze sourozenecky selektor uz neplati a panel se vrati
 * na puvodnich 99999 bez dalsiho zasahu.
 */
.th-cc ~ .zw-widget {
	z-index: 9990;
}

/**
 * (d) PLOVOUCI DOCK NA DESKTOPU (>= 768 px). Od tehle sirky prestava byt
 * `.mdock` spodni listou a stava se plovoucim sloupcem u prave hrany
 * (chrome.css, `@media (min-width: 768px) { .mdock {...} }`): telefon
 * (48 px) + mezera (12 px) + CTA „Ziskat navrh a cenu" (52 px) = 112 px,
 * odsazeny od dolni hrany 28 px. Bublina widgetu (`.zw-fab`) ma vlastni
 * vychozi offset (mimo tenhle kontrakt, viz hlavicka souboru) a bez
 * zasahu sedi ve stejnem rohu -- prekryva pravy okraj CTA tlacitka
 * (nalez majitele na produkci, T+30 11. 9.).
 *
 * POKYN MAJITELE 12. 9. 00:4x, DOSLOVA: „dal bych bota blize telefonu,
 * resp. tak jak jsou vzdalena od sebe tlacitka Ziskat navrh a telefon,
 * tak by mela byt od sebe vzdalena tlacitka telefon a bot." Mezera
 * CTA<->telefon je `.mdock { gap: 12px }` (chrome.css, >=768 px sloupec) --
 * zmereno DOM (`getBoundingClientRect`) na vsech 6 kontrolnich strankach,
 * 1440 i 2000 px: 12 px vzdy, beze zavislosti na sirce tlacitka CTA
 * (CZ/EN se lisi textem, ne mezerou).
 *
 * PROTO `var(--th-chatbot-offset)` MISTO VLASTNIHO CALC. Ta promenna uz
 * PRESNE tohle pocita (tokens.css:172-174): `--th-dock-h + --th-dock-float
 * + --th-safe-bottom + 12px` -- na desktopu `0 + 140 + 0 + 12 = 152px`,
 * se stejnou mezerou 12 px, jakou ma CTA<->telefon (dock-float uz v sobe
 * nese vysku telefonu, viz vyse). Je to i verejny kontrakt pro externi
 * chatbot (docs/chatbot-position-contract.md, sekce 1) -- pouzitim
 * stejne promenne misto opsaneho cisla se sablona a kontrakt uz nemuzou
 * rozejit.
 *
 * PROC UZ NENI TREBA `max(...)` SE STROPEM PRO MAPU. Do 1.27.4 tu byl
 * strop `189px` kvuli `.mapzoom` (+/- tlacitka mapy lokalit), ktery na
 * strankach s `.locmap` (Venkovni hry/Outdoor Games) sedel u PRAVEHO
 * DOLNIHO rohu (`bottom: 96px`) -- presne tam, kam by bublina s cistou
 * 152px mezerou zasahla (zmereno 950 px^2 prekryv na 1440 pred touhle
 * zmenou). Rozhodnutim majitele 12. 9. 00:5x se `.mapzoom` PRESOUVA
 * NAHORU (`top: 96px`, components.css) -- ctvrty zajemce o pravy dolni
 * roh (CTA/telefon/bublina/zoom) tim z rohu mizi a strop je zbytecny.
 * Overeno merenim po obou zmenach: 0 px^2 kolize FAB x .mapzoom na
 * 1440 i 2000, .locmap i mimo nej.
 *
 * OFFSET PLATI I KDYZ DOCK PRAVE NENI VIDET (scrollY < 0,7 vysky
 * viewportu, `dock.js`, `SCROLL_RATIO`) -- stejny duvod jako u (a): kdyby
 * se bublina posouvala jen kdyz je dock viditelny, poskakovala by pri
 * kazdem scrollu pres prah.
 *
 * PORADI V KASKADE: pravidlo (b) pro `.th-cc ~ .zw-fab` ma vyssi
 * specificitu (dve tridy vs. `body` + trida) a pri otevrene liste vyhraje
 * samo -- 393/437 px uz je nad 152 px, souperit neni o co. `.mdock` je
 * navic pri otevrene liste skryty (`th-cookie-consent.css`, `.th-cc ~
 * .mdock { display: none }`), takze kolize dock/FAB v tomhle stavu
 * nemuze nastat vubec.
 */
@media (min-width: 768px) {
	body .zw-fab {
		bottom: var(--th-chatbot-offset);
	}
}

/**
 * (e) VELIKOST BUBLINY -20 % (rozhodnuti majitele 12. 9. 00:5x: „ikona
 * bota klidne o 20 % mensi, zejmena na mobilu", ale plati na vsech
 * sirkach).
 *
 * `.zw-fab` je `<div class="zw-fab">💬</div>` -- emoji jako textovy
 * obsah, zadne SVG ani `background-image` (overeno ve zdroji widgetu,
 * DEV 12. 9.). Zmensit `width`/`height` by nestacilo: velikost emoji
 * uvnitr urcuje `font-size`, ktery si nastavuje widget sam (mimo tenhle
 * kontrakt) a neni znamo, jestli je relativni k rozmeru boxu -- riziko
 * rozjeti ikony vuci ramecku. `transform: scale(.8)` skaluje CELY
 * vykresleny box (ramecek, stin, emoji) rovnomerne bez odhadovani
 * vnitrni typografie.
 *
 * `transform-origin: bottom right` drzi vizualni PRAVY DOLNI ROH bubliny
 * na miste, ktere urcuji `bottom`/`right` z pravidel (a), (b), (d) vyse --
 * zmenseni ubira jen nahoru a doleva, roh zustava tam, kde ho ceka dock,
 * lista i mapa. Offsety se proto NEPREPOCITAVAJI: popisuji polohu
 * NEPRESKALOVANEHO boxu, jehoz pravy dolni roh je diky `transform-origin`
 * totozny s vizualnim po zmenseni. `getBoundingClientRect()` (tedy i
 * kolizni kontrola s dockem/CTA/mapou vyse) pocita uz s VYKRESLENYM
 * (zmensenym) boxem -- rezerva ke vsem sousedum se zmensenim jen zvetsila.
 *
 * ZMERENO 12. 9. na DEV pred zasahem: 52x52 px (390 px) a 60x60 px
 * (1440 px). Po `scale(.8)`: 41,6x41,6 px a 48x48 px -- pokles 20 % na
 * obou sirkach.
 */
body .zw-fab {
	transform: scale(0.8);
	transform-origin: bottom right;
}
