/* =========================================================================
   base.css: tokeny, reset, typografie, tlačítka, formulář, utility, animace
   Web Ing. Petr Škola, redesign 2026

   Načítá se jako první. Vše, co je tady, smí přebít layout.css → sections.css
   → variants.css (v tomto pořadí).

   PRAVIDLO: v tomto souboru je jediné místo, kde smí být barva zapsaná
   natvrdo: blok :root níže. Všude jinde jen var() nebo color-mix().

   Obsah:
     1. Tokeny
     2. Reset
     3. Základní plocha
     4. Typografie
     5. Odkazy a drobná text-utility
     6. Tlačítka
     7. Formulářové prvky
     8. Utility
     9. Animace (reveal, lines)
    10. Omezení pohybu
    11. Tisk
   ========================================================================= */


/* =========================================================================
   1. TOKENY
   Design studio je za běhu přepisuje jako inline style na <html>.
   Inline style vždy přebije i pravidla v @media níže, to je záměr.
   ========================================================================= */

:root {

  /* --- 1.1 Barvy: vlastní modré schéma ---------------------------------- */
  /* Vyexportováno z Design studia (seed: bg #EFF6FF, band #000000,
     text #171A20, on-band #E8ECF2, accent #124F97, accent-band #95BCE8). */

  --bg:            #EFF6FF;   /* hlavní světlá plocha */
  --bg-2:          #E3E9F2;   /* střídavý světlý pás */
  --surface:       #FBFCFF;   /* karty, formulář */
  --band:          #000000;   /* tmavý pás sekce, hlavička */
  --band-2:        #000000;   /* druhý tmavý pás */
  --footer-bg:     #000000;

  /* Barva, kterou si prohlížeč bere pro svoje vlastní lišty (adresní řádek
     na iOSu, záložka na macOS). Drží se plochy stránky, aby se rám okna
     nikdy neodlišil od obsahu. Kdo ji čte a proč, vysvětluje oddíl 3.1. */
  --chrome:        var(--bg);

  --text:          #171A20;   /* text na světlém */
  --text-mute:     #63676F;
  --on-band:       #E8ECF2;   /* text na tmavém */
  --on-band-mute:  #7C7F82;

  --accent:        #124F97;   /* výplň tlačítek, akcenty na světlém */
  --accent-hover:  #003F86;
  --accent-soft:   #CFE9FF;   /* jemné plochy, pozadí štítků */
  --accent-band:   #95BCE8;   /* akcent na tmavém pásu */
  --on-accent:     #FFFFFF;   /* text na --accent */

  --line:          rgba(23, 26, 32, .12);      /* linka na světlém */
  --line-strong:   rgba(23, 26, 32, .22);
  --line-band:     rgba(232, 236, 242, .13);   /* linka na tmavém */
  --line-band-2:   rgba(232, 236, 242, .24);

  --err:           #B4342F;   /* chyba na světlém */
  --err-band:      #F0A5A0;   /* chyba na tmavém */
  --ok:            #2C7A4B;

  --brand-blue:    #003DA5;   /* RE/MAX: jen drobné prvky */
  --brand-red:     #DC1C2E;

  /* --- 1.2 Písmo -------------------------------------------------------- */

  --font-display: "Poppins", "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
  --font-body:    "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Arial, sans-serif;

  /* Poppins je geometrické a na 600 drží; těsné prostrkání mu slepí
     nadpis do jednoho bloku, což je záměr tohoto schématu. */
  --display-weight:  600;
  --display-track:  -.042em;    /* prostrkání nadpisů, h2/h3 z něj počítají podíl */
  --display-case:    none;      /* none | uppercase */
  --display-lh:      1.06;

  --body-size:  17.5px;
  --body-lh:    1.7;

  /* --- 1.3 Tvarosloví --------------------------------------------------- */
  /* Oblé tvarosloví: 28px. Odvozeniny vyjdou 10 / 17 / 45 px. */

  --radius:   28px;
  --r-xs:     calc(var(--radius) * .35);
  --r-sm:     calc(var(--radius) * .62);
  --r-lg:     calc(var(--radius) * 1.6);
  --r-pill:   999px;            /* jen štítek nad fotkou nemovitosti */

  --border-w: 1px;              /* síla rámečků; styl „brutal“ ji zvýší */

  /* --- 1.4 Prostor ------------------------------------------------------ */

  --density:    0.75;           /* násobič vertikálního prostoru, 0.75–1.35 */
  --section-y:  calc(clamp(56px, 7.2vw, 112px) * var(--density));
  --wrap:       1280px;
  --wrap-slim:  720px;
  --pad:        clamp(20px, 4vw, 40px);
  --gap:        clamp(16px, 2vw, 28px);
  --header-h:   76px;           /* skutečnou výšku dopočítá app.js */

  /* Šířka vysunutého mobilního menu. Na telefonu vychází z 86 % okna: za
     panelem zůstane proužek ztmavené stránky, takže je znát, že se menu jen
     překrývá, ale položky uvnitř mají dost místa na velké písmo. Na tabletu
     by 86 % byl pruh přes půl metru, proto strop. */
  --menu-w:     min(86%, 400px);

  /* Odsazení plovoucího burgeru od horní hrany okna. Je to token, protože
     stejnou hodnotu potřebuje i horní řádek v panelu menu (.menu__top),
     aby popiska seděla přesně v ose křížku. Varianta nav="plovouci" ji
     zvyšuje, viz variants.css. */
  --burger-top: 8px;

  /* --- 1.5 Stíny -------------------------------------------------------- */
  /* Karta v klidu stín NEMÁ, jen rámeček. Stín se objeví až při hoveru. */

  --shadow-alpha: .13;          /* 0 = úplně bez stínů */
  --shadow-sm:  0 1px 2px rgba(0, 0, 0, calc(var(--shadow-alpha) * .5)),
                0 4px 12px rgba(0, 0, 0, calc(var(--shadow-alpha) * .6));
  --shadow-md:  0 2px 6px rgba(0, 0, 0, calc(var(--shadow-alpha) * .5)),
                0 14px 34px rgba(0, 0, 0, var(--shadow-alpha));
  --shadow-lg:  0 10px 28px rgba(0, 0, 0, var(--shadow-alpha)),
                0 40px 80px rgba(0, 0, 0, calc(var(--shadow-alpha) * 1.2));

  /* --- 1.6 Pohyb -------------------------------------------------------- */

  --motion:   1;                /* 1 = zapnuto, 0 = vypnuto (studio i reduced-motion) */
  --e-out:    cubic-bezier(.22, 1, .36, 1);
  --e-soft:   cubic-bezier(.4, 0, .2, 1);
  --e-panel:  cubic-bezier(.35, .19, .45, .91);  /* vysouvání menu */
  --t-fast:   .18s;
  --t:        .42s;
  --t-slow:   .66s;

  /* Odvozené délky, které už mají --motion započítané.
     Doplněno nad rámec §2.3 kontraktu, viz poznámka v odpovědi agenta. */
  --t-hover:   calc(.22s * var(--motion));   /* hover stavy */
  --t-reveal:  calc(.5s  * var(--motion));   /* odkrývání při scrollu */
  --t-image:   calc(.5s  * var(--motion));   /* scale obrázku při hoveru */
  --reveal-y:  16px;                         /* posun při odkrývání */

  /* --- 1.7 Zrnitost ----------------------------------------------------- */
  /* Jen na tmavých pásech. Textura je vygenerovaná inline SVG šumem,
     takže nepotřebuje žádný externí soubor ani obrázek. */

  --grain: .12;
  --grain-img: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160' viewBox='0 0 160 160'%3E%3Cfilter id='g'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23g)'/%3E%3C/svg%3E");

  /* --- 1.8 Drobné ikony jako data URI -----------------------------------
     Doplněno nad rámec §2.3 kontraktu, aby CSS nepotřebovalo externí soubor.
     `--ico-arrow` a `--ico-check` se používají jako maska, takže na barvě
     v jejich kresbě nezáleží, barvu dává `background: currentColor`.
     `--ico-chevron*` jde do <select> jako background-image, tam na barvě
     záleží, proto existuje světlá varianta pro tmavý pás. */

  --ico-arrow: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 12h15'/%3E%3Cpath d='m13 6 6 6-6 6'/%3E%3C/svg%3E");
  --ico-check: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m4 12.5 5.5 5.5L20 6.5'/%3E%3C/svg%3E");
  --ico-chevron: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
  --ico-chevron-band: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
}


