/* ===========================================================================
   vlasimo-parts.css — GENEROVANÝ SOUBOR, needitovat.
   Vzniká z assets/css/parts/*.css přes tools/build-parts-css.py, které
   pouští deploy.sh. Uprav zdrojovou komponentu a nasaď; ruční změna tady
   se při dalším nasazení ztratí.
   Komponent: 27
   =========================================================================== */

/* ==== account.css ======================================================= */
/* ===========================================================================
   Karty účtu — parts/account-*.php (osm partů, jedna komponenta).

   Kreslí je `woocommerce/myaccount/my-account.php` na dvou místech: nástěnka
   /muj-ucet/ a stránka Extra body /muj-ucet/vernostni-body/. Proto sdílený
   soubor v `assets/css/parts/`, ne `pages/ucet.css` — a proto se musí zapnout
   výčtem v `inc/assets.php` (VLASIMO_PART_CSS = 'account').

   Načítá se za vlasimo-base.css i vlasimo-ui.css, takže tabletová (769–1024)
   a mobilní (≤768) pravidla těchhle karet, přesunutá sem z vlasimo-base.css,
   nepotřebují `!important` — vyhrávají pořadím.

   POZOR na ověřování: sedm z osmi partů má nahoře `return` na podmínku, kterou
   dev instalace nesplňuje (0 bodů, zásoba nedochází, výzva k recenzi je pro
   jinou skupinu). Ve snímcích `tools/css-snap/base/ucet@*.json` proto vůbec
   nejsou a `css-diff.js` je neuhlídá — hodnoty tady nejsou opsané z kaskády,
   ale změřené na lokální replice (party vykreslené mimo WP a vložené do živé
   /muj-ucet/ v Chromiu, computed styly před/po ve třech šířkách).

   Migrace: tools/migrate/24-account-parts.py
   =========================================================================== */

/* --- Sdílené atomy ---------------------------------------------------------
   Stejná deklarace ve dvou a víc partech = jedna třída. Modifikátor jen tam,
   kde se liší pouze barva nebo podklad. */

/* Textový sloupec mezi ikonou a tlačítkem (zásoba, obě výzvy, zpětná vazba). */
.vl-acct-body { flex: 1; min-width: 0; }
/* Řádek „proč jste nespokojeni" má vedle sebe ještě chipy, takže potřebuje
   větší minimum, aby se text nezalomil po dvou znacích. */
.vl-acct-body--wide { min-width: 220px; }

/* Řádek karty zpětné vazby (ikona | text | tlačítka). */
.vl-acct-row { display: flex; align-items: center; gap: 18px; }
.vl-acct-row--wrap { flex-wrap: wrap; }

