/* =============================================================
   ECORSON — design systém webu
   -------------------------------------------------------------
   Tokeny jsou navzorkované z grafického návrhu, ne odhadnuté.
   Rozbor předlohy a živá ukázka: http://localhost/ecorson.cz/priprava/

   🔴 TENHLE SOUBOR PATŘÍ MODULU `ecorson-vzhled` (na míru).
      Do balíčku jádra se NEZABALUJE — jinak by první aktualizace
      přepsala design každému webu na téhle bázi.

   Členění: TOKENY · BASE · TYPOGRAFIE · LAYOUT · KOMPONENTY ·
            KATALOG · KALKULAČKA · VZORNÍK · KOŠÍK · STAVY · RESPONSIVE
   ============================================================= */

/* =========================================================
   1. TOKENY
   ========================================================= */
:root {
    /* Značka
       🔴 Hodnoty jsou ODEBRANÉ z předlohy, ne odhadnuté — u textu a akcentu
          nejsvětlejším/nejsytějším pixelem v ploše glyfu, u ploch mediánem
          okolí (jediný pixel je u AI renderu šum).
          Skript: scratchpad/vzorek2.php, předloha ChatGPT Image 29. 8. 2026. */
    /* ⚠️ #D75001 je MEDIÁN výplně tlačítka v předloze, ne nejsytější pixel.
          Dřív tu bylo #DE4400 odebrané „nejsytějším pixelem" — ten ale padne
          na světlý okraj přechodu a barva pak vyjde signálnější, než ve
          skutečnosti je. Oponentura to nezávisle popsala jako „víc akční
          e-shop než prémiový interiér". Měření: `porovnat-hero.php`. */
    --ec-primary:        #D75001;
    /* Tmavá oranžová pro tah štětcem po najetí na kartu. Musí být výrazně
       tmavší než plocha karty, aby na ní zůstal světlý text čitelný —
       značková `--ec-primary` je na podklad pod textem moc světlá. */
    --ec-primary-deep:   #7A2E00;   /* tah štětcem po najetí na kartu */
    --ec-primary-hover:  #E85E08;
    --ec-primary-active: #B24101;
    --ec-primary-soft:   rgba(215, 80, 1, .14);
    /* ⚠️ #D77439 je MEDIÁN pixelů UVNITŘ tahů slova „ATMOSFÉRU“ v předloze
          (kvartily #C96D34–#DF7B3E). Dřív tu bylo #EE7F30 z odběru
          „nejsytější pixel“ — ten padne na okraj vyhlazení a barva vyjde
          světlejší a křiklavější. Oponentura to opakovaně popisovala jako
          „oranžová je ostřejší než v návrhu“.
          ✔ Výplň tlačítka měřená stejně dává #D74F02, což na `--ec-primary`
            (#D75001) sedí — tam byla metoda správně. */
    --ec-accent:         #D77439;   /* zvýrazněné slovo v nadpisu */
    --ec-accent-soft:    rgba(215, 116, 57, .14);

    /* Plochy */
    --ec-bg:        #171714;   /* pozadí stránky */
    --ec-header:    #14110D;   /* hlavička je tmavší než stránka */
    --ec-rail:      #161513;
    --ec-surface:   #1C1713;
    --ec-surface-2: #1F1915;
    --ec-surface-3: #262019;
    --ec-overlay:   rgba(10, 8, 6, .86);

    /* Text */
    --ec-text:        #DCD9D4;
    --ec-text-strong: #F7F1E8;
    --ec-muted:       #A8ABA5;
    --ec-faint:       #6E6A64;

    /* Linky */
    --ec-border:        rgba(242, 234, 227, .12);
    --ec-border-strong: rgba(242, 234, 227, .22);

    /* Stavy */
    --ec-danger:  #E5484D;  --ec-danger-soft:  rgba(229, 72, 77, .13);
    --ec-warning: #F0A020;  --ec-warning-soft: rgba(240, 160, 32, .13);
    --ec-success: #46A758;  --ec-success-soft: rgba(70, 167, 88, .13);
    --ec-info:    #4A90D9;  --ec-info-soft:    rgba(74, 144, 217, .13);

    /* Písmo
       ⚠️ Předloha je AI render — přesný font z ní nejde odečíst. Tohle je
          náhrada odpovídající charakteru, čeká na potvrzení zadavatelem. */
    --ec-font-display: "Archivo", system-ui, -apple-system, "Segoe UI", sans-serif;
    --ec-font-body:    "Inter", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
    --ec-font-mono:    "JetBrains Mono", Consolas, "SF Mono", monospace;

    /* Spacing — jedna škála, nic mimo ni */
    --ec-1: 4px;  --ec-2: 8px;  --ec-3: 12px; --ec-4: 16px; --ec-5: 24px;
    --ec-6: 32px; --ec-7: 48px; --ec-8: 64px; --ec-9: 80px; --ec-10: 120px;

    /* Layout */
    /* 🔴 1600, ne 1280. Změřeno z předlohy: obsahový pás tam zabírá
          **95,6 %** dostupné plochy (dlaždice od x=108 do x=1622 při šířce
          1672 s pruhem 88 px) — tedy skoro celou šířku s úzkým okrajem,
          ne vycentrovaný sloupec.

          Úplně bez stropu to ale nejde: na 2560px displeji by řádky textu
          v katalogu byly nečitelně dlouhé. 1600 je kompromis — na běžných
          šířkách sedí na předlohu, na velmi širokých se zastaví. */
    --ec-container: 1600px;
    /* 🔴 ŠÍŘKA ČTENÉHO TEXTU — JEDNA HODNOTA PRO CELÝ WEB.
          Do 31. 8. 2026 se počítala v `ch` (72ch, 66ch). Jenže `ch` je šířka
          znaku „0" v použitém písmu a u téhle sady vychází ~6,5 px místo
          očekávaných ~8 px — z „66 znaků na řádek" se tak stal sloupec
          430 px široký. Na stránce obchodních podmínek z toho byla nudle
          na třetině obrazovky.

          768 px při 16px písmu je zhruba 78 znaků na řádek, tedy horní okraj
          doporučeného rozsahu — na dokumentové stránce správně, protože tam
          se čte souvisle a prázdno vedle textu ruší víc než delší řádek. */
    --ec-mira-textu: 48rem;
    --ec-gutter:    24px;
    --ec-header-h:  72px;
    --ec-gap:       24px;

    /* Šířka levého pruhu s ikonami. Drží se v proměnné, protože ji potřebuje
       mřížka i odsazení hlavičky — dvě čísla by se dřív nebo později rozešla. */
    --ec-rail-w:    124px;

    /* Kulaté tlačítko na dlaždici. Odsazení textu se z něj počítá. */
    --ec-tile-go:   40px;

    /* Rámečky a stíny */
    --ec-r-sm: 4px; --ec-r-md: 8px; --ec-r-lg: 14px; --ec-r-xl: 22px; --ec-r-pill: 999px;
    --ec-shadow:      0 12px 32px rgba(0, 0, 0, .38);
    --ec-shadow-pop:  0 24px 64px rgba(0, 0, 0, .55);

    /* 🔴 POLE A TLAČÍTKA MAJÍ JEDNU VÝŠKU. Dřív měla pole 48 px a tlačítka
          40 px, takže tlačítko vedle pole bylo o 8 px nižší. Nejvíc to bilo
          do očí v košíku u přepočtu množství — zadavatel to označil jménem.

          Ta výška NENÍ odhad: v předloze měří tlačítko 217 × 40 px
          (`_plan/oponentura/mereni-*.php`). Srovnalo se tedy pole dolů
          k tlačítku, ne naopak — jinak by se rozjelo hero, které už je
          podle předlohy odměřené a schválené.

          ⚠️ Na dotykovém ovládání se obojí zvedne na 44 px (Apple HIG).
             Zvedá se to SPOLEČNĚ jedním tokenem, aby se rozdíl nemohl
             vrátit zadními vrátky. */
    --ec-ctl-h:    40px;
    --ec-ctl-h-sm: 36px;
    --ec-btn-h:    var(--ec-ctl-h);

    /* Pohyb */
    --ec-ease:     cubic-bezier(.2, .6, .2, 1);
    --ec-t-hover:  200ms;
    --ec-t-expand: 300ms;

    /* Vrstvení — řízená hierarchie, žádné z-index: 99999 */
    --ec-z-header: 100;
    --ec-z-drawer: 200;
    --ec-z-modal:  1000;
}

/* =========================================================
   2. BASE
   ========================================================= */
*, *::before, *::after { box-sizing: border-box; }

/* 🔴 `color-scheme: dark` řekne prohlížeči, že je web tmavý. Bez toho
      vykreslí SVĚTLÉ posuvníky, výběrová pole a další vlastní prvky —
      na tmavém pozadí do očí bije hlavně posuvník levého pruhu.
      Řeší to i formulářové prvky, ne jen posuvníky. */
:root { color-scheme: dark; }

/* 🔴 ŽÁDNÝ OBRÁZEK NIKDY PŘES SVŮJ RÁM. Jedna zapomenutá `max-width` stačí
      k tomu, aby se celá stránka rozjela do šířky — a pozná se to až na
      konkrétním produktu s velkou fotkou, ne při běžném proklikání. */
img, svg, video, canvas { max-width: 100%; }

/* Skok na kotvu plynule, ať je poznat, KAM se stránka posunula. Skok naráz
   působí, jako by se načetla jiná stránka.
   ⚠️ Komu vadí pohyb na obrazovce, tomu se nevnucuje (`prefers-reduced-motion`). */
html { scroll-behavior: smooth; }
@media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } }

body {
    margin: 0;
    background: var(--ec-bg);
    color: var(--ec-text);
    font: 400 .9375rem/1.68 var(--ec-font-body);
    /* 🔴 `break-word`, ne `anywhere`. `anywhere` láme i slovo, které by se
          na další řádek celé vešlo — a protože se dědí, dělalo to z každého
          českého názvu „Dekorativn / í omítky". Chytlo se to na dlaždicích
          kategorií, v levém pruhu i v soupisu místností.

          Ochrana proti dlouhému kódu odstínu zůstává: `break-word` sáhne po
          lámání u slova, které se nevejde ani samo na prázdný řádek.

          ⚠️ Uvnitř gridu `break-word` NEOVLIVNÍ výpočet min-content (viz
             `web-css-konvence`), proto mají mřížkové položky `minmax(0,1fr)`
             a `min-width: 0` — ne globální `anywhere`. */
    overflow-wrap: break-word;
    -webkit-font-smoothing: antialiased;
}

a { color: var(--ec-accent); text-decoration: none; transition: color var(--ec-t-hover) var(--ec-ease); }
a:hover { color: var(--ec-text-strong); }

img { max-width: 100%; display: block; }

/* Přeskočení na obsah.
   🔴 Nad obsahem jsou dvě lepivé navigace (hlavička a levý pruh s kategoriemi).
      Kdo chodí po klávesnici, jinak protabuje desítky odkazů, než se dostane
      k obsahu stránky. Odkaz je vidět až při zaměření. */
.ec-skip {
    position: absolute; left: var(--ec-4); top: -100px; z-index: 100;
    display: inline-block; padding: var(--ec-3) var(--ec-4);
    background: var(--ec-primary); color: #fff;
    border-radius: var(--ec-r-md);
    transition: top var(--ec-t-hover) var(--ec-ease);
}
.ec-skip:focus { top: var(--ec-3); color: #fff; }

/* Na dotykovém ovládání se cíl zvětší — pole i tlačítka naráz, jedním
   tokenem, aby mezi nimi nemohl znovu vzniknout rozdíl. */
@media (pointer: coarse) {
    :root { --ec-ctl-h: 44px; }
    /* Kulatá tlačítka na fotkách a u karuselů — prst potřebuje 44 px. */
    .ec-fav__btn, .ec-karusel-ovladani__btn { width: 44px; height: 44px; }
    /* Malá tlačítka karet („Detail", „Spočítat") měla na tabletu 36 px. */
    .ec-btn--sm { min-height: 40px; }
    /* Textové odkazy v patičce a v blocích (20–25 px vysoké): plocha pro prst
       se zvětší odsazením, záporný okraj vrátí rozestupy řádků, jak byly. */
    .ec-footer li a, .feature-link { display: inline-block; padding-block: 10px; margin-block: -10px; }
}

/* Web se neovládá jen myší — focus musí být vidět. */
:focus-visible { outline: 2px solid var(--ec-accent); outline-offset: 3px; border-radius: var(--ec-r-sm); }

/* =========================================================
   3. TYPOGRAFIE
   ========================================================= */
/* 🔴 `:where()` SRÁŽÍ SPECIFICITU ZÁKLADU NA NULU. Uvnitř `:where()` se
      selektor do specificity nepočítá, takže `:where(.ec-page) h1` má (0,0,1)
      — pouhé jméno prvku. Kterákoli komponentní třída ho pak přebije sama,
      bez zdvojování a bez `!important`.

      ⚠️ TŘETÍ VÝSKYT TÉHOŽ PROBLÉMU. `.ec-page h2` má (0,1,1) a přebíjelo
         `.ec-hero__title`, pak `.ec-tile__title` a teď `.ec-product-card__title`
         (0,1,0). U karty produktu se to projevilo dvakrát: nadpis se
         vykresloval v 2,4 rem místo 1 rem a jeho `margin-top: 64px` udělal
         mezi náhledem a názvem díru, kterou zadavatel odhadl na 70–100 px.

         Dvakrát jsem to léčil zdvojenou třídou u konkrétní komponenty.
         To je léčba příznaku — každá další komponenta s nadpisem spadne
         do stejné pasti. Tohle ji zavírá pro všechny.

      Skill `web-css-konvence`: „Když prvek nereaguje na třídu, nehledej
      cache — spočítej specificitu." */
.ec-h1, :where(.ec-page) h1 {
    margin: 0 0 var(--ec-4);
    font: 800 clamp(2.25rem, 5vw, 4rem)/1.04 var(--ec-font-display);
    letter-spacing: -.02em;
    text-transform: uppercase;
    color: var(--ec-text-strong);
}
/* Dlouhý název produktu jako nadpis („ŠABLONY PRO VYTVÁŘENÍ EFEKTU DŘEVA
   - 100x130 - 130x135") měl v 64 px čtyři řádky a na telefonu pět; fotka
   začínala až pod ohybem. Šablona třídu přidá podle délky názvu. */
.ec-h1--dlouhy { font-size: clamp(1.75rem, 3.4vw, 2.75rem); line-height: 1.1; }
.ec-h2, :where(.ec-page) h2 {
    margin: var(--ec-8) 0 var(--ec-4);
    font: 700 clamp(1.6rem, 3vw, 2.4rem)/1.12 var(--ec-font-display);
    letter-spacing: -.015em;
    color: var(--ec-text-strong);
}
.ec-h3 { margin: var(--ec-6) 0 var(--ec-3); font: 700 1.3rem/1.25 var(--ec-font-display); color: var(--ec-text-strong); }
/* ⚠️ Šířka v `rem`, ne v `ch` — `ch` je u téhle písmové sady ~6,5 px místo
      očekávaných ~8, takže „68 znaků" vyšlo na 440 px. Viz `--ec-mira-textu`. */
/* ⚠️ ODSAZENÍ SI URČUJE TŘÍDA, NE PROHLÍŽEČ. Ostatní typografické
      třídy (`.ec-h1`, `.ec-h2`, `.ec-eyebrow`) mají `margin` vypsaný; `.ec-lead`
      spoléhal na výchozí `1em` odstavce (17 px). V běžném toku se ten margin
      složil s odsazením nadpisu a nebylo to vidět — jenže v mřížce se marginy
      neskládají, přičetl se ke `gap` a na detailu produktu z toho bylo 49 px. */
.ec-lead { margin: 0 0 var(--ec-4); font-size: 1.0625rem; line-height: 1.62; color: var(--ec-muted); max-width: var(--ec-mira-textu); }
.ec-eyebrow {
    margin: 0 0 var(--ec-3);
    font: 600 .6875rem/1.2 var(--ec-font-body);
    letter-spacing: .09em;
    text-transform: uppercase;
    color: var(--ec-accent);
}
.ec-muted { color: var(--ec-muted); }
.ec-faint { color: var(--ec-faint); }
.ec-num   { font-variant-numeric: tabular-nums; white-space: nowrap; }

/* =========================================================
   4. LAYOUT
   ========================================================= */
.ec-container {
    width: 100%;
    max-width: var(--ec-container);
    margin-inline: auto;
    padding-inline: var(--ec-gutter);
}
.ec-section { padding-block: var(--ec-9); }
/* 🔴 POSLEDNÍ BLOK STRÁNKY SE MUSÍ ODLEPIT OD PATIČKY SÁM. Patička nemá
      vlastní horní mezeru (měla 120 px navíc k odsazení sekcí — zrušeno),
      takže o odstup se stará obsah. Pásy úvodní stránky (`.ec-band`) mají
      jen horní odsazení, aby na sebe těsně navazovaly — a poslední z nich
      („Oblíbené povrchy") pak seděl přímo na patičce. Naměřeno 0 px. */
/* Bloky stavebnice mají vlastní spodní okraj (`.builder-section:last-child`) — sčítal se na 160 px. */
main.ec-page > :last-child:not(.builder-row):not(.builder-section):not(.builder-cta) { padding-bottom: var(--ec-9); }
/* 🔴 PRVNÍ SEKCE PODSTRÁNKY MÁ MENŠÍ ODSAZENÍ NAHOŘE. Hlavička je sticky
      a vysoká 72 px, takže s 80 px odsazení začínala drobečková navigace
      až 152 px pod okrajem okna a nad nadpisem zela díra. Dole 80 px zůstává
      — tam se navazuje na patičku. Úvodní stránka začíná hero, ne `.ec-section`,
      takže se jí to netýká. */
main.ec-page > .ec-section:first-child { padding-top: var(--ec-7); }
.ec-section--tight { padding-block: var(--ec-7); }

/* 🔴 Pásy pod hero na sebe těsně navazují — ODMĚŘENO v předloze:
      hero končí na y=530, dlaždice začínají na 537 (7 px),
      končí na 653, ikonový pás začíná na 675 (**22 px**),
      končí na 752, nadpis „Oblíbené povrchy" je na 795 (**43 px**).

      Dřív tu byla běžná sekce s odsazením 48 px nahoře i dole, takže
      mezery vycházely 48 / 96 / 128 px — pásy se rozpadly a hero
      s dlaždicemi přestalo držet pohromadě. */
.ec-band        { padding-block: 0; }
/* Dlaždice leží NA fotce, proto vlastní vrstvící kontext — jinak by je
   překryv obalu (`z-index: -1`) sice nepřebil, ale stín a kulaté rohy by
   se skládaly nepředvídatelně. */
/* ⚠️ 20 px, ne odměřených 7 — zadavatel to takhle chce (30. 8. 2026).
      Sedm pixelů platilo, dokud hero končilo fotkou; teď končí textem
      a dlaždice by na něm doslova ležely. */
.ec-band--tiles { position: relative; padding-top: 20px; }
.ec-band--usp   { padding-top: 22px; }
.ec-band--after { padding-top: 43px; }

/* 🔴 Vždy minmax(0, 1fr), nikdy holé 1fr — holé 1fr se nesmí zmenšit pod
      obsah a jediný nezalomitelný název rozbije celou mřížku. */
.ec-grid { display: grid; gap: var(--ec-gap); }
.ec-grid--2 { grid-template-columns: repeat(auto-fit, minmax(min(320px, 100%), 1fr)); }
.ec-grid--3 { grid-template-columns: repeat(auto-fit, minmax(min(260px, 100%), 1fr)); }
.ec-grid--4 { grid-template-columns: repeat(auto-fit, minmax(min(220px, 100%), 1fr)); }
/* Palety vzorníku jsou náhled, ne zboží — na telefonu dva sloupce. Jeden
   sloupec dělal ze 45 palet stránku na 25 obrazovek. */
@media (max-width: 560px) {
    .ec-grid--palety { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--ec-3); }
}

/* Detail produktu: obsah + přilepený souhrn */
/* 🔴 DETAIL SE NEROZTAHUJE NA CELOU ŠÍŘKU KONTEJNERU. Ten je kvůli hero
      a dlaždicím široký 1600 px; po odečtení postranního sloupce zbylo na text
      přes 870 px, jenže souvislý text se nad ~75 znaky na řádek čte špatně,
      takže měl `.ec-prose` vlastní strop 68ch. Výsledek: text v levé půlce
      sloupce a vpravo od něj 360 px prázdna. Zadavatel to popsal přesně —
      „vpravo je volné místo, text je vlevo, nevím proč".

      Správné řešení je omezit BLOK, ne text v něm: sloupec se zúží na míru
      čitelného řádku a text ho pak vyplní celý. Prázdno se přesune na okraje
      stránky, kam patří.

   ⚠️ Zúžení sedí na `.ec-container--text` v šabloně, NE tady na mřížce.
      Zúžená mřížka uvnitř široké stránky se sice vycentruje, ale drobečková
      navigace nad ní zůstane u levého okraje a mezi ní a nadpisem vznikne
      díra na 200 px. Zúžit se musí celý blok najednou. */
.ec-detail {
    display: grid; gap: var(--ec-7);
    grid-template-columns: minmax(0, 1fr) minmax(0, 400px);
}

/* ── Hlavní sloupec detailu ───────────────────────────────────────────── */
/* 🔴 JEDEN SLOUPEC, GALERIE PŘES CELOU ŠÍŘKU. Zkoušelo se rozdělení na dva
      sloupce (galerie vlevo, text vpravo), aby se využil široký monitor.
      Dopadlo to hůř: fotka se zmenšila na půlku, u krátkého popisu zůstal
      vedle ní pruh prázdna a nad textovým sloupcem díra až k nadpisu.
      Zadavatel to shrnul přesně — „malé fotky, všude díry".

      Fotka je u dekorativní omítky to hlavní; zákazník podle ní vybírá
      povrch. Dostane tedy celou šířku sloupce (~1 100 px na velkém monitoru)
      a text jde pod ni.

   ⚠️ Text si drží vlastní strop 72 znaků na řádek. Prázdno vpravo od něj
      je záměr, ne chyba: pod plnou šířkou galerie se odstavec čte jako
      textový blok, ne jako rozbitá mřížka. Roztáhnout ho přes celých
      1 100 px by dalo ~130 znaků na řádek, u čehož oko ztrácí konec řádku. */
/* 🔴 `minmax(0, 1fr)` JE POVINNÉ, NE OZDOBA. Bez něj má mřížka implicitní
      sloupec `auto`, jehož minimum je **min-content** — a min-content bloku
      s velkou fotkou je vlastní šířka té fotky. Sloupec se proto roztáhl na
      šířku obrázku (u produktu s jedinou fotkou přes 4 000 px), přetekl přes
      postranní panel a celá stránka dostala vodorovný posuvník.

      `overflow: hidden` na galerii uvnitř to NEZACHRÁNÍ. Ořízne sice, co
      z galerie kouká ven, ale příspěvek k min-content se počítá z obsahu
      a probublá mřížce nahoru — sloupec se roztáhne, i když je fotka
      viditelně oříznutá.

   ⚠️ Nepozná se to proklikáním webu. Záleží na tom, jak velký je zdrojový
      soubor konkrétního produktu; u většiny katalogu se nic nestane a pak
      přijde jeden produkt, u kterého se stránka rozjede do šířky.
      Nalezeno na BETON CALCE.

   ⚠️ Tohle je tatáž past jako u `.ec-detail` výš. V každé mřížce, do které
      může přijít obrázek nebo dlouhý text, musí být `minmax(0, …)`
      (`web-css-konvence`, sekce o gridu a flexu). */
.ec-detail__main {
    display: grid; gap: var(--ec-6); align-content: start;
    grid-template-columns: minmax(0, 1fr);
}
/* Totéž o úroveň níž — položka mřížky má výchozí `min-width: auto`. */
.ec-detail__media { min-width: 0; }
.ec-detail__text { max-width: var(--ec-mira-textu); }

/* Nadpis a srdíčko na jedné ose. */
/* Přehrávač kurzu: tlačítko „Zpět na kurzy" se nesmí lámat („ZPĚT NA /
   KURZY") ani brát nadpisu místo — když se nevejde, jde pod nadpis.
   Název lekce pod přehrávačem je o stupeň menší než nadpis kurzu. */
.ec-watch .ec-detail__head { flex-wrap: wrap; }
/* Jako odkaz bez vnitřního odsazení: pod nadpisem lícuje s jeho levou
   hranou a na telefonu se neroztáhne přes celou šířku (≤ 480 px `.ec-btn`
   jinak dostane 100 %). */
.ec-watch .ec-detail__head > .ec-btn { flex: none; width: auto; padding-inline: 0; white-space: nowrap; }
.ec-watch .ec-h2--tight { font-size: clamp(1.25rem, 2.2vw, 1.6rem); }
.ec-watch .ec-h2--tight + .ec-watch__nav { margin-top: 0; }
/* Obsah pod úvodním odstavcem nemá být nalepený na text (16 px). */
.ec-lead + .ec-grid { margin-top: var(--ec-6); }
.ec-detail__head {
    display: flex; align-items: flex-start; justify-content: space-between;
    gap: var(--ec-4);
}
.ec-detail__head .ec-h1 { margin: 0; }
/* 🔴 NADPIS A PODTITUL JSOU JEDEN BLOK. Podtitul stál vedle hlavičky jako
      další položka `.ec-detail__main`, takže ho od názvu oddělila mezera
      mřížky (32 px) plus vlastní margin odstavce — 49 px. Podtitul je ale
      částí nadpisu („CORADO / Perleťová metalíza"), ne samostatným blokem.
      Srdíčko zůstává vpravo nahoře, hlavička je pořád flex o dvou položkách. */
.ec-detail__title { min-width: 0; }
.ec-detail__title .ec-lead { margin: var(--ec-3) 0 0; }
/* Na detailu srdíčko nepluje nad fotkou, ale stojí v řádku s nadpisem. */
.ec-detail__head .ec-fav { position: static; }
.ec-detail__head .ec-fav__btn { width: 40px; height: 40px; }
/* 🔴 KAŽDÁ IKONA ROZHRANÍ JE BLOK. Jako inline prvek sedne `<svg>` na účaří
      textu a vypadá posunutá o pár pixelů dolů. Uvnitř flexu se prvky blokují
      samy, takže tam to nevadí — jenže spoléhat na to, že prvek zrovna ve
      flexu JE, je přesně ten předpoklad, kterým se zarovnání rozbíjí, jakmile
      se obal přestylizuje. `display: block` proto u všech ikon, ne jen u těch,
      kde to zrovna vadí (`web-ikony-zarovnani`, bod 4). */
.ec-detail__head .ec-fav__btn svg { display: block; width: 20px; height: 20px; }

/* ── Hlavička ─────────────────────────────────────────── */
.ec-header {
    position: sticky; top: 0; z-index: var(--ec-z-header);
    display: flex; align-items: center; gap: var(--ec-7);
    min-height: var(--ec-header-h);
    padding-inline: var(--ec-gutter);
    background: color-mix(in srgb, var(--ec-header) 88%, transparent);
    backdrop-filter: blur(14px);
    border-bottom: 1px solid var(--ec-border);
}
/* Prohlížeč bez `color-mix` dostane plnou barvu — přijde o průhlednost,
   ne o čitelnost. `@supports not` se vyhodnotí jen tam, kde podpora chybí,
   takže na pořadí proti pravidlu výš nezáleží. */
@supports not (background: color-mix(in srgb, red 50%, transparent)) {
    .ec-header { background: var(--ec-header); }
}
.ec-logo {
    display: inline-flex; align-items: center; gap: var(--ec-3);
    font: 800 1.05rem/1 var(--ec-font-display);
    letter-spacing: .02em; text-transform: uppercase;
    color: var(--ec-text-strong);
}
.ec-logo__mark {
    display: grid; place-items: center;
    width: 36px; height: 36px;
    background: var(--ec-primary); color: #fff;
    border-radius: var(--ec-r-md);
}
/* Obrázkové logo: výška je dána hlavičkou, šířka se dopočítá — logo má
   poměr 256 : 75 a natvrdo psaná šířka by ho na jiném logu zdeformovala. */
.ec-logo--image { gap: 0; }
.ec-logo__img { display: block; height: 34px; width: auto; }
@media (max-width: 768px) {
    .ec-logo__img { height: 28px; }
}

/* Kontakt v hlavičce (telefon, e-mail). `align-items: center` a
   `line-height: 1` jsou to, co drží ikonu a text na společné ose — bez nich
   ikona ujede o pár pixelů a nikdo neví proč (`web-ikony-zarovnani`). */
.ec-header__contact {
    display: inline-flex; align-items: center; gap: var(--ec-2);
    color: var(--ec-muted); font-size: .875rem; line-height: 1;
    white-space: nowrap;
}
.ec-header__contact svg { display: block; width: 16px; height: 16px; flex: none; }
.ec-header__contact:hover { color: var(--ec-primary); }

/* ── Kontaktní seznam v patičce ───────────────────────────────────────── */
/* 🔴 IKONA MUSÍ DRŽET SVOU ŠÍŘKU I U VÍCEŘÁDKOVÉHO ÚDAJE. Adresa se na úzkém
      sloupci zalomí, a kdyby byla ikona součástí textového toku, druhý řádek
      by začal pod ní. `align-items: flex-start` + `flex: none` drží ikonu
      u prvního řádku a text v jednom bloku vedle ní. */
/* Rozestup dědí z `.ec-footer ul` — viz poznámka tam. */
.ec-contact li {
    display: flex; align-items: flex-start; gap: var(--ec-3);
    /* ⚠️ Tahle hodnota MUSÍ sedět na výšku `<svg>` výš (1.5em). Změnit jednu
          bez druhé znamená ikonu zase o kus vedle. */
    line-height: 1.5;
}
/* Víceřádkový údaj (adresa) se drží pohromadě vedle ikony, ne pod ní. */
.ec-contact li > span,
.ec-contact li > a { min-width: 0; }
/* 🔴 IKONA SE ZAROVNÁVÁ NA VÝŠKU PRVNÍHO ŘÁDKU, NE MAGICKÝM POSUNEM.
      Předchozí verze měla `margin-top: .18em` — číslo odhadnuté od oka, které
      sedí jen při jedné velikosti písma a jednom řádkování. Jakmile se
      kterékoli z toho změní, ikona zase ujede. Zarovnání ikon je vada, která
      se v tomhle projektu opakuje pořád dokola; odhadnutá konstanta ji vždycky
      jen odloží na příště.

      Správně: `<svg>` dostane VÝŠKU CELÉHO ŘÁDKU (`1.5em` = `line-height`
      položky) a šířku 16 px. Kresba se kvůli výchozímu
      `preserveAspectRatio="xMidYMid meet"` vejde do menšího z rozměrů, tedy
      do 16 px, a ve zbylé výšce se vystředí — přesně na optický střed prvního
      řádku textu vedle ní. Funguje to při jakékoli velikosti písma, protože
      obě hodnoty jsou v `em`.

   ⚠️ `display: block` je povinné. Jinak je `<svg>` inline prvek, sedne na
      účaří textu a vypadá posunutě dolů (`web-ikony-zarovnani`, bod 4). */