/* --- 1.8 Rytmus sekcí po zlomech ----------------------------------------
   Kontrakt požaduje konkrétní hodnoty na konkrétních šířkách. clamp() sám
   je netrefí, proto je tady doladíme. Studio posílá jen --density, takže
   se s tím nepotkají; inline style z panelu má stejně přednost. */

@media (min-width: 1200px) {
  :root { --section-y: calc(112px * var(--density)); }
}

@media (max-width: 1024px) {
  :root {
    --section-y: calc(72px * var(--density));
    --body-lh:   1.65;
  }
}

@media (max-width: 768px) {
  :root {
    --section-y: calc(56px * var(--density));
    --header-h:  60px;
  }
}

/* Na úzkém displeji škálujeme prostrkání nadpisů s velikostí písma,
   konstantní −.028em by na malém nadpisu slepilo písmena. */
@media (max-width: 480px) {
  :root { --display-track: -.012em; }
}


/* --- 1.9 Intenzita pohybu z datového atributu ---------------------------- */

[data-motion="jemny"] { --motion: .65; --reveal-y: 8px; }
[data-motion="zadny"] { --motion: 0;   --reveal-y: 0px; }


/* =========================================================================
   2. RESET
   ========================================================================= */

*, *::before, *::after { box-sizing: border-box; }

html {
  -webkit-text-size-adjust: 100%;
  text-size-adjust: 100%;
  scroll-behavior: smooth;
}

body, h1, h2, h3, h4, h5, h6, p, figure, blockquote, dl, dd, ol, ul {
  margin: 0;
}

ul, ol { padding: 0; list-style: none; }

/* Seznamy uvnitř prózy si odrážky zaslouží. */
.prose ul, .prose ol { padding-left: 1.15em; list-style: revert; }

img, picture, video, canvas, svg {
  display: block;
  max-width: 100%;
}

img { height: auto; }

svg { flex: none; }

input, button, textarea, select {
  font: inherit;
  color: inherit;
}

button { background: none; border: 0; }

/* Safari na iOS čeká po každém ťuknutí, jestli nepřijde druhé. A když
   přijde, místo dvou kliknutí stránku přiblíží. Na burgeru se to projeví
   pokaždé, když s ním člověk zamává. Ovládací prvky proto dvojité ťuknutí
   nepřijímají; roztažení dvěma prsty zůstává, to `manipulation` neruší. */
a, button, label, summary, input, select, textarea, [role="button"] {
  touch-action: manipulation;
}

table { border-collapse: collapse; }

hr {
  border: 0;
  border-top: var(--border-w) solid var(--line);
  margin: 0;
}

