/* ============================================================
   TOORS – B2C konfigurátor vrat
   Design system převzatý z existující testovací verze + Figma.
   Tokeny: Montserrat, oranžová #ff5100, sidebar #909090,
   divider #B4B3B3, ostré rohy, 3px oranžový výběrový border.
   ============================================================ */

/* Font se načítá <link>em v HTML (viz index/admin/dashboard) — @import tady
   vytvářel sériový řetěz CSS → font CSS → soubory a zdržoval vykreslení. */

:root {
  --orange: #ff5100;
  --orange-hover: #e64900;
  --sidebar-bg: #909090;
  --divider: #b4b3b3;
  --ink: #1a1a1a;
  --muted: #6f6f6f;
  --tile-placeholder: #e2e2e2;
  --white: #ffffff;
  --content-max: 1520px;
  /* jednotný poměr stran dlaždice (výběrový rámeček) napříč všemi kroky */
  --tile-ar: 3 / 4;
}

* { box-sizing: border-box; }

html, body {
  margin: 0;
  padding: 0;
  font-family: 'Montserrat', -apple-system, Arial, sans-serif;
  color: var(--ink);
  background: var(--white);
  -webkit-font-smoothing: antialiased;
  /* Klik do textu (nadpis kroku, popisky) nechá prohlížeč nastavit kurzor a
     s „caret browsing" (F7) v něm bliká — v konfigurátoru se nic nepíše
     mimo formulář, takže kurzor schováme a vracíme ho jen do polí níže.  */
  caret-color: transparent;
}
input, textarea, select, [contenteditable="true"] { caret-color: auto; }

img { max-width: 100%; display: block; }
button { font-family: inherit; }
a { color: inherit; text-decoration: none; }