.ec-contact svg {
    display: block;
    width: 16px;
    height: 1.5em;
    flex: none;
    color: var(--ec-primary);
}

/* ── Priority+ navigace ────────────────────────────────────────────────
   🔴 NAVIGACE JE JEDINÝ PRVEK HLAVIČKY, KTERÝ SMÍ USTOUPIT. Logo, kontakt
      i ikony mají `flex: none` — když se šířka zmenší, zkracuje se navigace
      (položky jdou pod „…"), ne ikony. Dřív se ve flexu zmenšovalo všechno
      naráz: ikony se scvrkly na tečky a položky menu se zalomily na dva
      řádky („O / nás").

   ⚠️ Bez JavaScriptu se seznam zalamuje (`flex-wrap: wrap`) — ošklivé, ale
      dostupné. Jednořádkový ořez zapíná až třída `.js` na `<html>`. */
.ec-nav { flex: 1 1 auto; min-width: 0; }
.ec-nav__list {
    display: flex; flex-wrap: wrap; align-items: center; gap: var(--ec-6);
    list-style: none; margin: 0; padding: 0;
}
/* 🔴 BEZ `overflow: hidden`. Rozbalovací nabídka „…" je potomek seznamu;
      s ořezem se otevřela do nuly a vypadalo to, že tlačítko nic nedělá.
      Jednořádkovost drží `nowrap` + přesun položek do nabídky skriptem —
      ořez není potřeba, jen do doběhnutí skriptu můžou položky na okamžik
      přesáhnout, což hlavička (sama bez ořezu) unese. */
.js .ec-nav__list { flex-wrap: nowrap; }
.ec-nav__list > li { flex: none; white-space: nowrap; }
.ec-nav a { color: var(--ec-text); font-weight: 500; }
.ec-nav a:hover, .ec-nav a.is-active { color: var(--ec-accent); }

.ec-nav__more { position: relative; }
.ec-nav__more-btn {
    display: grid; place-items: center;
    width: 40px; height: 40px; padding: 0;
    border: 1px solid var(--ec-border-strong); border-radius: var(--ec-r-md);
    background: none; color: var(--ec-text); cursor: pointer;
}
.ec-nav__more-btn svg { display: block; width: 18px; height: 18px; }
.ec-nav__more-btn:hover, .ec-nav__more-btn[aria-expanded="true"] { border-color: var(--ec-accent); color: var(--ec-accent); }
.ec-nav__menu {
    position: absolute; top: calc(100% + var(--ec-2)); left: 0; z-index: 2;
    min-width: 220px; padding: var(--ec-2) 0; margin: 0; list-style: none;
    background: var(--ec-surface); border: 1px solid var(--ec-border-strong);
    border-radius: var(--ec-r-md); box-shadow: 0 16px 40px rgba(0, 0, 0, .45);
}
.ec-nav__menu[hidden] { display: none; }
.ec-nav__menu li { white-space: nowrap; }
.ec-nav__menu a { display: block; padding: var(--ec-3) var(--ec-5); }
.ec-nav__menu a:hover { background: var(--ec-surface-2); }
/* Ikony tlačítka: desktop „…", mobil hamburger, otevřeno křížek. */
/* ⚠️ Selektor s tlačítkem, ne samotná třída ikony — `.ec-nav__more-btn svg`
      má (0,1,1) a jednoduchá třída (0,1,0) by prohrála: na desktopu byly
      vidět tři tečky i hamburger naráz. */
.ec-nav__more-btn .ec-nav__ico-burger, .ec-nav__more-btn .ec-nav__ico-close { display: none; }
.ec-nav__menu-extra { display: none; }

/* ── Mobilní menu (≤ 768 px) ─────────────────────────────────────────────
   🔴 NENÍ TO ZMENŠENÝ DESKTOP. Pod 768 px jdou do panelu VŠECHNY položky
      (`pripojPriorityMenu` to vynutí) a panel je přes celou obrazovku pod
      hlavičkou: velké odkazy na klepnutí, dole košík, oblíbené a kontakt.
      Rozbalovací seznam o šířce 220 px, který tu byl dřív, šel ovládat, ale
      nebyl použitelný — zadavatel: „Kde je mobilní verze menu?" */
@media (max-width: 768px) {
    .ec-nav__more-btn .ec-nav__ico-dots { display: none; }
    .ec-nav__more-btn .ec-nav__ico-burger { display: block; }
    .ec-nav__more-btn[aria-expanded="true"] .ec-nav__ico-burger { display: none; }
    .ec-nav__more-btn[aria-expanded="true"] .ec-nav__ico-close { display: block; }
    .ec-nav__more { position: static; }
    .ec-nav__menu {
        /* 🔴 NE `position: fixed`. Hlavička má `backdrop-filter`, a ten z ní dělá
              kontejner pro fixní potomky — panel měl 80 px, tedy výšku hlavičky.
              Absolutně pod hlavičkou (ta je `sticky`, takže je to totéž místo)
              s výškou zbytku obrazovky. */
        position: absolute; top: 100%; left: 0; right: 0;
        height: calc(100vh - var(--ec-header-h));
        height: calc(100dvh - var(--ec-header-h));
        z-index: var(--ec-z-header);
        min-width: 0; padding: var(--ec-4) var(--ec-gutter) var(--ec-8);
        overflow-y: auto; -webkit-overflow-scrolling: touch;
        background: var(--ec-header); border: 0; border-radius: 0; box-shadow: none;
        display: flex; flex-direction: column;
    }
    .ec-nav__menu[hidden] { display: none; }
    .ec-nav__menu > li { white-space: normal; }
    .ec-nav__menu a {
        padding: var(--ec-4) 0;
        font: 600 1.25rem/1.2 var(--ec-font-display); color: var(--ec-text-strong);
        border-bottom: 1px solid var(--ec-border);
    }
    .ec-nav__menu a:hover { background: none; color: var(--ec-accent); }
    /* Rychlé odkazy hned pod položkami, ne přilepené ke dnu panelu —
       na 768 px mezi nimi zela díra 330 px. */
    .ec-nav__menu-extra { display: block; padding-top: var(--ec-6); }
    /* Rychlé odkazy jako stejně vysoká tlačítka v mřížce — v řádku holého
       textu nebylo poznat, že se na ně dá klepnout. */
    .ec-nav__menu-links { display: grid; grid-auto-flow: column; grid-auto-columns: minmax(0, 1fr); gap: var(--ec-2); margin-bottom: var(--ec-5); }
    .ec-nav__menu .ec-nav__menu-links a {
        display: flex; align-items: center; justify-content: center;
        min-height: 44px; padding: var(--ec-2) var(--ec-3);
        font: 600 .9375rem/1.2 var(--ec-font-body); text-align: center;
        border: 1px solid var(--ec-border-strong); border-radius: var(--ec-r-md);
    }
    .ec-nav__menu-contact { display: grid; gap: var(--ec-3); }
    .ec-nav__menu-contact a {
        display: flex; align-items: center; gap: var(--ec-3);
        padding: 0; border: 0; font: 400 1rem/1 var(--ec-font-body); color: var(--ec-text);
    }
    .ec-nav__menu-contact svg { display: block; width: 18px; height: 18px; flex: none; color: var(--ec-primary); }
    /* Stránka pod otevřeným panelem se neposouvá. */
    body.ec-menu-open { overflow: hidden; }
}

.ec-header__right { margin-left: auto; display: flex; align-items: center; gap: var(--ec-3); }
/* 🔴 NIC V PRAVÉ SKUPINĚ SE NEZMENŠUJE. Ikony i kontakt drží svou velikost,
      místo pouští navigace. Viz poznámka nad `.ec-nav`. */
.ec-header__right > * { flex: none; }
.ec-cart-link svg { display: block; width: 18px; height: 18px; flex: none; }
.ec-logo { flex: none; }

/* Košík v hlavičce s počítadlem */
.ec-cart-link {
    display: inline-flex; align-items: center; gap: var(--ec-2);
    /* Vyšší a širší než dřív — v předloze jsou to plnohodnotné boxy,
       ne drobné ikonky nalepené na kraji. */
    height: 42px; padding-inline: var(--ec-4);
    border: 1px solid var(--ec-border-strong); border-radius: var(--ec-r-md);
    color: var(--ec-text);
}
.ec-cart-link:hover { border-color: var(--ec-accent); color: var(--ec-accent); }
.ec-cart-count {
    display: inline-grid; place-items: center;
    min-width: 20px; height: 20px; padding-inline: var(--ec-2);
    background: var(--ec-primary); color: #fff;
    border-radius: var(--ec-r-pill);
    font: 700 .6875rem/1 var(--ec-font-body);
}

/* 🔴 MEDIÁLNÍ PRAVIDLA HLAVIČKY AŽ ZA JEJÍMI KOMPONENTAMI. Do 1. 9. 2026 byl
      tenhle blok o sto řádků VÝŠ než definice `.ec-header__right` a
      `.ec-cart-link`; obě mají stejnou specificitu, takže vyhrálo to níž
      položené — základní hodnoty — a úzká okna (≤ 430 px) dostala plné
      odsazení i mezery. Naměřeno: 320 px → přetečení 18 px, ačkoli pravidla
      pro 360 px v souboru byla. Tatáž past jako u `.builder-cta`. */
/* 🔴 ÚSPORA MÍSTA PO KROCÍCH, NE NARÁZ. Hlavička nese logo, navigaci, telefon,
      e-mail a košík. Skrývat text hned na tabletu by z ní udělala řadu ikon,
      u kterých nikdo nepozná, co dělají; nechat ho až do mobilu zase přeteče.

      Proto tři stupně: nejdřív zmizí e-mailová adresa (telefon je při
      objednávce materiálu důležitější a čte se rychleji), pak i číslo,
      a nakonec zůstanou samotné ikony jako proklik. */
@media (max-width: 1280px) {
    .ec-header { gap: var(--ec-5); }
    .ec-header__contact--email span { display: none; }
}
@media (max-width: 900px) {
    .ec-header { gap: var(--ec-4); }
    .ec-header__contact span { display: none; }
}
@media (max-width: 560px) {
    /* Text u košíku je poslední, co jde pryč — ikona sama je srozumitelná. */
    .ec-cart-link > span:not(.ec-cart-count) { display: none; }
    .ec-cart-link { padding-inline: var(--ec-3); }
}
/* 🔴 NEJUŽŠÍ TELEFONY (≤ 430 px). Naměřeno na 390 px: logo 96 + „…" 40 +
      pravá skupina 236 + mezery a odsazení = 452 px → přetečení 62 px.
      Ubírá se to nejméně potřebné: e-mailová ikona (telefon zůstává, na
      mobilu se na něj klepe), boxy tlačítek na 40 px, mezery na 8 a logo
      na 24 px výšky. Po úpravě se hlavička vejde s rezervou. */
/* 🔴 MOBILNÍ HLAVIČKA (≤ 768 px) NENÍ ZMENŠENÝ DESKTOP. Dřív tu bylo sedm
      prvků vedle sebe (logo, hamburger, telefon, oblíbené, účet, hledání,
      košík) a přihlášený zákazník s košíkem hlavičku roztáhl na 405 px —
      mobil pak zmenšil celou stránku. Teď: logo vlevo, vpravo hledání, účet,
      košík a hamburger úplně na kraji, všechno stejné čtverce. Telefon,
      e-mail a oblíbené jsou v panelu menu (`.ec-nav__menu-extra`). Počet
      v košíku je odznak na ikoně, ne text vedle ní — box drží šířku. */
@media (max-width: 768px) {
    :root { --ec-header-h: 60px; --ec-head-btn: 44px; }
    .ec-header { gap: var(--ec-3); padding-inline: var(--ec-gutter); }
    .ec-header__contact, .ec-cart-link--fav { display: none; }
    .ec-nav { order: 3; flex: none; }
    .ec-header__right { gap: var(--ec-2); }
    .ec-header .ec-cart-link {
        position: relative; justify-content: center;
        width: var(--ec-head-btn); height: var(--ec-head-btn); min-height: 0; padding: 0;
    }
    .ec-header .ec-cart-link > span:not(.ec-cart-count) { display: none; }
    .ec-header .ec-cart-count {
        position: absolute; top: -6px; right: -6px;
        box-shadow: 0 0 0 2px var(--ec-header);
    }
    .ec-header .ec-cart-count--dot { top: 6px; right: 6px; }
    .ec-nav__more-btn { width: var(--ec-head-btn); height: var(--ec-head-btn); }
    .ec-logo__img { height: 28px; }
}
@media (max-width: 360px) {
    :root { --ec-head-btn: 40px; }
    .ec-header { gap: var(--ec-2); padding-inline: var(--ec-3); }
    .ec-header__right { gap: var(--ec-1); }
    .ec-logo__img { height: 22px; }
}


/* ── Patička ──────────────────────────────────────────── */
/* ⚠️ ŽÁDNÝ VLASTNÍ ODSTUP NAD PATIČKOU. Obsah nad ní končí odsazením sekce
      (`.ec-section` má dole 80 px) a patička má svoje odsazení nahoře (64 px).
      Přidat k tomu ještě 120 px `margin-top` znamenalo přes 260 px prázdna
      mezi koncem textu a patičkou — u krátké stránky to vypadá jako
      nedokončený obsah, ne jako vzdušný design. */
.ec-footer {
    margin-top: 0;
    padding-block: var(--ec-8) var(--ec-6);
    background: var(--ec-surface);
    border-top: 1px solid var(--ec-border);
}
.ec-footer__cols { display: grid; gap: var(--ec-6); grid-template-columns: repeat(auto-fit, minmax(min(220px,100%), 1fr)); }
.ec-footer h4 { margin: 0 0 var(--ec-3); font: 600 .75rem/1.2 var(--ec-font-body); letter-spacing: .09em; text-transform: uppercase; color: var(--ec-muted); }
/* 🔴 JEDEN SVISLÝ RYTMUS PRO VŠECHNY SLOUPCE PATIČKY. Odstup mezi položkami
      byl na dvou místech naráz: `li { margin-bottom: 8px }` tady a `gap: 12px`
      u kontaktního seznamu. Sčítaly se, takže kontakt měl 20 px a sousední
      sloupce 8 px — „v patičce jsou mezery každá jiná".

      Odstup dělá VÝHRADNĚ `gap` na seznamu; `li` nemá vlastní margin. Dvě
      místa, kde se rozhoduje o téže mezeře, se dřív nebo později rozejdou. */
.ec-footer ul { display: grid; gap: var(--ec-3); list-style: none; margin: 0; padding: 0; }
.ec-footer li { margin: 0; }
/* Značkový sloupec je širší než ostatní — nese logo a odstavec, ne seznam. */
.ec-footer__cols { align-items: start; }
.ec-footer__brand { grid-column: span 2; max-width: 34rem; }
/* Čtyři bloky patičky: na tabletu 2 × 2. S `auto-fit` vyšly tři sloupce
   a „Dokumenty" spadly samy pod logo. */