/* Viditelný focus jen z klávesnice; myš ho nedostane. */
:focus { outline: none; }

:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 2px;
}

/* Obrys sám kopíruje zaoblení prvku. Textový odkaz žádné nemá, tak mu ho
   dáme, jen jemné 2px, aby rámeček nebyl ostrý roh. Na jiné prvky se to
   nesmí sáhnout, jinak by se jim při focusu měnil tvar. */
a:not([class]):focus-visible { border-radius: 2px; }

/* Výjimka pro .rail: svislou navigaci zapíná variants.css pouhou změnou
   `display`. Kdyby tu bylo !important, nešlo by to bez dalšího !important.
   Ve výchozím stavu ji stejně skrývá pravidlo `.rail` v layout.css. */
[hidden]:not(.rail) { display: none !important; }


/* =========================================================================
   3. ZÁKLADNÍ PLOCHA
   ========================================================================= */

body {
  min-height: 100svh;
  background: var(--bg);
  color: var(--text);
  font-family: var(--font-body);
  font-size: var(--body-size);
  line-height: var(--body-lh);
  font-weight: 400;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-rendering: optimizeLegibility;

  /* clip místo hidden: nevytváří scroll kontejner, takže sticky hlavička
     dál funguje. Pojistka proti vodorovnému posunu na 360 px. */
  overflow-x: clip;
}

/* Ořez musí být i na <html>. Samotné `overflow-x` na <body> nestačí:
   pokud cokoli přeteče (typicky prvek s position:fixed, který <body>
   neořezává), roluje se dokument, ne tělo. A stránka na mobilu jde
   odtáhnout prstem doleva. Tohle to zavírá na obou úrovních. */
html {
  overflow-x: clip;
  max-width: 100%;

  /* Web je jen světlý. Bez tohohle si prohlížeč na telefonu se zapnutým
     tmavým režimem obarví svoje lišty (a políčka formuláře) natmavo, i když
     stránka pod nimi zůstane světlá. */
  color-scheme: light;

  /* Záloha pro vzorkování popsané v oddílu 3.1: kdyby prohlížeč nesáhl po
     <body>, najde tutéž barvu tady. Vizuálně se nic nemění, obě plochy mají
     stejnou barvu. */
  background-color: var(--bg);

  /* Místo pro posuvník se drží pořád. Otevřené menu stránku zamyká
     (.is-locked v layout.css, oddíl 6) a bez tohohle by v tu chvíli
     posuvník zmizel a obsah by o jeho šířku poskočil do strany. Na mobilu
     ani na macOS se nic nemění, tam posuvník místo nezabírá. */
  scrollbar-gutter: stable;
}

/* --- 3.0b Odraz stránky u horní hrany (iOS) ------------------------------
   iOS nechá stránku na konci scrollu odskočit za hranu a pak ji pružinou
   vrátí. Odskočí přitom celá vrstva včetně prvků s position: fixed, což
   je na plovoucím burgeru vidět: ze záznamu na iPhonu klesne při dojezdu
   nahoru o 70 px (přesně tolik, co černý pás hlavičky pod ním) a zpátky
   se plazí skoro tři čtvrtě vteřiny. Tlačítko, které má stát pořád na
   jednom místě, tím jako jediné z celé stránky ztratí své místo.

   Odraz proto ve svislé ose vypínáme, ale ne pořád: tímtéž odrazem si iOS
   drží i tažení pro obnovení stránky. Vypnutý natvrdo o něj web přijde.

   Rozhoduje se proto podle toho, KDE gesto začalo, a to je práce pro JS:
   app.js přidá .is-nobounce na <html> při doteku, když stránka není úplně
   nahoře, a zase ho sundá, když nahoře je (initOdraz, oddíl „odraz“).
   Prst položený na odscrollované stránce tak nemá jak odraz vyvolat,
   dojezd nahoru se zastaví přesně na hraně a burger zůstane stát. Prst
   položený nahoře je naopak vždycky žádost o obnovení a odraz mu zůstává.
   Prohlížeč si hodnotu bere na začátku gesta, takže dojezd, který začal
   dole, doběhne bez odrazu, i když třída mezitím zmizí.

   Vodorovná osa zůstává `auto`, tu řeší `overflow-x: clip` výš. Jen do
   1080 px: nad tím žádný plovoucí prvek u hrany není a odpružení
   trackpadu na macOS není důvod brát. Zápis patří na <html>, odtud se
   přenáší na okno; <body> je pojistka pro prohlížeč, který by přenos
   řešil jinak (stejně jako .is-locked v layout.css, oddílu 6). */
@media (max-width: 1080px) {
  html.is-nobounce,
  html.is-nobounce body { overscroll-behavior-y: none; }
}