/* ---------- Header ---------- */
.k-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  /* Vpravo BEZ paddingu: `.k-shell` ho taky nemá, takže se tlačítka zarovnají
     přesně na pravou hranu šedého sidebaru. Vlevo 44 px = stejné odsazení,
     jaké má obsah kroku (.k-content), aby logo sedělo s nadpisem. */
  padding: 28px 0 28px 44px;
  gap: 24px;
  max-width: var(--content-max);   /* na velkých monitorech obsah necentrujeme přes celou šířku */
  margin-inline: auto;
}
.k-logo { display: flex; align-items: center; gap: 12px; }
.k-logo-mark {
  width: 44px; height: 44px; border-radius: 50%;
  border: 3px solid var(--orange);
  display: grid; place-items: center;
  position: relative;
}
.k-logo-mark::before {
  content: "T"; font-weight: 800; font-size: 20px; color: var(--orange);
}
.k-logo-text { font-size: 30px; font-weight: 800; letter-spacing: .5px; color: #3a3a3a; }
.k-logo-img { height: 46px; width: auto; display: block; }
.k-logo-custom { max-height: 48px; max-width: 220px; width: auto; object-fit: contain; }
.k-lang { display: flex; gap: 2px; margin-right: 6px; }
.k-lang button {
  border: none; background: transparent; cursor: pointer;
  font-family: inherit; font-size: 13px; font-weight: 700; letter-spacing: .5px;
  color: #9a9a9a; padding: 6px 8px; border-radius: 4px;
}
.k-lang button:hover { color: var(--ink); }
.k-lang button.active { color: var(--orange); }

.btn {
  border: none; cursor: pointer;
  padding: 16px 34px;
  font-weight: 600; font-size: 15px; letter-spacing: .4px;
  text-transform: uppercase;
  border-radius: 0;               /* ostré rohy dle stávajícího stylu */
  transition: .2s;
  white-space: nowrap;
}
.btn-primary { background: var(--orange); color: #fff; }
.btn-primary:hover { background: var(--orange-hover); }
.btn-outline { background: #fff; color: var(--orange); border: 2px solid var(--orange); }
.btn-outline:hover { background: var(--orange); color: #fff; }
.btn-ghost { background: transparent; color: #fff; padding: 16px 24px; }
.btn-ghost:hover { color: #fff; opacity: .8; }
.btn:disabled { opacity: .45; cursor: not-allowed; }

/* ---------- Akce v hlavičce (sdílení + vymazání) ---------- */
/* `flex: none` + `min-width: 0` na logu: široké logo partnera se musí zmenšit
   ono, ne tlačítka. Bez toho se sdílení na úzkém displeji zúžilo do nuly a
   zmizelo pod fixed burgerem (hlášeno 13.8.2026 z náhledu Mobil). */
.k-header-actions { display: flex; align-items: center; gap: 10px; flex: none; }
.k-logo { min-width: 0; }
.k-logo-custom { flex: 0 1 auto; }

/* Vymazání je destruktivní → ghost styl, aby nesoupeřilo se sdílením ani
   s hlavní akcí kroku. Červená se objeví až v potvrzovacím okně. */
.k-reset {
  display: inline-flex; align-items: center; gap: 9px;
  padding: 13px 18px; font-size: 14px;
  background: transparent; color: var(--muted);
  border: 2px solid transparent;
}
.k-reset:hover { color: #c0392b; border-color: #e6c3bd; background: #fdf5f4; }
.k-reset-icon { flex: 0 0 auto; }

/* ---------- Sdílení konfigurace (tlačítko v hlavičce + popup) ---------- */
.k-share {
  display: inline-flex; align-items: center; gap: 10px;
  padding: 13px 24px; font-size: 14px;
}
.k-share-icon { flex: 0 0 auto; }

.k-modal {
  position: fixed; inset: 0; z-index: 100;
  background: rgba(0, 0, 0, .5);
  display: flex; align-items: center; justify-content: center;
  padding: 20px;
}
.k-modal-card {
  position: relative;
  background: var(--white);
  width: 100%; max-width: 560px;
  padding: 40px 40px 32px;
  box-shadow: 0 18px 50px rgba(0, 0, 0, .28);
}
.k-modal-close {
  position: absolute; top: 10px; right: 12px;
  border: none; background: none; cursor: pointer;
  font-size: 30px; line-height: 1; color: #9a9a9a;
  padding: 6px 10px;
}
.k-modal-close:hover { color: var(--ink); }
.k-modal-title { font-size: 26px; font-weight: 800; margin: 0 0 12px; }
.k-modal-text { font-size: 15px; line-height: 1.6; color: var(--muted); margin: 0 0 14px; }
.k-share-step {
  font-size: 13px; font-weight: 700; letter-spacing: .3px;
  color: var(--orange); text-transform: uppercase;
  margin: 0 0 18px;
}
.k-share-row { display: flex; gap: 10px; align-items: stretch; }
.k-share-input {
  flex: 1 1 auto; min-width: 0;
  font-family: inherit; font-size: 14px;
  padding: 14px 14px;
  border: 1px solid var(--divider); border-radius: 0;
  background: #fafafa; color: var(--ink);
}
.k-share-input:focus { outline: none; border-color: var(--orange); }
.k-share-copy { padding: 14px 22px; font-size: 14px; }
.k-share-msg { font-size: 14px; margin: 10px 0 0; min-height: 20px; }
.k-share-msg.ok { color: #1b7a34; }
.k-share-msg.err { color: var(--orange); }
.k-share-links { display: flex; gap: 22px; margin-top: 10px; flex-wrap: wrap; }
.k-share-link {
  border: none; background: none; padding: 0; cursor: pointer;
  font-family: inherit; font-size: 14px; font-weight: 600;
  color: var(--orange); text-decoration: underline;
}
.k-share-note { font-size: 12px; color: #9a9a9a; margin: 18px 0 0; }

/* potvrzení mazání */
.k-reset-tip { font-size: 13px; line-height: 1.6; color: #9a9a9a; margin: 0 0 24px; }
.k-modal-actions { display: flex; gap: 12px; justify-content: flex-end; flex-wrap: wrap; }
.btn-danger { background: #c0392b; color: #fff; }
.btn-danger:hover { background: #a5301f; }
.btn-ghost-dark { background: transparent; color: var(--muted); border: 2px solid var(--divider); }
.btn-ghost-dark:hover { color: var(--ink); border-color: #9a9a9a; }

/* ---------- Layout: 60% obsah / 40% sidebar ---------- */
.k-shell {
  display: flex;
  align-items: stretch;
  width: 100%;              /* plná šířka → sidebar sedí na pravém okraji okna */
  min-height: 70vh;
  max-width: var(--content-max);   /* na velkých monitorech nenatahovat přes celé okno */
  margin-inline: auto;             /* → sidebar se stává ohraničeným panelem, ne okrajem okna (očekávané) */
}
.k-content {
  flex: 1 1 auto;
  min-width: 0;
  padding: 24px 44px 80px;
}
.k-sidebar {
  flex: 0 0 auto;
  width: 32%;               /* užší (bylo 40 %) */
  min-width: 340px;
  max-width: 520px;
  background: var(--sidebar-bg);
  color: #fff;
  padding: 40px 40px 32px;
  display: flex;
  flex-direction: column;
}

/* Na desktopu má sidebar VŽDY stejnou velikost (přesně výška okna) a je
   sticky — nemění se podle délky obsahu vlevo, na každém kroku vypadá
   stejně. Skroluje jen .k-sb-recap (flex:1, overflow-y:auto).
   Patička (celková cena + ZPĚT/DALŠÍ) je navíc sticky na spodní hraně
   okna: při načtení stránky sidebar začíná až pod hlavičkou a jeho spodek
   by byl uříznutý pod viewportem — sticky bottom patičku podrží viditelnou,
   dokud hlavička neodscrolluje. */
@media (min-width: 1025px) {
  .k-sidebar {
    position: sticky;
    top: 0;
    align-self: flex-start;
    height: 100vh;
  }
  /* Sidebar je vysoký 100vh, ale začíná až POD hlavičkou — jeho spodek proto
     přesahuje pod dolní okraj okna a sticky patička se vytáhne nahoru NAD
     poslední řádky souhrnu (poslední položka se schovávala pod cenu).
     Zkracujeme proto samotný box souhrnu o výšku hlavičky (měří ji app.js do
     --k-header-h). Padding by nestačil — uvnitř scrollovacího kontejneru jen
     přidá místo pod obsahem, ale obsah nezvedne. */
  .k-sb-recap { margin-bottom: var(--k-header-h, 0px); }
  .k-sb-footer {
    position: sticky;
    bottom: 0;
    background: var(--sidebar-bg);
    /* přetáhne se přes vnitřní padding sidebaru, ať obsah nepodtéká po stranách */
    margin: 0 -40px;
    padding: 0 40px 28px;
  }
}

/* Velikosti podle Figmy (30.7.2026) — nadpis byl 40 px a proti návrhu
   přerůstal obsah kroku, hlavně schéma rozměrů. S menším nadpisem se
   zkrátila i mezera pod ním, aby nadpis nezůstal viset sám. */
.k-step-title {
  font-size: 28px;
  font-weight: 800;
  margin: 12px 0 32px;
  letter-spacing: -.5px;
}

/* ---------- Sidebar internals ---------- */
.k-sb-top-row {
  display: flex; align-items: baseline; gap: 14px;
  font-size: 15px; font-weight: 600; text-transform: uppercase; letter-spacing: .5px;
}
.k-sb-top-row .frac { opacity: .85; }
.k-progress {
  display: flex; align-items: center; gap: 7px;
  margin: 14px 0 26px;
  padding-bottom: 28px;
  border-bottom: 1px solid var(--divider);
}
.k-progress-bar { flex: 1; height: 3px; background: #fff; opacity: .55; border-radius: 0; }
.k-progress-bar.active { opacity: 1; background: var(--orange); }

/* Dokončený segment je <button> (návrat na vyplněný krok), ale vizuálně MUSÍ
   být identický s ostatními segmenty (<div>) — stejná výška 3px, stejná barva.
   Dřív měl button height:auto + padding a pruh kreslil přes ::before, takže
   se oproti sousedům „rozšiřoval". Teď je button sám ten 3px pruh; větší
   klikací plocha se dělá NEVIDITELNÝM overlayem (::before, absolutní), který
   nezvětšuje samotný pruh ani neposouvá layout. */
button.k-progress-bar {
  appearance: none;
  border: none;
  padding: 0;
  height: 3px;                 /* stejné jako div segment */
  flex: 1;
  background: var(--orange);   /* dokončený = vždy oranžový (jako .active) */
  opacity: 1;
  cursor: pointer;
  border-radius: 0;
  position: relative;
  transition: filter .15s ease;
}
button.k-progress-bar::before { /* jen klikací plocha, neviditelná, nemění velikost pruhu */
  content: "";
  position: absolute;
  left: 0; right: 0; top: -8px; bottom: -8px;
}
button.k-progress-bar:hover { filter: brightness(1.15); }
button.k-progress-bar:focus-visible { outline: 2px solid #fff; outline-offset: 3px; }

.k-sb-model { padding-bottom: 18px; border-bottom: 1px solid var(--divider); }
.k-sb-model-name { font-size: 30px; font-weight: 800; margin: 0; }
.k-sb-model-change { font-size: 13px; font-weight: 700; margin: 8px 0 0; cursor: pointer; }
.k-sb-model-change:hover { text-decoration: underline; }

/* Panel = obsah sidebaru bez patičky (na mobilu se schovává pod burger).
   Musí být sám flex sloupec, aby uvnitř scrolloval jen výpis voleb. */
.k-sb-panel { display: flex; flex-direction: column; flex: 1; min-height: 0; }
.k-sb-recap { flex: 1; min-height: 0; padding-top: 20px; overflow-y: auto; }
.k-sb-param { margin-bottom: 18px; }
.k-sb-param-label { font-size: 15px; font-weight: 700; margin: 0 0 4px; }
.k-sb-param-row { display: flex; justify-content: space-between; gap: 12px; align-items: baseline; }
.k-sb-param-value { font-size: 14px; opacity: .92; margin: 0; }
.k-sb-param-price { font-size: 14px; opacity: .92; margin: 0; white-space: nowrap; }

.k-sb-total {
  padding-top: 16px; margin-top: 8px;
  border-top: 1px solid var(--divider);
}
.k-sb-total-row { display: flex; justify-content: space-between; gap: 12px; }
.k-sb-total-row.main { font-weight: 700; font-size: 16px; }
.k-sb-total-row.vat { font-size: 14px; opacity: .9; margin-top: 4px; }

.k-sb-nav { display: flex; justify-content: flex-end; gap: 10px; margin-top: 24px; }

/* Skrytá cena (default per vendor) */
.k-price-hidden .k-sb-param-price,
.k-price-hidden .k-sb-total-value,
.k-price-hidden .k-price-tag { visibility: hidden; }

/* ============================================================
   Step type: LIST (typ vrat, pohon)
   ============================================================ */
.k-list { display: flex; flex-direction: column; gap: 8px; }
.k-list-item {
  position: relative;              /* kotva pro DALŠÍ v rohu karty */
  display: flex; align-items: center; gap: 24px;
  border: 3px solid #fff;
  padding: 18px 16px;
  cursor: pointer;
  transition: .25s;
}
/* DALŠÍ ve vybrané kartě sedí v pravém dolním rohu (návrh). Je menší než
   tlačítko v sidebaru, aby se vešlo pod vrata a nepřekrývalo obrázek. */
.k-list-next {
  position: absolute; right: 16px; bottom: 16px;
  padding: 10px 20px; font-size: 13px;
}
.k-list-item:hover { border-color: var(--orange); }
.k-list-item.selected { border-color: var(--orange); }
.k-list-item-body { flex: 1; }
/* Texty o stupeň menší — na velkém monitoru působily „hrozně velké" (Freelo 32573739, 23.9.2026) */
.k-list-item-name { font-size: 22px; font-weight: 400; margin: 0 0 10px; }
.k-list-item-bullets { margin: 0 0 16px; padding-left: 20px; color: var(--muted); font-weight: 300; font-size: 15px; }
.k-list-item-bullets li { margin: 2px 0; }
.k-list-item-price { font-size: 16px; margin: 0; }
.k-list-item-price .lbl { color: var(--muted); margin-right: 10px; }
.k-list-item-img {
  width: 42%; max-width: 360px; flex-shrink: 0;
  display: grid; place-items: center;
}
.k-list-item-img img { width: 100%; }
.k-ph-door {
  width: 100%; aspect-ratio: 16/10;
  background: var(--tile-placeholder);
  display: grid; place-items: center; color: #b0b0b0; font-size: 13px;
}

/* ============================================================
   Step type: TILES (provedeni, struktura, barvy, proskleni, dvere)
   ============================================================ */
.k-tiles {
  display: grid;
  /* menší dlaždice (připomínka klienta 21.7.2026, Freelo screenshot):
     4 v řadě s pevným stropem šířky místo roztažení na celý sloupec,
     zarovnané doleva — zbylé místo zůstává volné vpravo */
  grid-template-columns: repeat(4, minmax(0, 185px));
  gap: 24px 28px;
}
/* Dvojice (Hladká / Woodgrain, Bez / S prosklením) dřív měly vlastní mřížku
   se dvěma sloupci do 185 px — ve čtyřech sloupcích se dlaždice do stropu
   nevešly (~150 px), ve dvou ano, takže dvojice byly větší než čtveřice
   (Freelo 32573739). Na desktopu proto jede stejná čtyřsloupcová mřížka,
   jen se dva sloupce nechají prázdné; `cols-2` má význam už jen na mobilu. */
.k-tiles.cols-2 { grid-template-columns: repeat(4, minmax(0, 185px)); }
/* Barvy: menší dlaždice než u ostatních kroků — je to plocha odstínu, ne
   fotka panelu, takže nepotřebuje výšku vrat. Od 5.8.2026 na přání klienta
   OBDÉLNÍK NAŠIŘKO místo čtverce (3:2) a 5 vzorků v řadě — 14 odstínů se
   vejde do 3 řad místo 4 a paletu jde projít bez dlouhého scrollování. */
.k-tiles.k-tiles-color { grid-template-columns: repeat(5, minmax(0, 150px)); gap: 20px 24px; }
.k-tiles-color .k-tile-swatch { aspect-ratio: 3 / 2; }
/* Dlaždice, které jsou fotkou celých vrat (prosklení, umístění dveří — step.velkeFotky):
   ve 185px sloupci „zbytečně malé" proti ostatním fotkám (Freelo 32666981). */
.k-tiles.k-tiles-foto { grid-template-columns: repeat(3, minmax(0, 230px)); }
.k-tile { cursor: pointer; }
.k-tile-swatch {
  /* Rámeček má VŽDY stejný poměr, ať má fotka z katalogu jakýkoli.
     min-height/overflow jsou nutné: box s aspect-ratio má automatické
     minimum podle obsahu, takže by ho výška obrázku jinak přetlačila
     (odtud dřívější 175×214 u provedení vs. 175×320 u struktury). */
  aspect-ratio: var(--tile-ar);
  min-height: 0;
  overflow: hidden;
  background: var(--tile-placeholder);
  border: 3px solid #fff;
  transition: .2s;
}
.k-tile:hover .k-tile-swatch,
.k-tile.selected .k-tile-swatch { border-color: var(--orange); }
/* fotky (panely, barvy, okna, pohon) vyplní dlaždici → rámeček sedí na obrázek */
.k-tile-img { background: #fff; }
.k-tile-img img { width: 100%; height: 100%; object-fit: cover; }
.k-tile-label { margin: 12px 0 0; font-size: 16px; font-weight: 400; }
.k-tile-sub { margin: 4px 0 0; font-size: 14px; color: var(--muted); }
.k-tile-price { margin: 8px 0 0; font-size: 14px; color: var(--orange); font-weight: 500; }

/* texture swatches (struktura) */
.tex-hladka   { background: #e9ecef; }
.tex-stucco   { background: #dfe1e3; background-image: radial-gradient(#c9cccf 1px, transparent 1.4px); background-size: 6px 6px; }
.tex-woodgrain{ background: repeating-linear-gradient(0deg, #e6e8ea 0 3px, #dadce0 3px 6px); }
.tex-imitace  { background: repeating-linear-gradient(90deg, #6b4226 0 4px, #5a381f 4px 8px, #7a4c2c 8px 12px); }

/* window-pattern tiles (proskleni volby) */
.k-win {
  aspect-ratio: var(--tile-ar);
  border: 3px solid #fff; background: #eceef0;
  display: flex; flex-direction: column; justify-content: flex-start;
  padding: 8px; gap: 6px; transition: .2s;
}
.k-tile:hover .k-win, .k-tile.selected .k-win { border-color: var(--orange); }
.k-win-row { flex: 1; background: #dfe2e5; border-radius: 1px; }
.k-win-row.glass { background: #a9c6d6; }

/* dvoukřídlá vrata – umístění oken v křídlech (ne v sekcích) */
.k-wings { flex-direction: row; gap: 8px; }
.k-wing {
  flex: 1; background: #dfe2e5; border-radius: 1px;
  display: flex; justify-content: center; align-items: flex-start; padding: 12% 14% 0;
}
.k-wing-glass { width: 100%; aspect-ratio: 1/1; background: #a9c6d6; }

/* doplňující dotaz ke kroku (např. požadovaný počet oken v sekci) */
.k-note { margin-top: 28px; max-width: 420px; display: flex; flex-direction: column; gap: 8px; }
.k-note label { font-size: 16px; color: var(--muted); }
.k-note input {
  padding: 12px 14px; font-family: inherit; font-size: 15px;
  border: 1px solid #c9c9c9; border-radius: 0;
}
.k-note input { font-weight: 600; color: var(--ink); }
.k-note input::placeholder { font-weight: 400; color: #b8b8b8; }
.k-note input:focus { outline: none; border-color: var(--orange); }

/* Výběry NAD náhledem vrat (krok Okno: kolik oken + ve kterých sekcích).
   Zadání je otázka, náhled je jeho výsledek → patří nad kresbu.            */
.k-pickers { margin-top: 32px; display: flex; flex-direction: column; gap: 28px; }
.k-pickers .k-note { margin-top: 0; }
.k-picker-label { font-size: 16px; color: var(--muted); margin: 0 0 12px; }
.k-picker-hint { font-size: 13px; color: #9a9a9a; margin: 10px 0 0; }
.k-chips { display: flex; flex-wrap: wrap; gap: 10px; }
.k-chip {
  font-family: inherit; font-size: 15px; font-weight: 600; color: var(--ink);
  min-width: 52px; padding: 11px 18px; cursor: pointer;
  background: #fff; border: 1px solid #c9c9c9; border-radius: 0;
  transition: border-color .12s, background-color .12s, color .12s;
}
.k-chip:hover { border-color: var(--orange); }
.k-chip.on { background: var(--orange); border-color: var(--orange); color: #fff; }

/* sekce uvnitř sloučeného kroku (vzhled = provedení + struktura + barva) */
.k-group-sec { margin-bottom: 52px; }
.k-group-sec:last-child { margin-bottom: 0; }
.k-group-title {
  font-size: 21px; font-weight: 400; margin: 0 0 20px;
  padding-bottom: 12px; border-bottom: 1px solid var(--divider);
}

/* velký náhled zvoleného provedení (krok Vzhled) — pod volbami, plynule
   prolne (fade in/out) při přepnutí provedení */
/* Rámeček fotky SEDNE NA POMĚR STRAN té konkrétní fotky (--foto-pomer, dopl-
   ňuje app.js → nastavPomerFotky). Dřív měl rámeček pevný poměr 3/2 a fotka
   se do něj ořízla přes `cover` — u fotek NA VÝŠKU (1050 × 1400) tím zmizely
   skoro dvě třetiny vrat a zbyl výřez uprostřed (připomínka klienta 18.9.2026,
   Freelo 32573387). Řídicí rozměr je teď VÝŠKA (`--foto-vyska`): šířku si
   fotka dopočítá z poměru, takže se nic neořezává a fotka na výšku je prostě
   užší. `max-width: 100 %` hlídá opačný extrém (panorama 1400 × 630) — tam se
   strop dotkne šířky a sníží se celý řádek.
   Sloupec proto NENÍ `flex: 1 1 0` (roztáhl by se přes celé místo a fotka by
   v něm plavala uprostřed), ale `0 1 auto` — obtáhne fotku a výřez panelu jde
   hned za ni. Strop 68 % drží místo pro sloupec s výřezem (30 % + mezera). */
.k-vzhled-preview { max-width: 980px; margin: 48px 0 0; --foto-vyska: clamp(240px, 24vw, 320px); }
.k-vzhled-preview[hidden] { display: none; }
.k-vzhled-row { display: flex; gap: 20px; align-items: stretch; }
.k-vzhled-col { display: flex; flex-direction: column; flex: 0 1 auto; min-width: 0; max-width: 68%; }
.k-vzhled-col .k-vzhled-photo {
  flex: 0 0 auto; min-height: 0;
  aspect-ratio: auto;
  width: calc(var(--foto-vyska) * var(--foto-pomer, 1.5));
  max-width: 100%;
  /* Výška je u všech fotek STEJNÁ (Freelo 32573739, 23.9.2026 — panorama byla
     nižší než fotka na výšku). Fotka na výšku se dál neořezává (šířka z poměru);
     jen širokou panoramu, která narazí na strop šířky, ořízne `cover` po stranách. */
  height: var(--foto-vyska);
}
.k-vzhled-col .k-vzhled-photo img { object-fit: cover; }
.k-vzhled-col-panel { flex: 0 0 30%; max-width: 300px; }
/* Výšku řádku určuje fotka, výřez panelu se k ní dotáhne — dřív měl vlastní
   poměr 490/618 a končil o kus výš nebo níž (připomínka klienta 20.8.2026).
   Výřez proto leží v rámečku absolutně: kdyby stál v toku, přinesl by si
   vlastní výšku a u nižších fotek (panorama) by pod ně přečuhoval. */
.k-vzhled-col-panel .k-vzhled-panel { position: relative; flex: 1 1 auto; min-height: 0; }
.k-vzhled-col-panel .k-vzhled-panel-img { position: absolute; inset: 0; height: auto; aspect-ratio: auto; }
.k-vzhled-photo {
  position: relative; aspect-ratio: 3 / 2; overflow: hidden;
  background: var(--tile-placeholder);
}
/* `contain`, ne `cover`: rámeček má poměr té fotky, takže se obojí chová
   stejně — ale než app.js poměr doplní (a u fotky, která se nenačte), se
   `contain` nic neořízne. */
.k-vzhled-photo img {
  position: absolute; inset: 0;
  width: 100%; height: 100%; object-fit: contain; display: block;
}
/* Výřez panelu: užší sloupec vpravo od fotky, popisek jako v katalogu —
   tmavě šedý pruh přes spodek obrázku, bílý tučný text. */
.k-vzhled-panel { margin: 0; position: relative; }
.k-vzhled-panel-img { display: block; aspect-ratio: 490 / 618; background: var(--tile-placeholder); }
.k-vzhled-panel-img img { display: block; width: 100%; height: 100%; object-fit: cover; }
.k-vzhled-panel-label {
  position: absolute; left: 0; right: 0; bottom: 0;
  padding: 7px 8px;
  background: #757575; color: #fff;
  font-size: 13px; font-weight: 700; text-align: center;
}
/* Nový výřez naskakuje průhledný a vyvolá se — stejné časování jako fotka. */
.k-vzhled-panel-img img.k-fade-in { opacity: 0; transition: opacity .7s ease; }
.k-vzhled-panel-img img.k-fade-in.shown { opacity: 1; }
/* nová fotka: startuje průhledná, .shown ji pomalu vyvolá */
.k-vzhled-photo img.k-fade-in { opacity: 0; transition: opacity .7s ease; }
.k-vzhled-photo img.k-fade-in.shown { opacity: 1; }
/* stará fotka jako překryv, který zmizí (.gone) — vznikne crossfade */
.k-vzhled-photo img.k-vzhled-old { opacity: 1; transition: opacity .7s ease; z-index: 2; }
.k-vzhled-photo img.k-vzhled-old.gone { opacity: 0; }
/* Dvě fotky realizace na jednu kombinaci (viz preview.images v config.js):
   leží přes sebe a druhá se pořád dokola vyvolává a zase mizí — vznikne
   plynulé střídání obou. Řeší to CSS, ne časovač v JS: animace se sama
   uspí, když je záložka na pozadí, a respektuje prefers-reduced-motion. */
.k-vzhled-slide { position: absolute; inset: 0; }
.k-vzhled-duo .k-vzhled-slide-2 { z-index: 1; opacity: 0; animation: k-vzhled-duo 11s ease-in-out infinite; }
@keyframes k-vzhled-duo {
  0%, 40%   { opacity: 0; }
  50%, 90%  { opacity: 1; }
  100%      { opacity: 0; }
}
@media (prefers-reduced-motion: reduce) {
  .k-vzhled-photo img { transition: none !important; opacity: 1 !important; }
  .k-vzhled-panel-img img { transition: none !important; opacity: 1 !important; }
  /* bez animace by druhá fotka trvale překrývala první → schová se */
  .k-vzhled-duo .k-vzhled-slide-2 { animation: none; display: none; }
}
/* Na úzkém displeji (zadání 15.9.2026): fotka a výřez panelu zůstávají vedle
   sebe, ale v nízkém pruhu — pod sebou zabíraly skoro celou obrazovku
   (612 px). Strop výšky je nízký, fotka si k němu dopočítá šířku. */
@media (max-width: 560px) {
  /* Výšku už nedrží řádek, ale `--foto-vyska` (šířku si fotka dopočítá
     z poměru) — pevných 210 px řádku fotku zase ořezávalo. */
  .k-vzhled-preview { margin-top: 24px; --foto-vyska: 230px; }
  .k-vzhled-row { gap: 8px; }
  .k-vzhled-col-panel { flex: 0 0 34%; max-width: none; }
  .k-vzhled-col .k-realizace-note { font-size: 11px; margin-bottom: 4px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
  .k-vzhled-panel-label { font-size: 11px; padding: 4px; }
}

/* realizace gallery */
.k-realizace { margin-top: 56px; }
/* galerie navazující na živý náhled barvy — bez nadpisu, blíž k němu */
.k-realizace-navazuje { margin-top: 20px; }
.k-realizace-title { font-size: 21px; font-weight: 400; margin: 0 0 20px; }
/* Fotka je katalogová, odstín na ní se může lišit od skutečného laku —
   pod galerií i pod přebarveným náhledem proto stojí upozornění. */
/* Popisek stojí NAD fotkami (13.8.2026), proto odsazení dolů. Po nadpisu
   sekce se přitáhne blíž, ať drží u sebe jako jeden blok. */
.k-realizace-note { margin: 0 0 16px; font-size: 14px; color: var(--muted); }
.k-realizace-title + .k-realizace-note { margin-top: -8px; }
/* Od zavedení sbalené galerie (15.9.2026) stojí mezi nadpisem a popiskem
   skryté tlačítko `.k-galerie-toggle` (na desktopu display:none, ale pořád
   v DOM) — sousední selektor výš proto nadpis s popiskem už nenajde vedle
   sebe. Popisek navíc leží uvnitř `.k-galerie-obsah`, ne přímo za tlačítkem. */
.k-realizace-title + .k-galerie-toggle + .k-galerie-obsah > .k-realizace-note:first-child { margin-top: -8px; }

/* živý náhled barvy (krok Barva): fotka + barevná vrstva přes masku křídla */
.k-tint-photo { position: relative; max-width: 260px; }   /* 360 → 260 px (Freelo 32573739, 23.9.2026) */   /* 546 px bylo „zbytečně velké" (Freelo 32573739) — 360 px, doleva jako galerie */
.k-tint-photo img { width: 100%; display: block; }
.k-tint-layer {
  position: absolute; inset: 0;
  mix-blend-mode: multiply;      /* barva × jas podkladu → zachované stíny a drážky */
  -webkit-mask-size: 100% 100%;
  mask-size: 100% 100%;
  -webkit-mask-repeat: no-repeat;
  mask-repeat: no-repeat;
  pointer-events: none;
  transition: background .25s;   /* plynulé přebarvení při klikání mezi odstíny */
}
/* Galerie realizací: tři fotky vedle sebe, všechny STEJNĚ VELKÉ (5.8.2026).
   Dřív se kreslily v původním rozlišení, takže vedle sebe stály fotky
   různých velikostí. Poměr je pevný (4:3) a obrázek se do něj ořízne přes
   object-fit — zdrojové fotky jsou na 4:3 předstříhané, takže se nic
   podstatného neuřízne. */
/* Mřížka má VŽDY tři sloupce, ať je fotek jedna, dvě nebo tři — fotka je
   tak u každé volby stejně velká. Dřív se počet sloupců řídil počtem fotek
   (`data-cols`, nastavuje app.js) a jedna/dvě fotky byly o 35 % větší —
   při přepínání „Bez / S prosklením" tím ilustrační fotka skákala mezi
   velikostmi (Freelo 32573739, 18.9.2026). Prázdné místo vpravo je
   přijatelnější než skok. `data-cols` zůstává v DOM pro mobilní přepis. */
.k-realizace-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; max-width: 980px; }
.k-realizace-grid figure { margin: 0; }
.k-realizace-grid figure img { width: 100%; aspect-ratio: 4/3; object-fit: cover; display: block; }
.k-realizace-grid .k-ph-photo {
  aspect-ratio: 4/3; background: var(--tile-placeholder);
  display: grid; place-items: center; color: #b0b0b0; font-size: 13px;
}
/* Tlačítko sbalené galerie existuje jen na mobilu — na desktopu je galerie
   vidět rovnou, jako dřív. */
.k-galerie-toggle { display: none; }

/* interaktivní náhled prosklení (krok proskleni) — vzor + počet oken
   z poznámky se vykreslí přímo na přední pohled vrat, nad dlaždice vzorů */
/* náhled stojí samostatně pod dlaždicemi kroku „Okno" (dřív byl uvnitř bloku
   s vzory prosklení, který měl vlastní odsazení shora) */
.k-glazing-preview { max-width: 760px; margin: 32px 0; }
.k-glazing-preview svg { width: 100%; height: auto; }
/* klikatelné místo na okno v náhledu */
.k-glazing-preview .k-slot { cursor: pointer; }
.k-glazing-preview .k-slot:hover > :first-child { stroke: var(--orange); stroke-width: 2; }
.k-glazing-preview .k-slot:not(.on):hover { opacity: .85; }

/* ============================================================
   Step type: DIMENSIONS (rozmery)
   ============================================================ */
.k-dim-diagram { max-width: 760px; margin: 0 0 44px; }
.k-dim-diagram svg { width: 100%; height: auto; display: block; }
/* zvýraznění kóty, kterou zákazník právě vyplňuje */
.k-dim-diagram [data-dim] { transition: opacity .15s; }
.k-dim-diagram.hl [data-dim] { opacity: .18; }
.k-dim-diagram.hl [data-dim].on { opacity: 1; }

/* Schéma podle Figmy (sekční vrata i vrata s dveřmi): fotka garáže je
   podklad v CSS — při psaní se překresluje jen SVG s kótami, takže se
   obrázek nenačítá znovu a neproblikává. Poměr stran 806:374 je z návrhu
   celé stránky — v rámečku musí být vidět celá vrata i s podlahou.
   Šířka není zastropená: ve Figmě schéma vyplňuje celý sloupec obsahu,
   proto se roztáhne až na jeho šířku (podklad je 1612 px, na retinu stačí). */
.k-dim-schema {
  max-width: none;
  aspect-ratio: 806 / 374;
  box-sizing: border-box;
  border: 2px solid #d9d9d9;
  /* Render je v návrhu na 68 % krytí (fill-opacity 0.68 nad bílou stránkou) —
     bílá vrstva v gradientu dělá totéž, aniž bychom pálili průhlednost do JPG.
     Velikost 100 % 100 % odpovídá preserveAspectRatio="none" z Figmy. */
  background:
    linear-gradient(rgba(255, 255, 255, .32), rgba(255, 255, 255, .32)),
    #fff url('../assets/schema-rozmery-2.jpg') center / 100% 100% no-repeat;
}
.k-dim-schema svg { height: 100%; }
/* Vedlejší kóty — nadpraží a ostění. Šipka je oranžová jako u hlavních
   rozměrů (návrh), rozlišuje je jen popisek: v klidu světlý (#909090),
   při nastavování ztmavne a ztuční, aby bylo jasně vidět, co se mění. */
.k-dim-sec text { transition: fill .15s; }
.k-dim-schema.hl .k-dim-sec.on text { fill: #2f2f2f; font-weight: 600; }
/* Návrh má popisky na ~12 px, ale plátno 806 se kreslí na ~690 px, takže
   na obrazovce vycházely na 10 px a byly nečitelné (Freelo 32573739,
   18.9.2026). 15 px v jednotkách plátna = ~13 px na obrazovce; nejdelší
   popisek („šířka ostění / vpravo 540 mm") se pořád vejde k okraji. */
.k-dim-schema text { font-size: 15px; font-weight: 400; }
/* Schéma se škáluje s šířkou obsahu, takže na užší obrazovce by popisky
   spadly na 6–8 px. Písmo je proto v uživatelských jednotkách SVG větší —
   velikosti jsou zvolené tak, aby se nejdelší popisek („vpravo 300 mm")
   ještě vešel do plátna 806. */
@media (max-width: 860px) { .k-dim-schema text { font-size: 16px; } }
/* Mřížka polí je stejně široká jako schéma nad ní (v návrhu končí pravý
   sloupec přesně na jeho hraně), proto sloupce nejsou zastropené na pevnou
   šířku, ale dělí si celý sloupec obsahu. */
/* Svislá mezera drží rozteč řádků z návrhu: popisek od popisku 100 px, obsah
   pole zabere 56 (24 popisek + 8 mezera + 24 řádek s posuvníkem). */
.k-inputs { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 44px 56px; }
/* U sekčních vrat jde vedle polí parametrická kresba (mění se podle zadaných
   mm — schéma nad ní je fixní ilustrace z Figmy). Pole proto stojí v JEDNOM
   sloupci vlevo a kresba zabere místo po druhém. */
/* Sloupec s poli 377 → 440 px (5.8.2026): po zvětšení posuvníku a bubliny
   by na dráhu zbylo míň místa než v návrhu, takže by slider vyšel opticky
   ještě kratší, než na co si klient stěžoval. */
.k-dim-cols { display: grid; grid-template-columns: minmax(0, 440px) minmax(0, 1fr); gap: 40px; align-items: start; }
.k-inputs-col { grid-template-columns: minmax(0, 1fr); }
.k-dim-mini { position: sticky; top: 24px; }
.k-dim-mini svg { width: 100%; height: auto; display: block; }
/* Kresba je proti původnímu kroku zmenšená (plátno 760 se vejde do ~470 px),
   takže popisky kót musí být v uživatelských jednotkách větší, jinak by
   vyšly na 8 px. */
.k-dim-mini svg text { font-size: 19px; }
.k-dim-mini [data-dim] { transition: opacity .15s; }
.k-dim-mini.hl [data-dim] { opacity: .18; }
.k-dim-mini.hl [data-dim].on { opacity: 1; }
/* Na užším okně by se kresba i pole zmáčkly — kresba jde pod pole a pole se
   vrátí do dvou sloupců, jak to bylo. */
@media (max-width: 1200px) {
  .k-dim-cols { grid-template-columns: minmax(0, 1fr); gap: 32px; }
  .k-inputs-col { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .k-dim-mini { position: static; max-width: 520px; }
}
/* Pole podle návrhu (Group 234.svg, sloupec 377 px): popisek na svém řádku,
   pod ním posuvník a na jeho konci bublina, u hlavních rozměrů ještě ikona.
   Dráha se roztahuje do zbylého místa (v návrhu 272 px = sloupec bez bubliny,
   ikony a mezer), místo po ikoně se drží i u polí bez nápovědy — jinak by
   pravé hrany bublin nesouhlasily (viz .k-input-info-slot). */
.k-input-box { display: flex; flex-direction: column; }
.k-input-box > label { font-size: 20px; font-weight: 500; line-height: 24px; margin-bottom: 8px; }
.k-input-row { display: flex; align-items: center; gap: 8px; }

/* ---------- Posuvník + bublina s hodnotou (návrh z Figmy) ----------
   Vyplněná část dráhy je gradient řízený proměnnou --fill, kterou při
   každé změně přepočítá app.js (prohlížeče neumí obarvit jen levou část
   <input type=range> samy). Jezdec je assetem z Figmy (Vector.svg): kruh
   se středem 6,4 a poloměrem 6 OŘÍZNUTÝ rámem 12 x 8 — výsledek je tvar
   12 px široký a 8 px vysoký, tedy širší než vyšší a přesně do dráhy
   (rovná horní i spodní hrana, boky vyklenuté obloukem kruhu). Kreslí ho
   ten samý vektor jako pozadí jezdce, aby oblouky seděly na pixel; elipsa
   ani pilulka z CSS mají jiné boky. Dráha je Vector copy.svg: 344 x 8,
   plné zaoblení, #D9D9D9. */
/* Zvětšeno 5.8.2026 (připomínka klienta „slider je moc malý"): dráha 8 → 14 px,
   jezdec 12 x 8 → 21 x 14 px. Poměr jezdce (1,5 : 1) i jeho tvar zůstal
   z Figmy — jen se škáluje background-size, kresba je vektor. Šířka jezdce
   musí sedět s RANGE_THUMB v app.js, jinak oranžová část dráhy nedojede
   přesně do jeho středu. */
.k-range {
  -webkit-appearance: none; appearance: none;
  flex: 1 1 auto; min-width: 0; height: 14px; margin: 0; padding: 0;
  border: none; border-radius: 999px; cursor: pointer;
  background: linear-gradient(var(--orange), var(--orange)) left / var(--fill, 0%) 100% no-repeat, #d9d9d9;
}
.k-range::-webkit-slider-thumb {
  -webkit-appearance: none; appearance: none;
  width: 21px; height: 14px; border: none; border-radius: 0;
  background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M6 10C9.31371 10 12 7.31371 12 4C12 0.686291 9.31371 -2 6 -2C2.68629 -2 0 0.686291 0 4C0 7.31371 2.68629 10 6 10Z' fill='%23000'/%3E%3C/svg%3E") center / 21px 14px no-repeat;
  cursor: grab;
}
.k-range::-moz-range-thumb {
  width: 21px; height: 14px; border: none; border-radius: 0;
  background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M6 10C9.31371 10 12 7.31371 12 4C12 0.686291 9.31371 -2 6 -2C2.68629 -2 0 0.686291 0 4C0 7.31371 2.68629 10 6 10Z' fill='%23000'/%3E%3C/svg%3E") center / 21px 14px no-repeat;
  cursor: grab;
}
.k-range:focus-visible { outline: 3px solid var(--orange); outline-offset: 4px; }

/* hodnota je pořád editovatelná — zákazník musí umět zadat přesné mm */
.k-input-val {
  flex: 0 0 auto; width: 96px; height: 34px; padding: 0 8px;
  font-family: inherit; font-size: 18px; font-weight: 600; line-height: 30px; text-align: center;
  color: #fff; background: var(--orange);
  border: 2px solid var(--orange); border-radius: 5px;
}
.k-input-val::placeholder { color: rgba(255, 255, 255, .75); font-weight: 400; }
.k-input-val:focus { outline: none; border-color: var(--ink); }

/* Kolečko s nápovědou = vektor z Figmy (viz infoIcon v app.js). „i" je
   v kolečku vyříznuté, takže prosvítá pozadí — proto tu není žádné
   vlastní pozadí ani písmo, jen velikost (cca 3/4 výšky bubliny). */
.k-input-info, .k-input-info-slot {
  flex: none; display: block; position: relative;
  width: 22px; height: 22px;
  color: var(--orange); cursor: help;
}
/* pole bez nápovědy drží místo po ikoně, aby pravé hrany bublin seděly */
.k-input-info-slot { cursor: default; }
.k-input-info svg { width: 100%; height: 100%; display: block; }
.k-input-info:focus-visible { outline: 3px solid var(--orange); outline-offset: 3px; border-radius: 50%; }

/* Vlastní bublina s nápovědou — nativní `title` naskočí až po vteřině
   a to zpoždění prohlížeč nedovolí změnit. Tahle se rozsvítí hned,
   jen s krátkým prolnutím (150 ms, žádná prodleva před ním).
   `visibility` se přepíná skokem, ale při skrývání až po doznění
   opacity — jinak by bublina zmizela dřív, než stihne vyblednout. */
.k-tip {
  position: absolute; top: calc(100% + 8px); left: 50%; transform: translateX(-50%);
  z-index: 20; width: max-content; max-width: 240px;
  padding: 7px 11px; border-radius: 4px;
  background: #3a3a3a; color: #fff;
  font-size: 12px; font-weight: 400; line-height: 1.45; text-align: left;
  opacity: 0; visibility: hidden; pointer-events: none;
  transition: opacity .15s ease, visibility 0s linear .15s;
}
.k-input-info:hover .k-tip,
.k-input-info:focus-visible .k-tip {
  opacity: 1; visibility: visible;
  transition: opacity .15s ease, visibility 0s linear 0s;
}
/* V návrhu se pod polem počítá jen se šedým údajem, proto si chyba
   nedrží místo dopředu — naskočí až když je co hlásit. */
.k-input-err:not(:empty) { margin-top: 6px; color: var(--orange); font-size: 12px; }

/* ============================================================
   Step type: CONTACT (shrnuti)
   ============================================================ */
/* úvodní text nad formulářem (obsah v config.js → intro) */
.k-contact-intro { max-width: 620px; margin: 0 0 32px; }
.k-contact-intro-title { font-size: 22px; font-weight: 400; margin: 0 0 12px; }
.k-contact-intro-text { font-size: 15px; line-height: 1.6; color: var(--muted); margin: 0; }

.k-form { max-width: 620px; display: flex; flex-direction: column; gap: 22px; }
.k-form input, .k-form textarea {
  width: 100%; padding: 18px 20px; font-family: inherit; font-size: 16px;
  border: 2px solid var(--orange); border-radius: 0; background: #fff;
}
.k-form textarea { resize: vertical; min-height: 96px; }
.k-form input:focus, .k-form textarea:focus { outline: none; border-color: var(--orange-hover); }

/* Chyba pod polem. Rámeček polí je oranžový i v klidu (tak je vzhled
   postavený), takže chybu nese tmavší červená + text — samotná změna barvy
   rámečku by tu byla skoro neviditelná, a barva sama by stejně nestačila. */
.k-field { display: flex; flex-direction: column; }
.k-field-err { font-size: 14px; line-height: 1.4; color: #c02c17; margin-top: 6px; }
.k-field-err:empty { display: none; }
.k-form input.err, .k-form textarea.err { border-color: #c02c17; background: #fff8f7; }

/* Město + PSČ vedle sebe */
.k-form-row { display: flex; gap: 22px; align-items: flex-start; }
.k-form-row > .k-field { flex: 1; }
.k-form-row > .k-field:last-child { max-width: 180px; }
.k-form-msg { font-size: 15px; margin-top: 8px; }
.k-form-msg.ok { color: #1b7a34; }
.k-form-msg.err { color: var(--orange); }

/* ---------- GDPR: souhlas se zpracováním osobních údajů ----------
   Povinný checkbox + krátká informace; podrobnosti jsou v <details>,
   aby formulář nebyl stěna textu. Klikací plocha je celý <label>,
   na mobilu tedy nejde jen o 18px čtvereček.                        */
.k-consent { display: flex; flex-direction: column; gap: 10px; margin-top: 2px; }
.k-consent-check { display: flex; align-items: flex-start; gap: 12px; cursor: pointer; }
/* `.k-form input` výš dává všem polím rámeček a padding — checkbox musí zpátky
   na nativní vzhled, jinak z něj je 60px oranžový obdélník. */
.k-consent-check input[type="checkbox"] {
  -webkit-appearance: checkbox; appearance: checkbox;
  width: 22px; height: 22px; flex: 0 0 22px; margin: 1px 0 0; padding: 0;
  border: 0; background: none; border-radius: 0;
  accent-color: var(--orange); cursor: pointer;
}
.k-consent-check input[type="checkbox"]:focus-visible { outline: 2px solid var(--orange); outline-offset: 2px; }
.k-consent-text { font-size: 15px; line-height: 1.5; color: var(--ink); }
.k-consent-link { color: var(--orange); text-decoration: underline; }
.k-consent-short { font-size: 13px; line-height: 1.6; color: var(--muted); margin: 0; }
.k-consent-more > summary {
  font-size: 13px; color: var(--muted); cursor: pointer;
  text-decoration: underline; list-style: none; width: fit-content;
}
.k-consent-more > summary::-webkit-details-marker { display: none; }   /* Safari */
.k-consent-more > summary::before { content: '▸ '; text-decoration: none; }
.k-consent-more[open] > summary::before { content: '▾ '; }
.k-consent-list {
  margin: 10px 0 0; padding: 0 0 0 18px;
  font-size: 13px; line-height: 1.6; color: var(--muted);
}
.k-consent-list li { margin-bottom: 6px; }

/* ---------- Burger (jen mobil, viz media query níže) ---------- */
.k-burger { display: none; }

/* ============================================================
   Responsive – na úzkých displejích jde souhrn pod burger menu
   ------------------------------------------------------------
   Sidebar se dřív skládal POD obsah, takže progres, souhrn i cena
   byly až na konci stránky a zákazník musel kvůli tlačítku DALŠÍ
   scrollovat přes celý krok. Nově:
     • hlavička je přilepená nahoře a má burger (otevře souhrn),
     • patička sidebaru (cena + ZPĚT/DALŠÍ) je pevná spodní lišta,
     • zbytek sidebaru (.k-sb-panel) je rozbalovací panel.
   ============================================================ */
@media (max-width: 1024px) {
  .k-shell { flex-direction: column; }
  .k-content, .k-sidebar { width: 100%; }
  /* Karta vedle sebe: obrázek vlevo, text vpravo (zadání 15.9.2026 — pod
     sebou měl 1. krok na telefonu dvě obrazovky). `order` přesune obrázek
     dopředu bez zásahu do HTML, `wrap` pustí DALŠÍ na vlastní řádek. */
  .k-list-item { flex-direction: row; flex-wrap: wrap; align-items: center; gap: 12px 14px; padding: 12px; }
  .k-list-item-img { order: -1; width: 38%; max-width: 200px; }
  .k-list-item-body { flex: 1 1 0; min-width: 0; }
  /* v sloupcovém layoutu by absolutní tlačítko leželo na obrázku → řadí se
     pod něj, na plnou šířku karty (stejně jako spodní lišta) */
  .k-list-next { position: static; width: 100%; margin-top: 2px; }
  .k-tiles { grid-template-columns: repeat(2, 1fr); }
  /* barvy mají vlastní (specifičtější) pravidlo s pevnou šířkou sloupců —
     bez tohohle přepisu by se paleta na úzkém okně nezmenšila a přetekla */
  .k-tiles.k-tiles-color { grid-template-columns: repeat(3, minmax(0, 1fr)); }

  /* přilepená hlavička s burgerem */
  .k-header {
    position: sticky; top: 0; z-index: 50;
    background: var(--white);
    border-bottom: 1px solid #ececec;
    padding: 14px 20px;
  }
  .k-logo-img { height: 34px; }
  /* Vlastní logo partnera na mobilu: 220 px z desktopu sežralo celý řádek
     hlavičky (logo + koš + sdílení + fixed burger se do 375 px nevejdou). */
  .k-logo-custom { max-height: 34px; max-width: 120px; }

  /* Sdílení: na mobilu jen ikona a odsazené od burgeru, který je fixed vpravo
     nahoře (jinak by se překrývaly). Popisek zůstává pro čtečky v aria-label. */
  /* v hlavičce zbydou jen ikony a celý blok se odsune od fixed burgeru */
  .k-header-actions { gap: 2px; margin-right: 74px; }
  .k-share { padding: 11px 13px; margin-right: 0; }
  .k-share-label, .k-reset-label { display: none; }
  .k-reset { padding: 11px 11px; }
  .k-modal-actions .btn { flex: 1 1 auto; }
  .k-modal-card { padding: 30px 22px 24px; }
  .k-modal-title { font-size: 22px; }
  .k-share-row { flex-direction: column; }

  /* burger je fixed (ne uvnitř hlavičky) — vendor si může hlavičku vypnout
     a souhrn musí zůstat dostupný; proto i vlastní pozadí */
  .k-burger {
    display: flex; align-items: center; gap: 10px;
    position: fixed; top: 9px; right: 14px; z-index: 60;
    border: none; cursor: pointer;
    background: var(--white);
    color: var(--ink);
    /* dotyková plocha ≥44px i když je ikona malá */
    min-height: 44px; padding: 8px 10px;
    font-family: inherit; font-size: 15px; font-weight: 700; letter-spacing: .5px;
  }
  body.k-no-header .k-burger { box-shadow: 0 2px 10px rgba(0, 0, 0, .18); }
  .k-burger-frac { color: var(--orange); }
  .k-burger-icon { display: block; transition: opacity .2s; }
  .k-burger[aria-expanded="true"] .k-burger-icon { opacity: .45; }

  /* sidebar = vrstva přes obsah: nahoře panel, dole pevná lišta */
  .k-sidebar {
    position: fixed; left: 0; right: 0; bottom: 0;
    top: var(--k-header-h, 63px);    /* pod přilepenou hlavičkou (výšku měří app.js) */
    z-index: 40;
    padding: 0;
    background: transparent;
    pointer-events: none;            /* proklik do obsahu, dokud je menu zavřené */
    display: flex; flex-direction: column;
    max-width: none;
  }
  /* ztmavené pozadí, když je menu otevřené (klik mimo panel ho zavře) */
  body.k-menu-open .k-sidebar { background: rgba(0, 0, 0, .45); pointer-events: auto; }
  body.k-menu-open { overflow: hidden; }

  .k-sb-panel {
    display: none;                   /* zavřeno */
    background: var(--sidebar-bg);
    padding: 24px 20px 28px;
    overflow-y: auto;
    min-height: 0;                   /* aby dlouhý souhrn scrolloval uvnitř panelu */
    pointer-events: auto;
  }
  body.k-menu-open .k-sb-panel { display: block; }
  .k-sb-recap { overflow: visible; }  /* scrolluje celý panel, ne jen výpis */

  /* spodní lišta: cena na prvním řádku, navigace pod ní (jeden řádek se
     u dvou tlačítek lámal — „Celková cena" se trhala na dva řádky) */
  .k-sb-footer {
    margin-top: auto;                /* vždy dole, i když je panel zavřený */
    background: var(--sidebar-bg);
    padding: 8px 16px calc(8px + env(safe-area-inset-bottom, 0px));   /* nižší lišta (Freelo 32573739, 23.9.2026) */
    pointer-events: auto;
    box-shadow: 0 -2px 12px rgba(0, 0, 0, .18);
  }
  .k-sb-total { margin-top: 0; padding-top: 0; border-top: none; }
  .k-sb-total-row.main { font-size: 15px; }
  .k-sb-total-row.vat { font-size: 12px; margin-top: 2px; }
  .k-sb-nav { margin-top: 8px; }
  .k-sb-total:empty + .k-sb-nav, .k-sb-footer > .k-sb-nav:first-child { margin-top: 0; }
  .k-sb-nav .btn { padding: 11px 22px; font-size: 14px; }

  /* obsah nesmí končit pod pevnou spodní lištou */
  .k-content { padding-bottom: 130px; }

  /* Galerie realizací sbalená za tlačítkem (zadání 15.9.2026) */
  .k-galerie-toggle {
    display: inline-flex; align-items: center; gap: 8px;
    min-height: 44px; padding: 10px 16px;
    border: 1px solid var(--divider); background: var(--white); color: var(--ink);
    font: inherit; font-size: 14px; font-weight: 600; cursor: pointer;
  }
  .k-galerie-toggle::after { content: '▾'; }
  .k-galerie-toggle[aria-expanded="true"]::after { content: '▴'; }
  .k-galerie .k-galerie-obsah { display: none; margin-top: 14px; }
  .k-galerie.is-open .k-galerie-obsah { display: block; }
}
@media (max-width: 560px) {
  .k-content { padding: 20px 20px 130px; }
  .k-step-title { font-size: 24px; margin-bottom: 24px; }
  /* Hustší dlaždice (zadání 15.9.2026): 4 v řadě, u tří voleb 3, u dvou 2.
     Dotyková plocha zůstává ≥ 44 px — dlaždice mají na 375 px ~75 px. */
  .k-tiles { grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 14px 8px; }
  .k-tiles:has(> .k-tile:nth-child(3):last-child) { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .k-tiles.cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; }
  /* „Bez / S prosklením" a jiné dvojice na šířku — na výšku měly půl obrazovky */
  .k-tiles.cols-2 .k-tile-swatch { aspect-ratio: 4 / 3; }
  .k-tile-label { font-size: 12px; line-height: 1.3; margin-top: 6px; }
  .k-tile-sub { font-size: 11px; }
  .k-tiles.k-tiles-color { grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 12px 8px; }
  .k-tiles-color .k-tile-swatch { aspect-ratio: 1; }
  /* Ve Vzhledu stejně velké dlaždice provedení (4) i struktury (3) — tři
     v řadě byly větší než čtyři nad nimi (Freelo 32573739, 23.9.2026) */
  .k-group-sec .k-tiles:has(> .k-tile:nth-child(3):last-child) { grid-template-columns: repeat(4, minmax(0, 1fr)); }
  /* fotky celých vrat: dvojice 2 v řadě (4:3), trojice (dveře) 3 v řadě */
  .k-tiles.k-tiles-foto { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .k-tiles.k-tiles-foto.cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  /* Kontakt: na konci byl konfigurátor „obrovský" — menší úvod i pole */
  .k-contact-intro { margin-bottom: 22px; }
  .k-contact-intro-title { font-size: 19px; line-height: 1.3; }
  .k-contact-intro-text { font-size: 14px; line-height: 1.55; }
  .k-form { gap: 14px; }
  .k-form input, .k-form textarea { padding: 13px 14px; font-size: 16px; }
  .k-list-item-name { font-size: 18px; margin-bottom: 6px; }
  .k-list-item-bullets { font-size: 13px; margin-bottom: 0; padding-left: 16px; }
  .k-realizace { margin-top: 28px; }
  .k-realizace-title { font-size: 20px; margin-bottom: 10px; }
  .k-inputs { row-gap: 18px; }
  /* height:220 rozjelo barevnou vrstvu od fotky (žádné overflow:hidden na
     kontejneru, maska se řídí jeho boxem, ale <img> uvnitř přeteče přes jeho
     nastavenou výšku) — zůstává tedy jen užší max-width (zadání 15.9.2026,
     ověřeno měřením/screenshotem, viz brief krok 8). */
  .k-tint-photo { max-width: 240px; }   /* stejně jako desktop menší (Freelo 32573739, 23.9.2026) */
  /* tři fotky vedle sebe by na telefonu byly ~100 px široké → pod sebe.
     Varianty s `data-cols` mají vyšší specificitu než holá třída, takže
     musí být přepsané taky — jinak by dvousloupcová galerie přetekla. */
  .k-realizace-grid,
  .k-realizace-grid[data-cols="1"],
  .k-realizace-grid[data-cols="2"] { grid-template-columns: 1fr; max-width: none; }
  .k-inputs { grid-template-columns: 1fr; }
  /* ikona sedí až u pravého okraje řádku — vycentrovaná bublina by přetekla
     z obrazovky, proto se zarovná pravou hranou k ikoně */
  .k-tip { left: auto; right: 0; transform: none; }
  .k-form-row { flex-direction: column; gap: 22px; }
  .k-form-row > .k-field:last-child { max-width: none; }
  .k-form-row > .k-field { width: 100%; }
}

/* Načítání stavu z krátkého sdíleného odkazu (?c=) — chvilka, než odpoví
   server. Bez toho by byla vidět prázdná plocha. */
/* Kolečko u načítání sdílené konfigurace — než dorazí ze serveru, je jinak
   na obrazovce jen věta a vypadá to jako by se nic nedělo. */
.k-loading::before {
  content: ""; display: inline-block; width: 16px; height: 16px;
  margin-right: 10px; vertical-align: -3px;
  border: 2px solid var(--divider); border-top-color: var(--orange);
  border-radius: 50%; animation: k-spin .7s linear infinite;
}
@keyframes k-spin { to { transform: rotate(360deg); } }
@media (prefers-reduced-motion: reduce) { .k-loading::before { animation-duration: 2.4s; } }

.k-loading {
  padding: 80px 40px;
  font-size: 16px;
  color: #909090;
  text-align: center;
}

/* ---------- Přístupnost ----------
   Volby jsou klikatelné divy s role="radio" — potřebují viditelný fokus
   (jinak uživatel klávesnice neví, kde je) a kurzor, aby vypadaly klikatelně. */
.k-tile, .k-list-item, .k-slot { cursor: pointer; }
.k-tile:focus-visible, .k-list-item:focus-visible {
  outline: 3px solid var(--orange);
  outline-offset: 3px;
}
.k-glazing-preview [data-slot]:focus-visible { outline: 3px solid var(--orange); }

/* Uživatelé s vypnutými animacemi (systémové nastavení) je nemají dostávat —
   překreslení náhledu i přebarvení vrat musí zůstat okamžité. */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: .001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .001ms !important;
    scroll-behavior: auto !important;
  }
}

/* ============================================================
   Embed na webu partnera (embed.js) — třídy nastavuje app.js
   ============================================================ */

/* Karta na úzkém webu partnera */
body.k-embed-card .k-header,
body.k-embed-card .k-burger { display: none !important; }
.k-shell-card { display: block; min-height: 0; }
/* Vzhled karty (Freelo 32664511, 23.9.2026 — „udělat vizuálně lépe"): štítek
   „Konfigurátor" vlevo (na mobilu nahoře), text a tlačítko s odsazením.
   Žádný šedý obrys — kartu nese stín. */
.k-card {
  display: flex; gap: 0; align-items: stretch;
  padding: 0; border: 0; background: var(--white);
  box-shadow: 0 10px 30px rgba(0, 0, 0, .10);
  overflow: hidden;
}
/* vlevo štítek „Konfigurátor" (místo fotky vrat, Freelo 32664511) */
.k-card-badge { flex: 0 0 42%; display: flex; align-items: center; justify-content: center; padding: 28px; background: #f6f6f6; }
.k-card-badge svg { width: 100%; max-width: 280px; height: auto; display: block; }
.k-card-body { flex: 1 1 0; min-width: 0; padding: 22px 24px; align-self: center; }
.k-card-title { font-size: 22px; font-weight: 800; line-height: 1.2; margin: 0 0 8px; }
.k-card-text { font-size: 14px; line-height: 1.5; color: var(--muted); margin: 0 0 18px; }
/* Popisek „Pokračovat v konfiguraci (krok n/total)" se nevejde na jeden
   řádek — .btn má jinak white-space:nowrap (viz výš), což by tlačítko
   protáhlo přes okraj karty a vyrobilo vodorovný scroll v iframu. */
.k-card-start { width: 100%; min-height: 48px; white-space: normal; line-height: 1.3; }
@media (max-width: 560px) {
  .k-card { flex-direction: column; }
  .k-card-badge { flex-basis: auto; padding: 26px 20px; }
  .k-card-badge svg { max-width: 230px; }
  .k-card-body { padding: 20px 20px 22px; }
  .k-card-title { font-size: 21px; }
}

/* Zavřít fullscreen — vpravo nahoře; burger se posune doleva vedle něj */
.k-embed-close[hidden] { display: none !important; }
.k-embed-close {
  position: fixed; top: 9px; right: 10px; z-index: 70;
  display: inline-flex; align-items: center; justify-content: center;
  width: 44px; height: 44px; padding: 0;
  background: var(--white); color: var(--ink);
  border: 1px solid var(--divider); cursor: pointer;
}
@media (max-width: 1024px) {
  body.k-embed-fullscreen .k-burger { right: 60px; }
  body.k-embed-fullscreen .k-header-actions { margin-right: 120px; }
}
@media (min-width: 1025px) {
  body.k-embed-fullscreen .k-header-actions { margin-right: 56px; }
}

/* Desktop inline: iframe roste s obsahem, sidebar se posouvá ve viditelné
   části (proměnné z naOkno v app.js). 100vh by v rostoucím iframu znamenalo
   výšku celého iframu, proto ho nahrazujeme. */
@media (min-width: 1025px) {
  body.k-embed-inline .k-shell { min-height: 0; align-items: flex-start; }
  body.k-embed-inline .k-sidebar {
    position: relative; top: 0; z-index: 1;
    height: var(--k-sb-h, 720px);
    transform: translateY(var(--k-sb-shift, 0px));
    /* posun přichází z webu partnera zprávou se zpožděním — krátký přechod
       místo skoku (připomínka 23.9.2026: po kliknutí na Konfigurátor „glitchuje") */
    transition: transform .18s ease-out;
  }
  /* Šedé pozadí sidebaru přes CELOU výšku konfigurátoru. Sidebar sám je jen
     vysoký jako viditelná část okna a posouvá se, takže pod ním i nad ním
     zůstávalo bílé místo (23.9.2026). Šířka stejná jako .k-sidebar. */
  body.k-embed-inline .k-shell { position: relative; }
  body.k-embed-inline .k-shell::after {
    content: ""; position: absolute; top: 0; bottom: 0; right: 0; z-index: 0;
    width: clamp(340px, 32%, 520px);
    background: var(--sidebar-bg);
    pointer-events: none;
  }
  body.k-embed-inline .k-sb-recap { margin-bottom: 0; }
}
/* Kompaktní režim v nízkém okně (13" notebook) — viz nastavKompakt v app.js */
html.k-kompakt { zoom: .8; }
body.k-embed-inline .k-modal {
  bottom: auto;
  top: var(--k-vp-top, 0px);
  height: var(--k-vp-h, 100vh);
}

/* ============================================================
   Ilustrační fotky („Foto pouze ilustrační") — VŠUDE STEJNÝ ROZMĚR
   (Freelo 32573739, 23.9.2026: „mají být úplně všude stejně velké"):
   realizace ve všech krocích, fotka ve Vzhledu i přebarvovaná fotka u barvy
   mají jeden rámeček 4:3 o šířce --ilu-w a obrázek se do něj ořízne (cover).
   330 px = dvě fotky vedle sebe se vejdou i do obsahu vedle sidebaru v iframu.
   Přebarvení u barvy: maska se ořezává stejně (mask-size: cover, střed) jako
   fotka pod ní, takže barevná vrstva dál sedí na křídlo vrat.
   ============================================================ */
.k-content { --ilu-w: 330px; }
.k-realizace-grid,
.k-realizace-grid[data-cols="1"],
.k-realizace-grid[data-cols="2"] { grid-template-columns: repeat(auto-fill, minmax(0, var(--ilu-w))); gap: 16px; max-width: none; }
.k-realizace-grid figure img,
.k-realizace-grid .k-ph-photo { width: 100%; aspect-ratio: 4 / 3; object-fit: cover; }

.k-tint-photo { width: var(--ilu-w); max-width: 100%; aspect-ratio: 4 / 3; overflow: hidden; }
.k-tint-photo figure { width: 100%; height: 100%; }
.k-tint-photo img { width: 100%; height: 100%; object-fit: cover; }
.k-tint-layer { -webkit-mask-size: cover; mask-size: cover; -webkit-mask-position: center; mask-position: center; }

.k-vzhled-col { max-width: none; }
.k-vzhled-col .k-vzhled-photo { width: var(--ilu-w); max-width: 100%; height: auto; aspect-ratio: 4 / 3; }
.k-vzhled-col .k-vzhled-photo img { object-fit: cover; }
.k-vzhled-col-panel { flex: 0 0 auto; width: calc(var(--ilu-w) * .56); max-width: 190px; }

@media (max-width: 560px) {
  .k-content { --ilu-w: 100%; }
  .k-realizace-grid,
  .k-realizace-grid[data-cols="1"],
  .k-realizace-grid[data-cols="2"] { grid-template-columns: 1fr; }
  /* Vzhled na telefonu: fotka + výřez panelu vedle sebe, fotka ve stejném 4:3 */
  .k-vzhled-col { flex: 1 1 auto; min-width: 0; }
  .k-vzhled-col .k-vzhled-photo { width: 100%; }
  .k-vzhled-col-panel { flex: 0 0 34%; width: auto; max-width: none; }
}