@media (max-width: 900px) {
    .ec-footer__cols { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .ec-footer__brand { grid-column: auto; }
}
@media (max-width: 560px) {
    .ec-footer__cols { grid-template-columns: minmax(0, 1fr); }
}
/* Časový rozsah se nesmí zlomit uprostřed („8:00– / 16:00"). */
.ec-footer__hours { white-space: nowrap; }
/* ⚠️ Logo v patičce nemá být menší než v hlavičce (34 px). Třicet pixelů
      v širokém sloupci vypadalo jako zapomenutá ikonka; patička je navíc
      místo, kde se značka připomíná naposledy. */
.ec-footer__logo { display: block; height: 46px; width: auto; margin-bottom: var(--ec-5); }
.ec-footer__wordmark {
    margin: 0 0 var(--ec-4);
    font: 800 1.05rem/1 var(--ec-font-display);
    letter-spacing: .02em; text-transform: uppercase; color: var(--ec-text-strong);
}
.ec-footer__tagline { margin: 0; color: var(--ec-muted); font-size: .875rem; line-height: 1.6; }
.ec-footer__social { display: flex; flex-wrap: wrap; gap: var(--ec-4); margin-top: var(--ec-4); }
.ec-footer__social li { margin: 0; }
.ec-footer__social a { color: var(--ec-muted); font-size: .8125rem; }
.ec-footer__social a:hover { color: var(--ec-primary); }
.ec-footer a:hover { color: var(--ec-primary); }
/* Odkaz, který ve skutečnosti spouští akci, musí být `<button>` — jinak
   ho klávesnice i čtečka ohlásí jako navigaci, která nikam nevede. Vypadá
   ale jako ostatní odkazy v patičce. */
.ec-footer__linkbtn {
    padding: 0; background: none; border: 0;
    color: inherit; font: inherit; text-align: left; cursor: pointer;
}
.ec-footer__linkbtn:hover { color: var(--ec-primary); }
.ec-footer__bottom {
    display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between;
    gap: var(--ec-3);
    margin-top: var(--ec-7); padding-top: var(--ec-5);
    border-top: 1px solid var(--ec-border);
    color: var(--ec-faint); font-size: .8125rem;
}


/* ── Skořápka: levý pruh + obsah ──────────────────────────
   Předloha má vlevo úzký svislý pruh s ikonami kategorií, který zůstává
   na místě při scrollu. Je to navigace, ne dekorace — proto `<nav>`
   a proto se na úzkých displejích neschovává, ale překlopí do vodorovného
   pásu pod hlavičkou. Skrýt ji úplně by na mobilu odřízlo celé kategorie. */
.ec-shell {
    display: grid;
    grid-template-columns: var(--ec-rail-w) minmax(0, 1fr);
    align-items: start;
    column-gap: var(--ec-2);
    /* 🔴 Pruh je `sticky`, takže jeho vlastní pozadí končí tam, kde končí on —
          pod ním by zůstal neobarvený sloupec a linka useknutá v půli stránky.
          Sloupec proto obarví přechodem sama skořápka: barva do šířky pruhu,
          dál nic. */
    background: linear-gradient(to right,
        var(--ec-rail) 0 var(--ec-rail-w),
        transparent var(--ec-rail-w));
}
.ec-rail {
    position: sticky; top: var(--ec-header-h);
    /* `100dvh` respektuje vysouvací lištu mobilních prohlížečů; `100vh`
       je fallback pro starší, kde by pruh přetékal. */
    height: calc(100vh - var(--ec-header-h));
    height: calc(100dvh - var(--ec-header-h));
    /* ⚠️ `overscroll-behavior: contain` tu BÝVALO a bránilo tomu, aby po
          dojetí pruhu na konec pokračovala stránka. Uživatel to čte jako
          „scroll se zasekl". Chování se vrací na výchozí, tedy s řetězením. */
    overflow-y: auto;
    /* Tenký posuvník v barvě značky. `scrollbar-*` je standard (Firefox
       a novější Chrome), `::-webkit-scrollbar` níž je záloha pro starší
       WebKit — ten standardní vlastnosti neumí. */
    /* Posuvník v barvě značky — v předloze je oranžový, ne šedý. */
    scrollbar-width: thin;
    scrollbar-color: var(--ec-primary) transparent;
    display: flex; flex-direction: column; gap: var(--ec-2);
    /* Spodní odsazení je větší než přechod níž — poslední položka se dá
       vyrolovat nad něj a nezůstane pod mlhou. */
    padding: var(--ec-5) var(--ec-3) var(--ec-8);
    background: var(--ec-rail);
    border-right: 1px solid var(--ec-border);
    /* 🔴 Pruh je delší než obrazovka (1 131 px ve 928px okně) a posuvník
          je vidět jen při najetí. Spodní okraj se rozplývá — jinak končil
          uprostřed ikony „Impregnace" a nic nenaznačovalo, že pokračuje. */
    -webkit-mask-image: linear-gradient(to bottom, #000 calc(100% - var(--ec-7)), transparent);
    mask-image: linear-gradient(to bottom, #000 calc(100% - var(--ec-7)), transparent);
}
.ec-rail::-webkit-scrollbar { width: 6px; }
.ec-rail::-webkit-scrollbar-track { background: transparent; }
.ec-rail::-webkit-scrollbar-thumb {
    background: var(--ec-primary);
    border-radius: var(--ec-r-pill);
}
.ec-rail::-webkit-scrollbar-thumb:hover { background: var(--ec-primary-hover); }

.ec-rail__item {
    display: grid; justify-items: center; gap: var(--ec-2);
    padding: var(--ec-3) var(--ec-2);
    border-radius: var(--ec-r-md);
    color: var(--ec-muted);
    text-align: center;
    transition: color var(--ec-t-hover) var(--ec-ease),
                background var(--ec-t-hover) var(--ec-ease);
}
.ec-rail__item:hover { color: var(--ec-accent); background: var(--ec-surface-2); }
/* Aktivní kategorie musí být poznat na první pohled — v předloze ji nese
   oranžová barva i svislý proužek u kraje. Samotné jiné pozadí je málo. */
.ec-rail__item.is-active {
    color: var(--ec-primary);
    background: var(--ec-surface-2);
    box-shadow: inset 3px 0 0 var(--ec-primary);
}
.ec-rail__item svg { display: block; width: 22px; height: 22px; }
.ec-rail__label {
    /* 12 px — 11 px bylo pod hranicí čitelnosti popisku navigace. */
    font: 500 .75rem/1.35 var(--ec-font-body);
    letter-spacing: .01em;
    /* 🔴 `break-word`, ne `anywhere`. `anywhere` láme i tam, kde by se slovo
          na další řádek vešlo — z „Dekorativní omítky" udělá „Dekorativ /
          ní omítky". `break-word` sáhne po lámání až u slova, které se
          nevejde ani samo. */
    overflow-wrap: break-word;
    hyphens: auto;
}
.ec-rail__sep { margin: var(--ec-4) var(--ec-3); border-top: 1px solid var(--ec-border); }

/* ── Hero ─────────────────────────────────────────────────
   Fotka jde přes celou šířku obsahu, text sedí na tmavém přechodu vlevo.
   🔴 Přechod NENÍ dekorace — bez něj by světlý nadpis na světlé části
      fotky zmizel. Proto patří ke komponentě, ne mezi volitelné doplňky. */
/* 🔴 SPOLEČNÝ OBAL HERO A DLAŽDIC — fotka prochází za oběma.
      V předloze dlaždice na fotce leží: v mezerách mezi nimi je vidět scéna
      (teplý tón, R−B až 33) a teprve u jejich spodní hrany přejde do pozadí
      stránky. Kdyby fotka zůstala v hero, skončila by s ním a dlaždice by
      seděly na holém pozadí.

      `isolation: isolate` udělá z obalu vlastní vrstvící kontext, takže
      fotka i překryv smí mít záporný `z-index` a zůstat POD obsahem, aniž
      by propadly za pozadí stránky. Bez toho by `z-index` potřeboval
      každý potomek zvlášť. */
.ec-hero-wrap {
    position: relative;
    isolation: isolate;
    /* 🔴 VÝŠKU DÁVÁ OBSAH, ne poměr stran fotky.
          Mezikrok měl `aspect-ratio: 1672 / 941`, aby byla vidět celá fotka
          bez ořezu. Scéna tím sedla, ale hero vyrostlo na ~1000 px a pás
          dlaždic spadl pod ohyb stránky. Zadavatel proto ubral zespodu:
          dlaždice mají sedět hned pod textem.

          Výřez se tím vrací, ale je řízený — `object-position` níž říká,
          že se ubírá hlavně zespodu (podlaha) a jen kousek shora. */
    display: flex; flex-direction: column;
    /* Bez fotky zůstane značkový přechod — vypadá to jako záměr, ne jako
       obrázek, který se nenačetl. Fotku doplní správce v nastavení. */
    background:
        radial-gradient(120% 90% at 78% 22%, rgba(222, 68, 0, .22), transparent 60%),
        var(--ec-surface);
}

.ec-hero {
    position: relative;
    display: flex; align-items: center;
    /* 🔴 Výška se odvíjí od ŠÍŘKY, ne od výšky okna. Předloha má hero
          1584 × 420 px, tedy poměr **3,77 : 1** — široký nízký pruh.
          Původní `74vh` dávalo na běžném monitoru poměr 2,5 : 1 a z pruhu
          byl skoro celý viewport, což mění charakter kompozice.
          `26vw` drží poměr kolem 3,5 : 1 napříč šířkami. */
    flex: none;
    /* Spodní hranu hero určuje POSLEDNÍ ŘÁDEK TEXTU, ne pevná výška —
       dlaždice pak navazují přesně 20 px pod číslovaným pásem. `min-height`
       je jen pojistka, aby hero nezplasklo, když správce texty zkrátí. */
    min-height: clamp(320px, 20vw, 440px);
    /* 🔴 Nahoře 40 px, dole nic. Mezeru k dlaždicím dělá `.ec-band--tiles`,
          aby byla na jednom místě a dala se změřit.

          Hodnota je svázaná s mezerou pod nadpisem: co se ubere tam, přibude
          sem. Nadpis tím sjede níž a přitiskne se k perexu, ale VÝŠKA HERO
          zůstane stejná — jinak by se posunuly dlaždice a rozpadlo by se
          odměřených 20 px pod textem. */
    padding: 40px 0 0;
    /* ⚠️ Fotka, překryv, maska ani `overflow: hidden` tu UŽ NEJSOU — patří
          obalu `.ec-hero-wrap`, protože pokračují za dlaždice. Hero samo je
          průhledné a nese jen text. */
}
.ec-hero-wrap > .ec-hero__media {
    position: absolute; inset: 0; z-index: -2;
    width: 100%; height: 100%;
    object-fit: cover;
    /* 🔴 Fotka se u spodní hrany dlaždic ROZPLÝVÁ, nekončí schodem.
          Odměřeno v předloze: v mezerách mezi dlaždicemi je scéna ještě
          na y=595 (R−B = 16), na y=620 už je pozadí stránky (R−B = 6);
          dlaždice končí na 653. Vychládá tedy v poslední pětině výšky obalu. */
    mask-image: linear-gradient(to bottom,
        #000 0%, #000 82%, rgba(0, 0, 0, .55) 92%, transparent 100%);
    /* 🔴 Ubírá se HLAVNĚ ZESPODU. Vodorovně `cover` neořezává (fotka má
          šířku obalu), svisle padne asi třetina. Zadání: „uber zespodu…
          a z vrchu uber kousek“ — tedy zhruba čtvrtina úbytku shora
          (horní část stěny) a tři čtvrtiny zespodu (parkety).
          Poměr 1 : 3 dával svislé ukotvení 25 %.

       🔴 Posunuto na 46 %, aby sedačka šla o 85 px výš (zadání „vynes ji
          o 70–100 px“). Číslo NENÍ odhad — spočítané z prohlížeče:
          obal měří 1773 × 600 px, fotka se při `cover` škáluje na šířku
          obalu, takže je 998 px vysoká; svisle jde posouvat o rozdíl,
          tedy o 398 px. 85 px z 398 je 21,3 bodu, a 25 + 21,3 ≈ 46. */
    object-position: 50% 46%;
    /* 🔴 Odstín a sytost jsou SROVNANÉ MĚŘENÍM, ne odhadem.

          🔴 Měří se na SROVNATELNÉM místě — na nejsvětlejší části stěny,
             kterou skript najde sám v obou obrázcích (předloha 62 % šířky,
             fotka 59 %). Dřív jsem výřez volil ručně a v jedné z fotek
             padl na stěnu ve stínu; z toho vyšla korekce jasu na 1,42,
             tedy nesmysl.

                          odstín   sytost   jas
             předloha      23,2°     74 %    80 %
             fotka         24,3°     79 %    93 %

             Odstín sedí (rozdíl 1°), sytost o pět bodů výš.

          ⚠️ JAS SE NEUPRAVUJE, i když se ta dvě čísla liší. Proložení
             jednotného násobitele přes všechny sloupce vyšlo 1,16 — jenže
             mediány sloupců táhne dolů velká plocha podlahy, kterou předloha
             ve svém pásu vůbec nemá. Srovnávaly by se dva různé obsahy.
             Násobit 1,16 by navíc přepálilo osvětlenou stěnu (93 % → 108 %)
             a přišla by o strukturu omítky, tedy právě o to, co se prodává. */
    filter: saturate(.94);
}
/* Překryv je NAD fotkou a POD obsahem — proto vlastní `z-index`, ne pořadí
   v kódu. Kdyby ležel nad dlaždicemi, ztmavil by jejich vlastní fotky. */
.ec-hero-wrap::after {
    content: ""; position: absolute; inset: 0; z-index: -1;

          Původní překryv byl tak těžký, že implementace vycházela zhruba
          TŘIKRÁT tmavší než předloha a světlo mělo na špatném místě —
          scéna se ztrácela a z hero zbyl tmavý pruh s textem.

          Měří se skriptem `scratchpad/porovnej-jas.php`: porovná tvar křivky
          snímku a předlohy. Dojem „je to tmavší" se takhle dá doložit číslem. */
    /* 🔴 KŘIVKA JE ODMĚŘENÁ, ne odhadnutá — a měří se MEDIÁNEM sloupce.
          Přes levou část předlohy leží text; průměr by jeho tahy započítal
          jako světlo scény a přechod by vyšel příliš slabý.

          Postup: pro každý sloupec `cíl` = medián jasu v předloze,
          `zdroj` = medián téhož sloupce ve fotce, `alfa = 1 − cíl/zdroj`.

              u      cíl   zdroj   alfa
              0,05   27,9   24,2   0,00
              0,20   27,9   47,5   0,41
              0,30   42,8   50,5   0,15
              0,50  119,2  105,2   0,00
              0,80   63,9   55,1   0,00
              1,00   16,2   25,6   0,37

       🔴 PŘEKRYV JE TEĎ SLABÝ, A JE TO SPRÁVNĚ. Nová fotka (30. 8. 2026)
          má tmavý levý roh a světlý střed už sama — přechod nese scéna,
          ne CSS. Předchozí fotka byla nasvícená rovnoměrně, takže se tma
          vlevo musela domalovat překryvem s alfou přes 0,7. Kdyby tu ta
          hodnota zůstala, levá třetina by zčernala.

          ⚠️ Ještě předtím tu byl schod na 36,7 % (`.86` → `.28` během sedmi
             procent). Vznikl proto, aby tma končila u svislé světelné linky —
             jenže ta je součást fotky, ne prvek. Zbyl po ní svislý šev.

          ⚠️ Vpravo přechod zase TMAVNE. Není to omyl: předloha má u pravého
             okraje vinětu (medián jasu spadne ze 66 na 16). */
    background: linear-gradient(to right,
        rgba(13, 10, 8, 0) 0%,
        rgba(13, 10, 8, .10) 10%,
        rgba(13, 10, 8, .40) 20%,
        rgba(13, 10, 8, .15) 30%,
        rgba(13, 10, 8, 0) 38%,
        rgba(13, 10, 8, 0) 88%,
        rgba(13, 10, 8, .18) 95%,
        rgba(13, 10, 8, .37) 100%);
}
.ec-hero > .ec-container { flex: 1 1 auto; }
/* Změřeno z předlohy: nejširší řádek nadpisu zabírá 47,0 % šířky HERO.
   ⚠️ Procenta se ale počítají z `.ec-container`, ne z hero — a kontejner je
      užší (1600 px proti šířce hero). Při hero 1773 px je poměr 0,903,
      takže 47 % hero = 52 % kontejneru. Bez toho vycházel blok na 41 %. */
/* ⚠️ SVISLÁ LINKA TU UŽ NENÍ — a je to správně.
      V předloze je ta oranžová hrana SOUČÁSTÍ FOTKY (světlo dopadající na
      stěnu), ne prvkem rozhraní. Jako `position: absolute` prvek navíc
      procházela přes číslovaný pás pod sebou a překrývala text.

      Kdo ji bude chtít vrátit: nepatří do CSS, patří do fotky. */

/* Blok musí být dost široký pro číslovaný pás (33,7 % W); nadpis a perex
   se uvnitř omezují samostatně, protože jsou v předloze podstatně užší. */
.ec-hero__body { position: relative; z-index: 2; max-width: min(40%, 46rem); }
/* 🔴 Dvojitá třída kvůli specificitě. `.ec-page h1` níž v souboru má (0,1,1)
      a přebilo by samotné `.ec-hero__title` (0,1,0) — nadpis pak vycházel
      v řezu 800 místo 300 a vypadal proti předloze mnohem těžší.
      Skill `web-css-konvence`: „Když prvek nereaguje na třídu, nehledej
      cache — spočítej specificitu." */
.ec-page .ec-hero__title,
.ec-hero__title {
    /* Mezera pod nadpisem. Původně 12 px (obsah se mačkal nahoru), pak
       24–48 px podle šířky.

       🔴 Zmenšeno na 12–24 px: nadpis se má držet u perexu, ne viset
          samostatně u horní hrany. Ubraných ~23 px se přesunulo do horního
          odsazení hero, takže se celek posunul dolů a výška zůstala. */
    margin: 0 0 clamp(var(--ec-3), 1.1vw, var(--ec-5));
    /* 🔴 Šířka 60 % bloku ≈ 21 % šířky hero — tolik měří nejširší řádek
          nadpisu v předloze („KTERÉ TVOŘÍ“, 333 px z 1584). Díky tomu se
          nadpis láme na TŘI řádky jako v návrhu, aniž by se zlomy psaly
          napevno; text zůstává editovatelný v nastavení.

          ⚠️ Dřív jsem tu měl 47 % — to číslo vzniklo měřením, do jehož
             vodorovného rozsahu spadla svislá linka na 36,7 % a kus fotky.
             Skutečnost je poloviční.

       🔴 Velikost i řádkování jsou ODMĚŘENÉ z předlohy, ne odhadnuté.
          Výška verzálek nadpisu je tam 37 px, tedy font-size ≈ 51 px při
          šířce hero 1584 px — poměr 0,0324 šířky. Účaří jsou po 63 px,
          tedy řádkování 1,23.

          `3vw` ten poměr drží napříč šířkami (na 1920px displeji vyjde 58 px,
          na 1440 pak 43 px).

          ⚠️ Oponentura tvrdila, že je nadpis naopak MENŠÍ než v návrhu —
             odhadovala z výřezů s různým měřítkem. Měření říká opak
             (68 px proti 58 px). Skript: `scratchpad/vyska-nadpisu.php`. */
    max-width: 60%;
    font: 300 clamp(2rem, 3vw, 3.6rem)/1.23 var(--ec-font-display);
    letter-spacing: 0; text-transform: uppercase;
    color: var(--ec-text-strong);
}
/* Zvýrazněné slovo v nadpisu — v předloze je poslední řádek oranžový. */
/* 🔴 Zvýrazněné slovo má barvu `--ec-accent` (#EE7F30), ne `--ec-primary`
      (#DE4400). #EE7F30 je hodnota ODEBRANÁ přímo ze slova „ATMOSFÉRU"
      v předloze (`_plan/oponentura/vzorek-barev.php`); primární barva je
      sytější signální oranžová z tlačítek a v nadpisu působí křiklavě. */
.ec-hero__title em { font-style: normal; font-weight: inherit; color: var(--ec-accent); }
/* ⚠️ Perex je v předloze ŠIRŠÍ než nadpis (52,7 % proti 47,0 % šířky hero),
      ne užší. `max-width` je proto v procentech HERO, ne bloku — proto
      `min()` se stovkami procent rodiče. */
.ec-hero__lead {
    /* Perex měří v předloze 277 px = 17,5 % šířky hero, tedy ~49 % bloku.
       Je UŽŠÍ než nadpis, ne širší — opačně, než jsem měl dřív. */
    max-width: 50%;
    margin: 0 0 var(--ec-5);
    /* Perex ustupuje nadpisu: v předloze má vůči šířce hero 0,85 %,
       moje verze měla 0,90 %. Menší perex vrací nadpisu váhu. */
    font-size: .9375rem; line-height: 1.5;
    color: #E9EAE9;
}
/* 🔴 POD 1366 PX SE PROCENTNÍ STROPY UVOLŇUJÍ. Poměry z předlohy platí pro
      hero kolem 1600 px; na 1280 px vycházel nadpis ve sloupku 260 px (tři
      řádky po 38 px), na 1024 px 210 px a perex na čtyři řádky, zatímco
      vpravo zela prázdná fotka. Tlačítka se pod sebe skládala jen proto,
      že se vedle sebe do 440px bloku nevešla. */
@media (max-width: 1366px) and (min-width: 769px) {
    .ec-hero__body { max-width: min(56%, 46rem); }
    .ec-page .ec-hero__title, .ec-hero__title { max-width: 72%; }
    .ec-page .ec-hero__lead, .ec-hero__lead { max-width: 82%; }
}

/* Svislý popisek u pravého kraje hero — v předloze „SCROLLUJTE DOLŮ".
   🔴 `aria-hidden` na značce: je to čistě vizuální vodítko a čtečka obrazovky
      by ho přečetla jako osamocený příkaz bez souvislosti.

   Změřeno v předloze (20–29 px od pravého okraje):
     text     39 – 65 % výšky hero, světle šedý (#E2E2DD)
     linka    68 – 80 %, ORANŽOVÁ a plná
     kroužek  81 – 83 %, obrys ⌀ 8 px, #CC6B2F
   Dřív tu byl šedý text a linka, která se vytrácela do ztracena — kroužek
   chyběl úplně. */
.ec-hero__scroll {
    position: absolute; right: var(--ec-5); z-index: 1;
    top: 39%; bottom: 17%;
    display: none;                       /* na úzkých displejích není kam */
    flex-direction: column; align-items: center; gap: var(--ec-3);
    color: var(--ec-muted);
    font: 500 .625rem/1 var(--ec-font-body);
    letter-spacing: .22em; text-transform: uppercase;
}
.ec-hero__scroll-text { writing-mode: vertical-rl; }
/* Linka vyplní zbytek výšky, kroužek sedí na jejím konci. */
.ec-hero__scroll-line { flex: 1; width: 1px; background: var(--ec-accent); }
.ec-hero__scroll-dot {
    flex: none; width: 8px; height: 8px;
    border: 1px solid var(--ec-accent); border-radius: var(--ec-r-pill);
}
@media (min-width: 1200px) {
    .ec-hero__scroll { display: flex; }
}

/* Číslovaný pás pod hero. Nejsou to kroky postupu, jen tři sdělení —
   proto `<ul>`, ne `<ol>`, kde by pořadí neslo význam. */
.ec-hero__points {
    position: relative; z-index: 1;
    /* 🔴 JEDNA PRŮBĚŽNÁ LINKA POD CELÝM PÁSEM, ne nad každou položkou.
          V předloze je to ukazatel postupu: první úsek oranžový, zbytek šedý.
          Dřív měla každá položka `border-top` a první z nich oranžový —
          jiná stavba i jiné čtení. */
    display: flex; flex-wrap: nowrap; gap: var(--ec-3);
    /* Pás potřebuje víc místa než nadpis — popisky se nesmí lámat.
       V předloze měří 33,7 % šířky hero, blok jen ~36 %, takže skoro celý. */
    max-width: 100%;
    margin: var(--ec-6) 0 0; padding: 0 0 var(--ec-3); list-style: none;
    background:
        linear-gradient(to right, var(--ec-primary) 0 33.33%, var(--ec-border-strong) 33.33% 100%)
        bottom left / 100% 1px no-repeat;
}
.ec-hero__point {
    display: flex; align-items: baseline; gap: var(--ec-2);
    /* 🔴 `flex: none` + `nowrap`: popisek „Profesionální výsledek" se nesmí
          zalomit na dva řádky, jinak pás naroste do výšky a průběžná linka
          pod ním se odsune od textu. */
    flex: none; white-space: nowrap;
    color: var(--ec-muted); font-size: .75rem;
}
/* Svislá čárka mezi číslem a popiskem — v předloze `01 │ Prémiové materiály`. */
.ec-hero__point .ec-hero__num::after {
    content: "│"; margin-left: var(--ec-2); color: var(--ec-faint);
}
/* Vodorovná pomlčka mezi položkami. */
.ec-hero__point + .ec-hero__point::before {
    content: ""; flex: none; align-self: center;
    width: 28px; height: 1px; margin-right: var(--ec-3);
    background: var(--ec-border-strong);
}
/* Aktivní položka: bílý tučnější popisek, ostatní zůstávají šedé. */
.ec-hero__point:first-child { color: var(--ec-text-strong); font-weight: 600; }
.ec-hero__point:first-child .ec-hero__num { color: var(--ec-text-strong); font-weight: 600; }
.ec-hero__num { font: 600 .75rem/1 var(--ec-font-mono); letter-spacing: .08em; }

/* ── Dlaždice kategorií ───────────────────────────────────
   Obrázek na pozadí, přes něj přechod, dole nadpis a kulaté tlačítko. */
/* ⚠️ `.ec-tiles` a `.ec-usp` jako MŘÍŽKY skončily 4. 9. 2026 — nahradil je
      karusel (§ 11e). Pravidla tu zůstávají pro dlaždice a položky samotné
      (vzhled se nemění), jen se už neskládají do mřížky. */
.ec-tiles {
    display: grid; gap: var(--ec-3);
    /* ⚠️ 205 px je vypočítané, ne odhadnuté: při obsahové šířce ~1120 px
          (kontejner bez levého pruhu) se jich vejde pět v řadě a na název
          zbude ~123 px — „Dekorativní" má v Archivu 15 px asi 88 px, takže
          se nezalomí uprostřed slova.

          Předloha má v řadě šest dlaždic, ale s krátkými názvy („Barvy",
          „Omítky"). Se skutečnými českými názvy je pět čitelnějších než
          šest zlámaných — rozdíl je daný daty, ne nedbalostí. */
    grid-template-columns: repeat(auto-fit, minmax(min(205px, 100%), 1fr));
}
.ec-tile {
    position: relative;
    display: flex; flex-direction: column; justify-content: flex-end;
    /* Nízký široký pás, ne čtverec. Vyšší karta s velkým bílým textem přes
       fotku působí hlučně a v předloze tak nevypadá. */
    min-height: 132px; padding: var(--ec-4);
    border-radius: var(--ec-r-lg);
    overflow: hidden;
    background: var(--ec-surface-2);
    color: var(--ec-text-strong);
}
.ec-tile__img {
    position: absolute; inset: 0; width: 100%; height: 100%;
    object-fit: cover;
    transition: transform var(--ec-t-expand) var(--ec-ease);
}
.ec-tile::after {
    content: ""; position: absolute; inset: 0;
    /* Silnější spodní přechod: reálné produktové fotky jsou světlejší než
       textury v předloze a bílý nadpis se na nich ztrácel. */
    background: linear-gradient(180deg, rgba(15, 12, 10, .06) 30%, rgba(15, 12, 10, .84) 100%);
}
.ec-tile:hover .ec-tile__img { transform: scale(1.05); }
.ec-tile__body { position: relative; z-index: 1; padding-right: calc(var(--ec-tile-go) + var(--ec-2)); }
/* Totéž u dlaždice — je to `<h2>` a `.ec-page h2` by ji přebilo. */
.ec-page .ec-tile__title,
.ec-tile__title {
    margin: 0 0 var(--ec-1);
    font: 400 .9375rem/1.35 var(--ec-font-display);
    letter-spacing: .015em;
    overflow-wrap: break-word;
}
.ec-tile__desc { margin: 0; color: var(--ec-muted); font-size: .8125rem; }
.ec-tile__go {
    position: absolute; right: var(--ec-5); bottom: var(--ec-5); z-index: 1;
    display: grid; place-items: center;
    width: var(--ec-tile-go); height: var(--ec-tile-go);
    background: var(--ec-primary); color: #fff;
    border-radius: var(--ec-r-pill);
    transition: background var(--ec-t-hover) var(--ec-ease);
}
.ec-tile:hover .ec-tile__go { background: var(--ec-primary-hover); }
.ec-tile__go svg { display: block; width: 16px; height: 16px; }

/* ── Pás výhod ────────────────────────────────────────────
   V předloze je oddělený svislými linkami. `border-left` na první položce
   by udělal linku i na kraji, proto až od druhé. */
.ec-usp {
    display: grid; gap: 0;
    grid-template-columns: repeat(auto-fit, minmax(min(220px, 100%), 1fr));
    background: var(--ec-surface);
    border: 1px solid var(--ec-border);
    border-radius: var(--ec-r-lg);
}
.ec-usp__item {
    /* 🔴 `center`, ne `flex-start`. Ikona má stát na střed dvouřádkového
          textu, ne u jeho horní hrany — v předloze je vystředěná. */
    position: relative;
    display: flex; align-items: center; gap: var(--ec-3);
    padding: var(--ec-5);
}
/* 🔴 PŘEPÁŽKA NEJDE OD KRAJE KE KRAJI — je to 70 % výšky, svisle na střed.
      Dřív to byl `border-left`, který ze zaobleného panelu dělal mřížku.
      Proto pseudoprvek: `border` výšku omezit neumí.

      ⚠️ Předloha je v tomhle nejednoznačná — naměřená výška přepážek kolísá
         mezi 19 a 86 % podle toho, který sloupec detektor chytí (u dvou
         z pěti padl na tah písmene). 70 % je hodnota od zadavatele, ne
         z měření, a je to tak schválně. */
.ec-usp__item + .ec-usp__item::before {
    content: ""; position: absolute; left: 0; top: 15%;
    width: 1px; height: 70%;
    background: var(--ec-border);
}
.ec-usp__icon { flex: none; color: var(--ec-primary); }
/* V předloze má každá položka VLASTNÍ ikonu (auto, sluchátka, lidé, štít,
   paleta, kalkulačka) — ne šestkrát tutéž fajfku. Ikona se ukládá
   u položky v nastavení, stejně jako u kategorií v levém pruhu. */
.ec-usp__icon svg { display: block; width: 26px; height: 26px; }
/* Text je vlastní blok, aby se dal svisle vystředit proti ikoně. */
.ec-usp__text { min-width: 0; }
.ec-usp__title {
    display: block; font-weight: 600; color: var(--ec-text-strong);
    font-size: .875rem; line-height: 1.35;
}
/* 🔴 POPISEK MÁ VŽDY MÍSTO NA DVA ŘÁDKY, i když je jednořádkový.
      Bez toho měla položka s delším textem („Doporučíme ověřené řemeslníky“)
      o řádek víc, položky se lišily výškou a nadpisy se rozjely.

      Rezervuje se `min-height`, ořezává `line-clamp`. Obojí je nutné:
      `min-height` srovná krátké texty, `line-clamp` uřízne dlouhé. Texty
      píše správce v administraci, takže se na jejich délku nedá spolehnout. */
.ec-usp__desc {
    display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
    overflow: hidden;
    min-height: calc(2 * 1.45em);
    color: var(--ec-muted); font-size: .8125rem; line-height: 1.45;
}

/* ── Záhlaví sekce ────────────────────────────────────────
   Nadpis vlevo, odkaz na výpis vpravo, oba na stejné účaří. */
.ec-section-head {
    display: flex; align-items: baseline; justify-content: space-between;
    gap: var(--ec-4); flex-wrap: wrap;
    margin-bottom: var(--ec-6);
}
/* Nadpis sekce má v předloze pod sebou vlevo krátkou oranžovou linku. */
.ec-page .ec-section-head h2,
.ec-section-head h2 {
    position: relative;
    margin: 0;
    padding-bottom: var(--ec-3);
    font: 500 clamp(1.25rem, 2.4vw, 1.75rem)/1.2 var(--ec-font-display);
    letter-spacing: .06em; text-transform: uppercase;
    color: var(--ec-text-strong);
}
.ec-section-head h2::after {
    content: ""; position: absolute; left: 0; bottom: 0;
    width: 56px; height: 2px;
    background: var(--ec-primary);
}
.ec-section-head a {
    color: var(--ec-primary);
    font: 500 .6875rem/1 var(--ec-font-body);
    letter-spacing: .09em; text-transform: uppercase;
}
.ec-section-head a:hover { color: var(--ec-accent); }
/* Pravá strana hlavičky sekce — odkaz „Zobrazit vše" plus případné šipky
   karuselu. Bez tohohle obalu by je `justify-content: space-between` rozhodilo
   po řádku: tři položky místo dvou znamenají jednu uprostřed. */
.ec-section-head__tools { display: flex; align-items: center; gap: var(--ec-4); }

/* ── Řada tlačítek ────────────────────────────────────────
   Nahrazuje inline `style="display:flex…"` z úvodní stránky. */
.ec-btn-row { display: flex; flex-wrap: wrap; align-items: center; gap: var(--ec-5); }

/* =========================================================
   5. KOMPONENTY
   ========================================================= */

/* ── Tlačítka ─────────────────────────────────────────────
   Výška je token. Bez toho má stejná třída pokaždé jiný rozměr
   a řádky vypadají křivě. */
.ec-btn {
    display: inline-flex; align-items: center; justify-content: center; gap: var(--ec-2);
    height: var(--ec-btn-h); padding-inline: var(--ec-5);
    border: 1px solid transparent; border-radius: var(--ec-r-sm);
    font: 600 .875rem/1 var(--ec-font-body); letter-spacing: .02em;
    text-transform: uppercase; cursor: pointer;
    transition: background var(--ec-t-hover) var(--ec-ease),
                border-color var(--ec-t-hover) var(--ec-ease),
                color var(--ec-t-hover) var(--ec-ease),
                transform var(--ec-t-hover) var(--ec-ease);
}
.ec-btn svg { display: block; width: 16px; height: 16px; flex: 0 0 auto; }
.ec-btn--primary { background: var(--ec-primary); color: #fff; }
.ec-btn--primary:hover { background: var(--ec-primary-hover); color: #fff; transform: translateY(-1px); }
.ec-btn--primary:active { background: var(--ec-primary-active); transform: none; }
/* 🔴 Sekundární tlačítko má v předloze ORANŽOVÝ rámeček i šipku, ne šedý.
      Ověřeno výřezem z návrhu (`scratchpad/vyrez-tlacitka.php`): text bílý,
      obrys i šipka v barvě značky. Šedý obrys dělal z dvojice tlačítek
      „hlavní a vedlejší", zatímco návrh je staví jako rovnocenný pár. */
.ec-btn--outline { background: transparent; color: var(--ec-text-strong); border-color: var(--ec-primary); }
.ec-btn--outline svg { color: var(--ec-primary); }
.ec-btn--outline:hover { background: var(--ec-primary-soft); border-color: var(--ec-primary-hover); }
.ec-btn--ghost { background: transparent; color: var(--ec-muted); }
.ec-btn--ghost:hover { color: var(--ec-text); background: var(--ec-surface-2); }
.ec-btn--sm { height: var(--ec-ctl-h-sm); padding-inline: var(--ec-3); font-size: .8125rem; }
/* Čtvercové tlačítko jen s ikonou — výška je táž jako u polí, takže řádek
   s polem a tlačítkem drží jednu linku. */
.ec-btn--icon { width: var(--ec-ctl-h); padding-inline: 0; }
.ec-btn--icon svg { display: block; width: 18px; height: 18px; }
.ec-btn--danger { color: var(--ec-muted); }
.ec-btn--danger:hover { color: #FF8085; background: var(--ec-danger-soft); }
.ec-btn--block { width: 100%; }
.ec-btn[disabled], .ec-btn.is-disabled {
    background: var(--ec-surface-2); color: var(--ec-faint);
    border-color: var(--ec-border); cursor: not-allowed; transform: none;
}

/* ── Karta ────────────────────────────────────────────── */
.ec-card {
    background: var(--ec-surface);
    border: 1px solid var(--ec-border);
    border-radius: var(--ec-r-lg);
    padding: var(--ec-5);
}
.ec-card > :first-child { margin-top: 0; }
.ec-card > :last-child  { margin-bottom: 0; }

/* ── Upozornění ───────────────────────────────────────── */
.ec-note {
    margin: 0 0 var(--ec-5);
    padding: var(--ec-4) var(--ec-5);
    border-left: 3px solid var(--ec-info);
    background: var(--ec-info-soft);
    border-radius: var(--ec-r-md);
}
.ec-note > :first-child { margin-top: 0; }
.ec-note > :last-child  { margin-bottom: 0; }
.ec-note--warning { border-left-color: var(--ec-warning); background: var(--ec-warning-soft); }
.ec-note--danger  { border-left-color: var(--ec-danger);  background: var(--ec-danger-soft); }
.ec-note--success { border-left-color: var(--ec-success); background: var(--ec-success-soft); }

/* ── Štítek ───────────────────────────────────────────── */
.ec-badge {
    display: inline-flex; align-items: center; gap: var(--ec-2);
    height: 22px; padding-inline: var(--ec-2);
    background: var(--ec-surface-3); color: var(--ec-muted);
    border: 1px solid var(--ec-border); border-radius: var(--ec-r-pill);
    font: 600 .6875rem/1 var(--ec-font-body); letter-spacing: .08em;
    text-transform: uppercase; white-space: nowrap;
}
.ec-badge--success { background: var(--ec-success-soft); color: #7BCB8A; border-color: rgba(70,167,88,.35); }
.ec-badge--warning { background: var(--ec-warning-soft); color: #F5BE5C; border-color: rgba(240,160,32,.35); }
.ec-badge--danger  { background: var(--ec-danger-soft);  color: #FF8085; border-color: rgba(229,72,77,.35); }

/* ── Formulářová pole ─────────────────────────────────── */
.ec-field { display: block; margin-bottom: var(--ec-4); }
.ec-label {
    display: block; margin-bottom: var(--ec-2);
    font: 600 .6875rem/1.2 var(--ec-font-body); letter-spacing: .09em;
    text-transform: uppercase; color: var(--ec-muted);
}
/* 🔴 VÝŠKA POLE JE PEVNÁ, NE MINIMÁLNÍ. Dřív tu bylo `min-height` plus
      `padding: 12px` — a padding vyhrál: pole se vykreslovalo 48 px, ačkoli
      token říkal 40. „Sjednocená výška" tedy platila jen na papíře a tlačítko
      vedle pole bylo pořád o osm pixelů nižší.

      Jednořádková pole proto mají `height` a nulové svislé odsazení; text
      se v nich vystředí sám. `textarea` je výjimka — ta výšku určuje obsahem. */
.ec-input, .ec-select {
    height: var(--ec-ctl-h);
    padding-block: 0;
}
.ec-textarea { min-height: calc(var(--ec-ctl-h) * 2); padding-block: 12px; }
.ec-input, .ec-select, .ec-textarea {
    width: 100%;
    padding-inline: var(--ec-3);
    background: var(--ec-bg);
    border: 1px solid var(--ec-border-strong);
    border-radius: var(--ec-r-md);
    color: var(--ec-text);
    /* 🔴 16 px povinně — iOS jinak při kliknutí do pole zoomuje stránku. */
    font: 400 16px/1.4 var(--ec-font-body);
    transition: border-color var(--ec-t-hover) var(--ec-ease),
                box-shadow var(--ec-t-hover) var(--ec-ease);
}
.ec-input::placeholder { color: var(--ec-faint); }
.ec-input:focus, .ec-select:focus, .ec-textarea:focus {
    outline: none; border-color: var(--ec-accent);
    box-shadow: 0 0 0 3px var(--ec-accent-soft);
}
.ec-input.is-error { border-color: var(--ec-danger); }
.ec-hint { margin-top: var(--ec-2); font-size: .8125rem; color: var(--ec-faint); }
/* Chyba se hlásí VŽDY textem, ne jen barvou rámečku. */
.ec-hint--error { color: #FF8085; }

/* 🔴 ZAŠKRTÁVÁTKA A PŘEPÍNAČE V BARVĚ ZNAČKY A VE STEJNÉ VELIKOSTI. Nativní
      13px světle modré políčko v pokladně vedle 18px oranžového na kartě
      produktu — dvě podoby téhož prvku a na telefonu malý cíl.
      `.ec-check input` níž (stejná specificita, pozdější pořadí) si drží
      vlastní odsazení. */
input[type="checkbox"], input[type="radio"] {
    flex: none; width: 18px; height: 18px; margin: 0;
    accent-color: var(--ec-primary);
}
/* Pole se zaškrtávátkem a textem v jednom `<label class="ec-field">`:
   políčko a text na společné ose. */
.ec-field:has(> input[type="checkbox"]) { display: flex; align-items: center; gap: var(--ec-3); cursor: pointer; }

/* 🔴 JEDNA MEZERA MEZI POLI. Pole v mřížce měla `margin-bottom` 16 px
      A ZÁROVEŇ `gap` mřížky 24 px — 40 px mezi Městem a PSČ, 16 px mezi
      Ulicí a Městem. V mřížce se okraj pole nuluje, mezeru dělá `gap`
      o stejných 16 px a mřížka sama nese spodní okraj jako pole.
      Pole ve dvou a třech sloupcích mají pevný počet sloupců — s `auto-fit`
      a minimem 320 px spadla v pokladně na desktopu (sloupec 650 px) pod
      sebe, zatímco na tabletu stála vedle sebe. */
.ec-grid > .ec-field { margin-bottom: 0; }
.ec-grid:has(> .ec-field) { gap: var(--ec-4); margin-bottom: var(--ec-4); }
.ec-grid--2:has(> .ec-field) { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.ec-grid--3:has(> .ec-field) { grid-template-columns: repeat(3, minmax(0, 1fr)); }
@media (max-width: 560px) {
    .ec-grid--2:has(> .ec-field),
    .ec-grid--3:has(> .ec-field) { grid-template-columns: minmax(0, 1fr); }
}
/* Nadpis skupiny polí („Fakturační adresa") — dřív měl styl popisku pole
   a vypadal jako zdvojený popisek nad „Ulice a číslo popisné". */
h3.ec-label {
    margin: var(--ec-6) 0 var(--ec-3);
    font: 600 .9375rem/1.3 var(--ec-font-body); letter-spacing: 0;
    text-transform: none; color: var(--ec-text-strong);
}
.ec-fieldset-plain { min-width: 0; margin: 0; padding: 0; border: 0; }

/* ── Tabulka ──────────────────────────────────────────── */
.ec-tablewrap { overflow-x: auto; border: 1px solid var(--ec-border); border-radius: var(--ec-r-lg); }
/* Tabulka v kartě nemá druhý rámeček — dvojí obal posouval obsah 41 px od kraje. */
.ec-card > .ec-tablewrap { border: 0; border-radius: 0; }
/* 🔴 TABULKA JAKO KARTY NA TELEFONU. Pět sloupců na 390 px schovalo částku
      a tlačítko Detail za vodorovný posun, o kterém nic nevědělo. Řádek je
      pod 600 px mřížka: číslo + stav, datum + částka, tlačítko přes šířku. */
@media (max-width: 600px) {
    .ec-table--karty thead { display: none; }
    .ec-table--karty tr {
        display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: var(--ec-2) var(--ec-3);
        padding: var(--ec-4) 0; border-bottom: 1px solid var(--ec-border);
    }
    .ec-table--karty tr:last-child { border-bottom: 0; }
    .ec-table.ec-table--karty td { padding: 0; border: 0; align-self: center; }
    .ec-table--karty td:nth-child(2) { white-space: nowrap; color: var(--ec-muted); }
    .ec-table--karty td:nth-child(3) { grid-column: 2; grid-row: 1; text-align: right; }
    .ec-table--karty td:nth-child(4) { grid-column: 2; grid-row: 2; }
    .ec-table--karty td:nth-child(5) { grid-column: 1 / -1; text-align: left; }
    .ec-table--karty td:nth-child(5) .ec-btn { width: 100%; }
    /* Položky objednávky: název přes šířku, varianta pod ním, cena vpravo.
       Ve třech sloupcích na 310 px se název i varianta lámaly na tři řádky. */
    .ec-table--polozky thead { display: none; }
    .ec-table--polozky tr {
        display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: var(--ec-1) var(--ec-4);
        padding: var(--ec-3) 0; border-bottom: 1px solid var(--ec-border);
    }
    .ec-table.ec-table--polozky td { padding: 0; border: 0; }
    .ec-table--polozky td:nth-child(2) { grid-column: 1; grid-row: 2; font-size: .8125rem; }
    .ec-table--polozky td:nth-child(3) { grid-column: 2; grid-row: 1 / span 2; align-self: center; white-space: nowrap; }
}
.ec-table { width: 100%; border-collapse: collapse; font-size: .875rem; }
.ec-table th {
    padding: var(--ec-3) var(--ec-4);
    background: var(--ec-surface-3); color: var(--ec-text-strong);
    font: 600 .6875rem/1.2 var(--ec-font-body); letter-spacing: .08em;
    text-transform: uppercase; text-align: left; white-space: nowrap;
    border-bottom: 1px solid var(--ec-border);
}
.ec-table td { padding: var(--ec-3) var(--ec-4); border-bottom: 1px solid var(--ec-border); vertical-align: top; }
.ec-table tbody tr:last-child td { border-bottom: 0; }
.ec-table .ec-right { text-align: right; }

/* ── Drobečky ─────────────────────────────────────────── */
.ec-crumbs { display: flex; flex-wrap: wrap; gap: var(--ec-2); margin-bottom: var(--ec-5); font-size: .8125rem; color: var(--ec-faint); }
.ec-crumbs a { color: var(--ec-muted); }
.ec-crumbs a:hover { color: var(--ec-accent); }

/* =========================================================
   6. KATALOG
   ========================================================= */
.ec-product-card {
    /* 🔴 `relative` je nosné, ne kosmetika. Roztažený odkaz i tah štětcem jsou
          `position: absolute` a bez pozicovaného rodiče se vztáhnou k prvnímu
          pozicovanému předkovi výš — u mřížky karet je to celá stránka.
          Projeví se to tím, že štětec je vyšší než karta (naměřeno 419 px
          proti 389) a klik na fotku nikam nevede. */
    position: relative;
    /* 🔴 `isolation` udělá z karty vlastní vrstvící kontext. Díky tomu smí mít
          štětec záporný `z-index` a malovat NAD pozadím karty, ale POD textem —
          přesně v tom pořadí, v jakém prohlížeč vykresluje: pozadí prvku →
          potomci se záporným z-indexem → obsah. Bez izolace by štětec propadl
          za pozadí karty a nebyl vidět vůbec. */
    isolation: isolate;
    display: flex; flex-direction: column;
    background: var(--ec-surface);
    border: 1px solid var(--ec-border);
    border-radius: var(--ec-r-lg);
    overflow: hidden;
    transition: border-color var(--ec-t-hover) var(--ec-ease),
                background var(--ec-t-hover) var(--ec-ease);
}
.ec-product-card:hover { border-color: var(--ec-primary); }

/* ── Celá karta je odkaz ──────────────────────────────────
   🔴 „ROZTAŽENÝ ODKAZ": jeden `<a>` na nadpisu, jehož `::after` pokryje celou
      kartu. Obalit kartu do `<a>` nejde — uvnitř je další odkaz (tlačítko
      detailu) a vnořený odkaz je neplatné HTML, které prohlížeč tiše rozhodí.

   ⚠️ Text uvnitř karty musí zůstat označitelný, proto `::after` a ne
      průhledná vrstva s `pointer-events`. Označení textu překryv nezruší. */
.ec-product-card__link::after {
    content: ""; position: absolute; inset: 0; z-index: 2;
}
/* Tlačítko musí zůstat nad překryvem, jinak by na něj klik nedosáhl. */
.ec-product-card__foot .ec-btn { position: relative; z-index: 3; }
.ec-product-card__media { display: block; }

/* ── Tah štětcem po najetí ────────────────────────────────
   🔴 JE TO JEDNA ČÁRA, NE OBRÁZEK. Klikatá cesta obtažená tlustým perem se
      zakulacenými konci; odkrývá se `stroke-dashoffset`em, takže to vypadá,
      jako by ji někdo maloval tam a zpátky. Čtyři průchody přes patu karty
      ji při šířce pera 11 postupně zaplní.

   ⚠️ Leží POD textem (`z-index: 0` proti obsahu), aby se přes něj malovalo,
      ne přes písmena. A `pointer-events: none`, jinak by kradla kliky. */
.ec-product-card__brush {
    position: absolute; left: 0; bottom: 0;
    /* ⚠️ `width` MUSÍ být explicitní. `<svg>` s `viewBox` je nahraditelný prvek
          a při `width: auto` si šířku dopočítá z poměru stran — 178 px výšky
          při viewBoxu 100×40 dalo 445 px, tedy o 141 px víc, než je karta
          široká. Roztažení přes `left: 0; right: 0` se u nahraditelného prvku
          neuplatní. */
    width: 100%;
    height: 46%;
    /* Pod textem, nad pozadím karty — viz `isolation` výš. */
    z-index: -1;
    pointer-events: none;
    opacity: 0;
    /* Krátké náběhy krytí, ať tah nezačne „zjevením" celé plochy. */
    transition: opacity 220ms linear;
}
.ec-product-card__brush path {
    fill: none;
    stroke: var(--ec-primary-deep, #7A2E00);
    /* 🔴 TENKÉ PERO A VÍC PRŮCHODŮ. Při šířce 10 stačily plochu pokrýt
          čtyři tahy a bylo z toho spíš podbarvení než malba. Tenké pero jich
          potřebuje sedmnáct, takže se štětec po kartě prožene mnohem víckrát
          a pohyb působí svižněji, i když je celková doba kratší.

          Šířka je v jednotkách viewBoxu; při `slice` se škáluje v obou osách
          stejně (~3,8×), takže 6 dělá na obrazovce zhruba 23 px a stopa je
          skutečně kulatá, ne oválná jako při roztaženém viewBoxu.

       ⚠️ Rozestup tahů KOLÍSÁ kolem 11 jednotek po ose (~7,8 kolmo), takže
          se mezery mezi tahy různě zužují a rozšiřují — o to jde. Pero 6 při
          nejužším místě tahy skoro slepí a v nejširším nechá zřetelnou šmouhu,
          což je přesně ten nepravidelný ruční dojem. Změna šířky pera se musí
          vždycky zvážit proti rozestupu: široké pero nad ~8 slije všechno do
          plné plochy, úzké pod ~3 udělá z malby rastr. Rozestup se mění
          v `_plan/tools/stetec-cesta.php` a cesta se vygeneruje znovu. */
    stroke-width: 6;
    stroke-linecap: round;
    stroke-linejoin: round;
    /* 🔴 DÉLKA V UŽIVATELSKÝCH JEDNOTKÁCH, ne v „jedné délce cesty".
          `stroke-dasharray: 1` spolu s `pathLength="1"` vypadá jako elegantní
          trik, jenže CSS tu hodnotu bere jako **1 jednotku**, ne jako celou
          délku — z tahu se staly jednotkové čárky, které se při šířce pera 12
          a zakulacených koncích slily do plné plochy. Efekt pak vypadal
          stejně ve všech fázích, protože nikdy nic skryté nebylo.

          ⚠️ A hlavně: z `<path>` musí zmizet `pathLength="1"`. Ten totiž
             přeškáluje délku pro výpočet čárkování na 1, takže `440` znamená
             440 CELÝCH délek cesty — vzor se nikdy nedostane do mezery
             a tah je vždycky celý, ve všech fázích stejně.

          ⚠️ Čárka musí být DELŠÍ než cesta, ne kratší. Jinak posledních pár
             jednotek zůstane nedokreslených a tah nikdy nedojede do konce —
             stalo se to dvakrát, protože délka cesty se změní pokaždé, když
             se upraví tvar tahu (464 → 529). Hodnota je proto s rezervou:
             600 pokryje i výrazně delší cestu.

             Kdo tvar tahu změní, ať si délku ověří: v konzoli
             `document.querySelector('.ec-product-card__brush path').getTotalLength()`. Je to délka ve viewBoxu, ne na obrazovce,
          takže nezávisí na velikosti karty a nemusí se přepočítávat. */
    /* 🔴 MUSÍ SEDĚT NA DÉLKU CESTY — ta je 1 991 jednotek viewBoxu.
          Kratší hodnota nechá tah nedokreslený, o hodně delší udělá na konci
          prodlevu, kdy se zdánlivě nic neděje. 2 388 = délka a dvě procenta
          rezervy. Po každé úpravě cesty přepočítat, délka se mění výrazně:
          464 → 529 → 922 → 2 298 → 1 991 napříč verzemi.

       ⚠️ Prohlížeč měří délku o pár procent jinak než generátor (1 926 proti
          1 991) — jinak dělí křivku na úseky. Bere se ta VĚTŠÍ z obou hodnot:
          menší by tah nechala nedokreslený, větší jen o kousek zkrátí
          poslední zlomek vteřiny. */
    stroke-dasharray: 1991;
    stroke-dashoffset: 1991;
    /* 🔴 ROVNOMĚRNĚ, BEZ NÁBĚHU. Jedna vteřina se zrychlením `--ec-ease`
          znamenala, že se dvě třetiny tahu nakreslily během prvních 300 ms —
          pohyb nebyl vidět, jen probliknutí. `linear` drží stálou rychlost,
          takže je vidět, jak štětec jede.

          Dvě vteřiny: se sedmi tahy místo čtyř je na kartě pořád co sledovat
          a tři vteřiny už byly na najetí myší dlouhé. */
    transition: stroke-dashoffset 2s linear;
}
.ec-product-card:hover .ec-product-card__brush,
.ec-product-card:focus-within .ec-product-card__brush { opacity: 1; }
.ec-product-card:hover .ec-product-card__brush path,
.ec-product-card:focus-within .ec-product-card__brush path { stroke-dashoffset: 0; }

/* ⚠️ `.ec-product-card__body` NESMÍ být pozicovaná. Roztažený odkaz je uvnitř
      ní a `inset: 0` se vztahuje k nejbližšímu pozicovanému předkovi — kdyby
      jím byla pata karty, proklikla by se jen ona a klik na fotku by nikam
      nevedl. Naměřeno: klik na fotku vracel `IMG`, ne odkaz.

      Nad malbu se obsah dostane sám, protože štětec má záporný z-index. */

/* ⚠️ Kdo si pohyb nepřeje, dostane prosté podbarvení — ne škubající se čáru.
      Efekt má potěšit, ne obtěžovat toho, komu z animací není dobře. */
@media (prefers-reduced-motion: reduce) {
    .ec-product-card__brush path { transition: none; stroke-dashoffset: 0; }
    .ec-product-card__brush { transition: opacity 200ms linear; }
}

/* Pevný poměr stran — bez toho se obrázek na jiném rozlišení ořízne jinak
   než v návrhu a karty přestanou být stejně vysoké. */
.ec-product-card__img {
    aspect-ratio: 4 / 3; width: 100%;
    object-fit: cover; object-position: center;
    background: var(--ec-surface-2);
}

/* ── Mřížka karet a rozcestník podkategorií ───────────────── */
/* 🔴 `auto-fill`, NE `auto-fit`. `auto-fit` slévá prázdné sloupce, takže
      jediná karta v posledním řádku se roztáhne přes celou šířku výpisu —
      a od chvíle, kdy jsou řady vlastní kategorií, tenhle případ nastává
      běžně: „Dekorativní omítky" mají pod dlaždicemi jediný produkt, který
      do žádné řady nepatří, a ten vypadal jako široký banner.
      `auto-fill` prázdné sloupce nechá být a karta si drží šířku ostatních.
      Týž problém a totéž řešení je u `.ec-grid--courses`. */
/* ⚠️ 240, ne 260. Při 1280 px s běžným posuvníkem Windows (15 px) zbyde na
      výpis 821 px a 3 × 260 + mezery se nevešly — mřížka spadla na dva
      obří sloupce, přestože snímek bez posuvníku ukazoval tři. */
.ec-grid--vyplnit { grid-template-columns: repeat(auto-fill, minmax(min(240px, 100%), 1fr)); }

/* ── Popis kategorie nad výpisem ──────────────────────────
   Text pod nadpisem kategorie. Užší než plná šířka výpisu — dlouhý
   řádek se špatně čte; `65ch` je běžná míra pro souvislý text.
   ⚠️ `ch` je u téhle písmové sady nepoužitelná (viz § 7n), proto `em`. */
.ec-cat-popis { max-width: 44em; margin-bottom: var(--ec-5); }
.ec-cat-popis p { font-size: .9375rem; color: var(--ec-muted); }

/* ── Rozcestník podkategorií ──────────────────────────────
   🔴 ŘÁDEK ODKAZŮ, NE MŘÍŽKA DLAŽDIC. Klasický e-shop dá nahoru kategorie
      a hned pod ně produkty. Dlaždice s fotkami (10.–11. 9. 2026) odsunuly
      výpis pod ohyb a zadavatel je odmítl: „takhle oni vlastně dekorativní
      omítky nevidí, oni se musí proklikat přes další kategorie."

   ⚠️ `flex-wrap` a žádný `min-width` — pod „Dekorativními omítkami" je
      sedmnáct kategorií a na mobilu se musí zalomit, ne přetéct. */
.ec-subcats {
    display: flex; flex-wrap: wrap; gap: var(--ec-2);
    margin-bottom: var(--ec-5);
}
/* 🔴 NA MOBILU JEDEN POSOUVATELNÝ ŘÁDEK. Zalomených 16 štítků zabralo
      7 řádků (269 px) a první produkt začínal až pod ohybem (y 760 z 844).
      Přechod na pravém kraji ukazuje, že řádek pokračuje — stejně jako pás
      kategorií pod hlavičkou. */
@media (max-width: 767px) {
    .ec-subcats {
        flex-wrap: nowrap; overflow-x: auto;
        margin-inline: calc(var(--ec-gutter) * -1); padding-inline: var(--ec-gutter);
        scrollbar-width: none;
        mask-image: linear-gradient(to right, #000 calc(100% - 40px), transparent);
        -webkit-mask-image: linear-gradient(to right, #000 calc(100% - 40px), transparent);
    }
    .ec-subcats::-webkit-scrollbar { display: none; }
    .ec-subcats > .ec-subcat { flex: none; white-space: nowrap; }
}
.ec-subcat {
    /* Jméno a počet na společné účaří — `inline-flex` + `align-items:center`
       (`web-ikony-zarovnani`), ne dorovnávání konstantou. */
    display: inline-flex; align-items: center; gap: var(--ec-2);
    min-height: 40px;
    padding: var(--ec-2) var(--ec-4);
    border: 1px solid var(--ec-border);
    border-radius: 999px;
    background: var(--ec-surface);
    color: var(--ec-text);
    font-size: .8125rem; line-height: 1.2;
    text-decoration: none;
    transition: border-color var(--ec-t-hover) var(--ec-ease),
                background var(--ec-t-hover) var(--ec-ease),
                color var(--ec-t-hover) var(--ec-ease);
}
.ec-subcat:hover,
.ec-subcat:focus-visible {
    border-color: var(--ec-primary);
    background: var(--ec-surface-3);
    color: var(--ec-text-strong);
}
/* Počet je doplněk — nesmí přetahovat pozornost od názvu. */
.ec-subcat__pocet {
    color: var(--ec-faint);
    font-variant-numeric: tabular-nums;
    font-size: .75rem;
}
.ec-subcat:hover .ec-subcat__pocet { color: var(--ec-muted); }
/* ── Mřížka formuláře ─────────────────────────────────────
   Dva sloupce, ale POLE ZAROVNANÁ NAHORU. `ec-grid--2` je obecná mřížka
   a při různě vysokých sloupcích (jeden s nápovědou, druhý bez) se popisky
   rozjely. */
.ec-form-grid {
    display: grid; gap: var(--ec-4);
    grid-template-columns: repeat(auto-fit, minmax(min(220px, 100%), 1fr));
    align-items: start;
}

/* ── Zaškrtávátko s vysvětlivkou ──────────────────────────
   Popisek je dvouřádkový (název + vysvětlení), takže se políčko zarovnává
   k prvnímu řádku, ne na střed bloku. */
.ec-check {
    display: flex; align-items: flex-start; gap: var(--ec-3);
    margin: var(--ec-4) 0;
    cursor: pointer;
}
.ec-check input { flex: none; width: 18px; height: 18px; margin-top: 2px; accent-color: var(--ec-primary); }
.ec-check__text { display: block; min-width: 0; }
.ec-check__title { display: block; font-weight: 600; color: var(--ec-text-strong); font-size: .875rem; }
.ec-check__help { display: block; margin-top: var(--ec-2); color: var(--ec-muted); font-size: .8125rem; line-height: 1.45; }

/* ── Karta výběru povrchu ─────────────────────────────────
   🔴 `<select>` mizí AŽ ve chvíli, kdy skript kartu postaví (`is-enhanced`).
      V CSS napevno by se schoval i tomu, komu se skript nenačte, a povinné
      pole formuláře by nešlo vyplnit vůbec. */
#ec-matpicker.is-enhanced > select {
    position: absolute; width: 1px; height: 1px;
    margin: -1px; padding: 0; border: 0;
    clip: rect(0 0 0 0); clip-path: inset(50%); overflow: hidden;
}
.ec-matpicker__trigger {
    display: flex; align-items: center; gap: var(--ec-3);
    width: 100%; min-height: 64px; padding: var(--ec-2) var(--ec-3);
    /* `<button>` nedědí písmo — bez toho měl 13,33 px vedle polí s 16 px. */
    font: inherit;
    background: var(--ec-bg);
    border: 1px solid var(--ec-border-strong); border-radius: var(--ec-r-md);
    color: var(--ec-text); text-align: left; cursor: pointer;
    transition: border-color var(--ec-t-hover) var(--ec-ease);
}
.ec-matpicker__trigger:hover { border-color: var(--ec-primary); }
.ec-matpicker__placeholder { color: var(--ec-faint); }
.ec-matpicker__thumb {
    flex: none; width: 48px; height: 48px; border-radius: var(--ec-r-sm);
    object-fit: cover; background: var(--ec-surface-2);
}
.ec-matpicker__label { flex: 1 1 auto; min-width: 0; }
.ec-matpicker__name {
    display: block; font-weight: 600; color: var(--ec-text-strong); font-size: .875rem;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.ec-matpicker__cat { display: block; color: var(--ec-muted); font-size: .75rem; }
.ec-matpicker__action { flex: none; color: var(--ec-primary); font-size: .8125rem; font-weight: 600; }

.ec-matpicker__panel {
    margin-top: var(--ec-2);
    background: var(--ec-surface);
    border: 1px solid var(--ec-border-strong); border-radius: var(--ec-r-lg);
    padding: var(--ec-4);
    box-shadow: var(--ec-shadow);
}
.ec-matpicker__head { display: flex; gap: var(--ec-2); align-items: center; }
.ec-matpicker__search { flex: 1 1 auto; }
.ec-matpicker__count { margin: var(--ec-2) 0 var(--ec-3); }
/* Mřížka karet se posouvá uvnitř panelu, ne stránkou — jinak by výběr
   povrchu odscrolloval zbytek formuláře pryč. */
.ec-matpicker__grid {
    display: grid; gap: var(--ec-2);
    grid-template-columns: repeat(auto-fill, minmax(min(240px, 100%), 1fr));
    max-height: 46vh; overflow-y: auto;
    scrollbar-width: thin; scrollbar-color: var(--ec-primary) transparent;
}
.ec-matcard {
    display: flex; gap: var(--ec-3); align-items: flex-start;
    padding: var(--ec-2);
    background: var(--ec-bg);
    border: 1px solid var(--ec-border); border-radius: var(--ec-r-md);
    color: var(--ec-text); text-align: left; cursor: pointer;
    transition: border-color var(--ec-t-hover) var(--ec-ease),
                background var(--ec-t-hover) var(--ec-ease);
}
.ec-matcard:hover { border-color: var(--ec-primary); background: var(--ec-surface-2); }
.ec-matcard.is-selected { border-color: var(--ec-primary); background: var(--ec-primary-soft); }
.ec-matcard__img {
    flex: none; width: 56px; height: 56px; border-radius: var(--ec-r-sm);
    object-fit: cover; background: var(--ec-surface-2);
}
.ec-matcard__body { min-width: 0; }
.ec-matcard__cat { display: block; color: var(--ec-accent); font-size: .6875rem; text-transform: uppercase; letter-spacing: .06em; }
.ec-matcard__name { display: block; font-weight: 600; color: var(--ec-text-strong); font-size: .8125rem; line-height: 1.3; }
.ec-matcard__desc {
    display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
    overflow: hidden;
    margin-top: 2px; color: var(--ec-muted); font-size: .75rem; line-height: 1.4;
}
.ec-matcard__pal { display: inline-block; margin-top: var(--ec-1); color: var(--ec-faint); font-size: .6875rem; }

/* ── Výběr odstínu ────────────────────────────────────────
   🔴 Vzorky jsou FOTKY, ne barevné čtverce. Sloupec `hex` je prázdný
      u všech 2 264 odstínů — barva by vyšla černá. */
.ec-shadepicker__palettes { display: flex; flex-wrap: wrap; gap: var(--ec-2); margin-bottom: var(--ec-3); }
/* Vybraný odstín má vlastní řádek NAD vzorky — přežije zavření palety
   i přepnutí na jinou. */
.ec-shadepicker__stav { margin: 0 0 var(--ec-3); }
.ec-shadepicker__chosen { color: var(--ec-text-strong); }
.ec-palchip {
    display: inline-flex; align-items: center; gap: var(--ec-2);
    height: var(--ec-ctl-h-sm); padding-inline: var(--ec-3);
    background: var(--ec-surface-2);
    border: 1px solid var(--ec-border); border-radius: var(--ec-r-pill);
    color: var(--ec-text); font-size: .8125rem; cursor: pointer;
}
.ec-palchip:hover { border-color: var(--ec-primary); }
.ec-palchip.is-active { background: var(--ec-primary); border-color: var(--ec-primary); color: #fff; }
.ec-palchip__n { color: inherit; opacity: .7; font-size: .75rem; }
/* 🔴 DVĚ RŮZNÉ KOMPONENTY SDÍLELY JEDNO JMÉNO. `.ec-shades` je mřížka vzorků
      ve výběru odstínu v kalkulačce (malé vzorky, strop výšky se scrollem,
      protože sedí v postranním panelu) — A ZÁROVEŇ mřížka na samostatné
      stránce vzorníku (velké vzorky, přes celou stránku, bez stropu).

      Obě definice v tomhle souboru existovaly vedle sebe. Vyhrála ta níž
      položená (vzorník) pro `gap` a `grid-template-columns`, ale `max-height`
      a `overflow-y` z té první nikdo nepřebil — takže **stránka vzorníku měla
      mřížku useknutou na 40 % výšky okna s vlastním posuvníkem uvnitř**,
      a výběr v kalkulačce měl zase vzorky o polovinu větší, než měl mít.

   ⚠️ Řeší se ZÚŽENÍM SELEKTORU, ne přejmenováním v JavaScriptu: mřížku
      v kalkulačce staví `ecorson.js` do `.ec-shadepicker__body`, takže stačí
      variantu zapouzdřit do `.ec-shadepicker`. Přejmenování třídy by muselo
      sedět na dvou místech naráz. */
/* 🔴 OTEVŘENÁ PALETA MÁ PEVNOU VÝŠKU. Dřív se plocha přizpůsobovala obsahu:
      řádek „Načítám…", pak mřížka, pak při přepnutí palety zase řádek —
      a všechno pod ní skákalo podle rychlosti serveru. Teď se otevře rovnou
      v plné výšce, načítá se uvnitř a vzorky se v ní rolují.
   ⚠️ Výška mřížky (`max-height: 100%`) se musí vejít do výšky plochy. */
.ec-shadepicker__shades.is-open {
    position: relative;
    height: clamp(220px, 42vh, 380px);
    border: 1px solid var(--ec-border); border-radius: var(--ec-r-md);
    background: var(--ec-surface-2);
}
.ec-shadepicker__shades.is-open > .ec-hint { margin: 0; padding: var(--ec-4); }
.ec-shadepicker .ec-shades {
    gap: var(--ec-2);
    grid-template-columns: repeat(auto-fill, minmax(84px, 1fr));
    max-height: 100%; overflow-y: auto; padding: var(--ec-2);
    scrollbar-width: thin; scrollbar-color: var(--ec-primary) transparent;
}
.ec-shadeswatch {
    display: block; padding: 0; overflow: hidden;
    background: var(--ec-surface-2);
    border: 2px solid transparent; border-radius: var(--ec-r-md);
    cursor: pointer;
}
.ec-shadeswatch:hover { border-color: var(--ec-border-strong); }
.ec-shadeswatch.is-selected { border-color: var(--ec-primary); }
.ec-shadeswatch img,
.ec-shadeswatch__flat { display: block; width: 100%; aspect-ratio: 1 / 1; object-fit: cover; }
/* Vzorek se rozsvítí, až je obrázek celý (třídu `is-loaded` dává skript). */
.ec-shadeswatch img {
    background: var(--ec-surface-3);
    opacity: 0; transition: opacity var(--ec-t-hover) var(--ec-ease);
}
.ec-shadeswatch img.is-loaded { opacity: 1; }
.ec-shadeswatch__flat { background: var(--ec-surface-2); }
.ec-shadeswatch__code {
    display: block; padding: 3px 4px;
    color: var(--ec-muted); font-size: .625rem; line-height: 1.2;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

/* 🔴 `hidden` MUSÍ PŘEBÍT VLASTNÍ `display`. Prohlížeč dává `[hidden]`
      jen `display: none` s nulovou specificitou, takže ho `.ec-field`
      s vlastním `display` přebije a prvek zůstane vidět. Přesně to se
      stalo u bloku s odstínem — ukazoval prázdný popisek „Odstín",
      dokud nebyl vybraný povrch.

   ⚠️ Řeší se specificitou (0,2,0), ne `!important`. */
[hidden] { display: none; }
.ec-field[hidden],
.ec-shadepicker[hidden] { display: none; }

/* Na kartě produktu se textové pole s odstínem schová AŽ ve chvíli, kdy
   skript postaví vzorkovník. Bez skriptu zůstane vyplnitelné. */
.ec-shadepicker.is-enhanced > #ec-odstin {
    position: absolute; width: 1px; height: 1px;
    margin: -1px; padding: 0; border: 0;
    clip: rect(0 0 0 0); clip-path: inset(50%); overflow: hidden;
}

/* ── Galerie produktu ─────────────────────────────────────
   Poměr stran drží výšku, aby stránka při načítání fotek neposkakovala. */
.ec-gallery { margin-bottom: var(--ec-5); }
/* ⚠️ `max-width: 100%` vedle `width: 100%` není zbytečné: `width` se počítá
      z rodiče, a když je šířka rodiče neurčitá (mřížkový sloupec `auto`),
      spadne to na vlastní šířku obrázku. `max-width` drží i tehdy. */
.ec-gallery__single {
    display: block; width: 100%; max-width: 100%;
    aspect-ratio: 16 / 9; object-fit: cover;
    border-radius: var(--ec-r-lg);
    margin-bottom: var(--ec-5);
    background: var(--ec-surface-2);
}
.ec-gallery__main {
    position: relative;
    border-radius: var(--ec-r-lg); overflow: hidden;
    background: var(--ec-surface-2);
}
.ec-gallery__main .swiper-slide img {
    display: block; width: 100%;
    aspect-ratio: 16 / 9; object-fit: cover;
}
/* ⚠️ Než se Swiper spustí (nebo když se nespustí vůbec), musí jít fotkami
      projít alespoň posunem — Swiperovo CSS dělá z pásu flex s ořezem
      a bez tohohle by zůstala vidět jen první. */
/* Totéž co u karuselů níž: bez skryté lišty problíkne vodorovný posuvník,
   než se galerie inicializuje. Posouvat se dá dál. */
.ec-gallery__main:not(.swiper-initialized) .swiper-wrapper { overflow-x: auto; scrollbar-width: none; }
.ec-gallery__main:not(.swiper-initialized) .swiper-wrapper::-webkit-scrollbar { display: none; }

.ec-gallery__nav {
    position: absolute; top: 50%; z-index: 2;
    transform: translateY(-50%);
    display: grid; place-items: center;
    width: 40px; height: 40px;
    background: rgba(13, 10, 8, .62);
    border: 1px solid var(--ec-border-strong); border-radius: 50%;
    color: var(--ec-text-strong); cursor: pointer;
    transition: background var(--ec-t-hover) var(--ec-ease);
}
.ec-gallery__nav:hover { background: var(--ec-primary); border-color: var(--ec-primary); }
.ec-gallery__nav svg { display: block; width: 18px; height: 18px; }
.ec-gallery__nav--prev { left: var(--ec-3); }
.ec-gallery__nav--next { right: var(--ec-3); }
/* Swiper třídu přidá sám, když už není kam jet. */
.ec-gallery__nav.swiper-button-disabled { opacity: .35; cursor: default; }
.ec-gallery__count {
    position: absolute; right: var(--ec-3); bottom: var(--ec-3); z-index: 2;
    padding: 2px var(--ec-2);
    background: rgba(13, 10, 8, .62);
    border-radius: var(--ec-r-pill);
    color: var(--ec-muted); font-size: .6875rem;
}

.ec-gallery__thumbs {
    margin-top: var(--ec-2);
}
/* 🔴 PŘECHOD JEN NA POSUNOVATELNÉM PÁSU. Poslední náhled je useknutý schválně,
      když se pás dá posunout — přechod to říká nahlas. Jenže když se náhledy
      vejdou všechny (od 29. 9. 2026 se roztáhnou a vyplní řádek), posouvat
      není kam a přechod by poslední náhled vybledl bez důvodu — vypadá to
      jako chyba vykreslení.

   ⚠️ Třídu přidává `ecorson.js` podle SKUTEČNÉHO přetečení. Swiperova
      `swiper-lock` se na tenhle pás s `freeMode` nenastaví (ověřeno měřením),
      takže na ni spoléhat nejde. */
.ec-gallery__thumbs.is-posuvny {
    mask-image: linear-gradient(to right, #000 calc(100% - 32px), transparent);
    -webkit-mask-image: linear-gradient(to right, #000 calc(100% - 32px), transparent);
}
.ec-gallery__thumbs .swiper-slide {
    /* 🔴 NÁHLEDY VYPLNÍ ŘÁDEK, KDYŽ SE VEJDOU. Pevných 84 px znamenalo, že pás
          náhledů skončil dřív než hlavní obrázek nad ním a vpravo zbylo mrtvé
          místo — naměřeno 29. 9. 2026: hlavní obrázek 937 px, pás náhledů
          726 px, tedy 211 px prázdna. Při 1024 px okna to bylo 117 px.
          Zadavatel to poslal se snímkem jako chybu a měl pravdu.

       ⚠️ `flex-shrink: 0` je podstatný: s výchozí jedničkou by se náhledy při
          velkém počtu smrskly pod 84 px místo toho, aby pás přetekl a dal se
          posunout. Růst je naopak vítaný, jen se zastropuje — dva náhledy
          roztažené přes celou šířku by vypadaly jako dvě velké fotky. */
    width: 84px;
    flex: 1 0 auto;
    max-width: 140px;
    cursor: pointer;
    border-radius: var(--ec-r-sm); overflow: hidden;
    border: 2px solid transparent;
    opacity: .55;
    transition: opacity var(--ec-t-hover) var(--ec-ease),
                border-color var(--ec-t-hover) var(--ec-ease);
}
.ec-gallery__thumbs .swiper-slide img {
    display: block; width: 100%; aspect-ratio: 1 / 1; object-fit: cover;
}
.ec-gallery__thumbs .swiper-slide-thumb-active { opacity: 1; border-color: var(--ec-primary); }
.ec-gallery__thumbs .swiper-slide:hover { opacity: 1; }

/* ── Text z editoru ───────────────────────────────────────
   🔴 `.ec-prose` NEMĚLA ŽÁDNÁ PRAVIDLA. Popis produktu je HTML u 137 ze
      157 produktů, ale odstavce, odrážky a mezinadpisy se kreslily
      výchozím stylem prohlížeče — tedy jako neformátovaná zeď textu.

   ⚠️ Typografie se popisuje POTOMKŮM `.ec-prose`, ne globálně. Obsah
      píše správce v editoru a nedá se předepsat, jaké značky použije;
      globální pravidla by ale rozhodila komponenty jinde na webu. */
/* 15 px byla velikost popisku, ne textu k přečtení. Souvislý odstavec na
   tmavém podkladu potřebuje víc — a řádkování 1,75, protože světlé písmo na
   tmavém pozadí opticky „zavírá" mezery mezi řádky. */
.ec-prose, .builder-text { color: var(--ec-text); font-size: 1rem; line-height: 1.75; max-width: var(--ec-mira-textu); }
/* Mezera mezi bloky dělá z textu odstavce. Šestnáct pixelů při řádkování 28 px
   je míň než jeden řádek, takže odstavce splývaly do jednoho sloupce textu. */
/* 🔴 MEZERU MEZI BLOKY DĚLÁ JEDINÉ PRAVIDLO: „každý blok kromě prvního má
      nahoře 24 px". Do 1. 9. 2026 ho přebíjelo `p { margin: 0 }` — selektor
      `.builder-text p` má specificitu (0,1,1), pravidlo mezery `> * + *`
      jen (0,1,0), takže odstavce, seznamy i odstavec za seznamem seděly
      NA SOBĚ, na celém webu včetně popisů produktů. Změřeno: p→p 0 px,
      p→ul 0 px, ol→p 0 px. Zadavatel: „jak je možné, že odstavec nemá
      automaticky mezeru napříč celým webem?"

      Proto se prvkům nuluje jen SPODNÍ okraj (`margin-bottom: 0`) a horní
      nechává pravidlu mezery. Kdo bude přidávat další typ bloku, nesmí mu
      dát `margin: 0` — jen `margin-bottom: 0`. */
.ec-prose > * + *, .builder-text > * + * { margin-top: var(--ec-5); }
.ec-prose p, .builder-text p { margin-bottom: 0; }
/* 🔴 NAD NADPISEM VÍC MÍSTA NEŽ POD NÍM. Nadpis patří k tomu, co následuje;
      se stejnou mezerou na obou stranách se opticky přilepí k předchozímu
      odstavci a čtenář ho přečte jako jeho pokračování. */
.ec-prose > :first-child, .builder-text > :first-child { margin-top: 0; }
.ec-prose h2, .ec-prose h3, .ec-prose h4,
.builder-text h2, .builder-text h3, .builder-text h4 {
    margin: var(--ec-7) 0 var(--ec-3);
    font-family: var(--ec-font-display); font-weight: 700; line-height: 1.25;
    color: var(--ec-text-strong);
}
.ec-prose h2, .builder-text h2 { font-size: 1.3rem; }
.ec-prose h3, .builder-text h3 { font-size: 1.1rem; }
.ec-prose h4, .builder-text h4 { font-size: 1rem; }
/* 🔴 SEZNAM LÍCUJE S TEXTEM. Odrážka i číslo sedí na téže levé hraně jako
      odstavec a nadpis nad nimi; odsazený je jen text položky (`li`
      padding-left). Dřív měl seznam vlastních 12 px navíc — a číslo „1."
      pak stálo o kus vpravo od nadpisu „Co bude dál". Zadavatel: „líčka
      nejsou zarovnané s levým okrajem." */
.ec-prose ul, .ec-prose ol,
.builder-text ul, .builder-text ol { margin-bottom: 0; padding-left: 0; list-style: none; }
.ec-prose ol, .builder-text ol { counter-reset: ec-prose-num; }
/* `list-style: none` i na položce: importovaný popis nese `<ul style="list-style-type: disc">`
   a inline styl na seznamu by k oranžovému čtverečku přidal i kolečko prohlížeče.
   Hodnota na `li` přebije zděděnou ze `ul`, inline styl neřeší. */
.ec-prose li, .builder-text li { position: relative; padding-left: var(--ec-5); margin-bottom: var(--ec-3); list-style: none; }
/* Poslední položka mezeru pod sebou nepotřebuje — přičetla by se k mezeře
   za celým seznamem a vznikla by díra. */
.ec-prose li:last-child, .builder-text li:last-child { margin-bottom: 0; }
/* Odrážka je čtvereček v barvě značky — ne výchozí kolečko prohlížeče. */
.ec-prose ul > li::before, .builder-text ul > li::before {
    content: ""; position: absolute; left: 2px; top: .66em;
    width: 6px; height: 6px; border-radius: 1px;
    background: var(--ec-primary);
}
.ec-prose ol > li::before, .builder-text ol > li::before {
    counter-increment: ec-prose-num;
    content: counter(ec-prose-num) ".";
    position: absolute; left: 0; top: 0;
    color: var(--ec-primary); font-weight: 700; font-size: .875rem;
}
.ec-prose strong, .ec-prose b, .builder-text strong, .builder-text b { color: var(--ec-text-strong); font-weight: 600; }
.ec-prose a, .builder-text a { color: var(--ec-primary); text-decoration: underline; text-underline-offset: 2px; }
.ec-prose img, .builder-text img { border-radius: var(--ec-r-md); }
.ec-prose blockquote, .builder-text blockquote {
    padding-left: var(--ec-4);
    border-left: 2px solid var(--ec-primary);
    color: var(--ec-muted); font-style: italic;
}
/* Tabulka se posouvá uvnitř svého rámu — jinak by roztáhla celou stránku. */
.ec-prose table, .builder-text table { width: 100%; border-collapse: collapse; font-size: .875rem; }
.ec-prose th, .ec-prose td,
.builder-text th, .builder-text td {
    padding: var(--ec-2) var(--ec-3); text-align: left;
    border-bottom: 1px solid var(--ec-border);
}
.ec-prose th { color: var(--ec-text-strong); font-weight: 600; }

/* ── Našeptávač ───────────────────────────────────────────
   Nabídka visí POD polem a je součástí stránky, ne oknem prohlížeče.
   Nativní `<datalist>` se otevíral mimo pole a nešel nijak nastylovat. */
.ec-suggest { position: relative; }
.ec-suggest__list {
    position: absolute; left: 0; right: 0; top: calc(100% + 4px); z-index: 30;
    max-height: 15rem; overflow-y: auto;
    margin: 0; padding: var(--ec-1); list-style: none;
    background: var(--ec-surface);
    border: 1px solid var(--ec-border-strong); border-radius: var(--ec-r-md);
    box-shadow: var(--ec-shadow);
    scrollbar-width: thin; scrollbar-color: var(--ec-primary) transparent;
}
.ec-suggest__item {
    padding: var(--ec-2) var(--ec-3);
    border-radius: var(--ec-r-sm);
    color: var(--ec-text); font-size: .875rem; cursor: pointer;
}
.ec-suggest__item:hover,
.ec-suggest__item.is-active { background: var(--ec-surface-2); color: var(--ec-text-strong); }

/* ── Číselné pole s táhlem ────────────────────────────────
   🔴 Táhlo místo šipek. `type=number` kreslí v prohlížeči dvě drobné šipky
      u pravého okraje — trefit je myší je otrava a na dotyku nejdou skoro
      vůbec. Pole je proto `type=text` s `inputmode=decimal` a hodnotu jde
      nastavit i tažením.

   ⚠️ Táhlo se ukáže, teprve když ho skript propojí s polem (`is-enhanced`).
      Bez skriptu by to byl posuvník, který nic nedělá. */
.ec-range { display: grid; grid-template-columns: 1fr auto; gap: var(--ec-2) var(--ec-3); align-items: center; }
.ec-range__unit { color: var(--ec-faint); font-size: .8125rem; }
.ec-range__slider { display: none; grid-column: 1 / -1; width: 100%; margin-top: var(--ec-2); }
.ec-range.is-enhanced .ec-range__slider { display: block; }

/* Vzhled táhla. Prohlížeče kreslí dráhu i jezdec vlastními pseudoprvky,
   takže se musí popsat zvlášť pro WebKit a pro Firefox — společný zápis
   pro obojí neexistuje. */
.ec-range__slider {
    -webkit-appearance: none; appearance: none;
    height: 22px; background: transparent; cursor: pointer;
}
.ec-range__slider::-webkit-slider-runnable-track {
    height: 4px; border-radius: var(--ec-r-pill); background: var(--ec-border-strong);
}
.ec-range__slider::-moz-range-track {
    height: 4px; border-radius: var(--ec-r-pill); background: var(--ec-border-strong);
}
.ec-range__slider::-webkit-slider-thumb {
    -webkit-appearance: none; appearance: none;
    width: 18px; height: 18px; margin-top: -7px;
    border: none; border-radius: 50%;
    background: var(--ec-primary);
}
.ec-range__slider::-moz-range-thumb {
    width: 18px; height: 18px;
    border: none; border-radius: 50%;
    background: var(--ec-primary);
}
.ec-range__slider:focus-visible::-webkit-slider-thumb { box-shadow: 0 0 0 3px var(--ec-accent-soft); }
.ec-range__slider:focus-visible::-moz-range-thumb { box-shadow: 0 0 0 3px var(--ec-accent-soft); }

/* ⚠️ I když se `type=number` v projektu nepoužívá, šipky se vypínají —
      aby se nevrátily zadními vrátky s další šablonou. */
.ec-input[type="number"] { -moz-appearance: textfield; appearance: textfield; }
.ec-input[type="number"]::-webkit-outer-spin-button,
.ec-input[type="number"]::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }

/* ── Katalog: filtr a doučítání ───────────────────────────
   🔴 Tlačítko „Hledat" mizí AŽ ve chvíli, kdy skript zapne živé hledání.
      V CSS napevno by se schovalo i tomu, komu se skript nenačte,
      a katalog by nešlo prohledat vůbec. */
.ec-filter.is-live .ec-filter__submit { display: none; }
/* Během načítání výpis zešedne — jinak není poznat, že se něco děje. */

.ec-more {
    display: flex; align-items: center; justify-content: center; gap: var(--ec-3);
    min-height: 64px; margin-top: var(--ec-5);
}
/* S doučítáním je odkaz jen záloha pro prohlížeč bez `IntersectionObserver`. */
.ec-more.is-auto .ec-more__link { display: none; }
.ec-more.is-end .ec-more__link { display: none; }
.ec-more__spinner {
    display: none;
    width: 22px; height: 22px; border-radius: 50%;
    border: 2px solid var(--ec-border-strong);
    border-top-color: var(--ec-primary);
    animation: ec-spin 700ms linear infinite;
}
.ec-more.is-busy .ec-more__spinner { display: block; }
.ec-more.is-busy .ec-more__end { display: none; }
@keyframes ec-spin { to { transform: rotate(360deg); } }
/* Pohyb se vypíná, když si ho návštěvník nepřeje — kroužek pak jen stojí. */
@media (prefers-reduced-motion: reduce) {
    .ec-more__spinner { animation: none; }
}

.ec-mt0 { margin-top: 0; }
.ec-input--num { width: 5.5rem; text-align: right; }
/* Štítek u položky — např. „poptat cenu s prací". */
.ec-tag {
    display: inline-block; margin-left: var(--ec-2);
    padding: 1px var(--ec-2);
    background: var(--ec-primary-soft);
    border-radius: var(--ec-r-pill);
    color: var(--ec-accent); font-size: .6875rem;
}

/* ── Druhá možnost pod hlavní akcí ────────────────────────
   Odděluje „přidat do rozpočtu" od „vložit do košíku". Bez rámečku
   a nadpisu nebylo poznat, ke kterému tlačítku pole s místností patří. */
.ec-alt-action {
    margin-top: var(--ec-5);
    padding-top: var(--ec-4);
    border-top: 1px solid var(--ec-border);
}
.ec-alt-action__title {
    margin: 0;
    font: 600 .8125rem/1.4 var(--ec-font-body);
    color: var(--ec-muted);
}

/* Sbalená nabídka rozpočtu (28. 9. 2026).
   🔴 Poslední krok průvodce nesl pod hlavním tlačítkem ještě nadpis, pole,
      druhé tlačítko a odstavec nápovědy — půl obrazovky pro nabídku, kterou
      využije menšina. `<details>` to schová a nechá rozkliknout.
   ⚠️ Vlastní šipka, ne výchozí trojúhelník: `list-style: none` na `summary`
      ho vypne v moderních prohlížečích, `::-webkit-details-marker` v Safari
      a starším Chrome. Bez obojího zůstane vidět jeden z nich. */
.ec-alt-action > summary {
    display: flex; align-items: center; gap: var(--ec-2);
    cursor: pointer; list-style: none;
}
.ec-alt-action > summary::-webkit-details-marker { display: none; }
.ec-alt-action > summary::after {
    content: ''; margin-left: auto;
    width: .5rem; height: .5rem;
    border-right: 2px solid currentColor; border-bottom: 2px solid currentColor;
    transform: rotate(45deg) translate(-2px, -2px);
    transition: transform .18s ease;
}
.ec-alt-action[open] > summary::after { transform: rotate(-135deg) translate(-2px, -2px); }
.ec-alt-action > summary:hover { color: var(--ec-text); }
.ec-alt-action > summary:focus-visible {
    outline: 2px solid var(--ec-accent); outline-offset: 3px; border-radius: var(--ec-r-sm);
}
.ec-alt-action__body { margin-top: var(--ec-3); }

/* Poznámka o závaznosti výpočtu — řádek, ne barevný blok.
   Jako `.ec-note` přes celou šířku byla nejnápadnější věcí posledního kroku,
   přestože jde o vysvětlivku pod cenou. */
.ec-calc__note { margin: var(--ec-3) 0 0; }

/* ── Košík: množství a přepočet ───────────────────────────
   Pole i tlačítko mají jednu výšku (`--ec-ctl-h`). Dřív bylo tlačítko
   `--sm`, tedy o 12 px nižší než pole vedle něj. */
.ec-qty {
    display: flex; align-items: center; gap: var(--ec-2);
    margin-top: var(--ec-3);
}
.ec-qty__input { width: 88px; }
.ec-qty__input--area { width: 104px; }
.ec-qty__unit { color: var(--ec-faint); font-size: .8125rem; }
/* 🔴 Tlačítko mizí, TEPRVE když skript ohlásí, že přepočítává sám.
      Třídu `is-auto` přidává JavaScript — v CSS napevno by se schovalo
      i tomu, komu se skript nenačte, a košík by nešlo přepočítat vůbec. */
.ec-qty.is-auto .ec-qty__btn { display: none; }
/* Než odpověď dorazí, pole zešedne — jinak není poznat, že se něco děje. */
.ec-qty.is-busy .ec-qty__input { opacity: .55; }

.ec-cart-remove { margin-top: var(--ec-2); }
.ec-cart-item__price { text-align: right; }
.ec-cart-item__main { min-width: 0; }
.ec-cart-item__link { color: inherit; }
.ec-cart-item__layers { margin-top: var(--ec-2); }
.ec-cart-item__layers-sum { cursor: pointer; }
.ec-layers--inset { margin-top: var(--ec-2); }
.ec-field--mb { margin-bottom: var(--ec-2); }
.ec-field--odstup { margin-top: var(--ec-4); }
/* Přepínač volby a její název na společné ose (radio je 18 px, text 16 px). */
.ec-layer--volba .ec-layer__head > span:first-child { display: inline-flex; align-items: center; gap: var(--ec-2); }
/* Na střed, ne na účaří — účaří bralo spodek radia a cena seděla o 4 px níž.
   Popis volby začíná pod textem, ne pod přepínačem (18 px + mezera). */
.ec-layer--volba .ec-layer__head { align-items: center; }
.ec-layer--volba .ec-layer__meta { padding-left: calc(18px + var(--ec-2)); }
.ec-m0 { margin: 0; }

/* ── Katalog: postranní panel a strom kategorií ───────────
   Dvousloupcová sazba katalogu. Dřív byla inline v šabloně; `minmax(0, …)`
   je podstatné, jinak dlouhý název produktu roztáhne sloupec. */
.ec-catalog {
    display: grid; gap: var(--ec-5);
    grid-template-columns: minmax(0, 240px) minmax(0, 1fr);
    align-items: start;
}
/* 🔴 NA DESKTOPU SE PANEL LEPÍ. Strom kategorií je delší než výpis krátké
      řady (BETON ART: 3 karty do 666 px, strom do 1450 px) a u dlouhého
      výpisu zase po odscrollování zel prázdný sloupec. Přilepený panel
      s vlastním posuvníkem je vidět pořád a stránku neprodlužuje. */
@media (min-width: 1280px) {
    .ec-catalog__side {
        position: sticky; top: calc(var(--ec-header-h) + var(--ec-4));
        max-height: calc(100vh - var(--ec-header-h) - var(--ec-7));
        overflow-y: auto; overscroll-behavior: auto;
        scrollbar-width: thin; scrollbar-color: var(--ec-border-strong) transparent;
    }
}
/* 🔴 SBALITELNÝ PANEL POD 1280 PX. Na tabletu (768) zbylo vedle panelu
      220 px na výpis 485 px — jediný sloupec obřích karet, stránka katalogu
      77 536 px a názvy ve stromu na dva řádky. Totéž mezi 901 a 1279 px:
      pruh kategorií + panel 240 px nechaly výpisu jeden až dva sloupce
      (901 px → 1 karta 458 px). Panel je nad výpisem sbalený, výpis přes
      celou šířku ve dvou až třech sloupcích. `ecorson.js` drží stejnou mez. */
@media (max-width: 1279px) {
    .ec-catalog { grid-template-columns: minmax(0, 1fr); gap: var(--ec-4); }
}

/* -- Sbalitelný panel katalogu (mobil) --------------------------------- */
.ec-catalog__toggle {
    display: flex; align-items: center; justify-content: space-between; gap: var(--ec-3);
    cursor: pointer; list-style: none;
    font: 600 .9375rem/1 var(--ec-font-body); color: var(--ec-text-strong);
}
.ec-catalog__toggle::-webkit-details-marker { display: none; }
.ec-catalog__toggle svg { display: block; width: 18px; height: 18px; flex: none; transition: transform var(--ec-t-hover) var(--ec-ease); }
.ec-catalog__panel[open] > .ec-catalog__toggle svg { transform: rotate(180deg); }
/* 🔴 KLEPNOUT SE DÁ NA CELÝ RÁMEČEK, NE NA 18px PROUŽEK TEXTU. Odsazení
      karty (24 px) leželo mimo `<summary>`; přepínač si ho teď bere sám
      zápornými okraji a stejným vnitřním odsazením, vzhled se nemění.
      Otevřený panel: spodní odsazení přepínače dělá mezeru k obsahu. */
.ec-catalog__toggle { margin: calc(var(--ec-5) * -1); padding: var(--ec-5); }
.ec-catalog__panel[open] > .ec-catalog__toggle { margin-bottom: 0; padding-bottom: var(--ec-4); }
/* Na širokém displeji přepínač není — panel je vždy vidět. */
@media (min-width: 1280px) {
    .ec-catalog__toggle { display: none; }
}

.ec-cattree { margin: 0; padding: 0; list-style: none; }
/* Zanořené úrovně se odsazují o šířku ikony, aby názvy stály pod sebou. */
.ec-cattree .ec-cattree { padding-left: var(--ec-5); }
.ec-cattree__item { margin: 0; }
/* 🔴 ODRÁŽKA U PRVNÍHO ŘÁDKU, NE UPROSTŘED DVOU. Zalomený název
      („OXIDECOR EXTRA FINE") měl tečku svisle mezi řádky. Řádek je zarovnaný
      nahoru a ikona i šipka mají výšku jednoho řádku textu (`1.4em` při
      písmu odkazu) — vystředí se na první řádek při jakékoli velikosti. */
.ec-cattree__row,
.ec-cattree__summary {
    display: flex; align-items: flex-start; gap: var(--ec-2);
    padding: 5px 0;
    font-size: .875rem; line-height: 1.4;
}
.ec-cattree__row > .ec-cattree__icon,
.ec-cattree__summary > .ec-cattree__icon,
.ec-cattree__summary > .ec-cattree__caret { height: 1.4em; }
/* `<summary>` má nativní trojúhelníček — nahrazuje ho vlastní šipka vpravo. */
.ec-cattree__summary { cursor: pointer; list-style: none; }
.ec-cattree__summary::-webkit-details-marker { display: none; }
.ec-cattree__icon {
    flex: none; display: grid; place-items: center;
    width: 18px; height: 18px; color: var(--ec-faint);
}
.ec-cattree__icon svg { display: block; width: 16px; height: 16px; }
/* Odrážka pro kategorii bez ikony — aby řádky nedrncaly. */
.ec-cattree__dot {
    width: 5px; height: 5px; border-radius: 50%;
    background: var(--ec-border-strong);
}
.ec-cattree__link {
    flex: 1 1 auto; min-width: 0;
    color: var(--ec-text); font-size: .875rem; text-decoration: none;
}
.ec-cattree__link:hover { color: var(--ec-primary); }
.ec-cattree__link.is-active { color: var(--ec-primary); font-weight: 600; }
.ec-cattree__group[open] > .ec-cattree__summary > .ec-cattree__icon { color: var(--ec-primary); }
.ec-cattree__caret {
    flex: none; display: grid; place-items: center;
    width: 16px; height: 16px; color: var(--ec-faint);
    transition: transform var(--ec-t-hover) var(--ec-ease);
}
.ec-cattree__caret svg { display: block; width: 13px; height: 13px; }
.ec-cattree__group[open] > .ec-cattree__summary > .ec-cattree__caret { transform: rotate(90deg); }

/* Zástupný obrázek u produktu bez fotky. Prázdný `<div>` držel výšku, ale
   vypadal jako díra; ikona říká „fotka chybí“, ne „něco se nenačetlo“. */
.ec-product-card__img--empty {
    display: grid; place-items: center;
    color: var(--ec-faint);
}
.ec-product-card__img--empty svg { display: block; width: 34px; height: 34px; }

.ec-product-card__body { display: flex; flex-direction: column; gap: var(--ec-2); padding: var(--ec-4); flex: 1; }
.ec-product-card__title {
    /* ⚠️ `margin: 0` je tu podstatné. Základ typografie dával `<h2>` horní
          okraj 64 px a mezi náhledem a názvem vznikla díra. Specificita
          je od 30. 8. 2026 srovnaná v sekci 3, tohle je druhá pojistka. */
    margin: 0;
    font: 700 1rem/1.3 var(--ec-font-display);
    color: var(--ec-text-strong);
    /* Název na nejvýš dva řádky — jinak se karty v mřížce rozjedou.
       U delších názvů („BETON ART – STRUKTURÁLNÍ EFEKT+BASE“) se ořízne
       trojtečkou; celý název je v `title` i na detailu produktu. */
    display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
    overflow: hidden;
}
.ec-product-card__link { color: inherit; }
.ec-product-card__desc  {
    margin: 0; font-size: .8125rem; color: var(--ec-muted);
    display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
    overflow: hidden;
}
/* Cena drží dole i u různě dlouhých názvů — karty pak nemají rozházené paty. */
/* 🔴 PATA KARTY SE MUSÍ UMĚT ZALOMIT. Při šířce karty pod ~160 px se cena
      a tlačítko vedle sebe nevejdou a obsah vytékal z rámečku ven — naměřeno
      u 24 karet z 24. Bez `min-width: 0` navíc flexový prvek odmítá zmenšit
      pod šířku svého textu, takže samotné `flex-wrap` nestačí. */
/* 🔴 TLAČÍTKO VŽDY VPRAVO VEDLE CENY. S `flex-wrap: wrap` se u delší ceny
      („Cena podle plochy") tlačítko zalomilo pod cenu doleva, u vedlejší
      karty stálo vpravo — ve stejné řadě dvě různé paty. Karta je teď
      nejméně 240 px, takže se cena zalomí uvnitř svého sloupce a tlačítko
      zůstane na místě. */
.ec-product-card__foot {
    margin-top: auto; padding-top: var(--ec-3);
    /* `flex-end`: u dvouřádkové ceny („Cena podle plochy" + poznámka) stálo
       tlačítko o 20 px výš než u sousední karty v téže řadě. Paty karet
       jsou dole zarovnané, takže tlačítka sedí na jedné linii. */
    display: flex; flex-wrap: nowrap; align-items: flex-end;
    justify-content: space-between; gap: var(--ec-3);
}
.ec-product-card__foot > * { min-width: 0; }
.ec-product-card__foot > .ec-price { flex: 1 1 auto; }
/* Tlačítko se nezmenšuje — text ceny má ustoupit jemu, ne naopak. */
.ec-product-card__foot .ec-btn { flex: none; }
.ec-price { font: 700 1.05rem/1.2 var(--ec-font-display); color: var(--ec-text-strong); min-width: 0; }
.ec-price small {
    display: block; font: 400 .8125rem/1.4 var(--ec-font-body); color: var(--ec-muted);
    /* Poznámka „za m² počítá kalkulačka" se smí zalomit — jinak roztáhne
       patu karty a vytlačí tlačítko ven. */
    overflow-wrap: break-word;
}

/* =========================================================
   7. KALKULAČKA
   ========================================================= */
.ec-calc { display: grid; gap: var(--ec-5); }

/* ── Souhrn rozpočtu ──────────────────────────────────────
   🔴 SOUČET MUSÍ BÝT VIDĚT NA JEDNU DOBROU. U dvaceti položek se panel
      natáhl na několik obrazovek a celková cena skončila kdesi dole.
      Panel proto zůstává u horního okraje (`sticky`), materiál se posouvá
      uvnitř a součet s tlačítkem drží spodek.

   ⚠️ `max-height` vychází z výšky okna minus hlavička — bez toho by
      `sticky` panel přerostl obrazovku a součet by zase utekl. */
/* 🔴 PANEL NEMÁ VLASTNÍ POSUVNÍK. Dřív měl `max-height` a `overflow-y: auto`,
      takže vznikla posuvná oblast uvnitř posuvné stránky. Jakmile vnitřní
      seznam dojel na konec, prohlížeč **zůstal na něm zaseknutý** a stránka
      se dál neposouvala — uživatel musel odjet myší mimo box. Je to takzvané
      „scroll latching" a nedá se vypnout žádnou vlastností CSS.

      Řešení není lepší nastavení vnořeného posuvníku, ale ŽÁDNÝ vnořený
      posuvník. Panel roste s obsahem a posouvá se s celou stránkou; přilepená
      je jen pata se součtem.

   ⚠️ Kdo sem bude chtít vrátit `max-height` + `overflow`, ať si nejdřív
      zkusí dojet seznam na konec a scrollovat dál. */
/* ⚠️ Vlastnosti panelu jsou níž v souboru u ostatních pravidel `.ec-summary`.
      Mít je na dvou místech znamená, že to pozdější tiše vyhraje — přesně
      to se tu stalo, když jsem sem napsal `display: flex` a o osmdesát řádků
      níž zůstalo `display: grid`. */
.ec-summary__scroll { min-height: 0; }

/* 🔴 SOUČET DRŽÍ SPODEK OBRAZOVKY. `sticky bottom` ho udrží v dohledu,
      dokud se stránkou projíždí materiál — a na konci panelu se sám usadí
      na své místo. Zadání znělo „součet musím vidět na jednu dobrou".

   ⚠️ Vlastní pozadí je nutné: pata leží nad obsahem, který se pod ní
      posouvá, a bez pozadí by texty prosvítaly skrz. */
.ec-summary__foot {
    position: sticky; bottom: 0; z-index: 2;
    flex: none;
    margin-top: var(--ec-3);
    padding: var(--ec-3) 0 var(--ec-1);
    background: var(--ec-surface);
    border-top: 1px solid var(--ec-border);
}
@media (max-width: 1024px) {
    /* Pod formulářem nemá přilepená pata smysl — panel je krátký. */
    .ec-summary__foot { position: static; }
}

/* Rozbalovací skupina materiálu. */
.ec-group { border-bottom: 1px solid var(--ec-border); }
.ec-group:last-of-type { border-bottom: 0; }
.ec-group__head {
    display: flex; align-items: center; gap: var(--ec-2);
    padding: var(--ec-3) 0;
    cursor: pointer; list-style: none;
}
.ec-group__head::-webkit-details-marker { display: none; }
.ec-group__title {
    flex: 1 1 auto; min-width: 0;
    font: 600 .8125rem/1.35 var(--ec-font-body);
    color: var(--ec-text-strong);
}
.ec-group__price { flex: none; color: var(--ec-text-strong); font-size: .8125rem; }
.ec-group__caret {
    flex: none; display: grid; place-items: center;
    width: 16px; height: 16px; color: var(--ec-faint);
    transition: transform var(--ec-t-hover) var(--ec-ease);
}
.ec-group__caret svg { display: block; width: 13px; height: 13px; }
.ec-group[open] > .ec-group__head > .ec-group__caret { transform: rotate(90deg); }
.ec-group__body { padding-bottom: var(--ec-4); }

/* Číselník s + / − */
.ec-stepper { display: flex; align-items: stretch; max-width: 220px; }
.ec-stepper button {
    width: var(--ec-ctl-h); flex: 0 0 auto;
    background: var(--ec-surface-2); color: var(--ec-text);
    border: 1px solid var(--ec-border-strong); cursor: pointer;
    font-size: 1.1rem; line-height: 1;
}
.ec-stepper button:first-child { border-radius: var(--ec-r-md) 0 0 var(--ec-r-md); }
.ec-stepper button:last-child  { border-radius: 0 var(--ec-r-md) var(--ec-r-md) 0; }
.ec-stepper button:hover { background: var(--ec-surface-3); color: var(--ec-accent); }
/* Tlačítka se drží (zrychlené přičítání) — dlouhý stisk nesmí označit
   text, otevřít nabídku ani čekat na dvojité klepnutí. */
.ec-stepper button {
    -webkit-user-select: none; user-select: none;
    -webkit-touch-callout: none; touch-action: manipulation;
}
.ec-stepper .ec-input { border-radius: 0; border-inline: 0; text-align: center; }

/* Rozpis vrstev */
.ec-layers { display: grid; gap: var(--ec-2); }
.ec-layer {
    display: grid; gap: var(--ec-1);
    padding: var(--ec-3) var(--ec-4);
    background: var(--ec-surface-2);
    border: 1px solid var(--ec-border);
    border-radius: var(--ec-r-md);
}
.ec-layer__head { display: flex; align-items: baseline; justify-content: space-between; gap: var(--ec-3); }
.ec-layer__name { font-weight: 600; color: var(--ec-text-strong); }
.ec-layer__meta { font-size: .8125rem; color: var(--ec-muted); }
.ec-layer.is-off { opacity: .55; }

/* Souhrn ceny — přilepený, aby byl vidět při rolování rozpisu */
/* 🔴 PANEL UŽ NENÍ `sticky`. Byl, dokud měl vlastní posuvník a vešel se
      na obrazovku. S dlouhým rozpisem materiálu je vyšší než okno a lepivý
      prvek vyšší než okno se chová nepředvídatelně — drží se u horní hrany,
      dokud se nedojede jeho spodek.

      Součet drží v dohledu `.ec-summary__foot` (`sticky bottom`), což je
      to, co zadavatel chtěl: „součet musím vidět na jednu dobrou". */
.ec-summary { display: grid; gap: var(--ec-4); align-content: start; }
.ec-summary__row { display: flex; justify-content: space-between; gap: var(--ec-3); font-size: .875rem; }
/* Řádky souhrnu mají mezi sebou mezeru a varianta („5 kg") drží u svého
   názvu — dřív byla k další položce blíž (22 px) než ke své (30 px). */
.ec-summary__row + .ec-summary__row { margin-top: var(--ec-3); }
.ec-summary__row .ec-hint { display: block; margin-top: 2px; }
.ec-summary__row--sum { padding-top: var(--ec-3); border-top: 1px solid var(--ec-border); }
/* Na desktopu se krátký souhrn pokladny lepí — tlačítko „Odeslat" bylo
   tisíc pixelů nad koncem formuláře. Souhrn detailu produktu se nelepí
   (je vyšší než okno, viz poznámka výš), proto jen modifikátor. */
@media (min-width: 1025px) {
    /* `align-self: start` — v mřížce se `aside` jinak natáhne na výšku
       celého řádku (1 256 px) a přilepit se nemá kam. */
    .ec-summary--sticky { position: sticky; top: calc(var(--ec-header-h) + var(--ec-4)); align-self: start; }
}
.ec-summary__total {
    /* Čára nad součtem nesmí ležet na posledním řádku (naměřeno 0 px). */
    margin-top: var(--ec-3);
    margin-bottom: var(--ec-4);
    display: flex; justify-content: space-between; align-items: baseline; gap: var(--ec-3);
    padding-top: var(--ec-3); border-top: 1px solid var(--ec-border);
    font: 700 1.35rem/1.2 var(--ec-font-display); color: var(--ec-text-strong);
}

/* =========================================================
   8. VZORNÍK
   ========================================================= */
/* Řádek s hledáním. Nahrazuje inline `style="display:flex…"` v šabloně
   (`web-css-konvence`, pravidlo č. 1). */
.ec-filter--vzornik {
    display: flex; gap: var(--ec-2);
    max-width: 420px; margin-bottom: var(--ec-5);
}
.ec-filter--vzornik .ec-input { min-width: 0; }

/* Stránkování. Taky bývalo inline. */
.ec-pager { display: flex; flex-wrap: wrap; gap: var(--ec-2); margin-top: var(--ec-6); }

/* Během načítání se výpis ztlumí — jinak není poznat, že se něco děje,
   a při pomalé odpovědi to vypadá, že hledání nefunguje. */

.ec-shades { display: grid; gap: var(--ec-3); grid-template-columns: repeat(auto-fill, minmax(120px, 1fr)); }
/* `font: inherit` — dlaždice je `<button>` a písmo nedědí (kódy odstínů byly v Arialu). */
.ec-shade { font: inherit; min-width: 0; display: flex; flex-direction: column; gap: var(--ec-2); text-align: left; background: none; border: 0; padding: 0; cursor: pointer; }
.ec-shade__chip {
    aspect-ratio: 4 / 3;
    border: 1px solid var(--ec-border); border-radius: var(--ec-r-md);
    background-color: var(--ec-surface-2);
    background-size: cover; background-position: center;
    transition: border-color var(--ec-t-hover) var(--ec-ease), transform var(--ec-t-hover) var(--ec-ease);
}
.ec-shade:hover .ec-shade__chip { border-color: var(--ec-accent); transform: translateY(-2px); }
.ec-shade.is-selected .ec-shade__chip { border-color: var(--ec-primary); box-shadow: 0 0 0 2px var(--ec-primary-soft); }
.ec-shade__code { font-size: .8125rem; color: var(--ec-muted); }

/* =========================================================
   9. KOŠÍK A POKLADNA
   ========================================================= */
.ec-steps { display: flex; flex-wrap: wrap; gap: var(--ec-2); margin-bottom: var(--ec-7); list-style: none; padding: 0; }
.ec-steps li {
    display: flex; align-items: center; gap: var(--ec-2);
    padding: var(--ec-3) var(--ec-5);
    background: var(--ec-surface); border: 1px solid var(--ec-border);
    border-radius: var(--ec-r-pill);
    font: 600 .8125rem/1 var(--ec-font-body); color: var(--ec-muted);
}
.ec-steps li.is-active { background: var(--ec-primary); border-color: var(--ec-primary); color: #fff; }
.ec-steps li.is-done { color: var(--ec-text); border-color: var(--ec-border-strong); }
/* Odkaz na hotový krok bere celou pilulku — dřív měl klikací plochu 31 × 13 px. */
.ec-steps li > a { display: block; margin: calc(var(--ec-3) * -1) calc(var(--ec-5) * -1); padding: var(--ec-3) var(--ec-5); color: inherit; border-radius: inherit; }
.ec-steps li > a:hover { color: var(--ec-accent); }
/* Na telefonu jeden posouvatelný řádek — na 320 px spadl třetí krok pod ostatní. */
@media (max-width: 480px) {
    .ec-steps {
        flex-wrap: nowrap; overflow-x: auto; scrollbar-width: none;
        margin-bottom: var(--ec-6);
        -webkit-mask-image: linear-gradient(to right, #000 calc(100% - var(--ec-6)), transparent);
        mask-image: linear-gradient(to right, #000 calc(100% - var(--ec-6)), transparent);
    }
    .ec-steps::-webkit-scrollbar { display: none; }
    .ec-steps li { flex: none; padding: 10px var(--ec-4); }
    .ec-steps li > a { margin: -10px calc(var(--ec-4) * -1); padding: 10px var(--ec-4); }
}

/* 🔴 KARTY POD SEBOU SE NESMÍ DOTÝKAT. V pokladně (Doprava / Platba /
      Údaje) a v kalkulačce jsou karty sourozenci v obyčejném `<div>` bez
      mezery — naměřeno 0–2 px. Pravý sloupec (`.ec-summary`) je mřížka
      s vlastním `gap`, proto jen levý `div`. */
.ec-detail > div > .ec-card + .ec-card { margin-top: var(--ec-5); }
/* Volby dopravy a platby jsou `label.ec-layer` bez obalu `.ec-layers`. */
:not(.ec-layers) > .ec-layer + .ec-layer { margin-top: var(--ec-2); }
.ec-layer--volba { cursor: pointer; }
/* Poslední položka košíku nepotřebuje dělicí čáru — pod ní je jen okraj karty. */
.ec-cart-item:last-child { border-bottom: 0; padding-bottom: 0; }

.ec-cart-item { display: grid; gap: var(--ec-4); grid-template-columns: 88px minmax(0, 1fr) auto; align-items: start; padding: var(--ec-4) 0; border-bottom: 1px solid var(--ec-border); }
.ec-cart-item__img { aspect-ratio: 1; object-fit: cover; border-radius: var(--ec-r-md); background: var(--ec-surface-2); }
.ec-cart-item__name { font-weight: 600; color: var(--ec-text-strong); }
.ec-cart-item__meta { font-size: .8125rem; color: var(--ec-muted); }
/* Varianta bez obrázku — soupis místností v rozpočtu projektu.
   Bez ní by první sloupec zůstal široký 88 px a název povrchu by se do něj
   lámal po jednom slově, protože položka nemá čím ten sloupec vyplnit. */
.ec-cart-item--nomedia {
    grid-template-columns: minmax(0, 1fr) auto auto;
    /* 🔴 `center`, ne `start`. Pole s plochou a tlačítko koše jsou dva
          samostatné formuláře ve dvou sloupcích mřížky; při zarovnání
          nahoru sedí každý jinak vysoko podle toho, co má nad sebou.
          Naměřeno 16 px rozdílu mezi jejich středy. */
    align-items: center;
}
/* Formuláře v řádku nemají vlastní odsazení — výšku dává obsah. */
.ec-cart-item--nomedia .ec-qty { margin-top: 0; }
.ec-cart-item--nomedia .ec-row-action { display: flex; align-items: center; }

/* =========================================================
   10. STAVY
   ========================================================= */
/* 🔴 HLÁŠKA MÁ MEZERU NAD SEBOU, NE DÍRU POD SEBOU. Dřív byla nalepená na
      hlavičku (0 px) a pod ní 70–115 px k drobečkům — její `margin-bottom`
      plus plné horní odsazení sekce. Sekce za hláškou má horní odsazení
      jen jako mezeru mezi bloky. */
.ec-flash { margin-bottom: 0; padding-top: var(--ec-5); }
.ec-flash + .ec-section { padding-top: var(--ec-5); }
.ec-empty { padding: var(--ec-8) var(--ec-5); text-align: center; color: var(--ec-muted); }

/* ── Srdíčko (oblíbené) ──────────────────────────────────────────────── */
/* 🔴 MUSÍ BÝT NAD ROZTAŽENÝM ODKAZEM KARTY. Ten pokrývá celou kartu
      (`.ec-product-card__link::after`, z-index 2), takže by klik na srdíčko
      jinak otevřel detail produktu. Tři je totéž, co má tlačítko v patě karty. */
.ec-fav { position: absolute; top: var(--ec-3); right: var(--ec-3); z-index: 3; }

.ec-fav__btn {
    display: grid; place-items: center;
    width: 34px; height: 34px; padding: 0;
    border: 1px solid var(--ec-border); border-radius: var(--ec-r-pill);
    /* Fotka pod srdíčkem může být světlá i tmavá, proto poloprůhledný
       tmavý podklad — ne barva plochy, která by na světlé fotce zmizela. */
    background: rgba(13, 10, 8, .55);
    backdrop-filter: blur(6px);
    color: var(--ec-text-strong);
    cursor: pointer;
    transition: color var(--ec-t-hover) var(--ec-ease),
                background var(--ec-t-hover) var(--ec-ease),
                transform var(--ec-t-hover) var(--ec-ease);
}
.ec-fav__btn svg { display: block; width: 18px; height: 18px; }
.ec-fav__btn:hover { color: var(--ec-accent); border-color: var(--ec-accent); }

/* Zapnutý stav: plné srdce. Výplň dělá `fill: currentColor` nad touž cestou —
   druhá cesta pro plné srdce by se dřív nebo později rozešla s prázdnou. */
.ec-fav__btn.is-on { color: var(--ec-primary); border-color: var(--ec-primary); }
.ec-fav__btn.is-on svg { fill: currentColor; }

/* Krátké cuknutí při přidání. Bez něj není po kliknutí jistota, že se něco
   stalo — barva se změní, ale oko to na 18px ikoně přehlédne. */
@keyframes ec-fav-pop { 0% { transform: scale(1); } 45% { transform: scale(1.28); } 100% { transform: scale(1); } }
.ec-fav__btn.is-pop { animation: ec-fav-pop 260ms var(--ec-ease); }

/* ⚠️ Kdo má v systému vypnuté animace, nemá dostat cukání ani tady. */
@media (prefers-reduced-motion: reduce) {
    .ec-fav__btn.is-pop { animation: none; }
}

/* =========================================================
   11. STAVEBNICE NA TOMHLE VZHLEDU

   🔴 SEKCE STAVEBNICE NEMĚLY ANI JEDNO PRAVIDLO. Vykresluje je zděděný
      `core/BuilderRenderer.php` a ten používá názvy tříd z původního klonu
      (`builder-section`, `container`, `hero-title`, `btn btn-primary`).
      Ecorson má vlastní stylopis se jmény `ec-*`, takže se ty třídy neměly
      o co opřít a KAŽDÁ stránka ze stavebnice — obchodní podmínky, ochrana
      osobních údajů, zásady cookies — se vykreslovala jako holý text.

   🔴 PROČ SE NEPŘEJMENOVALY TŘÍDY V RENDERERU. `BuilderRenderer.php` je
      soubor JÁDRA a jde v balíčku na cizí weby. Přepsat v něm jména tříd na
      `ec-*` by rozbilo vzhled každému, kdo stojí na téže bázi. Správně se
      tedy zděděná jména napojí na zdejší tokeny — tady, v souboru na míru.

   ⚠️ Popisuje se jen to, co web opravdu používá. Renderer zná přes šedesát
      typů sekcí; popsat všechny naslepo by znamenalo udržovat styly pro
      sekce, které sem nikdo nikdy nevloží.
   ========================================================= */

/* 🔴 KOTVA MUSÍ POČÍTAT S LEPIVOU HLAVIČKOU. Bez `scroll-margin-top` skočí
      prohlížeč přesně na cíl a hlavička ho zakryje — člověk klikne na
      „Objednat školení", stránka poskočí a nadpis formuláře není vidět.
      Vypadá to, že tlačítko skočilo někam vedle. */
.builder-anchor {
    display: block; height: 0; margin: 0;
    /* Kotva je poslední dítě `.section-inner`, kde může být mřížka — bez toho
       by si vzala vlastní řádek a udělala pod sekcí mezeru. */
    grid-column: 1 / -1;
    scroll-margin-top: calc(var(--ec-header-h) + var(--ec-5));
}

/* -- Obal sekce a rytmus ---------------------------------------------- */
/* 🔴 ROZESTUPY DĚLÁ MARGIN MEZI SEKCEMI, NE PADDING UVNITŘ NICH. Původně měla
      každá sekce odsazení 64 px nahoře i dole a soused ho měl vynulovat. To
      ale nerozliší DVA různé vztahy, které na stránce jsou:

        nadpis → jeho obsah   … patří k sobě, mezera má být malá
        blok   → další blok   … oddělují se, mezera má být velká

      Vycházelo z toho pravidelně 64 px pod nadpisem a 0 px mezi bloky, tedy
      přesně naopak. Zadavatel: „pod nadpisem metrová pixelová díra."

      Teď se sekce samy neodsazují vůbec a rozestup určuje vztah k sousedovi. */
.builder-section,
.builder-cta { padding-block: 0; }

/* Výchozí odstup mezi dvěma tematickými bloky.
   ⚠️ `section.hero` NENÍ `.builder-section` — vykreslovač ho staví jako
      samostatný pás. Bez vlastního řádku by po hero následující sekce
      začínala nalepená na jeho spodní hraně. */
.builder-section + .builder-section,
.builder-section + .builder-cta,
.builder-cta + .builder-section,
section.hero + .builder-section,
section.hero + .builder-cta { margin-top: var(--ec-8); }

/* 🔴 Nadpis patří k tomu, co pod ním následuje. Sedmnáctka místo
      čtyřiašedesátky je ten rozdíl mezi „nadpis sekce" a „nadpis, který se
      vznáší v prázdnu". */
.section-heading + .builder-section,
.section-heading + .builder-cta { margin-top: var(--ec-4); }

/* První a poslední blok se musí odlepit od hlavičky a od patičky. */
.builder-section:first-child { margin-top: var(--ec-8); }
.builder-section:last-child,
.builder-cta:last-child { margin-bottom: var(--ec-9); }
/* Hero je pás přes celou šířku a začíná rovnou pod hlavičkou. */
section.hero:first-child { margin-top: 0; }

/* 🔴 STEJNÁ LEVÁ HRANA JAKO NA ZBYTKU WEBU. `.section-inner` měl vlastní
      šířku 1180 px, zatímco hlavička, patička i katalog stojí na
      `--ec-container` (1600). Stránka ze stavebnice tak lícovala jinak než
      všechno kolem — a hero, které `.section-inner` nemá, lícovalo ještě
      jinak. Odtud „nahoře je to vlevo, pod tím na střed". */
.section-inner,
.hero-content {
    width: 100%;
    max-width: var(--ec-container);
    margin-inline: auto;
    padding-inline: var(--ec-gutter);
}

/* -- Nadpisy sekcí ---------------------------------------------------- */
/* 🔴 VELIKOST NADPISU SE TU NEPŘEDEPISUJE. Sekce `heading` vykresluje holé
      `<h2>` BEZ TŘÍDY, takže ho chytá globální `.ec-h2, :where(.ec-page) h2` —
      a to je správně: nadpis na stránce ze stavebnice má vypadat stejně jako
      nadpis kdekoli jinde na webu. Předepsat mu tady vlastní `font-size` by
      znamenalo druhou nadpisovou stupnici, která se s tou hlavní rozejde.

   🔴 CO SE PŘEPSAT MUSÍ, JE HORNÍ MEZERA. Globální pravidlo dává nadpisu
      `margin-top: 64px`, protože počítá s tím, že stojí uprostřed textu.
      Ve stavebnici je ale nadpis vlastní sekcí a o rozestup se stará obal —
      64 px navíc udělalo právě tu díru pod nadpisem. */
.section-heading .section-inner > h1,
.section-heading .section-inner > h2,
.section-heading .section-inner > h3,
.section-heading .section-inner > h4,
.section-header > h1, .section-header > h2, .section-header > h3,
.builder-section-heading,
.section-title { margin-top: 0; }

/* Nadpis uvnitř složené sekce (dlaždice, čísla) je menší — je to popisek
   bloku, ne nadpis stránky. */
/* Velikost, řez i barva se NEPŘEDEPISUJÍ — dědí se z globálního h2/h3,
   aby nadpis časové osy byl stejný jako nadpis „Program" o kus výš.
   Naměřeno 52 px vs. 43 px výšky u dvou h2 na téže stránce. */
.builder-section-heading,
.section-title { margin-bottom: var(--ec-4); }
.section-subtitle { margin: 0 0 var(--ec-6); color: var(--ec-muted); max-width: var(--ec-mira-textu); }
/* Krátká oranžová linka nad nadpisem — týž prvek jako u `.ec-section-head`
   na úvodní stránce, aby si sekce napříč webem odpovídaly. */
.section-title-accent::before {
    content: ""; display: block; width: 56px; height: 2px;
    margin-bottom: var(--ec-3); background: var(--ec-primary);
}
.section-header { margin-bottom: var(--ec-6); }
.section-header-eyebrow {
    font-size: .75rem; letter-spacing: .12em; text-transform: uppercase;
    color: var(--ec-primary); margin-bottom: var(--ec-2);
}

/* -- Text ------------------------------------------------------------- */
/* Výčet krátkých položek ve dvou sloupcích. Jedenáct názvů materiálů pod
   sebou je sloupec přes celou obrazovku, ve kterém se špatně hledá.
   Zapíná se v administraci vlastní CSS třídou sekce (`bs-sloupce`).
   ⚠️ `break-inside: avoid` je nutné — bez něj se delší položka rozlomí
      mezi sloupce a odrážka zůstane osiřelá v tom prvním. */
/* ⚠️ Šířka se hlídá i tady, nezávisle na volbě v editoru. Se `width: full`
      se výčet roztáhl na 1 552 px a na jeden sloupec vyšlo 750 px pro dvě
      slova — to je horší než jeden sloupec. */
.bs-sloupce .builder-text { max-width: 46rem; }
.bs-sloupce .builder-text ul { columns: 2; column-gap: var(--ec-8); }
.bs-sloupce .builder-text li { break-inside: avoid; }
@media (max-width: 720px) { .bs-sloupce .builder-text ul { columns: 1; } }

/* Typografii sdílí s `.ec-prose` (sekce 6), tady jsou jen šířky. */
/* 🔴 JEDNA ČTECÍ MÍRA PRO CELÝ WEB. `.ec-prose` (popis produktu) i text ze
      stavebnice (podmínky, Školení) mají stejných 72 znaků na řádek. Dokud
      měla stavebnice vlastní hodnoty, četly se tytéž odstavce na dvou
      stránkách různě široko a stránka působila „bez designu".

   ⚠️ `narrow` a `full` zůstávají jako volba správce v editoru sekce, ale
      `narrow` je jen mírné zúžení, ne poloviční sloupec. */
.builder-text { max-width: var(--ec-mira-textu); }
.builder-text.text-width-narrow { max-width: calc(var(--ec-mira-textu) - 6rem); }
/* „Plná šířka" má strop: bez něj měly odstavce obchodních podmínek na
   1280 px 1 085 px a ~150 znaků na řádek, což se nedá číst. */
.builder-text.text-width-full   { max-width: calc(var(--ec-mira-textu) * 1.4); }

/* -- Hero sekce ------------------------------------------------------- */
/* 🔴 PÁS PŘES CELOU ŠÍŘKU, NE KARTA S RÁMEČKEM. Jako karta měla hero vlastní
      okraje, takže její text začínal jinde než obsah sekcí pod ní. Pás
      s vodorovnou linkou navazuje na hlavičku a jeho obsah lícuje s ostatními
      sekcemi, protože sdílí týž kontejner (viz `.hero-content` výš). */
.builder-section .hero,
section.hero {
    position: relative; isolation: isolate;
    padding-block: var(--ec-9);
    background: var(--ec-surface);
    border-bottom: 1px solid var(--ec-border);
    background-size: cover; background-position: center;
}
/* Řádek nadpisu i perexu se drží čitelné délky, i když pás jde přes celou
   šířku — jinak by na velkém monitoru měl nadpis přes dvě stě znaků. */
/* Nadpis se drží kratšího řádku než perex — velké písmo unese méně znaků.
   34 rem drží „Práce s dekorativními barvami a omítkami" na třech řádcích;
   při 26 rem se lámalo na čtyři a v širokém pásu to vypadalo zmáčkle. */
/* ⚠️ Renderer píše `hero--align-center` (dvě pomlčky). První verze stylů
      měla `hero-align-center` a hero zůstávalo vlevo, i když v editoru bylo
      „na střed". Název třídy ověřovat ve vygenerovaném HTML, ne odhadem. */
.hero--align-center .hero-content { text-align: center; }
.hero--align-center .hero-actions { justify-content: center; }
/* Vystředěný nadpis unese víc než levý — oko se vrací na střed, ne k okraji. */
.hero--align-center .hero-title    { margin-inline: auto; max-width: 42rem; }
.hero--align-center .hero-subtitle { margin-inline: auto; max-width: 40rem; }
.hero-eyebrow {
    font-size: .75rem; letter-spacing: .12em; text-transform: uppercase;
    color: var(--ec-primary); margin-bottom: var(--ec-3);
}
/* Nadpis se drží kratšího řádku než perex — velké písmo unese méně znaků.
   34 rem drží „Práce s dekorativními barvami a omítkami" na třech řádcích. */
/* 🔴 STEJNÝ ŘEZ A VERZÁLKY JAKO `.ec-h1`. Nadpis stránky ze stavebnice
      (Školení, O nás) byl 700 a malými písmeny, nadpis stránky e-shopu 800
      a verzálkami — dvě podoby H1 na jednom webu. Velikost je o stupeň
      menší, protože stojí na fotce a nese delší větu. */
.hero-title {
    margin: 0 0 var(--ec-4); max-width: 48rem;
    font-family: var(--ec-font-display); font-weight: 800; line-height: 1.06;
    letter-spacing: -.02em; text-transform: uppercase;
    /* Velikost jako `.ec-h1` — o stupeň menší H1 na Školení a O nás
       (32/52 px proti 36/64 px) vypadal jako jiný web. */
    font-size: clamp(2.25rem, 5vw, 4rem); color: var(--ec-text-strong);
}
.hero-subtitle { margin: 0; max-width: 34rem; color: var(--ec-text); font-size: 1.0625rem; line-height: 1.6; }
.hero-actions { display: flex; flex-wrap: wrap; gap: var(--ec-3); margin-top: var(--ec-6); }

/* -- Tlačítka ze stavebnice ------------------------------------------- */
/* Renderer píše `btn btn-primary`. Tvar tlačítka je definovaný jednou
   u `.ec-btn`; tady se zděděná jména jen napojí, aby nevznikl druhý tvar. */
.btn {
    display: inline-flex; align-items: center; justify-content: center; gap: var(--ec-2);
    height: var(--ec-btn-h); padding-inline: var(--ec-5);
    border: 1px solid transparent; border-radius: var(--ec-r-sm);
    font: 600 .9375rem/1 var(--ec-font-body); white-space: nowrap;
    cursor: pointer;
    /* ⚠️ `--ec-t` NEEXISTUJE — tokeny se jmenují `--ec-t-hover` a `--ec-t-expand`.
          Neznámá proměnná v `transition` shodí celou deklaraci a přechod tiše
          nefunguje; nic to nenahlásí, jen tlačítko „skáče". */
    transition: background var(--ec-t-hover) var(--ec-ease),
                border-color var(--ec-t-hover) var(--ec-ease),
                color var(--ec-t-hover) var(--ec-ease);
}
.btn-primary { background: var(--ec-primary); color: #fff; }
.btn-primary:hover { background: var(--ec-accent); }
.btn-secondary, .btn-outline {
    background: transparent; border-color: var(--ec-primary); color: var(--ec-text-strong);
}
.btn-secondary:hover, .btn-outline:hover { background: var(--ec-primary); color: #fff; }
.btn-lg { height: 48px; padding-inline: var(--ec-6); font-size: 1rem; }
.btn-sm { height: var(--ec-ctl-h-sm); padding-inline: var(--ec-4); font-size: .875rem; }

.builder-buttons { display: flex; flex-wrap: wrap; gap: var(--ec-3); }
.buttons-align-center { justify-content: center; }
.buttons-align-right  { justify-content: flex-end; }

/* -- Čísla (stats) ---------------------------------------------------- */
.builder-stats { display: grid; gap: var(--ec-4); grid-template-columns: repeat(4, minmax(0, 1fr)); }
.stats-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.stats-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.stat-item {
    padding: var(--ec-5);
    background: var(--ec-surface);
    border: 1px solid var(--ec-border); border-radius: var(--ec-r-md);
    text-align: center;
}
.stat-number {
    display: flex; align-items: baseline; justify-content: center; gap: 2px;
    font-family: var(--ec-font-display); font-weight: 700; line-height: 1;
    font-size: clamp(1.5rem, 3vw, 2.25rem); color: var(--ec-primary);
}
/* 🔴 JEDNOTKA PATŘÍ K ČÍSLU, TAKŽE MÁ JEHO BARVU. Šedé „Kč" vedle
      oranžové částky vypadalo jako dvě různé informace slepené k sobě —
      zadavatel: „částka je oranžová a Kč bílé, to je divné". Menší velikost
      na odlišení jednotky stačí. */
.stat-prefix, .stat-suffix { font-size: .55em; color: inherit; }
.stat-label { margin-top: var(--ec-2); font-size: .875rem; color: var(--ec-muted); }

/* -- Dlaždice (features, icon_grid) ----------------------------------- */
.builder-features,
.why-us-grid { display: grid; gap: var(--ec-4); grid-template-columns: repeat(3, minmax(0, 1fr)); }
.features-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.features-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
.feature-item,
.why-us-card {
    padding: var(--ec-5);
    background: var(--ec-surface);
    border: 1px solid var(--ec-border); border-radius: var(--ec-r-md);
}
.feature-icon, .why-us-icon { margin-bottom: var(--ec-3); color: var(--ec-primary); }
.feature-icon svg, .why-us-icon svg { display: block; width: 24px; height: 24px; }
.feature-title, .why-us-title {
    margin: 0 0 var(--ec-2);
    font-family: var(--ec-font-display); font-weight: 700; font-size: 1rem; line-height: 1.3;
    color: var(--ec-text-strong);
}
.feature-description, .why-us-desc { margin: 0; color: var(--ec-muted); font-size: .9375rem; line-height: 1.6; }
.feature-link { display: inline-block; margin-top: var(--ec-3); color: var(--ec-primary); }

/* -- Výzva k akci ----------------------------------------------------- */
/* ⚠️ ŽÁDNÉ `padding-block` TADY. O rozestup se stará rytmus sekcí výš
      (`.builder-section + .builder-cta { margin-top: … }`). Tohle pravidlo
      stálo o dvě stě řádků níž, takže tichý přebilo nulu z rytmu a k mezeře
      64 px přidalo dalších 2 × 64 — kolem výzvy k akci pak zely mezery
      dvojnásobné proti zbytku stránky.

   🔴 Poučení: rozestupy jedné komponenty se nesmí nastavovat na dvou místech
      stylopisu. Vyhrává to níž položené a při čtení shora to není vidět. */
/* ⚠️ Výzva k akci je ORÁMOVANÁ KARTA, takže se nezarovnává stejně jako
      ostatní sekce. U nich lícuje OBSAH (uvnitř odsazení), u karty lícuje
      její RÁMEČEK. Se stejným kontejnerem by byl rámeček o šířku odsazení
      dál vlevo než text nad ním.

   🔴 CELÁ KOMPONENTA JE POPSANÁ NA JEDNOM MÍSTĚ. Do 1. 9. 2026 byla
      rozdělená na dva bloky vzdálené dvě stě řádků a v tom druhém se skrývalo
      `padding-block`, které přebíjelo rytmus sekcí. Rozdělená komponenta se
      při čtení shora tváří kompletně a chyba je vidět až na obrazovce. */
/* 🔴 `100 %` MÍNUS ODSAZENÍ. S holými 100 % šla karta na telefonu od kraje
      ke kraji (x = 0) a na desktopu ke pravé hraně okna, zatímco obsah nad
      ní začínal o odsazení dál. Rámeček teď lícuje s obsahem sekcí. */
.builder-cta .container {
    width: calc(100% - var(--ec-gutter) * 2);
    max-width: calc(var(--ec-container) - var(--ec-gutter) * 2);
    margin-inline: auto;
    padding: var(--ec-8) var(--ec-6);
    background: var(--ec-surface);
    border: 1px solid var(--ec-border); border-radius: var(--ec-r-lg);
    text-align: center;
}
.builder-cta h2, .builder-cta h3 {
    margin: 0 0 var(--ec-3);
    font-family: var(--ec-font-display); font-weight: 700; color: var(--ec-text-strong);
}
.builder-cta-text { margin: 0 auto var(--ec-5); max-width: 38rem; color: var(--ec-text); }

/* -- Oddělovače ------------------------------------------------------- */
.builder-divider hr { border: 0; border-top: 1px solid var(--ec-border); margin: 0; }
.divider-width-narrow hr { max-width: 220px; margin-inline: auto; }
.builder-spacer { width: 100%; }

/* -- Rozbalovací seznam ----------------------------------------------- */
.accordion-item {
    border: 1px solid var(--ec-border); border-radius: var(--ec-r-md);
    background: var(--ec-surface); margin-bottom: var(--ec-3);
}
.accordion-header {
    padding: var(--ec-4) var(--ec-5); cursor: pointer;
    font-weight: 600; color: var(--ec-text-strong); list-style: none;
}
.accordion-header::-webkit-details-marker { display: none; }
.accordion-body { padding: 0 var(--ec-5) var(--ec-4); color: var(--ec-text); }

/* -- Formulář ze stavebnice ------------------------------------------- */
/* ⚠️ `.form-group` a `.form-row` používá i administrace, ale ta má vlastní
      stylopis a `ecorson.css` se do ní nenačítá. */
/* 🔴 FORMULÁŘ NENÍ OBSAHOVÝ BLOK — NEROZTAHUJE SE PŘES CELOU STRÁNKU.
      Chvíli tu bylo `max-width: none`, aby karta lícovala s dlaždicemi nad ní.
      Vzniklo z toho pole na telefon široké půl metru: nesmysl, který navíc
      ztěžuje vyplnění, protože oko musí skákat přes prázdnou plochu mezi
      popiskem a koncem rámečku.

      Šířka pole má odpovídat tomu, co se do něj píše. 34 rem (544 px) je
      pohodlné pro jméno, e-mail i telefon a zároveň to není nudle.

   🔴 JEDEN SLOUPEC, ne dva. U krátkého formuláře se v jednom sloupci
      vyplňuje rychleji a s menší chybovostí — oko jede jednou svislou
      linkou. Ve dvou sloupcích lidé přehlédnou pole vpravo.

   ⚠️ Prázdné místo vpravo od formuláře je v pořádku a není to táž vada jako
      u odstavce textu. Formulář je nástroj, ne obsah; roztáhnout ho na šířku
      stránky je horší než ho nechat úzký. */
.builder-contact-form {
    display: grid; gap: var(--ec-5);
    max-width: 34rem;
    /* Stejné odsazení ze všech stran — 48 px nahoře proti 32 px po stranách
       dělalo nad nadpisem formuláře prázdný pruh. */
    padding: var(--ec-6);
    background: var(--ec-surface);
    border: 1px solid var(--ec-border); border-radius: var(--ec-r-lg);
}
/* Na telefonu karta formuláře nebere dvojí odsazení — pole začínala
   49 px od kraje, zatímco nadpis sekce nad kartou 16 px. */
@media (max-width: 600px) {
    .builder-contact-form { padding: var(--ec-5) var(--ec-4); }
}
/* Popis nad formulářem bez vlastního horního okraje — přičítal 15 px
   k odsazení karty a nahoře bylo víc místa než po stranách. */
.builder-contact-form .form-description { margin-top: 0; }
.builder-contact-form .form-heading { margin: 0; font-family: var(--ec-font-display); color: var(--ec-text-strong); }

/* 🔴 POLE SKLÁDÁ `.form-fields-grid`, NE `.form-row`. Renderer žádné řádky
      nevytváří — všechna pole hodí do jedné mřížky a šířku každého řekne
      třídou `form-field-width-half` / `-full`. Pravidlo psané na `.form-row`
      se proto neuplatnilo a formulář se skládal do jednoho úzkého sloupce.

   ⚠️ Zjištěno až po vykreslení. Odhadnout strukturu podle jmen tříd v jiných
      formulářích nestačí — tenhle vypadá jinak než pokladna. */
.builder-contact-form .form-fields-grid {
    display: grid; gap: var(--ec-4);
    grid-template-columns: repeat(2, minmax(0, 1fr));
}
/* Vícesloupcová varianta zůstává pro formuláře, které si ji v editoru
   vyžádají šířkou pole `half`. Na Školení mají všechna pole `full`, takže
   se vykreslí pod sebou. */
.builder-contact-form .form-group { display: grid; gap: var(--ec-2); min-width: 0; }
/* Pole na celou šířku (zpráva, souhlasy) i vše, co polem není. */
.builder-contact-form .form-field-width-full,
.builder-contact-form .form-fields-grid > :not(.form-group) { grid-column: 1 / -1; }

@media (max-width: 640px) {
    .builder-contact-form .form-fields-grid { grid-template-columns: minmax(0, 1fr); }
}
.builder-contact-form label {
    font-size: .75rem; letter-spacing: .06em; text-transform: uppercase;
    color: var(--ec-muted);
}
.builder-contact-form input,
.builder-contact-form select,
.builder-contact-form textarea {
    width: 100%;
    height: var(--ec-ctl-h); padding: 0 var(--ec-3);
    background: var(--ec-bg); color: var(--ec-text-strong);
    border: 1px solid var(--ec-border); border-radius: var(--ec-r-sm);
    font: 400 .9375rem/1 var(--ec-font-body);
}
/* Víceřádkové pole si výšku určuje počtem řádků; pevná výška by ho zmrzačila. */
.builder-contact-form textarea { height: auto; min-height: 120px; padding: var(--ec-3); line-height: 1.6; }
.builder-contact-form input:focus,
.builder-contact-form select:focus,
.builder-contact-form textarea:focus { outline: 2px solid var(--ec-primary); outline-offset: 1px; }
.builder-contact-form .form-checkbox {
    display: flex; gap: var(--ec-3); align-items: flex-start;
    text-transform: none; letter-spacing: 0; font-size: .875rem; color: var(--ec-text);
}
.builder-contact-form .form-checkbox input { width: auto; height: auto; flex: none; margin-top: .2em; }

@media (max-width: 860px) {
    .builder-stats,
    .builder-features,
    .why-us-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 560px) {
    .builder-features,
    .why-us-grid { grid-template-columns: minmax(0, 1fr); }
    /* Čísla jsou krátká — dva sloupce. V jednom sloupci byly čtyři údaje
       přes 470 px výšky. */
    .builder-stats { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

/* -- Řádek sekcí (nastavení „Umístění" v editoru) -------------------------
   🔴 JEDNA LEVÁ HRANA PRO CELÝ WEB. Řádek je obyčejný kontejner se stejným
      odsazením jako každá sekce (`--ec-gutter`) a sekce UVNITŘ něj vlastní
      odsazení nemají — jinak by se sčítalo a obsah v řádku začínal o 24 px
      dál než obsah nad ním. Zadavatel: „formulář začíná úplně vlevo, texty
      víc vpravo, popis víc vlevo — to přece musí mít stejný formát."

      společného rodiče: patička dojela na formulář, hrany se rozešly
      a správce to nemohl nastavit jinak než znalostí názvu třídy. Řádek
      má rodiče (`.builder-row` vyrábí renderer z nastavení `column`),
      takže mezera pod ním i zarovnání jsou obyčejné vlastnosti mřížky. */
.builder-row {
    display: grid; gap: var(--ec-7);
    grid-template-columns: minmax(0, 1fr);
    width: 100%; max-width: var(--ec-container);
    margin-inline: auto; padding-inline: var(--ec-gutter);
    align-items: start;
}
.builder-row .section-inner { padding-inline: 0; max-width: none; }
/* ⚠️ Sekce uvnitř řádku je `:last-child` svého sloupce, takže by chytla
      `.builder-section:last-child { margin-bottom: 80px }` (mezera nad
      patičkou). Naměřeno: řádek → další nadpis 144 px místo 64. */
.builder-row .builder-section { margin-top: 0; margin-bottom: 0; }
.builder-section + .builder-row,
.builder-row + .builder-section,
.builder-row + .builder-cta { margin-top: var(--ec-8); }
.section-heading + .builder-row { margin-top: var(--ec-4); }
.builder-row:last-child { margin-bottom: var(--ec-9); }
@media (min-width: 1024px) {
    .builder-row { grid-template-columns: minmax(0, 3fr) minmax(0, 2fr); }
}
.builder-row .builder-contact-form { max-width: none; }
.builder-row__side .builder-text { max-width: none; }
.builder-row__side .builder-stats.stats-cols-2 .stat-item { padding: var(--ec-3) 0; }
.builder-row__side .stats-cols-2 .stat-number { font-size: clamp(1.8rem, 3vw, 2.6rem); }

/* -- Kontaktní údaje (sekce contact_info) -------------------------------
   Stejné zarovnání jako patička: ikona má výšku řádku, text vedle ní.
   Viz `web-ikony-zarovnani`, bod 6. */
.contact-info {
    list-style: none; margin: 0; padding: 0;
    display: grid; gap: var(--ec-4);
    font-size: 1.0625rem; line-height: 1.5;
}
.contact-info li { display: flex; align-items: flex-start; gap: var(--ec-4); }
.contact-info svg { display: block; width: 20px; height: 1.5em; flex: none; color: var(--ec-primary); }
.contact-info li > span { min-width: 0; }
.contact-info a { color: var(--ec-text-strong); }
.contact-info a:hover { color: var(--ec-primary); }
.contact-info-muted { color: var(--ec-muted); font-size: .9375rem; }

/* -- Kroky (timeline) ---------------------------------------------------- */
.workflow-timeline {
    position: relative;
    display: grid; gap: var(--ec-5);
    grid-template-columns: repeat(4, minmax(0, 1fr));
}
/* Linka spojující kroky — vede středem čísel. */
.workflow-line {
    position: absolute; left: 0; right: 0; top: 22px; height: 1px;
    background: linear-gradient(to right, var(--ec-primary), var(--ec-border));
}
.workflow-step { position: relative; padding-top: var(--ec-7); }
.workflow-step-icon:empty { display: none; }
.workflow-step-number {
    position: absolute; top: 0; left: 0;
    display: grid; place-items: center;
    width: 44px; height: 44px; border-radius: 50%;
    background: var(--ec-bg); border: 1px solid var(--ec-primary);
    color: var(--ec-primary);
    font: 700 .875rem/1 var(--ec-font-display); letter-spacing: .04em;
}
.workflow-step-title {
    margin: 0 0 var(--ec-2);
    font: 700 1.0625rem/1.3 var(--ec-font-display); color: var(--ec-text-strong);
}
.workflow-step-desc { margin: 0; color: var(--ec-muted); font-size: .9375rem; line-height: 1.6; }
@media (max-width: 900px) {
    .workflow-timeline { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .workflow-line { display: none; }
}
@media (max-width: 520px) { .workflow-timeline { grid-template-columns: minmax(0, 1fr); } }

/* -- Velká čísla (O nás) ------------------------------------------------- */
.bs-cisla-velka .stat-item { background: none; border: 0; padding: var(--ec-4) 0; text-align: left; }
.bs-cisla-velka .stat-number { justify-content: flex-start; font-size: clamp(2.4rem, 5vw, 4rem); }
.bs-cisla-velka .stat-suffix { font-size: .5em; color: var(--ec-primary); }
.bs-cisla-velka .stat-label { font-size: 1rem; color: var(--ec-text); }
/* Vedle textu (dvojice) jsou čísla ve dvou sloupcích a menší. */

/* -- Odhalení při scrollu ------------------------------------------------
   🔴 Renderer už značky `data-animate` PÍŠE (timeline, mřížky) — jen je nikdo
      neobsluhoval. Prvek začíná posunutý a průhledný, `ecorson.js` mu po
      najetí do obrazu přidá `is-in`.

   🔴 Bez JavaScriptu MUSÍ být všechno vidět. Proto je výchozí stav
      neprůhledný a skrývá se až pod `.js` na `<html>`, kterou nastavuje
      skript. Kdyby se skrývalo v CSS napřímo, návštěvník s vypnutým skriptem
      by dostal prázdnou stránku.

   ⚠️ Kdo má v systému vypnuté animace, dostane obsah rovnou. */
.js [data-animate] {
    opacity: 0; transform: translateY(18px);
    transition: opacity .6s var(--ec-ease), transform .6s var(--ec-ease);
    transition-delay: var(--animate-delay, 0ms);
}
.js [data-animate].is-in { opacity: 1; transform: none; }
/* Celé sekce s třídou `bs-animace` — obsah se odhalí jako celek. */
.js .bs-animace > .section-inner {
    opacity: 0; transform: translateY(18px);
    transition: opacity .6s var(--ec-ease), transform .6s var(--ec-ease);
}
.js .bs-animace.is-in > .section-inner { opacity: 1; transform: none; }
@media (prefers-reduced-motion: reduce) {
    .js [data-animate], .js .bs-animace > .section-inner { opacity: 1; transform: none; transition: none; }
}

/* =========================================================
   11b. ONLINE VIDEA (modul eshop-videa)
   Karta kurzu je TÁŽ komponenta jako karta produktu, jen s modifikátorem
   `--course`. Přehrávač, osnova a účet mají vlastní prvky. Všechno na
   tokenech; žádná nová barva, žádný nový radius.
   ========================================================= */

/* ── Drobné modifikátory nadpisů/odstavců, které v šablonách chyběly
      a řešily se inline stylem (`style="margin-top:0"`). Tady jednou. */
.ec-h3--first { margin-top: 0; }
.ec-h1--sm    { font-size: clamp(1.6rem, 3vw, 2.4rem); }
.ec-h2--tight { margin-top: var(--ec-5); }
.ec-p--last   { margin-bottom: 0; }

/* ── Karta kurzu ─────────────────────────────────────────── */
/* 🔴 `auto-fill`, NE `auto-fit`. Katalog má `ec-grid--3` s `auto-fit`, které
      při jediné položce roztáhne kartu přes celou šířku — u produktů se to
      nestane (je jich 24), u kurzů zpočátku bude jeden, a jedna karta přes
      1 270 px s obalem 4:3 dala 950 px vysokou plochu. `auto-fill` drží
      sloupce, i když jsou prázdné. */
.ec-grid--courses { grid-template-columns: repeat(auto-fill, minmax(min(300px, 100%), 1fr)); }
.ec-product-card--course .ec-product-card__media { position: relative; }
.ec-product-card--course .ec-product-card__img { aspect-ratio: 16 / 9; object-fit: cover; }
/* Trojúhelník „přehrát" přes obal — říká na první pohled, že je to video,
   ne produkt. Leží POD roztaženým odkazem karty, klik projde na detail. */
.ec-product-card__play {
    position: absolute; left: 50%; top: 50%; translate: -50% -50%;
    display: grid; place-items: center;
    width: 52px; height: 52px;
    background: color-mix(in srgb, var(--ec-bg) 72%, transparent);
    color: var(--ec-text-strong);
    border: 1px solid var(--ec-border-strong);
    border-radius: var(--ec-r-pill);
    pointer-events: none;
    transition: background var(--ec-t-hover) var(--ec-ease), color var(--ec-t-hover) var(--ec-ease);
}
.ec-product-card__play svg { display: block; width: 22px; height: 22px; margin-left: 2px; }
.ec-product-card--course:hover .ec-product-card__play { background: var(--ec-primary); color: #fff; }
.ec-product-card__meta {
    display: flex; flex-wrap: wrap; gap: var(--ec-2);
    margin: 0 0 var(--ec-3);
    font-size: .8125rem; color: var(--ec-faint);
}
.ec-product-card--course.is-inactive .ec-product-card__media { opacity: .45; }
.ec-price__old {
    display: block; margin-top: 2px;
    font: 400 .8125rem/1.3 var(--ec-font-body); color: var(--ec-faint);
}
.ec-price--lg { font-size: 1.75rem; margin: 0 0 var(--ec-2); }

/* ── Přehrávač ───────────────────────────────────────────── */
.ec-player { min-width: 0; }
/* Poměr 16:9 přes `aspect-ratio`, iframe roztažený přes celý rámeček —
   žádný padding-top trik, ten se s `min-width: 0` v gridu pere. */
.ec-player__frame {
    position: relative; aspect-ratio: 16 / 9;
    background: #000;
    border-radius: var(--ec-r-lg);
    overflow: hidden;
}
.ec-player__frame iframe { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; }
.ec-player__caption {
    display: flex; align-items: center; gap: var(--ec-3);
    margin: var(--ec-3) 0 0;
    font-size: .875rem; color: var(--ec-muted);
}

/* ── Osnova na detailu (co kurz obsahuje) ────────────────── */
.ec-course-outline { margin-bottom: var(--ec-5); }
.ec-course-outline__chapter { margin: 0 0 var(--ec-3); }
.ec-course-outline__item .ec-layer__name { display: inline-flex; align-items: center; gap: var(--ec-2); }
.ec-course-outline__item .ec-layer__name a { color: inherit; }
.ec-course-outline__item .ec-layer__name a:hover { color: var(--ec-accent); }
.ec-course-outline__ico { display: block; width: 18px; height: 18px; flex: none; color: var(--ec-faint); }
.ec-course-outline__item.is-preview .ec-course-outline__ico { color: var(--ec-success); }
.ec-course-outline__item .ec-layer__meta { display: inline-flex; align-items: center; gap: var(--ec-3); }
/* Název lekce, štítek a čas na jedné ose (`baseline` posadil název o 5 px
   výš než štítek). Na úzkém displeji jde štítek s časem pod název, místo
   aby název lámal na dva řádky. */
.ec-course-outline__item .ec-layer__head { align-items: center; flex-wrap: wrap; row-gap: var(--ec-1); }

/* Fakta o kurzu v postranním panelu (počet videí, délka, přístup). */
.ec-course-facts {
    list-style: none; margin: var(--ec-5) 0 0; padding: var(--ec-4) 0 0;
    border-top: 1px solid var(--ec-border);
    display: grid; gap: var(--ec-2);
    font-size: .875rem; color: var(--ec-muted);
}
.ec-course-facts li::before { content: "·"; margin-right: var(--ec-2); color: var(--ec-accent); }

/* ── Účet: přihlášení (úzký sloupec) ─────────────────────── */
.ec-account-narrow { max-width: 480px; }

/* ── Účet: přehrávač kurzu ───────────────────────────────── */
/* Přehrávač dostane víc místa než detail produktu — osnova vpravo je užší. */
.ec-watch { grid-template-columns: minmax(0, 1fr) minmax(0, 340px); }
.ec-watch__nav { margin-top: var(--ec-5); justify-content: space-between; }
.ec-watch__outline .ec-card { max-height: calc(100vh - var(--ec-header-h) - var(--ec-8)); overflow: auto; }

.ec-course-list { list-style: none; margin: 0 0 var(--ec-4); padding: 0; }
.ec-course-list__item a {
    display: grid; grid-template-columns: 18px minmax(0, 1fr) auto; align-items: center; gap: var(--ec-2);
    padding: var(--ec-2) var(--ec-2);
    border-radius: var(--ec-r-md);
    color: var(--ec-text);
    text-decoration: none;
    font-size: .9rem; line-height: 1.35;
}
.ec-course-list__item a:hover { background: var(--ec-surface-2); color: var(--ec-text-strong); }
.ec-course-list__item.is-active a { background: var(--ec-surface-3); color: var(--ec-text-strong); font-weight: 600; }
.ec-course-list__mark {
    display: block; width: 14px; height: 14px;
    border: 1.5px solid var(--ec-faint); border-radius: var(--ec-r-pill);
}
/* Fajfka u dokoukaného; u aktivního plné kolečko v barvě značky. */
.ec-course-list__item.is-done .ec-course-list__mark {
    border-color: var(--ec-success); background: var(--ec-success);
    background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='3.5' stroke-linecap='round' stroke-linejoin='round'><path d='M5 12l5 5 9-10'/></svg>");
    background-size: 10px; background-position: center; background-repeat: no-repeat;
}
.ec-course-list__item.is-active .ec-course-list__mark { border-color: var(--ec-primary); background-color: var(--ec-primary); }
.ec-course-list__title { min-width: 0; overflow-wrap: anywhere; }
.ec-course-list__time { font-size: .75rem; color: var(--ec-faint); }

/* Tečka „jste přihlášeni" u ikony účtu v hlavičce — místo čísla. */
.ec-cart-count--dot { min-width: 8px; width: 8px; height: 8px; padding: 0; }
.ec-cart-link.is-on { color: var(--ec-accent); }

@media (max-width: 1024px) {
    .ec-watch { grid-template-columns: minmax(0, 1fr); }
    .ec-watch__outline .ec-card { max-height: none; }
}
@media (prefers-reduced-motion: reduce) {
    .ec-product-card__play { transition: none; }
}

/* =========================================================
   11b2. PRŮVODCE KALKULACÍ — vícekrokové okno (16. 9. 2026)
   Plocha → Barva → Co budete potřebovat.
   (Krok „Dekor" tu do 16. 9. 2026 byl — zrušen, nevracet.)

   🔴 BEZ SKRIPTU ŽÁDNÉ OKNO. `.ec-wizard` je obyčejný blok v pravém
      sloupci a kroky jsou pod sebou. Okno (`.is-modal`) a skrývání kroků
      přidává `ecorson.js` — kdo skript nemá, nakoupí pořád.

   ⚠️ Panel NEROLUJE CELÝ. Hlavička s kroky i spodní lišta s tlačítky
      stojí, roluje jen tělo. Jinak by se u dlouhého rozpisu materiálu
      „Další krok" i křížek odjely z obrazovky.
   ========================================================= */
.ec-wizard-teaser__price {
    margin: 0 0 var(--ec-4);
    font: 700 1.35rem/1.2 var(--ec-font-display); color: var(--ec-text-strong);
}

.ec-wizard__head {
    display: flex; align-items: flex-start; justify-content: space-between; gap: var(--ec-4);
    margin-bottom: var(--ec-4);
}
.ec-wizard__title { min-width: 0; }
.ec-wizard__product {
    margin: var(--ec-1) 0 0;
    font: 700 1.3rem/1.25 var(--ec-font-display); color: var(--ec-text-strong);
}
.ec-wizard__close {
    flex: none;
    display: inline-flex; align-items: center; justify-content: center;
    width: var(--ec-ctl-h); height: var(--ec-ctl-h); padding: 0;
    background: transparent; color: var(--ec-muted);
    border: 1px solid var(--ec-border); border-radius: var(--ec-r-pill);
    cursor: pointer;
    transition: color var(--ec-t-hover) var(--ec-ease), border-color var(--ec-t-hover) var(--ec-ease);
}
.ec-wizard__close svg { display: block; width: 18px; height: 18px; }
.ec-wizard__close:hover { color: var(--ec-text-strong); border-color: var(--ec-primary); }
.ec-wizard__close:focus-visible { outline: 2px solid var(--ec-primary); outline-offset: 2px; }

/* Ukazatel kroků: číslo v kolečku + název, hotové kroky oranžově. */
.ec-wizard__steps {
    display: flex; flex-wrap: wrap; gap: var(--ec-2) var(--ec-4);
    margin: 0 0 var(--ec-5); padding: 0 0 var(--ec-4);
    list-style: none;
    border-bottom: 1px solid var(--ec-border);
}
.ec-wizard__stepnav { display: flex; color: var(--ec-faint); }
/* Krok je tlačítko — zadavatel nechtěl chodit zpět jen přes „Zpět". */
.ec-wizard__stepbtn {
    display: inline-flex; align-items: center; gap: var(--ec-2);
    min-height: var(--ec-ctl-h-sm); padding: 0 var(--ec-2) 0 0;
    background: transparent; border: 0; border-radius: var(--ec-r-pill);
    color: inherit; font: 600 .8125rem/1 var(--ec-font-body);
    cursor: pointer;
    transition: color var(--ec-t-hover) var(--ec-ease);
}
.ec-wizard__stepbtn:hover { color: var(--ec-text-strong); }
.ec-wizard__stepbtn:focus-visible { outline: 2px solid var(--ec-primary); outline-offset: 2px; }
.ec-wizard__stepnum {
    display: inline-flex; align-items: center; justify-content: center;
    flex: none; width: 24px; height: 24px;
    border: 1px solid var(--ec-border-strong); border-radius: var(--ec-r-pill);
    font-size: .75rem;
}
.ec-wizard__stepnav.is-active { color: var(--ec-text-strong); }
.ec-wizard__stepnav.is-active .ec-wizard__stepnum { background: var(--ec-primary); border-color: var(--ec-primary); color: #fff; }
.ec-wizard__stepnav.is-done { color: var(--ec-muted); }
.ec-wizard__stepnav.is-done .ec-wizard__stepnum { border-color: var(--ec-primary); color: var(--ec-accent); }

.ec-wizard__step + .ec-wizard__step { margin-top: var(--ec-6); }
.ec-wizard__step[hidden] { display: none; }
.ec-wizard__steptitle {
    margin: 0 0 var(--ec-4);
    font: 700 1.125rem/1.3 var(--ec-font-display); color: var(--ec-text-strong);
}

/* Telefon místo rozpočtu. */
.ec-wizard__call { margin: var(--ec-5) 0 0; }
.ec-wizard__phone {
    display: inline-flex; align-items: center; gap: var(--ec-1);
    line-height: 1; vertical-align: middle;
    color: var(--ec-accent); font-weight: 700; white-space: nowrap; text-decoration: none;
}
.ec-wizard__phone svg { display: block; width: 16px; height: 16px; flex: none; }
.ec-wizard__phone:hover { text-decoration: underline; }

/* Spodní lišta: hláška vlevo, Zpět a Další krok vpravo. */
.ec-wizard__nav {
    display: flex; align-items: center; justify-content: flex-end; gap: var(--ec-3);
    margin-top: var(--ec-5); padding-top: var(--ec-4);
    border-top: 1px solid var(--ec-border);
}
/* `[hidden]` musí vyhrát nad vlastním `display` prvků — bez skriptu se
   ukazatel kroků, křížek ani lišta nemají ukázat. */
.ec-wizard__nav[hidden], .ec-wizard__nav [hidden],
.ec-wizard__steps[hidden], .ec-wizard__close[hidden] { display: none; }
.ec-wizard__error { margin: 0 auto 0 0; color: var(--ec-warning); }
.ec-wizard__error:not(.is-visible) { visibility: hidden; }

/* ── Okno (jen se skriptem) ───────────────────────────── */
.ec-wizard.is-modal { display: none; }
.ec-wizard.is-modal.is-open {
    position: fixed; inset: 0; z-index: var(--ec-z-modal);
    display: flex; align-items: center; justify-content: center;
    padding: var(--ec-5);
    background: var(--ec-overlay);
}
.ec-wizard.is-modal .ec-wizard__panel {
    display: grid; grid-template-rows: auto auto minmax(0, 1fr) auto;
    width: 100%; max-width: 760px;
    max-height: calc(100vh - 2 * var(--ec-5));
    max-height: calc(100dvh - 2 * var(--ec-5));
    box-shadow: var(--ec-shadow-pop);
}
.ec-wizard.is-modal .ec-wizard__body {
    min-height: 0; overflow-y: auto;
    /* Místo pro fokusový obrys a posuvník, ať se neořízne o hranu. */
    margin-inline: calc(-1 * var(--ec-2)); padding-inline: var(--ec-2);
    scrollbar-width: thin; scrollbar-color: var(--ec-primary) transparent;
}
.ec-wizard.is-modal .ec-wizard__step + .ec-wizard__step { margin-top: 0; }
/* Stránka pod oknem neroluje. */
html.ec-wizard-lock, html.ec-wizard-lock body { overflow: hidden; }

@media (max-width: 768px) {
    /* Na telefonu okno přes celou obrazovku — rámeček kolem by jen ubral místo. */
    .ec-wizard.is-modal.is-open { padding: 0; align-items: stretch; }
    .ec-wizard.is-modal .ec-wizard__panel {
        max-width: none; max-height: none; height: 100%;
        border-radius: 0; border: 0; padding: var(--ec-4);
    }
    .ec-wizard__steps { gap: var(--ec-2) var(--ec-3); }
    /* Na úzkém displeji jen čísla, název má jen aktivní krok. */
    .ec-wizard__stepnav:not(.is-active) .ec-wizard__steplabel { display: none; }
    .ec-wizard__nav { flex-wrap: wrap; }
    .ec-wizard__nav .ec-btn { flex: 1 1 0; min-width: 0; }
    .ec-wizard__error { flex: 1 0 100%; margin: 0; }
    .ec-wizard__error:not(.is-visible) { display: none; }
}

@media (prefers-reduced-motion: reduce) {
    .ec-wizard__close, .ec-wizard__stepbtn { transition: none; }
}


/* =========================================================
   11b3. NAČÍTÁNÍ — jedna značka pro celý web
   🔴 „Něco se děje" musí být vidět všude stejně a nesmí hýbat rozvržením:
      kolečko sedí UVNITŘ už vyhrazeného místa, nikdy ho nevytváří.
   ========================================================= */
.ec-spinner {
    display: block; flex: none;
    width: 28px; height: 28px; border-radius: 50%;
    border: 2px solid var(--ec-border-strong);
    border-top-color: var(--ec-primary);
    animation: ec-spin 700ms linear infinite;
}
.ec-loading {
    position: absolute; inset: 0;
    display: flex; flex-direction: column; align-items: center; justify-content: center; gap: var(--ec-3);
    color: var(--ec-muted); font-size: .8125rem;
}

/* Oblast, která se překresluje ze serveru (rozpis kalkulačky). Během
   dotazu obsah zešedne a nad ním se točí kolečko; výška se nemění.
   ⚠️ Kolečko se ukáže až po 150 ms — rychlá odpověď tak nebliká. */
.ec-busy-area { position: relative; }
/* Zámek výšky během načítání (`zamkniVysku()` v ecorson.js). */
.ec-busy-area.is-locked { min-height: var(--ec-busy-h, 0px); }
.ec-busy-area > * { transition: opacity var(--ec-t-hover) var(--ec-ease); }
.ec-busy-area[aria-busy="true"] > * { opacity: .4; }
.ec-busy-area::after {
    content: "";
    position: absolute; top: 72px; left: 50%;
    width: 28px; height: 28px; margin-left: -14px; border-radius: 50%;
    border: 2px solid var(--ec-border-strong); border-top-color: var(--ec-primary);
    opacity: 0; visibility: hidden; pointer-events: none;
    animation: ec-spin 700ms linear infinite;
}
.ec-busy-area[aria-busy="true"]::after {
    opacity: 1; visibility: visible;
    transition: opacity 120ms linear 150ms;
}

/* ── Rozpis „Co budete potřebovat" ────────────────────────
   Sbalený pod šipkou NA VŠECH ZAŘÍZENÍCH, aby byla celková cena vidět hned
   bez rolování. Zadavatel 16. 9. 2026 nejdřív chtěl sbalení „když to nebude
   na počítači", pak „i na PC" — rozdíl mezi zařízeními tu proto není.
   🔴 Výška se animuje přes `grid-template-rows` 1fr ↔ 0fr — `height: auto`
      animovat nejde a `max-height` s odhadem by u dlouhého seznamu useklo
      konec nebo zpomalilo začátek.
   ⚠️ Bez skriptu zůstane rozbalený (třídu `is-collapsed` dává skript). */
.ec-need { margin-bottom: var(--ec-2); }
.ec-need__toggle {
    display: flex; align-items: center; gap: var(--ec-3);
    width: 100%; min-height: 44px; margin: 0 0 var(--ec-3); padding: 0 var(--ec-3);
    background: var(--ec-surface-2); color: var(--ec-text-strong);
    border: 1px solid var(--ec-border); border-radius: var(--ec-r-md);
    text-align: left; cursor: pointer;
    transition: border-color var(--ec-t-hover) var(--ec-ease);
}
.ec-need__toggle:hover { border-color: var(--ec-border-strong); }
.ec-need__toggle:focus-visible { outline: 2px solid var(--ec-primary); outline-offset: 2px; }
.ec-need__title {
    font: 600 .6875rem/1.2 var(--ec-font-body); letter-spacing: .09em;
    text-transform: uppercase; color: var(--ec-muted);
}
.ec-need__count { display: block; margin-left: auto; color: var(--ec-muted); font-size: .8125rem; }
.ec-need__chevron { display: block; flex: none; width: 20px; height: 20px; transition: transform var(--ec-t-expand) var(--ec-ease); }
.ec-need:not(.is-collapsed) .ec-need__chevron { transform: rotate(180deg); }
.ec-need__body {
    display: grid; grid-template-rows: 1fr;
    transition: grid-template-rows var(--ec-t-expand) var(--ec-ease);
}
.ec-need.is-collapsed .ec-need__body { grid-template-rows: 0fr; }
.ec-need__inner { min-height: 0; overflow: hidden; }
/* Mezera pod hlavičkou jen u rozbaleného — sbalený nemá pod čím dělat díru. */
.ec-need.is-collapsed .ec-need__toggle { margin-bottom: 0; }
.ec-need + .ec-summary__total { margin-top: var(--ec-4); }

@media (prefers-reduced-motion: reduce) {
    .ec-spinner, .ec-busy-area::after { animation: none; }
    .ec-need__body, .ec-need__chevron, .ec-need__toggle { transition: none; }
}

/* =========================================================
   11c. PŘIDÁNÍ DO KOŠÍKU NA POZADÍ
   Let obrázku do ikony, poskočení počítadla, hláška dole, stav tlačítka.
   Pohyb samotný počítá skript (Web Animations), tady je jen vzhled a to,
   co jde vyjádřit přechodem.
   ========================================================= */

/* Létající kopie obrázku (nebo tečka, když obrázek není). Pozice a rozměr
   nastaví skript, protože závisí na tom, odkud let začíná. */
.ec-fly {
    position: fixed; z-index: var(--ec-z-modal);
    display: block;
    object-fit: cover;
    border-radius: var(--ec-r-lg);
    box-shadow: var(--ec-shadow-pop);
    pointer-events: none;
    will-change: transform, opacity;
}
span.ec-fly { background: var(--ec-primary); border-radius: var(--ec-r-pill); }

/* Ikona košíku po dopadu poskočí; třídu skript sundá a znovu nasadí,
   aby se animace spustila i podruhé. */
.ec-cart-link.is-bump { animation: ec-bump 480ms var(--ec-ease); }
.ec-cart-link.is-bump .ec-cart-count { animation: ec-bump-badge 480ms var(--ec-ease); }
@keyframes ec-bump {
    0%   { transform: scale(1); }
    35%  { transform: scale(1.18) rotate(-6deg); }
    70%  { transform: scale(.96) rotate(3deg); }
    100% { transform: scale(1); }
}
@keyframes ec-bump-badge {
    0%   { transform: scale(1); }
    40%  { transform: scale(1.6); background: var(--ec-accent); }
    100% { transform: scale(1); }
}

/* Tlačítko během požadavku a po úspěchu — bez změny šířky, aby neskákalo. */
.ec-btn.is-busy { opacity: .7; cursor: progress; }
.ec-btn.is-done { background: var(--ec-success); border-color: var(--ec-success); color: #fff; }

/* ── Okno „Přidáno do košíku" ─────────────────────────────
   Nativní `<dialog>` otevřený `showModal()`. Na mobilu přilepené
   ke spodní hraně (na dosah palce), tlačítka pod sebou. */
.ec-added {
    width: min(540px, calc(100vw - 2 * var(--ec-4)));
    max-width: none; padding: 0; margin: auto;
    background: transparent; border: 0; color: var(--ec-text);
    overflow: visible;
}
.ec-added::backdrop { background: var(--ec-overlay); }
.ec-added[open] .ec-added__panel { animation: ec-added-in 260ms var(--ec-ease); }
.ec-added[open]::backdrop { animation: ec-added-fade 200ms linear; }
@keyframes ec-added-in {
    from { opacity: 0; transform: translateY(12px) scale(.98); }
    to   { opacity: 1; transform: none; }
}
@keyframes ec-added-fade { from { opacity: 0; } to { opacity: 1; } }

.ec-added__panel {
    display: grid; gap: var(--ec-4);
    padding: var(--ec-5);
    background: var(--ec-surface);
    border: 1px solid var(--ec-border-strong); border-radius: var(--ec-r-lg);
    box-shadow: var(--ec-shadow-pop);
}
.ec-added__head { display: flex; align-items: center; gap: var(--ec-3); }
.ec-added__check {
    display: inline-flex; align-items: center; justify-content: center; flex: none;
    width: 36px; height: 36px; border-radius: var(--ec-r-pill);
    background: var(--ec-success-soft); color: var(--ec-success);
}
.ec-added__check svg { display: block; width: 20px; height: 20px; }
.ec-added__title { margin: 0; font: 700 1.25rem/1.25 var(--ec-font-display); color: var(--ec-text-strong); }

.ec-added__item {
    display: flex; align-items: center; gap: var(--ec-3); min-width: 0;
    padding: var(--ec-3);
    background: var(--ec-surface-2);
    border: 1px solid var(--ec-border); border-radius: var(--ec-r-md);
}
.ec-added__img { flex: none; width: 56px; height: 56px; object-fit: cover; border-radius: var(--ec-r-sm); }
.ec-added__img[hidden] { display: none; }
.ec-added__text { min-width: 0; }
.ec-added__name { margin: 0 0 var(--ec-1); font-weight: 600; color: var(--ec-text-strong); line-height: 1.3; }

.ec-added__actions { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--ec-3); }
.ec-added__actions .ec-btn { width: 100%; padding-inline: var(--ec-3); white-space: nowrap; }

@media (max-width: 480px) {
    .ec-added { margin-bottom: var(--ec-4); }
    .ec-added__actions { grid-template-columns: minmax(0, 1fr); }
}
@media (prefers-reduced-motion: reduce) {
    .ec-added[open] .ec-added__panel, .ec-added[open]::backdrop { animation: none; }
}

/* Hlášky vpravo dole, nad sebou. `aria-live` čte změny čtečkám. */
.ec-toasty {
    position: fixed; right: var(--ec-5); bottom: var(--ec-5); z-index: var(--ec-z-modal);
    display: grid; gap: var(--ec-2);
    max-width: min(420px, calc(100vw - 2 * var(--ec-5)));
    pointer-events: none;
}
.ec-toast {
    display: flex; align-items: center; justify-content: space-between; gap: var(--ec-4);
    padding: var(--ec-3) var(--ec-4);
    background: var(--ec-surface-3); color: var(--ec-text-strong);
    border: 1px solid var(--ec-border-strong); border-left-width: 4px;
    border-radius: var(--ec-r-md);
    box-shadow: var(--ec-shadow);
    font-size: .9rem; line-height: 1.4;
    pointer-events: auto;
    opacity: 0; transform: translateY(12px);
    transition: opacity 260ms var(--ec-ease), transform 260ms var(--ec-ease);
}
.ec-toast.is-in { opacity: 1; transform: none; }
.ec-toast--ok    { border-left-color: var(--ec-success); }
.ec-toast--chyba { border-left-color: var(--ec-danger); }
.ec-toast__link {
    flex: none;
    color: var(--ec-accent); font-weight: 600; text-decoration: none; white-space: nowrap;
}
.ec-toast__link:hover { text-decoration: underline; }

@media (max-width: 480px) {
    .ec-toasty { left: var(--ec-4); right: var(--ec-4); bottom: var(--ec-4); max-width: none; }
    .ec-toast { flex-wrap: wrap; }
}
@media (prefers-reduced-motion: reduce) {
    .ec-cart-link.is-bump, .ec-cart-link.is-bump .ec-cart-count { animation: none; }
    .ec-toast { transition: none; }
}

/* =========================================================
   11d. ÚČET ZÁKAZNÍKA
   Hlavička s avatarem, přepínač sekcí, dlaždice, seznamy a přihlášení
   službou. Všechno na existujících tokenech a komponentách.
   ========================================================= */

/* ── Hlavička účtu ───────────────────────────────────────── */
.ec-account-head {
    display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between;
    gap: var(--ec-4);
    margin-bottom: var(--ec-5);
}
.ec-account-head__kdo { display: flex; align-items: center; gap: var(--ec-3); min-width: 0; }
.ec-account-head__avatar {
    display: block; width: 44px; height: 44px; flex: none;
    border-radius: var(--ec-r-pill); object-fit: cover;
    background: var(--ec-surface-3);
}
/* Bez fotky písmeno — prázdné kolečko vypadá jako nenačtený obrázek. */
.ec-account-head__avatar--pismeno {
    display: grid; place-items: center;
    background: var(--ec-primary); color: #fff;
    font: 700 1.1rem/1 var(--ec-font-display);
}
.ec-account-head__jmeno { display: block; color: var(--ec-text-strong); }
.ec-account-head__email { display: block; font-size: .875rem; color: var(--ec-muted); overflow-wrap: anywhere; }

/* ── Přepínač sekcí ──────────────────────────────────────── */
/* Vodorovný pás; na úzkém displeji se posouvá do strany, nezalamuje se
   do dvou řádků a nerozhodí tím zbytek stránky. */
.ec-account-nav {
    display: flex; gap: var(--ec-2);
    margin-bottom: var(--ec-6);
    padding-bottom: var(--ec-2);
    border-bottom: 1px solid var(--ec-border);
    overflow-x: auto;
    scrollbar-width: none;
    /* Pravý okraj se rozplývá — na telefonu byla useknutá záložka a nic
       nenaznačovalo, že pás pokračuje. Aktivní záložku do záběru posune
       `ecorson.js`. */
    -webkit-mask-image: linear-gradient(to right, #000 calc(100% - var(--ec-6)), transparent);
    mask-image: linear-gradient(to right, #000 calc(100% - var(--ec-6)), transparent);
}
.ec-account-nav::-webkit-scrollbar { display: none; }
.ec-account-nav__item {
    flex: none;
    padding: var(--ec-2) var(--ec-4);
    border-radius: var(--ec-r-pill);
    color: var(--ec-muted); text-decoration: none;
    font-size: .875rem; font-weight: 600; white-space: nowrap;
    transition: background var(--ec-t-hover) var(--ec-ease), color var(--ec-t-hover) var(--ec-ease);
}
.ec-account-nav__item:hover { background: var(--ec-surface-2); color: var(--ec-text-strong); }
.ec-account-nav__item.is-active { background: var(--ec-primary); color: #fff; }

/* ── Dlaždice na rozcestníku ─────────────────────────────── */
/* Čtyři dlaždice 2 × 2 — s `auto-fit` vyšly na desktopu tři v řadě
   a „Přihlášení" zůstalo samo ve druhém řádku. */
.ec-account-dlazdice { grid-template-columns: repeat(2, minmax(0, 1fr)); }
@media (max-width: 600px) { .ec-account-dlazdice { grid-template-columns: minmax(0, 1fr); } }
.ec-account-dlazdice .ec-card { display: flex; flex-direction: column; }
.ec-account-card__head {
    display: flex; align-items: baseline; justify-content: space-between; gap: var(--ec-3);
    margin-bottom: var(--ec-3);
}
.ec-account-card__vic { font-size: .8125rem; color: var(--ec-accent); text-decoration: none; white-space: nowrap; }
.ec-account-card__vic:hover { text-decoration: underline; }

/* ── Seznamy v dlaždicích ────────────────────────────────── */
.ec-account-list { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--ec-2); }
.ec-account-list__item {
    display: flex; align-items: center; justify-content: space-between; gap: var(--ec-3);
    padding: var(--ec-2) 0;
    border-bottom: 1px solid var(--ec-border);
}
.ec-account-list__item:last-child { border-bottom: 0; }
.ec-account-list__item > a,
.ec-account-list__item > span:first-child { min-width: 0; text-decoration: none; color: inherit; }
.ec-account-list__item > a:hover .ec-account-list__nazev { color: var(--ec-accent); }
.ec-account-list__nazev { display: block; font-weight: 600; color: var(--ec-text-strong); overflow-wrap: anywhere; }
.ec-account-list__meta { display: block; font-size: .8125rem; color: var(--ec-faint); }

/* ── Formulář údajů ──────────────────────────────────────── */
.ec-account-form { display: grid; gap: var(--ec-5); }
.ec-fieldset { border: 0; padding: 0; min-width: 0; margin: 0; }

/* ── Přihlášení službou ──────────────────────────────────── */
.ec-login-sluzby { display: grid; gap: var(--ec-3); margin-bottom: var(--ec-4); }
.ec-login-sluzby__ico { display: block; width: 18px; height: 18px; flex: none; }
/* Tlačítka služeb drží tvar `.ec-btn`, jen mají světlejší ohraničení —
   barvy si nese ikona, jak vyžadují pravidla Googlu i Mety. */
.ec-btn--google:hover, .ec-btn--facebook:hover { border-color: var(--ec-text-strong); color: var(--ec-text-strong); }

/* „nebo" s čárou po stranách */
.ec-login-nebo {
    display: flex; align-items: center; gap: var(--ec-3);
    margin: var(--ec-4) 0;
    color: var(--ec-faint); font-size: .8125rem; text-transform: uppercase; letter-spacing: .08em;
}
.ec-login-nebo::before, .ec-login-nebo::after {
    content: ""; flex: 1 1 auto; height: 1px; background: var(--ec-border);
}

/* ── Pokladna: pruh o účtu ───────────────────────────────── */
.ec-checkout-ucet { margin-bottom: var(--ec-5); }

/* ── Hlavička: text u ikony účtu ─────────────────────────── */
/* Ikona sama nestačí — zákazník netuší, že se dá přihlásit. Text se ale
   na úzkém displeji skryje, jinak by hlavička přetekla (v mobilním panelu
   je tatáž položka slovy). */
.ec-cart-link__text { font-size: .8125rem; font-weight: 600; }
@media (max-width: 1200px) {
    .ec-cart-link__text { display: none; }
}

/* =========================================================
   11e. KARUSELY (dlaždice, pás výhod, karty na úvodní stránce)
   Mřížka s `auto-fit` měnila počet sloupců podle šířky okna, takže při skoro
   každém rozlišení zbyl na druhém řádku JEDEN osamocený prvek, a na mobilu
   se z šesti dlaždic stal metrový sloupec. Karusel obojí řeší.

   🔴 KOLIK JICH JE VIDĚT, ROZHODUJE `--n` TADY, ne JavaScript. Swiper jede
      na `slidesPerView: 'auto'` a jen posouvá; šířku slidu počítá `calc()`
      níž. Jedno místo, kde se rozhoduje o vzhledu.

   🔴 ŽÁDNÉ ŠIPKY ANI TEČKY. Byly tu jeden den a rozhazovaly vzhled: tečky
      pásu výhod seděly uvnitř jeho rámečku, šipky sahaly do karet a nešly
      svisle srovnat. Že se dá s řadou hýbat, říká sám pomalý posun.

   ⚠️ Mezera (`--ec-3` = 12 px) MUSÍ sedět na `spaceBetween` v `ecorson.js`.
      Když se rozejdou, poslední slide v řadě přeteče o rozdíl krát počet mezer.

   ⚠️ `--n` smí být i desetinné. `4.2` znamená „čtyři a kousek pátého".
   ========================================================= */
.ec-karusel { position: relative; }

/* Viewport ořezává jen vodorovně — ven z řady nic nekouká. */
.ec-karusel__viewport { overflow: hidden; }
.ec-karusel .swiper-wrapper { align-items: stretch; }
.ec-karusel .swiper-slide {
    /* `height: auto` — bez něj Swiper všem slidům vnutí výšku nejvyššího
       a `justify-content: flex-end` uvnitř dlaždice pak text odtlačí dolů. */
    height: auto;
    width: calc((100% - (var(--n) - 1) * var(--ec-3)) / var(--n));
}

/* ── Plynulý posun ──────────────────────────────────────── */
/* 🔴 TOHLE JE CELÝ TRIK. Swiper si `transition-duration` nastavuje sám
      (z `speed`), ale průběh bere z CSS — a výchozí `ease` by na každém
      slidu zpomalil a zase se rozjel, takže by z toho bylo cukání, ne plynulý
      pohyb. `linear` udělá souvislý tah; s `autoplay.delay: 0` na sebe
      posuny navazují a řada jede pořád dokola.

      Žádné `!important`: Swiper timing-function inline nenastavuje, takže
      stačí běžná specificita (`web-css-konvence`, pravidlo 2). */
.ec-karusel--plynule .swiper-wrapper { transition-timing-function: linear; }
/* 🔴 OKRAJE PLYNULÉ ŘADY SE ROZPLÝVAJÍ. Řada jede pořád, takže na krajích
      je vždycky kus karty — natvrdo useknutý text („rava zdarma") a samotné
      tlačítko se šipkou bez karty vypadaly jako chyba. Přechod říká, že řada
      pokračuje. `mask-image`, ne překryv: nezakrývá klepnutí. */
.ec-karusel--plynule .ec-karusel__viewport {
    -webkit-mask-image: linear-gradient(to right, transparent 0, #000 var(--ec-7), #000 calc(100% - var(--ec-7)), transparent 100%);
    mask-image: linear-gradient(to right, transparent 0, #000 var(--ec-7), #000 calc(100% - var(--ec-7)), transparent 100%);
}

/* Kopie slidů pro smyčku (doplňuje `ecorson.js`) — vizuálně se neliší,
   jen je čtečky obrazovky přeskočí. Pravidlo tu je proto, aby bylo v kódu
   vidět, že `[data-kopie]` je záměr, ne zapomenutý testovací atribut. */
.ec-karusel [data-kopie] { /* stejný vzhled jako originál */ }

/* ── Dlaždice kategorií ─────────────────────────────────── */
/* Pět v řadě je maximum: při obsahové šířce ~1120 px zbude na název ~123 px
   a „Dekorativní" se v Archivu 15 px (≈88 px) nezalomí uprostřed slova. */
.ec-karusel--dlazdice { --n: 5; }
@media (max-width: 1400px) { .ec-karusel--dlazdice { --n: 4.2; } }
@media (max-width: 1100px) { .ec-karusel--dlazdice { --n: 3.2; } }
@media (max-width: 820px)  { .ec-karusel--dlazdice { --n: 2.3; } }
@media (max-width: 560px)  { .ec-karusel--dlazdice { --n: 1.25; } }

/* ── Pás výhod ──────────────────────────────────────────── */
/* Rámeček a linky si obal převzal po zrušené mřížce `.ec-usp` — vzhled pásu
   zůstává týž, jen se položky posouvají. */
.ec-karusel--usp {
    background: var(--ec-surface);
    border: 1px solid var(--ec-border);
    border-radius: var(--ec-r-lg);
    --n: 5;
}
/* Mezera mezi položkami by pás rozdělila na kartičky — přepážky ji nahrazují,
   proto slide bez odečtu mezery (a `spaceBetween: 0` v šabloně). */
.ec-karusel--usp .swiper-slide { width: calc(100% / var(--n)); }
@media (max-width: 1400px) { .ec-karusel--usp { --n: 4; } }
@media (max-width: 1100px) { .ec-karusel--usp { --n: 3; } }
@media (max-width: 820px)  { .ec-karusel--usp { --n: 2; } }
@media (max-width: 560px)  { .ec-karusel--usp { --n: 1.2; } }

/* ── Karty na úvodní stránce ────────────────────────────── */
.ec-karusel--karty { --n: 4; }
@media (max-width: 1400px) { .ec-karusel--karty { --n: 3.3; } }
@media (max-width: 1100px) { .ec-karusel--karty { --n: 2.4; } }
@media (max-width: 760px)  { .ec-karusel--karty { --n: 1.6; } }
@media (max-width: 520px)  { .ec-karusel--karty { --n: 1.15; } }

/* Karta v karuselu si nese roztažený odkaz (`::after` přes celou plochu).
   Swiper rozliší klik od tahu sám (`preventClicks`), takže se nic nepřidává. */

/* Bez skriptu se Swiper neinicializuje — slidy zůstanou v řadě a posouvají se
   vodorovným scrollem, který prohlížeč umí sám. */
.ec-karusel__viewport:not(.swiper-initialized) .swiper-wrapper {
    display: flex; gap: var(--ec-3); overflow-x: auto;
    scroll-snap-type: x mandatory;
    -webkit-overflow-scrolling: touch;
    /* 🔴 POSUVNÍK SE MUSÍ SKRÝT, JINAK PROBLIKNE. Tenhle stav vidí
          návštěvník pokaždé, než doběhne odložený `ecorson.js` — a měří
          15 px, takže to není jen blýsknutí tří vodorovných posuvníků,
          ale i poskočení layoutu, až se řada o tu výšku zmenší.
          Skrývá se jen LIŠTA — posouvat se dá dál, takže bez skriptu
          zůstávají další položky dosažitelné prstem i kolečkem. */
    scrollbar-width: none;
}
.ec-karusel__viewport:not(.swiper-initialized) .swiper-wrapper::-webkit-scrollbar { display: none; }
.ec-karusel__viewport:not(.swiper-initialized) .swiper-slide { scroll-snap-align: start; flex: none; }

/* ── Šipky mimo karusel (v hlavičce sekce) ───────────── */
/* 🔴 PROTOŽE UVNITŘ ŘADY SE SROVNAT NEDAJÍ. Karty mají různou výšku, takže
      šipka po své středové ose skákala a navíc sahala přes obsah karty
      (zadavatel 4. 9. 2026). V hlavičce sekce má vlastní místo a lícuje
      s odkazem „Zobrazit vše". */
/* ⚠️ Skryté, dokud je `ecorson.js` neoživí — bez skriptu by tlačítka nic
   nedělala. Táhnout se dá i tak, takže se tím nic neztrácí. */
.ec-karusel-ovladani { display: none; }
.ec-karusel-ovladani.is-ready { display: flex; gap: var(--ec-2); }
.ec-karusel-ovladani__btn {
    display: grid; place-items: center;
    width: 40px; height: 40px; padding: 0;
    background: transparent;
    color: var(--ec-text-strong);
    border: 1px solid var(--ec-border-strong);
    border-radius: var(--ec-r-pill);
    cursor: pointer;
    transition: background var(--ec-t-hover) var(--ec-ease),
                border-color var(--ec-t-hover) var(--ec-ease),
                color var(--ec-t-hover) var(--ec-ease),
                opacity var(--ec-t-hover) var(--ec-ease);
}
.ec-karusel-ovladani__btn:hover:not(:disabled) {
    background: var(--ec-primary); border-color: var(--ec-primary); color: #fff;
}
/* ⚠️ Na kraji se tlačítko ZTLUMÍ, ale nezmizí — mizející ovládání
   posouvá to druhé pod prst právě ve chvíli, kdy na ně míří. */
.ec-karusel-ovladani__btn:disabled { opacity: .32; cursor: default; }
/* 🔴 `display: block` — uvnitř gridu se sice prvky blokují samy, ale
      spoléhat na to, že obal zůstane grid, je přesně ten předpoklad,
      kterým se zarovnání rozbije při příštím přestylování. */
.ec-karusel-ovladani__btn svg { display: block; width: 18px; height: 18px; }

@media (max-width: 560px) {
    /* Na mobilu se táhne prstem a šipky by ukrojily z nadpisu. */
    .ec-karusel-ovladani.is-ready { display: none; }
}

/* =========================================================
   12. RESPONSIVE
   Breakpointy 1024 / 768 / 480 — projektová konvence.
   ========================================================= */
@media (max-width: 1024px) {
    .ec-detail { grid-template-columns: minmax(0, 1fr); }
    .ec-summary { position: static; }
    .ec-section { padding-block: var(--ec-8); }
    /* 🔴 76 px bylo málo: „Dekorativní" i „Impregnace" se useknuly uprostřed
          slova (naměřeno 1024 px). Pruh je o kus širší a ubírá se vnitřní
          odsazení — obsahová šířka položky 84 px pojme nejdelší slovo. */
    :root { --ec-rail-w: 108px; }
    .ec-rail { padding-inline: var(--ec-2); }
    .ec-rail__item { padding-inline: var(--ec-1); }
}

@media (max-width: 768px) {
    :root { --ec-gutter: 16px; }
    /* 🔴 NAVIGACE SE NA MOBILU NESKRÝVÁ. Dřív tu stálo `display: none`
          s poznámkou „nahradí ho výsuvné menu" — které nikdy nevzniklo, takže
          bylo celé menu pod 768 px nedostupné. Priority+ navigace tu roli
          plní sama: co se nevejde, je pod tlačítkem „…". Aby tlačítko
          nikdy nezmizelo, má navigace minimální šířku právě na něj. */
    .ec-nav { min-width: 40px; }

    /* 🔴 Levý pruh se na mobilu NESKRÝVÁ, překlápí se do vodorovného pásu.
          Jsou v něm kategorie — schovat ho by znamenalo odříznout hlavní
          cestu do katalogu zrovna tam, kde je nejvíc návštěv. */
    .ec-shell { grid-template-columns: minmax(0, 1fr); background: none; }
    /* Pravý okraj pruhu se rozplývá do pozadí — je tak poznat, že pás
       pokračuje a dá se posunout; useknutý popisek bez přechodu vypadal
       jako chyba (oponentura GPT). `mask-image` místo překryvu, aby přechod
       nezakrýval klepnutí na poslední položku. */
    /* 🔴 NA MOBILU SE PÁS NELEPÍ. Přilepená hlavička + přilepený pás
          kategorií braly 166 px, tedy pětinu každé obrazovky telefonu, a na
          stránce objednávky zbyla na formulář necelá půlka. Pás je hned pod
          hlavičkou na začátku stránky; při scrollu odjede. */
    .ec-rail {
        mask-image: linear-gradient(to right, #000 calc(100% - 40px), transparent);
        -webkit-mask-image: linear-gradient(to right, #000 calc(100% - 40px), transparent);
        position: static;
        height: auto;
        flex-direction: row; gap: var(--ec-1);
        padding: var(--ec-2) var(--ec-3);
        overflow-x: auto; overflow-y: hidden;
        border-right: 0; border-bottom: 1px solid var(--ec-border);
        /* Aby poslední dlaždice nekončila přesně na kraji obrazovky. */
        scroll-padding-inline: var(--ec-3);
    }
    /* Nižší dlaždice — pás je navigace, ne hlavní obsah první obrazovky. */
    .ec-rail__item { flex: none; min-width: 72px; padding: var(--ec-2) var(--ec-3); }
    .ec-rail__sep { display: none; }

    .ec-hero { min-height: 380px; padding-block: var(--ec-8); }
    /* 🔴 TEXT HERO NA PLNOU ŠÍŘKU. `max-width: min(40%, 46rem)` je pro
          desktop, kde text sedí v levé části fotky. Na 390 px dělá 40 %
          sloupek 156 px a nadpis se lámal po písmenech („POV / RCH / Y").
          Naměřeno, ne odhadnuto — úvodní stránka v prvním měření chyběla. */
    .ec-hero__body { max-width: none; }
    /* 🔴 I NADPIS A PEREX MAJÍ VLASTNÍ PROCENTNÍ STROP (60 % / 50 %) — na
          desktopu drží text v levé části fotky, na 300 px z toho je 160 px
          a „ATMOSFÉRU" se láme uprostřed slova. Nestačí uvolnit obal,
          uvolnit se musí každý prvek, který má strop v procentech. */
    /* ⚠️ Dvojitá třída kvůli specificitě: základní pravidlo je
          `.ec-page .ec-hero__title` (0,2,0) a jednoduchý selektor tady by
          prohrál i uvnitř media query — naměřeno: nadpis 60 % i po první
          opravě. Vyhrává specificita, ne pořadí. */
    .ec-page .ec-hero__title, .ec-hero__title,
    .ec-page .ec-hero__lead, .ec-hero__lead { max-width: none; }
    /* 🔴 NA MOBILU JE ZA TEXTEM ORANŽOVÁ STĚNA. Desktopový překryv je slabý
          schválně (text sedí v tmavé části fotky), jenže výřez na výšku tu
          tmavou část odřízne a zvýrazněné slovo v barvě akcentu splyne
          s omítkou. Svislý přechod shora ztmaví jen pás pod textem; dole
          nechá fotku dýchat. */
    .ec-hero-wrap::after {
        background: linear-gradient(to bottom, rgba(13, 10, 8, .74) 0%, rgba(13, 10, 8, .62) 45%, rgba(13, 10, 8, .18) 100%);
    }
    /* 🔴 ČÍSLOVANÉ BODY POD SEBE. V řadě jsou nezalamovací (`white-space:
          nowrap`) a na 390 px měly 584 px — mobilní prohlížeč kvůli nim
          ROZŠÍŘÍ LAYOUT na tu šířku, celou stránku zmenší a vpravo nechá
          černý pruh. Nepozná se to jako přetečení (scrollWidth sedí), pozná
          se to jen tak, že `innerWidth` neodpovídá šířce okna. */
    .ec-hero__points { flex-direction: column; align-items: flex-start; gap: var(--ec-2); margin-top: var(--ec-6); }
    /* Dvě tlačítka vedle sebe i na telefonu: pod sebou natahovala hero
       a dlaždice začínaly až pod ohybem. Každé dostane půlku řádku;
       kdyby se text nevešel, zalomí se na dva řádky, ne na další řádek. */
    .ec-btn-row { display: flex; flex-wrap: wrap; gap: var(--ec-3); }
    .ec-btn-row .ec-btn { flex: 1 1 calc(50% - var(--ec-3)); min-width: 0; padding-inline: var(--ec-3); white-space: normal; height: auto; min-height: var(--ec-btn-h); text-align: center; }
    /* Obrysové tlačítko na fotce: bez podkladu se na světlé omítce ztrácí
       (oponentura, kolo 2). Poloprůhledný tmavý podklad drží čitelnost
       a nechá fotku prosvítat. */
    .ec-hero .ec-btn--outline { background: rgba(13, 10, 8, .35); backdrop-filter: blur(2px); }
    /* Pod 430 px se text jednoho tlačítka lámal na dva sražené řádky
       („PROZKOUMAT / PRODUKTY") a vedlejší zůstal na jednom — dvě různě
       vypadající tlačítka vedle sebe. Na nejužších displejích pod sebe. */
    @media (max-width: 430px) {
        .ec-hero .ec-btn-row .ec-btn { flex-basis: 100%; white-space: nowrap; }
    }
    .ec-hero__point + .ec-hero__point::before { display: none; }

    /* 🔴 Svislé přepážky dávají smysl jen vedle sebe. Pod sebou se místo
          nich kreslí vodorovná linka.

          ⚠️ Přepážka je od 30. 8. 2026 pseudoprvek (70 % výšky), ne
             `border-left`. Kdyby se tu vypínal jen `border-left`, zůstal by
             pseudoprvek a na mobilu by mezi položkami visela svislá čárka
             u levého kraje. Proto se vypíná pseudoprvek. */
    .ec-usp__item + .ec-usp__item::before { display: none; }
    .ec-usp__item + .ec-usp__item { border-top: 1px solid var(--ec-border); }
    .ec-section { padding-block: var(--ec-7); }
    .ec-cart-item { grid-template-columns: 64px minmax(0, 1fr); }
    /* Na mobilu jde název na celou šířku a ovládání pod něj. */
    .ec-cart-item--nomedia { grid-template-columns: minmax(0, 1fr) auto; }
    /* Cena a „Odebrat" v jednom řádku — pod sebou (a tlačítko roztažené
       na celou šířku) dělaly z položky čtyři řádky a 210 px výšky. */
    .ec-cart-item__price {
        grid-column: 1 / -1;
        display: flex; flex-direction: row-reverse; align-items: center; justify-content: space-between; gap: var(--ec-3);
    }
    .ec-cart-item__price .ec-cart-remove { margin-top: 0; }
    /* Text „Odebrat" lícuje s obrázkem nad ním — ghost tlačítko má vnitřní
       odsazení, které by ho posunulo o 12 px doprava. */
    .ec-cart-remove .ec-btn { width: auto; margin-left: calc(var(--ec-3) * -1); }
    /* ⚠️ Tlačítka se tu UŽ NEZVEDAJÍ. Dělá to token `--ec-ctl-h`
          v `@media (pointer: coarse)`, a to SPOLU s poli — kdyby se
          zvedala jen tlačítka, vrátil by se rozdíl mezi polem a tlačítkem,
          kvůli kterému se výška sjednocovala. Odkaz na košík není pole,
          takže ten si vlastní minimum drží dál. */
    .ec-cart-link { min-height: 44px; }
}

@media (max-width: 480px) {
    /* Na mobilu se tlačítka roztáhnou — vedle sebe už se nevejdou. */
    .ec-btn { width: 100%; }
    .ec-btn-row .ec-btn { width: auto; }
    /* 🔴 V patě karty tlačítko NEROZTAHOVAT. Pata je od 15. 9. 2026
          `nowrap` (tlačítko vždy vpravo od ceny) a tlačítko na 100 % pak
          stlačilo cenu na 0 px — „Cena podle plochy" tekla po písmenech
          do výšky 666 px. Chytilo to až druhé kolo kontroly. */
    .ec-product-card__foot .ec-btn { width: auto; }
    .ec-tile { min-height: 150px; }
    .ec-hero { min-height: 320px; }
    .ec-btn, .ec-cart-link { min-height: 48px; }
    .ec-shades { grid-template-columns: repeat(auto-fill, minmax(96px, 1fr)); }
}

@media (prefers-reduced-motion: reduce) {
    *, *::before, *::after {
        animation-duration: .01ms !important;
        transition-duration: .01ms !important;
    }
}