/* --- 3.1 Barva lišt prohlížeče (iOS Safari 26) ---------------------------
   Safari 26 přestalo poslouchat <meta name="theme-color"> (tag si přečte,
   hodnotu zahodí) a barvu „čela“ a „brady“ okna si bere přímo ze stránky.
   Popis níž není odhad z článků, ale to, co dělá zdrojový kód WebKitu
   (LocalFrameView::fixedContainerEdges a PageColorSampler::predominantColor):

     1. Pro horní i spodní hranu si Safari sáhne doprostřed té hrany,
        4 px dovnitř okna, a udělá tam hit-test. Zajímají ho jen prvky
        s position: fixed nebo sticky; pointer-events ani pořadí vrstev
        ho nezastaví, bere ten nejvýš položený.
     2. Když je nalezený prvek přes celou šířku okna (aspoň 90 %) a vyšší
        než 10 px, přečte z jeho stylu background-color. Nic dalšího:
        obrázky, gradienty ani to, co je doopravdy vidět, ho nezajímá.
     3. Když je prvek užší (typicky vysunuté menu u pravého kraje), stylu
        se nedovolá. Místo toho si VYFOTÍ dva pixely vysoký pruh u hrany
        okna, do fotky pustí jen fixní a lepivé vrstvy a z 29 vzorků vezme
        barvu, která má nadpoloviční většinu.
     4. Když nenajde nic (nebo mu vyjde „víc barev“), nevnutí lištám žádnou
        barvu a nechá je vypadat tak, jak je má uživatel nastavené.

   Bod 3 byl ta past. Menu je 86 % široké, takže spadne do fotky pixelů
   a ta je z 86 % černá, ať má prvek ve stylu napsáno cokoli.

   Cíl webu je bod 4: NEDÁVAT prohlížeči žádnou barvu, aby se choval stejně
   jako na stránce, která nic fixního u hrany nemá. Drží ho dvě opatření:

     • Oddíl 3.2 níž (backdrop-filter) vypíná vzorkování u prvků, které
       hranu okna zakrývají, tedy u menu a spodní lišty.
     • Pojistka pro bod 2: hlavička, menu, lišta i svislá navigace mají
       v background-color --chrome (= plocha stránky) a to, co je vidět,
       kreslí background-image. I kdyby prohlížeč barvu přece jen přečetl,
       přečte tu, kterou má stránka sama, ne černou.

   Pravidlo pro nové prvky: cokoli fixního nebo lepivého, co se dotkne horní
   či spodní hrany okna, nesmí mít viditelnou barvu v `background-color`.
   Barvu dejte do `background-image` (linear-gradient s jednou barvou vypadá
   stejně jako plocha). Hlavní obranu ale dělá oddíl 3.2, ta platí na
   všechno bez ohledu na styl jednotlivých prvků.

   `theme-color` v <head> zůstává: řídí se jím Chrome na Androidu, starší
   Safari (15–18) i web přidaný na plochu jako aplikace. Musí mít stejnou
   hodnotu jako --bg.
   ------------------------------------------------------------------------- */


/* --- 3.2 Podklad pruhů u hran okna (.edge-tint) --------------------------
   Pruh nad stránkou (u iPhonu okolo Dynamic Islandu) a lišta s adresou dole
   nejsou průhledné náhodou. WKWebView si barvu bere takhle:

       barva = barva plovoucího prvku u hrany  ?:  pozadí stránky

   a to první platí, JEN KDYŽ u hrany opravdu nějaký plovoucí prvek stojí.
   Když tam nic není, Safari pruh nevybarví a obsah stránky jím prosvítá.
   A jakmile se tam něco objeví (vysunuté menu), pruh se najednou vybarví
   a stránka pod ním viditelně poskočí.

   Řešení není prvky u hran schovávat, ale naopak je tam mít pořád. Proto
   .edge-tint: dva pásky přes celou šířku okna, jeden nahoře, druhý dole,
   s barvou --chrome, tedy plochou stránky. Safari tak má co číst v každém
   okamžiku, barva vyjde vždycky stejná a nic neposkakuje.

   Pásky musí být PŘED obsahem, ne za ním. Hledání prochází vrstvy v pořadí
   kladné → normální tok → vlastní obsah stránky → záporné, a jakmile něco
   trefí, končí. Pásek se záporným z-indexem se proto na řadu nikdy nedostal,
   vyhrál nad ním obyčejný obsah. Odtud vysoký z-index.

   A proč nejsou vidět, i když jsou navrchu: barvu s krytím pod 75 %
   prohlížeč nebere doslova, ale smíchá ji s pozadím stránky (v kódu
   blendAgainstPageBackground). Stačí tedy 3 %. Vykreslí se z toho vrstva,
   která na černé hlavičce ubere pár jednotek jasu a nikde jinde není znát
   vůbec, zatímco prohlížeči z toho míchání vyjde přesně --chrome.

   Když se přes hranu vysune menu nebo spodní lišta, nic se nemění: pásky
   jsou výš, takže je prohlížeč najde první, a barva zůstává táž.

   Dvě čísla, na kterých to stojí: výška musí být nad 10 px (tenčí prvky se
   přeskakují) a krytí pod 75 % (jinak se barva vezme doslova a pruh by
   opravdu zesvětlal).
   ------------------------------------------------------------------------- */

.edge-tint {
  position: fixed;
  left: 0;
  right: 0;
  height: 20px;
  z-index: 200;
  pointer-events: none;
  background-color: color-mix(in srgb, var(--chrome) 3%, transparent);
}

.edge-tint--top    { top: 0; }
.edge-tint--bottom { bottom: 0; }

/* Označený text musí být čitelný na světlé i tmavé ploše. Průhledná výplň
   to nezvládne: na černém pásu by zůstalo tmavé písmo na tmavém. Proto
   plná barva a k ní natvrdo dopočítaná barva písma. */
::selection {
  background: var(--accent);
  color: var(--on-accent);
}

:where(.section--band, .section--band2, .hd, .menu, .rail, .ft, .mobar) ::selection {
  background: var(--accent-band);
  color: var(--band);
}

/* Odsazení kotev pod lepivou hlavičkou řeší `scroll-padding-top`
   na <html> v layout.css, tady by se offset sečetl dvakrát. */


/* =========================================================================
   4. TYPOGRAFIE
   ========================================================================= */

/* --- 4.1 Nadpisy --------------------------------------------------------- */