/* Kolečko ikony 46 px. Varianta `--solid` schválně NEMÁ rámeček. */
.vl-acct-ico { width: 46px; height: 46px; min-width: 46px; border-radius: 50%; display: flex; align-items: center; justify-content: center; }
.vl-acct-ico--green { background: #e4eee6; border: 1px solid #c6dbcb; }
.vl-acct-ico--amber { background: #fdf3c8; border: 1px solid #eddfa0; }
.vl-acct-ico--solid { background: #0d8f46; }

/* Verzálkový nadtitulek karty. */
.vl-acct-kicker { font-size: 11.5px; font-weight: 600; letter-spacing: .1em; text-transform: uppercase; color: #0b7c3d; }
.vl-acct-kicker--amber { color: #8a6a00; }

/* Nadpis a popisek uvnitř karty. `--mt` je odsazení pod nadtitulkem,
   `--lh` prokládání delšího odstavce (obě výzvy). */
.vl-acct-h { font-size: 16px; font-weight: 600; color: #16211c; }
.vl-acct-h--mt { margin-top: 3px; }
.vl-acct-p { font-size: 13.5px; color: #5d6b62; margin-top: 3px; }
.vl-acct-p--lh { line-height: 1.55; }

/* Nadpis celé karty (Jak získat body, Historie bodů). */
.vl-acct-ctitle { font-size: 17px; font-weight: 600; color: #16211c; }

/* Ikona uvnitř tlačítka — bez `display:block` sedí na účaří a knoflík roste. */
.vl-acct-blk { display: block; }

/* Sloupec tlačítko + „Skrýt" vpravo v obou výzvách. */
.vl-acct-acts { display: flex; flex-direction: column; align-items: stretch; gap: 7px; flex: none; }
.vl-acct-hide { height: 28px; display: flex; align-items: center; justify-content: center; font-size: 12.5px; font-weight: 500; color: #8a887f; text-decoration: underline; text-underline-offset: 3px; cursor: pointer; }

/* Obrysové zelené tlačítko (Poslat fotku, Napsat recenzi v poděkování).
   `.vl a { color:#16211c }` (0,1,1) je specifičtější než holá třída a
   `.vl a:hover { color:#0b7c3d }` dřív prohrával s inline stylem — proto
   obojí explicitně. `--center` je varianta se `justify-content`. */
.vl-acct-obtn { height: 46px; padding: 0 22px; border: 1.5px solid #0d8f46; color: #0b7c3d; display: flex; align-items: center; font-size: 14px; font-weight: 600; border-radius: 11px; white-space: nowrap; }
.vl a.vl-acct-obtn, .vl a.vl-acct-obtn:hover { color: #0b7c3d; }
.vl-acct-obtn--center { justify-content: center; }

/* Karta výzvy (recenze / fotka před). Liší se jen rám a podklad. */
.vl-acct-cta { border: 1px solid #e3e0d4; background: #ffffff; border-radius: 18px; padding: 20px 26px; display: flex; align-items: center; gap: 18px; }
.vl-acct-cta--warn { border-color: #eddfa0; background: #fffdf2; }

/* --- Hero Extra bodů (parts/account-points-hero.php) ----------------------- */
.vl-acct-phero { background: #1f4d3a; border-radius: 20px; padding: 26px 30px; display: grid; grid-template-columns: 1fr auto; gap: 24px; align-items: center; }
.vl-acct-phero__label { font-size: 11.5px; font-weight: 600; letter-spacing: .12em; text-transform: uppercase; color: #a9bdb0; }
.vl-acct-phero__row { display: flex; align-items: baseline; gap: 12px; margin-top: 8px; flex-wrap: wrap; }
.vl-acct-phero__num { font-size: 38px; font-weight: 600; color: #ffffff; line-height: 1; }
.vl-acct-phero__eq { font-size: 17px; font-weight: 600; color: #ffd21f; }
/* Bez bodů je místo čísla motivační titulek (menší) a žlutý přepočet bodu. */
.vl-acct-phero__title { font-size: 26px; font-weight: 600; color: #ffffff; line-height: 1.15; }
.vl-acct-phero__sub { font-size: 15px; font-weight: 600; color: #ffd21f; }
.vl-acct-phero__note { font-size: 13px; color: #a9bdb0; margin-top: 10px; line-height: 1.55; }
.vl-acct-phero__acts { display: flex; flex-direction: column; gap: 9px; flex: none; }
.vl-acct-phero__btn { height: 48px; padding: 0 26px; background: #0d8f46; color: #ffffff; display: flex; align-items: center; justify-content: center; font-size: 14.5px; font-weight: 600; border-radius: 11px; box-shadow: 0 3px 0 #075c2e; cursor: pointer; text-decoration: none; white-space: nowrap; }
.vl a.vl-acct-phero__btn, .vl a.vl-acct-phero__btn:hover { color: #ffffff; }
.vl-acct-phero__ghost { height: 44px; padding: 0 26px; border: 1.5px solid #3f6b55; color: #ffffff; display: flex; align-items: center; justify-content: center; font-size: 13.5px; font-weight: 500; border-radius: 11px; cursor: pointer; text-decoration: none; white-space: nowrap; }
.vl a.vl-acct-phero__ghost, .vl a.vl-acct-phero__ghost:hover { color: #ffffff; }

/* --- Karta „Dochází vám zásoba" (parts/account-restock.php) ----------------
   Vlastní markup, ne herbasí `.h-acct-restock` — ten má v vlasimo.css svoje
   třídy a tenhle part je nepoužívá. */
.vl-acct-restock { border: 1px solid #e3e0d4; background: #ffffff; border-radius: 18px; padding: 20px 24px; display: flex; align-items: center; gap: 18px; }
.vl-acct-restock__img { width: 64px; height: 64px; min-width: 64px; border-radius: 12px; border: 1px solid #e3e0d4; background: #f2f1e9; display: flex; align-items: center; justify-content: center; }
/* `img { max-width:100% }` z vlasimo.css je jen (0,0,0,1), třída ho přebije. */
.vl-acct-restock__pic { max-width: 88%; max-height: 88%; object-fit: contain; }
.vl-acct-restock__label { font-size: 12px; font-weight: 600; letter-spacing: .1em; text-transform: uppercase; color: #8a6a00; }
.vl-acct-restock__title { font-size: 15.5px; font-weight: 600; color: #16211c; margin-top: 3px; }
.vl-acct-restock__note { font-size: 13px; color: #5d6b62; margin-top: 3px; }
.vl-acct-restock__btn { height: 48px; padding: 0 22px; background: #0d8f46; color: #ffffff; display: flex; align-items: center; justify-content: center; font-size: 14px; font-weight: 600; border-radius: 11px; box-shadow: 0 3px 0 #075c2e; cursor: pointer; white-space: nowrap; text-decoration: none; }
.vl a.vl-acct-restock__btn, .vl a.vl-acct-restock__btn:hover { color: #ffffff; }

/* --- Karta „Jak získat body" (parts/account-earn.php) ---------------------- */
.vl-acct-earn { border: 1px solid #e3e0d4; background: #ffffff; border-radius: 18px; padding: 22px 26px; scroll-margin-top: 20px; }
.vl-acct-earn__head { display: flex; align-items: baseline; justify-content: space-between; gap: 16px; flex-wrap: wrap; }
.vl-acct-earn__sub { font-size: 12.5px; color: #8a887f; }
.vl-acct-earn__list { display: flex; flex-direction: column; margin-top: 6px; }
.vl-acct-earn__row { display: flex; align-items: baseline; gap: 14px; padding: 13px 0; border-top: 1px solid #f0ede1; }
.vl-acct-earn__pts { background: #fdf3c8; border: 1px solid #eddfa0; color: #8a6a00; border-radius: 999px; padding: 4px 12px; font-size: 12.5px; font-weight: 700; white-space: nowrap; flex: none; }
.vl-acct-earn__body { min-width: 0; }
.vl-acct-earn__name { font-size: 14.5px; font-weight: 600; color: #16211c; }
.vl-acct-earn__desc { font-size: 13px; color: #5d6b62; margin-top: 2px; line-height: 1.55; }
/* Úkol Google — zmenšený `.vl-cta`. Barvu drží `.vl-cta` s !important,
   takže tady jde jen o rozměry; musí ale stát AŽ ZA base.css (stejná
   specificita, rozhoduje pořadí souborů). */
.vl-acct-earn__btn { margin-left: auto; align-self: center; height: 40px; padding: 0 16px; font-size: 13.5px; }
.vl-acct-earn__note { font-size: 12.5px; color: #8a887f; margin-top: 10px; padding-top: 12px; border-top: 1px solid #f0ede1; }

/* --- Karta „Doporučte nás" (parts/account-referral.php) -------------------- */
.vl-acct-ref { border: 1.5px dashed #8fbf9d; background: #f4faf6; border-radius: 18px; padding: 22px 26px; }
.vl-acct-ref__head { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.vl-acct-ref__badge { background: #0d8f46; color: #ffffff; font-size: 11px; font-weight: 700; letter-spacing: .08em; border-radius: 6px; padding: 4px 10px; }
.vl-acct-ref__title { font-size: 16.5px; font-weight: 600; color: #16211c; }
.vl-acct-ref__text { font-size: 14px; color: #3d443e; margin-top: 8px; line-height: 1.6; }
/* Zvýrazněný počet bodů uvnitř přeložené věty — třída je součástí msgid
   (viz tools/i18n/sk.py), po změně jména se musí přegenerovat katalog. */
.vl-acct-ref__hl { font-weight: 600; color: #0b7c3d; }
.vl-acct-ref__row { display: flex; gap: 10px; margin-top: 14px; flex-wrap: wrap; align-items: center; }
.vl-acct-ref__link { background: #ffffff; border: 1.5px dashed #8fbf9d; border-radius: 10px; padding: 11px 18px; font-family: ui-monospace, Menlo, monospace; font-size: 13.5px; font-weight: 700; color: #0b7c3d; }
.vl-acct-ref__copy { height: 44px; padding: 0 20px; background: #16211c; color: #ffd21f; display: flex; align-items: center; justify-content: center; font-size: 13.5px; font-weight: 600; border-radius: 10px; cursor: pointer; }

/* --- Historie bodů (parts/account-points-log.php) -------------------------- */
.vl-acct-log { border: 1px solid #e3e0d4; background: #ffffff; border-radius: 18px; padding: 22px 26px; }
.vl-acct-log__empty { font-size: 14px; color: #5d6b62; margin-top: 10px; }
.vl-acct-log__list { margin-top: 12px; border-top: 1px solid #f0ede1; }
.vl-acct-log__row { display: grid; grid-template-columns: 96px minmax(0, 1fr) auto; gap: 14px; align-items: center; padding: 11px 0; border-bottom: 1px solid #f0ede1; font-size: 14px; }
.vl-acct-log__date { font-size: 13px; color: #8a887f; white-space: nowrap; }
.vl-acct-log__note { color: #16211c; min-width: 0; }
/* Barva podle znaménka — dřív se skládala inline v PHP. */
.vl-acct-log__amt { font-weight: 600; white-space: nowrap; color: #0b7c3d; }
.vl-acct-log__amt--minus { color: #b42318; }

/* --- Výzva k recenzi (parts/account-review-cta.php) ------------------------ */
.vl-acct-rcta__btn { height: 46px; padding: 0 22px; background: #0d8f46; color: #ffffff; display: flex; align-items: center; justify-content: center; font-size: 14px; font-weight: 600; border-radius: 11px; box-shadow: 0 3px 0 #075c2e; white-space: nowrap; }
.vl a.vl-acct-rcta__btn, .vl a.vl-acct-rcta__btn:hover { color: #ffffff; }

/* --- Rychlá zpětná vazba (parts/account-feedback.php) ----------------------
   Čtyři stavy jedné karty; neaktivní mají `hidden`, které vyhrává přes
   `[hidden]{display:none!important}` ve vlasimo.css. */
.vl-acct-fb { border: 1px solid #e3e0d4; background: #ffffff; border-radius: 18px; padding: 20px 26px; }
.vl-acct-fb__hl { font-weight: 600; color: #16211c; }
.vl-acct-fb__ans { display: flex; gap: 10px; flex-wrap: nowrap; }
.vl-acct-fb__yes { height: 46px; padding: 0 26px; background: #0d8f46; color: #ffffff; display: flex; align-items: center; gap: 9px; font-size: 15px; font-weight: 600; border-radius: 11px; box-shadow: 0 3px 0 #075c2e; cursor: pointer; white-space: nowrap; transition: transform .12s ease, box-shadow .12s ease; }
.vl-acct-fb__no { height: 46px; padding: 0 26px; border: 1.5px solid #d5d2c6; color: #3d443e; display: flex; align-items: center; gap: 9px; font-size: 15px; font-weight: 600; border-radius: 11px; cursor: pointer; white-space: nowrap; }
/* Palec dolů = tentýž glyf otočený. */
.vl-acct-fb__flip { transform: rotate(180deg); }
.vl-acct-fb__reasons { display: flex; gap: 8px; flex-wrap: wrap; }
.vl-acct-fb__chip { height: 40px; padding: 0 16px; border: 1.5px solid #d5d2c6; background: #fdfcf8; color: #3d443e; display: flex; align-items: center; font-size: 13.5px; font-weight: 500; border-radius: 999px; cursor: pointer; white-space: nowrap; }
.vl-acct-fb__ask { height: 46px; padding: 0 22px; background: #16211c; color: #ffd21f; display: flex; align-items: center; font-size: 14px; font-weight: 600; border-radius: 11px; cursor: pointer; white-space: nowrap; }

/* ===== Tablet 769–1024 =====================================================
   Přesun z vlasimo-base.css: číslo bodů drželi dva `[style*=]` selektory
   (`font-size:38px; font-weight:600` a jeho delší varianta), oba na 30 px. */
@media (min-width: 769px) and (max-width: 1024px) {
	.vl-acct-phero__num { font-size: 30px; }
}

/* ===== Mobil ≤768 ==========================================================
   Přesun z vlasimo-base.css. Hero bodů se rozpadá pod sebe (text vedle
   tlačítka se na 390 px mačkal do dvou znaků na řádek) a karta zásoby se
   zalamuje: text si drží základ 180 px, tlačítko jde přes celou šířku.
   Typografickou škálu `.vl-dcontent [style*="font-size:38px|26px"]` nese
   teď třída. */
@media (max-width: 768px) {
	.vl-acct-phero { display: block; padding: 20px; }
	.vl-acct-phero > * + * { margin-top: 16px; }
	.vl-acct-phero__num { font-size: 27px; }
	.vl-acct-phero__title { font-size: 20px; }

	.vl-acct-restock { flex-wrap: wrap; }
	.vl-acct-restock__btn { flex: 1 1 100%; }
	/* Text karty zásoby tu ZÁMĚRNĚ nedostává `flex: 1 1 180px`, i když to
	   `.woocommerce-account .vl-dcontent [style*="padding:20px 24px;
	   display:flex"] > [style*="flex:1; min-width:0"]` v base.css předepisuje:
	   pravidlo nemá `!important`, takže s inline `flex:1` (= basis 0 %) vždycky
	   prohrálo a nikdy nic nedělalo. Doplnit ho teď by kartu na 390 px
	   přerovnalo — a to je změna vzhledu, ne migrace. Kdyby ho David chtěl,
	   je to samostatné rozhodnutí. */
}

/* ==== balicky.css ======================================================= */
/* ===========================================================================
   balicky.css — sekce „Balíčky" na výpisu produktů (parts/balicky.php).

   Kreslí se JEN při běžící kampani typu `balicky` (HM_Balicky::data()), a to
   uvnitř `.vl-desktop` v woocommerce/archive-product.php. Mobilní vrstva má
   vlastní markup (`#m-balicky` v parts/shop-mobile.php) a s tímhle souborem
   nemá nic společného.

   Načítání: `inc/assets.php` → konstanta `VLASIMO_PART_CSS`. Seznam je
   výslovný, ne glob — dokud v něm `balicky` není, soubor se nenačítá.
   Pořadí: vlasimo.css → vlasimo-legacy.css → vlasimo-base.css →
   vlasimo-ui.css → parts/*.css → pages/<slug>.css. Proto tady `!important`
   není nikde potřeba: pravidla, která hodnoty držela dřív, mířila na
   `[style*=…]` a po migraci nemají na čem viset.

   Vznik: tools/migrate/23-balicky-promo.py (28 inline stylů → třídy `.vl-bal*`).

   POZOR — sekce se objeví jen s kampaní, takže ji `tools/css-snap/base`
   nezachytil a `css-diff.js` na ni nedosáhne. Hodnoty jsou proto ověřené
   lokální replikou (viz hlavička migračního skriptu): stránka /objednavka/
   stažená z devu, do které se vloží vyrenderovaný part před a po migraci,
   a porovnají se computed styly ve 1440 / 900 / 390 px.

   Responzivní vrstvy přepsané z vlasimo-base.css (pravidla, která tím osiří):
     ~1122  [style*="max-width:1440px; margin:0 auto; padding:52px 48px 56px"]
     ~1123  [style*="margin:0; font-size:30px; …; color:#ffffff"]
   a sdílená pravidla, která na sekci přestanou mířit (ta v base.css ZŮSTÁVAJÍ,
   používají je jiné šablony):
     ~996   .vl-desktop [style*="font-size:30px"]           → nadpis 24 px ≤1024
     ~1113  [style*="max-width:1440px; margin:0 auto"]      → 1024 px na tabletu
     ~1120  [style*="font-size:24px; …; line-height:1"]     → cena 22 px na tabletu
     ~1142  [style*="font-size:24px; font-weight:600; letter-spacing:-.02em"]
   =========================================================================== */

/* --- Rám sekce ------------------------------------------------------------- */
.vl-bal { scroll-margin-top: 64px; background: #1f4d3a; border-top: 1px solid #16382b; }
.vl-bal__in { max-width: 1440px; margin: 0 auto; padding: 52px 48px 56px; }

/* --- Hlavička sekce (kicker · nadpis · „platí do") ------------------------- */
.vl-bal__head { display: flex; align-items: flex-end; justify-content: space-between; gap: 24px; }
.vl-bal__headcol { display: flex; flex-direction: column; gap: 10px; }
.vl-bal__kicker { display: flex; align-items: center; gap: 12px; font-size: 12px; font-weight: 600; letter-spacing: .14em; text-transform: uppercase; color: #ffd21f; }
.vl-bal__kicker-ico { display: block; }
.vl-bal__dot { width: 4px; height: 4px; border-radius: 50%; background: #c99a12; }
.vl-bal__titlerow { display: flex; align-items: center; gap: 18px; }
.vl-bal__title { margin: 0; font-size: 30px; line-height: 1.15; font-weight: 600; letter-spacing: -.02em; color: #ffffff; }
.vl-bal__sub { font-size: 14px; color: #a9bdb0; }
/* Zvýrazněná část podtitulku („ušetříte až …"). Vzniká `strtr()` v PHP, do
   `wp_kses_post()` projde jako <strong class>, ne jako <strong style>. */
.vl-bal__sub-b { font-weight: 600; color: #ffffff; }
.vl-bal__until { font-size: 13px; color: #a9bdb0; white-space: nowrap; }

/* --- Mřížka karet ----------------------------------------------------------
   Počet sloupců = počet karet kampaně (`_hm_bal_products`), tedy hodnota
   z PHP. Množina je v praxi konečná (návrh počítá se třemi, admin vypisuje
   ID ručně), proto modifikátor `--N` jako u `.vl-certs--N`, ne inline styl.
   Základ = 3 sloupce podle návrhu; drží i případný počet mimo rozsah. */
.vl-bal__grid { margin-top: 24px; display: grid; grid-template-columns: repeat(3, 1fr); gap: 15px; }
.vl-bal__grid--1 { grid-template-columns: repeat(1, 1fr); }
.vl-bal__grid--2 { grid-template-columns: repeat(2, 1fr); }
.vl-bal__grid--3 { grid-template-columns: repeat(3, 1fr); }
.vl-bal__grid--4 { grid-template-columns: repeat(4, 1fr); }
.vl-bal__grid--5 { grid-template-columns: repeat(5, 1fr); }
.vl-bal__grid--6 { grid-template-columns: repeat(6, 1fr); }

/* --- Karta balíčku --------------------------------------------------------- */
.vl-bal-card { position: relative; background: #fdfcf8; border-radius: 18px; overflow: hidden; display: flex; flex-direction: column; }
/* Zvýrazněná karta (`_hm_bal_highlight`) — žlutý obrys a stín. */
.vl-bal-card--hl { outline: 2.5px solid #ffd21f; box-shadow: 0 18px 44px rgba(0, 0, 0, .28); }
.vl-bal-card__flag { background: #ffd21f; color: #16211c; font-size: 12.5px; font-weight: 600; letter-spacing: .04em; text-align: center; padding: 8px 12px; }
.vl-bal-card__media { position: relative; aspect-ratio: 16/10; background: #f4f2ea; display: flex; align-items: center; justify-content: center; }
/* `img { max-width:100% }` z vlasimo.css je (0,0,1), třída (0,1,0) — vyhrává. */
.vl-bal-card__img { max-height: 88%; max-width: 60%; object-fit: contain; display: block; }
/* Štítek úspory: na zvýrazněné kartě inverzní (žlutý obrys by se s ním pral). */
.vl-bal-card__save { position: absolute; top: 12px; right: 12px; background: #ffd21f; color: #16211c; font-size: 12px; font-weight: 600; border-radius: 999px; padding: 4px 11px; }
.vl-bal-card--hl .vl-bal-card__save { background: #16211c; color: #ffffff; }
.vl-bal-card__body { padding: 18px 20px 20px; display: flex; flex-direction: column; gap: 8px; flex: 1; }
.vl-bal-card__title { margin: 0; font-size: 17px; font-weight: 600; color: #16211c; letter-spacing: -.01em; }
.vl-bal-card__desc { font-size: 13.5px; color: #5d6b62; line-height: 1.5; }
.vl-bal-card__prices { display: flex; align-items: flex-end; gap: 9px; margin-top: auto; }
.vl-bal-card__price { font-size: 24px; font-weight: 600; letter-spacing: -.02em; color: #16211c; line-height: 1; }
.vl-bal-card__old { font-size: 13px; color: #8a887f; text-decoration: line-through; padding-bottom: 2px; }
/* CTA je <div role="button">, ne <a> — `.vl a { color:#16211c }` na něj nemíří
   a barva se nemusí psát přes `.vl a.trida`. */
.vl-bal-card__cta { height: 48px; background: #0d8f46; color: #ffffff; border-radius: 12px; display: flex; align-items: center; justify-content: center; gap: 9px; font-size: 15px; font-weight: 600; box-shadow: 0 3px 0 #075c2e; cursor: pointer; transition: transform .12s ease, box-shadow .12s ease; }
.vl-bal-card__arrow { font-size: 15px; line-height: 1; }

/* --- Poznámka pod kartami -------------------------------------------------- */
.vl-bal__note { margin-top: 18px; display: flex; align-items: center; gap: 9px; font-size: 13px; color: #a9bdb0; }
.vl-bal__note-ico { color: #4ade80; flex: none; margin-top: 3px; }

/* --- Tablet 769–1024 -------------------------------------------------------
   Přesně to, co dřív dělala trojice `[style*=…]` pravidel z base.css: obal na
   1024 px s užším odsazením, nadpis 24 px, cena 22 px. */
@media (min-width: 769px) and (max-width: 1024px) {
	.vl-bal__in { max-width: 1024px; padding: 52px 32px 36px; }
	.vl-bal-card__price { font-size: 22px; }
}

/* Nadpis se zmenšoval už pravidlem `.vl-desktop [style*="font-size:30px"]`,
   které platí do 1024 px včetně — tedy i pod 768, kde je `.vl-desktop`
   schované (vizuálně se to neprojeví, ale computed styl to drží). Zachováno
   1:1, aby se snímek nerozešel. */
@media (max-width: 1024px) {
	.vl-bal__title { font-size: 24px; }
}

/* ==== cart-bar.css ====================================================== */
/* ===========================================================================
   Pevná spodní lišta košíku na mobilu (inc/cart-bar.php) — varianta A z plátna
   „Sticky lišta košíku na mobilu“ (David 12. 9. 2026). Jen ≤ 768 px, jen s
   položkou v košíku (server dává `hidden`), schovaná při otevřeném panelu
   (`body.vl-cart-open`) — na desktopu se nekreslí vůbec.
   =========================================================================== */
.vl-cartbar { display: none; }
@media (max-width: 768px) {
	.vl-cartbar { display: block; position: fixed; left: 0; right: 0; bottom: 0; z-index: 150; background: #fdfcf8; box-shadow: 0 -6px 20px rgba(22, 33, 28, .08); padding: 0 16px calc(12px + env(safe-area-inset-bottom, 0px)); }
	.vl-cartbar[hidden], body.vl-cart-open .vl-cartbar { display: none; }
	.vl-cartbar__line { height: 3px; margin: 0 -16px; background: #dbe7de; }
	.vl-cartbar__fill { height: 3px; background: #0d8f46; max-width: 100%; }
	.vl-cartbar__row { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 9px 0 8px; font-size: 13px; }
	.vl-cartbar__cart { display: flex; align-items: center; gap: 9px; font-weight: 600; white-space: nowrap; }
	.vl .vl-cartbar__cart, .vl .vl-cartbar__cart:hover { color: #16211c; }
	/* Koš je v ikoně kreslený v dolních 2/3 rámečku (rukojeť od y 6,4/24); -1 px = tělo koše opticky na středu ceny, kolečko nad ní nepřečnívá zbytečně. */
	.vl-cartbar__icon { position: relative; top: -1px; display: inline-flex; width: 22px; height: 22px; align-items: center; justify-content: center; }
	.vl-cartbar__icon svg { display: block; }
	/* Kolečko těsně na pravém horním rohu rukojeti koše (David 12. 9.: blíž ikoně, svisle zarovnané; vybráno ze 4 posunů na snímku) — lem v barvě lišty odřízne tahy ikony. */
	.vl-cartbar__badge { position: absolute; top: -2px; right: -5px; min-width: 17px; height: 17px; box-sizing: border-box; border-radius: 999px; background: #0d8f46; color: #ffffff; font-size: 10.5px; font-weight: 600; line-height: 1; display: flex; align-items: center; justify-content: center; padding: 0 4px; border: 2px solid #fdfcf8; }
	.vl-cartbar__badge[hidden] { display: none; }
	.vl-cartbar__push { display: flex; align-items: center; gap: 6px; color: #0b7c3d; font-weight: 500; font-size: 12.5px; white-space: nowrap; min-width: 0; overflow: hidden; }
	.vl-cartbar__ico { display: flex; flex: none; }
	.vl-cartbar__sep { color: #8a887f; }
	.vl-cartbar__cta { height: 48px; box-sizing: border-box; background: #0d8f46; border-radius: 12px; display: flex; align-items: center; justify-content: center; gap: 8px; font-size: 15px; font-weight: 600; box-shadow: 0 4px 0 #075c2e; }
	.vl a.vl-cartbar__cta, .vl a.vl-cartbar__cta:hover { color: #ffffff; }
	/* Obsah stránky nesmí zůstat pod lištou — třídu přepíná JS podle viditelnosti. */
	html.vl-cartbar-on body { padding-bottom: calc(104px + env(safe-area-inset-bottom, 0px)); }
}

/* ==== cart-panel.css ==================================================== */
/* ===========================================================================
   Postranní panel košíku (parts/cart-panel.php) — styly vytažené z markupu.

   Načítá se za vlasimo.css → vlasimo-base.css → vlasimo-ui.css
   (inc/assets.php, seznam `VLASIMO_PART_CSS`), takže se nic nepřebíjí
   `!important`. ZAPNUTÍ: doplnit `'cart-panel'` do VLASIMO_PART_CSS —
   samotný soubor v adresáři se nenačítá.

   Panel je v DOM na KAŽDÉ stránce (footer.php + WC fragment ve
   functions.php), proto komponentní soubor, ne page soubor. Na pokladně
   se nekreslí (vlastní patička).

   Existující `.vl-cpanel__items` / `.vl-cpanel__more` zůstávají ve
   vlasimo-base.css (sbalení seznamu + zobáček, obsluha ve vlasimo.js).
   Tady se k `.vl-cpanel__items` jen dolepí layout, který měl v markupu
   inline. Kdyby se ten blok někdy stěhoval, patří sem.

   Zdroj hodnot: computed styly živého panelu ve třech šířkách
   (tools/css-snap/base/{kosik,hp}@{1440,900,390}.json) plus výpis
   navázaných pravidel přes CDP. Na panel míří z responzivních vrstev
   jediné pravidlo — tabletové zmenšení součtu — a to je dole.

   Migrace: tools/migrate/21-cart-panel.py
   =========================================================================== */

/* --- Hlavička panelu ------------------------------------------------------- */
.vl-cpanel-head { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 16px 28px; border-bottom: 1px solid #e3e0d4; }
.vl-cpanel-head__title { font-size: 18px; font-weight: 600; color: #16211c; }
.vl-cpanel-head__count { color: #8a887f; font-weight: 500; }
.vl-cpanel-head__close { width: 30px; height: 30px; display: flex; align-items: center; justify-content: center; cursor: pointer; color: #8a887f; font-size: 17px; }

/* --- Seznam položek --------------------------------------------------------
   Doplněk k `.vl-cpanel__items { max-height: 272px }` ve vlasimo-base.css;
   `max-height` sem schválně nepatří, aby `.vl-cpanel__items.is-open`
   (taky base) dál vyhrávalo. */
.vl-cpanel__items { padding: 0 28px; display: flex; flex-direction: column; flex: none; overflow: hidden; }

/* --- Prázdný košík ---------------------------------------------------------
   `.vl a { color:#16211c }` (0,0,1,1) i `.vl a:hover { color:#0b7c3d }`
   (0,0,2,1) jsou specifičtější než holá třída, a inline styl je dřív
   přebíjel v obou stavech — proto `.vl a.<třída>` včetně `:hover`. */
.vl-cpanel-empty { padding: 36px 0 40px; display: flex; flex-direction: column; align-items: center; gap: 18px; }
.vl-cpanel-empty__text { text-align: center; color: #8a887f; font-size: 14.5px; }
.vl a.vl-cpanel-empty__cta,
.vl a.vl-cpanel-empty__cta:hover { height: 52px; padding: 0 26px; background: #0d8f46; color: #ffffff; border-radius: 12px; display: inline-flex; align-items: center; gap: 10px; font-size: 16px; font-weight: 600; box-shadow: 0 3px 0 #075c2e; }
.vl-cpanel-empty__arrow { line-height: 1; transform: translateY(-1.5px); }

/* --- Řádek položky ---------------------------------------------------------
   `img { max-width:100%; height:auto }` z vlasimo.css je jen (0,0,0,1),
   takže rozměry na třídě vyhrají; `height:auto` z něj platí dál — stejně
   jako dřív, inline ho taky nepřebíjel. */
.vl-cpanel-item { display: flex; align-items: center; gap: 16px; padding: 16px 0; border-bottom: 1px solid #f0ede1; }
.vl-cpanel-item__thumb { width: 64px; height: 64px; min-width: 64px; border-radius: 12px; border: 1px solid #e3e0d4; background: #ffffff; display: flex; align-items: center; justify-content: center; }
.vl-cpanel-item__img { max-width: 88%; max-height: 88%; object-fit: contain; display: block; }
.vl-cpanel-item__name { font-size: 15px; font-weight: 600; color: #16211c; }
.vl-cpanel-item__kura { margin-top: 3px; font-size: 12.5px; font-weight: 600; color: #0b7c3d; }

/* Množství: řádek dárku barvu nedědí od `--muted`, ale ze svého `<span>`. */
.vl-cpanel-qty { display: flex; align-items: center; gap: 12px; margin-top: 6px; font-size: 13.5px; }
.vl-cpanel-qty--muted { color: #8a887f; }
.vl-cpanel-qty__gift { font-weight: 600; color: #8a887f; }
.vl-cpanel-qty__btn { font-size: 15px; color: #8a887f; cursor: pointer; padding: 0 2px; }

/* Cena řádku: `--sale` = zlevněno (a „Zdarma"), jinak tmavá.
   Modifikátor musí stát ZA základní třídou — obě mají (0,0,1,0). */
.vl-cpanel-item__price { display: flex; flex-direction: column; align-items: flex-end; gap: 3px; }
.vl-cpanel-item__sum { font-size: 15px; font-weight: 600; color: #16211c; }
.vl-cpanel-item__sum--sale { color: #0b7c3d; }
.vl-cpanel-item__old { font-size: 12.5px; color: #8a887f; text-decoration: line-through; }

/* --- Progress doprava / dárek ----------------------------------------------
   `inset: 0 auto 0 0` je opsané doslova z markupu, ne rozepsané do
   longhandů: v prohlížeči bez podpory `inset` (Chrome < 87) se má chovat
   přesně jako dosud. Šířku výplně dál nese inline styl — procenta jsou
   spojitá množina. */
.vl-cpanel-prog { background: #f4faf6; border-top: 1px solid #e3e0d4; border-bottom: 1px solid #e3e0d4; padding: 14px 28px 16px; }
.vl-cpanel-prog__head { display: flex; align-items: center; gap: 8px; font-size: 13.5px; font-weight: 600; color: #0b7c3d; }
.vl-cpanel-prog__ico { flex: 0 0 auto; }
/* Dráha musí být o 6 px vyšší než pás, aby se do ní vešlo kolečko cíle —
   proto obal `__bar` a v něm rail, výplň i kolečko absolutně. Bez obalu by
   `overflow: hidden` na dráze kolečko uřízlo. */
.vl-cpanel-prog__bar { position: relative; height: 14px; margin-top: 10px; }
.vl-cpanel-prog__track { position: absolute; left: 0; right: 0; top: 3px; height: 8px; border-radius: 99px; background: #dbe7de; }
.vl-cpanel-prog__fill { position: absolute; left: 0; top: 3px; height: 8px; max-width: 100%; background: #0d8f46; border-radius: 99px; }
.vl-cpanel-prog__dot { position: absolute; right: 0; top: 0; box-sizing: border-box; width: 14px; height: 14px; border-radius: 50%; background: #fff; border: 2.5px solid #bcc9bf; display: flex; align-items: center; justify-content: center; color: #fff; }
.vl-cpanel-prog__dot.is-on { background: #0d8f46; border-color: #0d8f46; }
.vl-cpanel-prog__legend { display: flex; justify-content: space-between; gap: 12px; margin-top: 9px; font-size: 12px; font-weight: 600; }
.vl-cpanel-prog__legend--end { justify-content: flex-end; }
.vl-cpanel-prog__goal { display: inline-flex; align-items: center; gap: 5px; color: #8a887f; }
.vl-cpanel-prog__goal--done { color: #0b7c3d; }

/* --- Karty TIP a „Kupují společně" -----------------------------------------
   Obě karty mají stejný rám (`.vl-cpanel-card`) a stejné kulaté „+"
   (`.vl-cpanel-add`, třikrát v markupu). */
.vl-cpanel-cards { padding: 14px 28px 14px; display: flex; flex-direction: column; gap: 10px; }
.vl-cpanel-card { border: 1px solid #e3e0d4; background: #ffffff; border-radius: 14px; padding: 12px 18px; display: flex; align-items: center; gap: 14px; }
.vl-cpanel-add { width: 40px; height: 40px; min-width: 40px; border-radius: 10px; border: 1.5px solid #0d8f46; color: #0b7c3d; display: flex; align-items: center; justify-content: center; font-size: 18px; cursor: pointer; }

/* Karta upgradu (David 11. 9., varianta B z plátna): stejná stavba jako
   nabídky, jen v zeleném tónu a s plným „+" místo obrysového — má být vidět,
   že je to výhodnější varianta toho, co v košíku už leží, ne zboží navíc. */
.vl-cpanel-card--tip { background: #f4faf6; border-color: #b9d6c4; }
.vl-cpanel-card--tip .vl-cpanel-up__thumb { background: #ffffff; }
.vl-cpanel-tip__row { display: flex; align-items: baseline; gap: 9px; }
/* Doplatek na konci řádku s odznakem: `margin-left:auto` ho odtlačí doprava
   a přitom nechá odznak s nadpisem u sebe (na `space-between` by se rozlezly). */
.vl-cpanel-tip__row .vl-cpanel-up__price { margin-left: auto; }
.vl-cpanel-card--tip .vl-cpanel-up__line { margin-top: 5px; }
.vl-cpanel-add--solid { background: #0d8f46; border-color: #0d8f46; color: #ffffff; }
/* Odznak sedí v řádku s nadpiskem, který je vysoký 14 px. S výchozím
   prokládáním 1,6 a 5px odsazením měl 28 px a proti textu vedle sebe
   přečníval — proto vlastní prokládání a nižší odsazení (David 11. 9.). */
.vl-cpanel-tip__badge { background: #ffd21f; color: #16211c; font-size: 11px; line-height: 1.25; font-weight: 700; letter-spacing: .06em; border-radius: 7px; padding: 3px 9px; }
.vl-cpanel-tip__text { flex: 1; font-size: 13.5px; line-height: 1.55; color: #3d443e; }
/* Zelená částka úspory uvnitř textu TIPu — obal skládá $vl_tip_text v šabloně. */
.vl-cpanel-tip__save { font-weight: 600; color: #0b7c3d; }

.vl-cpanel-up__thumb { width: 52px; height: 52px; min-width: 52px; border-radius: 10px; border: 1px solid #e3e0d4; background: #fdfcf8; display: flex; align-items: center; justify-content: center; }
.vl-cpanel-up__img { max-width: 86%; max-height: 86%; object-fit: contain; display: block; }
.vl-cpanel-up__kicker { font-size: 10.5px; line-height: 1.3; font-weight: 600; letter-spacing: .1em; text-transform: uppercase; color: #0b7c3d; }
/* Název a cena na jednom řádku (David 11. 9.): cena vpravo, ať se karty pod
   sebou čtou jako ceník. `min-width: 0` na názvu je nutné — bez něj flex
   položka nesmí zúžit pod obsah a dlouhý název by cenu vytlačil z karty. */
.vl-cpanel-up__row { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; margin-top: 3px; line-height: 1.3; }
.vl-cpanel-up__name { font-size: 14px; font-weight: 600; color: #16211c; min-width: 0; }
.vl-cpanel-up__price { font-size: 13.5px; font-weight: 700; color: #0b7c3d; white-space: nowrap; }
.vl-cpanel-up__line { font-size: 12.5px; line-height: 1.45; color: #5d6b62; margin-top: 2px; }

/* --- Souhrn, CTA a loga plateb --------------------------------------------- */
/* Souhrn s CTA musí být vidět VŽDYCKY (David 11. 9.) — je to jediná cesta
   dál. `margin-top:auto` ho u krátkého košíku drží dole, `position:sticky`
   ho u dlouhého nechá na místě a scrolluje obsah nad ním. Obal
   `.vl-ftr__cart-body` je scrollovací kontejner (footer.css), takže se
   lepí k němu. Pozadí musí být neprůhledné, jinak pod ním prosvítají karty;
   `bottom:-1px` schová vlastní rámeček pod hranu při dojetí na konec. */
.vl-cpanel-sum { margin-top: auto; position: sticky; bottom: -1px; z-index: 3; background: #fdfcf8; padding: 16px 28px 20px; border-top: 1px solid #e3e0d4; display: flex; flex-direction: column; gap: 12px; }
.vl-cpanel-coupon { display: flex; justify-content: space-between; align-items: baseline; font-size: 13.5px; }
.vl-cpanel-coupon__val { color: #0b7c3d; font-weight: 600; }
.vl-cpanel-sum__row { display: flex; justify-content: space-between; align-items: baseline; }
.vl-cpanel-sum__label { font-size: 17px; font-weight: 600; color: #16211c; }
.vl-cpanel-sum__vat { font-size: 12px; font-weight: 400; color: #8a887f; }
.vl-cpanel-sum__total { font-size: 28px; font-weight: 600; letter-spacing: -.02em; color: #16211c; line-height: 1; }
.vl-cpanel-points { display: inline-flex; align-self: flex-start; align-items: center; gap: 7px; background: #e4eee6; border: 1px solid #c6dbcb; color: #0b7c3d; border-radius: 999px; padding: 5px 13px; font-size: 12.5px; font-weight: 600; }

.vl a.vl-cpanel-cta,
.vl a.vl-cpanel-cta:hover { height: 58px; background: #0d8f46; color: #ffffff; display: flex; align-items: center; justify-content: center; gap: 10px; font-size: 17px; font-weight: 600; border-radius: 14px; box-shadow: 0 4px 0 #075c2e; }
.vl-cpanel-cta__arrow { font-weight: 400; transform: translateY(-1px); display: inline-block; }

.vl-cpanel-pay { display: flex; justify-content: center; gap: 6px; flex-wrap: wrap; align-items: center; }
.vl-cpanel-pay__badge { border: 1px solid #e3e0d4; background: #ffffff; border-radius: 6px; padding: 4px 7px; display: inline-flex; align-items: center; }
.vl-cpanel-pay__img { height: 10px; width: auto; display: block; }

/* --- Sdílené drobnosti -----------------------------------------------------
   Stejná hodnota na víc místech = jedna třída, ne kopie:
   `.vl-cpanel-grow` je tělo položky i tělo upsellu, `.vl-cpanel-ico`
   fajfka v progressu i u bodů, `.vl-cpanel-b` počet kusů i zvýraznění
   `*takto*` v textu TIPu. */
.vl-cpanel-grow { flex: 1; min-width: 0; }
.vl-cpanel-ico { display: block; }
.vl-cpanel-b { font-weight: 600; color: #16211c; }

/* ==== TABLET 769–1024 ======================================================
   Jediné pravidlo responzivní vrstvy, které na panel doopravdy mířilo:
   `[style*="font-size:28px; font-weight:600; letter-spacing:-.02em;
   color:#16211c; line-height:1"] { font-size: 25px !important }`
   (vlasimo-base.css). Ta jehla byla v celé šabloně jen tady, takže
   pravidlo v base.css po migraci osiří. `!important` netřeba — nic
   jiného na `.vl-cpanel-sum__total` nesahá.
   ≤768 px pro panel žádné pravidlo neexistuje (ověřeno CDP na 390 px),
   proto tu mobilní blok chybí. */
@media (min-width: 769px) and (max-width: 1024px) {
	.vl-cpanel-sum__total { font-size: 25px; }
}

/* ==== MOBIL ≤768 ===========================================================
   Na telefonu je panel celá obrazovka a co se nevejde nad ohyb, to
   `fitCpanelItems()` (vlasimo.js) ubere ze SEZNAMU POLOŽEK — až na jeho
   minimum 88 px. Do 9. 9. tak z košíku byla vidět jedna a půl položky:
   progress (141 px), karty TIP + prodloužení (273 px) a souhrn (180 px)
   spolykaly z 844 px displeje 594. Hodnoty jsou vzaté z panelu Herbasu,
   který tímhle kolem prošel (Davidovo zadání 9. 9.): okraje 28 → 18,
   písmo o stupeň dolů, kulaté „+" 40 → 34. Ušetřeno 157 px = dvě položky.

   Seznam položek má na mobilu strop ve `vh`, ne 272 px z vlasimo-base.css:
   ta hodnota je počítaná pro desktopový panel a na výšku telefonu je moc
   nízká — místo, které se pod ní uvolní, zůstávalo prázdné, protože
   `fitCpanelItems()` umí jen zmenšovat, ne zvětšovat. Strop 46 vh se veze
   s displejem a JS ho pořád podřízne, když se souhrn nevejde (ověřeno na
   375×667: dvě položky a zobáček, CTA nad ohybem).

   Legenda prahů: `nowrap` na položce + `wrap` na kontejneru, hranici si
   najde prohlížeč sám. Breakpoint podle šířky textu tu nemá smysl zkoušet —
   headless Chromium sází písmo úžeji než telefon (viz CLAUDE.md).

   Hlavička progressu je 11,5 px, aby se hláška vešla na jeden řádek: na 390 px
   má text 313 px místa a nejdelší běžné znění („Dopravu máte zdarma — do dárku
   zbývá 1 233 Kč") měří v headless 286 px, tedy 91 % — ta desetina je rezerva
   právě na to, že telefon sází šířeji. Ve 12,5 px vycházelo 311 px z 313
   a stačila jedna číslice navíc (a před 9. 9. haléře) k zalomení.

   Křížek si nechává 30×30 px i při menším odsazení hlavičky: Herbas ho na
   mobilu naopak zvětšoval, aby bylo do čeho trefit palcem.
   =========================================================================== */
@media (max-width: 768px) {
	.vl-cpanel-head { padding: 10px 18px; }
	.vl-cpanel-head__title { font-size: 16.5px; }

	.vl-cpanel__items { padding: 0 18px; max-height: 46vh; }
	.vl-cpanel-item { gap: 12px; padding: 11px 0; }
	.vl-cpanel-item__thumb { width: 52px; height: 52px; min-width: 52px; border-radius: 10px; }
	.vl-cpanel-item__name { font-size: 14px; }
	.vl-cpanel-item__kura { font-size: 12px; margin-top: 2px; }
	.vl-cpanel-qty { gap: 10px; margin-top: 4px; font-size: 13px; }
	.vl-cpanel-item__sum { font-size: 14.5px; }
	.vl-cpanel-item__old { font-size: 12px; }

	.vl-cpanel-prog { padding: 10px 18px 12px; }
	.vl-cpanel-prog__head { gap: 6px; font-size: 11.5px; }
	.vl-cpanel-prog__bar { margin-top: 8px; height: 13px; }
	.vl-cpanel-prog__track, .vl-cpanel-prog__fill { height: 7px; }
	.vl-cpanel-prog__dot { width: 13px; height: 13px; }
	.vl-cpanel-prog__legend { margin-top: 7px; gap: 4px 8px; flex-wrap: wrap; font-size: 10.5px; }
	.vl-cpanel-prog__goal { gap: 4px; white-space: nowrap; }

	.vl-cpanel-cards { padding: 10px 18px; gap: 8px; }
	.vl-cpanel-card { padding: 9px 12px; gap: 10px; border-radius: 12px; }
	.vl-cpanel-add { width: 34px; height: 34px; min-width: 34px; font-size: 17px; }
	.vl-cpanel-tip__badge { padding: 3px 8px; font-size: 10px; }
	.vl-cpanel-tip__row { gap: 7px; }
	.vl-cpanel-tip__text { font-size: 12.5px; line-height: 1.45; }
	.vl-cpanel-up__thumb { width: 44px; height: 44px; min-width: 44px; }
	.vl-cpanel-up__kicker { font-size: 10px; }
	.vl-cpanel-up__row { gap: 8px; }
	.vl-cpanel-up__name { font-size: 13px; }
	.vl-cpanel-up__price { font-size: 12.5px; }
	.vl-cpanel-up__line { font-size: 12px; line-height: 1.4; }

	.vl-cpanel-sum { padding: 11px 18px 14px; gap: 8px; }
	.vl-cpanel-coupon { font-size: 12.5px; }
	.vl-cpanel-sum__label { font-size: 15px; }
	.vl-cpanel-sum__total { font-size: 22px; }
	.vl-cpanel-points { padding: 4px 11px; font-size: 11.5px; }
	/* CTA zůstává v původní velikosti (58 px / 17 px) — David 9. 9.: hlavní
	   tlačítko se nezmenšuje, ušetřené místo má jít z okolí, ne z něj. */
}


/* Toast pro hlášky mimo košík a pokladnu (chyba při přidání do košíku,
   hláška ze session) — vlNotify() ve vlasimo-cart.js, inc/notices.php. */
.vl-toast { position: fixed; left: 50%; bottom: 24px; transform: translate(-50%, 16px); z-index: 100010; width: max-content; max-width: min(520px, calc(100vw - 32px)); display: flex; flex-direction: column; gap: 6px; opacity: 0; pointer-events: none; transition: opacity .2s ease, transform .2s ease; }
.vl-toast.is-on { opacity: 1; transform: translate(-50%, 0); pointer-events: auto; cursor: pointer; }
.vl-toast__item { background: #16211c; color: #fff; font-size: 14px; line-height: 1.45; padding: 12px 18px 12px 16px; border-radius: 12px; box-shadow: 0 10px 30px rgba(22, 33, 28, .28); border-left: 4px solid #e0a72a; text-align: left; }
.vl-toast__item.is-error { border-left-color: #d64545; }
@media (max-width: 768px) {
	.vl-toast { bottom: 16px; }
	.vl-toast__item { font-size: 13.5px; padding: 11px 14px; }
}

/* ==== certs.css ========================================================= */
/* ===========================================================================
   certs.css — sdílená sekce „Certifikace a původ" (parts/certs.php).

   Kreslí ji HP, výpis /objednavka/, PDP kúry i kosmetiky (obě vrstvy),
   Složení a Zkušenosti — soubor je proto v assets/css/parts/ a načítá se
   na KAŽDÉ stránce (inc/assets.php, závislost `vlasimo-ui`), tedy za
   vlasimo.css → vlasimo-base.css → vlasimo-ui.css a před pages/<slug>.css.

   Vznik: tools/migrate/14-certs.py vytáhl 14 inline stylů z dc renderu do
   tříd `.vl-certs-*`. Hodnoty jsou ověřené proti computed stylům na
   /obchod/, /, /slozeni/, /zkusenosti-ostatnich/ a obou PDP ve
   1440 / 1024 / 900 / 768 / 390 px (CDP CSS.getMatchedStylesForNode).

   Dvě varianty obalu podle $args['band']:
     .vl-certs-band > .vl-certs-band__inner   pruh s podkladem (dnes všechna volání)
     .vl-certs-sec                            sekce v proudu stránky (větev dnes nikdo nevolá)

   Konkurence, se kterou třídy počítají:
   - `h1, h2, h3 { margin:0; color:#16211c; letter-spacing:-.01em }` (0,0,1)
     — `.vl-certs-head__title` ji přebije (letter-spacing musí být -.02em).
   - `img { max-width:100%; height:auto }` (0,0,1) — `.vl-certs__logo`
     přebíjí `height` na 72px.
   - `.vl-wrap` ve vlasimo-base.css nese pod 1024 px `max-width` a boční
     odsazení s `!important` (a pod 900 px 20px). Obal pruhu tuhle třídu
     dál má (kvůli zbytku webu), takže tabletové a mobilní odsazení
     komponenty musí být taky `!important` — jinak by se od 769 do 900 px
     boky srazily z 32 na 20 px. Jinde v souboru `!important` není.

   OSIŘELÁ pravidla ve vlasimo-base.css (jehla `.vl-certs…[style*=…]` už
   v markupu není, jejich obsah je níž v tomhle souboru):
     ~1765  .vl-certs.vl-certs--3[style*="grid-template-columns:repeat(4, 1fr)"]
     ~1773  totéž v @media (max-width: 768px)
   Automat 00-mrtva-pravidla.py je nesmaže — jehla `grid-template-columns:
   repeat(4, 1fr)` v jiných šablonách zůstala; smazat je ručně.
   Sousední `.vl-certs.vl-certs--3 > :last-child { grid-column: 1 / -1 }`
   (base.css ~1775) žádnou jehlu nemá, žije dál a je níž zopakované —
   po smazání dvojice výš odstranit i jeho kopii v base.css.
   =========================================================================== */

/* --- Obal ------------------------------------------------------------------ */
.vl-certs-band { background: #f6f5ef; border-top: 1px solid #e3e0d4; border-bottom: 1px solid #e3e0d4; }
.vl-certs-band__inner { max-width: 1440px; margin: 0 auto; padding: 48px; display: flex; flex-direction: column; gap: 24px; }
/* Varianta bez pruhu — sekce jde rovnou do proudu stránky. Dnes ji nikdo
   nevolá (všechna volání partu posílají band => true), pravidla jsou tu, aby
   se dala zapnout beze změny vzhledu proti stavu před migrací. */
.vl-certs-sec { max-width: 1440px; margin: 0 auto; padding: 0 48px 56px; display: flex; flex-direction: column; gap: 20px; }

/* --- Hlavička sekce -------------------------------------------------------- */
.vl-certs-head { display: flex; flex-direction: column; gap: 8px; }
.vl-certs-head__kicker { font-size: 12px; font-weight: 600; letter-spacing: .14em; text-transform: uppercase; color: #0b7c3d; }
.vl-certs-head__title { margin: 0; font-size: 28px; line-height: 1.15; font-weight: 600; letter-spacing: -.02em; color: #16211c; }
/* Perex se vykreslí jen když je `cert_lead` vyplněný. `max-width` schválně
   nemá: pravidlo `.vl-sechead > span[style*="color:#5d6b62"] { max-width:46ch }`
   z base.css na něj nikdy nesedělo (hlavička certifikací není .vl-sechead). */
.vl-certs-head__lead { font-size: 14px; color: #5d6b62; }

/* --- Mřížka dlaždic --------------------------------------------------------
   Třídu `.vl-certs` a modifikátor `.vl-certs--N` (N = počet certifikací)
   nese markup dál. CS má 4 dlaždice, SK 3 (bez MZe — David 6. 9.), a se
   třemi se mřížka roztáhne na celou šířku. Modifikátor je psaný jako
   `.vl-certs.vl-certs--3` (0,2,0) schválně: přebíjí i tabletové zúžení
   na dva sloupce níž, které je jen (0,1,0). */
.vl-certs { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; }
.vl-certs.vl-certs--3 { grid-template-columns: repeat(3, 1fr); }

.vl-certs__card { background: #fdfcf8; border: 1px solid #e3e0d4; border-radius: 14px; padding: 20px; display: flex; flex-direction: column; gap: 12px; }
/* Loga: pevných 72 px na výšku na všech třech vrstvách (Davidovo pravidlo
   3. 9.) — ani tablet, ani mobil je nezmenšují. */
.vl-certs__logo { height: 72px; width: auto; max-width: 100%; object-fit: contain; object-position: center; display: block; }

/* Kolečko se zkratkou = fallback pro certifikaci bez loga (dnes ho má
   všechny CS i SK, takže se nikde nekreslí). Velikost písma je konečná
   trojice podle délky zkratky, proto modifikátory, ne inline styl:
   > 4 znaky → 10, > 3 → 11, jinak 12. */
.vl-certs__abbr { width: 46px; height: 46px; border-radius: 50%; background: #e4eee6; border: 1px solid #c6dbcb; display: flex; align-items: center; justify-content: center; font-weight: 700; color: #0b7c3d; }
.vl-certs__abbr--10 { font-size: 10px; }
.vl-certs__abbr--11 { font-size: 11px; }
.vl-certs__abbr--12 { font-size: 12px; }

.vl-certs__body { display: flex; flex-direction: column; gap: 4px; }
/* `<strong>` má v UA font-weight bolder — třída ho vrací na 600. */
.vl-certs__name { font-size: 14.5px; font-weight: 600; color: #16211c; }
.vl-certs__desc { font-size: 13px; line-height: 1.55; color: #5d6b62; }

/* --- Šířka pruhu pod 1024 px ----------------------------------------------
   Platí i pro mobil: `.vl-wrap { max-width:1024px !important }` v base.css
   drží pruh na 1024 px až do 390 px a po migraci by tichý rozdíl mezi
   „třída říká 1440" a „skutečnost je 1024" mátl. `!important` je nutný —
   přebíjí se pravidlo, které ho má taky. */
@media (max-width: 1024px) {
	.vl-certs-band__inner { max-width: 1024px !important; }
}

/* --- Tablet 769–1024 -------------------------------------------------------
   Přeneseno z bloku tabletu ve vlasimo-base.css (pravidla [style*="…"]).
   Mřížka jde na dva sloupce; SK trojice zůstává na třech (viz výš).
   Odsazení pruhu potřebuje `!important` kvůli `.vl-wrap`. */
@media (min-width: 769px) and (max-width: 1024px) {
	.vl-certs-band__inner { padding: 32px !important; }
	.vl-certs-sec { max-width: 1024px; padding: 0 32px 36px; }
	.vl-certs-head__title { font-size: 25px; }
	.vl-certs { grid-template-columns: repeat(2, 1fr); }
}

/* --- Mobil ≤768 ------------------------------------------------------------
   Sekce nemá vlastní markupovou vrstvu — `parts/cert-tiles-mobile.php` je
   samostatný part s vlastními třídami `.vl-certs-m*`. Desktopový markup je
   na mobilu vidět jen tam, kde ho vykresluje mobilní vrstva PDP
   (parts/pdp-mobile.php, parts/pdp-cosmetic-mobile.php) nebo stránka bez
   vrstev (Zkušenosti) — a ta místa mají obal `.vl-dcontent`.

   Proto je scope `.vl-dcontent` zachovaný přesně jako v base.css: na HP,
   výpisu a Složení je pás v `.vl-desktop` (display:none), ale computed
   hodnoty se snímkují i tam, takže neomezené pravidlo by se v diffu
   projevilo jako změna. Výjimka je SK trojice — tu base.css nescopuje. */
@media (max-width: 768px) {
	.vl-dcontent .vl-certs-band__inner { padding: 28px 20px !important; }
	.vl-dcontent .vl-certs-sec { padding: 0 20px 36px; }
	.vl-dcontent .vl-certs-head__title { font-size: 22px; }
	.vl-dcontent .vl-certs { grid-template-columns: repeat(2, 1fr); }
	.vl-certs.vl-certs--3 { grid-template-columns: repeat(2, 1fr); }
	.vl-certs.vl-certs--3 > :last-child { grid-column: 1 / -1; }
}

/* ==== contact-help.css ================================================== */
/* ===========================================================================
   contact-help.css — sdílený kontaktní pruh `parts/contact-help.php`
   („Zavolejte / napište" + karta s jednou akcí).

   Kreslí ho tři stránky: Vše o nákupu (`parts/contact-help` bez argumentů),
   Vrácení a reklamace (odkaz na formulář odstoupení) a Časté dotazy (odkaz
   na kontaktní formulář). Part je SDÍLENÝ, takže styly patří do
   assets/css/parts/, ne do žádného pages/<slug>.css — jinak by se pruh na
   dvou ze tří stránek rozpadl.

   Načítání: `inc/assets.php` → konstanta `VLASIMO_PART_CSS`. Seznam je
   výslovný, ne glob — dokud v něm `contact-help` není, soubor se nenačítá.
   Pořadí je vlasimo.css → vlasimo-base.css → vlasimo-ui.css → parts/*.css
   → pages/<slug>.css, tedy AŽ ZA základem: `!important` tu proto není
   potřeba nikde (po migraci na tyhle prvky žádné `!important` pravidlo
   nemíří — všechna visela na `[style*=…]`, a ty atributy jsou pryč).

   Vznik: tools/migrate/15-contact-help.py vytáhl 25 inline stylů z dc
   renderu do tříd `.vl-chelp*`. Hodnoty jsou ze snímku computed stylů
   (tools/css-snap/base/{vse-o-nakupu,vraceni,caste-dotazy}@{1440,900,390})
   a ověřené `tools/css-probe.js`; tabletová a mobilní vrstva je přepsaná
   z pravidel `[style*="…"]` ve vlasimo-base.css (řádky 1086, 1099, 1117,
   1171, 1173, 1257, 1285).

   Konkurence, se kterou třídy počítají (CSS.getMatchedStylesForNode):
   - `.vl a { color:#16211c }` (0,1,1) a `.vl a:hover { color:#0b7c3d }`
     (0,1,1) přebíjejí prostou třídu (0,1,0). Telefon, e-mail i tlačítko
     jsou `<a>` a inline styl jim barvu držel i na hover — proto je barva
     psaná `.vl a.<třída>` VČETNĚ `:hover`. Bez toho by číslo i tlačítko
     na hover zezelenaly.
   - `h1,h2,h3 { margin:0; … }` se netýká — nadpisy jsou `<strong>`/`<div>`.
   - `.vl p { text-align: justify }` se netýká — v partu není `<p>`.
   Mobilní vrstva ZÁMĚRNĚ není scopovaná do `.vl-dcontent`, i když v základu
   scopovaná byla: dnes všechny tři stránky part vkládají dovnitř
   `.vl-dcontent` (ověřeno snímkem), takže je výsledek shodný, a část
   určená sdílené komponentě nemá viset na obalu cizí šablony.
   =========================================================================== */

/* --- Pás a mřížka ---------------------------------------------------------
   Poměr 1.15fr / 1fr: tmavý panel s kontakty je širší než karta s akcí.
   `align-items:stretch` (výchozí) drží obě karty stejně vysoké. */
.vl-chelp { background: #fdfcf8; border-top: 1px solid #e3e0d4; }
.vl-chelp__in { max-width: 1440px; margin: 0 auto; padding: 44px 48px 56px; display: grid; grid-template-columns: 1.15fr 1fr; gap: 24px; align-items: stretch; }

/* --- Tmavý panel s telefonem a e-mailem -----------------------------------
   Blok „ikona + popisek + hodnota" se opakuje 2× (telefon, e-mail), proto
   jedna sada tříd a jen modifikátor na barvu kolečka. Telefonní blok se
   nekreslí v mutacích bez čísla — dělicí linka `__sep` je jeho součástí. */
.vl-chelp__panel { background: #1f4d3a; border-radius: 16px; padding: 28px; display: flex; flex-direction: column; gap: 18px; }
.vl-chelp__block { display: flex; flex-direction: column; gap: 10px; }
.vl-chelp__head { display: flex; align-items: center; gap: 12px; }
.vl-chelp__ico { width: 42px; height: 42px; min-width: 42px; border-radius: 50%; display: flex; align-items: center; justify-content: center; }
.vl-chelp__ico--phone { background: #ffd21f; }
.vl-chelp__ico--mail { background: rgba(255, 255, 255, .12); }
.vl-chelp__ico--card { background: #eaf5ee; }
.vl-chelp__hlabel { font-size: 15.5px; font-weight: 600; color: #ffffff; }
.vl-chelp__lines { display: flex; flex-direction: column; gap: 4px; }
.vl-chelp__sep { height: 1px; background: rgba(255, 255, 255, .14); }

/* Telefon a e-mail jsou odkazy — barva musí být na `.vl a.<třída>` a hover
   se musí zopakovat, jinak vyhraje `.vl a:hover { color:#0b7c3d }`.
   Ostatní vlastnosti třídě stačí, s `.vl a` o ně nikdo nesoupeří. */
.vl-chelp__tel { font-size: 26px; font-weight: 600; letter-spacing: -.01em; }
.vl a.vl-chelp__tel, .vl a.vl-chelp__tel:hover { color: #ffd21f; }
.vl-chelp__mail { font-size: 19px; font-weight: 600; }
.vl a.vl-chelp__mail, .vl a.vl-chelp__mail:hover { color: #ffffff; }

/* Řádek otevírací doby: `display:flex` kvůli tečce stavu z `vlasimo_oh_dot()`
   (obě varianty se vykreslí a správnou ukáže skript CPP). */
.vl-chelp__hours { display: flex; align-items: center; gap: 8px; font-size: 13px; color: #c8d4cb; }
.vl-chelp__mnote { font-size: 13px; color: #c8d4cb; }

/* --- Světlá karta s jedinou akcí ------------------------------------------
   Popisek, nadpis, nepovinná poznámka a zelené tlačítko. `justify-content:
   center` sráží obsah na střed karty, která je vysoká jako panel vedle. */
.vl-chelp__card { background: #ffffff; border: 1px solid #e3e0d4; border-radius: 16px; padding: 28px; display: flex; flex-direction: column; gap: 12px; justify-content: center; }
.vl-chelp__kicker { font-size: 12px; font-weight: 600; letter-spacing: .14em; text-transform: uppercase; color: #0b7c3d; }
.vl-chelp__title { font-size: 20px; line-height: 1.25; font-weight: 600; letter-spacing: -.015em; color: #16211c; text-wrap: pretty; }
.vl-chelp__note { font-size: 14px; line-height: 1.6; color: #5d6b62; }
.vl-chelp__btn { margin-top: 4px; align-self: flex-start; height: 52px; padding: 0 24px; background: #0d8f46; border-radius: 12px; display: flex; align-items: center; gap: 10px; font-size: 15.5px; font-weight: 600; box-shadow: 0 3px 0 #075c2e; }
.vl a.vl-chelp__btn, .vl a.vl-chelp__btn:hover { color: #ffffff; }
/* Šipka je flex položka tlačítka (blokuje se), `translateY` ji srovnává
   s účařím textu. */
.vl-chelp__arrow { line-height: 1; transform: translateY(-1.5px); }

/* --- Tablet 769–1024 ------------------------------------------------------
   Přeneseno z vlasimo-base.css:
     [style*="max-width:1440px; margin:0 auto; padding:44px 48px 56px"]
        → max-width 1024px, padding 44px 32px 36px
     [style*="max-width:1440px; margin:0 auto"]  → max-width 1024px (táž hodnota)
     [style*="font-size:26px; …; color:#ffd21f"] → font-size 23px
   Mřížka 1.15fr/1fr na tabletu zůstává dvousloupcová (žádné pravidlo ji
   nesráželo; `.vl-zk-story [style*="1.15fr 1fr"]` míří na jinou sekci). */
@media (min-width: 769px) and (max-width: 1024px) {
	.vl-chelp__in { max-width: 1024px; padding: 44px 32px 36px; }
	.vl-chelp__tel { font-size: 23px; }
}

/* --- Mobil ≤768 -----------------------------------------------------------
   Přeneseno z vlasimo-base.css (blok `.vl-dcontent [style*=…]`):
     padding:44px 48px 56px          → 28px 20px 36px
     grid-template-columns:1.15fr 1fr → 1fr
     font-size:26px                   → 20px
   `max-width` tu ZŮSTÁVÁ 1440px — tabletové zúžení na 1024 platí až od
   769 px a na 390px snímku se stejně neprojeví. Karty jdou pod sebe,
   vnitřní odsazení panelu i karty (28 px) se nemění, tak to bylo i dřív. */
@media (max-width: 768px) {
	.vl-chelp__in { padding: 28px 20px 36px; grid-template-columns: 1fr; }
	.vl-chelp__tel { font-size: 20px; }
}

/* ==== cta-order.css ===================================================== */
/* ===========================================================================
   cta-order.css — sdílený závěrečný pruh `parts/cta-order.php`
   („Vyberte si kúru a nastartujte růst" + žluté tlačítko na výpis produktů).

   Kreslí se na 15 šablonách (page.php, single.php, archive.php a dvanáct
   typových stránek), NEkreslí se na výpisu produktů, v pokladně, v košíku
   a v účtu (part si to hlídá sám v PHP). Chyba v tomhle souboru je proto
   vidět skoro všude — po změně kontrolovat víc než jednu stránku.

   Načítání: `inc/assets.php` → konstanta `VLASIMO_PART_CSS`. Seznam je
   výslovný, ne glob — dokud v něm `cta-order` není, soubor se nenačítá.
   Pořadí je vlasimo.css → vlasimo-base.css → vlasimo-ui.css → parts/*.css
   → pages/<slug>.css.

   Vznik: tools/migrate/15-contact-help.py vytáhl 6 inline stylů do tříd
   `.vl-ctao*`. Hodnoty jsou ověřené `tools/css-probe.js` na doprava,
   sk-doprava, vse-o-nakupu, clanek a clanek2 ve třech šířkách (všude
   shodné); responzivní vrstvy jsou přepsané z vlasimo-base.css (řádky
   1072–1073, 1117, 1150 a blok 1478–1494).

   POZOR — `!important` v media queries není ozdoba:
   Vnitřní obal nese vedle třídy i `vl-wrap` a základ na něj míří
   `!important` pravidly, která migrace nemaže (používá je hlavička
   a další pásy):
       @media (max-width:1024px) .vl-wrap { max-width:1024px !important;
                                            padding-left/right:32px !important }
       @media (max-width:900px)  .vl-wrap { padding-left/right:20px !important }
   Nedůležitá deklarace `!important` nikdy nepřebije, ať má specificitu
   jakoukoli. Proto se odsazení píše `!important` a navíc přes
   `.vl-ctao > .vl-ctao__in` (0,2,0) — se stejnou specificitou (0,1,0) by
   o výsledku rozhodovalo jen pořadí souborů, což je zbytečně křehké.
   Na desktopu (>1024) žádné `.vl-wrap` pravidlo neplatí, tam `!important`
   není a být nemá.

   Konkurence, se kterou třídy počítají:
   - `.vl a { color:#16211c }` / `.vl a:hover { color:#0b7c3d }` (0,1,1) —
     tlačítko je `<a>` a inline styl mu barvu držel i na hover; proto je
     `color` psaná `.vl a.vl-ctao__btn` a zopakovaná pro `:hover`.
     Barva je shodou okolností stejná jako `.vl a`, ale hover by ji bez
     toho změnil na zelenou.
   - obecná mobilní/tabletová pravidla `[style*="font-size:24px"]` (19 px /
     22 px) na nadpis po migraci nemíří — hodnoty níž jsou z konkrétního
     bloku pro tenhle pruh, který je dřív přebíjel vyšší specificitou.
   =========================================================================== */

/* --- Desktop --------------------------------------------------------------
   Text vlevo, tlačítko vpravo; `flex-wrap:wrap` je z návrhu a nad 768 px
   se uplatní jen u extrémně dlouhých textů. */
.vl-ctao { background: #1f4d3a; }
.vl-ctao__in { max-width: 1440px; margin: 0 auto; padding: 44px 48px; display: flex; align-items: center; justify-content: space-between; gap: 28px; flex-wrap: wrap; }
.vl-ctao__col { display: flex; flex-direction: column; gap: 6px; }
.vl-ctao__title { font-size: 24px; font-weight: 600; letter-spacing: -.02em; color: #fdfcf8; }
.vl-ctao__note { font-size: 14.5px; color: #c8d4cb; }
.vl-ctao__btn { height: 56px; padding: 0 28px; background: #ffd21f; border-radius: 14px; display: flex; align-items: center; gap: 12px; font-size: 16px; font-weight: 600; box-shadow: 0 4px 0 #d9a800; white-space: nowrap; }
.vl a.vl-ctao__btn, .vl a.vl-ctao__btn:hover { color: #16211c; }

/* --- Tablet a užší desktop ≤1024 ------------------------------------------
   Hranice je 1024, ne 769–1024: pruh se na mobilu neskládá pod sebe, jen
   se dál zmenšuje, takže se nižší vrstvy postupně přebíjejí (tak to bylo
   i v základu — `@media (max-width:1024px)`, pak 768, pak 400).
   `max-width` je tu explicitně, i když stejnou hodnotu vynucuje `.vl-wrap`:
   ať pruh nezávisí na tom, že mu tuhle třídu někdo v markupu nechá. */
@media (max-width: 1024px) {
	.vl-ctao > .vl-ctao__in { max-width: 1024px !important; padding: 36px 32px !important; gap: 24px; }
	.vl-ctao__title { font-size: 22px; }
	.vl-ctao__btn { height: 52px; padding: 0 24px; font-size: 15px; }
}

/* --- Mobil ≤768 -----------------------------------------------------------
   David chce text i tlačítko vedle sebe jako na desktopu, ne pod sebou —
   proto `flex-wrap:nowrap`, text `flex:1 1 auto; min-width:0` (aby se směl
   zmenšit) a tlačítko `flex:none` (aby se nesmrsklo). */
@media (max-width: 768px) {
	.vl-ctao > .vl-ctao__in { padding: 24px 20px !important; gap: 14px; flex-wrap: nowrap; }
	.vl-ctao__col { min-width: 0; flex: 1 1 auto; gap: 4px; }
	.vl-ctao__title { font-size: 17px; line-height: 1.25; }
	.vl-ctao__note { font-size: 12.5px; line-height: 1.45; }
	.vl-ctao__btn { height: 42px; padding: 0 16px; font-size: 13.5px; gap: 8px; border-radius: 10px; box-shadow: 0 3px 0 #d9a800; flex: none; }
}

/* --- Úzký telefon ≤400 ----------------------------------------------------
   Na 390px snímku (iPhone) se nadpis vedle tlačítka jinak lámal do dvou
   znaků na řádek. Jen typografie a odsazení tlačítka, layout zůstává. */
@media (max-width: 400px) {
	.vl-ctao__title { font-size: 16px; }
	.vl-ctao__note { font-size: 12px; }
	.vl-ctao__btn { padding: 0 14px; font-size: 13px; }
}

/* ==== drobne.css ======================================================== */
/* ===========================================================================
   drobne.css — drobné sdílené party, jeden soubor, každý part vlastní blok
   a vlastní prefix.

     parts/voucher-card.php   .vl-vch-*     žlutá kartička dárkového poukazu
     parts/lang-topbar.php    .vl-lang-*    jazykový přepínač v topbaru
     parts/photo-modal.php    .vl-pmodal-*  lightbox fotky u recenze
     parts/ask-modal.php      .vl-ask-*     dva zbylé inline styly modalu „Napsat dotaz"
     parts/info-tip.php       .vl-tip__ico  ikona „i" v bublině u karet výpisu

   Party bez vlastního bloku (nemají co migrovat, viz komentář na konci):
     parts/progress-bar.php, parts/tile-campaign.php, parts/cta-campaign.php

   Načítá se z inc/assets.php (VLASIMO_PART_CSS) na KAŽDÉ stránce, se
   závislostí `vlasimo-ui` — tedy za vlasimo.css → vlasimo-base.css →
   vlasimo-ui.css a PŘED pages/<slug>.css.

   Vznik: tools/migrate/34-drobne-party.py — 26 inline stylů z pěti partů.
   Hodnoty nejsou opsané z návrhu, ale ověřené proti computed stylům na
   /darkove-poukazy/, /obchod/, /, /zkusenosti-ostatnich/?vl_embed=1
   a /produkt/sampon-na-podporu-rustu-vlasu/ ve 1440 / 900 / 390 px.

   Konkurence, se kterou třídy počítají:
   - `img { max-width:100%; height:auto }` (0,0,1) ve vlasimo.css —
     `.vl-vch__logo` i `.vl-pmodal__img` ji musí přebít na výšce/šířce.
   - `.vl a { color:#16211c }` (0,1,1) a `.vl a:hover { color:#0b7c3d }`
     (0,2,1) ve vlasimo-base.css. Položka jazykového menu je `<a>` a inline
     styl jí barvu držel i na hover — proto `.vl a.vl-lang__item` A
     `.vl a.vl-lang__item:hover`. Bez druhého selektoru by menu na najetí
     zezelenalo (dřív to inline styl nedovolil).
   - `.vl-cform__cb:checked + .vl-cform__box { background:#0d8f46 !important }`
     ve vlasimo-base.css — `!important` tam byl kvůli inline stylu; po
     migraci ho `.vl-ask__gdprbox` (0,1,0) neohrožuje, pravidlo zůstává
     beze změny a zaškrtnutý čtvereček dál zezelená.

   OSIŘELÉ pravidlo ve vlasimo-base.css (maže hlavní session — jehla už
   v markupu není a nikde jinde se nevyskytuje):
     ř. 1100, @media (min-width:769px) and (max-width:1024px)
       [style*="font-size:46px; font-weight:600; letter-spacing:-.02em"]
         { font-size: 37px !important; }
     → nahrazuje ho `.vl-vch__amount` v tabletovém bloku níž.

   NEOSIŘELÉ, ale komponenty se týká:
     ř. 1226, @media (max-width:768px)
       .vl-dcontent [style*="font-size:46px"] { font-size: 32px !important; }
     Jehlu `font-size:46px` má dál parts/rating-summary.php (letter-spacing
     -.03em), takže pravidlo ZŮSTÁVÁ. Pro poukaz ho níž nahrazuje
     `.vl-dcontent .vl-vch__amount` — a schválně jen uvnitř `.vl-dcontent`:
     na výpisu /obchod/ (obě vrstvy) je částka i na 390 px 46px, protože tam
     žádné `.vl-dcontent` není a mobilní kopii zmenšuje `.vl-vch-scale
     { zoom:.58 }`.
   =========================================================================== */

/* ===== parts/voucher-card.php — dárkový poukaz ============================
   Kreslí ji stránka /darkove-poukazy/, desktopový výpis produktů
   (woocommerce/archive-product.php) a mobilní vrstva výpisu
   (parts/shop-mobile.php uvnitř `.vl-vch-scale`). Vnější obal je
   pozicovaný jen kvůli bílému štítku, který kartě přesahuje pod spodní
   hranu (`bottom:-14px`). */
.vl-vch { position: relative; }
.vl-vch__card { background: #ffd21f; border-radius: 20px; aspect-ratio: 16/10; position: relative; overflow: hidden; box-shadow: 0 24px 60px rgba(22, 33, 28, .30); }

/* Dvě kruhové skvrny pod obsahem — liší se rohem, velikostí i barvou,
   společné mají jen tvar a vyvázání z toku. */
.vl-vch__blob { position: absolute; border-radius: 50%; }
.vl-vch__blob--tr { top: -70px; right: -70px; width: 280px; height: 280px; background: rgba(201, 154, 18, .30); }
.vl-vch__blob--bl { bottom: -90px; left: -60px; width: 300px; height: 300px; background: rgba(255, 255, 255, .34); }

/* `img { max-width:100%; height:auto }` je (0,0,1) — výška musí být na třídě. */
.vl-vch__logo { position: absolute; top: 26px; left: 26px; height: 28px; width: auto; display: block; }
.vl-vch__label { position: absolute; top: 30px; right: 26px; font-size: 11px; font-weight: 600; letter-spacing: .16em; color: #73681a; }

.vl-vch__val { position: absolute; left: 26px; bottom: 86px; }
/* Částku plní JS z vybrané dlaždice (data-vl-vch-amount, vlasimo-cart.js) —
   atribut zůstává, třída nese jen vzhled. */
.vl-vch__amount { font-size: 46px; font-weight: 600; letter-spacing: -.02em; color: #16211c; line-height: 1; }
.vl-vch__sub { font-size: 13px; color: #4a4520; margin-top: 8px; }

.vl-vch__foot { position: absolute; left: 26px; right: 26px; bottom: 22px; display: flex; justify-content: space-between; align-items: center; gap: 14px; }
.vl-vch__code { border: 1.5px dashed #73681a; background: rgba(255, 255, 255, .28); color: #16211c; border-radius: 9px; padding: 8px 16px; font-family: ui-monospace, Menlo, monospace; font-size: 14px; font-weight: 700; letter-spacing: .1em; }
.vl-vch__valid { font-size: 11.5px; color: #73681a; }

.vl-vch__badge { position: absolute; bottom: -14px; left: 26px; background: #ffffff; border: 1px solid #e3e0d4; border-radius: 12px; padding: 10px 16px; font-size: 13px; font-weight: 600; color: #16211c; box-shadow: 0 8px 20px rgba(22, 33, 28, .10); }

/* ===== parts/lang-topbar.php — jazykový přepínač ==========================
   Vždy v topbaru hlavičky (header.php), rozbalovací menu jen když má WPML
   víc než jeden aktivní jazyk (dnes cs+sk). Obal si drží atribut
   `data-vl-lang` — visí na něm JS i pravidlo `[data-vl-lang] +
   .vl-topbar__sep { margin-left:-6px }` ve vlasimo-base.css. */
.vl-lang { position: relative; }
.vl-lang__btn { display: inline-flex; align-items: center; gap: 8px; cursor: pointer; border: 1px solid #3a5a4a; border-radius: 999px; padding: 4px 8px; }
/* Vlaječka: `line-height:0` sráží řádkový box na výšku SVG, jinak by
   pilulka povyrostla. Menu má o půl pixelu menší zaoblení než tlačítko. */
.vl-lang__flag { display: inline-flex; border-radius: 2.5px; overflow: hidden; line-height: 0; }
.vl-lang__flag--sm { border-radius: 2px; }
.vl-lang__arrow { display: block; }
.vl-lang__menu { position: absolute; top: 32px; left: 0; z-index: 90; background: #ffffff; border: 1px solid #e3e0d4; border-radius: 12px; box-shadow: 0 14px 36px rgba(22, 33, 28, .22); padding: 8px; display: flex; flex-direction: column; gap: 2px; min-width: 200px; }
/* Položka je `<a>`: `.vl a` (0,1,1) přebíjí holou třídu a `.vl a:hover`
   (0,2,1) by ji na najetí obarvilo zeleně — inline styl to dřív nedovolil,
   takže se hover pinuje na tutéž barvu. */
.vl a.vl-lang__item,
.vl a.vl-lang__item:hover { display: flex; align-items: center; gap: 10px; border-radius: 8px; padding: 9px 12px; font-size: 13.5px; font-weight: 600; color: #16211c; }
/* Podklad aktivního jazyka — v markupu to byla podmíněná půlka inline
   stylu (`$vl_l['active'] ? 'background:#e4eee6;' : ''`). */
.vl-lang__item.is-active { background: #e4eee6; }

/* ===== parts/photo-modal.php — lightbox fotky od zákazníka ================
   Jeden na stránku, mimo vrstvy `.vl-desktop`/`.vl-mobile` (fixed prvek
   v `display:none` rodiči nefunguje): patička všech stránek a navíc holý
   embed režim stránky zkušeností (?vl_embed=1), který patičku nemá.
   Atribut je schválně `data-vl-pmodal`, ne `data-vl-modal` — obecná
   mobilní pravidla modalů by fotku roztáhla na celou výšku. */
.vl-pmodal__veil { position: fixed; inset: 0; z-index: 240; background: rgba(22, 33, 28, .72); backdrop-filter: blur(3px); display: flex; align-items: center; justify-content: center; padding: 24px; }
/* `img { max-width:100%; height:auto }` (0,0,1) by fotku zastropovalo
   šířkou závoje — proto max-width i height na třídě. */
.vl-pmodal__img { width: auto; height: auto; max-width: min(100%, 900px); max-height: calc(100dvh - 48px); border-radius: 14px; box-shadow: 0 30px 80px rgba(22, 33, 28, .45); display: block; }
/* Křížek je `position:fixed`, ne absolute: kotví se k oknu, ne k fotce,
   aby u vysokého snímku neutekl mimo obrazovku. */
.vl-pmodal__x { position: fixed; top: 18px; right: 18px; width: 40px; height: 40px; border: 0; border-radius: 50%; background: #16211c; color: #ffffff; font-size: 17px; line-height: 1; cursor: pointer; }

/* ===== parts/ask-modal.php — souhlas se zpracováním =======================
   Zbytek modalu je `.h-ask*` z vlasimo.css + vlasimo-base.css a inline
   styly neměl. Migrují se jen dva: obal checkboxu a čtvereček. Třídy
   `.vl-cform__cb` / `.vl-cform__box` na prvcích ZŮSTÁVAJÍ, nesou chování
   (:checked, :focus-visible, průhlednost SVG). */
.vl-ask__gdpr { position: relative; cursor: pointer; }
.vl-ask__gdprbox { width: 18px; height: 18px; min-width: 18px; margin-top: 1px; border-radius: 5px; border: 1px solid #d5d2c6; background: #fdfcf8; display: flex; align-items: center; justify-content: center; color: #ffffff; }

/* ===== parts/info-tip.php — ikona bubliny =================================
   Ostatní `.vl-tip*` pravidla zůstávají ve vlasimo-base.css: nevznikla
   z inline stylů a stěhovat je sem by byl jen pohyb bez užitku. */
.vl-tip__ico { display: block; }

/* ===== Tablet 769–1024 =====================================================
   Náhrada osiřelého pravidla z vlasimo-base.css ř. 1100. Platí na VŠECH
   místech, kde se kartička kreslí (poukazy i výpis) — původní selektor
   `[style*=…]` taky nebyl ničím zaobalený. */
@media (min-width: 769px) and (max-width: 1024px) {
	.vl-vch__amount { font-size: 37px; }
}

/* ===== Mobil ≤768 ==========================================================
   Jen uvnitř `.vl-dcontent` (stránka /darkove-poukazy/) — přesně tak, jak
   to dělalo `.vl-dcontent [style*="font-size:46px"]` ve vlasimo-base.css.
   Na výpisu produktů kartička v `.vl-dcontent` není a částka tam zůstává
   46px (ověřeno probem: obchod@390 i sk-obchod@390 = 46px). */
@media (max-width: 768px) {
	.vl-dcontent .vl-vch__amount { font-size: 32px; }
}

/* ==== footer-mobile.css ================================================= */
/* ===========================================================================
   parts/footer-mobile.php — mobilní patička (návrh „Vlasimo homepage – mobil",
   blok 12). Styly vytažené z markupu do tříd `.vl-ftrm-*`.

   Part je GENEROVANÝ (tools/build-mobile.py) — mapa „inline styl → třída" je
   v generátoru v bloku mezi značkami BEGIN/END, vložila ji migrace
   tools/migrate/29-home-mobile.py. Part se needituje.

   Kreslí se jen do 768 px (`.vl-mobile` v base.css), vlastní media query
   proto nemá. Řádek s doménami mutací nekreslí tenhle part, ale sdílený
   helper `vlasimo_footer_domain()` z functions.php (společný s desktopovou
   patičkou) — jeho inline styly patří k vlně 17, ne sem.
   =========================================================================== */

/* --- Tmavý blok patičky ----------------------------------------------------
   POZOR na specificitu: base.css má `body.single-product .vl-footdark
   { padding-bottom: 84px }` (a 92px pod 768 px) kvůli lepivé liště na PDP.
   Inline styl to tady dřív přebíjel, takže mobilní patička na PDP měla a má
   26 px. Aby to platilo dál, musí být selektor specifičtější než (0,2,1) —
   `.vl .vl-footdark.vl-ftrm` je (0,3,0) a vyhrává bez ohledu na pořadí
   souborů. (Jestli má mobilní patička na PDP místo pro lištu dostat, je
   samostatné rozhodnutí — migrace vzhled nemění.) */
.vl .vl-footdark.vl-ftrm { background: #16211c; padding: 30px 20px 26px; }
.vl-ftrm__logo { height: 26px; width: auto; display: block; }
/* `.vl p { text-align: justify }` platí dál — v inline stylu to nebylo a
   nepřidává se to ani sem. */
.vl-ftrm__about { margin: 10px 0 0; font-size: 12.5px; line-height: 1.6; color: #9fb0a4; }

/* --- Kontakt: telefon a e-mail vedle sebe ----------------------------------
   O zalomení pod sebe rozhoduje `auto-fit`, ne breakpoint — šířka závisí na
   délce e-mailu a čísla, která se liší per mutace. */
.vl-ftrm-contact { display: grid; grid-template-columns: repeat(auto-fit, minmax(148px, 1fr)); gap: 12px 18px; margin-top: 14px; }
.vl-ftrm-contact__col { display: flex; flex-direction: column; gap: 2px; }
.vl-ftrm-contact__val { font-size: 15px; font-weight: 600; color: #ffffff; }
/* Telefon je `<a href="tel:">`; bílá musí přebít `.vl a` i `.vl a:hover`
   (inline styl to dřív dělal sám). `a[href^="tel:"]:not([class])`
   z vlasimo.css na prvek s třídou už nemíří. */
.vl a.vl-ftrm-contact__val, .vl a.vl-ftrm-contact__val:hover { color: #ffffff; text-decoration: none; }
.vl-ftrm-contact__note { font-size: 12px; color: #9fb0a4; }
/* Řádek s tečkou stavu (vlasimo_oh_dot) — tečka musí sedět na účaří textu. */
.vl-ftrm-contact__note--dot { display: inline-flex; align-items: center; gap: 6px; }

/* --- Dva sloupce odkazů ---------------------------------------------------- */
.vl-ftrm-nav { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; margin-top: 22px; padding-top: 20px; border-top: 1px solid #26332b; }
.vl-ftrm-nav__col { display: flex; flex-direction: column; gap: 9px; }
.vl-ftrm-nav__title { font-size: 11px; font-weight: 600; letter-spacing: .12em; text-transform: uppercase; color: #6f8377; }
.vl-ftrm-nav__item { font-size: 13px; color: #d5dfd8; }
/* Odkazy nesou i `.vl-flink`, na který parts/footer.css cílí
   `.vl a.vl-flink { color: inherit }` a `:hover { color:#ffd21f }` (0,2,1).
   Inline styl obojí dřív přebíjel — mobilní patička hover nikdy neměla a
   světle zelené odkazy by po migraci na tmavém podkladu ztmavly na `inherit`.
   Dvojitá třída (0,3,1) / (0,4,1) to drží nezávisle na pořadí souborů. */
.vl a.vl-flink.vl-ftrm-nav__item,
.vl a.vl-flink.vl-ftrm-nav__item:hover { color: #d5dfd8; }

/* --- Loga dopravců a plateb (parts/footer-coop.php) ------------------------ */
.vl-ftrm-coop { margin-top: 18px; }

/* --- Domény mutací + tiráž ------------------------------------------------- */
.vl-ftrm-dom { display: flex; align-items: center; gap: 12px; margin-top: 20px; padding-top: 16px; border-top: 1px solid #26332b; font-size: 12.5px; flex-wrap: wrap; }
.vl-ftrm-dom__sep { color: #3a4a3f; }
.vl-ftrm-copy { margin-top: 14px; font-size: 11.5px; color: #6f8377; }

/* ==== footer.css ======================================================== */
/* ===========================================================================
   Patička (footer.php) — styly vytažené z markupu.

   Načítá se za vlasimo-base.css / vlasimo-ui.css (inc/assets.php, seznam
   VLASIMO_PART_CSS), takže responzivní vrstvy základu jdou přebít bez
   `!important`; `!important` je tu jen tam, kde se přebíjí něco, co ho má.

   Patičky jsou dvě:
     .vl-ftr-chk__*  trust pás na pokladně a děkovačce (mimo vrstvy
                     .vl-desktop/.vl-mobile, kreslí se ve všech šířkách)
     .vl-ftr__*      plná patička uvnitř .vl-desktop (pod 768 px ji střídá
                     parts/footer-mobile.php)
   a panel košíku (`.vl-ftr__cart-*`), který je fixed a musí zůstat mimo obě
   vrstvy — proto sedí v footer.php, i když s patičkou nesouvisí.

   Hodnoty jsou změřené computed styly (1440 / 1024 / 900 / 769 / 768 / 390 px),
   ne čísla z návrhu. Jeden rozdíl proti zápisu v base.css je záměrný:
   `justify-content: center` z mobilního pravidla trust pásu se sem NEPŘENESLO —
   deklarace neměla `!important` a inline `justify-content:space-between` ji
   přebíjelo, takže se nikdy neuplatnila. Po migraci by vyhrála a loga plateb
   by se na telefonu přesunula doprostřed.

   Migrace: tools/migrate/17-header-footer.py
   =========================================================================== */

/* ===========================================================================
   POKLADNÍ PATIČKA (trust pás)
   =========================================================================== */
.vl-ftr-chk { background: #f6f5ef; border-top: 1px solid #e3e0d4; }
.vl-ftr-chk__wrap { max-width: 1440px; margin: 0 auto; padding: 18px 48px; display: flex; align-items: center; justify-content: space-between; gap: 20px; font-size: 12.5px; color: #8a887f; }
.vl-ftr-chk__pays { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; }
.vl-ftr-chk__pay { border: 1px solid #e3e0d4; background: #ffffff; border-radius: 7px; padding: 5px 9px; display: inline-flex; align-items: center; }
.vl-ftr-chk__pay-img { height: 13px; width: auto; display: block; }

/* Přesun z vlasimo-base.css. Boční 32 px pod 900 px drží `!important` — obecné
   `.vl-wrap` tam jinak stahuje na 20 px. */
@media (min-width: 769px) and (max-width: 1024px) {
	.vl-ftr-chk__wrap { max-width: 1024px !important; padding: 16px 32px !important; }
}
@media (max-width: 768px) {
	.vl-ftr-chk__wrap { padding: 12px 16px !important; flex-wrap: wrap; gap: 8px 14px; }
}

/* ===========================================================================
   PLNÁ PATIČKA
   =========================================================================== */
.vl-ftr { background: #16211c; }
.vl-ftr__grid { max-width: 1440px; margin: 0 auto; padding: 56px 48px 40px; display: grid; grid-template-columns: 1.4fr 1fr 1fr 1.2fr; gap: 48px; align-items: start; }

/* Sloupec značky */
.vl-ftr__brand { display: flex; flex-direction: column; gap: 16px; }
.vl-ftr__logo { height: 30px; width: auto; display: block; align-self: flex-start; }
/* `.vl p { text-align: justify }` platí dál — do třídy se text-align schválně
   nepíše, jinak by se odstavec přerovnal. */
.vl-ftr__about { margin: 0; font-size: 14px; line-height: 1.65; color: #9fb0a4; max-width: 34ch; text-wrap: pretty; }
.vl-ftr__domains { display: flex; align-items: center; gap: 14px; font-size: 13.5px; flex-wrap: wrap; }
.vl-ftr__dot { color: #3a4a3f; }

/* Odkazové sloupce */
.vl-ftr__col { display: flex; flex-direction: column; gap: 14px; }
.vl-ftr__coltitle { font-size: 12px; font-weight: 600; letter-spacing: .14em; text-transform: uppercase; color: #8fa396; }
.vl-ftr__links { display: flex; flex-direction: column; gap: 11px; font-size: 14px; color: #c8d4cb; }
/* Odkazy patičky (i mobilní vrstvy) — dřív <style> blok přímo ve footer.php.
   `.vl a.vl-flink:hover` (0,3,1) přebíjí `.vl a:hover`, takže hover funguje
   i bez toho, aby pravidlo stálo až v <body>. */
.vl a.vl-flink { color: inherit; transition: color .15s; }
.vl a.vl-flink:hover { color: #ffd21f; }

/* Spodní pruh (linka + copyright) */
.vl-ftr__bottom { max-width: 1440px; margin: 0 auto; padding: 0 48px; }
.vl-ftr__rule { height: 1px; background: #26332b; }
.vl-ftr__legal { padding: 22px 0 26px; display: flex; align-items: center; justify-content: space-between; gap: 24px; font-size: 13px; color: #6f8377; }

/* Přesun z vlasimo-base.css (blok „Vnitřní odsazení karet 01–04 a sekcí
   s vlastním pozadím"). Platí i pod 768 px, kde je patička skrytá — computed
   hodnoty se tím nemění. Bez `!important` by pod 900 px vyhrálo obecné
   `.vl-wrap` s 20 px. Spodní pruh `.vl-ftr__bottom` naopak žádné vlastní
   pravidlo nemá: 32/20 px mu obecné `.vl-wrap` dává správně samo. */
@media (max-width: 1024px) {
	.vl-ftr__grid { padding: 36px 32px !important; }
}

/* ===========================================================================
   POSTRANNÍ PANEL KOŠÍKU
   Fixed prvek mimo vrstvy .vl-desktop/.vl-mobile (uvnitř display:none rodiče
   by nefungoval). Skrytí drží atribut `hidden` — `[hidden]{display:none
   !important}` z vlasimo.css přebíjí `display:flex` tady stejně, jako dřív
   přebíjelo inline styl.
   POZOR: obal `.vl-ftr__cart-body` je zduplikovaný ve functions.php (fragment
   `[data-vl-cart-body]`, který WooCommerce vrací po změně košíku) — při změně
   měnit obojí.
   =========================================================================== */
.vl-ftr__cart-overlay { position: fixed; inset: 0; z-index: 220; background: rgba(22, 33, 28, .55); display: flex; justify-content: flex-end; }
.vl-ftr__cart-panel { width: 520px; max-width: 94vw; height: 100vh; background: #fdfcf8; box-shadow: -30px 0 80px rgba(22, 33, 28, .35); display: flex; flex-direction: column; }
.vl-ftr__cart-body { display: flex; flex-direction: column; flex: 1; min-height: 0; overflow-y: auto; overscroll-behavior: contain; }

/* ==== header-mobile.css ================================================= */
/* ===========================================================================
   parts/header-mobile.php — mobilní hlavička + hamburger overlay
   (návrhy „Vlasimo homepage – mobil", bloky 1–2, a „Vlasimo mobilní menu",
   zip 11). Styly vytažené z markupu do tříd `.vl-hdrm-*`.

   Part je GENEROVANÝ (tools/build-mobile.py) — mapa „inline styl → třída"
   je v generátoru v bloku mezi značkami BEGIN/END, vložila ji migrace
   tools/migrate/29-home-mobile.py. Part se needituje.

   Hlavička má vlastní hranici 840 px (base.css: `.vl-hdr` / `.vl-hdr-m`),
   obsah stránek se přepíná až na 768 px. Vlastní media query proto tenhle
   soubor NEMÁ — kreslí se jen v mobilní vrstvě a hodnoty jsou rovnou její.

   Co zůstává v base.css (třídy, ne inline styly — migrace se jich netýká):
     `.vl-mm-nav a:last-child { border-bottom: 0 !important }`,
     `[data-vl-mmenu] { padding-top: env(safe-area-inset-top) }`,
     `.vl-cta` / `.vl-cta:hover`, `.vl-mtop`.
   =========================================================================== */

/* --- Žlutá lišta ----------------------------------------------------------
   Táž lišta je v hlavičce i nahoře v overlayi; v overlayi navíc nesmí být
   stlačitelná flexem rodiče (`--fixed`). */
.vl-hdrm-bar { background: #ffd21f; display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 0 16px; height: 60px; }
.vl-hdrm-bar--fixed { flex: none; }

/* Logo a ikonky. Obě `<a>` nemají vlastní barvu ani v původním inline stylu —
   dědí `.vl a` (#16211c) a na hover `.vl a:hover`; nechává se to tak. */
.vl-hdrm-logo { display: flex; }
.vl-hdrm-logo__img { height: 21px; width: auto; display: block; }
.vl-hdrm-tools { display: flex; align-items: center; gap: 2px; }
.vl-hdrm-icon { width: 42px; height: 44px; display: flex; align-items: center; justify-content: center; }
.vl-hdrm-svg { display: block; }
.vl-hdrm-cart { position: relative; width: 44px; height: 44px; display: flex; align-items: center; justify-content: center; cursor: pointer; }
/* Počet v košíku plní JS přes `data-vl-header-count` — atribut na prvku zůstal. */
.vl-hdrm-badge { position: absolute; top: 2px; right: 1px; min-width: 17px; height: 17px; border-radius: 50%; background: #0d8f46; color: #ffffff; font-size: 10.5px; font-weight: 600; display: flex; align-items: center; justify-content: center; padding: 0 4px; border: 2px solid #ffd21f; }
.vl-hdrm-sep { width: 1px; height: 26px; background: rgba(22, 33, 28, .18); margin: 0 6px; }
.vl-hdrm-menubtn { display: flex; align-items: center; gap: 7px; height: 44px; padding: 0 2px; cursor: pointer; }
.vl-hdrm-menubtn__label { font-size: 14.5px; font-weight: 600; color: #16211c; }

/* --- Overlay menu ---------------------------------------------------------
   Otvírá a zavírá ho JS přepnutím atributu `hidden`; `[hidden]{display:none
   !important}` z vlasimo.css přebíjí `display:flex` odsud stejně, jako dřív
   přebíjelo inline styl. `padding-top` do safe area přidává base.css. */
.vl-hdrm-mm { position: fixed; inset: 0; z-index: 220; background: #fdfcf8; display: flex; flex-direction: column; overflow: auto; }
/* Horní odsazení 18 → 10 px a řádky menu 53 → 44 px (David 12. 9.: „menší mezery,
   ale ne těsné“) — 44 px je pořád plná dotyková plocha. Zbytek (CTA, dlaždice,
   telefon) beze změny. */
.vl-hdrm-mm__body { padding: 10px 20px 28px; display: flex; flex-direction: column; gap: 22px; }

/* Hlavní navigace. Barva textu musí být psaná `.vl a.…` — jinak by položky
   na hover zezelenaly (`.vl a:hover`), což inline styl dřív nedovolil. */
/* Mezera nad CTA „Produkty“ stejná jako pod ním (David 12. 9.): poslední položka
   má spodní padding 10 px a tělo menu mezeru 22 px, takže od textu k tlačítku
   bylo 33 px, pod tlačítkem 22 — záporný okraj ten padding odečte a dotyková
   plocha poslední položky zůstává celá. */
.vl-hdrm-nav { display: flex; flex-direction: column; margin-bottom: -11px; }
.vl-hdrm-nav__item { display: flex; align-items: center; gap: 12px; padding: 10px 0; line-height: 1.5; border-bottom: 1px solid #efece1; font-size: 16px; font-weight: 500; }
/* Domeček u „Úvod“: střed ikony k optickému středu textu (verzálky sedí nad středem
   řádku), o pixel výš než geometrický střed. */
.vl-hdrm-nav__item svg:first-child { position: relative; top: -1px; }
.vl-hdrm-nav__item--between { justify-content: space-between; }
.vl a.vl-hdrm-nav__item, .vl a.vl-hdrm-nav__item:hover { color: #16211c; }
.vl-hdrm-ico { flex: none; }

/* Zelené CTA „Objednat" je `.vl-cta` z base.css jen zvětšené. Dvojitá třída
   drží přednost nezávisle na pořadí souborů; `:hover` je vypsaný, protože
   `.vl-cta:hover` stahuje stín na 2 px a inline styl to dřív nedovolil. */
.vl-cta.vl-hdrm-cta, .vl-cta.vl-hdrm-cta:hover { height: 54px; border-radius: 13px; font-size: 16px; gap: 10px; box-shadow: 0 4px 0 #075c2e; }

/* --- Skupiny pod navigací (dlaždice, telefon, jazyky) ---------------------- */
.vl-hdrm-group { display: flex; flex-direction: column; gap: 8px; }
.vl-hdrm-group__title { font-size: 10.5px; font-weight: 600; letter-spacing: .12em; text-transform: uppercase; color: #8a887f; }
.vl-hdrm-tiles { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
.vl-hdrm-tile { display: flex; align-items: center; gap: 8px; background: #ffffff; border: 1px solid #e3e0d4; border-radius: 12px; padding: 12px 11px; font-size: 13px; font-weight: 500; white-space: nowrap; }
.vl a.vl-hdrm-tile, .vl a.vl-hdrm-tile:hover { color: #16211c; }

/* Telefon. Původní markup byl `<a href="tel:">` BEZ třídy, takže na něj mířilo
   `a[href^="tel:"]:not([class])` z vlasimo.css a odkaz měl `color:inherit`
   (#3d443e po pruhu) — s třídou to pravidlo přestává platit, proto se
   `inherit` píše sem. Hover byl a zůstává `.vl a:hover` (#0b7c3d). */
.vl-hdrm-phone { display: flex; align-items: center; gap: 12px; background: #ffffff; border: 1px solid #e3e0d4; border-radius: 12px; padding: 12px 14px; }
.vl a.vl-hdrm-phone { color: inherit; }
.vl a.vl-hdrm-phone:hover { color: #0b7c3d; }
.vl-hdrm-phone__ico { width: 38px; height: 38px; min-width: 38px; border-radius: 50%; background: #e4eee6; display: flex; align-items: center; justify-content: center; }
.vl-hdrm-phone__txt { display: flex; flex-direction: column; gap: 1px; }
.vl-hdrm-phone__num { font-size: 15.5px; font-weight: 600; color: #16211c; }
.vl-hdrm-phone__hours { font-size: 12px; color: #5d6b62; }

/* Přepínač jazyků: dřív dynamický inline styl (`$vl_l['active'] ? … : …`),
   dvě hodnoty → základ + modifikátor. */
.vl-hdrm-lang { display: flex; align-items: center; gap: 9px; background: #ffffff; border: 1px solid #e3e0d4; font-weight: 500; border-radius: 12px; padding: 11px 12px; font-size: 13.5px; }
.vl-hdrm-lang--active { background: #e4eee6; border-color: #c6dbcb; font-weight: 600; }
.vl a.vl-hdrm-lang, .vl a.vl-hdrm-lang:hover { color: #3d443e; }
.vl a.vl-hdrm-lang--active, .vl a.vl-hdrm-lang--active:hover { color: #16211c; }
.vl-hdrm-lang__flag { display: inline-flex; border-radius: 2.5px; overflow: hidden; line-height: 0; flex: none; }

/* --- Poznámka na konci menu (topbar_center) -------------------------------- */
.vl-hdrm-note { display: flex; align-items: center; gap: 10px; padding: 12px 14px; border: 1px solid #e3e0d4; border-radius: 12px; background: #f6f5ef; font-size: 12.5px; line-height: 1.5; color: #3d443e; }

/* --- Lepivá hlavička na mobilu (David 11. 9.) --------------------------------
   Pořád vidět, nikdy se neschovává — na rozdíl od desktopu nad 1024 px.
   Pokladna a děkovačka ji nedostanou samy od sebe: `header.php` pro ně na
   řádku 25 vykreslí vlastní pruh s kroky a skončí `return`, takže `.vl-hdr-m`
   se tam vůbec nevykreslí.

   `--hm-hdr` si na desktopu publikuje skript podle toho, kolik z hlavičky je
   vidět; tady je konstantní, protože se hlavička nehýbe. Čtou ji lepivé prvky
   v obsahu, aby jim hlavička nepodjížděla. */
.vl-hdr-m { position: sticky; top: 0; z-index: 100; }
@media (max-width: 839px) {
	/* `body:not(...)` schválně: pokladna a děkovačka mobilní hlavičku vůbec
	   nevykreslí (`header.php` tam skončí `return`), takže by odsazení kotev
	   z `[id] { scroll-margin-top }` posouvalo o 60 px do prázdna. WooCommerce
	   dává `woocommerce-checkout` obojímu. */
	body:not(.woocommerce-checkout) { --hm-hdr: 60px; }
}

/* ==== header.css ======================================================== */
/* ===========================================================================
   Hlavička (header.php) — styly vytažené z markupu.

   Načítá se za vlasimo-base.css / vlasimo-ui.css (inc/assets.php, seznam
   VLASIMO_PART_CSS), takže responzivní vrstvy základu jdou přebít bez
   `!important`; `!important` je tu jen tam, kde se přebíjí něco, co ho má.

   Hlavičky jsou dvě:
     .vl-hdr-chk__*  ořezaná pokladní (is_checkout / děkovačka) — mimo vrstvy
                     .vl-desktop/.vl-mobile, kreslí se ve VŠECH šířkách
     .vl-hdr__*      normální (topbar + žlutý pruh), uvnitř .vl-desktop.vl-hdr,
                     pod 840 px ji střídá mobilní .vl-hdr-m

   Zdrojem hodnot NEJSOU čísla z návrhu, ale computed styly živé stránky
   (1440 / 1100 / 1024 / 1000 / 900 / 840 / 768 / 390 px) — na kontejnerech se
   potkávalo několik `[style*=]` pravidel naráz a rozhodovala specificita
   i pořadí: `gap:16px` z pravidla pokladní hlavičky se nikdy neuplatnil,
   protože ho přebíjí specifičtější `.vl-wrap[style*="height:72px"]` (22 px,
   pod 900 px 10 px). V CSS jsou proto změřené hodnoty, ne ty zapsané.

   Kontejnery si nechávají třídu `.vl-wrap` — obecná pravidla základu na ni
   (max-width 1024, boční 32/20 px) jsou strukturální a musí dál platit.

   Migrace: tools/migrate/17-header-footer.py
   =========================================================================== */

/* --- Žlutý podklad ---------------------------------------------------------
   Stejný pruh nese pokladní i normální hlavička. */
.vl-hdr__band { background: #ffd21f; }

/* --- Logo (sdílené oběma hlavičkami) --------------------------------------- */
.vl-hdr__logo { display: flex; align-items: center; }
.vl-hdr__logo-img { height: 25px; width: auto; display: block; }
.vl-hdr-chk__logo-img { height: 24px; width: auto; display: block; }

/* ===========================================================================
   POKLADNÍ HLAVIČKA
   =========================================================================== */
.vl-hdr-chk__wrap { max-width: 1440px; margin: 0 auto; display: flex; align-items: center; gap: 40px; padding: 0 48px; height: 72px; }

/* Krokový indikátor. Stav byl v PHP uvnitř style atributu (`$vl_step2 ? '600'
   : '500'`), množina stavů je konečná → modifikátory. `--next` u druhého kroku
   je dnes nedosažitelná větev (na děkovačce se kreslí `--done`, jinde `--now`),
   zůstává, aby se chování nezměnilo. */
.vl-hdr-chk__steps { display: flex; align-items: center; gap: 12px; margin: 0 auto; font-size: 14px; white-space: nowrap; }
.vl-hdr-chk__step { display: inline-flex; align-items: center; gap: 7px; }
.vl-hdr-chk__step--done { font-weight: 600; color: #0b7c3d; }
.vl-hdr-chk__step--now  { font-weight: 600; color: #16211c; }
.vl-hdr-chk__step--next { font-weight: 500; color: #8a7712; }
/* První krok je odkaz do košíku. `.vl a` (0,1,1) přebíjí holou třídu a
   `.vl a:hover` by ho zezelenal — inline styl to dřív nedovolil, takže
   i hover musí být explicitně stejný. */
.vl a.vl-hdr-chk__step--done,
.vl a.vl-hdr-chk__step--done:hover { color: #0b7c3d; }

.vl-hdr-chk__ico { display: block; }
.vl-hdr-chk__line { width: 28px; height: 1.5px; background: #d9b117; }
/* Tečka nemá `display` — je flex položkou kroku, takže se blokuje sama. */
.vl-hdr-chk__dot { width: 8px; height: 8px; border-radius: 50%; }
.vl-hdr-chk__dot--now  { background: #16211c; }
.vl-hdr-chk__dot--next { border: 1.5px solid #8a7712; }

.vl-hdr-chk__secure { display: flex; align-items: center; gap: 8px; font-size: 14px; font-weight: 600; color: #16211c; }

/* Tablet i mobil (pruh se kreslí ve všech šířkách): řádek se zalomí,
   `height:72px` ustoupí min-výšce 56 px. Přesun z vlasimo-base.css. */
@media (max-width: 1024px) {
	.vl-hdr-chk__wrap { max-width: 100% !important; gap: 22px; padding: 10px 16px !important; height: auto; min-height: 56px; flex-wrap: wrap; }
	/* Logo a odkazy se ve zúženém flexu smrskávaly. */
	.vl-hdr-chk__wrap img { flex: none; }
	.vl-hdr-chk__wrap a { white-space: nowrap; flex: none; }
}
@media (max-width: 900px) {
	.vl-hdr-chk__wrap { gap: 10px; }
	.vl-hdr-chk__wrap a { font-size: 13.5px; }
}
@media (max-width: 768px) {
	/* Pokladna na mobilu po vzoru Herbasu (David 8. 9., `h-chkbar` v herbas.css):
	   v prvním řádku logo a „Zabezpečená pokladna“, pod nimi dělící čára a kroky
	   na vlastním řádku na střed.

	   Svislý rytmus se řídí odsazením obalu a odsazením kroků, ne `row-gap` —
	   proto `row-gap: 0`. Nad čárou 12 px, pod ní 11 px, stejně nahoře nad logem
	   a dole pod kroky; s původním `gap: 10px` + `margin-top: 3px` byl pruh
	   opticky spodem těžší. */
	.vl-hdr-chk__wrap {
		flex-wrap: wrap; column-gap: 10px; row-gap: 0;
		padding: 12px 16px 11px !important; /* přebíjí `10px 16px !important` z ≤1024 */
	}
	/* `flex-basis: 100 %` je 100 % OBSAHOVÉ šířky obalu, tedy bez jeho paddingu:
	   negativní margin pak posunul jen levou hranu a čára končila 32 px před
	   pravým krajem (a kroky byly o 16 px mimo osu). `calc(100% + 32px)` vrací
	   padding zpět do šířky, takže čára jde od kraje ke kraji a kroky sedí
	   přesně na střed displeje. */
	.vl-hdr-chk__steps {
		order: 5; flex-basis: calc(100% + 32px); justify-content: center;
		margin: 12px -16px 0; padding: 11px 16px 0;
		/* Krémová čára z Herbasu je tam na bílém pruhu; na žlutém podkladu Vlasima
		   svítí. Průsvitná tmavá se chová jako ztmavení žluté, ne jako cizí barva. */
		border-top: 1px solid rgba(22, 33, 28, .14);
		white-space: normal; font-size: 12px; gap: 8px;
	}
	.vl-hdr-chk__line { width: 16px; background: rgba(22, 33, 28, .22); }
	/* Do 8. 9. `display:none` — jenže v okamžiku placení je to jediný signál
	   bezpečí, který zákazník na telefonu vidí (David 8. 9.).
	   `top: 2px` je optická korekce: logo je lowercase wordmark bez dolních
	   dotahů, jeho optický střed leží níž než střed řádku textu vedle, takže
	   po geometrickém `align-items: center` vypadá popisek povytažený. */
	.vl-hdr-chk__secure { display: flex; position: relative; top: 2px; margin-left: auto; font-size: 11.5px; gap: 6px; }
}

/* Nejužší telefony (320 px): trojice kroků se na 12 px nevejde, „Doprava a
   platba“ se zalomí do dvou řádků a pruh ztratí osu i výšku. Zmenšení písma
   a mezer ji udrží na jednom řádku; logo i popisek jdou dolů s ní, aby první
   řádek nebyl na doraz. */
@media (max-width: 359px) {
	.vl-hdr-chk__logo-img { height: 22px; }
	.vl-hdr-chk__secure { font-size: 11px; gap: 5px; }
	.vl-hdr-chk__steps { font-size: 10.5px; gap: 5px; }
	.vl-hdr-chk__line { width: 10px; }
}

/* ===========================================================================
   NORMÁLNÍ HLAVIČKA — topbar
   =========================================================================== */
.vl-hdr__topbar { background: linear-gradient(90deg, #101a14 0%, #1f4d3a 55%, #2e6b4f 100%); color: #c8d4cb; border-bottom: none; font-size: 13px; }
.vl-hdr__topwrap { max-width: 1440px; margin: 0 auto; height: 34px; display: flex; align-items: center; gap: 26px; padding: 0 48px; }
.vl-hdr__phone { font-weight: 500; color: #ffffff; }
.vl-hdr__hours { display: flex; align-items: center; gap: 7px; }
/* Kód akce / název kampaně uprostřed lišty. */
.vl-hdr__code { color: #ffd21f; font-weight: 600; }
/* Nápověda a účet vpravo dědí barvu lišty; hover se nemění (inline styl ho
   dřív držel, `.vl a:hover` by je zezelenal). */
.vl a.vl-hdr__toplink,
.vl a.vl-hdr__toplink:hover { color: inherit; }

/* ===========================================================================
   NORMÁLNÍ HLAVIČKA — žlutý pruh s logem, menu a tlačítky
   =========================================================================== */
.vl-hdr__barwrap { max-width: 1440px; margin: 0 auto; display: flex; align-items: center; gap: 40px; padding: 0 48px; height: 76px; }
.vl-hdr__nav { display: flex; align-items: center; gap: 30px; margin: 0 auto; font-size: 15px; font-weight: 500; color: #16211c; white-space: nowrap; }
/* Domeček: `display:contents` pustí svg přímo do flexu menu. Barva přes
   `.vl a`, aby ji třída nepřebila naopak. */
.vl-hdr__home { display: contents; }
.vl a.vl-hdr__home,
.vl a.vl-hdr__home:hover { color: #16211c; }
/* Fallback menu (bez WP menu „primary"). Položky z WP menu kreslí walker
   Vlasimo_Inline_Menu ve functions.php a inline `color:#16211c` si nechává —
   výsledek je stejný, `.vl a` dává tutéž barvu. */
.vl a.vl-hdr__navlink,
.vl a.vl-hdr__navlink:hover { color: #16211c; }

.vl-hdr__actions { display: flex; gap: 12px; align-items: center; }
.vl-hdr__cta { background: #0d8f46; font-size: 15px; font-weight: 500; padding: 11px 22px; border-radius: 10px; box-shadow: 0 3px 0 #075c2e; }
.vl a.vl-hdr__cta,
.vl a.vl-hdr__cta:hover { color: #ffffff; }
/* Košík: od 12. 9. jen ikona se zeleným kolečkem (varianta D z plátna „Ikona
   košíku v hlavičce“) — stejná ikona a stejné kolečko jako `.vl-hdrm-cart` /
   `.vl-hdrm-badge` v mobilní liště, jen o 2 px větší. Dotyková plocha 44 px.
   Černé tlačítko „Košík · N“ a přepínání slova/ikony pod 1100 px tím končí. */
.vl-hdr__cart { position: relative; width: 44px; height: 44px; display: flex; align-items: center; justify-content: center; }
.vl a.vl-hdr__cart,
.vl a.vl-hdr__cart:hover { color: #16211c; }
.vl-hdr__cart-icon { display: block; }
.vl-hdr__badge { position: absolute; top: 1px; right: 1px; min-width: 19px; height: 19px; box-sizing: border-box; border-radius: 999px; background: #0d8f46; color: #ffffff; font-size: 11px; font-weight: 600; line-height: 1; display: flex; align-items: center; justify-content: center; padding: 0 4px; border: 2px solid #ffd21f; }

/* ===== Tablet 769–1024 =====================================================
   Boční 32 px si obě lišty drží i pod 900 px — v základu to dělalo pořadí
   pravidel (`[style*=…height:76px]` stálo až za obecným `.vl-wrap`, které
   pod 900 px stahuje na 20 px). Pod 769 px pravidlo mizí a platí obecných
   20 px, jak tomu bylo i dřív. */
@media (min-width: 769px) and (max-width: 1024px) {
	.vl-hdr__topwrap,
	.vl-hdr__barwrap { max-width: 1024px !important; padding: 0 32px !important; }
}
@media (max-width: 1024px) {
	/* Na 1024 px se logo, menu a obě tlačítka ještě vejdou — stahují se mezery,
	   ne položky menu. */
	.vl-hdr__barwrap { gap: 22px; }
	.vl-hdr__topwrap { gap: 16px; }
	.vl-hdr__barwrap img { flex: none; }
	.vl-hdr__barwrap a { white-space: nowrap; flex: none; }
}
@media (max-width: 900px) {
	/* Užší tablety (840–900 px; pod 840 px nastupuje mobilní hlavička). */
	.vl-hdr__barwrap { gap: 10px; }
	.vl-hdr__barwrap a { font-size: 13.5px; }
	/* Menu samo bylo 474 px a hlavička se do 753 px nevešla o 42 px — stahuje
	   se proto i jeho vnitřní mezera a písmo, ne jen mezery mezi bloky. */
	.vl-hdr__nav { gap: 13px; font-size: 13.5px; }
}

/* --- Lepivá hlavička (David 11. 9.) ------------------------------------------
   Do teď hlavička odrolovala pryč. Teď je `sticky` na všech šířkách, kde se
   vůbec kreslí (od 840 px; níž nastupuje `.vl-hdr-m`, ta má vlastní pravidlo).

   Nad 1024 px se navíc při scrollu DOLŮ schová a při scrollu NAHORU vyjede zpět
   — třídy `is-float` a `is-hidden` na ni věší zděděný blok `[data-vl-hdr]` ve
   `vlasimo.js`, který do 11. 9. nikdy neběžel, protože ten atribut v šabloně
   nebyl. Na tabletu (840–1024) schovávání ZÁMĚRNĚ neplatí: David chce menu
   držet jako na mobilu, tedy pořád vidět. Řídí to jen tahle media query —
   skript třídy věší na všech šířkách, ale bez `transform` se nic neděje.

   `z-index: 100` je pod panely a modaly (120 a výš) a pod menu overlayem (220),
   takže hlavička nikdy nepřekryje jejich zavírací křížek. */
.vl-hdr { position: sticky; top: 0; z-index: 100; }
.vl-hdr.is-float { box-shadow: 0 6px 20px rgba(22, 33, 28, .07); }
@media (min-width: 1025px) {
	.vl-hdr { transition: transform .28s ease, box-shadow .28s ease; }
	.vl-hdr.is-hidden { transform: translateY(-100%); }
}

/* ==== home-mobile.css =================================================== */
/* ===========================================================================
   parts/home-mobile.php — mobilní homepage (návrh „Vlasimo homepage – mobil",
   bloky 3–11). Styly vytažené z markupu do tříd `.vl-hpm-*`.

   Part je GENEROVANÝ (tools/build-mobile.py). Mapa „inline styl → třída" je
   v generátoru v bloku mezi značkami BEGIN/END; vložila ji migrace
   tools/migrate/29-home-mobile.py. Přejmenování třídy = úprava generátoru
   a přegenerování, ne editace partu.

   Načítá se za vlasimo-base.css / vlasimo-ui.css (inc/assets.php,
   VLASIMO_PART_CSS), takže responzivní vrstvy základu jdou přebít bez
   `!important`.

   Vrstva se kreslí jen do 768 px (`.vl-mobile` v base.css), vlastní media
   query proto NEMÁ — hodnoty jsou rovnou mobilní. Jediná výjimka je pás USP
   dole: k pixelové shodě computed stylů potřebuje tabletové pravidlo, i když
   je v té šířce schovaný (viz komentář u `.vl-hpm-usp`).

   Zdroj hodnot = hotový part + snímek tools/css-snap/w5/hp@390.json, ne čísla
   z návrhu.
   =========================================================================== */

/* --- Hero: text nad fotkou ------------------------------------------------- */
.vl-hpm-hero__copy { position: relative; z-index: 1; padding: 26px 20px 0; }

/* Nadpisek „České výrobky · Sedm let…". Části `.vl-kicker__pre` / `__dot`
   schovává základ pod 409 px (`display:none !important`) — tady jen kresba. */
.vl-hpm-kicker { display: flex; align-items: center; gap: 9px; font-size: 10.5px; font-weight: 600; letter-spacing: .12em; text-transform: uppercase; color: #0b7c3d; }
.vl-hpm-kicker__dot { width: 4px; height: 4px; border-radius: 50%; background: #c99a12; }

/* `h1,h2,h3 { margin:0 }` z vlasimo.css je jen (0,0,0,1), třída ho přebije.
   Zelený `<strong>` uvnitř kreslí `.vl-mobile h1 strong` v base.css.

   Velikost se škáluje se šířkou displeje, aby titulek zůstal na DVOU řádcích
   (David 11. 9.). Pevných 30 px se vešlo na dva řádky až od 412 px; na 390 a níž
   se lámal na tři. Naměřená mez pro dva řádky roste lineárně se šířkou —
   7,34 px na 1 vw při 320 px až 7,57 při 412 px (české znění „Funkční péče pro
   silnější vlasy zevnitř i zvenčí", to slovenské je kratší a snese 8,3).
   Bere se **7vw mínus 1 px**. To `- 1px` není kosmetika: `vw` počítá i svislý
   posuvník, kdežto text se láme do obsahu bez něj. Na telefonu je posuvník
   překryvný a nevadí, ale v desktopovém Firefoxu zúženém pod 768 px ubírá
   12 px — a bez odečtu vycházela rezerva na 320 px na 0,3 % a na 300 px byla
   dokonce záporná (naměřeno). S odečtem drží rezerva 4–9 % na celém rozsahu.
   Strop 30 px drží dnešní vzhled od 443 px výš, podlaha 18 px hlídá čitelnost
   pod 271 px (Galaxy Fold má 280).
   Pevná hodnota zůstává jako záloha: kdyby prohlížeč `clamp()` neznal, zahodí
   jen druhý řádek, ne celou velikost. */
.vl-hpm-hero__title { margin: 12px 0 0; font-size: 30px; line-height: 1.16; font-weight: 600; letter-spacing: -.02em; color: #16211c; text-wrap: pretty; }
.vl-hpm-hero__title { font-size: clamp(18px, calc(7vw - 1px), 30px); }
/* `.vl p { text-align: justify }` (0,0,1,1) je specifičtější než holá třída —
   hodnota je stejná, ale ať to nedrží náhoda, píše se i sem. */
.vl-hpm-hero__lead { margin: 12px 0 0; font-size: 14.5px; line-height: 1.6; color: #3d443e; text-align: justify; }

/* Odrážky hero: každá na svůj řádek, zelené kolečko s fajfkou (SVG, ne ✓). */
.vl-hpm-bullets { position: relative; z-index: 1; margin-top: 16px; font-size: 13.5px; line-height: 1.55; color: #3d443e; display: flex; flex-direction: column; gap: 8px; }
.vl-hpm-bullet { display: flex; align-items: flex-start; gap: 9px; }
.vl-hpm-bullet__ico { display: inline-flex; align-items: center; justify-content: center; width: 22px; height: 22px; min-width: 22px; border-radius: 50%; background: #0d8f46; margin-top: 1px; }

/* --- Hero: fotka jako pozadí celého bloku ----------------------------------
   Fade nahoře je vrstva nad fotkou (barva pozadí stránky), aby odrážky nad
   fotkou splývaly. `margin-top:-130px` posouvá blok pod text. AVIF/WebP
   podstrčí nginx podle Accept, proto stačí .jpg URL.

   Rozpěrka měla `calc(115.1% - 34px + 130px)`, tedy poměr fotky (900×1036 =
   115,1 %) PLUS konstantních 96 px. Ta konstanta posouvala tlačítko dolů tím
   víc, čím širší displej: mezera pod objekty vycházela 0 px na 360, 39 px na
   430 a 136 px na 768 (David 11. 9.: „na mobilu tlačítko cestuje“).

   Pod `cover` platí, že mezera závisí JEN na výšce rozpěrky, ne na šířce —
   fotka se škáluje podle výšky bloku, takže `gap ≈ 0,249 × rozpěrka − 84 −
   0,751 × patička`. Proto je rozpěrka `max(115.1% - 32px, 500px)`: na
   telefonech (do ~433 px) vyhrává konstantních 500 px a mezera drží kolem nuly
   až 17 px, nad tím se vrací na poměr fotky, aby fotka blok pořád pokryla.

   `cover` je tu podstatné: vyplní blok vždycky. Mezikrok s `123.1% auto`
   a `min()` stropem (11. 9.) mezeru srovnal, ale fotka pak byla nižší než blok
   a pod ní zbýval pruh holého pozadí stránky — přesně to, co David nahlásil.
   Kdo bude měnit fotku, musí přepočítat 115,1 % (poměr zdroje 900×1036)
   i 500 px; spodek objektů je v originále na ~778 z 1036. */
.vl-hpm-hero {
	position: relative;
	margin-top: -130px;
	background-image: linear-gradient(180deg, #fdfcf8 0, rgba(253, 252, 248, .96) 60px, rgba(253, 252, 248, .75) 105px, rgba(253, 252, 248, 0) 200px), url('/wp-content/uploads/2026/09/hero-mobil-vlasimo2.jpg');
	background-size: 100% 200px, cover;
	background-position: center top, 22% top;
	background-repeat: no-repeat, no-repeat;
}
.vl-hpm-hero__spacer { padding-top: max(calc(115.1% - 32px), 500px); }

/* Hlavní CTA. Je to `<a>`, takže barvu musí nést `.vl a.…` — `.vl a`
   (0,0,1,1) je specifičtější než holá třída. `:hover` je vypsaný taky:
   inline styl dřív přebíjel `.vl a:hover`, tlačítko tedy hover nikdy nemělo.
   V toku (`position:relative` + záporný margin) schválně, ne absolutně —
   při zalomení meta pruhu na dva řádky ho absolutní verze překryla. */
.vl-hpm-cta { position: relative; margin: -84px 20px 0; height: 56px; background: #0d8f46; border-radius: 13px; display: flex; align-items: center; justify-content: center; gap: 11px; font-size: 16.5px; font-weight: 600; box-shadow: 0 4px 0 #075c2e, 0 12px 28px rgba(22, 33, 28, .22); cursor: pointer; transition: transform .12s ease, box-shadow .12s ease; }
.vl a.vl-hpm-cta, .vl a.vl-hpm-cta:hover { color: #ffffff; }
.vl-hpm-arrow { font-size: 16px; line-height: 1; }

/* Meta pruh pod CTA (hvězdičky · počet hodnocení · denní dávka).
   `flex-wrap`, `nowrap` na položkách a schovaná tečka jsou v base.css
   (`.vl-meta*`) — o zalomení rozhoduje prohlížeč, ne breakpoint. Mezery jsou
   rozepsané na osy, ne zkratkou `gap`. */
.vl-hpm-hero__foot { padding: 14px 20px 26px; display: flex; flex-direction: column; gap: 12px; }
.vl-hpm-meta { display: flex; align-items: center; justify-content: center; column-gap: 10px; row-gap: 5px; font-size: 12.5px; color: #3d443e; font-weight: 500; }
/* Oddělovací tečka mezi počtem hodnocení a cenou (David 11. 9. ji na mobilu
   postrádal). V base.css je `.vl-meta__sep { display: none }`, protože při
   zalomení řádku zůstane viset na konci prvního — a řádek se na užších
   displejích láme. Zapíná se proto až tam, kde se obsah na jednu řádku vejde:
   změřeno po 2 px, že s tečkou a mezerou 10 px drží řádek od **384 px** (proto
   se i `column-gap` sjednotil ze 14 na 10 — se 14 by hranice byla až 400 px
   a nejrozšířenější iPhone 390 px by tečku neviděl). Pod 384 px se řádek láme
   i bez tečky, takže se tam o nic nepřichází. Barva `#8a887f` je stejná jako
   na desktopu, jen tlumenější než text řádku. */
@media (min-width: 384px) {
	.vl-hpm-meta .vl-meta__sep { display: inline; }
}
/* Hvězdy o pixel výš: `.vl-stars` je uvnitř flexu, takže `vertical-align: -1px`
   z base.css se neuplatní (flex položky ho ignorují) a `align-items: center`
   srovná BOXY, ne inkoust. Naměřeno při 8× zvětšení: účaří hvězd bylo 1 px pod
   účařím číslice. Na desktopu vychází rozdíl 0,00 px, tam se nic neopravuje. */
.vl-hpm-meta__stars { display: flex; align-items: center; gap: 6px; }
.vl-hpm-meta__stars .vl-stars { position: relative; top: -1px; }
.vl-hpm-meta__sep { color: #8a887f; }
/* Počet hodnocení = odkaz na Zkušenosti (JS z něj dělá modal). Barvu dědí po
   pruhu, takže `color:inherit` musí přebít `.vl a` i `.vl a:hover`. */
.vl a.vl-hpm-meta__link, .vl a.vl-hpm-meta__link:hover { color: inherit; text-decoration: underline; text-underline-offset: 3px; }

/* --- Pás USP pod hero ------------------------------------------------------
   Tabletové pravidlo níž nic nekreslí (od 769 px je celá `.vl-mobile` vrstva
   `display:none`), drží se jen kvůli shodě computed stylů: v základu na tenhle
   blok mířilo neomezené `[style*="border-top:1px solid #e8e5d9; border-bottom:
   1px solid #e8e5d9"]` (pravidlo pro USP pás desktopové HP, front-page.php:42)
   a Chrome i u skrytého prvku vrací `repeat(2, 1fr)`, ne `1fr 1fr`. Pravidlo
   v base.css NENÍ osiřelé — desktopová HP na něm stojí. */
.vl-hpm-usp { border-top: 1px solid #e8e5d9; border-bottom: 1px solid #e8e5d9; background: #fdfcf8; padding: 18px 20px; display: grid; grid-template-columns: 1fr 1fr; gap: 14px 12px; }
.vl-hpm-usp__item { display: flex; align-items: center; gap: 10px; }
.vl-hpm-usp__ico { width: 36px; height: 36px; min-width: 36px; border-radius: 50%; background: #e4eee6; display: flex; align-items: center; justify-content: center; }
.vl-hpm-usp__text { font-size: 12px; font-weight: 600; color: #16211c; line-height: 1.35; }

@media (min-width: 769px) and (max-width: 1024px) {
	.vl-hpm-usp { grid-template-columns: repeat(2, 1fr); }
}

/* --- Sekce „Jak to funguje" ------------------------------------------------ */
.vl-hpm-hiw { padding: 32px 20px; }
.vl-hpm-kick { font-size: 10.5px; font-weight: 600; letter-spacing: .14em; text-transform: uppercase; color: #0b7c3d; }
.vl-hpm-h2 { margin: 10px 0 0; font-size: 24px; line-height: 1.2; font-weight: 600; letter-spacing: -.02em; color: #16211c; }
.vl-hpm-lead { margin: 12px 0 0; font-size: 14px; line-height: 1.65; color: #3d443e; text-align: justify; }

/* Tři fotky proměny (WebP, lazy). Poměr drží `aspect-ratio`, výšku tedy
   nastavovat netřeba — `img { height:auto }` z vlasimo.css platí dál. */
.vl-hpm-photos { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; margin-top: 16px; }
.vl-hpm-photo { display: flex; flex-direction: column; gap: 6px; }
.vl-hpm-photo__img { width: 100%; aspect-ratio: 5/8; object-fit: cover; object-position: center top; border-radius: 10px; border: 1px solid #e3e0d4; display: block; }
.vl-hpm-photo__cap { font-size: 10.5px; color: #5d6b62; text-align: center; line-height: 1.3; }

/* Odkazy otevírající modal (příběh, receptura) jsou `<span>` s `data-vl-action`,
   ne `<a>` — `.vl a` je tedy netrápí. */
.vl-hpm-storylink { margin-top: 12px; text-align: center; }
.vl-hpm-tlink { cursor: pointer; font-size: 13.5px; font-weight: 500; color: #0b7c3d; text-decoration: underline; text-underline-offset: 4px; }

/* --- Čtyři karty cílů (vlasy / nehty / pleť / péče zvenčí) ------------------
   Karty 02 a 04 mají šedý podklad jako desktopové dlaždice (mobilní návrh je
   měl krémový a zelený). Fotka nehtů se nezvětšuje (`contain`), zbylé dvě
   fotografie jdou přes `multiply`, aby jejich bílé pozadí splynulo s kartou. */
.vl-hpm-goals { padding: 0 20px 8px; display: flex; flex-direction: column; gap: 14px; }
.vl-hpm-goal { background: #f6f5ef; border: 1px solid #e3e0d4; border-radius: 18px; overflow: hidden; }
.vl-hpm-goal--grey { background: #f1f0f4; }
.vl-hpm-goal__ph { height: 228px; overflow: hidden; }
.vl-hpm-goal__ph--grey { background: #f1f0f4; }
.vl-hpm-fill { width: 100%; height: 100%; object-fit: cover; display: block; }
.vl-hpm-fill--mult { mix-blend-mode: multiply; }
.vl-hpm-fill--contain { object-fit: contain; }
.vl-hpm-goal__body { padding: 20px 22px 22px; }
.vl-hpm-goal__head { display: flex; align-items: center; gap: 9px; }
.vl-hpm-goal__num { background: #0b7c3d; color: #ffffff; font-size: 10px; font-weight: 700; letter-spacing: .08em; padding: 3px 8px; border-radius: 5px; }
.vl-hpm-goal__title { margin: 10px 0 0; font-size: 20px; line-height: 1.22; font-weight: 600; letter-spacing: -.015em; color: #16211c; }
.vl-hpm-goal__text { margin: 8px 0 0; font-size: 13.5px; line-height: 1.65; color: #3d443e; text-align: justify; }
.vl-hpm-goal__cta { margin-top: 14px; height: 46px; background: #0d8f46; border-radius: 11px; display: flex; align-items: center; justify-content: center; gap: 9px; font-size: 14px; font-weight: 600; box-shadow: 0 3px 0 #075c2e; cursor: pointer; }
.vl a.vl-hpm-goal__cta, .vl a.vl-hpm-goal__cta:hover { color: #ffffff; }

/* --- Ohlasy ---------------------------------------------------------------
   Karty kreslí sdílený parts/review-card.php (stejné jako na desktopu),
   tady je jen rám sekce. */
.vl-hpm-rev { background: #f2f1e9; border-top: 1px solid #e3e0d4; border-bottom: 1px solid #e3e0d4; margin-top: 24px; padding: 30px 20px; }
.vl-hpm-rev__sum { display: flex; align-items: center; gap: 10px; margin-top: 10px; font-size: 13px; color: #5d6b62; }
.vl-hpm-rev__grid { display: flex; flex-direction: column; gap: 12px; margin-top: 18px; }
.vl-hpm-rev__more { display: flex; flex-direction: column; align-items: center; gap: 6px; margin-top: 18px; }
/* Odkaz na Zkušenosti: podtržení musí přebít `.vl a { text-decoration:none }`,
   proto `.vl a.…`. Barva je stejná jako `.vl a:hover`, hover se tedy nemění. */
.vl a.vl-hpm-alink, .vl a.vl-hpm-alink:hover { font-size: 13.5px; font-weight: 500; color: #0b7c3d; text-decoration: underline; text-underline-offset: 4px; }

/* --- Složení --------------------------------------------------------------- */
.vl-hpm-ingr { padding: 30px 20px; }
.vl-hpm-ingr__grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-top: 16px; }
.vl-hpm-ing { border: 1px solid #e3e0d4; background: #ffffff; border-radius: 12px; padding: 12px 12px 13px; display: flex; flex-direction: column; gap: 8px; }
.vl-hpm-ing__ph { width: 38px; height: 38px; border-radius: 50%; border: 1px solid #e3e0d4; overflow: hidden; }
.vl-hpm-ing__name { display: block; font-size: 12.5px; line-height: 1.3; font-weight: 600; color: #16211c; }
.vl-hpm-ing__note { font-size: 11.5px; line-height: 1.45; color: #5d6b62; margin-top: 3px; }
.vl-hpm-ingr__foot { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-top: 12px; }
.vl-hpm-ingr__rest { font-size: 12.5px; color: #8a887f; }

/* --- Závěrečné CTA --------------------------------------------------------- */
.vl-hpm-cta2 { background: #1f4d3a; padding: 32px 20px; }
.vl-hpm-cta2__title { margin: 0; font-size: 24px; line-height: 1.22; font-weight: 600; letter-spacing: -.02em; color: #fdfcf8; }
.vl-hpm-cta2__text { margin: 10px 0 0; font-size: 14px; line-height: 1.65; color: #c8d4cb; text-align: justify; }
.vl-hpm-cta2__btn { margin-top: 18px; height: 56px; background: #ffd21f; border-radius: 13px; display: flex; align-items: center; justify-content: center; gap: 11px; font-size: 16px; font-weight: 600; box-shadow: 0 4px 0 #d9a800; cursor: pointer; transition: transform .12s ease, box-shadow .12s ease; }
/* Žluté tlačítko má tmavý text — shodou okolností stejný jako `.vl a`, ale
   na hover by bez druhého selektoru zezelenalo. */
.vl a.vl-hpm-cta2__btn, .vl a.vl-hpm-cta2__btn:hover { color: #16211c; }
.vl-hpm-cta2__note { margin-top: 10px; text-align: center; font-size: 12px; color: #a9bdb0; }

/* --- Zvýraznění `*takto*` --------------------------------------------------
   Tag se předává do `vlasimo_text()` / `vlasimo_hl()`, takže třída musí být
   v generátoru natvrdo (nejde přes sub_styles — to PHP bloky přeskakuje). */
.vl-hpm-b { font-weight: 600; color: #16211c; }

/* ==== lp-card.css ======================================================= */
/* ===========================================================================
   Dlaždice produktu na landing page věrnostní slevy (parts/lp-card.php)
   — styly vytažené z markupu.

   Rám stránky migrovala vlna 19 (assets/css/pages/doplneni-zasob.css), part
   s dlaždicí zůstal na inline stylech; tohle je jeho doplnění. Vlastní soubor
   v assets/css/parts/, protože dlaždici kreslí part, ne šablona.

   Návrh má dvě velikosti se stejnou stavbou (kúra ve mřížce po třech,
   kosmetika po čtyřech). V PHP to byla tabulka hodnot `$vl_d`; tady je z ní
   sada proměnných `--lpc-*` a jeden modifikátor `--pece`, stejně jako to
   dělá `--lp-*` na `.vl-lp` ve vlasimo-base.css pro celou stránku. Hodnoty
   jsou 1:1 z té tabulky.

   Prefix `.vl-shop-lpc*` schválně: `.vl-lp-card*` je na téhle stránce už
   obsazená — to je velká karta se slevou v hero, jiná komponenta.

   Stránka nemá druhou markupovou vrstvu (desktop, tablet i mobil sdílejí
   markup) a ŽÁDNÉ pravidlo `[style*="…"]` na inline styly dlaždice nemířilo
   (ověřeno CDP výpisem matched rules na 1440 / 900 / 390 px) — proto tu není
   ani tabletový, ani mobilní blok. Rozměry mřížky mění `--lp-kury`
   / `--lp-pece` na obalu, ne dlaždice.

   Migrace: tools/migrate/28-obchod.py
   =========================================================================== */

.vl-shop-lpc {
	--lpc-r: 18px;
	--lpc-imgh: 200px;
	--lpc-imgp: 16px;
	--lpc-pad: 18px 20px 20px;
	--lpc-gap: 12px;
	--lpc-name: 18px;
	--lpc-sub: 13px;
	--lpc-price: 26px;
	--lpc-old: 13px;
	--lpc-lab: 11px;
	--lpc-chip: 12px;
	--lpc-chipp: 5px 10px;
	--lpc-chipr: 8px;
	--lpc-chipt: 12px;
	--lpc-top: 11.5px;
	--lpc-topp: 7px 12px;

	position: relative;
	background: #ffffff;
	border: 1px solid #e3e0d4;
	border-radius: var(--lpc-r);
	overflow: hidden;
	display: flex;
	flex-direction: column;
	box-shadow: none;
}

/* Kosmetika: o stupeň menší, jinak identická. */
.vl-shop-lpc--pece {
	--lpc-r: 16px;
	--lpc-imgh: 170px;
	--lpc-imgp: 14px;
	--lpc-pad: 16px 18px 18px;
	--lpc-gap: 10px;
	--lpc-name: 15.5px;
	--lpc-sub: 12.5px;
	--lpc-price: 21px;
	--lpc-old: 12px;
	--lpc-lab: 10.5px;
	--lpc-chip: 11.5px;
	--lpc-chipp: 4px 9px;
	--lpc-chipr: 7px;
	--lpc-chipt: 10px;
	--lpc-top: 11px;
	--lpc-topp: 6px 10px;
}

/* Doporučená dlaždice — zelený rámeček a stín. Musí stát za `--pece`,
   aby přebila `border` z výchozí sady i u kosmetiky. */
.vl-shop-lpc--hi { border: 2px solid #0d8f46; box-shadow: 0 12px 32px rgba(13, 143, 70, .14); }

.vl-shop-lpc__flag { background: #0d8f46; color: #ffffff; font-size: var(--lpc-top); font-weight: 700; letter-spacing: .06em; text-transform: uppercase; text-align: center; padding: var(--lpc-topp); }

/* JPEG na bílé dostává bílý podklad, průhledný PNG krémový — jako ve výpisu.
   Rozhoduje přípona souboru, proto modifikátor. */
.vl-shop-lpc__pic { position: relative; height: var(--lpc-imgh); background: #f4f2ea; display: flex; align-items: center; justify-content: center; padding: var(--lpc-imgp); }
.vl-shop-lpc__pic--white { background: #ffffff; }
.vl-shop-lpc__piclink { display: flex; align-items: center; justify-content: center; width: 100%; height: 100%; }
/* `img { max-width:100%; height:auto }` z vlasimo.css je (0,0,1); `max-height`
   musí být na třídě, jinak by se vysoké fotky přetáhly přes rám. */
.vl-shop-lpc__img { max-width: 100%; max-height: 100%; object-fit: contain; display: block; }
.vl-shop-lpc__chip { position: absolute; top: var(--lpc-chipt); right: var(--lpc-chipt); background: #ffd21f; color: #16211c; font-size: var(--lpc-chip); font-weight: 600; padding: var(--lpc-chipp); border-radius: var(--lpc-chipr); white-space: nowrap; }

.vl-shop-lpc__body { padding: var(--lpc-pad); display: flex; flex-direction: column; gap: var(--lpc-gap); flex: 1; }
.vl-shop-lpc__head { display: flex; flex-direction: column; gap: 3px; }
.vl-shop-lpc__name { font-size: var(--lpc-name); font-weight: 600; color: #16211c; }
/* Odkaz v názvu: `.vl a { color:#16211c }` (0,1,1) přebíjí holou třídu
   a `.vl a:hover` by ho na hover přebarvil — inline `color:inherit` to dřív
   držel sám. */
.vl a.vl-shop-lpc__link,
.vl a.vl-shop-lpc__link:hover { color: inherit; }
.vl-shop-lpc__sub { font-size: var(--lpc-sub); color: #5d6b62; }

/* Řádek dopravy: se splněným prahem zeleně a tučně, jinak šedě. SVG uvnitř
   kreslí `stroke="currentColor"`, takže barvu bere z tohohle řádku. */
.vl-shop-lpc__ship { display: flex; align-items: center; gap: 7px; font-size: 12.5px; color: #8a887f; font-weight: 400; }
.vl-shop-lpc__ship--free { color: #0b7c3d; font-weight: 600; }
.vl-shop-lpc__shipico { display: block; flex: none; }

.vl-shop-lpc__foot { display: flex; align-items: flex-end; justify-content: space-between; gap: 10px; margin-top: auto; padding-top: 8px; border-top: 1px solid #f0ede1; }
.vl-shop-lpc__pricecol { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.vl-shop-lpc__lab { font-size: var(--lpc-lab); font-weight: 600; letter-spacing: .1em; text-transform: uppercase; color: #0b7c3d; }
.vl-shop-lpc__pricerow { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; }
.vl-shop-lpc__price { font-size: var(--lpc-price); font-weight: 600; letter-spacing: -.02em; color: #16211c; line-height: 1; white-space: nowrap; }
.vl-shop-lpc__old { font-size: var(--lpc-old); color: #8a887f; text-decoration: line-through; white-space: nowrap; }

/* Obě CTA jsou `<a>`, proto barva zvlášť přes `.vl a.<třída>` i s `:hover`.
   `.vl-btn-press` z base.css na ně nemíří (dlaždice ho nemá), takže se stín
   ani posun na hover nemění — stejně jako dosud. */
.vl-shop-lpc__cta { height: 48px; padding: 0 20px; background: #0d8f46; border-radius: 12px; display: flex; align-items: center; gap: 9px; font-size: 14.5px; font-weight: 600; box-shadow: 0 3px 0 #075c2e; white-space: nowrap; flex: none; }
.vl-shop-lpc__arw { font-size: 14.5px; line-height: 1; font-weight: 400; }
/* Kosmetika má v mřížce čtyř dlaždic místo jen na šipku (text nese aria-label). */
.vl-shop-lpc__icon { width: 44px; height: 44px; border-radius: 11px; background: #0d8f46; display: flex; align-items: center; justify-content: center; box-shadow: 0 3px 0 #075c2e; flex: none; }
.vl-shop-lpc__iconarw { display: flex; }
.vl a.vl-shop-lpc__cta,
.vl a.vl-shop-lpc__cta:hover,
.vl a.vl-shop-lpc__icon,
.vl a.vl-shop-lpc__icon:hover { color: #ffffff; }

/* ==== pdp-consult.css =================================================== */
/* ===========================================================================
   Poradna pod nákupním boxem (parts/pdp-consult.php) — „Nevíte si rady
   s výběrem? … Napsat dotaz →". Vkládá ji desktopová vrstva kúry i kosmetiky
   a obě mobilní vrstvy (tam s `mobile => true`).

   Načítá se přes VLASIMO_PART_CSS (inc/assets.php) za vlasimo-ui.css.

   Třída `.vl-consult` na tomtéž prvku zůstává jako háček (žádné pravidlo na ni
   dnes nemíří, ale je v markupu od začátku); vzhled nese `.vl-pdp-consult`.
   Herbasí `.h-consult` ve vlasimo.css je jiná komponenta, sem nesahá.

   `--m` = mobilní vrstva: užší odsazení a vlastní marže (v mobilním návrhu
   karta nesedí v mřížce buyboxu, ale volně pod ním). Jsou to jediné dvě
   varianty, které part umí — proto modifikátor, ne inline styl.

   Migrace: tools/migrate/26-produkt.py
   =========================================================================== */

.vl-pdp-consult { display: flex; align-items: center; gap: 12px; border: 1px solid #e3e0d4; background: #ffffff; border-radius: 14px; padding: 14px 18px; }
.vl-pdp-consult--m { padding: 12px 14px; margin: 14px 20px 0; }

.vl-pdp-consult__ico { width: 40px; height: 40px; min-width: 40px; border-radius: 50%; background: #ffd21f; display: flex; align-items: center; justify-content: center; }
.vl-pdp-consult__txt { font-size: 13.5px; line-height: 1.5; color: #3d443e; }
/* Zvýraznění `*takto*` z Customizeru (vlasimo_text). */
.vl-pdp-consult__b { font-weight: 600; color: #16211c; }

/* `.vl a { color:#16211c; text-decoration:none }` (0,0,1,1) je specifičtější
   než holá třída → odkaz musí být psaný `.vl a.trida`. Inline styl přebíjel
   i `:hover`, takže se barva na hover neměnila; `:hover` to drží dál. */
.vl a.vl-pdp-consult__link,
.vl a.vl-pdp-consult__link:hover { font-weight: 600; color: #0b7c3d; text-decoration: underline; text-underline-offset: 3px; white-space: nowrap; }

/* ==== pdp-cosmetic.css ================================================== */
/* ===========================================================================
   Detail produktu — kosmetika (parts/pdp-cosmetic.php) — styly vytažené
   z markupu. Desktopová vrstva `.vl-dcontent.vl-desktop` uvnitř `.vl-pdp`;
   mobilní markup je generovaný (parts/pdp-cosmetic-mobile.php) a tenhle soubor
   se ho netýká.

   Načítá se z assets/css/parts/ (inc/assets.php, seznam VLASIMO_PART_CSS) za
   vlasimo-base.css a vlasimo-ui.css, takže responzivní vrstvu základu jde
   přebít bez `!important`.

   Sekce související produktů má vlastní soubor parts/pdp-related.css
   (`.vl-pdpr-*`) — sdílí ji kúrová PDP.

   Tabletová (769–1024) a mobilní (≤768) pravidla dole nejsou z návrhu: jsou to
   skutečné výsledky pravidel `[style*="…"]` ve vlasimo-base.css, která na tenhle
   markup mířila. Pár míst, kde se dvě pravidla potkala a rozhodovalo pořadí:
     * cena 40 px  — `.vl-desktop [style*="font-size:40px"]` (≤1024) dává 32 px,
       ale `.vl-dcontent [style*="font-size:40px"]` (≤768) stojí v souboru níž,
       takže na telefonu platí 28 px. Totéž H2 30 px (24 → 22 px).
     * hlavička detailu `padding:24px 48px 56px` — na mobilu ji chytala obě
       pravidla (`padding:24px 48px` i `…56px`), vyhrálo pozdější → 16px 20px 36px.
     * blok Použití/Komu `padding:0 48px 8px` — na mobilu ho chytá jen obecné
       `padding:0 48px`, takže spodních 8 px mizí (0 20px), ne 0 20px 8px.
     * popis `padding:16px 48px 56px` — mobilní pravidlo je na `padding:16px 48px`
       a je dvouhodnotové, spodních 56 px se tím ztrácí (12px 20px).

   I pod 768 px, kde je celá vrstva `display:none`, musí hodnoty sedět —
   snímek computed stylů čte i skryté podstromy.

   Migrace: tools/migrate/27-pdp-kosmetika.py
   =========================================================================== */

/* --- Obal sekcí ------------------------------------------------------------
   Tři pásy stejné šířky bez vlastního odsazení (odsazení nesou bloky uvnitř):
   drobečky + hlavička detailu, blok záložek a spodní nákupní lišta. */
.vl-pdpc-wrap { max-width: 1440px; margin: 0 auto; }

/* --- Hlavička detailu: galerie | buybox ------------------------------------ */
.vl-pdpc-top { display: grid; grid-template-columns: 1fr 1.1fr; gap: 56px; padding: 24px 48px 56px; }
.vl-pdpc-buy { display: flex; flex-direction: column; gap: 18px; }
.vl-pdpc-col10 { display: flex; flex-direction: column; gap: 10px; }
.vl-pdpc-col16 { display: flex; flex-direction: column; gap: 16px; }
.vl-pdpc-kicker { font-size: 12px; font-weight: 600; letter-spacing: .14em; text-transform: uppercase; color: #0b7c3d; }
.vl-pdpc-title { margin: 0; font-size: 38px; line-height: 1.1; font-weight: 600; letter-spacing: -.025em; color: #16211c; }

/* Zvýraznění `*takto*` (vlasimo_hl) i tučné hodnoty — dřív desetkrát opsané
   `font-weight:600; color:#16211c` (jednou i s prohozeným pořadím). */
.vl-pdpc-b { font-weight: 600; color: #16211c; }
.vl-pdpc-b600 { font-weight: 600; }
.vl-pdpc-b700 { font-weight: 700; }
.vl-pdpc-bgreen { color: #0b7c3d; font-weight: 600; }

/* Hvězdičky + počet hodnocení (kotva na sekci #hodnoceni). Odkaz je `<a>`,
   takže `.vl a { color:#16211c }` i `.vl a:hover { color:#0b7c3d }` přebíjejí
   holou třídu — inline styl dřív přebíjel obojí, hover tedy nic nedělal. */
.vl-pdpc-rate { display: flex; align-items: center; gap: 10px; }
.vl-pdpc-note14 { font-size: 14px; color: #5d6b62; }
.vl a.vl-pdpc-rate__link,
.vl a.vl-pdpc-rate__link:hover { text-decoration: underline; text-underline-offset: 3px; color: inherit; }

/* --- Štítky ze starého webu ------------------------------------------------ */
.vl-pdpc-tags { display: flex; flex-wrap: wrap; gap: 8px; }
.vl-pdpc-tag { display: inline-flex; align-items: center; gap: 8px; background: #f2f1e9; border-radius: 999px; padding: 7px 14px 7px 12px; font-size: 13px; line-height: 1.2; color: #3d443e; }
.vl-pdpc-tag__ico { height: 15px; width: auto; flex: none; display: block; }

/* --- Perex ----------------------------------------------------------------
   `.vl p { text-align: justify }` je (0,1,1), tedy specifičtější než holá
   třída — hodnota je stejná, ale ať to nedrží náhoda. */
.vl .vl-pdpc-perex { margin: 0; font-size: 15.5px; line-height: 1.65; color: #3d443e; text-align: justify; }

/* --- Buybox ---------------------------------------------------------------- */
.vl-pdpc-box { border: 1px solid #e3e0d4; background: #ffffff; border-radius: 16px; padding: 22px; display: flex; flex-direction: column; gap: 16px; }
.vl-pdpc-pair__label { font-size: 13.5px; font-weight: 600; color: #16211c; }
.vl-pdpc-pair__note { font-weight: 400; color: #5d6b62; }

/* Řádek doporučeného produktu — `<a>` s `color:inherit`, aby si text nesl
   barvu z buyboxu (#3d443e), ne zelenou/tmavou z `.vl a`. Hover musí zůstat
   beze změny, proto je vypsaný. */
.vl a.vl-pdpc-row,
.vl a.vl-pdpc-row:hover { display: flex; align-items: center; gap: 12px; border: 1px solid #e3e0d4; background: #ffffff; border-radius: 12px; padding: 12px 16px; color: inherit; }
.vl-pdpc-row__ico { width: 44px; height: 44px; min-width: 44px; border-radius: 8px; border: 1px solid #e3e0d4; background: #fdfcf8; display: flex; align-items: center; justify-content: center; overflow: hidden; }
.vl-pdpc-row__img { max-height: 86%; max-width: 86%; object-fit: contain; display: block; }
.vl-pdpc-row__txt { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.vl-pdpc-row__name { display: flex; align-items: center; gap: 8px; font-size: 14px; font-weight: 600; color: #16211c; }
.vl-pdpc-row__badge { background: #0b7c3d; color: #ffffff; font-size: 8.5px; font-weight: 700; letter-spacing: .06em; padding: 2px 7px; border-radius: 999px; }
.vl-pdpc-row__sub { font-size: 12.5px; color: #5d6b62; }
.vl-pdpc-row__price { margin-left: auto; display: flex; align-items: center; gap: 8px; white-space: nowrap; }
.vl-pdpc-row__amount { font-size: 14.5px; font-weight: 600; color: #16211c; }
.vl-pdpc-row__arrow { font-size: 15px; color: #0b7c3d; transform: translateY(-1px); }

/* Dárek a poukaz místo ceny se stepperem (koupit se nedají samostatně). */
.vl-pdpc-gift { background: #f6f5ef; border: 1px solid #e3e0d4; border-radius: 14px; padding: 18px 20px; font-size: 15px; line-height: 1.6; color: #3d443e; }
.vl-pdpc-vch { background: #f6f5ef; border: 1px solid #e3e0d4; border-radius: 14px; padding: 18px 20px; display: flex; flex-direction: column; gap: 14px; align-items: flex-start; }
.vl-pdpc-vch__txt { font-size: 15px; line-height: 1.6; color: #3d443e; }
.vl a.vl-pdpc-vch__btn,
.vl a.vl-pdpc-vch__btn:hover { height: 52px; padding: 0 24px; background: #0d8f46; color: #ffffff; border-radius: 12px; display: inline-flex; align-items: center; gap: 10px; font-size: 15.5px; font-weight: 600; box-shadow: 0 3px 0 #075c2e; }

/* Cena */
.vl-pdpc-priceline { display: flex; align-items: flex-end; justify-content: space-between; gap: 16px; }
.vl-pdpc-priceline__col { display: flex; align-items: flex-end; gap: 12px; }
.vl-pdpc-price { font-size: 40px; font-weight: 600; letter-spacing: -.03em; color: #16211c; line-height: .95; }
.vl-pdpc-price__old { font-size: 15px; color: #8a887f; text-decoration: line-through; padding-bottom: 3px; }
.vl-pdpc-save { background: #16211c; color: #ffd21f; border: none; font-size: 13px; font-weight: 600; padding: 6px 12px; border-radius: 8px; white-space: nowrap; }

/* --- Kupónový rámeček „EXTRA −N %" ----------------------------------------
   Barvy dává `vlasimo_coupon_box_style()` (functions.php) podle stylu běžící
   kampaně; množina je konečná (dark / green = forest / žlutá jako výchozí),
   proto modifikátory místo inline. POZOR: hodnoty jsou opsané z té funkce —
   při změně palety kampaní je nutné upravit i tenhle blok. Tvar (rozměry,
   písmo, mezery) je společný, liší se jen barvy. */
.vl-pdpc-cpn { display: flex; align-items: center; gap: 10px; border-radius: 10px; padding: 9px 13px; }
.vl-pdpc-cpn__badge { font-size: 10.5px; font-weight: 700; letter-spacing: .08em; padding: 3px 8px; border-radius: 6px; }
.vl-pdpc-cpn__txt { font-size: 13.5px; }
.vl-pdpc-cpn__pct { font-weight: 600; }
.vl-pdpc-cpn__apply { margin-left: auto; font-size: 13px; font-weight: 500; text-decoration: underline; text-underline-offset: 3px; cursor: pointer; }

.vl-pdpc-cpn--dark { background: #16211c; border: 1.5px dashed #ffd21f; }
.vl-pdpc-cpn--dark .vl-pdpc-cpn__badge { background: #ffd21f; color: #16211c; }
.vl-pdpc-cpn--dark .vl-pdpc-cpn__txt { color: #ffffff; }
.vl-pdpc-cpn--dark .vl-pdpc-cpn__pct { color: #ffd21f; }
.vl-pdpc-cpn--dark .vl-pdpc-cpn__apply { color: #ffd21f; }

.vl-pdpc-cpn--green { background: #f4faf6; border: 1.5px dashed #0d8f46; }
.vl-pdpc-cpn--green .vl-pdpc-cpn__badge { background: #0d8f46; color: #ffffff; }
.vl-pdpc-cpn--green .vl-pdpc-cpn__txt { color: #16211c; }
.vl-pdpc-cpn--green .vl-pdpc-cpn__pct { color: #0b7c3d; }
.vl-pdpc-cpn--green .vl-pdpc-cpn__apply { color: #0b7c3d; }

.vl-pdpc-cpn--amber { background: #fdf3c8; border: 1.5px dashed #d9a800; }
.vl-pdpc-cpn--amber .vl-pdpc-cpn__badge { background: #16211c; color: #ffd21f; }
.vl-pdpc-cpn--amber .vl-pdpc-cpn__txt { color: #16211c; }
.vl-pdpc-cpn--amber .vl-pdpc-cpn__pct { color: #16211c; }
.vl-pdpc-cpn--amber .vl-pdpc-cpn__apply { color: #8a6a00; }

/* --- Stepper a tlačítko do košíku ------------------------------------------ */
.vl-pdpc-cta { display: flex; gap: 12px; }
.vl-pdpc-qty { display: flex; align-items: center; border: 1px solid #d5d2c6; border-radius: 12px; overflow: hidden; }
.vl-pdpc-qty__btn { width: 44px; height: 58px; display: flex; align-items: center; justify-content: center; font-size: 18px; color: #5d6b62; cursor: pointer; }
.vl-pdpc-qty__num { width: 34px; text-align: center; font-size: 16px; font-weight: 500; color: #16211c; }
.vl-pdpc-add { flex: 1; height: 58px; background: #0d8f46; color: #ffffff; border-radius: 14px; display: flex; align-items: center; justify-content: center; gap: 12px; font-size: 17px; font-weight: 600; box-shadow: 0 4px 0 #075c2e; cursor: pointer; transition: transform .12s ease, box-shadow .12s ease; }
.vl-pdpc-add__arrow { font-size: 17px; line-height: 1; transform: translateY(-1.5px); }

/* --- Pruh skladem / doprava / vrácení -------------------------------------- */
.vl-pdpc-trust { display: flex; align-items: center; gap: 18px; font-size: 13px; color: #5d6b62; flex-wrap: wrap; }
.vl-pdpc-trust__item { display: flex; align-items: center; gap: 7px; }
.vl-pdpc-dot { width: 7px; height: 7px; border-radius: 50%; background: #0d8f46; }
.vl-pdpc-sku { font-size: 13px; color: #8a887f; }

/* --- Popis (text vlevo, přednosti vpravo) ---------------------------------- */
.vl-pdpc-desc { padding: 16px 48px 56px; display: grid; grid-template-columns: 1.15fr 1fr; gap: 56px; align-items: start; }
.vl-pdpc-h2 { margin: 0; font-size: 30px; line-height: 1.15; font-weight: 600; letter-spacing: -.02em; color: #16211c; }
.vl .vl-pdpc-p { margin: 0; font-size: 15px; line-height: 1.7; color: #3d443e; text-align: justify; }
.vl-pdpc-obsah { display: flex; align-items: center; gap: 14px; background: #e4eee6; border: 1px solid #c6dbcb; border-radius: 12px; padding: 14px 18px; margin-top: 4px; }
.vl-pdpc-obsah__ico { display: inline-flex; align-items: center; justify-content: center; width: 34px; height: 34px; min-width: 34px; border-radius: 50%; background: #0d8f46; }
.vl-pdpc-obsah__txt { font-size: 13.5px; line-height: 1.55; color: #16211c; }

.vl-pdpc-ben { background: #f6f5ef; border: 1px solid #e3e0d4; border-radius: 16px; padding: 26px; display: flex; flex-direction: column; gap: 14px; }
.vl-pdpc-h3 { font-size: 16px; font-weight: 600; color: #16211c; }
.vl-pdpc-benlist { display: flex; flex-direction: column; }
/* Poslední řádek má i spodní linku — v šabloně to byla podmínka uvnitř
   `style`, teď modifikátor. */
.vl-pdpc-ben__row { display: flex; gap: 10px; padding: 9px 0; border-top: 1px solid #e8e5d9; font-size: 13.5px; line-height: 1.5; color: #3d443e; }
.vl-pdpc-ben__row--last { border-bottom: 1px solid #e8e5d9; }
.vl-pdpc-ben__chk { color: #0b7c3d; flex: none; margin-top: 3px; }

/* --- Použití a Komu je určeno ---------------------------------------------- */
.vl-pdpc-use { max-width: 1440px; margin: 0 auto; padding: 0 48px 8px; display: grid; grid-template-columns: 1fr 1fr; gap: 24px; }
.vl-pdpc-card { background: #ffffff; border: 1px solid #e3e0d4; border-radius: 16px; padding: 26px; display: flex; flex-direction: column; gap: 12px; }
.vl-pdpc-card__head { display: flex; align-items: center; gap: 12px; }
.vl-pdpc-card__ico { width: 40px; height: 40px; min-width: 40px; border-radius: 50%; background: #e4eee6; display: flex; align-items: center; justify-content: center; }
.vl-pdpc-card__ico--amber { background: #fdf3c8; }
.vl .vl-pdpc-card__p { margin: 0; font-size: 14px; line-height: 1.7; color: #3d443e; text-align: justify; }

/* --- Složení (INCI) -------------------------------------------------------- */
.vl-pdpc-inci { max-width: 1440px; margin: 0 auto; padding: 32px 48px 8px; }
.vl-pdpc-inci__box { background: #f6f5ef; border: 1px solid #e3e0d4; border-radius: 16px; padding: 26px; display: flex; flex-direction: column; gap: 12px; }
.vl .vl-pdpc-inci__p { margin: 0; font-size: 13.5px; line-height: 1.7; color: #3d443e; word-break: break-word; }
.vl-pdpc-inci__note { font-size: 12px; color: #8a887f; line-height: 1.5; }

/* --- Hodnocení ------------------------------------------------------------- */
.vl-pdpc-rev { max-width: 1440px; margin: 0 auto; padding: 48px; display: flex; flex-direction: column; gap: 24px; }
.vl-pdpc-sechead { display: flex; align-items: flex-end; justify-content: space-between; gap: 24px; }
.vl-pdpc-sechead__col { display: flex; flex-direction: column; gap: 8px; }
.vl-pdpc-h2s { margin: 0; font-size: 28px; line-height: 1.15; font-weight: 600; letter-spacing: -.02em; color: #16211c; }
.vl-pdpc-revgrid { display: grid; grid-template-columns: 320px 1fr; gap: 24px; align-items: start; }
/* Na tabletu mřížku karet přepisuje `.vl-pdp [data-vl-rev-grid]` ve
   vlasimo-base.css (`minmax(0,1fr) !important`) — atribut na prvku zůstává,
   takže pravidlo platí dál a tablet se tu neopakuje. */
.vl-pdpc-revcards { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; align-items: start; }
.vl-pdpc-more { display: flex; flex-direction: column; align-items: center; gap: 10px; }
.vl-pdpc-more__btn { height: 50px; padding: 0 26px; border: 1.5px solid #0d8f46; color: #0b7c3d; border-radius: 12px; display: inline-flex; align-items: center; gap: 10px; font-size: 15px; font-weight: 600; cursor: pointer; }
.vl-pdpc-more__note { font-size: 12.5px; color: #8a887f; }

/* --- Spodní nákupní lišta --------------------------------------------------
   Pozicování a vyjíždění drží `.vl-buybar` ve vlasimo-base.css, tady je jen
   vzhled z návrhu. */
.vl-pdpc-bar { background: rgba(253,252,248,.97); border-top: 1px solid #e3e0d4; box-shadow: 0 -10px 30px rgba(22,33,28,.10); }
.vl-pdpc-bar__in { max-width: 1440px; margin: 0 auto; padding: 10px 48px; display: flex; align-items: center; gap: 14px; }
.vl-pdpc-bar__ico { width: 46px; height: 46px; border-radius: 9px; border: 1px solid #e3e0d4; background: #f2f1e9; display: flex; align-items: center; justify-content: center; }
.vl-pdpc-bar__img { max-width: 88%; max-height: 88%; object-fit: contain; display: block; }
.vl-pdpc-bar__name { font-size: 14px; font-weight: 600; color: #16211c; }
.vl-pdpc-bar__rate { display: flex; align-items: center; gap: 5px; font-size: 12px; color: #5d6b62; }
.vl-pdpc-bar__right { margin-left: auto; display: flex; align-items: center; gap: 14px; }
.vl-pdpc-bar__price { font-size: 16px; font-weight: 600; color: #0b7c3d; }
.vl-pdpc-bar__old { font-size: 12.5px; color: #8a887f; text-decoration: line-through; }
.vl-pdpc-bar__btn,
.vl a.vl-pdpc-bar__btn,
.vl a.vl-pdpc-bar__btn:hover { background: #0d8f46; color: #ffffff; font-size: 14px; font-weight: 600; border-radius: 10px; padding: 11px 24px; box-shadow: 0 3px 0 #075c2e; }
.vl-pdpc-bar__btn--click { cursor: pointer; }

/* --- Tablet 769–1024 px ---------------------------------------------------- */
@media (min-width: 769px) and (max-width: 1024px) {
	.vl-pdpc-wrap,
	.vl-pdpc-use,
	.vl-pdpc-inci,
	.vl-pdpc-rev,
	.vl-pdpc-bar__in { max-width: 1024px; }
	.vl-pdpc-top { gap: 36px; padding: 24px 32px 36px; }
	.vl-pdpc-desc { gap: 36px; padding: 16px 32px 36px; }
	.vl-pdpc-inci { padding: 32px 32px 8px; }
	.vl-pdpc-rev { padding: 32px; }
	.vl-pdpc-bar__in { padding: 10px 32px; }
	.vl-pdpc-title { font-size: 30px; }
	.vl-pdpc-h2 { font-size: 24px; }
	.vl-pdpc-h2s { font-size: 25px; }
	.vl-pdpc-price { font-size: 32px; }
	.vl-pdpc-revgrid { grid-template-columns: 260px minmax(0, 1fr); }
	/* Poslední řádek předností chytalo tabletové pravidlo pro dvousloupcovou
	   mřížku USP pásu (`[style*="border-top:1px solid #e8e5d9; border-bottom:1px
	   solid #e8e5d9"]` ve vlasimo-base.css) čirou shodou podřetězce — řádek má
	   `border-bottom` jen proto, že je poslední. Prvek je `display:flex`, takže
	   se nic nekreslí; pravidlo je tu jen proto, aby snímek computed stylů
	   po migraci seděl na hodnotu. Totéž má kúrová PDP (single-product.php),
	   tam zatím inline. */
	.vl-pdpc-ben__row--last { grid-template-columns: repeat(2, 1fr); }
}

/* --- Mobil ≤768 px ---------------------------------------------------------
   Vrstva je tu `display:none`, hodnoty přesto musí sedět — snímek computed
   stylů čte i skryté podstromy. */
@media (max-width: 768px) {
	.vl-pdpc-top { padding: 16px 20px 36px; grid-template-columns: 1fr; }
	.vl-pdpc-desc { padding: 12px 20px; grid-template-columns: 1fr; }
	.vl-pdpc-use { padding: 0 20px; grid-template-columns: 1fr; }
	.vl-pdpc-inci { padding: 22px 20px 6px; }
	.vl-pdpc-rev { padding: 28px 20px; }
	.vl-pdpc-revgrid { grid-template-columns: 1fr; }
	.vl-pdpc-revcards { grid-template-columns: 1fr; }
	.vl-pdpc-title { font-size: 27px; }
	.vl-pdpc-h2 { font-size: 22px; }
	.vl-pdpc-h2s { font-size: 22px; }
	.vl-pdpc-price { font-size: 28px; }
	/* Lišta: na telefonu zůstává jen miniatura, cena a CTA. */
	.vl-pdpc-bar__in { padding: 8px 14px; gap: 10px; }
	.vl-pdpc-bar__in > div:nth-child(2),
	.vl-pdpc-bar__in > div:nth-child(3) { display: none; }
}

/* ==== pdp-gallery.css =================================================== */
/* ===========================================================================
   Galerie detailu produktu (parts/pdp-gallery.php) — hlavní okno + miniatury.
   Kreslí ji kúrová PDP (woocommerce/single-product.php) i kosmetika
   (parts/pdp-cosmetic.php), obě v desktopové vrstvě; mobilní vrstvy mají
   vlastní markup z tools/build-pdp-mobile.py.

   Načítá se přes VLASIMO_PART_CSS (inc/assets.php) za vlasimo-ui.css.

   CO ZŮSTALO INLINE A PROČ:
     * `[data-vl-gal-main]` — obsluha v partu přepisuje `main.style.cssText`
       podle režimu okna (pad / fill / letterbox). Režimy fill a letterbox
       `max-width`/`max-height` NEnastavují a spoléhají na `img { max-width:
       100% }` z vlasimo.css; kdyby 88 % viselo na třídě, platilo by i po
       přepnutí a fotka by se zmenšila.
     * `filter:` miniatury (barevná korekce z `$args['imgf']`) — otevřená
       množina hodnot; skládá ji `$vl_g_filter` v partu.

   Podklad okna i dlaždice je konečná dvojice hodnot (vlasimo_gal_bg():
   JPEG s vypáleným bílým pozadím → `#ffffff`, průhledný PNG → krémová),
   proto modifikátor `--white`. Podklad okna přepisuje po kliknutí skript
   inline, což třídu přebije — to je v pořádku, výchozí stav drží třída.

   Migrace: tools/migrate/26-produkt.py
   =========================================================================== */

.vl-pdp-gal { display: flex; flex-direction: column; gap: 12px; }

/* --- Hlavní okno ----------------------------------------------------------- */
.vl-pdp-gal__stage { position: relative; border: 1px solid #e3e0d4; border-radius: 16px; aspect-ratio: 1/1; background: #fdfcf8; display: flex; align-items: center; justify-content: center; overflow: hidden; }
.vl-pdp-gal__stage--white { background: #ffffff; }

/* Odznak „Český výrobek" (jen CZ trh, vlasimo_cz_origin_badge()).
   `display:block` musí zůstat: skript ho v režimu letterbox schovává
   atributem `hidden`, který autorský `display` přebíjí — chování je stejné
   jako s původním inline stylem, tedy se odznak nezmizí. Neopravovat tady,
   patří to do partu. */
.vl-pdp-gal__cert { position: absolute; top: 16px; left: 16px; width: 52px; height: auto; display: block; opacity: .9; }

/* --- Řada miniatur ---------------------------------------------------------
   Rámeček aktivní dlaždice přepisuje skript inline (`activate()`), třída drží
   jen výchozí stav: první dlaždice = hlavní obrázek, tedy `--on`.
   Pod 768 px je šířka/výška dlaždic v `.vl-dcontent .vl-galt` ve
   vlasimo-base.css (šest čtverců na řádek) — `!important`, takže tyhle
   hodnoty přebije stejně, jako předtím přebíjela inline styl. */
.vl-pdp-gal__thumbs { display: flex; gap: 10px; flex-wrap: wrap; }
.vl-pdp-gal__thumb { width: 88px; height: 88px; border-radius: 10px; border: 1px solid #e3e0d4; background: #fdfcf8; display: flex; align-items: center; justify-content: center; overflow: hidden; cursor: pointer; }
.vl-pdp-gal__thumb--on { border: 2px solid #0b7c3d; }
.vl-pdp-gal__thumb--white { background: #ffffff; }
.vl-pdp-gal__thumb--video { position: relative; background: #16211c; }

/* Obrázek v dlaždici. Dvě SOUROZENECKÉ třídy, ne třída + modifikátor:
   varianta `tcover` nesmí zdědit `max-width:88%`, protože se opírá
   o `img { max-width:100% }` z vlasimo.css (a `max-height` nechává `none`).
   `__timg` = packshot v původní kompozici (contain 88 %),
   `__tcover` = čtvercová fotka a náhled videa přes celou dlaždici. */
.vl-pdp-gal__timg { max-width: 88%; max-height: 88%; object-fit: contain; display: block; }
.vl-pdp-gal__tcover { width: 100%; height: 100%; object-fit: cover; display: block; }

/* --- Dlaždice videa --------------------------------------------------------- */
.vl-pdp-gal__play { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; }
.vl-pdp-gal__playdot { width: 42px; height: 42px; border-radius: 50%; background: rgba(22,33,28,.78); display: flex; align-items: center; justify-content: center; }
.vl-pdp-gal__playico { display: block; margin-left: 3px; }

/* ==== pdp-ingredients.css =============================================== */
/* ===========================================================================
   Tabulka aktivních látek na PDP kúry (parts/pdp-ingredients.php).
   Vkládá ji desktopová vrstva (woocommerce/single-product.php, kotva
   `#slozeni`) i mobilní (parts/pdp-mobile.php, kotva `#m-slozeni`) — v obou
   případech uvnitř `.vl-dcontent`, takže sem patří i mobilní pravidla.

   Načítá se přes VLASIMO_PART_CSS (inc/assets.php) za vlasimo-ui.css.

   Řádky se čtou z Customizeru (`recipe_rows`, `recipe_cols`, `recipe_note`),
   stejně jako tabulka na /slozeni/ — tam má vlastní třídy `.vl-slz-tbl__*`
   v pages/slozeni.css. Nesjednocovat: markup ani rozměry sloupců nejsou
   stejné (1.7fr .8fr .7fr proti 1.6fr 1fr .6fr na homepage).

   `--na` nahrazuje `vlasimo_recipe_rvh_style()` — hodnota bez „%" (látka bez
   referenční hodnoty) je šedá. Funkce zůstává v functions.php, čte ji ještě
   front-page.php.

   Migrace: tools/migrate/26-produkt.py
   =========================================================================== */

.vl-pdp-ingr { background: #f6f5ef; border-top: 1px solid #e3e0d4; border-bottom: 1px solid #e3e0d4; }
.vl-pdp-ingr__in { max-width: 1440px; margin: 0 auto; padding: 48px; display: flex; flex-direction: column; gap: 20px; }

/* --- Hlavička sekce -------------------------------------------------------- */
.vl-pdp-ingr__head { display: flex; align-items: flex-end; justify-content: space-between; gap: 24px; }
.vl-pdp-ingr__headl { display: flex; flex-direction: column; gap: 8px; }
.vl-pdp-ingr__kicker { font-size: 12px; font-weight: 600; letter-spacing: .14em; text-transform: uppercase; color: #0b7c3d; }
/* `h2 { margin:0; letter-spacing:-.01em; color:#16211c }` z vlasimo.css je jen
   (0,0,0,1) — třída ho přebije, hodnoty se ale musí vypsat celé. */
.vl-pdp-ingr__h2 { margin: 0; font-size: 28px; line-height: 1.15; font-weight: 600; letter-spacing: -.02em; color: #16211c; }
.vl-pdp-ingr__note { font-size: 13px; color: #5d6b62; }

/* --- Tabulka --------------------------------------------------------------- */
.vl-pdp-ingr__tbl { background: #ffffff; border: 1px solid #e3e0d4; border-radius: 16px; padding: 10px 28px 16px; display: grid; grid-template-columns: 1fr 1fr; gap: 0 48px; }
.vl-pdp-ingr__col { display: flex; flex-direction: column; }
.vl-pdp-ingr__thead { display: grid; grid-template-columns: 1.7fr .8fr .7fr; gap: 12px; padding: 12px 0 8px; border-bottom: 1px solid #e3e0d4; font-size: 11px; font-weight: 600; letter-spacing: .08em; text-transform: uppercase; color: #8a887f; }
.vl-pdp-ingr__row { display: grid; grid-template-columns: 1.7fr .8fr .7fr; gap: 12px; padding: 8px 0; font-size: 13px; color: #3d443e; }
/* Dělící linka má každý řádek kromě posledního ve sloupci. */
.vl-pdp-ingr__row--sep { border-bottom: 1px solid #f0ede1; }
.vl-pdp-ingr__name { font-weight: 500; color: #16211c; }
.vl-pdp-ingr__r { text-align: right; }
.vl-pdp-ingr__r--na { color: #8a887f; }

/* --- Poznámky pod tabulkou ------------------------------------------------- */
.vl-pdp-ingr__foot { display: flex; flex-direction: column; gap: 6px; }
.vl-pdp-ingr__caps { font-size: 12.5px; color: #5d6b62; }
.vl-pdp-ingr__fine { font-size: 12.5px; color: #8a887f; }

/* ===== Tablet 769–1024 ===================================================== */
@media (min-width: 769px) and (max-width: 1024px) {
	.vl-pdp-ingr__in { max-width: 1024px; padding: 32px; }
	.vl-pdp-ingr__h2 { font-size: 25px; }
}

/* ===== Mobil ≤768 ==========================================================
   Šířku pásu mobil NEstahuje (max-width zůstává 1440), tabulka jde do jednoho
   sloupce a mezera buněk se srazí na 8 px. */
@media (max-width: 768px) {
	.vl-pdp-ingr__in { padding: 28px 20px; }
	.vl-pdp-ingr__h2 { font-size: 22px; }
	.vl-pdp-ingr__tbl { grid-template-columns: 1fr; padding: 4px 16px 12px; }
	.vl-pdp-ingr__thead,
	.vl-pdp-ingr__row { gap: 8px; }
}

/* ==== pdp-mobile.css ==================================================== */
/* ===========================================================================
   Mobilní vrstva detailu produktu — parts/pdp-mobile.php (kúra)
   a parts/pdp-cosmetic-mobile.php (kosmetika). Obojí GENERUJE
   tools/build-pdp-mobile.py; markup se needituje ručně, mapa
   „inline styl → třída" je v generátoru
   (PDPM_MAP / PDPM_TAG / PDPM_DYN / PDPM_KEEP).

   Načítá se přes VLASIMO_PART_CSS (inc/assets.php) za vlasimo-ui.css, tedy
   za vlasimo-base.css — `.vl a { color:#16211c }` a `.vl p { text-align:
   justify }` jsou specifičtější než holá třída, proto se odkazy a odstavce
   píšou jako `.vl a.vl-pdpm-*` / `.vl p.vl-pdpm-*` (a odkazy i s `:hover`,
   protože inline styl dřív hover přebíjel a třída by ho neprohrála jen
   shodou pořadí souborů).

   Hodnoty jsou 1:1 z inline stylů, které v partech stály před migrací
   (ověřeno CDP: na prvcích uvnitř .vl-mobile na PDP nevisí ŽÁDNÉ pravidlo
   `[style*="…"]` — všechna taková v base.css jsou scopovaná .vl-dcontent,
   .vl-desktop, [data-vl-modal] nebo .vl-sechead, což tenhle markup nemá).
   Vrstva je vidět jen do 768 px, ale computed styly se snímají i ve skrytém
   stavu, takže tady žádná media query není: hodnoty musí sedět ve všech
   třech šířkách.

   Co ZŮSTÁVÁ inline a proč (JS ty prvky přepisuje celým `style`):
   – `[data-vl-check]` u doplňků: konfigurátor ve woocommerce/single-product.php
     dělá `chk.style.cssText='…'` a zaškrtnutá varianta v tom výčtu NEMÁ
     `border`. Kdyby rámeček přišel z třídy, zůstal by i na zeleném poli.
   – přeškrtnutá cena v nákupní liště kúry: `setPrice()` dělá
     `parentNode.style.display = old ? '' : 'none'`; prázdná hodnota jen maže
     inline zápis, takže `display:none` ze třídy by cenu schovalo natrvalo.
     Výchozí stav proto zůstává podmíněným `style="display:none"`.

   Migrace: tools/migrate/30-pdp-mobile.py
   =========================================================================== */

/* --- Kořen a hlavička ------------------------------------------------------ */
.vl-pdpm { padding-bottom: 8px; }
.vl-pdpm-crumb { padding: 16px 20px 0; font-size: 12px; color: #8a887f; }
/* Vnitřek drobečků (domeček, odkaz, oddělovač, aktuální položka) je sdílená
   komponenta z vlasimo-ui.css — `.vl-crumb__home`, `.vl-crumb__link`,
   `.vl-crumb__sep--4`, `.vl-crumb__now`. Hodnoty sedí přesně, druhá kopie
   by se jen rozešla. Obal vlastní: mobilní vrstva má padding 16/20/0
   a 12px, kdežto `.vl-crumb` 24/48/0 a 13px. */

.vl-pdpm-head { padding: 14px 20px 0; }
.vl-pdpm-kicker { display: flex; align-items: center; gap: 10px; font-size: 10.5px; font-weight: 600; letter-spacing: .12em; text-transform: uppercase; color: #0b7c3d; }
.vl-pdpm-title { margin: 10px 0 0; font-size: 27px; line-height: 1.18; font-weight: 600; letter-spacing: -.02em; color: #16211c; }
.vl-pdpm-rate { display: flex; align-items: center; gap: 9px; margin-top: 8px; font-size: 12.5px; color: #5d6b62; }
/* Počet hodnocení je kotva na sekci recenzí (#m-recenze) — barvu dědí od
   řádku hodnocení, i na hover (inline `color:inherit` dřív `.vl a:hover`
   přebíjel). */
.vl a.vl-pdpm-rate__link,
.vl a.vl-pdpm-rate__link:hover { color: inherit; text-decoration: underline; text-underline-offset: 3px; }

/* Zvýraznění `*takto*` a tučné hodnoty — dřív 12× opsané
   `font-weight:600; color:#16211c`, i uvnitř argumentů vlasimo_hl()/_text(). */
.vl-pdpm-b { font-weight: 600; color: #16211c; }

/* --- Štítky nad perexem (jen kosmetika) ------------------------------------ */
.vl-pdpm-tags { display: flex; flex-wrap: wrap; gap: 7px; margin: 12px 20px 0; }
.vl-pdpm-tag { display: inline-flex; align-items: center; gap: 7px; background: #f2f1e9; border-radius: 999px; padding: 6px 12px 6px 10px; font-size: 12.5px; line-height: 1.2; color: #3d443e; }
.vl-pdpm-tag__ico { height: 14px; width: auto; flex: none; display: block; }

/* --- Galerie ---------------------------------------------------------------
   Dlaždice: přesně 6 na řádek (David 6. 9.) — `flex:0 0 calc((100% - 30px)/6)`
   je 5 mezer po 6 px odečtených od šířky pásu; výšku drží aspect-ratio, sedmá
   a další se zalomí. Rám a podklad přepisuje po prvním klepnutí obsluha ve
   vlasimo.js (`o.style.border`), výchozí stav dělají tyhle třídy. */
.vl-pdpm-gal { padding: 16px 20px 0; }
.vl-pdpm-gal__main { border: 1px solid #e3e0d4; border-radius: 16px; background: #ffffff; padding: 14px; display: flex; align-items: center; justify-content: center; height: 270px; overflow: hidden; }
.vl-pdpm-gal__tiles { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 10px; }
.vl-pdpm-gtile { border: 1px solid #e3e0d4; background: #ffffff; flex: 0 0 calc((100% - 30px) / 6); min-width: 0; aspect-ratio: 1 / 1; border-radius: 10px; display: flex; align-items: center; justify-content: center; overflow: hidden; cursor: pointer; box-sizing: border-box; }
.vl-pdpm-gtile--sel { border: 2px solid #0d8f46; }
.vl-pdpm-gtile--v { position: relative; background: #16211c; }
/* Packshot dostává vzduch (88 %), čtvercová fotka jde přes celou dlaždici.
   `--fill` musí zrušit i strop 88 %, jinak by 100% šířku srazil zpět. */
.vl-pdpm-gimg { max-width: 88%; max-height: 88%; object-fit: contain; display: block; }
.vl-pdpm-gimg--fill { max-width: 100%; max-height: none; width: 100%; height: 100%; object-fit: cover; }
/* Hlavní okno galerie a miniatury v řádcích doplňků/doporučení. Obsluha
   galerie hlavnímu obrázku přepisuje celý `style` (`main.style.cssText`),
   třída je jen výchozí stav a v režimu `fill` je s ním shodná. */
.vl-pdpm-fit { max-width: 100%; max-height: 100%; object-fit: contain; display: block; }
.vl-pdpm-play { position: absolute; top: 0; left: 0; right: 0; bottom: 0; display: flex; align-items: center; justify-content: center; }
.vl-pdpm-play__dot { width: 24px; height: 24px; border-radius: 50%; background: rgba(22,33,28,.78); display: flex; align-items: center; justify-content: center; }
.vl-pdpm-play__ico { display: block; margin-left: 2px; }

/* --- Výběr délky kúry ------------------------------------------------------
   Dlaždice páruje konfigurátor přes hodnotu data-vl-tile a hned po načtení
   jim rám, podklad i barvy textu nastaví inline — třídy drží stav do doby,
   než skript doběhne. */
.vl-pdpm-len { padding: 20px 20px 0; }
.vl-pdpm-len__grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; margin-top: 10px; }
.vl-pdpm-tile { position: relative; border: 1px solid #d5d2c6; background: #ffffff; border-radius: 11px; padding: 10px 6px; display: flex; flex-direction: column; align-items: center; gap: 2px; cursor: pointer; }
.vl-pdpm-tile__badge { position: absolute; top: -9px; background: #0d8f46; color: #ffffff; font-size: 8.5px; font-weight: 700; letter-spacing: .05em; padding: 2px 7px; border-radius: 999px; }
/* Název varianty na dlaždici a nadpis karty použití/pro koho mají tytéž
   deklarace — jedna třída, ne dvě kopie. */
.vl-pdpm-h15 { font-size: 15px; font-weight: 600; color: #16211c; }
.vl-pdpm-tile__per { font-size: 10.5px; color: #5d6b62; }

/* --- Nákupní box ----------------------------------------------------------- */
.vl-pdpm-buy { margin: 18px 20px 0; border: 1px solid #e3e0d4; background: #ffffff; border-radius: 16px; padding: 18px; }
.vl-pdpm-buy__top { display: flex; align-items: flex-end; justify-content: space-between; gap: 12px; }
.vl-pdpm-buy__prices { display: flex; align-items: flex-end; gap: 9px; }
/* Zvýhodněná varianta má cenu zeleně (jako karta ve výpisu). Uvnitř je
   [data-vl-price], kterému setPrice() barvu přepisuje inline. */
.vl-pdpm-price { font-size: 30px; font-weight: 600; letter-spacing: -.025em; color: #16211c; line-height: .95; }
.vl-pdpm-price--sale { color: #0d8f46; }
.vl-pdpm-price__old { font-size: 13px; color: #8a887f; text-decoration: line-through; padding-bottom: 2px; }
.vl-pdpm-save { background: #fdf3c8; color: #8a6a00; font-size: 11.5px; font-weight: 600; padding: 4px 9px; border-radius: 7px; white-space: nowrap; }
.vl-pdpm-buy__note { font-size: 12.5px; color: #5d6b62; margin-top: 5px; }
.vl-pdpm-buy__row { display: flex; gap: 10px; margin-top: 14px; }
.vl-pdpm-qty { display: flex; align-items: center; border: 1px solid #d5d2c6; border-radius: 11px; overflow: hidden; }
.vl-pdpm-qty__btn { width: 42px; height: 52px; display: flex; align-items: center; justify-content: center; color: #5d6b62; font-size: 17px; cursor: pointer; }
.vl-pdpm-qty__num { width: 30px; text-align: center; font-size: 15px; font-weight: 500; color: #16211c; }
.vl-pdpm-cta { flex: 1; height: 52px; background: #0d8f46; color: #ffffff; border-radius: 12px; display: flex; align-items: center; justify-content: center; gap: 9px; font-size: 15.5px; font-weight: 600; box-shadow: 0 4px 0 #075c2e; cursor: pointer; }

.vl-pdpm-avail { display: flex; flex-direction: column; gap: 7px; margin-top: 14px; font-size: 12.5px; color: #3d443e; }
.vl-pdpm-avail__row { display: flex; align-items: center; gap: 8px; }
.vl-pdpm-avail__dot { width: 6px; height: 6px; min-width: 6px; border-radius: 50%; background: #0d8f46; }
.vl-pdpm-avail__ico { color: #0b7c3d; flex: none; display: flex; }

/* --- Dárek / poukaz místo nákupního boxu (kosmetika) ----------------------- */
.vl-pdpm-note { margin: 18px 20px 0; border: 1px solid #e3e0d4; background: #f6f5ef; border-radius: 16px; padding: 18px; font-size: 14px; line-height: 1.6; color: #3d443e; }
.vl-pdpm-note--col { display: flex; flex-direction: column; gap: 12px; align-items: flex-start; }
.vl a.vl-pdpm-note__btn,
.vl a.vl-pdpm-note__btn:hover { height: 48px; padding: 0 20px; background: #0d8f46; color: #ffffff; border-radius: 12px; display: inline-flex; align-items: center; font-size: 15px; font-weight: 600; box-shadow: 0 3px 0 #075c2e; }

/* --- Řádky doplňků (kúra) a doporučení (kosmetika) -------------------------
   Tentýž řádek dvakrát: u kúry je to `<div>` se zaškrtávátkem, u kosmetiky
   `<a>` na produkt. Liší se jen kurzorem a barvou textu. */
.vl-pdpm-rows { margin: 16px 20px 0; display: flex; flex-direction: column; gap: 8px; }
.vl-pdpm-fieldlabel { font-size: 12.5px; font-weight: 600; color: #16211c; }
.vl-pdpm-fieldlabel__note { font-weight: 400; color: #5d6b62; }
.vl-pdpm-addon { display: flex; align-items: center; gap: 11px; border: 1px solid #e3e0d4; background: #ffffff; border-radius: 12px; padding: 10px 12px; cursor: pointer; }
.vl a.vl-pdpm-reco,
.vl a.vl-pdpm-reco:hover { display: flex; align-items: center; gap: 11px; border: 1px solid #e3e0d4; background: #ffffff; border-radius: 12px; padding: 10px 12px; color: inherit; }
.vl-pdpm-row__thumb { width: 42px; height: 42px; min-width: 42px; display: flex; align-items: center; justify-content: center; }
.vl-pdpm-row__name { font-size: 13.5px; color: #16211c; line-height: 1.3; }
.vl-pdpm-row__sub { font-size: 11.5px; color: #8a887f; }
.vl-pdpm-row__price { margin-left: auto; font-size: 14px; font-weight: 600; color: #16211c; white-space: nowrap; }

/* --- Karta příběhu proměny (jen kúra) -------------------------------------- */
.vl-pdpm-story { margin: 20px 20px 4px; }

/* --- Béžová karta: složení (kúra), přednosti a INCI (kosmetika) ------------ */
.vl-pdpm-card { margin: 16px 20px 0; background: #f6f5ef; border: 1px solid #e3e0d4; border-radius: 16px; padding: 18px 20px; }
.vl-pdpm-card--ben { margin-top: 22px; }
.vl-pdpm-card--inci { margin-top: 18px; }
.vl-pdpm-card__kicker { font-size: 10.5px; font-weight: 600; letter-spacing: .14em; text-transform: uppercase; color: #0b7c3d; }
.vl-pdpm-card__title { font-size: 16px; font-weight: 600; color: #16211c; margin-top: 6px; }
.vl a.vl-pdpm-card__link,
.vl a.vl-pdpm-card__link:hover { display: block; margin-top: 12px; font-size: 13px; font-weight: 500; color: #0b7c3d; text-decoration: underline; text-underline-offset: 4px; }
.vl-pdpm-chips { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 12px; }
.vl-pdpm-chip { background: #ffffff; border: 1px solid #e3e0d4; border-radius: 999px; padding: 5px 11px; font-size: 12px; color: #3d443e; }
.vl-pdpm-chips__more { padding: 5px 2px; font-size: 12px; color: #5d6b62; }

/* --- Popis ----------------------------------------------------------------- */
.vl-pdpm-sec { margin: 18px 20px 0; }
.vl-pdpm-h2 { margin: 0; font-size: 19px; font-weight: 600; letter-spacing: -.015em; color: #16211c; }
.vl-pdpm-h3 { margin: 16px 0 0; font-size: 16px; line-height: 1.3; font-weight: 600; letter-spacing: -.01em; color: #16211c; }
.vl-pdpm-desc__lead { margin: 8px 0 0; font-size: 15px; font-weight: 600; color: #16211c; line-height: 1.35; }
/* `.vl p { text-align: justify }` (0,1,1) je specifičtější než holá třída —
   proto se selektorem `.vl p.…`. Zarovnání je stejné jako dřív: odstavce
   popisu ho měly inline, odstavce použití/pro koho ho braly právě z `.vl p`. */
.vl p.vl-pdpm-p { margin: 10px 0 0; font-size: 13.5px; line-height: 1.7; color: #3d443e; text-align: justify; }

/* --- Použití / pro koho (kosmetika) ---------------------------------------- */
.vl-pdpm-uw { margin: 18px 20px 0; display: flex; flex-direction: column; gap: 12px; }
.vl-pdpm-uw__card { border: 1px solid #e3e0d4; background: #ffffff; border-radius: 16px; padding: 18px; }
.vl-pdpm-uw__head { display: flex; align-items: center; gap: 10px; }
.vl-pdpm-uw__ico { width: 34px; height: 34px; min-width: 34px; border-radius: 50%; background: #e4eee6; display: flex; align-items: center; justify-content: center; }
.vl-pdpm-uw__ico--amber { background: #fdf3c8; }

/* --- INCI (kosmetika) ------------------------------------------------------ */
.vl p.vl-pdpm-inci__p { margin: 10px 0 0; font-size: 12.5px; line-height: 1.65; color: #3d443e; word-break: break-word; }
.vl p.vl-pdpm-inci__note { margin: 8px 0 0; font-size: 11.5px; color: #8a887f; line-height: 1.5; }

/* --- Tabulka parametrů (jen kúra) ------------------------------------------ */
.vl-pdpm-spec { margin: 20px 20px 0; display: flex; flex-direction: column; }
.vl-pdpm-spec__row { display: grid; grid-template-columns: 112px 1fr; gap: 12px; padding: 11px 0; border-top: 1px solid #f0ede1; font-size: 13px; }
.vl-pdpm-spec__row--last { border-bottom: 1px solid #f0ede1; }
.vl-pdpm-spec__k { color: #8a887f; }
.vl-pdpm-spec__v { font-weight: 500; color: #16211c; }

/* --- Hodnocení ------------------------------------------------------------- */
.vl-pdpm-rev { margin: 24px 20px 0; border-top: 1px solid #e8e5d9; padding-top: 20px; display: flex; flex-direction: column; gap: 12px; }
.vl-pdpm-rev__head { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; }
.vl-pdpm-rev__score { display: flex; align-items: center; gap: 6px; font-size: 12.5px; color: #5d6b62; white-space: nowrap; }
.vl-pdpm-rev__list { display: flex; flex-direction: column; gap: 12px; }
.vl-pdpm-rev__more { display: flex; flex-direction: column; align-items: center; gap: 8px; margin-top: 4px; }
.vl-pdpm-morebtn { height: 46px; padding: 0 22px; border: 1.5px solid #0d8f46; color: #0b7c3d; border-radius: 12px; display: inline-flex; align-items: center; gap: 8px; font-size: 14px; font-weight: 600; cursor: pointer; }
.vl-pdpm-rev__shown { font-size: 12px; color: #8a887f; }
.vl p.vl-pdpm-rev__note { margin: 14px 20px 0; font-size: 12px; line-height: 1.6; color: #8a887f; }

/* --- Spodní nákupní lišta --------------------------------------------------
   Pozicování (fixed, výjezd, strop 58 % pro tlačítko) drží `.vl-buybar`
   ve vlasimo-base.css a zůstává tam — je sdílené s desktopovou vrstvou.
   Tady je jen vzhled pruhu z návrhu. */
.vl-pdpm-bar { background: rgba(253,252,248,.97); border-top: 1px solid #e3e0d4; padding: 10px 16px; display: flex; align-items: center; gap: 12px; box-shadow: 0 -6px 20px rgba(22,33,28,.08); }
.vl-pdpm-bar__img { width: 42px; height: 42px; flex: none; border: 1px solid #e3e0d4; border-radius: 9px; background: #ffffff; object-fit: contain; padding: 3px; display: block; }
.vl-pdpm-bar__col { display: flex; flex-direction: column; min-width: 0; }
.vl-pdpm-bar__prices { display: flex; align-items: baseline; gap: 6px; min-width: 0; }
.vl-pdpm-bar__price { font-size: 16px; font-weight: 600; white-space: nowrap; color: #16211c; }
.vl-pdpm-bar__price--sale { color: #0d8f46; }
.vl-pdpm-bar__old { font-size: 12px; color: #8a887f; text-decoration: line-through; white-space: nowrap; }
.vl-pdpm-bar__name { font-size: 11px; color: #5d6b62; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
/* `flex`, `margin-left`, `max-width` a `padding` tlačítku dává
   `.vl-buybar > [data-vl-add]` (0,2,0) v base.css — `flex:1` tady stejně
   jako dřív prohrává s jeho `!important`, zůstává kvůli shodě s návrhem. */
.vl-pdpm-bar__cta { flex: 1; height: 50px; background: #0d8f46; color: #ffffff; border-radius: 12px; display: flex; align-items: center; justify-content: center; gap: 9px; font-size: 15px; font-weight: 600; box-shadow: 0 3px 0 #075c2e; cursor: pointer; }
.vl-pdpm-bar__cta--nowrap { white-space: nowrap; }

/* ==== pdp-related.css =================================================== */
/* ===========================================================================
   Související produkty na detailu produktu — styly vytažené z markupu.

   Jeden vzhled, dva party:
     parts/pdp-related.php           … kúrová PDP (4 pevné karty)
     parts/pdp-cosmetic-related.php  … PDP kosmetiky (4 karty podle typu)
   Markup karet i hlavičky sekce je v obou 1:1 stejný, liší se jen odsazení
   obalu (kúra 48px kolem dokola, kosmetika 0 48px 56px, protože nad ní stojí
   Instagramová zeď) → jedna sada tříd `.vl-pdpr-*` a dva modifikátory obalu.

   Obě sekce se na PDP vykreslí DVAKRÁT: jednou v `.vl-desktop`
   (single-product.php / pdp-cosmetic.php) a jednou v `.vl-mobile`, vždy uvnitř
   `.vl-dcontent`. Mobilní pravidla proto nejsou vázaná na vrstvu — v základu
   je taky nesly (`.vl-dcontent [style*="padding:48px"]` platilo pro obě).

   Načítá se z assets/css/parts/ (inc/assets.php, seznam VLASIMO_PART_CSS)
   za vlasimo-base.css a vlasimo-ui.css, takže responzivní vrstvu základu jde
   přebít bez `!important`.

   Hodnoty tabletu a mobilu NEJSOU z návrhu — jsou to skutečné výsledky
   pravidel `[style*="…"]` ve vlasimo-base.css, která na tenhle markup mířila:
     769–1024:  max-width 1024, padding 48→32 / 0 48px 56px→0 32px 36px,
                nadpis 28→25 px, mřížka 4→2 sloupce
     ≤768:      padding 48→28/20, 0 48px 56px→0 20px 36px, nadpis 28→22 px,
                mřížka 4→2 sloupce

   Migrace: tools/migrate/27-pdp-kosmetika.py
   =========================================================================== */

/* --- Obal sekce ------------------------------------------------------------ */
.vl-pdpr { max-width: 1440px; margin: 0 auto; display: flex; flex-direction: column; gap: 20px; }
.vl-pdpr--kura { padding: 48px; }
.vl-pdpr--cos  { padding: 0 48px 56px; }

/* --- Hlavička sekce (nadpis vlevo, poznámka vpravo dole) ------------------- */
.vl-pdpr__head   { display: flex; align-items: flex-end; justify-content: space-between; gap: 24px; }
.vl-pdpr__col    { display: flex; flex-direction: column; gap: 8px; }
.vl-pdpr__kicker { font-size: 12px; font-weight: 600; letter-spacing: .14em; text-transform: uppercase; color: #0b7c3d; }
.vl-pdpr__title  { margin: 0; font-size: 28px; line-height: 1.15; font-weight: 600; letter-spacing: -.02em; color: #16211c; }
.vl-pdpr__note   { font-size: 14px; color: #5d6b62; }

/* --- Mřížka karet ---------------------------------------------------------- */
.vl-pdpr__grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; }

/* --- Karta produktu -------------------------------------------------------- */
.vl-pdpr-card { background: #ffffff; border: 1px solid #e3e0d4; border-radius: 16px; overflow: hidden; display: flex; flex-direction: column; }
/* Obrázková část je `<a>` — barvu textu si nenese, dědí `.vl a`, jak dřív. */
.vl-pdpr-card__media { position: relative; height: 200px; background: #fdfcf8; border-bottom: 1px solid #f0ede1; display: flex; align-items: center; justify-content: center; }
/* `img { max-width:100%; height:auto }` z vlasimo.css je (0,0,0,1), takže
   procenta musí být na třídě, ne v šabloně. */
.vl-pdpr-card__img { max-height: 90%; max-width: 90%; object-fit: contain; display: block; }
/* Kondicionér ve výpisu kúry: barevná korekce staré fotky (CLAUDE.md — fotky
   dlaždic jsou původní úzké kopie z uploads/2023/09). Jediná pevná hodnota,
   ostatní korekce jdou z `$vl_imgf` a zůstávají inline. */
.vl-pdpr-card__img--kond { filter: hue-rotate(-9deg) saturate(89%); }
.vl-pdpr-card__save { position: absolute; top: 10px; right: 10px; background: #16211c; color: #ffd21f; border: none; font-size: 11.5px; font-weight: 600; padding: 4px 9px; border-radius: 7px; }
.vl-pdpr-card__body { padding: 16px; display: flex; flex-direction: column; gap: 10px; flex: 1; }
.vl-pdpr-card__prices { display: flex; align-items: flex-end; gap: 7px; margin-top: auto; }
.vl-pdpr-card__price { font-size: 19px; font-weight: 600; color: #16211c; line-height: 1; }
.vl-pdpr-card__old { font-size: 12.5px; color: #8a887f; text-decoration: line-through; }

/* Název a tlačítko jsou `<a>`: `.vl a { color:#16211c }` (0,1,1) i
   `.vl a:hover { color:#0b7c3d }` (0,2,1) přebíjejí holou třídu, a inline styl
   dřív přebíjel obojí — hover proto barvu NIKDY neměnil. Aby to tak zůstalo,
   je pravidlo psané `.vl a.<třída>` a `:hover` je vypsaný zvlášť. */
.vl a.vl-pdpr-card__name,
.vl a.vl-pdpr-card__name:hover { font-size: 14.5px; font-weight: 600; color: #16211c; line-height: 1.35; }
.vl-pdpr-card__btn,
.vl a.vl-pdpr-card__btn,
.vl a.vl-pdpr-card__btn:hover { height: 42px; background: #0d8f46; color: #ffffff; border-radius: 10px; display: flex; align-items: center; justify-content: center; gap: 8px; font-size: 14px; font-weight: 600; box-shadow: 0 3px 0 #075c2e; }
/* Balíček šampon+kondicionér na kúrové PDP je `<div>` (přidává ho JS), ne
   odkaz — jinak stejné tlačítko. */
.vl-pdpr-card__btn--click { cursor: pointer; }

/* --- Tablet 769–1024 px ---------------------------------------------------- */
@media (min-width: 769px) and (max-width: 1024px) {
	.vl-pdpr { max-width: 1024px; }
	.vl-pdpr--kura { padding: 32px; }
	.vl-pdpr--cos  { padding: 0 32px 36px; }
	.vl-pdpr__title { font-size: 25px; }
	.vl-pdpr__grid { grid-template-columns: repeat(2, 1fr); }
}

/* --- Mobil ≤768 px --------------------------------------------------------- */
@media (max-width: 768px) {
	.vl-pdpr--kura { padding: 28px 20px; }
	.vl-pdpr--cos  { padding: 0 20px 36px; }
	.vl-pdpr__title { font-size: 22px; }
	.vl-pdpr__grid { grid-template-columns: repeat(2, 1fr); }
}

/* ==== promo-bar.css ===================================================== */
/* ===========================================================================
   promo-bar.css — akční proužek pod hlavičkou (parts/promo-bar.php).

   Kreslí se JEN při běžící kampani s textem pásu (HM_Campaigns::primary()),
   uvnitř `.vl-desktop.vl-hdr` v header.php — tedy nad 839 px. Mobilní pruh je
   jiný part (`parts/promo-bar-mobile.php`) s vlastním markupem; ten se sem
   nemíchá.

   Načítání: `inc/assets.php` → konstanta `VLASIMO_PART_CSS` (výslovný seznam,
   ne glob). Pořadí: vlasimo.css → vlasimo-legacy.css → vlasimo-base.css →
   vlasimo-ui.css → parts/*.css. `!important` proto není potřeba nikde.

   Vznik: tools/migrate/23-balicky-promo.py (24 inline stylů → `.vl-promo*`).

   Čtyři barevné styly (pole „Barevný styl" kampaně) měly v šabloně čtyři
   kopie téhož markupu, každou s vlastními barvami v `style=`. Markup zůstal
   čtyřikrát (menší diff, každá větev se dá ověřit zvlášť), ale CSS je jedno:
   společné třídy `.vl-promo__*` a barvy přes modifikátor obalu
   `.vl-promo--dark|--forest|--amber|--green`. Ze stejného důvodu ztratila
   `vlasimo_promo_right()` čtyři barevné parametry — barvu určuje modifikátor.

   POZOR — pás se objeví jen s kampaní, takže ho `tools/css-snap/base`
   nezachytil. Hodnoty jsou ověřené lokální replikou (viz hlavička migračního
   skriptu) ve 1440 / 900 / 390 px, všechny čtyři styly × obě varianty pravého
   konce (odkaz / tečka s poznámkou na výpisu).

   Responzivní vrstva přepsaná z vlasimo-base.css (tohle pravidlo tím osiří):
     ~1110  [style*="max-width:1440px; margin:0 auto; display:flex;
             align-items:center; gap:16px; padding:12px 48px"]
   Sdílené `[style*="max-width:1440px; margin:0 auto"]` (~1113) v base.css
   ZŮSTÁVÁ — používají ho jiné šablony.
   =========================================================================== */

/* --- Rám pásu -------------------------------------------------------------- */
.vl-promo--dark { background: #16211c; }
.vl-promo--forest { background: #1f4d3a; }
.vl-promo--amber { background: #fdf3c8; border-bottom: 1px solid #eddfa0; }
.vl-promo--green { background: #e4eee6; border-bottom: 1px solid #c6dbcb; }

.vl-promo__in { max-width: 1440px; margin: 0 auto; display: flex; align-items: center; gap: 16px; padding: 12px 48px; }

/* --- Štítek („AKCE" / chip_text kampaně) ----------------------------------- */
.vl-promo__badge { font-size: 12px; font-weight: 700; letter-spacing: .08em; padding: 6px 12px; border-radius: 999px; }
.vl-promo--dark .vl-promo__badge,
.vl-promo--forest .vl-promo__badge { background: #ffd21f; color: #16211c; }
.vl-promo--amber .vl-promo__badge { background: #16211c; color: #ffd21f; }
.vl-promo--green .vl-promo__badge { background: #0d8f46; color: #ffffff; }

/* --- Text pásu ------------------------------------------------------------- */
.vl-promo__text { font-size: 14.5px; font-weight: 500; }
.vl-promo--dark .vl-promo__text { color: #ffffff; }
.vl-promo--forest .vl-promo__text { color: #fdfcf8; }
.vl-promo--amber .vl-promo__text,
.vl-promo--green .vl-promo__text { color: #16211c; }

/* Kód kupónu ze zástupce {kod}. Na tmavém pásu žlutě — dřív to dělal
   `str_replace()` nad inline stylem, teď modifikátor. Text prochází
   `wp_kses()`, jehož allowlist proto povoluje `class`, ne `style`. */
.vl-promo__code { font-weight: 700; }
.vl-promo--dark .vl-promo__code,
.vl-promo--forest .vl-promo__code { color: #ffd21f; }

/* „· platí do …" za textem */
.vl-promo__until { font-weight: 400; }
.vl-promo--dark .vl-promo__until { color: #9fb0a4; }
.vl-promo--forest .vl-promo__until { color: #a9bdb0; }
.vl-promo--amber .vl-promo__until { color: #8a6a00; }
.vl-promo--green .vl-promo__until { color: #5d6b62; }

/* --- Pravý konec: poznámka s tečkou (na výpisu produktů) ------------------- */
.vl-promo__note { margin-left: auto; display: inline-flex; align-items: center; gap: 8px; font-size: 14.5px; font-weight: 600; }
.vl-promo--dark .vl-promo__note,
.vl-promo--forest .vl-promo__note { color: #fdfcf8; }
.vl-promo--amber .vl-promo__note,
.vl-promo--green .vl-promo__note { color: #16211c; }

.vl-promo__dot { width: 7px; height: 7px; border-radius: 50%; display: inline-block; flex: none; }
.vl-promo--dark .vl-promo__dot,
.vl-promo--forest .vl-promo__dot { background: #f59e0b; }
.vl-promo--amber .vl-promo__dot,
.vl-promo--green .vl-promo__dot { background: #d97706; }

/* --- Pravý konec: odkaz ----------------------------------------------------
   `.vl a { color:#16211c; text-decoration:none }` a `.vl a:hover { color:#0b7c3d }`
   jsou (0,1,1) — holá třída by prohrála a odkaz by ztratil podtržení i barvu
   (a na hover zezelenal, což inline styl dřív nedovolil). Proto `.vl a.třída`
   a barvy zopakované pro `:hover`. */
.vl a.vl-promo__link,
.vl a.vl-promo__link:hover { margin-left: auto; font-size: 14.5px; font-weight: 600; text-decoration: underline; text-underline-offset: 3px; }
.vl .vl-promo--dark a.vl-promo__link,
.vl .vl-promo--dark a.vl-promo__link:hover,
.vl .vl-promo--forest a.vl-promo__link,
.vl .vl-promo--forest a.vl-promo__link:hover { color: #ffd21f; }
.vl .vl-promo--amber a.vl-promo__link,
.vl .vl-promo--amber a.vl-promo__link:hover { color: #8a6a00; }
.vl .vl-promo--green a.vl-promo__link,
.vl .vl-promo--green a.vl-promo__link:hover { color: #0b7c3d; }

/* --- Tablet 769–1024 -------------------------------------------------------
   Přesně to, co dřív dělalo `[style*="…gap:16px; padding:12px 48px"]`
   z base.css. Pod 840 px se celá desktopová hlavička schovává
   (`.vl-hdr`), mobilní pravidla proto pás nemá a mít nemusí. */
@media (min-width: 769px) and (max-width: 1024px) {
	.vl-promo__in { max-width: 1024px; padding: 12px 32px; }
}

/* ==== reviews.css ======================================================= */
/* ===========================================================================
   Recenze a sociální bloky — styly vytažené z markupu partů.

   Pokrývá: parts/review-card.php, parts/review-card-hpm.php,
   parts/review-form.php, parts/rating-summary.php, parts/reviews-modal.php,
   parts/ig-wall.php, parts/social-grid.php a HTML, které skládá
   inc/reviews.php (odpověď obchodu pod recenzí, fotky od zákazníka).

   Načítá se ze seznamu VLASIMO_PART_CSS v inc/assets.php, tedy ZA
   vlasimo-base.css a vlasimo-ui.css a PŘED assets/css/pages/<slug>.css.
   `!important` je proto potřeba jen tam, kde přebíjím pravidlo, které ho
   samo má.

   Migrace: tools/migrate/33-recenze.py. Hodnoty NEJSOU opsané z návrhu, ale
   z computed stylů živého dev webu ve třech šířkách (tools/css-probe.js na
   /zkusenosti-ostatnich/, /produkt/vlasimo-3mesicni-kura/,
   /produkt/sampon-na-podporu-rustu-vlasu/, / a /obchod/).

   CO ZŮSTÁVÁ VE vlasimo-base.css a proč se to sem nepřepisuje
   (jsou to pravidla na TŘÍDY, ne na `[style*="…"]`, takže migrací nezanikla
   a mají `!important` — přebila by cokoliv, co bych sem napsal):
     .vl-zk-wrap   — vodorovné odsazení pásů (tablet 32 px, mobil 20 px);
                     nese ho i ig-wall a social-grid, proto tu píšu jen
                     svislé odsazení a desktopové hodnoty,
     .vl-zk-social — gap 12 px na tabletu i mobilu, 2 sloupce pod 768 px,
     .vl-zk-igwall — 1 sloupec pod 768 px,
     .vl-sg-note   — zalomení a zarovnání perexu mřížky ohlasů,
     .vl-revcard__head/__badge/__date/__by/__name/__stars/__quote (řádky 50–56),
     .vl-rev-clamp / .vl-rev-more (ořez dlouhé recenze, řádky 733–736),
     [data-vl-rmodal] a [data-vl-rmodal-box] (celoobrazovkový modal ≤1024),
     [hidden] { display:none !important } ve vlasimo.css — drží modal zavřený
     i proti .vl-rev-modal { display:flex }, stejně jako dřív proti inline stylu.

   Konkurence, se kterou třídy počítají:
   - `.vl p { text-align: justify }` (0,1,1) je specifičtější než holá třída.
     Text recenze i odpovědi obchodu měl justify už před migrací (inline styl
     text-align nenastavoval), proto ho tu ZÁMĚRNĚ nikdo nenastavuje.
   - `.vl a { color:#16211c }` / `.vl a:hover { color:#0b7c3d }` (0,1,1 / 0,2,1)
     přebijí holou třídu. Odkazy ig-wallu jsou proto psané `.vl a.vl-rev-ig__*`
     včetně `:hover` — inline styl hover přebíjel, třída sama ne. Dlaždice
     ohlasu (`.vl-rev-sg__box`) je taky `<a>`, ale barvu ani podtržení nikdy
     nenastavovala, takže ji `.vl a` řídí dál a třída do toho nesahá.
   - `h1,h2,h3 { margin:0; color:#16211c; letter-spacing:-.01em }` (0,0,1)
     ve vlasimo.css — `.vl-rev-sec__title` ji přebije, ale margin,
     letter-spacing i barvu proto nastavuje sama.
   - `img { max-width:100%; height:auto }` a `button { font-family:inherit;
     cursor:pointer }` (0,0,1) — rozměry obrázků a font tlačítek proto
     deklarují třídy samy.

   CO ZŮSTALO INLINE (a proč):
   - `h-ava` v vlasimo_review_avatar() — `--hm-ava-bg/-fg/-ring` se počítají
     z otisku jména (24 odstínů × 3 tóny), množina není konečná,
   - `h-stars__fg { width:…% }` ve vlasimo_stars_html() — vykalibrované
     offsety čtvrthvězd, na ty se nesahá,
   - `width:…%` pruhu histogramu v rating-summary (procenta z počtu hvězd),
   - výška iframe instagramové zdi, kterou po `postMessage MEASURE`
     přepisuje skript partu (`frames[i].style.height`) — inline styl je tam
     nosič dat, ne vzhled; výchozích 720 / 620 px dává třída.
   =========================================================================== */

/* --- Karta recenze (parts/review-card.php) ---------------------------------
   Sdílí ji detail kúry, detail kosmetiky, výpis produktů, homepage, mobilní
   vrstvy i AJAX donačítání (vl_zk_more). Podklad a odsazení jsou parametry
   partu se čtyřmi skutečně používanými kombinacemi → dva modifikátory. */
.vl-rev-card { background: #ffffff; border: 1px solid #e3e0d4; border-radius: 16px; padding: 20px; display: flex; flex-direction: column; gap: 12px; }
.vl-rev-card--cream { background: #fdfcf8; }
.vl-rev-card--p22 { padding: 22px; }
.vl-rev-card--p1618 { padding: 16px 18px; }
/* Štítek „Ověřený nákup“. Jméno `__verified`, ne `__badge` — `.vl-revcard__badge`
   (bez pomlčky) už existuje v base.css a je to RODIČ tohohle prvku. */
.vl-rev-card__verified { display: inline-flex; align-items: center; gap: 6px; font-size: 10.5px; font-weight: 600; letter-spacing: .08em; text-transform: uppercase; color: #0b7c3d; }
.vl-rev-card__text { margin: 0; font-size: 14.5px; line-height: 1.65; color: #3d443e; }
/* `display` tu schválně není: dodává ho `.vl-rev-more` / `.vl-rev-more.is-on`
   v base.css (tlačítko odkrývá JS jen u opravdu oříznutého textu). */
.vl-rev-card__more { align-self: flex-start; margin-top: 2px; padding: 0; background: none; border: 0; font-family: inherit; font-size: 13px; font-weight: 500; color: #0b7c3d; text-decoration: underline; text-underline-offset: 3px; cursor: pointer; }

/* --- Karta ohlasu na mobilní homepage (parts/review-card-hpm.php) ----------
   Fotka vlevo od textu. Dnes ji kreslí jen AJAX endpoint vl_zk_more s tpl=hpm
   (mobilní homepage přešla 3. 9. na sdílený review-card), takže na žádné
   stránce snímku neleží — hodnoty jsou 1:1 z původních inline stylů. */
.vl-rev-hpm { background: #fdfcf8; border: 1px solid #e3e0d4; border-radius: 14px; padding: 18px 20px; }
.vl-rev-hpm__top { display: flex; align-items: center; gap: 10px; }
.vl-rev-hpm__verified { display: inline-flex; align-items: center; gap: 6px; font-size: 10px; font-weight: 600; letter-spacing: .08em; text-transform: uppercase; color: #0b7c3d; }
.vl-rev-hpm__ico { display: block; }
.vl-rev-hpm__date { margin-left: auto; font-size: 11px; color: #8a887f; white-space: nowrap; }
.vl-rev-hpm__body { display: flex; gap: 12px; align-items: flex-start; margin-top: 10px; }
.vl-rev-hpm__photo { flex: none; }
.vl-rev-hpm__img { width: 64px; height: 64px; border-radius: 10px; border: 1px solid #e3e0d4; object-fit: cover; display: block; }
.vl-rev-hpm__quote { flex: 1; min-width: 0; }
.vl-rev-hpm__text { margin: 0; font-size: 13.5px; line-height: 1.65; color: #3d443e; }
.vl-rev-hpm__more { align-self: flex-start; padding: 0; background: none; border: 0; font-family: inherit; font-size: 12.5px; font-weight: 500; color: #0b7c3d; text-decoration: underline; text-underline-offset: 3px; cursor: pointer; }
.vl-rev-hpm__by { display: flex; align-items: center; gap: 9px; margin-top: 12px; }
.vl-rev-hpm__name { font-size: 13px; font-weight: 500; color: #16211c; }
.vl-rev-hpm__stars { margin-left: auto; color: #E4A90C; font-size: 12px; letter-spacing: .04em; }
.vl-rev-hpm__reply { margin-top: 12px; }

/* --- Odpověď obchodu pod recenzí (vlasimo_review_reply_html v inc/reviews.php)
   Na dev nemá ani jedna recenze schválenou odpověď, takže tenhle blok NENÍ
   v žádném snímku — hodnoty jsou přepsané 1:1 z inline stylů. Avatar je buď
   favicon webu (`__ico`), nebo béžové kolečko s „V“ (`__badge`). */
.vl-rev-reply { background: #e4eee6; border: 1px solid #c6dbcb; border-radius: 12px; padding: 14px 16px; display: flex; flex-direction: column; gap: 8px; }
.vl-rev-reply__label { display: inline-flex; align-items: center; gap: 8px; font-size: 12px; font-weight: 700; letter-spacing: .02em; color: #0b7c3d; }
.vl-rev-reply__ico { width: 22px; height: 22px; border-radius: 50%; display: block; }
.vl-rev-reply__badge { width: 22px; height: 22px; border-radius: 50%; background: #16211c; color: #ffd21f; font-size: 11px; font-weight: 700; display: inline-flex; align-items: center; justify-content: center; }
.vl-rev-reply__text { margin: 0; font-size: 13.5px; line-height: 1.6; color: #16211c; }

/* --- Fotky od zákazníka (vlasimo_review_photos_html v inc/reviews.php) ------
   Obal drží dál i třídu `.h-review__photos` (herbasí jméno, žádné CSS na ni
   nevisí, ale sahá na ni JS fotomodalu přes `[data-vl-photo]`). */
.vl-rev-photos { display: flex; gap: 8px; align-items: center; margin-top: 10px; flex-wrap: wrap; }
.vl-rev-photos__img { width: 72px; height: 72px; border-radius: 10px; border: 1px solid #e3e0d4; object-fit: cover; display: block; }
.vl-rev-photos__note { font-size: 12px; color: #8a887f; padding-left: 6px; }

/* --- Souhrn hodnocení (parts/rating-summary.php) ---------------------------
   Velké číslo, hvězdy, počty a histogram. Pruh histogramu má dvě barvy
   (5 a 4 ★ zelené, 3 a níž zlaté) — modifikátor `--gold`; šířku pruhu
   v procentech nese dál inline styl, konečná množina hodnot to není. */
.vl-rev-sum { background: #ffffff; border: 1px solid #e3e0d4; border-radius: 18px; padding: 24px; display: flex; flex-direction: column; gap: 16px; }
.vl-rev-sum__top { display: flex; align-items: center; gap: 14px; }
.vl-rev-sum__num { font-size: 46px; font-weight: 600; letter-spacing: -.03em; color: #16211c; line-height: 1; }
.vl-rev-sum__col { display: flex; flex-direction: column; gap: 3px; }
.vl-rev-sum__count { font-size: 12.5px; color: #5d6b62; }
.vl-rev-sum__bars { display: flex; flex-direction: column; gap: 7px; }
.vl-rev-sum__row { display: flex; align-items: center; gap: 10px; font-size: 12px; color: #5d6b62; }
.vl-rev-sum__star { width: 26px; }
.vl-rev-sum__track { flex: 1; height: 7px; border-radius: 4px; background: #efece1; }
.vl-rev-sum__fill { height: 7px; border-radius: 4px; background: #0d8f46; }
.vl-rev-sum__fill--gold { background: #c99a12; }
.vl-rev-sum__pct { width: 34px; text-align: right; }
.vl-rev-sum__sat { display: flex; align-items: baseline; gap: 8px; padding-top: 14px; border-top: 1px solid #f0ede1; }
.vl-rev-sum__satnum { font-size: 20px; font-weight: 600; color: #0b7c3d; white-space: nowrap; }
.vl-rev-sum__sattext { font-size: 12.5px; color: #5d6b62; line-height: 1.4; }
.vl-rev-sum__note { font-size: 11.5px; color: #8a887f; line-height: 1.5; }

/* --- Formulář hodnocení (parts/review-form.php) ----------------------------
   Třída `.vl-revform` na obalu ZŮSTÁVÁ — hledá si ji vlasimo-cart.js
   (donačítání recenzí), není to vzhledová třída. */
.vl-rev-form { background: #ffffff; border: 1px solid #e3e0d4; border-radius: 16px; padding: 24px 26px; display: flex; flex-direction: column; gap: 14px; }
.vl-rev-form__title { font-size: 17px; font-weight: 600; letter-spacing: -.01em; color: #16211c; }
.vl-rev-form__thanks { background: #e4eee6; border: 1px solid #c6dbcb; border-radius: 12px; padding: 12px 14px; font-size: 14px; color: #16211c; }
.vl-rev-form__already { font-size: 14px; line-height: 1.6; color: #5d6b62; }

/* --- Modal „Zkušenosti zákazníků“ (parts/reviews-modal.php) ----------------
   Zavřený stav drží atribut `hidden` + `[hidden]{display:none!important}`
   ve vlasimo.css — proti tomu neprošel ani inline `display:flex`, takže se
   chování třídou nemění. Dvojí `height` u boxu je fallback 100vh → 100dvh
   a musí zůstat v tomhle pořadí. Průhlednost iframu ruší skript
   (`f.style.opacity="1"` po `load`), proto ji tu jen nastavuji na 0. */
.vl-rev-modal { position: fixed; inset: 0; z-index: 210; background: rgba(22, 33, 28, .55); backdrop-filter: blur(3px); display: flex; align-items: center; justify-content: center; padding: 40px; }
.vl-rev-modal__box { position: relative; background: #fdfcf8; border-radius: 20px; width: 100%; max-width: 1240px; height: calc(100vh - 80px); height: calc(100dvh - 80px); overflow: hidden; box-shadow: 0 30px 80px rgba(22, 33, 28, .35); display: flex; flex-direction: column; }
.vl-rev-modal__close { position: absolute; top: 14px; right: 14px; z-index: 5; width: 38px; height: 38px; border: 0; border-radius: 50%; background: #16211c; color: #ffffff; display: flex; align-items: center; justify-content: center; cursor: pointer; box-shadow: 0 6px 16px rgba(22, 33, 28, .25); }
.vl-rev-modal__loading { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; font-size: 14px; color: #8a887f; pointer-events: none; }
.vl-rev-modal__frame { position: relative; flex: 1; width: 100%; border: 0; background: transparent; opacity: 0; transition: opacity .2s ease; }

/* --- Hlavička sekce: nadpisek + H2 vlevo, odkaz/perex vpravo ---------------
   Sdílí ji instagramová zeď i mřížka ohlasů — v obou partech to byl znak po
   znaku tentýž inline styl, takže jedna třída, ne kopie. */
.vl-rev-sec__head { display: flex; align-items: flex-end; justify-content: space-between; gap: 16px; flex-wrap: wrap; }
.vl-rev-sec__headcol { display: flex; flex-direction: column; gap: 8px; }
.vl-rev-sec__kicker { font-size: 12px; font-weight: 600; letter-spacing: .14em; text-transform: uppercase; color: #0b7c3d; }
.vl-rev-sec__title { margin: 0; font-size: 28px; line-height: 1.15; font-weight: 600; letter-spacing: -.02em; color: #16211c; }

/* --- Instagramová zeď (parts/ig-wall.php) ----------------------------------
   Dvě podoby: `--band` v krémovém pruhu přes celou šířku (detail produktu,
   odsazení 48 px dokola) a `--flow` v toku stránky Zkušeností (44/48/0).
   Vodorovných 48 px na tabletu a mobilu se stejně nedožije — přebije je
   `.vl-zk-wrap` z base.css, kterou obal drží dál. */
.vl-rev-igband { background: #f6f5ef; border-top: 1px solid #e3e0d4; border-bottom: 1px solid #e3e0d4; }
.vl-rev-ig { max-width: 1440px; margin: 0 auto; display: flex; flex-direction: column; gap: 16px; }
.vl-rev-ig--band { padding: 48px; }
.vl-rev-ig--flow { padding: 44px 48px 0; }
.vl a.vl-rev-ig__link,
.vl a.vl-rev-ig__link:hover { font-size: 13.5px; font-weight: 500; color: #0b7c3d; text-decoration: underline; text-underline-offset: 4px; }
.vl-rev-ig__wall { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; align-items: start; }
.vl-rev-ig__col { display: flex; flex-direction: column; gap: 14px; }
.vl-rev-ig__tile { border-radius: 14px; border: 1px solid #e3e0d4; overflow: hidden; background: #ffffff; }
/* 720 px je výchozí výška do doby, než dorazí MEASURE od Instagramu; skript
   partu ji pak přepíše inline (a inline styl třídu přebije). */
.vl-rev-ig__frame { width: 100%; height: 720px; border: 0; display: block; }
.vl-rev-ig__frame--profile { height: 620px; }
.vl-rev-ig__writewrap { display: flex; justify-content: center; margin-top: 12px; }
.vl a.vl-rev-ig__write,
.vl a.vl-rev-ig__write:hover { font-size: 14px; color: #5d6b62; text-decoration: underline; text-underline-offset: 4px; }

/* --- Mřížka ohlasů z Facebooku (parts/social-grid.php) ---------------------
   Počet sloupců je parametr partu (dnes jediné volání = 3). Konečná množina
   1–6 má modifikátor, cokoliv mimo ni si part nechá inline — tichý pád na
   výchozí trojici by rozházel layout. */
.vl-rev-sg { max-width: 1440px; margin: 0 auto; padding: 44px 48px 0; display: flex; flex-direction: column; gap: 16px; }
.vl-rev-sg__note { font-size: 13px; line-height: 1.6; color: #5d6b62; text-align: right; white-space: nowrap; }
.vl-rev-sg__grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 18px; }
.vl-rev-sg__grid--c1 { grid-template-columns: repeat(1, minmax(0, 1fr)); }
.vl-rev-sg__grid--c2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.vl-rev-sg__grid--c3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.vl-rev-sg__grid--c4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
.vl-rev-sg__grid--c5 { grid-template-columns: repeat(5, minmax(0, 1fr)); }
.vl-rev-sg__grid--c6 { grid-template-columns: repeat(6, minmax(0, 1fr)); }
.vl-rev-sg__card { background: #ffffff; border: 1px solid #e3e0d4; border-radius: 14px; padding: 14px; display: flex; flex-direction: column; gap: 10px; }
/* Rámeček dlaždice. Poměr stran drží JEN prázdná dlaždice (`--ph`) —
   screenshot komentáře je vysoký sloupec textu a `object-fit:cover` ve 4/3
   by z něj uřízl většinu, proto se obrázek kreslí ve své výšce. */
.vl-rev-sg__box { border-radius: 10px; border: 1px solid #e3e0d4; overflow: hidden; display: flex; align-items: center; justify-content: center; }
.vl-rev-sg__box--ph { background: repeating-linear-gradient(45deg, #e6e5da 0 3px, #f2f1e9 3px 6px); }
.vl-rev-sg__box--r43 { aspect-ratio: 4/3; }
.vl-rev-sg__box--r11 { aspect-ratio: 1/1; }
.vl-rev-sg__box--r34 { aspect-ratio: 3/4; }
.vl-rev-sg__box--r169 { aspect-ratio: 16/9; }
.vl-rev-sg__img { width: 100%; height: auto; display: block; }
.vl-rev-sg__phtext { font-family: ui-monospace, Menlo, monospace; font-size: 11px; color: #7d8a80; }
.vl-rev-sg__cap { font-size: 12px; color: #8a887f; }

/* ===== Tablet 769–1024 =====================================================
   Přepis pravidel `[style*="…"]` z vlasimo-base.css, která na těchhle prvcích
   po migraci nemají na čem viset:
     [style*="max-width:1440px; margin:0 auto"]                → max-width 1024,
     [style*="margin:0; font-size:28px; line-height:1.15; …"]  → nadpis 25 px.
   Odsazení pásů se tu NEPÍŠE: `[style*="max-width:1440px; margin:0 auto;
   padding:44px 48px 0"]` sice dávalo `44px 32px 0`, jenže svislých 44/0
   drží desktopové pravidlo a vodorovných 32 px dodává `.vl-zk-wrap`
   z base.css s `!important`. Totéž u varianty `--band` (48 px svisle). */
@media (min-width: 769px) and (max-width: 1024px) {
	.vl-rev-ig,
	.vl-rev-sg { max-width: 1024px; }
	.vl-rev-sec__title { font-size: 25px; }
}

/* ===== Mobil ≤768 ==========================================================
   Přepis pravidel z mobilního bloku vlasimo-base.css. Scope `.vl-dcontent`
   je záměrný — původní pravidla ho měla taky, takže se part vložený mimo
   obal obsahu chová stejně jako před migrací:
     .vl-dcontent [style*="padding:48px"]      → 28px 20px  (ig-wall --band),
     .vl-dcontent [style*="padding:44px 48px"] → 28px 20px  a hned za ním
     .vl-dcontent [style*="padding:44px 48px 0"] → 28px 20px 0 (vyhrává
        pozdější, takže spodních 0 zůstává; ig-wall --flow a social-grid),
     .vl-dcontent [style*="font-size:28px"]    → nadpis 22 px,
     .vl-dcontent [style*="font-size:46px"]    → číslo hodnocení 32 px.
   Vodorovných 20 px opět z `.vl-zk-wrap`, proto se tu píše jen svislá osa.

   `.vl-zk-social[style*="repeat(3,"] { grid-template-columns: 1fr !important }`
   nahrazuje modifikátor `--c3`: `.vl-zk-social` v base.css sráží mřížku na dva
   sloupce, tříslupcová (Facebook) šla na jeden. `!important` a pořadí za
   base.css jsou obojí potřeba — specificita je stejná (0,1,0). */
@media (max-width: 768px) {
	.vl-dcontent .vl-rev-ig--band { padding-top: 28px; padding-bottom: 28px; }
	.vl-dcontent .vl-rev-ig--flow,
	.vl-dcontent .vl-rev-sg { padding-top: 28px; padding-bottom: 0; }
	.vl-dcontent .vl-rev-sec__title { font-size: 22px; }
	.vl-dcontent .vl-rev-sum__num { font-size: 32px; }
	.vl-rev-sg__grid--c3 { grid-template-columns: 1fr !important; }
}

/* ==== shop-card.css ===================================================== */
/* ===========================================================================
   Dlaždice produktu ve výpisu (parts/shop-card.php) — styly vytažené z markupu.

   Kartu kreslí jen desktopová vrstva výpisu (woocommerce/archive-product.php);
   mobilní řádková karta je jiná komponenta (parts/shop-card-mobile.php).
   Vlastní soubor v assets/css/parts/, protože rám stránky migruje zvlášť
   (assets/css/pages/obchod.css) a obojí by v jednom souboru překáželo.

   Barvy kupónové kampaně ZŮSTÁVAJÍ INLINE (chip a rámeček EXTRA): dává je
   `vlasimo_coupon_box_style()` ve functions.php a sdílí je tři party
   (tahle karta, shop-card-mobile a detail produktu). Rozměry, mezery
   a typografie jsou v třídách, inline zbývá jen `background` / `color` /
   `border` s hodnotou z palety kampaně — přepsat je na modifikátory by
   znamenalo rozdvojit zdroj pravdy do jednotlivých partů.

   Hodnoty jsou z computed stylů živé stránky ve třech šířkách
   (tools/css-snap/w5/obchod@{1440,900,390}.json). Jediné pravidlo, které na
   inline styly karty mířilo, bylo `[style*="font-size:27px; font-weight:600;
   letter-spacing:-.02em"]` (cena 24 px na tabletu) — je dole.

   Migrace: tools/migrate/28-obchod.py
   =========================================================================== */

/* --- Rám karty -------------------------------------------------------------
   Zvýrazněná dlaždice vystupuje z mřížky nahoru (`margin-top:-37px`), má
   silnější zelený rámeček a stín — proto modifikátor, ne druhá sada
   deklarací. Kvůli němu má karta `overflow:hidden`: pruh „nej…" nahoře
   i obrázek se musí zaříznout do zaoblení. */
.vl-shop-card { background: #ffffff; border: 1px solid #e3e0d4; border-radius: 16px; overflow: hidden; display: flex; flex-direction: column; }
.vl-shop-card--hi { margin-top: -37px; border: 2px solid #0b7c3d; box-shadow: 0 8px 24px rgba(11, 124, 61, .10); }
.vl-shop-card__flag { background: #0d8f46; color: #ffffff; font-size: 12.5px; font-weight: 600; letter-spacing: .04em; text-align: center; padding: 8px 12px; }

/* --- Obrázek ---------------------------------------------------------------
   JPEG na bílé (tonikum, hlavní obrázky) dostává bílý podklad až po rámeček,
   průhledný PNG zůstává na krémové — jako okno galerie na PDP (David 6. 9.).
   Rozhoduje přípona souboru, proto modifikátor a ne druhá třída. */
.vl-shop-card__pic { position: relative; height: 280px; background: #fdfcf8; border-bottom: 1px solid #f0ede1; display: flex; align-items: center; justify-content: center; }
.vl-shop-card__pic--white { background: #ffffff; }
.vl-shop-card__piclink { display: flex; align-items: center; justify-content: center; width: 100%; height: 100%; }
/* `img { max-width:100%; height:auto }` z vlasimo.css je (0,0,1), třída ho
   přebije — ale 94 % musí být vypsaných obojí, jinak by se prosadilo 100 %. */
.vl-shop-card__img { max-height: 94%; max-width: 94%; object-fit: contain; display: block; }

/* Chip úspory přes roh obrázku. Bez kampaně tmavý se žlutým textem, s kupónem
   dvouřádkový v barvách kampaně (`--two` = větší písmo a odsazení pro druhý
   řádek s kódem); barvy zůstávají inline, viz hlavička souboru. */
.vl-shop-card__chip { position: absolute; top: 12px; right: 12px; display: flex; flex-direction: column; align-items: center; text-align: center; line-height: 1.35; border: none; font-size: 12px; font-weight: 700; padding: 5px 11px; border-radius: 7px; }
.vl-shop-card__chip--two { font-size: 14px; padding: 6px 12px; }
.vl-shop-card__chipsub { font-size: 11px; font-weight: 400; }

/* --- Tělo karty ------------------------------------------------------------
   `flex:1` drží stejnou výšku všech karet v řádku, `margin-top:auto` na řádku
   ceny tlačí cenu a CTA ke dnu. */
.vl-shop-card__body { padding: 20px; display: flex; flex-direction: column; gap: 14px; flex: 1; }
/* `position:relative` je kotva bubliny se složením (parts/info-tip.php,
   varianta --wide) — karta má overflow:hidden, takže bublina nesmí ven. */
.vl-shop-card__head { position: relative; display: flex; flex-direction: column; gap: 5px; }
.vl-shop-card__name { margin: 0; font-size: 19px; font-weight: 600; color: #16211c; letter-spacing: -.01em; }
/* Odkaz v nadpisu: `.vl a { color:#16211c }` (0,1,1) přebíjí holou třídu
   a `.vl a:hover` by ho na hover přebarvil — inline `color:inherit` to dřív
   držel sám. */
.vl a.vl-shop-card__link,
.vl a.vl-shop-card__link:hover { color: inherit; }
.vl-shop-card__sub { font-size: 13.5px; color: #5d6b62; }

.vl-shop-card__prices { display: flex; align-items: flex-end; gap: 10px; margin-top: auto; }
.vl-shop-card__price { font-size: 27px; font-weight: 600; letter-spacing: -.02em; color: #16211c; line-height: 1; }
.vl-shop-card__price--sale { color: #0d8f46; }
.vl-shop-card__old { font-size: 14px; color: #8a887f; text-decoration: line-through; padding-bottom: 2px; }

/* CTA je `<a>`, proto barva zvlášť přes `.vl a.<třída>` i s `:hover`. */
.vl-shop-card__cta { height: 52px; background: #0d8f46; border-radius: 12px; display: flex; align-items: center; justify-content: center; gap: 10px; font-size: 16px; font-weight: 600; box-shadow: 0 3px 0 #075c2e; }
.vl a.vl-shop-card__cta,
.vl a.vl-shop-card__cta:hover { color: #ffffff; }
.vl-shop-card__arw { font-size: 16px; line-height: 1; font-weight: 400; transform: translateY(-1px); }

/* --- Rámeček EXTRA (jen s běžící kupónovou kampaní) ------------------------
   `background`, `border` a barvy textu zůstávají inline — nese je paleta
   kampaně. Popisek „EXTRA" se pod 1300 px zkracuje na „%" přes `.vl-ex-lg`
   / `.vl-ex-sm` ve vlasimo-base.css (třídy, ne inline — zůstávají tam). */
.vl-shop-card__ex { display: flex; align-items: center; gap: 10px; border-radius: 10px; padding: 9px 13px; }
.vl-shop-card__exbadge { font-size: 10.5px; font-weight: 700; letter-spacing: .08em; padding: 3px 8px; border-radius: 6px; }
.vl-shop-card__extxt { font-size: 13.5px; }
.vl-shop-card__exprice { font-weight: 600; }
.vl-shop-card__excode { font-weight: 700; }
.vl-shop-card__exapply { margin-left: auto; font-size: 13px; font-weight: 500; text-decoration: underline; text-underline-offset: 3px; cursor: pointer; }

/* --- Řádek skladu a dopravy ------------------------------------------------ */
.vl-shop-card__stock { display: flex; align-items: center; gap: 7px; font-size: 12.5px; color: #5d6b62; }
.vl-shop-card__dot { width: 7px; height: 7px; border-radius: 50%; background: #0b7c3d; }
.vl-shop-card__stockb { font-weight: 600; color: #16211c; white-space: nowrap; }
.vl-shop-card__free { display: inline-flex; align-items: center; gap: 5px; color: #0b7c3d; font-weight: 600; }
.vl-shop-card__chk { display: block; }
.vl-shop-card__ship { white-space: nowrap; }

/* ===== Tablet 769–1024 =====================================================
   Přesun z vlasimo-base.css (`[style*="font-size:27px; font-weight:600;
   letter-spacing:-.02em"]`). Na 390 px pravidlo neplatilo, proto jen tablet.
   Ostatní rozměry karty se na tabletu nemění — mřížka se zužuje, karta ne. */
@media (min-width: 769px) and (max-width: 1024px) {
	.vl-shop-card__price { font-size: 24px; }
}

/* ==== shop-mobile.css =================================================== */
/* ===========================================================================
   shop-mobile.css — pět RUČNÍCH mobilních partů (build-mobile.py je
   negeneruje, ověřeno v jeho zdroji: zapisuje jen header-mobile, home-mobile
   a footer-mobile):

     parts/shop-mobile.php        mobilní výpis /objednavka/   .vl-shopm-*
     parts/shop-card-mobile.php   řádková karta výpisu         .vl-shopm-card*
     parts/cert-tiles-mobile.php  mobilní vrstva certifikací   .vl-certs-m*
     parts/promo-bar-mobile.php   kampaňový pruh nad hlavičkou .vl-promo-m*
     parts/mmenu-promo.php        banner akce v mobilním menu  .vl-mmpromo*

   Vznik: tools/migrate/31-shop-mobile.py (130 inline stylů → třídy).

   Načítání: inc/assets.php → konstanta VLASIMO_PART_CSS (výslovný seznam, ne
   glob; doplňuje ho hlavní session). Pořadí vlasimo.css → vlasimo-legacy.css
   → vlasimo-base.css → vlasimo-ui.css → parts/*.css, takže `!important` tu
   není potřeba nikde.

   ŽÁDNÉ MEDIA QUERIES — a je to schválně. Markup je celý v `.vl-mobile`
   (resp. v mobilní hlavičce), takže je sám o sobě mobilní vrstvou; hodnoty
   z návrhu platí ve všech třech šířkách přesně tak, jak platily jako inline
   styl. `tools/css-rules-for.py` na těchhle pěti souborech nenašel ANI JEDNO
   živé pravidlo `[style*="…"]` — všech 21 nálezů potřebuje předka, který nad
   partem není (`.vl-sechead`, `.vl-dcontent`, `.vl-wrap`, `[data-vl-modal]`,
   `.woocommerce-account`, `#cpp-modal`). Ověřeno i CDP výpisem všech
   navázaných pravidel na každém prvku se `style=` ve 390 / 900 / 1440 px.

   Co ZŮSTÁVÁ ve vlasimo-base.css (třídy, ne inline styly — migrace se jich
   netýká a `!important` v nich je po migraci nutný, protože parts/*.css se
   načítá později):
     `.vl-mtabs`, `.vl-mtabs__scroll`, `.vl-mtabs a`, `.vl-mtabs > button`
     (plynulé zmenšování lišty tabů clamp()em),
     `.vl-vch-scale { zoom: .58 }`,
     `.vl-certs-m.vl-certs-m--3 > :last-child { grid-column: 1 / -1 }`.

   Co ZŮSTÁVÁ inline (a proč) — viz hlavička migračního skriptu:
     barvy kupónové kampaně na kartě (`vlasimo_coupon_box_style()`) a záložní
     `style` obalu certifikací pro neznámou hodnotu `$args['wrap']`.
   =========================================================================== */

/* ===========================================================================
   1) parts/shop-mobile.php — rám mobilního výpisu
   =========================================================================== */

/* --- Drobečková navigace ---------------------------------------------------
   Odkaz „Domů" má `color:inherit`, tedy #8a887f z obalu — a měl ho i na
   hover, protože inline styl přebíjel `.vl a:hover`. Proto obě varianty
   selektoru `.vl a.…` (README: třída sama by prohrála s `.vl a`). */
.vl-shopm-crumb { padding: 20px 20px 0; font-size: 12px; color: #8a887f; }
.vl a.vl-shopm-crumb__home,
.vl a.vl-shopm-crumb__home:hover { color: inherit; display: inline-flex; vertical-align: -2px; }
.vl-shopm-crumb__sep { margin: 0 4px; }
.vl-shopm-crumb__cur { color: #16211c; font-weight: 500; }

/* --- Hlavička výpisu ------------------------------------------------------- */
.vl-shopm-head { padding: 16px 20px 0; }
.vl-shopm-head__title { margin: 0; font-size: 28px; line-height: 1.18; font-weight: 600; letter-spacing: -.02em; color: #16211c; }
/* `.vl p { text-align: justify }` (0,1,1) je specifičtější než holá třída —
   proto s `.vl`, i když je hodnota stejná. */
.vl .vl-shopm-head__lead { margin: 10px 0 0; font-size: 14px; line-height: 1.6; color: #3d443e; text-align: justify; }

/* Řádek s hvězdičkami. Odkaz na Zkušenosti dědí barvu řádku (#5d6b62) i na
   hover — stejný případ jako drobečky. */
.vl-shopm-rate { display: flex; align-items: center; gap: 10px; margin-top: 10px; font-size: 12.5px; color: #5d6b62; }
.vl a.vl-shopm-rate__link,
.vl a.vl-shopm-rate__link:hover { text-decoration: underline; text-underline-offset: 3px; color: inherit; }
.vl-shopm-rate__dot { color: #d5d2c6; }

/* Zvýrazněné číslo v textu (hodnocení, úspora, procenta). Dvě zápisové
   podoby téhož (`font-weight` napřed × barva napřed) = jedna třída. */
.vl-shopm-b { font-weight: 600; color: #16211c; }

/* --- Lišta tabů -----------------------------------------------------------
   Třídy `.vl-mtabs` / `.vl-mtabs__scroll` v markupu ZŮSTÁVAJÍ: visí na nich
   pravidla ve vlasimo-base.css, která lištu plynule zmenšují (clamp) a
   `!important`em přebíjejí gap i vodorovné odsazení. Tady je zbytek. */
/* `top` počítá s lepivou hlavičkou (od 11. 9.): `--hm-hdr` publikuje skript
   podle skutečně viditelné části hlavičky, takže při jejím schování spadne na
   nulu a pás vyjede nahoru. Bez toho se pás schová za hlavičku — přesně to se
   děje na Herbasu, odkud je vzor. */
.vl-shopm-tabs { position: sticky; top: var(--hm-hdr, 0px); z-index: 30; background: #fdfcf8; padding: 10px 20px 0; margin-top: 16px; border-bottom: 1px solid #e3e0d4; display: flex; align-items: stretch; gap: 16px; }
.vl-shopm-tabs__scroll { flex: 1 1 min-content; min-width: 0; display: flex; align-items: center; gap: 22px; overflow-x: auto; overflow-y: hidden; }

.vl-shopm-tab { padding: 0 2px 12px; font-size: 14px; font-weight: 500; border-bottom: 2.5px solid transparent; margin-bottom: -1px; white-space: nowrap; }
.vl-shopm-tab--bal { display: inline-flex; align-items: center; gap: 7px; }
/* Aktivní tab musí stát AŽ ZA základní třídou — obě jsou `.vl a.…` (0,2,1)
   a při shodě rozhoduje pořadí. */
.vl a.vl-shopm-tab,
.vl a.vl-shopm-tab:hover { color: #5d6b62; }
.vl-shopm-tab--on { font-weight: 600; border-bottom-color: #0d8f46; }
.vl a.vl-shopm-tab--on,
.vl a.vl-shopm-tab--on:hover { color: #16211c; }
.vl-shopm-tab__tip { background: #ffd21f; color: #16211c; font-size: 10px; font-weight: 700; letter-spacing: .06em; border-radius: 999px; padding: 2px 8px; }

/* Odkaz na průvodce v liště. `button { font-family: inherit; cursor: pointer }`
   z vlasimo.css je jen (0,0,1), takže obě vlastnosti patří sem. */
.vl-shopm-guide { flex: none; align-self: stretch; display: inline-flex; align-items: center; gap: 6px; padding: 0 0 12px; background: none; border: 0; font-family: inherit; font-size: 12.5px; font-weight: 500; color: #0b7c3d; white-space: nowrap; cursor: pointer; }
.vl-shopm-guide__u { text-decoration: underline; text-underline-offset: 3px; }

/* Ikony z návrhu: `display:block` (a `flex:none` tam, kde nesmí povolit
   zmenšení ve flexu). */
.vl-shopm-ico { display: block; }
.vl-shopm-ico--fixed { flex: none; }

/* --- Hlavičky sekcí (kúra / kosmetika) ------------------------------------
   `scroll-margin-top` musí být na třídě, i když `[id] { scroll-margin-top:
   150px }` má stejnou specificitu — vlasimo.css se načítá dřív, takže při
   shodě vyhraje tenhle soubor. */
.vl-shopm-sec { scroll-margin-top: 48px; padding: 24px 20px 0; display: flex; flex-direction: column; gap: 6px; }
.vl-shopm-sec--gap { padding-top: 28px; }
.vl-shopm-sec__title { margin: 0; font-size: 20px; font-weight: 600; letter-spacing: -.015em; color: #16211c; }
.vl-shopm-sec__note { font-size: 12.5px; color: #5d6b62; }
.vl-shopm-list { padding: 14px 20px 0; display: flex; flex-direction: column; gap: 12px; }
.vl-shopm-fine { margin: 12px 20px 0; font-size: 11.5px; color: #8a887f; line-height: 1.55; }

/* Nadpis sekcí bez vlastní hlavičky (poukazy, ohlasy). */
.vl-shopm-h2 { margin: 0; font-size: 20px; line-height: 1.25; font-weight: 600; letter-spacing: -.015em; color: #16211c; }
/* Tečka mezi štítky v návěští (poukazy, balíčky). */
.vl-shopm-dot { width: 4px; height: 4px; border-radius: 50%; background: #c99a12; }

/* --- Box průvodce výběrem -------------------------------------------------- */
.vl-shopm-quiz { margin: 20px 20px 0; display: flex; align-items: center; gap: 12px; background: #e4eee6; border: 1px solid #c6dbcb; border-radius: 14px; padding: 14px 16px; }
.vl-shopm-quiz__col { flex: 1; min-width: 0; display: flex; flex-direction: column; align-items: flex-start; gap: 4px; }
.vl-shopm-quiz__time { background: #0d8f46; color: #ffffff; font-size: 10px; font-weight: 700; letter-spacing: .04em; padding: 3px 9px; border-radius: 999px; white-space: nowrap; }
.vl-shopm-quiz__title { font-size: 13.5px; font-weight: 600; color: #16211c; }
.vl-shopm-quiz__text { font-size: 12.5px; line-height: 1.55; color: #3d443e; }

/* --- Tmavá karta „Jakou kombinaci zvolit" + poradna ------------------------
   Pruh 75/25 % a legenda pod ním (na 390 px se popisky do pruhu nevejdou,
   viz komentář v partu). Procenta jsou pevná, ne dopočítaná. */
.vl-shopm-mix { margin: 24px 20px 0; background: #1f4d3a; border-radius: 16px; overflow: hidden; }
.vl-shopm-mix__in { padding: 22px 18px; display: flex; flex-direction: column; gap: 12px; }
.vl-shopm-mix__title { font-size: 17px; line-height: 1.3; font-weight: 600; letter-spacing: -.01em; color: #ffffff; }
/* `text-align` schválně nenastavuje — odstavec ho dostává z `.vl p`
   (justify), stejně jako před migrací. */
.vl-shopm-mix__text { margin: 0; font-size: 13px; line-height: 1.65; color: #c8d4cb; }
.vl-shopm-mix__bar { display: flex; height: 38px; border-radius: 10px; overflow: hidden; margin-top: 2px; }
.vl-shopm-mix__a { width: 75%; background: #0d8f46; display: flex; align-items: center; padding: 0 12px; font-size: 15px; font-weight: 600; letter-spacing: -.01em; color: #ffffff; }
.vl-shopm-mix__b { width: 25%; background: #ffd21f; display: flex; align-items: center; justify-content: flex-end; padding: 0 12px; font-size: 15px; font-weight: 600; letter-spacing: -.01em; color: #16211c; }
.vl-shopm-mix__legend { display: flex; gap: 14px; }
.vl-shopm-mix__leg { font-size: 11.5px; line-height: 1.35; color: #8fa396; }
.vl-shopm-mix__leg--a { width: 75%; }
.vl-shopm-mix__leg--b { width: 25%; }
.vl-shopm-mix__legh { display: block; font-weight: 600; color: #ffffff; }
.vl-shopm-mix__legh--y { color: #ffd21f; }
.vl-shopm-mix__note { font-size: 11.5px; line-height: 1.55; color: #8fa396; }

.vl-shopm-help { border-top: 1px solid rgba(255, 255, 255, .14); background: rgba(255, 255, 255, .05); padding: 20px 18px; display: flex; flex-direction: column; gap: 12px; }
.vl-shopm-help__head { display: flex; align-items: center; gap: 12px; }
.vl-shopm-help__ico { width: 40px; height: 40px; min-width: 40px; border-radius: 50%; background: #ffd21f; display: flex; align-items: center; justify-content: center; }
.vl-shopm-help__col { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
.vl-shopm-help__title { font-size: 14px; font-weight: 600; color: #ffffff; }
.vl-shopm-help__note { font-size: 11.5px; line-height: 1.4; color: #8fa396; }
/* Telefon: dosud ho barvil inline styl. Třída navíc ruší shodu se selektorem
   `a[href^="tel:"]:not([class])` z vlasimo.css — ten ale dával jen
   `color: inherit` a `text-decoration: none`, oboje inline styl přebíjel
   a `text-decoration` dál drží `.vl a`. */
.vl a.vl-shopm-help__phone,
.vl a.vl-shopm-help__phone:hover { font-size: 24px; font-weight: 600; letter-spacing: -.01em; color: #ffd21f; }
.vl-shopm-help__hours { display: flex; align-items: center; gap: 8px; font-size: 12px; line-height: 1.4; color: #c8d4cb; }

/* --- Balíčková sekce (jen při běžící akci) --------------------------------- */
.vl-shopm-bal { scroll-margin-top: 48px; background: #1f4d3a; border-top: 1px solid #16382b; margin-top: 28px; padding: 26px 20px 28px; }
.vl-shopm-bal__kicker { display: flex; align-items: center; gap: 10px; font-size: 11px; font-weight: 600; letter-spacing: .14em; text-transform: uppercase; color: #ffd21f; }
.vl-shopm-bal__title { margin: 10px 0 0; font-size: 20px; font-weight: 600; letter-spacing: -.015em; color: #ffffff; }
.vl-shopm-bal__sub { margin-top: 4px; font-size: 12.5px; color: #a9bdb0; }
.vl-shopm-bal__until { margin-top: 2px; font-size: 12px; color: #a9bdb0; }
.vl-shopm-bal__list { margin-top: 18px; display: flex; flex-direction: column; gap: 12px; }
.vl-shopm-bal__note { margin-top: 12px; font-size: 11.5px; color: #a9bdb0; line-height: 1.55; }

/* --- Dárkové poukazy ------------------------------------------------------- */
.vl-shopm-gc { padding: 30px 20px 0; display: flex; flex-direction: column; gap: 12px; }
.vl-shopm-gc__kicker { display: flex; align-items: center; gap: 10px; font-size: 10.5px; font-weight: 600; letter-spacing: .14em; text-transform: uppercase; color: #0b7c3d; }
.vl .vl-shopm-gc__text { margin: 0; font-size: 13px; line-height: 1.65; color: #3d443e; text-align: justify; }
.vl-shopm-gc__chips { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-top: 2px; }

/* Dlaždice částky: `--btn` je klikací chip, bez modifikátoru odkaz „Vlastní…".
   Vybranou hodnotu drží `.is-active`, kterou přepíná assets/js/vlasimo-cart.js
   — a hned za to zapisuje tytéž tři vlastnosti inline, takže se stavy nemohou
   rozejít (stejný vzor jako `.vl-shop-vch` na desktopu). */
.vl-shopm-vch { border: 1px solid #d5d2c6; background: #ffffff; border-radius: 10px; padding: 8px 14px; font-size: 13px; font-weight: 600; color: #16211c; }
.vl-shopm-vch--btn { cursor: pointer; }
.vl-shopm-vch.is-active { border: 2px solid #0d8f46; background: #e4eee6; color: #0b7c3d; }
.vl a.vl-shopm-vch,
.vl a.vl-shopm-vch:hover { color: #16211c; }

.vl-shopm-gc__btn { margin-top: 4px; height: 48px; background: #0d8f46; color: #ffffff; border-radius: 12px; display: flex; align-items: center; justify-content: center; gap: 10px; font-size: 14px; font-weight: 600; box-shadow: 0 3px 0 #075c2e; cursor: pointer; }
.vl-shopm-gc__arrow { font-size: 14px; line-height: 1; }
.vl-shopm-gc__note { font-size: 11.5px; line-height: 1.5; color: #5d6b62; }
/* Kartička poukazu se zmenšuje `zoom`em v `.vl-vch-scale` (vlasimo-base.css);
   tahle třída nese jen odsazení. */
.vl-shopm-gc__card { margin-top: 6px; }

/* --- Ohlasy ---------------------------------------------------------------- */
.vl-shopm-rev { padding: 30px 20px 0; display: flex; flex-direction: column; gap: 6px; }
.vl-shopm-rev__kicker { font-size: 10.5px; font-weight: 600; letter-spacing: .14em; text-transform: uppercase; color: #0b7c3d; }
/* Spodní odsazení 28 px: bez odkazu „Přečíst další zkušenosti" (3. 9.) by
   poslední karta seděla přímo na pruhu certifikací. */
.vl-shopm-rev__list { padding: 14px 20px 28px; display: flex; flex-direction: column; gap: 12px; }

/* ===========================================================================
   2) parts/shop-card-mobile.php — řádková karta
   =========================================================================== */

/* Rám: běžná × zvýrazněná karta; `--hl-y` je jen jiná barva rámečku
   (balíčková sekce). Stín zůstává zeleně tónovaný i u žluté varianty —
   tak to bylo v inline stylu. */
.vl-shopm-card { position: relative; border: 1px solid #e3e0d4; background: #ffffff; border-radius: 16px; padding: 14px 16px; }
.vl-shopm-card--hl { border: 2px solid #0d8f46; padding: 20px 16px 14px; box-shadow: 0 10px 26px rgba(13, 143, 70, .14); margin-top: 8px; }
.vl-shopm-card--hl-y { border-color: #ffd21f; }

.vl-shopm-card__badge { position: absolute; top: -12px; left: 14px; background: #0d8f46; color: #ffffff; font-size: 10px; font-weight: 700; letter-spacing: .06em; padding: 4px 11px; border-radius: 999px; }
.vl-shopm-card__badge--y { background: #ffd21f; color: #16211c; }

.vl-shopm-card__row { display: flex; align-items: center; gap: 14px; }
/* Levý sloupec je 74 px; slevový štítek je o 12 px širší a přesah řeší
   záporný margin, aby sloupec nerostl a „poštovné zdarma" se nezalomilo. */
.vl-shopm-card__left { display: flex; flex-direction: column; align-items: center; gap: 8px; min-width: 74px; }
/* `overflow: hidden` kvůli ořezu obrázků kúr níž — nic jiného z rámečku
   nevyčnívá, takže je bezpečné ho dát na obal. */
.vl-shopm-card__imgw { width: 74px; height: 88px; display: flex; align-items: center; justify-content: center; overflow: hidden; }
.vl-shopm-card__imgw--hl { height: 96px; }
.vl-shopm-card__img { max-width: 100%; max-height: 100%; object-fit: contain; display: block; }
/* Barevná korekce obrázku z mobilního návrhu (kondicionér). Konečná množina,
   proto modifikátor — hodnotu posílá shop-mobile.php jako `img_mod`. */
.vl-shopm-card__img--hue { filter: hue-rotate(4deg) saturate(1.12) brightness(1.02); }

/* --- Ořez prázdna u dlaždic kúr (David 11. 9., JEN mobil) -------------------
   Zdrojové PNG mají kolem krabiček široký prázdný okraj, takže se do rámečku
   74×88 vešel produkt jen na 74×42. Ořez se dělá zvětšením a posunem uvnitř
   `overflow: hidden` obalu, ne novým souborem: obrázky jedou s roční cache
   a výměna pod stejným jménem by starým návštěvníkům nic nezměnila, nové
   jméno by znamenalo i zásah do defaultů Customizeru a `tools/i18n/sk.py`.

   **Zvětšení je pro celou sérii stejné, ne per obrázek** — v tom je ta past.
   Změřený obsah: 1M 180 px široký, 2M 234, 3M 285 (všechny 352×200). Ořezat
   každý na jeho vlastní obsah by 1měsíční krabičku zvětšilo proti 3měsíční
   1,58×, a přesně to David nechtěl („1měsíční kúra nesmí působit větší než
   2měsíční"). Společné okno = obsah nejširšího z trojice, tedy 3M: vlevo 32,
   vpravo 35, nahoře 21, dole 11 px z 352×200 → zvětšení 352/285 = 1,235.
   Krabičky tím zůstanou navzájem stejné, jen se ubere prázdno.

   Série 4–6 měsíců je jiná fotka (295×200) a David u ní řekl „vyplňme maximum“:
   společné okno je zase obsah nejširšího (6M), vlevo i vpravo 5, nahoře 12,
   dole 43 px → zvětšení 295/285 = 1,035; hlavní zisk je svislý, zdola mizí
   43 px prázdna. */
/* `max-height: none`: `.vl-shopm-card__img` má `max-height: 100%`, takže
   stažení rámečku níž by fotku zmenšilo místo aby ji odkrylo (4měsíční kúra
   spadla z 26 na 16 px obsahu). U kúr tedy o velikosti rozhoduje jen šířka
   a rámeček slouží čistě jako ořezové okno. */
.vl-shopm-card__img--kura3,
.vl-shopm-card__img--kura6 { max-height: none; }
.vl-shopm-card__img--kura3 { transform: translateY(-2.5%) scale(1.235); }
.vl-shopm-card__img--kura6 { transform: translateY(-1.8%) scale(1.035); }

/* Rámeček obrázku se u kúr stahuje k výšce oříznuté fotky (David 11. 9.:
   „proč je tak velká mezera k labelu −311 Kč?"). Chip „ušetříte" visí 8 px pod
   RÁMEČKEM, ne pod obrázkem, a rámeček je 88 px kvůli čtvercovým fotkám
   kosmetiky — široká fotka kúry v něm zabrala 52 px vycentrovaných, takže pod
   ní zbývalo 18 px prázdna. Výška musí zůstat o kus větší než vlastní obrázek:
   `transform: scale()` layoutovou výšku nemění, takže zvětšená fotka z rámečku
   vyčnívá a `overflow: hidden` by ji jinak uřízl. */
.vl-shopm-card__imgw--kura3 { height: 46px; }
.vl-shopm-card__imgw--kura6 { height: 30px; }


/* Štítek s úsporou je od obrázku o 10 px dál (David 11. 9.) — `.vl-shopm-card__left`
   má `gap: 8px`, tohle je nad rámec toho. Zkoušelo se ho zarovnat na účaří ceny
   v prostředním sloupci (levý sloupec roztažený, štítek `absolute` ukotvený
   zespoda); sedělo to na 0 px u všech čtyř karet, ale David to zavrhl — držet
   se obrázku je čitelnější a nestojí to na měřené konstantě, která se s každou
   změnou bloku ceny tiše rozejde. */
.vl-shopm-card__imgw--kura3 ~ .vl-shopm-card__save,
.vl-shopm-card__imgw--kura6 ~ .vl-shopm-card__save { margin-top: 10px; }

/* Žlutý štítek úspory pod obrázkem (mimo kampaň). */
.vl-shopm-card__save { background: #fdf3c8; color: #8a6a00; font-size: 10.5px; font-weight: 600; padding: 2px 7px; border-radius: 6px; white-space: nowrap; }
/* Dvouřádkový chip v kampani: rozměry a typografie tady, `background`
   a `color` zůstávají inline (paleta z `vlasimo_coupon_box_style()`). */
.vl-shopm-card__chip { display: flex; flex-direction: column; align-items: center; text-align: center; line-height: 1.3; width: 86px; margin: 0 -6px; box-sizing: border-box; font-size: 10px; font-weight: 700; padding: 4px 5px; border-radius: 6px; }
.vl-shopm-card__chipsub { font-size: 8px; font-weight: 400; }

.vl-shopm-card__body { flex: 1; min-width: 0; }
.vl-shopm-card__title { display: block; font-size: 15px; line-height: 1.25; font-weight: 600; color: #16211c; }
.vl a.vl-shopm-card__tlink,
.vl a.vl-shopm-card__tlink:hover { color: inherit; }
.vl-shopm-card__sub { font-size: 12px; line-height: 1.4; color: #5d6b62; margin-top: 3px; }
.vl-shopm-card__free { display: flex; align-items: center; gap: 6px; margin-top: 2px; font-size: 11.5px; font-weight: 600; color: #0b7c3d; }
.vl-shopm-card__ship { font-size: 11.5px; color: #8a887f; margin-top: 2px; }
.vl-shopm-card__prices { display: flex; align-items: baseline; gap: 8px; margin-top: 6px; flex-wrap: wrap; }
.vl-shopm-card__price { font-size: 18px; font-weight: 600; color: #16211c; white-space: nowrap; }
.vl-shopm-card__old { font-size: 11.5px; color: #8a887f; text-decoration: line-through; white-space: nowrap; }
/* Zelené CTA jako `<a>`: bílý text musí být psaný `.vl a.…`, jinak ho
   přebije `.vl a { color: #16211c }` (a na hover `.vl a:hover`). */
.vl a.vl-shopm-card__add,
.vl a.vl-shopm-card__add:hover { height: 36px; padding: 0 14px; border-radius: 11px; background: #0d8f46; color: #ffffff; display: flex; align-items: center; justify-content: center; font-size: 13px; font-weight: 600; box-shadow: 0 3px 0 #075c2e; white-space: nowrap; }

/* Rámeček EXTRA s kupónovou cenou. `background`, `border` a barvy textu
   zůstávají inline — nese je paleta kampaně (viz hlavička souboru). */
.vl-shopm-card__ex { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; row-gap: 4px; margin-top: 12px; border-radius: 8px; padding: 5px 9px; }
.vl-shopm-card__exbadge { font-size: 9px; font-weight: 700; letter-spacing: .08em; padding: 2px 6px; border-radius: 5px; }
.vl-shopm-card__extxt { font-size: 11.5px; }
.vl-shopm-card__exprice { font-weight: 600; }
.vl-shopm-card__exapply { margin-left: auto; font-size: 11px; font-weight: 500; text-decoration: underline; text-underline-offset: 2px; cursor: pointer; white-space: nowrap; }

/* ===========================================================================
   3) parts/cert-tiles-mobile.php — mobilní vrstva certifikací

   Pojmenování drží linii desktopového pásu (assets/css/parts/certs.css,
   `.vl-certs*`): mobilní varianta = `.vl-certs-m*`. Třída `.vl-certs-m`
   a počtový modifikátor `.vl-certs-m--N` v markupu ZŮSTÁVAJÍ — na trojici
   (SK bez dlaždice MZe) míří pravidlo ve vlasimo-base.css.
   =========================================================================== */

/* Obal: pás s podkladem. Výchozí volání (Složení) má navíc odstup shora,
   volání z HP a výpisu pruh lepí přímo na předchozí sekci. */
.vl-certs-mband { background: #f6f5ef; border-top: 1px solid #e3e0d4; border-bottom: 1px solid #e3e0d4; padding: 26px 20px; }
.vl-certs-mband--gap { margin-top: 28px; }

.vl-certs-m__head { display: flex; flex-direction: column; gap: 8px; }
.vl-certs-m__kicker { font-size: 10.5px; font-weight: 600; letter-spacing: .14em; text-transform: uppercase; color: #0b7c3d; }
.vl-certs-m__title { margin: 0; font-size: 20px; line-height: 1.25; font-weight: 600; letter-spacing: -.015em; color: #16211c; }
.vl-certs-m__lead { font-size: 12.5px; line-height: 1.5; color: #5d6b62; }

.vl-certs-m { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-top: 16px; }
.vl-certs-m__card { background: #fdfcf8; border: 1px solid #e3e0d4; border-radius: 14px; padding: 14px 12px; display: flex; flex-direction: column; gap: 9px; }
/* Logo vždy 72 px vysoké a na střed (Davidovo pravidlo 3. 9. — stejně jako
   `.vl-certs__logo` na desktopu). `img { height: auto }` z vlasimo.css je
   jen (0,0,0,1), takže výšku drží tahle třída. */
.vl-certs-m__logo { height: 72px; width: auto; max-width: 100%; object-fit: contain; object-position: center; display: block; }
/* Kolečko se zkratkou = fallback bez loga (dnes se nikde nekreslí, všechny
   CS i SK certifikace logo mají). Písmo se zmenšuje podle délky zkratky —
   konečná trojice hodnot, proto modifikátory místo dopočtu v PHP. */
.vl-certs-m__abbr { width: 40px; height: 40px; border-radius: 50%; background: #e4eee6; border: 1px solid #c6dbcb; display: flex; align-items: center; justify-content: center; font-weight: 700; color: #0b7c3d; }
.vl-certs-m__abbr--115 { font-size: 11.5px; }
.vl-certs-m__abbr--105 { font-size: 10.5px; }
.vl-certs-m__abbr--95 { font-size: 9.5px; }
.vl-certs-m__body { display: flex; flex-direction: column; gap: 3px; }
.vl-certs-m__name { font-size: 12.5px; line-height: 1.3; font-weight: 600; color: #16211c; }
.vl-certs-m__desc { font-size: 11.5px; line-height: 1.45; color: #5d6b62; }

/* ===========================================================================
   4) parts/promo-bar-mobile.php — kampaňový pruh nad mobilní hlavičkou

   Barvy podle „Barevného stylu" kampaně. Modifikátor se odvozuje ze STEJNÉHO
   klíče, ze kterého bere barvy `vlasimo_promo_palette()` (green / amber /
   dark / forest), ne z hodnot — zdroj pravdy se tím nerozdvojuje, jen se
   paleta píše ve dvou jazycích. Stejný vzor jako desktopové
   `.vl-promo--*` v assets/css/parts/promo-bar.css.

   POZOR: pruh se kreslí jen s běžící kampaní, takže ho tools/css-snap
   nezachytil — hodnoty jsou ověřené lokální replikou ve všech čtyřech
   stylech (viz hlavička tools/migrate/31-shop-mobile.py).
   =========================================================================== */
.vl-promo-m { display: flex; align-items: center; justify-content: center; gap: 6px; min-height: 34px; padding: 6px 16px; font-size: 12.5px; font-weight: 500; text-align: center; line-height: 1.35; }
.vl-promo-m--green { background: #0d8f46; }
.vl-promo-m--amber { background: #fdf3c8; }
.vl-promo-m--dark { background: #16211c; }
.vl-promo-m--forest { background: #1f4d3a; }
/* Barva textu na `<a>` musí být `.vl a.…` — `.vl a { color: #16211c }` má
   vyšší specificitu než třída, a `:hover` varianta drží stav beze změny
   (inline styl `.vl a:hover` dřív přebíjel). */
.vl a.vl-promo-m--green,
.vl a.vl-promo-m--green:hover { color: #ffffff; }
.vl a.vl-promo-m--amber,
.vl a.vl-promo-m--amber:hover { color: #16211c; }
.vl a.vl-promo-m--dark,
.vl a.vl-promo-m--dark:hover { color: #ffffff; }
.vl a.vl-promo-m--forest,
.vl a.vl-promo-m--forest:hover { color: #fdfcf8; }

.vl-promo-m__until { font-weight: 400; }
.vl-promo-m--green .vl-promo-m__until { color: rgba(255, 255, 255, .75); }
.vl-promo-m--amber .vl-promo-m__until { color: #8a6a00; }
.vl-promo-m--dark .vl-promo-m__until { color: #9fb0a4; }
.vl-promo-m--forest .vl-promo-m__until { color: #a9bdb0; }

/* ===========================================================================
   5) parts/mmenu-promo.php — banner běžící akce v mobilním menu

   Táž paleta jako pruh výš. Štítek „AKCE" je na zelené/tmavé žlutý, na žluté
   (amber) obráceně — jinak by splynul.
   =========================================================================== */
.vl-mmpromo { border-radius: 14px; padding: 14px 16px; display: flex; align-items: center; gap: 12px; }
.vl-mmpromo--green { background: #0d8f46; }
.vl-mmpromo--amber { background: #fdf3c8; }
.vl-mmpromo--dark { background: #16211c; }
.vl-mmpromo--forest { background: #1f4d3a; }
.vl a.vl-mmpromo--green,
.vl a.vl-mmpromo--green:hover { color: #ffffff; }
.vl a.vl-mmpromo--amber,
.vl a.vl-mmpromo--amber:hover { color: #16211c; }
.vl a.vl-mmpromo--dark,
.vl a.vl-mmpromo--dark:hover { color: #ffffff; }
.vl a.vl-mmpromo--forest,
.vl a.vl-mmpromo--forest:hover { color: #fdfcf8; }

.vl-mmpromo__badge { background: #ffd21f; color: #16211c; font-size: 10.5px; font-weight: 700; letter-spacing: .06em; text-transform: uppercase; padding: 4px 9px; border-radius: 999px; flex: none; }
.vl-mmpromo--amber .vl-mmpromo__badge { background: #16211c; color: #ffd21f; }

.vl-mmpromo__text { flex: 1; font-size: 13.5px; line-height: 1.45; }
.vl-mmpromo--green .vl-mmpromo__text { color: #ffffff; }
.vl-mmpromo--amber .vl-mmpromo__text { color: #16211c; }
.vl-mmpromo--dark .vl-mmpromo__text { color: #ffffff; }
.vl-mmpromo--forest .vl-mmpromo__text { color: #fdfcf8; }

.vl-mmpromo__until { font-weight: 400; }
.vl-mmpromo--green .vl-mmpromo__until { color: rgba(255, 255, 255, .75); }
.vl-mmpromo--amber .vl-mmpromo__until { color: #8a6a00; }
.vl-mmpromo--dark .vl-mmpromo__until { color: #9fb0a4; }
.vl-mmpromo--forest .vl-mmpromo__until { color: #a9bdb0; }

.vl-mmpromo__arrow { flex: none; }

/* ==== story.css ========================================================= */
/* ===========================================================================
   story.css — příběh proměny Zdeňky W.: tři party jedné komponenty.

     parts/story.php        obsah příběhu (nadpis, citace, fotky, CTA)
     parts/story-card.php   miniatura, která příběh otevírá
     parts/story-modal.php  pop-up, do kterého se parts/story.php vkládá

   Kreslí je HP (modal), Složení (karta v hero + modal), detail kúry
   (karta v desktopové i mobilní vrstvě + modal) a Zkušenosti zákazníků
   (parts/story.php přímo v pásu `.vl-zk-story`, bez modalu). Proto jeden
   soubor v assets/css/parts/ — načítá se na každé stránce (inc/assets.php,
   závislost `vlasimo-ui`), tedy za vlasimo.css → vlasimo-base.css →
   vlasimo-ui.css a před pages/<slug>.css.

   Vznik: tools/migrate/22-story.py vytáhl 47 inline stylů (36 + 8 + 3) do
   tříd `.vl-story-*`. Hodnoty jsou ověřené proti snímkům computed stylů
   tools/css-snap/base (hp, slozeni, pdp-kura-3m, zkusenosti × 1440/900/390),
   ne odvozené ze čtení kaskády.

   DVĚ VARIANTY OBSAHU (`.vl-story--modal` / `.vl-story--page`)
   Na desktopu i tabletu se liší jen odsazením a mezerou obalu; pod 768 px
   se rozcházejí podstatně, protože modal je přes celé okno, kdežto pás na
   Zkušenostech sedí v `.vl-dcontent`:

                       modal ≤768        stránka ≤768
     obal              20px 14px         22px 16px
     nadpis            30px              22px
     odstavce          text-align:left   text-align:justify
     mřížka fotek      3 sloupce         1 sloupec
     karta citace      22px 16px 18px    22px 16px
     patička           sloupec, CTA 100% řádek jako na desktopu

   KONKURENCE, SE KTEROU TŘÍDY POČÍTAJÍ
   - `.vl p { text-align: justify }` (0,1,1) ve vlasimo-base.css — proto se
     odstavce příběhu píšou `.vl-story .vl-story__text` (0,2,0). Perex
     (`.vl-story__lead`) text-align ZÁMĚRNĚ nenastavuje: inline styl ho
     nikdy nenastavoval a justify mu dává právě tohle pravidlo, i na mobilu.
   - `.vl a { color:#16211c; text-decoration:none }` a `.vl a:hover
     { color:#0b7c3d }` (0,1,1) — zelené CTA je `<a>`, takže `.vl a.vl-story__cta`
     včetně `:hover` (inline styl hover přebíjel, holá třída ne).
   - `img { max-width:100%; height:auto }` (0,0,1) ve vlasimo.css — avatar
     a miniatury karty proto nastavují `height` samy.
   - `h1, h2, h3 { margin:0; color:#16211c; letter-spacing:-.01em }` (0,0,1)
     — `.vl-story__title` ji přebije (letter-spacing musí být -.02em).
   - `[data-vl-modal] > div { padding:0 !important; align-items:stretch !important }`
     a `[data-vl-modal] > div > div { max-height:100dvh !important; width:100% !important;
     max-width:100% !important; border-radius:0 !important }` (base.css, ≤768)
     míří na závoj a panel i po migraci (strukturální selektory). Změřený stav
     je ale padding 12 px a max-height calc(100dvh - 24px) — do 6. 9. to
     zajišťovala pravidla `[data-vl-modal] [style*="padding:40px"]` a
     `[…][style*="max-height:calc(100vh - 80px)"]` (0,2,0 > 0,1,1). Ta na
     migrovaný markup nesednou, proto jsou ty dvě hodnoty níž s `!important`
     — jinde v souboru `!important` není. Zbytek (align-items, width,
     max-width, border-radius) se schválně NEopakuje: base.css ho dodává dál
     a se svým `!important` by stejně vyhrál.
   - `.vl-story-card strong { white-space: normal !important }` (base.css ≤768)
     ruší `--nowrap` na mobilu. Modifikátor níž je proto bez `!important`,
     aby ho base pod 768 px přebil — tak to bylo i s inline stylem.

   OSIŘELÁ PRAVIDLA ve vlasimo-base.css (jehla `[style*=…]` v markupu příběhu
   už není; obsah je přepsaný níž). Automat 00-mrtva-pravidla.py smaže jen
   první čtyři — u ostatních jehla přežívá v jiných šablonách, ale selektor
   je zakotvený v `.vl-zk-story` / `[data-vl-modal]`, kde ji nikdo jiný nemá:
     ~750   .vl-zk-story [style*="padding:34px 36px"]                        (jehla nikde jinde)
     ~845   [data-vl-modal] div[style*="padding:34px 36px 30px"]             (jehla nikde jinde)
     ~850   [data-vl-modal] div[style*="float:right"]                        (jehla nikde jinde)
     ~852   [data-vl-modal] div[style*="justify-content:space-between"][style*="padding-top:22px"]
     ~853   [data-vl-modal] div[style*="padding-top:22px"] > a[style*="box-shadow:0 3px 0"]
     ~733   .vl-zk-story [style*="grid-template-columns:1.15fr 1fr"]  (tablet)
     ~749   .vl-zk-story [style*="grid-template-columns:1.15fr 1fr"]  (mobil)
     ~854   [data-vl-modal] div[style*="grid-template-columns:1.15fr 1fr"]
     ~843   [data-vl-modal] div[style*="padding:44px 48px"]
     ~856   [data-vl-modal] p[style*="text-align:justify"]
   Sousední `[data-vl-modal] .vl-quote`, `[data-vl-modal] > div`,
   `[data-vl-modal] > div > div` a `[data-vl-modal] div[style*="grid-template-columns:1fr 1fr;"]`
   NEJSOU osiřelé — drží modal receptury na HP a ozdobné uvozovky.
   =========================================================================== */

/* ===== parts/story.php — obsah příběhu ==================================== */

.vl-story { display: flex; flex-direction: column; }
.vl-story--modal { padding: 44px 48px; gap: 28px; }
.vl-story--page  { padding: 34px 36px; gap: 26px; }

/* --- Hlavička -------------------------------------------------------------- */
.vl-story__head { display: flex; flex-direction: column; gap: 8px; }
.vl-story__kicker { font-size: 12px; font-weight: 600; letter-spacing: .14em; text-transform: uppercase; color: #0b7c3d; }
.vl-story__title { margin: 0; font-size: 30px; line-height: 1.15; font-weight: 600; letter-spacing: -.02em; color: #16211c; }

/* --- Karta citace + svislá fotka ------------------------------------------
   `grid-template-columns` zůstává deklarované i tam, kde se obal přepíná na
   flex — přesně jako to dělala původní dvojice inline styl + pravidlo, které
   měnilo jen `display`. Bez toho by se computed hodnota lišila. */
.vl-story__grid { display: grid; grid-template-columns: 1.15fr 1fr; gap: 28px; align-items: start; }
.vl-story__quote { position: relative; background: #f6f5ef; border: 1px solid #e3e0d4; border-radius: 16px; padding: 34px 36px 30px; }
.vl-story__body { display: flex; flex-direction: column; gap: 16px; }
.vl-story__lead { margin: 0; font-size: 16.5px; line-height: 1.6; color: #16211c; font-weight: 500; text-wrap: pretty; }
.vl-story .vl-story__text { margin: 0; font-size: 14.5px; line-height: 1.75; color: #3d443e; text-align: justify; }
/* Zvýraznění `*takto*` (otevírací tag pro vlasimo_hl v parts/story.php). */
.vl-story__hl { font-weight: 600; color: #16211c; }

.vl-story__author { display: flex; align-items: center; gap: 12px; padding-top: 6px; border-top: 1px solid #e3e0d4; }
.vl-story__avatar { width: 38px; height: 38px; border-radius: 50%; object-fit: cover; border: 1px solid #c6dbcb; display: block; }
.vl-story__who { display: flex; flex-direction: column; gap: 1px; }
.vl-story__name { font-size: 13.5px; font-weight: 600; color: #16211c; }
.vl-story__verified { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; color: #0b7c3d; }
.vl-story__vicon { display: block; }

/* Pravý sloupec s fotkou a obal mřížky miniatur mají tentýž styl — jedna
   třída, ne dvě kopie. */
.vl-story__col { display: flex; flex-direction: column; gap: 10px; }
.vl-story__photo { width: 100%; border-radius: 14px; border: 1px solid #e3e0d4; display: block; }

/* --- Tři miniatury proměny ------------------------------------------------- */
.vl-story__thumbs { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; }
.vl-story__thumb { display: flex; flex-direction: column; gap: 7px; }
.vl-story__thumb-img { width: 100%; aspect-ratio: 5/8; object-fit: cover; object-position: center top; border-radius: 12px; border: 1px solid #e3e0d4; display: block; }
.vl-story__cap { font-size: 12.5px; color: #5d6b62; text-align: center; }

/* --- Patička s CTA ---------------------------------------------------------
   `flex-wrap: wrap` kvůli úzkým telefonům: tlačítko má nowrap a ~215 px,
   takže pod 390 px vylezlo z karty ven. */
.vl-story__foot { display: flex; align-items: center; justify-content: space-between; gap: 20px; flex-wrap: wrap; border-top: 1px solid #e3e0d4; padding-top: 22px; }
.vl-story__note { font-size: 13.5px; color: #5d6b62; }
.vl a.vl-story__cta,
.vl a.vl-story__cta:hover { height: 50px; padding: 0 24px; background: #0d8f46; color: #ffffff; border-radius: 12px; display: flex; align-items: center; gap: 10px; font-size: 15px; font-weight: 600; box-shadow: 0 3px 0 #075c2e; cursor: pointer; white-space: nowrap; }

/* ===== parts/story-card.php — miniatura, která modal otevírá ============== */

.vl-story-card { display: flex; align-items: center; gap: 14px; background: #ffffff; border: 1px solid #e3e0d4; border-radius: 16px; padding: 10px 16px 10px 10px; cursor: pointer; box-shadow: 0 8px 24px rgba(22,33,28,.06); transition: transform .12s ease, box-shadow .12s ease; }
.vl-story-card__thumbs { display: flex; gap: 4px; }
.vl-story-card__img { width: 46px; height: 64px; object-fit: cover; object-position: center top; border-radius: 8px 3px 3px 8px; display: block; }
/* Druhá miniatura je zrcadlově zaoblená, aby dvojice tvořila jeden blok. */
.vl-story-card__img--b { border-radius: 3px 8px 8px 3px; }
.vl-story-card__meta { display: flex; flex-direction: column; gap: 3px; }
.vl-story-card__kicker { font-size: 10.5px; font-weight: 600; letter-spacing: .12em; text-transform: uppercase; color: #0b7c3d; }
.vl-story-card__title { font-size: 14.5px; font-weight: 600; color: #16211c; }
.vl-story-card__link { font-size: 12.5px; color: #0b7c3d; text-decoration: underline; text-underline-offset: 3px; }
/* Jen desktopový hero na Složení ($args['nowrap']); pod 768 px ho ruší
   `.vl-story-card strong { white-space: normal !important }` z base.css. */
.vl-story-card--nowrap .vl-story-card__title { white-space: nowrap; }

/* ===== parts/story-modal.php — pop-up ==================================== */

.vl-story-modal__veil { position: fixed; inset: 0; z-index: 200; background: rgba(22,33,28,.55); backdrop-filter: blur(3px); display: flex; align-items: center; justify-content: center; padding: 40px; }
/* `overscroll-behavior` a `-webkit-overflow-scrolling` dodávalo do 6. 9.
   `[data-vl-modal] [style*="overflow:auto"]`; bez inline stylu nemá na čem
   viset, tak je nese třída. */
.vl-story-modal__panel { position: relative; background: #fdfcf8; border-radius: 20px; max-width: 1060px; width: 100%; max-height: calc(100vh - 80px); overflow: auto; box-shadow: 0 30px 80px rgba(22,33,28,.35); overscroll-behavior: contain; -webkit-overflow-scrolling: touch; }
.vl-story-modal__close { position: sticky; top: 16px; margin-left: auto; margin-right: 16px; width: 38px; height: 38px; border-radius: 50%; background: #16211c; color: #ffffff; display: flex; align-items: center; justify-content: center; font-size: 16px; cursor: pointer; z-index: 5; float: right; }

/* ===== Tablet 769–1024 ====================================================
   Přeneseno z `[style*="margin:0; font-size:30px; line-height:1.15; …"]`
   (base.css, obě varianty) a z `.vl-zk-story [style*="grid-template-columns:1.15fr 1fr"]`
   (jen varianta stránky — modal drží dva sloupce až do 768 px). */
@media (min-width: 769px) and (max-width: 1024px) {
	.vl-story__title { font-size: 24px; }
	.vl-story--page .vl-story__grid { display: flex; flex-direction: column; }
}

/* ===== Mobil ≤768 ========================================================= */
@media (max-width: 768px) {

	/* --- Varianta v modalu ------------------------------------------------- */
	.vl-story--modal { padding: 20px 14px; }
	.vl-story--modal .vl-story__grid { display: flex; flex-direction: column; }
	.vl-story--modal .vl-story__quote { padding: 22px 16px 18px; }
	.vl-story--modal .vl-story__text { text-align: left; }
	.vl-story--modal .vl-story__foot { flex-direction: column; align-items: stretch; gap: 14px; }
	.vl-story--modal .vl-story__cta { justify-content: center; }
	/* Nadpis zůstává 30px — modal je přes celé okno, nesráží se jako obsah
	   stránky uvnitř .vl-dcontent. */

	/* --- Varianta v pásu na Zkušenostech ------------------------------------ */
	.vl-story--page { padding: 22px 16px; }
	.vl-story--page .vl-story__title { font-size: 22px; }
	.vl-story--page .vl-story__grid { display: flex; flex-direction: column; gap: 16px; grid-template-columns: 1fr; }
	.vl-story--page .vl-story__quote { padding: 22px 16px; }
	.vl-story--page .vl-story__thumbs { grid-template-columns: 1fr; }
	/* Odstavce zůstávají justify a patička v řádku — tak to na téhle stránce
	   vypadalo i před migrací. */

	/* --- Modal: závoj a panel ----------------------------------------------
	   Jediná dvě `!important` v souboru, a jediné dva selektory zakotvené
	   v `[data-vl-modal]`. Obojí kvůli base.css: `[data-vl-modal] > div`
	   (0,1,1) a `[data-vl-modal] > div > div` (0,1,2) mají `!important`
	   a holá třída (0,1,0) by jim podlehla i s `!important` — měřeno,
	   ne odhadnuto (bez zakotvení vyšel závoj 0 px místo 12 a panel
	   100dvh místo calc(100dvh - 24px)). */
	[data-vl-modal] > .vl-story-modal__veil { padding: 12px !important; }
	[data-vl-modal] > div > .vl-story-modal__panel {
		max-height: calc(100vh - 24px) !important;
		max-height: calc(100dvh - 24px) !important;
	}
	/* Křížek s float:right nutí flexový obsah uhnout (BFC) — o 54 px užší obsah. */
	.vl-story-modal__close { float: none; margin-bottom: -38px; }
}

/* ==== verify-email.css ================================================== */
/* ===========================================================================
   Ověření e-mailu u objednávky (checkout/form-verify-email.php)
   a hlavička ochranných větví order-received (checkout/order-received.php,
   global/form-login.php). WooCommerce je kreslí, když objednávku nedokáže
   spárovat s návštěvníkem — na order-received i na order-pay.

   Vzhled je karta systémových stránek (`h-syspage` / `h-sysform`, stejná jako
   obnova hesla). Na order-received rám kreslí obal `.woocommerce` z
   vlasimo.css (bílá karta 560 px na stránce bez `.h-thx`), takže šablony
   tam vypisují jen obsah; na order-pay si formulář kartu nese sám.

   Proč komponenta a ne pages/dekovacka.css: order-pay má slug `pokladna`,
   tenhle formulář se na něm objeví taky a bez stylů by byl přes celé okno.
   =========================================================================== */
/* Zarovnání se píše přes `.vl` — globální `.vl p { text-align: justify }`
   (0,1,1) je specifičtější než holá třída a jinak roztáhne obě věty do bloku. */
.vl-vfy__head { text-align: center; }
.vl .vl-vfy__head p { text-align: center; }
.vl-vfy__lead { margin: 18px 0 0; font-size: 14.5px; line-height: 1.65; color: #3d443e; }
.vl .vl-vfy__lead { text-align: left; }
.vl-vfy__lead a { font-weight: 700; color: #0b7c3d; }
/* `.h-sysform .h-field` má spodní mezeru pro víc polí za sebou; tady je pole
   jedno, mezera patří nad ně. */
.vl-vfy .h-field { margin: 16px 0 0; }
.vl-vfy .h-sysform__btn { margin-top: 16px; }

/* Přihlašovací karta z /muj-ucet/ se do rámu order-received vejde bez vlastního —
   jinak by uvnitř bílé karty stála druhá bílá karta s rámečkem. */
.woocommerce-order-received .h-acct-login--embed { padding: 0; }
.woocommerce-order-received .h-acct-login--embed .h-acct-login__card { border: 0; padding: 0; }

@media (max-width: 768px) {
	.vl-vfy__lead { font-size: 14px; }
}

/* ==== zbytky.css ======================================================== */
/* ===========================================================================
   zbytky.css — poslední zbytky inline stylů, které nepatří k žádné jedné
   stránce, protože je kreslí sdílené helpery ve functions.php:

     vlasimo_quote_badge()   ozdobné uvozovky nad kartou příběhu
     vlasimo_oh_dot()        tečka stavu otevírací doby (hlavička, patička,
                             Kontakty, výpis produktů — 7 volajících)
     vlasimo_footer_domain() řádek s doménami mutací v obou patičkách
     vlasimo_check_svg()     jediná check ikona webu (32 volajících)

   a k tomu dvě šablony s hrstkou stylů:

     page-partner.php               rám partnerské sekce SliceWP
     woocommerce/cart/cart.php      šipka v CTA souhrnu košíku

   Soubor je v assets/css/parts/, tedy se načítá na KAŽDÉ stránce (inc/assets.php,
   závislost `vlasimo-ui`): za vlasimo.css → vlasimo-base.css → vlasimo-ui.css
   a před pages/<slug>.css. Do VLASIMO_PART_CSS ho zapisuje hlavní session.

   Vznik: tools/migrate/35-zbytky.py (14 stylů). Hodnoty jsou ze skutečného
   stavu dev — snímky tools/css-snap/w5/partner@{1440,900,390}.json
   a `node tools/css-matched.js` na živém webu — ne z návrhu.

   PREFIX: nové třídy `.vl-x-*`. Výjimka je blok `.vl-quote`, který existoval
   už dřív (míří na něj `[data-vl-modal] .vl-quote` ve vlasimo-base.css);
   jeho modifikátor a element proto zůstávají v jeho jmenném prostoru
   (`.vl-quote--right`, `.vl-quote__ico`), přejmenování bloku by osiřelo
   pravidlo v základu.

   KONKURENCE, SE KTEROU TŘÍDY POČÍTAJÍ
   - `.vl a { color:#16211c; text-decoration:none }` a `.vl a:hover
     { color:#0b7c3d }` (obojí 0,2,1) — odkazy proto musí být psané
     `.vl a.třída`, a protože inline styl dřív přebíjel i hover, i s `:hover`.
   - `.vl-ftr__domains` a `.h-btn` jsou flex kontejnery: `display:inline-flex`
     / `inline-block` na jejich dětech se blokifikuje na `flex` / `block`.
     Bylo to tak i s inline stylem, deklarace se nemění.
   - `[data-vl-modal] .vl-quote { … !important }` (vlasimo-base.css, ≤768)
     cílí na TŘÍDU, ne na `[style*=]` — po migraci platí dál.
   =========================================================================== */

/* --- Ozdobné uvozovky karty příběhu (vlasimo_quote_badge) ------------------
   Jediný volající (parts/story.php) volá bez argumentů, geometrie je tedy
   pevná: kolečko 38 px, 24 px od kraje, posunuté o polovinu výšky nahoru.
   POZOR: parametry `$size` a `$offset` helperu už na vzhled nemají vliv
   (`$size` řídí jen velikost SVG uvnitř) — nové volání s jinou velikostí
   potřebuje modifikátor sem. `$side` funkční zůstal. */
.vl-quote { position: absolute; top: -19px; left: 24px; width: 38px; height: 38px; border-radius: 50%; background: #e4eee6; border: 1px solid #c6dbcb; display: flex; align-items: center; justify-content: center; }
.vl-quote--right { left: auto; right: 24px; }
.vl-quote__ico { display: block; }

/* --- Tečka stavu otevírací doby (vlasimo_oh_dot) --------------------------
   Vykreslují se OBĚ varianty naráz a JS pluginu CPP jednu skryje (obal
   `.cpp-oh-w` s inline `display:none`), aby stav nezmrazila page cache —
   barva proto musí zůstat rozlišená modifikátorem, ne jednou třídou.
   Parametr `$size` helperu je po migraci bez vlivu; všech sedm volajících
   používá výchozích 7 px. */
.vl-x-ohdot { width: 7px; height: 7px; border-radius: 50%; display: inline-block; }
.vl-x-ohdot--open { background: #4ade80; }
.vl-x-ohdot--closed { background: #8a887f; }

/* --- Check ikona (vlasimo_check_svg) ---------------------------------------
   Dvě varianty podle argumentu `$inline`: `block` pro flexové kontejnery,
   `inline-block` se zarovnáním na účaří do textu. Modifikátor musí stát AŽ ZA
   základní třídou — obě mají specificitu (0,0,1,0) a rozhoduje pořadí. */
.vl-x-chk { display: block; }
.vl-x-chk--inline { display: inline-block; vertical-align: -1px; }

/* --- Domény mutací v patičce (vlasimo_footer_domain) ----------------------
   Aktuální mutace je `<span>` (bílá, tučná), druhá `<a>` na svou doménu.
   Mezera mezi vlaječkou a textem se liší podle patičky: desktop 8 px,
   mobilní patička 7 px (`--m`, druhý argument helperu).
   Odkaz musí barvu držet i na hover — inline styl `.vl a:hover` dřív
   přebíjel, takže odkaz na doménu hover nikdy neměl. */
.vl-x-flag { display: inline-flex; border-radius: 2px; overflow: hidden; line-height: 0; }
.vl-x-fdom { display: inline-flex; align-items: center; gap: 8px; }
.vl-x-fdom--m { gap: 7px; }
.vl-x-fdom--cur { color: #ffffff; font-weight: 600; }
.vl-x-fdom--alt,
.vl a.vl-x-fdom--alt,
.vl a.vl-x-fdom--alt:hover { color: #9fb0a4; text-decoration: none; }

/* --- Šipka v CTA souhrnu košíku (woocommerce/cart/cart.php) ---------------
   `.h-btn` je `display:inline-flex`, takže computed `display` byl `block`
   už s inline stylem; deklarace je opsaná 1:1, aby se to nezměnilo, kdyby
   se šipka někdy ocitla mimo flex. Tatáž trojice deklarací je
   `.vl-cpanel-cta__arrow` v parts/cart-panel.css — jsou to dvě různé
   komponenty (souhrn košíku × postranní panel), sdílet je nemá smysl. */
.vl-x-arrow { font-weight: 400; transform: translateY(-1px); display: inline-block; }

/* ===========================================================================
   page-partner.php — rám partnerské sekce SliceWP
   Uvnitř markup kreslí plugin (`.vl-aff*`, styly ve vlasimo-base.css, blok
   „Partnerská sekce"); tady je jen hlavička stránky a obal obsahu.
   =========================================================================== */
.vl-x-partner__head { max-width: 1440px; margin: 0 auto; padding: 28px 48px 8px; display: flex; align-items: baseline; justify-content: space-between; gap: 20px; }
.vl-x-partner__title { margin: 0; font-size: 34px; font-weight: 600; letter-spacing: -.025em; color: #16211c; }
/* „Odhlásit se" je `<a>`: bez `.vl a` prefixu by ho přebil `.vl a { color:#16211c }`
   a na hover `.vl a:hover { color:#0b7c3d }` — inline styl obojí držel. */
.vl a.vl-x-partner__logout,
.vl a.vl-x-partner__logout:hover { font-size: 13.5px; font-weight: 500; color: #8a887f; text-decoration: underline; text-underline-offset: 3px; }
.vl-x-partner__body { max-width: 1440px; margin: 0 auto; padding: 20px 48px 64px; }

/* ===== Tablet 769–1024 =====================================================
   Přesun hodnot z vlasimo-base.css (`[style*="max-width:1440px; margin:0 auto"]`
   + konkrétnější pravidlo na obal hlavičky a na H1). Obal obsahu se stahuje
   jen na 1024 px, odsazení si nechává 48 px — konkrétnější pravidlo na
   `padding:20px 48px 64px` v základu není. */
@media (min-width: 769px) and (max-width: 1024px) {
	.vl-x-partner__head { max-width: 1024px; padding: 28px 32px 8px; }
	.vl-x-partner__body { max-width: 1024px; }
	.vl-x-partner__title { font-size: 27px; }
}

/* ===== Mobil ≤768 ==========================================================
   `.vl-dcontent [style*="padding:28px 48px"]` dávalo `padding: 20px 20px`,
   tedy 20 px i dole (ne 8 px jako na desktopu) — proto zkráceně `20px`.
   Šířku kontejnerů základ na mobilu NEstahoval, max-width zůstává 1440 px.
   Obal obsahu si na telefonu NECHÁVÁ 48 px po stranách: pravidlo
   `.vl-dcontent [style*="padding:20px 48px"]` ve vlasimo-base.css neexistuje,
   takže z 390px okna zbývá na kartu SliceWP 294 px. Není to hezké, ale je to
   současný stav a migrace vzhled nemění — případná úprava je samostatné
   rozhodnutí, ne součást téhle vlny. */
@media (max-width: 768px) {
	.vl-x-partner__head { padding: 20px; }
	.vl-x-partner__title { font-size: 25px; }
}