.display,
h1, h2, h3, h4 {
  font-family: var(--font-display);
  font-weight: var(--display-weight);
  text-transform: var(--display-case);
  color: var(--text);
  text-wrap: balance;
}

h1, .h1 {
  font-size: clamp(2.4rem, 5.2vw, 4rem);
  line-height: var(--display-lh);
  letter-spacing: var(--display-track);
  max-width: 18ch;
}

h2, .h2 {
  font-size: clamp(1.9rem, 3.4vw, 2.75rem);
  line-height: 1.14;
  /* h2 snese o něco menší prostrkání než h1, poměr drží i po posunu slideru */
  letter-spacing: calc(var(--display-track) * .72);
  max-width: 22ch;
}

h3, .h3 {
  font-size: 1.2rem;
  line-height: 1.35;
  letter-spacing: calc(var(--display-track) * .36);
  font-weight: var(--display-weight);
}

h4, .h4 {
  font-size: 1.05rem;
  line-height: 1.4;
  letter-spacing: calc(var(--display-track) * .3);
  font-weight: var(--display-weight);
}

/* Optical sizing Fraunces: velký nadpis chce užší kresbu, malý širší. */
.display, h1, h2 { font-optical-sizing: auto; }

/* --- 4.2 Odstavce -------------------------------------------------------- */

p {
  max-width: 62ch;   /* nikdy nezúží, projeví se až tam, kde je místa dost */
  text-wrap: pretty;
}

p + p { margin-top: 1em; }

strong, b { font-weight: 600; }

em, i { font-style: italic; }

small { font-size: .875em; }

/* --- 4.3 Perex, poznámka, citace ---------------------------------------- */

.lead {
  font-size: 1.12rem;
  line-height: 1.75;
  max-width: 46ch;
  color: var(--text-mute);
}

.note {
  font-size: .85rem;
  line-height: 1.6;
  color: var(--text-mute);
  max-width: 68ch;
}

blockquote {
  font-family: var(--font-display);
  font-size: 1.25rem;
  line-height: 1.55;
  font-weight: var(--display-weight);
}

/* --- 4.4 Kicker ---------------------------------------------------------
   Bez kolečka. Vodorovná linka 28 × 2 px v barvě akcentu, mezera 12 px. */

.kicker {
  display: flex;
  align-items: center;
  gap: 12px;
  margin: 0 0 18px;
  max-width: none;
  font-family: var(--font-body);
  font-size: .75rem;
  font-weight: 500;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--accent);
}

.kicker::before {
  content: "";
  flex: none;
  width: 28px;
  height: 2px;
  background: var(--accent);
}

/* Ve středěné hlavičce sekce se linka schová, jinak by visela mimo osu. */
.sec-head--center .kicker { justify-content: center; }


/* =========================================================================
   5. ODKAZY A DROBNÁ TEXT-UTILITY
   ========================================================================= */

a {
  color: inherit;
  text-decoration: none;
  transition: color var(--t-hover) var(--e-soft);
}

/* Odkaz uvnitř běžného textu zůstává podtržený, je to jediný signál, že jde
   o odkaz, a v próze ho nesmíme brát. */
p a:not([class]),
li a:not([class]),
.prose a {
  text-decoration: underline;
  text-underline-offset: .18em;
  text-decoration-thickness: 1px;
  text-decoration-color: color-mix(in oklab, currentColor 40%, transparent);
}

p a:not([class]):hover,
li a:not([class]):hover,
.prose a:hover {
  color: var(--accent);
  text-decoration-color: currentColor;
}

.accent { color: var(--accent); }

.mute { color: var(--text-mute); }


/* =========================================================================
   6. TLAČÍTKA
   Žádný posun, žádný stín, žádný světelný přelet. Hover mění jedinou věc.
   ========================================================================= */

.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 10px;

  min-height: 52px;
  padding: 15px 30px;

  font-family: var(--font-body);
  font-size: .95rem;
  font-weight: 500;
  line-height: 1.2;
  letter-spacing: 0;      /* verzálky ani prostrkání, to je korporátní zlozvyk */
  text-align: center;

  color: var(--on-accent);
  background: var(--accent);
  border: var(--border-w) solid transparent;
  border-radius: var(--r-sm);

  cursor: pointer;
  transition: background-color var(--t-hover) var(--e-soft),
              border-color     var(--t-hover) var(--e-soft),
              color            var(--t-hover) var(--e-soft),
              transform        var(--t-hover) var(--e-soft),
              box-shadow       var(--t-hover) var(--e-soft);
}

/* Decentní hover: ztmavení a posun o pixel nahoru. Žádné poskakování
   za kurzorem, žádné zvětšování. Stejný zdvih používají karty. */
.btn:hover {
  background: var(--accent-hover);
  transform: translateY(calc(-1px * var(--motion)));
  box-shadow: var(--shadow-sm);
}

.btn:active {
  background: color-mix(in oklab, var(--accent-hover) 88%, var(--text));
  transform: none;
  box-shadow: none;
}

.btn svg { width: 18px; height: 18px; }

/* --- 6.1 Velké tlačítko (hero) ------------------------------------------ */

.btn--lg {
  min-height: 56px;
  padding: 17px 34px;
  font-size: 1rem;
}

/* --- 6.1b Tlačítko na plnou šířku --------------------------------------
   Nosilo ho odeslání kontaktního formuláře, dokud se ze sekce nestal
   modrý pruh přes celou šířku, tedy tvar ze šablony. Třídu tu nechávám:
   je součástí stavebnice tlačítek a na telefonu (layout.css) se roztažení
   dělá stejně. */

.btn--block {
  display: flex;
  width: 100%;
}

/* --- 6.2 Sekundární akce ------------------------------------------------ */

.btn--ghost {
  color: var(--text);
  background: transparent;
  border-color: var(--line-strong);
}

.btn--ghost:hover {
  background: transparent;
  border-color: var(--text);
}

.btn--ghost:active { background: color-mix(in oklab, var(--text) 6%, transparent); }

/* --- 6.2b Světlá „bublina“ ----------------------------------------------
   Druhá akce v hero. Plná plocha jako u hlavního tlačítka, ale ve světlé
   barvě, vedle tmavě modrého CTA drží tvar, a přitom mu nekonkuruje.
   ------------------------------------------------------------------------ */

.btn--soft {
  color: var(--accent);
  background: var(--accent-soft);
  border-color: transparent;
  border-radius: var(--r-pill);
}

.btn--soft:hover {
  color: var(--accent-hover);
  background: color-mix(in oklab, var(--accent-soft) 82%, var(--accent));
}

.btn--soft:active {
  background: color-mix(in oklab, var(--accent-soft) 70%, var(--accent));
}

/* Na tmavém pásu by světlá pilulka zářila, ztlumíme ji do průhledné. */
.band .btn--soft,
.ft .btn--soft {
  color: var(--on-band);
  background: color-mix(in oklab, var(--on-band) 12%, transparent);
}

/* --- 6.3 Terciární akce: textový odkaz se šipkou ------------------------- */

.btn--link,
.link-more {
  display: inline-flex;
  align-items: center;
  gap: 8px;

  min-height: 0;
  padding: 0;

  font-family: var(--font-body);
  font-size: .8rem;
  font-weight: 500;
  letter-spacing: .02em;

  color: var(--text);
  background: transparent;
  border: 0;
  border-radius: 0;

  cursor: pointer;
  transition: gap var(--t-hover) var(--e-soft),
              color var(--t-hover) var(--e-soft);
}

.btn--link:hover,
.link-more:hover {
  gap: 14px;
  background: transparent;
  color: var(--accent);
}

.btn--link svg,
.link-more svg { width: 14px; height: 14px; }

/* Šipka nakreslená v CSS, použije se jen tam, kde ji markup nedodal jako <svg>. */
.btn--link::after,
.link-more::after {
  content: "";
  flex: none;
  width: 14px;
  height: 14px;
  background: currentColor;
  -webkit-mask: var(--ico-arrow) center / contain no-repeat;
          mask: var(--ico-arrow) center / contain no-repeat;
}

.btn--link:has(svg)::after,
.link-more:has(svg)::after { display: none; }

/* --- 6.4 Stavy společné všem tlačítkům ---------------------------------- */

.btn[disabled],
.btn[aria-disabled="true"] {
  opacity: .5;
  cursor: not-allowed;
  pointer-events: none;
}

.btn.is-busy { pointer-events: none; opacity: .7; }


/* =========================================================================
   7. FORMULÁŘOVÉ PRVKY
   ========================================================================= */

.field {
  display: flex;
  flex-direction: column;
  gap: 8px;
  min-width: 0;
}

/* Popisek pole není „tichý“ text, do formuláře se píše a musí být
   čitelný na první pohled. Totéž pravidlo drží sections.css §10. */
.field > label,
.field__lbl {
  font-size: .8rem;
  font-weight: 500;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--text);
}

.field input:not([type="checkbox"]),
.field select,
.field textarea,
input[type="text"],
input[type="email"],
input[type="tel"],
select,
textarea {
  width: 100%;
  min-height: 52px;
  padding: 14px 16px;

  font-family: var(--font-body);
  font-size: 1rem;
  line-height: 1.4;

  color: var(--text);
  /* Jen background-color, nikdy zkratka `background`; u <select> je pod
     ní šipka jako background-image a zkratka by ji i s jejím umístěním
     a nastavením „neopakovat“ smazala (viz oddíl 7 níž). */
  background-color: var(--surface);
  border: var(--border-w) solid var(--line-strong);
  border-radius: var(--r-sm);

  transition: border-color var(--t-hover) var(--e-soft),
              background-color var(--t-hover) var(--e-soft);
}

textarea {
  min-height: 148px;
  resize: vertical;
}

::placeholder { color: var(--text-mute); }

/* Vlastní šipka u výběru, nativní by ignorovala barevné schéma. */
select {
  appearance: none;
  padding-right: 44px;
  background-image: var(--ico-chevron);
  background-repeat: no-repeat;
  background-position: right 16px center;
  background-size: 16px 16px;
  cursor: pointer;
}

/* --- 7.1 Stavy ---------------------------------------------------------- */

.field input:not([type="checkbox"]):hover,
.field select:hover,
.field textarea:hover { border-color: var(--text-mute); }

.field input:focus-visible,
.field select:focus-visible,
.field textarea:focus-visible,
input:focus-visible,
select:focus-visible,
textarea:focus-visible {
  border-color: var(--accent);
  outline: 2px solid var(--accent);
  outline-offset: 0;      /* žádné rozmazané glow */
}

[aria-invalid="true"],
.field.is-invalid input,
.field.is-invalid select,
.field.is-invalid textarea { border-color: var(--err); }

.field input[disabled],
.field select[disabled],
.field textarea[disabled] {
  opacity: .55;
  cursor: not-allowed;
  background-color: color-mix(in oklab, var(--text) 4%, var(--surface));
}

/* --- 7.2 Hláška u pole --------------------------------------------------- */

.field__err {
  display: none;
  margin: 0;
  max-width: none;
  font-size: .8rem;
  line-height: 1.45;
  color: var(--err);
}

.field.is-invalid .field__err { display: block; }

/* Vysvětlivka pod polem: proč se na tohle web ptá. Na rozdíl od hlášky je
   vidět pořád, ale jen tam, kde by jinak vznikla otázka — u nepovinného
   pole ve formuláři, který se jinak ptá na minimum. Když pole zčervená,
   vysvětlivka ustoupí: dvě řádky pod sebou by se pral o pozornost s tím,
   co je potřeba opravit. */
.field__hint {
  display: block;
  margin-top: 5px;
  font-size: .8rem;
  line-height: 1.45;
  color: var(--text-mute);
}

.field.is-invalid .field__hint { display: none; }

/* --- 7.3 Zaškrtávátko ---------------------------------------------------- */

/* Vlastní čtvereček místo nativního, a to všude: nativnímu se nedá dát
   velikost. Prohlížeč si ho nakreslí ve své a rámeček roztáhne přes
   zadaných dvacet pixelů — na iOS z toho vypadne pokřivený obrys, který
   se srovná až po prvním klepnutí. Tady je čtvereček obyčejná plocha
   s rámečkem, takže se chová stejně na telefonu i na stole.

   Selektor je schválně bez třídy: zaškrtávátko má na webu jeden tvar,
   ať stojí u souhlasu, ve výběru vybavení, nebo kdekoli jinde. */
input[type="checkbox"] {
  appearance: none;
  -webkit-appearance: none;
  position: relative;
  flex: none;
  width: 20px;
  height: 20px;
  min-height: 0;
  padding: 0;
  border: var(--border-w) solid var(--line-strong);
  border-radius: var(--r-xs);
  background: var(--surface);
  cursor: pointer;
  transition: border-color var(--t-hover) var(--e-soft),
              background-color var(--t-hover) var(--e-soft);
}

input[type="checkbox"]:hover { border-color: var(--text-mute); }

/* Fajfka je maska, ne obrázek; barvu si bere z `color`, takže sedí
   i v paletách, kde je --on-accent tmavé. */
input[type="checkbox"]::before {
  content: "";
  position: absolute;
  inset: 0;
  background: currentColor;
  -webkit-mask: var(--ico-check) center / 13px 13px no-repeat;
          mask: var(--ico-check) center / 13px 13px no-repeat;
  opacity: 0;
  transform: scale(.7);
  transition: opacity var(--t-hover) var(--e-soft),
              transform var(--t-hover) var(--e-soft);
}

input[type="checkbox"]:checked {
  background: var(--accent);
  border-color: var(--accent);
  color: var(--on-accent);
}

/* Nezaškrtnutý povinný souhlas. Obecné pravidlo pro [aria-invalid] výš je
   slabší než tvar čtverečku, musí se zopakovat i sem. */
input[type="checkbox"][aria-invalid="true"] { border-color: var(--err); }

input[type="checkbox"]:checked::before {
  opacity: 1;
  transform: none;
}

/* Ve vysokém kontrastu si systém kreslí ovládací prvky sám a maska by
   z čtverečku udělala prázdný rámeček. Vrátíme mu tam nativní tvar. */
@media (forced-colors: active) {
  input[type="checkbox"] { appearance: auto; -webkit-appearance: auto; }
  input[type="checkbox"]::before { content: none; }
}

.field--check {
  flex-direction: row;
  align-items: flex-start;
  gap: 12px;
}

.field--check input[type="checkbox"] { margin-top: 2px; }

.field--check > label {
  font-size: .88rem;
  font-weight: 400;
  letter-spacing: 0;
  text-transform: none;
  line-height: 1.55;
  color: var(--text-mute);
  cursor: pointer;
}

/* --- 7.4 Past na roboty --------------------------------------------------- */

.hp {
  position: absolute;
  left: -9999px;
  width: 1px;
  height: 1px;
  overflow: hidden;
  opacity: 0;
  pointer-events: none;
}

/* --- 7.5 Stavová hláška formuláře ---------------------------------------- */

.form__status {
  margin: 0;
  max-width: none;
  font-size: .9rem;
  line-height: 1.6;
  color: var(--text-mute);
}

.form__status:empty { display: none; }

.form__status.is-ok  { color: var(--ok); }
.form__status.is-err { color: var(--err); }


/* =========================================================================
   8. UTILITY
   ========================================================================= */

/* --- 8.1 Šířka obsahu ---------------------------------------------------- */

.wrap {
  width: 100%;
  max-width: calc(var(--wrap) + var(--pad) * 2);
  margin-inline: auto;
  padding-inline: var(--pad);
}

.wrap--slim { max-width: calc(var(--wrap-slim) + var(--pad) * 2); }

/* --- 8.2 Přeskočení na obsah --------------------------------------------- */

.skip {
  position: fixed;
  top: 12px;
  left: 12px;
  z-index: 999;
  padding: 12px 20px;
  font-size: .9rem;
  font-weight: 500;
  color: var(--on-accent);
  background: var(--accent);
  border-radius: var(--r-sm);
  transform: translateY(-160%);
  transition: transform var(--t-hover) var(--e-out);
}

.skip:focus-visible { transform: none; }

/* --- 8.3 Skryté jen pro oči ---------------------------------------------- */

.visually-hidden {
  position: absolute !important;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

/* --- 8.4 Štítek (hero badges) -------------------------------------------- */

.badge {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 7px 14px;
  font-size: .8rem;
  line-height: 1.35;
  color: var(--text-mute);
  border: var(--border-w) solid var(--line);
  border-radius: var(--r-xs);
}

.badge svg {
  width: 16px;
  height: 16px;
  color: var(--text);
}

/* --- 8.5 Vertikální rytmus ----------------------------------------------- */

.stack > * + * { margin-top: var(--stack-gap, 1rem); }

/* --- 8.6 Zrnitost --------------------------------------------------------
   Nasazuje se jen na tmavé pásy. Na světlé ploše a v hero nic. */

.grain { position: relative; isolation: isolate; }

.grain::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
  pointer-events: none;
  opacity: var(--grain);
  background-image: var(--grain-img);
  background-size: 160px 160px;
  mix-blend-mode: overlay;
}

/* --- 8.7 Drobnosti -------------------------------------------------------- */

.no-wrap { white-space: nowrap; }

.center { text-align: center; }


/* =========================================================================
   9. ANIMACE
   Prvky jsou VIDITELNÉ by default. Skrývá je až třída `js` na <html>,
   kterou nastaví app.js. Když JS spadne, nic nezmizí.
   ========================================================================= */

.js .reveal {
  opacity: 0;
  transform: translateY(var(--reveal-y));
  transition: opacity var(--t-reveal) var(--e-out),
              transform var(--t-reveal) var(--e-out);
  transition-delay: var(--reveal-delay, 0ms);
  will-change: opacity, transform;
}

.js .reveal.is-in {
  opacity: 1;
  transform: none;
  will-change: auto;
}

.js .reveal--scale { transform: scale(.97); }
.js .reveal--right { transform: translateX(24px); }
.js .reveal--left  { transform: translateX(-24px); }

.js .reveal--scale.is-in,
.js .reveal--right.is-in,
.js .reveal--left.is-in { transform: none; }

/* --- 9.1 Nadpis po řádcích ------------------------------------------------ */

.js .lines .line {
  display: block;
  overflow: hidden;
  /* aby se dolní dotažnice „y“ a „j“ neořízly */
  padding-bottom: .14em;
  margin-bottom: -.14em;
}

.js .lines .line > span {
  display: block;
  transform: translateY(105%);
  transition: transform calc(var(--t-slow) * var(--motion)) var(--e-out);
  transition-delay: var(--line-delay, 0ms);
}

.js .lines.is-in .line > span { transform: none; }


/* =========================================================================
   10. OMEZENÍ POHYBU
   „prefers-reduced-motion“ nebo data-motion="zadny" → statická stránka.
   Nic se nesmí ztratit, jen se nic nehýbe.
   ========================================================================= */

@media (prefers-reduced-motion: reduce) {
  :root { --motion: 0; --reveal-y: 0px; }

  html { scroll-behavior: auto; }

  *, *::before, *::after {
    animation-duration: .001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .001ms !important;
    scroll-behavior: auto !important;
  }

  .js .reveal,
  .js .lines .line > span {
    opacity: 1 !important;
    transform: none !important;
  }
}

[data-motion="zadny"] { scroll-behavior: auto; }

[data-motion="zadny"] *,
[data-motion="zadny"] *::before,
[data-motion="zadny"] *::after {
  animation-duration: .001ms !important;
  animation-iteration-count: 1 !important;
  transition-duration: .001ms !important;
}

[data-motion="zadny"] .reveal,
[data-motion="zadny"] .lines .line > span {
  opacity: 1 !important;
  transform: none !important;
}


/* =========================================================================
   11. TISK
   Na papír patří obsah, ne nástroje.
   ========================================================================= */

@media print {

  /* Barvy se nepřepisují na jednotlivých prvcích, ale rovnou v tokenech,
     jinak by zůstal světlý text na netištěném tmavém pozadí. `!important`
     je tu nutné: studio si tokeny drží jako inline style na <html>. */
  :root {
    --bg:           #FFFFFF !important;
    --bg-2:         #FFFFFF !important;
    --surface:      #FFFFFF !important;
    --band:         #FFFFFF !important;
    --band-2:       #FFFFFF !important;
    --footer-bg:    #FFFFFF !important;

    --text:         #000000 !important;
    --text-mute:    #3A3A3A !important;
    --on-band:      #000000 !important;
    --on-band-mute: #3A3A3A !important;

    --accent:       #000000 !important;
    --accent-hover: #000000 !important;
    --accent-band:  #000000 !important;
    --accent-soft:  #FFFFFF !important;
    --on-accent:    #FFFFFF !important;

    --line:         #B4B4B4 !important;
    --line-strong:  #6E6E6E !important;
    --line-band:    #B4B4B4 !important;
    --line-band-2:  #6E6E6E !important;

    --shadow-alpha: 0 !important;
    --grain:        0 !important;
    --motion:       0 !important;
    --section-y:    24px !important;
    --header-h:     0px !important;
  }

  body {
    background: var(--bg);
    color: var(--text);
    font-size: 11pt;
    line-height: 1.45;
  }

  /* Nástroje, dekorace a plovoucí prvky pryč. */
  .st-fab, .st-panel, #studio, #studio-fab,
  .mobar, .rail, .menu, .burger, .totop,
  .hero__glow, .hero__scroll, .hero__bg,
  .skip, .grain::after {
    display: none !important;
  }

  .hd { position: static !important; box-shadow: none !important; }

  .reveal, .lines .line > span {
    opacity: 1 !important;
    transform: none !important;
  }

  /* Odkaz bez cíle je na papíře k ničemu. */
  .prose a[href^="http"]::after,
  p a[href^="http"]::after {
    content: " (" attr(href) ")";
    font-size: .85em;
    word-break: break-all;
  }

  section, .card, figure, blockquote { break-inside: avoid; }

  h1, h2, h3 { break-after: avoid; }
}
